Rob Shearman : widl: Add support for '%' operator in expressions.
Alexandre Julliard
julliard at winehq.org
Mon Apr 21 07:46:19 CDT 2008
Module: wine
Branch: master
Commit: ea9932557af5d30dc652d27edc3548664cb879c0
URL: http://source.winehq.org/git/wine.git/?a=commit;h=ea9932557af5d30dc652d27edc3548664cb879c0
Author: Rob Shearman <rob at codeweavers.com>
Date: Sun Apr 20 22:16:10 2008 +0100
widl: Add support for '%' operator in expressions.
---
tools/widl/header.c | 2 ++
tools/widl/parser.y | 10 +++++++++-
tools/widl/typegen.c | 3 +++
tools/widl/widltypes.h | 1 +
4 files changed, 15 insertions(+), 1 deletions(-)
diff --git a/tools/widl/header.c b/tools/widl/header.c
index 6989149..e1dccce 100644
--- a/tools/widl/header.c
+++ b/tools/widl/header.c
@@ -520,6 +520,7 @@ void write_expr(FILE *h, const expr_t *e, int brackets)
break;
case EXPR_SHL:
case EXPR_SHR:
+ case EXPR_MOD:
case EXPR_MUL:
case EXPR_DIV:
case EXPR_ADD:
@@ -533,6 +534,7 @@ void write_expr(FILE *h, const expr_t *e, int brackets)
switch (e->type) {
case EXPR_SHL: fprintf(h, " << "); break;
case EXPR_SHR: fprintf(h, " >> "); break;
+ case EXPR_MOD: fprintf(h, " %% "); break;
case EXPR_MUL: fprintf(h, " * "); break;
case EXPR_DIV: fprintf(h, " / "); break;
case EXPR_ADD: fprintf(h, " + "); break;
diff --git a/tools/widl/parser.y b/tools/widl/parser.y
index 32752bf..31f631f 100644
--- a/tools/widl/parser.y
+++ b/tools/widl/parser.y
@@ -293,7 +293,7 @@ static void add_explicit_handle_if_necessary(func_t *func);
%left '|'
%left '&'
%left '-' '+'
-%left '*' '/'
+%left '*' '/' '%'
%left SHL SHR
%left '.' MEMBERPTR '[' ']'
%right '~'
@@ -632,6 +632,7 @@ expr: aNUM { $$ = make_exprl(EXPR_NUM, $1); }
| expr '&' expr { $$ = make_expr2(EXPR_AND, $1, $3); }
| expr '+' expr { $$ = make_expr2(EXPR_ADD, $1, $3); }
| expr '-' expr { $$ = make_expr2(EXPR_SUB, $1, $3); }
+ | expr '%' expr { $$ = make_expr2(EXPR_MOD, $1, $3); }
| expr '*' expr { $$ = make_expr2(EXPR_MUL, $1, $3); }
| expr '/' expr { $$ = make_expr2(EXPR_DIV, $1, $3); }
| expr SHL expr { $$ = make_expr2(EXPR_SHL, $1, $3); }
@@ -1238,6 +1239,13 @@ static expr_t *make_expr2(enum expr_type type, expr_t *expr1, expr_t *expr2)
case EXPR_SUB:
e->cval = expr1->cval - expr2->cval;
break;
+ case EXPR_MOD:
+ if (expr2->cval == 0) {
+ error_loc("divide by zero in expression\n");
+ e->cval = 0;
+ } else
+ e->cval = expr1->cval % expr2->cval;
+ break;
case EXPR_MUL:
e->cval = expr1->cval * expr2->cval;
break;
diff --git a/tools/widl/typegen.c b/tools/widl/typegen.c
index da5c95a..575f06c 100644
--- a/tools/widl/typegen.c
+++ b/tools/widl/typegen.c
@@ -352,6 +352,7 @@ static int compare_expr(const expr_t *a, const expr_t *b)
case EXPR_AND:
case EXPR_ADD:
case EXPR_SUB:
+ case EXPR_MOD:
case EXPR_MUL:
case EXPR_DIV:
case EXPR_SHL:
@@ -3148,6 +3149,7 @@ static void write_struct_expr(FILE *h, const expr_t *e, int brackets,
break;
case EXPR_SHL:
case EXPR_SHR:
+ case EXPR_MOD:
case EXPR_MUL:
case EXPR_DIV:
case EXPR_ADD:
@@ -3161,6 +3163,7 @@ static void write_struct_expr(FILE *h, const expr_t *e, int brackets,
switch (e->type) {
case EXPR_SHL: fprintf(h, " << "); break;
case EXPR_SHR: fprintf(h, " >> "); break;
+ case EXPR_MOD: fprintf(h, " %% "); break;
case EXPR_MUL: fprintf(h, " * "); break;
case EXPR_DIV: fprintf(h, " / "); break;
case EXPR_ADD: fprintf(h, " + "); break;
diff --git a/tools/widl/widltypes.h b/tools/widl/widltypes.h
index 31c7599..879c7a9 100644
--- a/tools/widl/widltypes.h
+++ b/tools/widl/widltypes.h
@@ -164,6 +164,7 @@ enum expr_type
EXPR_MEMBERPTR,
EXPR_MEMBER,
EXPR_ARRAY,
+ EXPR_MOD,
};
enum type_kind
More information about the wine-cvs
mailing list