X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=blobdiff_plain;f=expr.c;h=44fd892bab2d0594170dd834741b411dc9498284;hp=b7bf4b1a95b1237a244a8ae12ff619255b4cdaa1;hb=03dd34951a331e0b8971195ccef1600fffaea2e6;hpb=60f204cb9e3905100da0d89f14bb40db764acd9e diff --git a/expr.c b/expr.c index b7bf4b1..44fd892 100644 --- a/expr.c +++ b/expr.c @@ -1,7 +1,7 @@ // -// RMAC - Reboot's Macro Assembler for the Atari Jaguar Console System +// RMAC - Reboot's Macro Assembler for all Atari computers // EXPR.C - Expression Analyzer -// Copyright (C) 199x Landon Dyer, 2017 Reboot and Friends +// Copyright (C) 199x Landon Dyer, 2011-2017 Reboot and Friends // RMAC derived from MADMAC v1.07 Written by Landon Dyer, 1986 // Source utilised with the kind permission of Landon Dyer // @@ -77,14 +77,13 @@ static VALUE str_value(char * p) // void InitExpression(void) { - int i; - char * p; - // Initialize token-class table (all set to END) - for(i=0; i<256; i++) + for(int i=0; i<256; i++) tokenClass[i] = END; - for(i=0, p=itokcl; *p!=1; p++) + int i = 0; + + for(char * p=itokcl; *p!=1; p++) { if (*p == 0) i++; @@ -288,6 +287,20 @@ int expr2(void) *evalTokenBuffer++ = (orgactive ? orgaddr : pcloc); // '*' takes attributes of current section, not ABS! *evalTokenBuffer++ = cursect | DEFINED; + break; + case '{': + if (expr0() != OK) // Eat up first parameter (register or immediate) + return ERROR; + + if (*tok++ != ':') // Demand a ':' there + return error("missing colon ':'"); + + if (expr0() != OK) // Eat up second parameter (register or immediate) + return ERROR; + + if (*tok++ != '}') + return error("missing close bracket '}'"); + break; default: return error("bad expression"); @@ -465,17 +478,12 @@ thrown away right here. What the hell is it for? // int evexpr(TOKEN * tk, VALUE * a_value, WORD * a_attr, SYM ** a_esym) { - WORD * sattr; - VALUE * sval; WORD attr; SYM * sy; - SYM * esym; - WORD sym_seg; - - sval = evstk; // (Empty) initial stack - sattr = evattr; - esym = NULL; // No external symbol involved - sym_seg = 0; + VALUE * sval = evstk; // (Empty) initial stack + WORD * sattr = evattr; + SYM * esym = NULL; // No external symbol involved + WORD sym_seg = 0; while (*tk != ENDEXPR) { @@ -745,7 +753,7 @@ printf("EVEXPR (-): sym1 = %X, sym2 = %X\n", attr, sattr[1]); // sym_seg added in 1.0.16 to solve a problem with forward symbols in // expressions where absolute values also existed. The absolutes were // overiding the symbol segments and not being included :( - //*a_attr = *sattr | sym_seg; // Copy value + attrib + //*a_attr = *sattr | sym_seg; // Copy value + attrib *a_attr = *sattr; // Copy value + attrib *a_value = *sval;