widl: Added support for floating-point constants.

oldstable
Alexandre Julliard 2007-07-17 13:09:03 +02:00
parent 7e19178529
commit 40dda77c52
5 changed files with 30 additions and 0 deletions

View File

@ -358,6 +358,9 @@ void write_expr(FILE *h, const expr_t *e, int brackets)
case EXPR_HEXNUM:
fprintf(h, "0x%lx", e->u.lval);
break;
case EXPR_DOUBLE:
fprintf(h, "%#.15g", e->u.dval);
break;
case EXPR_TRUEFALSE:
if (e->u.lval == 0)
fprintf(h, "FALSE");

View File

@ -29,6 +29,7 @@ int [0-9]+
hexd [0-9a-fA-F]
hex 0x{hexd}+
uuid {hexd}{8}-{hexd}{4}-{hexd}{4}-{hexd}{4}-{hexd}{12}
double [0-9]+\.[0-9]+([eE][+-]?[0-9]+)*
%x QUOTE
%x ATTR
@ -150,6 +151,10 @@ static UUID* parse_uuid(const char*u)
parser_lval.num = strtoul(yytext, NULL, 0);
return aNUM;
}
<INITIAL>{double} {
parser_lval.dbl = strtod(yytext, NULL);
return aDOUBLE;
}
SAFEARRAY{ws}*/\( return tSAFEARRAY;
{cident} return kw_token(yytext);
<INITIAL,ATTR>\n line_number++;

View File

@ -83,6 +83,7 @@ static attr_t *make_attrv(enum attr_type type, unsigned long val);
static attr_t *make_attrp(enum attr_type type, void *val);
static expr_t *make_expr(enum expr_type type);
static expr_t *make_exprl(enum expr_type type, long val);
static expr_t *make_exprd(enum expr_type type, double val);
static expr_t *make_exprs(enum expr_type type, char *val);
static expr_t *make_exprt(enum expr_type type, type_t *tref, expr_t *expr);
static expr_t *make_expr1(enum expr_type type, expr_t *expr);
@ -151,11 +152,13 @@ static void check_all_user_types(ifref_list_t *ifaces);
char *str;
UUID *uuid;
unsigned int num;
double dbl;
}
%token <str> aIDENTIFIER
%token <str> aKNOWNTYPE
%token <num> aNUM aHEXNUM
%token <dbl> aDOUBLE
%token <str> aSTRING
%token <uuid> aUUID
%token aEOF
@ -581,6 +584,7 @@ m_expr: { $$ = make_expr(EXPR_VOID); }
expr: aNUM { $$ = make_exprl(EXPR_NUM, $1); }
| aHEXNUM { $$ = make_exprl(EXPR_HEXNUM, $1); }
| aDOUBLE { $$ = make_exprd(EXPR_DOUBLE, $1); }
| tFALSE { $$ = make_exprl(EXPR_TRUEFALSE, 0); }
| tTRUE { $$ = make_exprl(EXPR_TRUEFALSE, 1); }
| aIDENTIFIER { $$ = make_exprs(EXPR_IDENTIFIER, $1); }
@ -1033,6 +1037,17 @@ static expr_t *make_exprl(enum expr_type type, long val)
return e;
}
static expr_t *make_exprd(enum expr_type type, double val)
{
expr_t *e = xmalloc(sizeof(expr_t));
e->type = type;
e->ref = NULL;
e->u.dval = val;
e->is_const = TRUE;
e->cval = val;
return e;
}
static expr_t *make_exprs(enum expr_type type, char *val)
{
expr_t *e;

View File

@ -227,6 +227,8 @@ static int compare_expr(const expr_t *a, const expr_t *b)
case EXPR_HEXNUM:
case EXPR_TRUEFALSE:
return a->u.lval - b->u.lval;
case EXPR_DOUBLE:
return a->u.dval - b->u.dval;
case EXPR_IDENTIFIER:
return strcmp(a->u.sval, b->u.sval);
case EXPR_COND:
@ -2690,6 +2692,9 @@ static void write_struct_expr(FILE *h, const expr_t *e, int brackets,
case EXPR_HEXNUM:
fprintf(h, "0x%lx", e->u.lval);
break;
case EXPR_DOUBLE:
fprintf(h, "%#.15g", e->u.dval);
break;
case EXPR_TRUEFALSE:
if (e->u.lval == 0)
fprintf(h, "FALSE");

View File

@ -135,6 +135,7 @@ enum expr_type
EXPR_VOID,
EXPR_NUM,
EXPR_HEXNUM,
EXPR_DOUBLE,
EXPR_IDENTIFIER,
EXPR_NEG,
EXPR_NOT,
@ -188,6 +189,7 @@ struct _expr_t {
const expr_t *ref;
union {
long lval;
double dval;
const char *sval;
const expr_t *ext;
type_t *tref;