widl: Added support for floating-point constants.
This commit is contained in:
parent
7e19178529
commit
40dda77c52
|
@ -358,6 +358,9 @@ void write_expr(FILE *h, const expr_t *e, int brackets)
|
||||||
case EXPR_HEXNUM:
|
case EXPR_HEXNUM:
|
||||||
fprintf(h, "0x%lx", e->u.lval);
|
fprintf(h, "0x%lx", e->u.lval);
|
||||||
break;
|
break;
|
||||||
|
case EXPR_DOUBLE:
|
||||||
|
fprintf(h, "%#.15g", e->u.dval);
|
||||||
|
break;
|
||||||
case EXPR_TRUEFALSE:
|
case EXPR_TRUEFALSE:
|
||||||
if (e->u.lval == 0)
|
if (e->u.lval == 0)
|
||||||
fprintf(h, "FALSE");
|
fprintf(h, "FALSE");
|
||||||
|
|
|
@ -29,6 +29,7 @@ int [0-9]+
|
||||||
hexd [0-9a-fA-F]
|
hexd [0-9a-fA-F]
|
||||||
hex 0x{hexd}+
|
hex 0x{hexd}+
|
||||||
uuid {hexd}{8}-{hexd}{4}-{hexd}{4}-{hexd}{4}-{hexd}{12}
|
uuid {hexd}{8}-{hexd}{4}-{hexd}{4}-{hexd}{4}-{hexd}{12}
|
||||||
|
double [0-9]+\.[0-9]+([eE][+-]?[0-9]+)*
|
||||||
|
|
||||||
%x QUOTE
|
%x QUOTE
|
||||||
%x ATTR
|
%x ATTR
|
||||||
|
@ -150,6 +151,10 @@ static UUID* parse_uuid(const char*u)
|
||||||
parser_lval.num = strtoul(yytext, NULL, 0);
|
parser_lval.num = strtoul(yytext, NULL, 0);
|
||||||
return aNUM;
|
return aNUM;
|
||||||
}
|
}
|
||||||
|
<INITIAL>{double} {
|
||||||
|
parser_lval.dbl = strtod(yytext, NULL);
|
||||||
|
return aDOUBLE;
|
||||||
|
}
|
||||||
SAFEARRAY{ws}*/\( return tSAFEARRAY;
|
SAFEARRAY{ws}*/\( return tSAFEARRAY;
|
||||||
{cident} return kw_token(yytext);
|
{cident} return kw_token(yytext);
|
||||||
<INITIAL,ATTR>\n line_number++;
|
<INITIAL,ATTR>\n line_number++;
|
||||||
|
|
|
@ -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 attr_t *make_attrp(enum attr_type type, void *val);
|
||||||
static expr_t *make_expr(enum expr_type type);
|
static expr_t *make_expr(enum expr_type type);
|
||||||
static expr_t *make_exprl(enum expr_type type, long val);
|
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_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_exprt(enum expr_type type, type_t *tref, expr_t *expr);
|
||||||
static expr_t *make_expr1(enum expr_type type, 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;
|
char *str;
|
||||||
UUID *uuid;
|
UUID *uuid;
|
||||||
unsigned int num;
|
unsigned int num;
|
||||||
|
double dbl;
|
||||||
}
|
}
|
||||||
|
|
||||||
%token <str> aIDENTIFIER
|
%token <str> aIDENTIFIER
|
||||||
%token <str> aKNOWNTYPE
|
%token <str> aKNOWNTYPE
|
||||||
%token <num> aNUM aHEXNUM
|
%token <num> aNUM aHEXNUM
|
||||||
|
%token <dbl> aDOUBLE
|
||||||
%token <str> aSTRING
|
%token <str> aSTRING
|
||||||
%token <uuid> aUUID
|
%token <uuid> aUUID
|
||||||
%token aEOF
|
%token aEOF
|
||||||
|
@ -581,6 +584,7 @@ m_expr: { $$ = make_expr(EXPR_VOID); }
|
||||||
|
|
||||||
expr: aNUM { $$ = make_exprl(EXPR_NUM, $1); }
|
expr: aNUM { $$ = make_exprl(EXPR_NUM, $1); }
|
||||||
| aHEXNUM { $$ = make_exprl(EXPR_HEXNUM, $1); }
|
| aHEXNUM { $$ = make_exprl(EXPR_HEXNUM, $1); }
|
||||||
|
| aDOUBLE { $$ = make_exprd(EXPR_DOUBLE, $1); }
|
||||||
| tFALSE { $$ = make_exprl(EXPR_TRUEFALSE, 0); }
|
| tFALSE { $$ = make_exprl(EXPR_TRUEFALSE, 0); }
|
||||||
| tTRUE { $$ = make_exprl(EXPR_TRUEFALSE, 1); }
|
| tTRUE { $$ = make_exprl(EXPR_TRUEFALSE, 1); }
|
||||||
| aIDENTIFIER { $$ = make_exprs(EXPR_IDENTIFIER, $1); }
|
| aIDENTIFIER { $$ = make_exprs(EXPR_IDENTIFIER, $1); }
|
||||||
|
@ -1033,6 +1037,17 @@ static expr_t *make_exprl(enum expr_type type, long val)
|
||||||
return e;
|
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)
|
static expr_t *make_exprs(enum expr_type type, char *val)
|
||||||
{
|
{
|
||||||
expr_t *e;
|
expr_t *e;
|
||||||
|
|
|
@ -227,6 +227,8 @@ static int compare_expr(const expr_t *a, const expr_t *b)
|
||||||
case EXPR_HEXNUM:
|
case EXPR_HEXNUM:
|
||||||
case EXPR_TRUEFALSE:
|
case EXPR_TRUEFALSE:
|
||||||
return a->u.lval - b->u.lval;
|
return a->u.lval - b->u.lval;
|
||||||
|
case EXPR_DOUBLE:
|
||||||
|
return a->u.dval - b->u.dval;
|
||||||
case EXPR_IDENTIFIER:
|
case EXPR_IDENTIFIER:
|
||||||
return strcmp(a->u.sval, b->u.sval);
|
return strcmp(a->u.sval, b->u.sval);
|
||||||
case EXPR_COND:
|
case EXPR_COND:
|
||||||
|
@ -2690,6 +2692,9 @@ static void write_struct_expr(FILE *h, const expr_t *e, int brackets,
|
||||||
case EXPR_HEXNUM:
|
case EXPR_HEXNUM:
|
||||||
fprintf(h, "0x%lx", e->u.lval);
|
fprintf(h, "0x%lx", e->u.lval);
|
||||||
break;
|
break;
|
||||||
|
case EXPR_DOUBLE:
|
||||||
|
fprintf(h, "%#.15g", e->u.dval);
|
||||||
|
break;
|
||||||
case EXPR_TRUEFALSE:
|
case EXPR_TRUEFALSE:
|
||||||
if (e->u.lval == 0)
|
if (e->u.lval == 0)
|
||||||
fprintf(h, "FALSE");
|
fprintf(h, "FALSE");
|
||||||
|
|
|
@ -135,6 +135,7 @@ enum expr_type
|
||||||
EXPR_VOID,
|
EXPR_VOID,
|
||||||
EXPR_NUM,
|
EXPR_NUM,
|
||||||
EXPR_HEXNUM,
|
EXPR_HEXNUM,
|
||||||
|
EXPR_DOUBLE,
|
||||||
EXPR_IDENTIFIER,
|
EXPR_IDENTIFIER,
|
||||||
EXPR_NEG,
|
EXPR_NEG,
|
||||||
EXPR_NOT,
|
EXPR_NOT,
|
||||||
|
@ -188,6 +189,7 @@ struct _expr_t {
|
||||||
const expr_t *ref;
|
const expr_t *ref;
|
||||||
union {
|
union {
|
||||||
long lval;
|
long lval;
|
||||||
|
double dval;
|
||||||
const char *sval;
|
const char *sval;
|
||||||
const expr_t *ext;
|
const expr_t *ext;
|
||||||
type_t *tref;
|
type_t *tref;
|
||||||
|
|
Loading…
Reference in New Issue