Alexandre Julliard : widl: Added support for floating-point constants.
Alexandre Julliard
julliard at wine.codeweavers.com
Tue Jul 17 07:36:53 CDT 2007
Module: wine
Branch: master
Commit: 40dda77c52132c82557b31205a2d6f1a47f732e8
URL: http://source.winehq.org/git/wine.git/?a=commit;h=40dda77c52132c82557b31205a2d6f1a47f732e8
Author: Alexandre Julliard <julliard at winehq.org>
Date: Tue Jul 17 13:09:03 2007 +0200
widl: Added support for floating-point constants.
---
tools/widl/header.c | 3 +++
tools/widl/parser.l | 5 +++++
tools/widl/parser.y | 15 +++++++++++++++
tools/widl/typegen.c | 5 +++++
tools/widl/widltypes.h | 2 ++
5 files changed, 30 insertions(+), 0 deletions(-)
diff --git a/tools/widl/header.c b/tools/widl/header.c
index 6f2da32..c04222b 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 7ddcedd..4cd98bb 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;
}
+<INITIAL>{double} {
+ parser_lval.dbl = strtod(yytext, NULL);
+ return aDOUBLE;
+ }
SAFEARRAY{ws}*/\( return tSAFEARRAY;
{cident} return kw_token(yytext);
<INITIAL,ATTR>\n line_number++;
diff --git a/tools/widl/parser.y b/tools/widl/parser.y
index 4933c43..5b4c5ff 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 <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;
diff --git a/tools/widl/typegen.c b/tools/widl/typegen.c
index e8f6d1f..73a3622 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 6235620..d514d54 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;
More information about the wine-cvs
mailing list