X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=rmac;a=blobdiff_plain;f=expr.c;h=3a23e6e3cf68d4949ef1372ca98da1defecac7f6;hp=270c072c621c2618728a736d8fe3b7bd54798bff;hb=c38505ee4b2a0de59926107e52fb8bb84041a0e4;hpb=4205233c8397c581b4d27ab36ab81ec896ef3dd0 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();