//
// RMAC - Reboot's Macro Assembler for all Atari computers
// EXPR.C - Expression Analyzer
-// Copyright (C) 199x Landon Dyer, 2011-2019 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
//
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
*evalTokenBuffer.u64++ = sloc;
}
break;
+ case CR_FILESIZE:
+ if (*tok++ != STRING)
+ return error("^^FILESIZE expects filename inside string");
+ *evalTokenBuffer.u32++ = CONST;
+ // @@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;
*evalTokenBuffer.u64++ = dos_time();
{
*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;
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)