From: Rémi Bernon rbernon@codeweavers.com
--- tools/widl/expr.c | 36 +++++++++--------------------------- tools/widl/parser.y | 23 +++++++++++------------ tools/widl/widl.h | 2 +- tools/widl/widltypes.h | 5 ++--- tools/widl/write_msft.c | 5 ++--- 5 files changed, 25 insertions(+), 46 deletions(-)
diff --git a/tools/widl/expr.c b/tools/widl/expr.c index 37511727372..6b60d984a1a 100644 --- a/tools/widl/expr.c +++ b/tools/widl/expr.c @@ -116,20 +116,15 @@ expr_t *expr_void(void) return e; }
-expr_t *expr_int( enum expr_type type, int val ) +expr_t *expr_int( int val, const char *text ) { expr_t *e = xmalloc( sizeof(expr_t) ); memset( e, 0, sizeof(*e) ); - e->type = type; + e->text = text; + e->type = EXPR_INT; e->u.lval = val; - /* check for numeric constant */ - if (type == EXPR_NUM || type == EXPR_HEXNUM || type == EXPR_TRUEFALSE) - { - /* make sure true/false value is valid */ - assert(type != EXPR_TRUEFALSE || val == 0 || val == 1); - e->is_const = TRUE; - e->cval = val; - } + e->is_const = TRUE; + e->cval = val; return e; }
@@ -503,9 +498,7 @@ static struct expression_type resolve_expression(const struct expr_loc *expr_loc { case EXPR_VOID: break; - case EXPR_HEXNUM: - case EXPR_NUM: - case EXPR_TRUEFALSE: + case EXPR_INT: result.is_temporary = FALSE; result.type = type_new_int(TYPE_BASIC_INT, 0); break; @@ -680,21 +673,12 @@ void write_expr(FILE *h, const expr_t *e, int brackets, { case EXPR_VOID: break; - case EXPR_NUM: - fprintf(h, "%u", e->u.lval); - break; - case EXPR_HEXNUM: - fprintf(h, "0x%x", e->u.lval); + case EXPR_INT: + fprintf(h, "%s", e->text); break; case EXPR_DOUBLE: fprintf(h, "%#.15g", e->u.dval); break; - case EXPR_TRUEFALSE: - if (e->u.lval == 0) - fprintf(h, "FALSE"); - else - fprintf(h, "TRUE"); - break; case EXPR_IDENTIFIER: if (toplevel && toplevel_prefix && cont_type) { @@ -857,9 +841,7 @@ int compare_expr(const expr_t *a, const expr_t *b)
switch (a->type) { - case EXPR_NUM: - case EXPR_HEXNUM: - case EXPR_TRUEFALSE: + case EXPR_INT: return a->u.lval - b->u.lval; case EXPR_DOUBLE: return a->u.dval - b->u.dval; diff --git a/tools/widl/parser.y b/tools/widl/parser.y index 9e8a0d88d1c..bf472a646fb 100644 --- a/tools/widl/parser.y +++ b/tools/widl/parser.y @@ -596,7 +596,7 @@ contract_ver:
contract_req : decl_spec ',' contract_ver { - expr_t *contract = expr_int( EXPR_NUM, $contract_ver ); + expr_t *contract = expr_int( $3, strmake( "%u", $3 ) ); if ($decl_spec->type->type_type != TYPE_APICONTRACT) error_loc( "type %s is not an apicontract\n", $decl_spec->type->name ); $$ = make_exprt( EXPR_GTREQL, declare_var( NULL, $decl_spec, make_declarator( NULL ), 0 ), contract ); @@ -798,17 +798,16 @@ enums ;
enum_list: enum { - if (!$enum->eval) $enum->eval = expr_int( EXPR_NUM, 0 /* default for first enum entry */ ); + if (!$enum->eval) $enum->eval = expr_int( 0, "0" ); $$ = append_var( NULL, $enum ); } | enum_list[list] ',' enum { if (!$enum->eval) { - var_t *last = LIST_ENTRY( list_tail( $list ), var_t, entry ); - enum expr_type type = EXPR_NUM; - if (last->eval->type == EXPR_HEXNUM) type = EXPR_HEXNUM; - if (last->eval->cval + 1 < 0) type = EXPR_HEXNUM; - $enum->eval = expr_int( type, last->eval->cval + 1 ); + expr_t *last = LIST_ENTRY( list_tail( $list ), var_t, entry )->eval; + const char *fmt = last->cval + 1 < 0 ? "0x%x" : "%u"; + if (last->text && last->text[1] == 'x') fmt = "0x%x"; + $enum->eval = expr_int( last->cval + 1, strmake( fmt, last->cval + 1 ) ); } $$ = append_var( $list, $enum ); } @@ -840,12 +839,12 @@ m_expr | expr ;
-expr: aNUM { $$ = expr_int( EXPR_NUM, $aNUM ); } - | aHEXNUM { $$ = expr_int( EXPR_HEXNUM, $aHEXNUM ); } +expr: aNUM { $$ = expr_int( $aNUM, strmake( "%u", $aNUM ) ); } + | aHEXNUM { $$ = expr_int( $aHEXNUM, strmake( "0x%x", $aHEXNUM ) ); } | aDOUBLE { $$ = expr_double( $aDOUBLE ); } - | tFALSE { $$ = expr_int( EXPR_TRUEFALSE, 0 ); } - | tNULL { $$ = expr_int( EXPR_NUM, 0 ); } - | tTRUE { $$ = expr_int( EXPR_TRUEFALSE, 1 ); } + | tFALSE { $$ = expr_int( 0, "FALSE" ); } + | tNULL { $$ = expr_int( 0, "NULL" ); } + | tTRUE { $$ = expr_int( 1, "TRUE" ); } | aSTRING { $$ = expr_str( EXPR_STRLIT, $aSTRING ); } | aWSTRING { $$ = expr_str( EXPR_WSTRLIT, $aWSTRING ); } | aSQSTRING { $$ = expr_str( EXPR_CHARCONST, $aSQSTRING ); } diff --git a/tools/widl/widl.h b/tools/widl/widl.h index 582e34fc43f..6efb15a85ba 100644 --- a/tools/widl/widl.h +++ b/tools/widl/widl.h @@ -140,7 +140,7 @@ struct expr_loc };
extern expr_t *expr_void(void); -extern expr_t *expr_int( enum expr_type type, int val ); +extern expr_t *expr_int( int val, const char *text ); extern expr_t *expr_double( double val ); extern expr_t *expr_str( enum expr_type type, char *val ); extern expr_t *make_exprt( enum expr_type type, var_t *var, expr_t *expr ); diff --git a/tools/widl/widltypes.h b/tools/widl/widltypes.h index 1a26bb77cad..544461740de 100644 --- a/tools/widl/widltypes.h +++ b/tools/widl/widltypes.h @@ -189,8 +189,7 @@ enum attr_type enum expr_type { EXPR_VOID, - EXPR_NUM, - EXPR_HEXNUM, + EXPR_INT, EXPR_DOUBLE, EXPR_IDENTIFIER, EXPR_NEG, @@ -207,7 +206,6 @@ enum expr_type EXPR_AND, EXPR_OR, EXPR_COND, - EXPR_TRUEFALSE, EXPR_ADDRESSOF, EXPR_MEMBER, EXPR_ARRAY, @@ -363,6 +361,7 @@ struct _expr_t { int cval; /* parser-internal */ struct list entry; + const char *text; };
struct _attr_custdata_t { diff --git a/tools/widl/write_msft.c b/tools/widl/write_msft.c index ce99c23f16a..bd7607d6cc7 100644 --- a/tools/widl/write_msft.c +++ b/tools/widl/write_msft.c @@ -1234,7 +1234,7 @@ static void write_default_value(msft_typelib_t *typelib, type_t *type, expr_t *e case EXPR_DOUBLE: vt = VT_R4; break; - case EXPR_NUM: + case EXPR_INT: vt = VT_I4; break; default: @@ -1296,8 +1296,7 @@ static void set_custdata_attr(msft_typelib_t *typelib, attr_custdata_t *custdata case EXPR_WSTRLIT: set_custdata(typelib, &custdata->id, VT_BSTR, custdata->pval->u.sval, offset); break; - case EXPR_HEXNUM: - case EXPR_NUM: + case EXPR_INT: set_custdata(typelib, &custdata->id, VT_I4, &custdata->pval->u.lval, offset); break; default: