From c38505ee4b2a0de59926107e52fb8bb84041a0e4 Mon Sep 17 00:00:00 2001 From: ggn Date: Fri, 3 Jan 2020 08:46:19 +0200 Subject: [PATCH] Actually implement ^^FILESIZE this time :) --- debug.c | 2 ++ docs/rmac.rst | 2 +- expr.c | 40 +++++++++++++++++++++++++++++++++++++++- token.c | 7 +++++++ token.h | 3 ++- 5 files changed, 51 insertions(+), 3 deletions(-) diff --git a/debug.c b/debug.c index e7867c2..4f64eb4 100644 --- a/debug.c +++ b/debug.c @@ -383,6 +383,8 @@ void DumpTokens(TOKEN * tokenBuffer) printf("[ENDEXPR]"); else if (*t == CR_ABSCOUNT) printf("[CR_ABSCOUNT]"); + else if (*t == CR_FILESIZE) + printf("[CR_FILESIZE]"); else if (*t == CR_DEFINED) printf("[CR_DEFINED]"); else if (*t == CR_REFERENCED) diff --git a/docs/rmac.rst b/docs/rmac.rst index 12781f0..aeb1df4 100644 --- a/docs/rmac.rst +++ b/docs/rmac.rst @@ -4,7 +4,7 @@ RMAC ===================== Reference Manual ================ -version 2.0.0 +version 2.0.4 ============= © and notes diff --git a/expr.c b/expr.c index 270c072..3a23e6e 100644 --- a/expr.c +++ b/expr.c @@ -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 @@ -166,6 +166,44 @@ int expr1(void) *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(); diff --git a/token.c b/token.c index c867853..55dbc29 100644 --- a/token.c +++ b/token.c @@ -604,6 +604,9 @@ DEBUG { printf("ExM: SYMBOL=\"%s\"", d); } case CR_ABSCOUNT: d = "^^abscount"; break; + case CR_FILESIZE: + d = "^^filesize"; + break; case CR_DATE: d = "^^date"; break; @@ -1731,6 +1734,8 @@ void DumpToken(TOKEN t) printf("[ENDEXPR]"); else if (t == CR_ABSCOUNT) printf("[CR_ABSCOUNT]"); + else if (t == CR_FILESIZE) + printf("[CR_FILESIZE]"); else if (t == CR_DEFINED) printf("[CR_DEFINED]"); else if (t == CR_REFERENCED) @@ -1835,6 +1840,8 @@ void DumpTokenBuffer(void) printf("[ENDEXPR]"); else if (*t == CR_ABSCOUNT) printf("[CR_ABSCOUNT]"); + else if (*t == CR_FILESIZE) + printf("[CR_FILESIZE]"); else if (*t == CR_DEFINED) printf("[CR_DEFINED]"); else if (*t == CR_REFERENCED) diff --git a/token.h b/token.h index 4931bb0..18ca423 100644 --- a/token.h +++ b/token.h @@ -74,7 +74,8 @@ #define CR_TIME 'x' // ^^time - DOS format time #define CR_DATE 'y' // ^^date - DOS format date #define CR_ABSCOUNT 'z' // ^^abscount - count the number of bytes - // defined in curent .abs section + // defined in current .abs section +#define CR_FILESIZE 'F' // ^^filesize - return the size in bytes of a file // Character Attributes #define ILLEG 0 // Illegal character (unused) -- 2.37.2