]> git.xonotic.org Git - xonotic/gmqcc.git/blobdiff - ftepp.c
Only when peephole optimization is on
[xonotic/gmqcc.git] / ftepp.c
diff --git a/ftepp.c b/ftepp.c
index 613b5c7d422f39ce9dbe031628903e4a02933263..050d6d81b92f8f9f2f3a1b8371bd1da77b7d6d84 100644 (file)
--- a/ftepp.c
+++ b/ftepp.c
@@ -183,6 +183,9 @@ static char *ftepp_predef_timestamp(lex_file *context) {
     char       *find;
     char       *value;
     size_t      size;
+#ifdef _MSC_VER
+    char        buffer[64];
+#endif
     if (stat(context->name, &finfo))
         return util_strdup("\"<failed to determine timestamp>\"");
 
@@ -190,7 +193,14 @@ static char *ftepp_predef_timestamp(lex_file *context) {
      * ctime and its fucking annoying newline char, no worries, we're
      * professionals here.
      */
+
+#ifndef _MSC_VER
     find  = ctime(&finfo.st_mtime);
+#else
+    ctime_s(buffer, sizeof(buffer), &finfo.st_mtime);
+    find = buffer;
+#endif
+
     value = (char*)mem_a(strlen(find) + 1);
     memcpy(&value[1], find, (size = strlen(find)) - 1);
 
@@ -217,23 +227,24 @@ static const ftepp_predef_t ftepp_predefs[] = {
     { "__TIME_STAMP__",   &ftepp_predef_timestamp   }
 };
 
-static GMQCC_INLINE int ftepp_predef_index(const char *name) {
+static GMQCC_INLINE size_t ftepp_predef_index(const char *name) {
     /* no hashtable here, we simply check for one to exist the naive way */
-    int i;
-    for(i = 0; i < (int)(sizeof(ftepp_predefs)/sizeof(*ftepp_predefs)); i++)
-        if (!strcmp(ftepp_predefs[i].name, name))
+    size_t i;
+    for(i = 1; i < GMQCC_ARRAY_COUNT(ftepp_predefs) + 1; i++)
+        if (!strcmp(ftepp_predefs[i-1].name, name))
             return i;
-    return -1;
+    return 0;
 }
 
+bool ftepp_predef_exists(const char *name);
 bool ftepp_predef_exists(const char *name) {
-    return ftepp_predef_index(name) != -1;
+    return ftepp_predef_index(name) != 0;
 }
 
 /* singleton because we're allowed */
 static GMQCC_INLINE char *(*ftepp_predef(const char *name))(lex_file *context) {
-    int i = ftepp_predef_index(name);
-    return (i != -1) ? ftepp_predefs[i].func : NULL;
+    size_t i = ftepp_predef_index(name);
+    return (i != 0) ? ftepp_predefs[i-1].func : NULL;
 }
 
 #define ftepp_tokval(f) ((f)->lex->tok.value)
@@ -1512,6 +1523,11 @@ static bool ftepp_else_allowed(ftepp_t *ftepp)
     return true;
 }
 
+static GMQCC_INLINE void ftepp_inmacro(ftepp_t *ftepp, const char *hash) {
+    if (ftepp->in_macro)
+        (void)!ftepp_warn(ftepp, WARN_DIRECTIVE_INMACRO, "`#%s` directive in macro", hash);
+}
+
 static bool ftepp_hash(ftepp_t *ftepp)
 {
     ppcondition cond;
@@ -1527,12 +1543,15 @@ static bool ftepp_hash(ftepp_t *ftepp)
         case TOKEN_IDENT:
         case TOKEN_TYPENAME:
             if (!strcmp(ftepp_tokval(ftepp), "define")) {
+                ftepp_inmacro(ftepp, "define");
                 return ftepp_define(ftepp);
             }
             else if (!strcmp(ftepp_tokval(ftepp), "undef")) {
+                ftepp_inmacro(ftepp, "undef");
                 return ftepp_undef(ftepp);
             }
             else if (!strcmp(ftepp_tokval(ftepp), "ifdef")) {
+                ftepp_inmacro(ftepp, "ifdef");
                 if (!ftepp_ifdef(ftepp, &cond))
                     return false;
                 cond.was_on = cond.on;
@@ -1541,6 +1560,7 @@ static bool ftepp_hash(ftepp_t *ftepp)
                 break;
             }
             else if (!strcmp(ftepp_tokval(ftepp), "ifndef")) {
+                ftepp_inmacro(ftepp, "ifndef");
                 if (!ftepp_ifdef(ftepp, &cond))
                     return false;
                 cond.on = !cond.on;
@@ -1550,6 +1570,7 @@ static bool ftepp_hash(ftepp_t *ftepp)
                 break;
             }
             else if (!strcmp(ftepp_tokval(ftepp), "elifdef")) {
+                ftepp_inmacro(ftepp, "elifdef");
                 if (!ftepp_else_allowed(ftepp))
                     return false;
                 if (!ftepp_ifdef(ftepp, &cond))
@@ -1561,6 +1582,7 @@ static bool ftepp_hash(ftepp_t *ftepp)
                 break;
             }
             else if (!strcmp(ftepp_tokval(ftepp), "elifndef")) {
+                ftepp_inmacro(ftepp, "elifndef");
                 if (!ftepp_else_allowed(ftepp))
                     return false;
                 if (!ftepp_ifdef(ftepp, &cond))
@@ -1573,6 +1595,7 @@ static bool ftepp_hash(ftepp_t *ftepp)
                 break;
             }
             else if (!strcmp(ftepp_tokval(ftepp), "elif")) {
+                ftepp_inmacro(ftepp, "elif");
                 if (!ftepp_else_allowed(ftepp))
                     return false;
                 if (!ftepp_if(ftepp, &cond))
@@ -1584,6 +1607,7 @@ static bool ftepp_hash(ftepp_t *ftepp)
                 break;
             }
             else if (!strcmp(ftepp_tokval(ftepp), "if")) {
+                ftepp_inmacro(ftepp, "if");
                 if (!ftepp_if(ftepp, &cond))
                     return false;
                 cond.was_on = cond.on;
@@ -1592,6 +1616,7 @@ static bool ftepp_hash(ftepp_t *ftepp)
                 break;
             }
             else if (!strcmp(ftepp_tokval(ftepp), "else")) {
+                ftepp_inmacro(ftepp, "else");
                 if (!ftepp_else_allowed(ftepp))
                     return false;
                 pc = &vec_last(ftepp->conditions);
@@ -1602,6 +1627,7 @@ static bool ftepp_hash(ftepp_t *ftepp)
                 break;
             }
             else if (!strcmp(ftepp_tokval(ftepp), "endif")) {
+                ftepp_inmacro(ftepp, "endif");
                 if (!vec_size(ftepp->conditions)) {
                     ftepp_error(ftepp, "#endif without #if");
                     return false;
@@ -1612,6 +1638,7 @@ static bool ftepp_hash(ftepp_t *ftepp)
                 break;
             }
             else if (!strcmp(ftepp_tokval(ftepp), "include")) {
+                ftepp_inmacro(ftepp, "include");
                 return ftepp_include(ftepp);
             }
             else if (!strcmp(ftepp_tokval(ftepp), "pragma")) {