diff --git a/tools/widl/header.c b/tools/widl/header.c index 6f2da32a5c3..c04222b93e7 100644 --- a/tools/widl/header.c +++ b/tools/widl/header.c @@ -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"); diff --git a/tools/widl/parser.l b/tools/widl/parser.l index 7ddcedd7cc9..4cd98bb2aff 100644 --- a/tools/widl/parser.l +++ b/tools/widl/parser.l @@ -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; } +{double} { + parser_lval.dbl = strtod(yytext, NULL); + return aDOUBLE; + } SAFEARRAY{ws}*/\( return tSAFEARRAY; {cident} return kw_token(yytext); \n line_number++; diff --git a/tools/widl/parser.y b/tools/widl/parser.y index 4933c439d9e..5b4c5ff860c 100644 --- a/tools/widl/parser.y +++ b/tools/widl/parser.y @@ -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 aIDENTIFIER %token aKNOWNTYPE %token aNUM aHEXNUM +%token aDOUBLE %token aSTRING %token 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; diff --git a/tools/widl/typegen.c b/tools/widl/typegen.c index e8f6d1fe369..73a36224bd6 100644 --- a/tools/widl/typegen.c +++ b/tools/widl/typegen.c @@ -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"); diff --git a/tools/widl/widltypes.h b/tools/widl/widltypes.h index 6235620bf49..d514d546b73 100644 --- a/tools/widl/widltypes.h +++ b/tools/widl/widltypes.h @@ -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;