diff --git a/include/expr.h b/include/expr.h index 3ca1ec68..8878d71d 100644 --- a/include/expr.h +++ b/include/expr.h @@ -1,4 +1,4 @@ -/* $Id: expr.h,v 1.2 2001/07/05 08:37:59 mu Exp $ +/* $Id: expr.h,v 1.3 2001/07/05 09:32:58 mu Exp $ * Expression handling header file * * Copyright (C) 2001 Michael Urman @@ -67,17 +67,20 @@ typedef struct expr_s { } expr; expr *expr_new (ExprType, ExprItem, ExprOp, ExprType, ExprItem); -/*expr *expr_new_tree (ExprItem, ExprOp, ExprItem); -expr *expr_new_branch (ExprOp, ExprItem); -expr *expr_new_ident (ExprType, ExprItem);*/ + +ExprItem ExprSym (struct symrec_s *); +ExprItem ExprExpr (expr *); +ExprItem ExprNum (unsigned long); +ExprItem ExprNone (); + #define expr_new_tree(l,o,r) \ - expr_new (EXPR_EXPR, (ExprItem)(l), (ExprOp)(o), EXPR_EXPR, (ExprItem)(r)) + expr_new (EXPR_EXPR, ExprExpr(l), (o), EXPR_EXPR, ExprExpr(r)) #define expr_new_branch(o,r) \ - expr_new (EXPR_NONE, (ExprItem)0UL, (ExprOp)(o), EXPR_EXPR, (ExprItem)(r)) + expr_new (EXPR_NONE, ExprNone(), (o), EXPR_EXPR, ExprExpr(r)) #define expr_new_ident(t,r) \ - expr_new (EXPR_NONE, (ExprItem)0UL, EXPR_IDENT, (ExprType)(t), (ExprItem)(r)) -int expr_simplify (expr *); + expr_new (EXPR_NONE, ExprNone(), EXPR_IDENT, (ExprType)(t), (r)) +int expr_simplify (expr *); void expr_print (expr *); /* get the value if possible. return value is IF POSSIBLE, not the val */ diff --git a/libyasm/bytecode.c b/libyasm/bytecode.c index 5812dbd2..cec7f61d 100644 --- a/libyasm/bytecode.c +++ b/libyasm/bytecode.c @@ -1,4 +1,4 @@ -/* $Id: bytecode.c,v 1.9 2001/07/05 08:37:59 mu Exp $ +/* $Id: bytecode.c,v 1.10 2001/07/05 09:32:58 mu Exp $ * Bytecode utility functions * * Copyright (C) 2001 Peter Johnson @@ -95,7 +95,7 @@ immval *ConvertIntToImm(immval *ptr, unsigned long int_val) ptr = &im_static; /* FIXME: this will leak expr's if static is used */ - ptr->val = expr_new_ident(EXPR_NUM, int_val); + ptr->val = expr_new_ident(EXPR_NUM, ExprNum(int_val)); if((int_val & 0xFF) == int_val) ptr->len = 1; diff --git a/libyasm/expr.c b/libyasm/expr.c index 0d7f7221..ceece7a7 100644 --- a/libyasm/expr.c +++ b/libyasm/expr.c @@ -1,4 +1,4 @@ -/* $Id: expr.c,v 1.2 2001/07/05 08:37:59 mu Exp $ +/* $Id: expr.c,v 1.3 2001/07/05 09:32:58 mu Exp $ * Expression handling * * Copyright (C) 2001 Michael Urman @@ -21,6 +21,7 @@ */ #include #include +#include #include "expr.h" #include "symrec.h" #include "globals.h" @@ -63,6 +64,12 @@ expr *expr_new (ExprType ltype, return ptr; } +/* helpers */ +ExprItem ExprSym (struct symrec_s *s) { ExprItem e; e.sym = s; return e; } +ExprItem ExprExpr (expr *x) { ExprItem e; e.expr = x; return e; } +ExprItem ExprNum (unsigned long n) { ExprItem e; e.num = n; return e; } +ExprItem ExprNone () { ExprItem e; e.num = 0; return e; } + /* get rid of unnecessary branches if possible. report. */ int expr_simplify (expr *e) { @@ -208,7 +215,7 @@ void expr_print (expr *e) { if (e->op != EXPR_IDENT) { switch (e->ltype) { - case EXPR_NUM: printf ("%d", e->left.num); break; + case EXPR_NUM: printf ("%lu", e->left.num); break; case EXPR_SYM: printf ("%s", e->left.sym->name); break; case EXPR_EXPR: printf ("("); expr_print (e->left.expr); printf(")"); case EXPR_NONE: break; @@ -219,7 +226,7 @@ void expr_print (expr *e) case EXPR_SUB: printf ("-"); break; case EXPR_MUL: printf ("*"); break; case EXPR_DIV: printf ("/"); break; - case EXPR_MOD: printf ("%"); break; + case EXPR_MOD: printf ("%%"); break; case EXPR_NEG: printf ("-"); break; case EXPR_NOT: printf ("~"); break; case EXPR_OR: printf ("|"); break; @@ -235,10 +242,11 @@ void expr_print (expr *e) case EXPR_LE: printf ("<="); break; case EXPR_GE: printf (">="); break; case EXPR_NE: printf ("!="); break; + case EXPR_EQ: printf ("=="); break; case EXPR_IDENT: break; } switch (e->rtype) { - case EXPR_NUM: printf ("%d", e->right.num); break; + case EXPR_NUM: printf ("%lu", e->right.num); break; case EXPR_SYM: printf ("%s", e->right.sym->name); break; case EXPR_EXPR: printf ("("); expr_print (e->right.expr); printf(")"); case EXPR_NONE: break; diff --git a/libyasm/expr.h b/libyasm/expr.h index 3ca1ec68..8878d71d 100644 --- a/libyasm/expr.h +++ b/libyasm/expr.h @@ -1,4 +1,4 @@ -/* $Id: expr.h,v 1.2 2001/07/05 08:37:59 mu Exp $ +/* $Id: expr.h,v 1.3 2001/07/05 09:32:58 mu Exp $ * Expression handling header file * * Copyright (C) 2001 Michael Urman @@ -67,17 +67,20 @@ typedef struct expr_s { } expr; expr *expr_new (ExprType, ExprItem, ExprOp, ExprType, ExprItem); -/*expr *expr_new_tree (ExprItem, ExprOp, ExprItem); -expr *expr_new_branch (ExprOp, ExprItem); -expr *expr_new_ident (ExprType, ExprItem);*/ + +ExprItem ExprSym (struct symrec_s *); +ExprItem ExprExpr (expr *); +ExprItem ExprNum (unsigned long); +ExprItem ExprNone (); + #define expr_new_tree(l,o,r) \ - expr_new (EXPR_EXPR, (ExprItem)(l), (ExprOp)(o), EXPR_EXPR, (ExprItem)(r)) + expr_new (EXPR_EXPR, ExprExpr(l), (o), EXPR_EXPR, ExprExpr(r)) #define expr_new_branch(o,r) \ - expr_new (EXPR_NONE, (ExprItem)0UL, (ExprOp)(o), EXPR_EXPR, (ExprItem)(r)) + expr_new (EXPR_NONE, ExprNone(), (o), EXPR_EXPR, ExprExpr(r)) #define expr_new_ident(t,r) \ - expr_new (EXPR_NONE, (ExprItem)0UL, EXPR_IDENT, (ExprType)(t), (ExprItem)(r)) -int expr_simplify (expr *); + expr_new (EXPR_NONE, ExprNone(), EXPR_IDENT, (ExprType)(t), (r)) +int expr_simplify (expr *); void expr_print (expr *); /* get the value if possible. return value is IF POSSIBLE, not the val */ diff --git a/modules/arch/x86/expr.c b/modules/arch/x86/expr.c index 0d7f7221..ceece7a7 100644 --- a/modules/arch/x86/expr.c +++ b/modules/arch/x86/expr.c @@ -1,4 +1,4 @@ -/* $Id: expr.c,v 1.2 2001/07/05 08:37:59 mu Exp $ +/* $Id: expr.c,v 1.3 2001/07/05 09:32:58 mu Exp $ * Expression handling * * Copyright (C) 2001 Michael Urman @@ -21,6 +21,7 @@ */ #include #include +#include #include "expr.h" #include "symrec.h" #include "globals.h" @@ -63,6 +64,12 @@ expr *expr_new (ExprType ltype, return ptr; } +/* helpers */ +ExprItem ExprSym (struct symrec_s *s) { ExprItem e; e.sym = s; return e; } +ExprItem ExprExpr (expr *x) { ExprItem e; e.expr = x; return e; } +ExprItem ExprNum (unsigned long n) { ExprItem e; e.num = n; return e; } +ExprItem ExprNone () { ExprItem e; e.num = 0; return e; } + /* get rid of unnecessary branches if possible. report. */ int expr_simplify (expr *e) { @@ -208,7 +215,7 @@ void expr_print (expr *e) { if (e->op != EXPR_IDENT) { switch (e->ltype) { - case EXPR_NUM: printf ("%d", e->left.num); break; + case EXPR_NUM: printf ("%lu", e->left.num); break; case EXPR_SYM: printf ("%s", e->left.sym->name); break; case EXPR_EXPR: printf ("("); expr_print (e->left.expr); printf(")"); case EXPR_NONE: break; @@ -219,7 +226,7 @@ void expr_print (expr *e) case EXPR_SUB: printf ("-"); break; case EXPR_MUL: printf ("*"); break; case EXPR_DIV: printf ("/"); break; - case EXPR_MOD: printf ("%"); break; + case EXPR_MOD: printf ("%%"); break; case EXPR_NEG: printf ("-"); break; case EXPR_NOT: printf ("~"); break; case EXPR_OR: printf ("|"); break; @@ -235,10 +242,11 @@ void expr_print (expr *e) case EXPR_LE: printf ("<="); break; case EXPR_GE: printf (">="); break; case EXPR_NE: printf ("!="); break; + case EXPR_EQ: printf ("=="); break; case EXPR_IDENT: break; } switch (e->rtype) { - case EXPR_NUM: printf ("%d", e->right.num); break; + case EXPR_NUM: printf ("%lu", e->right.num); break; case EXPR_SYM: printf ("%s", e->right.sym->name); break; case EXPR_EXPR: printf ("("); expr_print (e->right.expr); printf(")"); case EXPR_NONE: break; diff --git a/modules/arch/x86/x86expr.c b/modules/arch/x86/x86expr.c index 1bf3c884..abb8ef2c 100644 --- a/modules/arch/x86/x86expr.c +++ b/modules/arch/x86/x86expr.c @@ -1,4 +1,4 @@ -/* $Id: x86expr.c,v 1.2 2001/07/05 08:37:59 mu Exp $ +/* $Id: x86expr.c,v 1.3 2001/07/05 09:32:58 mu Exp $ * Expression handling * * Copyright (C) 2001 Michael Urman @@ -21,6 +21,7 @@ */ #include #include +#include #include "expr.h" #include "symrec.h" #include "globals.h" @@ -63,6 +64,12 @@ expr *expr_new (ExprType ltype, return ptr; } +/* helpers */ +ExprItem ExprSym (struct symrec_s *s) { ExprItem e; e.sym = s; return e; } +ExprItem ExprExpr (expr *x) { ExprItem e; e.expr = x; return e; } +ExprItem ExprNum (unsigned long n) { ExprItem e; e.num = n; return e; } +ExprItem ExprNone () { ExprItem e; e.num = 0; return e; } + /* get rid of unnecessary branches if possible. report. */ int expr_simplify (expr *e) { @@ -208,7 +215,7 @@ void expr_print (expr *e) { if (e->op != EXPR_IDENT) { switch (e->ltype) { - case EXPR_NUM: printf ("%d", e->left.num); break; + case EXPR_NUM: printf ("%lu", e->left.num); break; case EXPR_SYM: printf ("%s", e->left.sym->name); break; case EXPR_EXPR: printf ("("); expr_print (e->left.expr); printf(")"); case EXPR_NONE: break; @@ -219,7 +226,7 @@ void expr_print (expr *e) case EXPR_SUB: printf ("-"); break; case EXPR_MUL: printf ("*"); break; case EXPR_DIV: printf ("/"); break; - case EXPR_MOD: printf ("%"); break; + case EXPR_MOD: printf ("%%"); break; case EXPR_NEG: printf ("-"); break; case EXPR_NOT: printf ("~"); break; case EXPR_OR: printf ("|"); break; @@ -235,10 +242,11 @@ void expr_print (expr *e) case EXPR_LE: printf ("<="); break; case EXPR_GE: printf (">="); break; case EXPR_NE: printf ("!="); break; + case EXPR_EQ: printf ("=="); break; case EXPR_IDENT: break; } switch (e->rtype) { - case EXPR_NUM: printf ("%d", e->right.num); break; + case EXPR_NUM: printf ("%lu", e->right.num); break; case EXPR_SYM: printf ("%s", e->right.sym->name); break; case EXPR_EXPR: printf ("("); expr_print (e->right.expr); printf(")"); case EXPR_NONE: break; diff --git a/modules/parsers/nasm/bison.y.in b/modules/parsers/nasm/bison.y.in index f1644f07..f282e8b5 100644 --- a/modules/parsers/nasm/bison.y.in +++ b/modules/parsers/nasm/bison.y.in @@ -1,4 +1,4 @@ -/* $Id: bison.y.in,v 1.16 2001/07/05 08:37:59 mu Exp $ +/* $Id: bison.y.in,v 1.17 2001/07/05 09:32:58 mu Exp $ * Main bison parser * * Copyright (C) 2001 Peter Johnson, Michael Urman @@ -276,8 +276,8 @@ rm128: XMMREG { (void)ConvertRegToEA(&$$, $1); } /* immediate values */ /* TODO: formula expansion */ immexp: /*INTNUM { (void)ConvertIntToImm(&$$, $1); } */ - INTNUM { $$ = expr_new_ident (EXPR_NUM, $1); } - | immlabel { $$ = expr_new_ident (EXPR_SYM, sym_use_get ($1.name, SYM_LABEL)); } + INTNUM { $$ = expr_new_ident (EXPR_NUM, ExprNum($1)); } + | immlabel { $$ = expr_new_ident (EXPR_SYM, ExprSym(sym_use_get ($1.name, SYM_LABEL))); } /*| immexp '||' immexp { $$ = expr_new_tree ($1, EXPR_LOR, $3); }*/ | immexp '|' immexp { $$ = expr_new_tree ($1, EXPR_OR, $3); } | immexp '^' immexp { $$ = expr_new_tree ($1, EXPR_XOR, $3); } diff --git a/modules/parsers/nasm/nasm-bison.y b/modules/parsers/nasm/nasm-bison.y index 6c1a66bb..5dbfced1 100644 --- a/modules/parsers/nasm/nasm-bison.y +++ b/modules/parsers/nasm/nasm-bison.y @@ -1,4 +1,4 @@ -/* $Id: nasm-bison.y,v 1.16 2001/07/05 08:37:59 mu Exp $ +/* $Id: nasm-bison.y,v 1.17 2001/07/05 09:32:58 mu Exp $ * Main bison parser * * Copyright (C) 2001 Peter Johnson, Michael Urman @@ -276,8 +276,8 @@ rm128: XMMREG { (void)ConvertRegToEA(&$$, $1); } /* immediate values */ /* TODO: formula expansion */ immexp: /*INTNUM { (void)ConvertIntToImm(&$$, $1); } */ - INTNUM { $$ = expr_new_ident (EXPR_NUM, $1); } - | immlabel { $$ = expr_new_ident (EXPR_SYM, sym_use_get ($1.name, SYM_LABEL)); } + INTNUM { $$ = expr_new_ident (EXPR_NUM, ExprNum($1)); } + | immlabel { $$ = expr_new_ident (EXPR_SYM, ExprSym(sym_use_get ($1.name, SYM_LABEL))); } /*| immexp '||' immexp { $$ = expr_new_tree ($1, EXPR_LOR, $3); }*/ | immexp '|' immexp { $$ = expr_new_tree ($1, EXPR_OR, $3); } | immexp '^' immexp { $$ = expr_new_tree ($1, EXPR_XOR, $3); } diff --git a/src/arch/x86/expr.c b/src/arch/x86/expr.c index 0d7f7221..ceece7a7 100644 --- a/src/arch/x86/expr.c +++ b/src/arch/x86/expr.c @@ -1,4 +1,4 @@ -/* $Id: expr.c,v 1.2 2001/07/05 08:37:59 mu Exp $ +/* $Id: expr.c,v 1.3 2001/07/05 09:32:58 mu Exp $ * Expression handling * * Copyright (C) 2001 Michael Urman @@ -21,6 +21,7 @@ */ #include #include +#include #include "expr.h" #include "symrec.h" #include "globals.h" @@ -63,6 +64,12 @@ expr *expr_new (ExprType ltype, return ptr; } +/* helpers */ +ExprItem ExprSym (struct symrec_s *s) { ExprItem e; e.sym = s; return e; } +ExprItem ExprExpr (expr *x) { ExprItem e; e.expr = x; return e; } +ExprItem ExprNum (unsigned long n) { ExprItem e; e.num = n; return e; } +ExprItem ExprNone () { ExprItem e; e.num = 0; return e; } + /* get rid of unnecessary branches if possible. report. */ int expr_simplify (expr *e) { @@ -208,7 +215,7 @@ void expr_print (expr *e) { if (e->op != EXPR_IDENT) { switch (e->ltype) { - case EXPR_NUM: printf ("%d", e->left.num); break; + case EXPR_NUM: printf ("%lu", e->left.num); break; case EXPR_SYM: printf ("%s", e->left.sym->name); break; case EXPR_EXPR: printf ("("); expr_print (e->left.expr); printf(")"); case EXPR_NONE: break; @@ -219,7 +226,7 @@ void expr_print (expr *e) case EXPR_SUB: printf ("-"); break; case EXPR_MUL: printf ("*"); break; case EXPR_DIV: printf ("/"); break; - case EXPR_MOD: printf ("%"); break; + case EXPR_MOD: printf ("%%"); break; case EXPR_NEG: printf ("-"); break; case EXPR_NOT: printf ("~"); break; case EXPR_OR: printf ("|"); break; @@ -235,10 +242,11 @@ void expr_print (expr *e) case EXPR_LE: printf ("<="); break; case EXPR_GE: printf (">="); break; case EXPR_NE: printf ("!="); break; + case EXPR_EQ: printf ("=="); break; case EXPR_IDENT: break; } switch (e->rtype) { - case EXPR_NUM: printf ("%d", e->right.num); break; + case EXPR_NUM: printf ("%lu", e->right.num); break; case EXPR_SYM: printf ("%s", e->right.sym->name); break; case EXPR_EXPR: printf ("("); expr_print (e->right.expr); printf(")"); case EXPR_NONE: break; diff --git a/src/arch/x86/x86expr.c b/src/arch/x86/x86expr.c index 1bf3c884..abb8ef2c 100644 --- a/src/arch/x86/x86expr.c +++ b/src/arch/x86/x86expr.c @@ -1,4 +1,4 @@ -/* $Id: x86expr.c,v 1.2 2001/07/05 08:37:59 mu Exp $ +/* $Id: x86expr.c,v 1.3 2001/07/05 09:32:58 mu Exp $ * Expression handling * * Copyright (C) 2001 Michael Urman @@ -21,6 +21,7 @@ */ #include #include +#include #include "expr.h" #include "symrec.h" #include "globals.h" @@ -63,6 +64,12 @@ expr *expr_new (ExprType ltype, return ptr; } +/* helpers */ +ExprItem ExprSym (struct symrec_s *s) { ExprItem e; e.sym = s; return e; } +ExprItem ExprExpr (expr *x) { ExprItem e; e.expr = x; return e; } +ExprItem ExprNum (unsigned long n) { ExprItem e; e.num = n; return e; } +ExprItem ExprNone () { ExprItem e; e.num = 0; return e; } + /* get rid of unnecessary branches if possible. report. */ int expr_simplify (expr *e) { @@ -208,7 +215,7 @@ void expr_print (expr *e) { if (e->op != EXPR_IDENT) { switch (e->ltype) { - case EXPR_NUM: printf ("%d", e->left.num); break; + case EXPR_NUM: printf ("%lu", e->left.num); break; case EXPR_SYM: printf ("%s", e->left.sym->name); break; case EXPR_EXPR: printf ("("); expr_print (e->left.expr); printf(")"); case EXPR_NONE: break; @@ -219,7 +226,7 @@ void expr_print (expr *e) case EXPR_SUB: printf ("-"); break; case EXPR_MUL: printf ("*"); break; case EXPR_DIV: printf ("/"); break; - case EXPR_MOD: printf ("%"); break; + case EXPR_MOD: printf ("%%"); break; case EXPR_NEG: printf ("-"); break; case EXPR_NOT: printf ("~"); break; case EXPR_OR: printf ("|"); break; @@ -235,10 +242,11 @@ void expr_print (expr *e) case EXPR_LE: printf ("<="); break; case EXPR_GE: printf (">="); break; case EXPR_NE: printf ("!="); break; + case EXPR_EQ: printf ("=="); break; case EXPR_IDENT: break; } switch (e->rtype) { - case EXPR_NUM: printf ("%d", e->right.num); break; + case EXPR_NUM: printf ("%lu", e->right.num); break; case EXPR_SYM: printf ("%s", e->right.sym->name); break; case EXPR_EXPR: printf ("("); expr_print (e->right.expr); printf(")"); case EXPR_NONE: break; diff --git a/src/bison.y.in b/src/bison.y.in index f1644f07..f282e8b5 100644 --- a/src/bison.y.in +++ b/src/bison.y.in @@ -1,4 +1,4 @@ -/* $Id: bison.y.in,v 1.16 2001/07/05 08:37:59 mu Exp $ +/* $Id: bison.y.in,v 1.17 2001/07/05 09:32:58 mu Exp $ * Main bison parser * * Copyright (C) 2001 Peter Johnson, Michael Urman @@ -276,8 +276,8 @@ rm128: XMMREG { (void)ConvertRegToEA(&$$, $1); } /* immediate values */ /* TODO: formula expansion */ immexp: /*INTNUM { (void)ConvertIntToImm(&$$, $1); } */ - INTNUM { $$ = expr_new_ident (EXPR_NUM, $1); } - | immlabel { $$ = expr_new_ident (EXPR_SYM, sym_use_get ($1.name, SYM_LABEL)); } + INTNUM { $$ = expr_new_ident (EXPR_NUM, ExprNum($1)); } + | immlabel { $$ = expr_new_ident (EXPR_SYM, ExprSym(sym_use_get ($1.name, SYM_LABEL))); } /*| immexp '||' immexp { $$ = expr_new_tree ($1, EXPR_LOR, $3); }*/ | immexp '|' immexp { $$ = expr_new_tree ($1, EXPR_OR, $3); } | immexp '^' immexp { $$ = expr_new_tree ($1, EXPR_XOR, $3); } diff --git a/src/bytecode.c b/src/bytecode.c index 5812dbd2..cec7f61d 100644 --- a/src/bytecode.c +++ b/src/bytecode.c @@ -1,4 +1,4 @@ -/* $Id: bytecode.c,v 1.9 2001/07/05 08:37:59 mu Exp $ +/* $Id: bytecode.c,v 1.10 2001/07/05 09:32:58 mu Exp $ * Bytecode utility functions * * Copyright (C) 2001 Peter Johnson @@ -95,7 +95,7 @@ immval *ConvertIntToImm(immval *ptr, unsigned long int_val) ptr = &im_static; /* FIXME: this will leak expr's if static is used */ - ptr->val = expr_new_ident(EXPR_NUM, int_val); + ptr->val = expr_new_ident(EXPR_NUM, ExprNum(int_val)); if((int_val & 0xFF) == int_val) ptr->len = 1; diff --git a/src/expr.c b/src/expr.c index 0d7f7221..ceece7a7 100644 --- a/src/expr.c +++ b/src/expr.c @@ -1,4 +1,4 @@ -/* $Id: expr.c,v 1.2 2001/07/05 08:37:59 mu Exp $ +/* $Id: expr.c,v 1.3 2001/07/05 09:32:58 mu Exp $ * Expression handling * * Copyright (C) 2001 Michael Urman @@ -21,6 +21,7 @@ */ #include #include +#include #include "expr.h" #include "symrec.h" #include "globals.h" @@ -63,6 +64,12 @@ expr *expr_new (ExprType ltype, return ptr; } +/* helpers */ +ExprItem ExprSym (struct symrec_s *s) { ExprItem e; e.sym = s; return e; } +ExprItem ExprExpr (expr *x) { ExprItem e; e.expr = x; return e; } +ExprItem ExprNum (unsigned long n) { ExprItem e; e.num = n; return e; } +ExprItem ExprNone () { ExprItem e; e.num = 0; return e; } + /* get rid of unnecessary branches if possible. report. */ int expr_simplify (expr *e) { @@ -208,7 +215,7 @@ void expr_print (expr *e) { if (e->op != EXPR_IDENT) { switch (e->ltype) { - case EXPR_NUM: printf ("%d", e->left.num); break; + case EXPR_NUM: printf ("%lu", e->left.num); break; case EXPR_SYM: printf ("%s", e->left.sym->name); break; case EXPR_EXPR: printf ("("); expr_print (e->left.expr); printf(")"); case EXPR_NONE: break; @@ -219,7 +226,7 @@ void expr_print (expr *e) case EXPR_SUB: printf ("-"); break; case EXPR_MUL: printf ("*"); break; case EXPR_DIV: printf ("/"); break; - case EXPR_MOD: printf ("%"); break; + case EXPR_MOD: printf ("%%"); break; case EXPR_NEG: printf ("-"); break; case EXPR_NOT: printf ("~"); break; case EXPR_OR: printf ("|"); break; @@ -235,10 +242,11 @@ void expr_print (expr *e) case EXPR_LE: printf ("<="); break; case EXPR_GE: printf (">="); break; case EXPR_NE: printf ("!="); break; + case EXPR_EQ: printf ("=="); break; case EXPR_IDENT: break; } switch (e->rtype) { - case EXPR_NUM: printf ("%d", e->right.num); break; + case EXPR_NUM: printf ("%lu", e->right.num); break; case EXPR_SYM: printf ("%s", e->right.sym->name); break; case EXPR_EXPR: printf ("("); expr_print (e->right.expr); printf(")"); case EXPR_NONE: break; diff --git a/src/expr.h b/src/expr.h index 3ca1ec68..8878d71d 100644 --- a/src/expr.h +++ b/src/expr.h @@ -1,4 +1,4 @@ -/* $Id: expr.h,v 1.2 2001/07/05 08:37:59 mu Exp $ +/* $Id: expr.h,v 1.3 2001/07/05 09:32:58 mu Exp $ * Expression handling header file * * Copyright (C) 2001 Michael Urman @@ -67,17 +67,20 @@ typedef struct expr_s { } expr; expr *expr_new (ExprType, ExprItem, ExprOp, ExprType, ExprItem); -/*expr *expr_new_tree (ExprItem, ExprOp, ExprItem); -expr *expr_new_branch (ExprOp, ExprItem); -expr *expr_new_ident (ExprType, ExprItem);*/ + +ExprItem ExprSym (struct symrec_s *); +ExprItem ExprExpr (expr *); +ExprItem ExprNum (unsigned long); +ExprItem ExprNone (); + #define expr_new_tree(l,o,r) \ - expr_new (EXPR_EXPR, (ExprItem)(l), (ExprOp)(o), EXPR_EXPR, (ExprItem)(r)) + expr_new (EXPR_EXPR, ExprExpr(l), (o), EXPR_EXPR, ExprExpr(r)) #define expr_new_branch(o,r) \ - expr_new (EXPR_NONE, (ExprItem)0UL, (ExprOp)(o), EXPR_EXPR, (ExprItem)(r)) + expr_new (EXPR_NONE, ExprNone(), (o), EXPR_EXPR, ExprExpr(r)) #define expr_new_ident(t,r) \ - expr_new (EXPR_NONE, (ExprItem)0UL, EXPR_IDENT, (ExprType)(t), (ExprItem)(r)) -int expr_simplify (expr *); + expr_new (EXPR_NONE, ExprNone(), EXPR_IDENT, (ExprType)(t), (r)) +int expr_simplify (expr *); void expr_print (expr *); /* get the value if possible. return value is IF POSSIBLE, not the val */ diff --git a/src/parsers/nasm/bison.y.in b/src/parsers/nasm/bison.y.in index f1644f07..f282e8b5 100644 --- a/src/parsers/nasm/bison.y.in +++ b/src/parsers/nasm/bison.y.in @@ -1,4 +1,4 @@ -/* $Id: bison.y.in,v 1.16 2001/07/05 08:37:59 mu Exp $ +/* $Id: bison.y.in,v 1.17 2001/07/05 09:32:58 mu Exp $ * Main bison parser * * Copyright (C) 2001 Peter Johnson, Michael Urman @@ -276,8 +276,8 @@ rm128: XMMREG { (void)ConvertRegToEA(&$$, $1); } /* immediate values */ /* TODO: formula expansion */ immexp: /*INTNUM { (void)ConvertIntToImm(&$$, $1); } */ - INTNUM { $$ = expr_new_ident (EXPR_NUM, $1); } - | immlabel { $$ = expr_new_ident (EXPR_SYM, sym_use_get ($1.name, SYM_LABEL)); } + INTNUM { $$ = expr_new_ident (EXPR_NUM, ExprNum($1)); } + | immlabel { $$ = expr_new_ident (EXPR_SYM, ExprSym(sym_use_get ($1.name, SYM_LABEL))); } /*| immexp '||' immexp { $$ = expr_new_tree ($1, EXPR_LOR, $3); }*/ | immexp '|' immexp { $$ = expr_new_tree ($1, EXPR_OR, $3); } | immexp '^' immexp { $$ = expr_new_tree ($1, EXPR_XOR, $3); } diff --git a/src/parsers/nasm/nasm-bison.y b/src/parsers/nasm/nasm-bison.y index 6c1a66bb..5dbfced1 100644 --- a/src/parsers/nasm/nasm-bison.y +++ b/src/parsers/nasm/nasm-bison.y @@ -1,4 +1,4 @@ -/* $Id: nasm-bison.y,v 1.16 2001/07/05 08:37:59 mu Exp $ +/* $Id: nasm-bison.y,v 1.17 2001/07/05 09:32:58 mu Exp $ * Main bison parser * * Copyright (C) 2001 Peter Johnson, Michael Urman @@ -276,8 +276,8 @@ rm128: XMMREG { (void)ConvertRegToEA(&$$, $1); } /* immediate values */ /* TODO: formula expansion */ immexp: /*INTNUM { (void)ConvertIntToImm(&$$, $1); } */ - INTNUM { $$ = expr_new_ident (EXPR_NUM, $1); } - | immlabel { $$ = expr_new_ident (EXPR_SYM, sym_use_get ($1.name, SYM_LABEL)); } + INTNUM { $$ = expr_new_ident (EXPR_NUM, ExprNum($1)); } + | immlabel { $$ = expr_new_ident (EXPR_SYM, ExprSym(sym_use_get ($1.name, SYM_LABEL))); } /*| immexp '||' immexp { $$ = expr_new_tree ($1, EXPR_LOR, $3); }*/ | immexp '|' immexp { $$ = expr_new_tree ($1, EXPR_OR, $3); } | immexp '^' immexp { $$ = expr_new_tree ($1, EXPR_XOR, $3); }