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