]> git.xonotic.org Git - xonotic/gmqcc.git/blobdiff - ftepp.c
Make preprocessor predefs use their own context opposed to the lexer context.
[xonotic/gmqcc.git] / ftepp.c
diff --git a/ftepp.c b/ftepp.c
index b07fa974364555145fc3020a5b844be7688c20bb..a34b58c0e152d6077e669ac12d1215cfbf643389 100644 (file)
--- a/ftepp.c
+++ b/ftepp.c
  */
 #include <string.h>
 #include <stdlib.h>
+#include <sys/stat.h>
 
 #include "gmqcc.h"
 #include "lexer.h"
-#include "platform.h"
 
 #define HT_MACROS 1024
+
 typedef struct {
     bool on;
     bool was_on;
@@ -73,17 +74,13 @@ typedef struct ftepp_s {
     char        *itemname;
     char        *includename;
     bool         in_macro;
-} ftepp_t;
 
-/*
- * Implement the predef subsystem now.  We can do this safely with the
- * help of lexer contexts.
- */
-static uint32_t ftepp_predef_countval = 0;
-static uint32_t ftepp_predef_randval  = 0;
+    uint32_t predef_countval;
+    uint32_t predef_randval;
+} ftepp_t;
 
 /* __DATE__ */
-static char *ftepp_predef_date(lex_file *context) {
+static char *ftepp_predef_date(ftepp_t *context) {
     const struct tm *itime = NULL;
     char            *value = (char*)mem_a(82);
     time_t           rtime;
@@ -91,14 +88,14 @@ static char *ftepp_predef_date(lex_file *context) {
     (void)context;
 
     time (&rtime);
-    itime = platform_localtime(&rtime);
+    itime = util_localtime(&rtime);
     strftime(value, 82, "\"%b %d %Y\"", itime);
 
     return value;
 }
 
 /* __TIME__ */
-static char *ftepp_predef_time(lex_file *context) {
+static char *ftepp_predef_time(ftepp_t *context) {
     const struct tm *itime = NULL;
     char            *value = (char*)mem_a(82);
     time_t           rtime;
@@ -106,71 +103,68 @@ static char *ftepp_predef_time(lex_file *context) {
     (void)context;
 
     time (&rtime);
-    itime = platform_localtime(&rtime);
+    itime = util_localtime(&rtime);
     strftime(value, 82, "\"%X\"", itime);
 
     return value;
 }
 
 /* __LINE__ */
-static char *ftepp_predef_line(lex_file *context) {
-    char   *value;
-    util_asprintf(&value, "%d", (int)context->line);
+static char *ftepp_predef_line(ftepp_t *context) {
+    char *value;
+
+    util_asprintf(&value, "%d", (int)context->lex->line);
     return value;
 }
 /* __FILE__ */
-static char *ftepp_predef_file(lex_file *context) {
-    size_t  length = strlen(context->name) + 3; /* two quotes and a terminator */
-    char   *value  = (char*)mem_a(length);
-    platform_snprintf(value, length, "\"%s\"", context->name);
+static char *ftepp_predef_file(ftepp_t *context) {
+    size_t length = strlen(context->lex->name) + 3; /* two quotes and a terminator */
+    char  *value  = (char*)mem_a(length);
 
+    util_snprintf(value, length, "\"%s\"", context->lex->name);
     return value;
 }
 /* __COUNTER_LAST__ */
-static char *ftepp_predef_counterlast(lex_file *context) {
-    char   *value;
-    util_asprintf(&value, "%u", ftepp_predef_countval);
-
-    (void)context;
+static char *ftepp_predef_counterlast(ftepp_t *context) {
+    char *value;
+    util_asprintf(&value, "%u", context->predef_countval);
     return value;
 }
 /* __COUNTER__ */
-static char *ftepp_predef_counter(lex_file *context) {
-    char   *value;
-    ftepp_predef_countval ++;
-    util_asprintf(&value, "%u", ftepp_predef_countval);
-    (void)context;
+static char *ftepp_predef_counter(ftepp_t *context) {
+    char *value;
+
+    context->predef_countval ++;
+    util_asprintf(&value, "%u", context->predef_countval);
 
     return value;
 }
 /* __RANDOM__ */
-static char *ftepp_predef_random(lex_file *context) {
-    char  *value;
-    ftepp_predef_randval = (util_rand() % 0xFF) + 1;
-    util_asprintf(&value, "%u", ftepp_predef_randval);
+static char *ftepp_predef_random(ftepp_t *context) {
+    char *value;
 
-    (void)context;
+    context->predef_randval = (util_rand() % 0xFF) + 1;
+    util_asprintf(&value, "%u", context->predef_randval);
     return value;
 }
 /* __RANDOM_LAST__ */
-static char *ftepp_predef_randomlast(lex_file *context) {
-    char   *value;
-    util_asprintf(&value, "%u", ftepp_predef_randval);
+static char *ftepp_predef_randomlast(ftepp_t *context) {
+    char *value;
 
-    (void)context;
+    util_asprintf(&value, "%u", context->predef_randval);
     return value;
 }
 /* __TIMESTAMP__ */
-static char *ftepp_predef_timestamp(lex_file *context) {
+static char *ftepp_predef_timestamp(ftepp_t *context) {
     struct stat finfo;
     const char *find;
     char       *value;
     size_t      size;
 
-    if (stat(context->name, &finfo))
+    if (stat(context->lex->name, &finfo))
         return util_strdup("\"<failed to determine timestamp>\"");
 
-    find = platform_ctime(&finfo.st_mtime);
+    find = util_ctime(&finfo.st_mtime);
     value = (char*)mem_a(strlen(find) + 1);
     memcpy(&value[1], find, (size = strlen(find)) - 1);
 
@@ -182,7 +176,7 @@ static char *ftepp_predef_timestamp(lex_file *context) {
 
 typedef struct {
     const char   *name;
-    char       *(*func)(lex_file *);
+    char       *(*func)(ftepp_t *);
 } ftepp_predef_t;
 
 static const ftepp_predef_t ftepp_predefs[] = {
@@ -212,7 +206,7 @@ bool ftepp_predef_exists(const char *name) {
 }
 
 /* singleton because we're allowed */
-static GMQCC_INLINE char *(*ftepp_predef(const char *name))(lex_file *context) {
+static GMQCC_INLINE char *(*ftepp_predef(const char *name))(ftepp_t *context) {
     size_t i = ftepp_predef_index(name);
     return (i != 0) ? ftepp_predefs[i-1].func : NULL;
 }
@@ -304,8 +298,10 @@ static ftepp_t* ftepp_new(void)
     ftepp = (ftepp_t*)mem_a(sizeof(*ftepp));
     memset(ftepp, 0, sizeof(*ftepp));
 
-    ftepp->macros    = util_htnew(HT_MACROS);
-    ftepp->output_on = true;
+    ftepp->macros          = util_htnew(HT_MACROS);
+    ftepp->output_on       = true;
+    ftepp->predef_countval = 0;
+    ftepp->predef_randval  = 0;
 
     return ftepp;
 }
@@ -863,7 +859,7 @@ static bool ftepp_macro_expand(ftepp_t *ftepp, ppmacro *macro, macroparam *param
 
     if (resetline && !ftepp->in_macro) {
         char lineno[128];
-        platform_snprintf(lineno, 128, "\n#pragma line(%lu)\n", (unsigned long)(old_lexer->sline));
+        util_snprintf(lineno, 128, "\n#pragma line(%lu)\n", (unsigned long)(old_lexer->sline));
         ftepp_out(ftepp, lineno, false);
     }
 
@@ -1273,7 +1269,7 @@ static void unescape(const char *str, char *out) {
 
 static char *ftepp_include_find_path(const char *file, const char *pathfile)
 {
-    FILE       *fp;
+    fs_file_t  *fp;
     char       *filename = NULL;
     const char *last_slash;
     size_t      len;
@@ -1463,7 +1459,7 @@ static bool ftepp_include(ftepp_t *ftepp)
 
     ftepp_out(ftepp, "\n#pragma file(", false);
     ftepp_out(ftepp, ctx.file, false);
-    platform_snprintf(lineno, sizeof(lineno), ")\n#pragma line(%lu)\n", (unsigned long)(ctx.line+1));
+    util_snprintf(lineno, sizeof(lineno), ")\n#pragma line(%lu)\n", (unsigned long)(ctx.line+1));
     ftepp_out(ftepp, lineno, false);
 
     /* skip the line */
@@ -1685,9 +1681,9 @@ static bool ftepp_preprocess(ftepp_t *ftepp)
             case TOKEN_TYPENAME:
                 /* is it a predef? */
                 if (OPTS_FLAG(FTEPP_PREDEFS)) {
-                    char *(*predef)(lex_file*) = ftepp_predef(ftepp_tokval(ftepp));
+                    char *(*predef)(ftepp_t*) = ftepp_predef(ftepp_tokval(ftepp));
                     if (predef) {
-                        expand = predef(ftepp->lex);
+                        expand = predef(ftepp);
                         ftepp_out (ftepp, expand, false);
                         ftepp_next(ftepp);
 
@@ -1842,12 +1838,12 @@ ftepp_t *ftepp_create()
         minor[2] = '"';
     } else if (OPTS_OPTION_U32(OPTION_STANDARD) == COMPILER_GMQCC) {
         ftepp_add_define(ftepp, NULL, "__STD_GMQCC__");
-        platform_snprintf(major, 32, "\"%d\"", GMQCC_VERSION_MAJOR);
-        platform_snprintf(minor, 32, "\"%d\"", GMQCC_VERSION_MINOR);
+        util_snprintf(major, 32, "\"%d\"", GMQCC_VERSION_MAJOR);
+        util_snprintf(minor, 32, "\"%d\"", GMQCC_VERSION_MINOR);
     } else if (OPTS_OPTION_U32(OPTION_STANDARD) == COMPILER_QCCX) {
         ftepp_add_define(ftepp, NULL, "__STD_QCCX__");
-        platform_snprintf(major, 32, "\"%d\"", GMQCC_VERSION_MAJOR);
-        platform_snprintf(minor, 32, "\"%d\"", GMQCC_VERSION_MINOR);
+        util_snprintf(major, 32, "\"%d\"", GMQCC_VERSION_MAJOR);
+        util_snprintf(minor, 32, "\"%d\"", GMQCC_VERSION_MINOR);
     } else if (OPTS_OPTION_U32(OPTION_STANDARD) == COMPILER_QCC) {
         ftepp_add_define(ftepp, NULL, "__STD_QCC__");
         /* 1.0 */