X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=blobdiff_plain;f=expr.c;h=f31e9e59ddf67c1be317af23a1428c22da4ee534;hp=6db7435dd205546e0afc4d25c3e018fcb1077301;hb=fbbe9b115f949735421485513154ce8abb8453eb;hpb=30a208654896284b50e7b362e97d3e63ec717b96 diff --git a/expr.c b/expr.c index 6db7435..f31e9e5 100644 --- a/expr.c +++ b/expr.c @@ -1,7 +1,7 @@ // // RMAC - Reboot's Macro Assembler for all Atari computers // EXPR.C - Expression Analyzer -// Copyright (C) 199x Landon Dyer, 2011-2018 Reboot and Friends +// Copyright (C) 199x Landon Dyer, 2011-2020 Reboot and Friends // RMAC derived from MADMAC v1.07 Written by Landon Dyer, 1986 // Source utilised with the kind permission of Landon Dyer // @@ -35,7 +35,7 @@ char itokcl[] = { CR_DEFINED, CR_REFERENCED, // SUNARY (special unary) CR_STREQ, CR_MACDEF, CR_DATE, CR_TIME, - CR_ABSCOUNT, 0, + CR_ABSCOUNT, CR_FILESIZE, 0, '!', '~', UNMINUS, UNLT, UNGT, 0, // UNARY '*', '/', '%', 0, // MULT '+', '-', 0, // ADD @@ -155,8 +155,54 @@ int expr1(void) switch (*tok++) { case CR_ABSCOUNT: + if (cursect != ABS) + { + *evalTokenBuffer.u32++ = CONST; + *evalTokenBuffer.u64++ = sect[ABS].sloc; + } + else + { + *evalTokenBuffer.u32++ = CONST; + *evalTokenBuffer.u64++ = sloc; + } + break; + case CR_FILESIZE: + if (*tok++ != STRING) + return error("^^FILESIZE expects filename inside string"); + *evalTokenBuffer.u32++ = CONST; - *evalTokenBuffer.u64++ = (uint64_t)sect[ABS].sloc; + // @@copypasted from d_incbin, maybe factor this out somehow? + // Attempt to open the include file in the current directory, then (if that + // failed) try list of include files passed in the enviroment string or by + // the "-d" option. + int fd, i; + char buf1[256]; + + if ((fd = open(string[*tok], _OPEN_INC)) < 0) + { + for(i=0; nthpath("RMACPATH", i, buf1)!=0; i++) + { + fd = strlen(buf1); + + // Append path char if necessary + if ((fd > 0) && (buf1[fd - 1] != SLASHCHAR)) + strcat(buf1, SLASHSTRING); + + strcat(buf1, string[*tok]); + + if ((fd = open(buf1, _OPEN_INC)) >= 0) + goto allright; + } + + return error("cannot open: \"%s\"", string[tok[1]]); + } + +allright: + *evalTokenBuffer.u64++ = (uint64_t)lseek(fd, 0L, SEEK_END); + close(fd); + + // Advance tok because of consumed string token + tok++; break; case CR_TIME: *evalTokenBuffer.u32++ = CONST; @@ -371,7 +417,7 @@ int expr(TOKEN * otk, uint64_t * a_value, WORD * a_attr, SYM ** a_esym) { *evalTokenBuffer.u32++ = CONST; *evalTokenBuffer.u64++ = *a_value = (*tok - KW_R0); - *a_attr = ABS | DEFINED; + *a_attr = ABS | DEFINED | RISCREG; if (a_esym != NULL) *a_esym = NULL; @@ -476,19 +522,19 @@ be converted from a linked list into an array). symbolNum++; #endif - if (symbol->sattr & DEFINED) - *a_value = symbol->svalue; - else - *a_value = 0; + *a_value = (symbol->sattr & DEFINED ? symbol->svalue : 0); + *a_attr = (WORD)(symbol->sattr & ~GLOBAL); /* All that extra crap that was put into the svalue when doing the equr stuff is thrown away right here. What the hell is it for? */ if (symbol->sattre & EQUATEDREG) + { *a_value &= 0x1F; - - *a_attr = (WORD)(symbol->sattr & ~GLOBAL); + *a_attr |= RISCREG; // Mark it as a register, 'cause it is + *a_esym = symbol; + } if ((symbol->sattr & (GLOBAL | DEFINED)) == GLOBAL && a_esym != NULL)