Actually implement ^^FILESIZE this time :)
authorggn <ggn.dbug@gmail.com>
Fri, 3 Jan 2020 06:46:19 +0000 (08:46 +0200)
committerShamus Hammons <jlhamm@acm.org>
Fri, 3 Jan 2020 15:56:36 +0000 (09:56 -0600)
debug.c
docs/rmac.rst
expr.c
token.c
token.h

diff --git a/debug.c b/debug.c
index e7867c24a3d5ce38056c3ec71e6430ab2716db83..4f64eb40bd9d01c69059b59f6dabf45204d529ce 100644 (file)
--- 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)
index 12781f0c9247d683d47ec78e4b624d47d0f5198c..aeb1df423a68bf69439fe0811e3e4a75893a7564 100644 (file)
@@ -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 270c072c621c2618728a736d8fe3b7bd54798bff..3a23e6e3cf68d4949ef1372ca98da1defecac7f6 100644 (file)
--- 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 c8678532a271a00e4b84d20d16f1edd812146646..55dbc290980722d06ed144755e43bb85587965a5 100644 (file)
--- 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 4931bb0a1a26d82b9b916aa9e91bced6715213b9..18ca4239666e672f2f1f4deaa5865dc0b90dabcb 100644 (file)
--- 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)