]> de.git.xonotic.org Git - xonotic/gmqcc.git/blobdiff - ftepp.c
Makefile: split up 'make gource' into 'make gource' (render only) and 'make gource...
[xonotic/gmqcc.git] / ftepp.c
diff --git a/ftepp.c b/ftepp.c
index 88705512ac44c0985966afbc4a97c6f5a612a291..68491ed6dd2af72e1c8e69035b6e48bce5384a35 100644 (file)
--- a/ftepp.c
+++ b/ftepp.c
@@ -124,7 +124,6 @@ char *ftepp_predef_line(lex_file *context) {
 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);
-    memset (value, 0, length);
     sprintf(value, "\"%s\"", context->name);
 
     return value;
@@ -451,8 +450,12 @@ static bool ftepp_define_body(ftepp_t *ftepp, ppmacro *macro)
                 ftepp->token = old;
             }
         }
-        else
-        {
+        else if (macro->variadic && !strcmp(ftepp_tokval(ftepp), "__VA_COUNT__")) {
+            ftepp->token = TOKEN_VA_COUNT;
+            ptok         = pptoken_make(ftepp);
+            vec_push(macro->output, ptok);
+            ftepp_next(ftepp);
+        } else {
             ptok = pptoken_make(ftepp);
             vec_push(macro->output, ptok);
             ftepp_next(ftepp);
@@ -681,6 +684,7 @@ static void ftepp_param_out(ftepp_t *ftepp, macroparam *param)
 static bool ftepp_preprocess(ftepp_t *ftepp);
 static bool ftepp_macro_expand(ftepp_t *ftepp, ppmacro *macro, macroparam *params, bool resetline)
 {
+    char     *buffer       = NULL;
     char     *old_string   = ftepp->output_string;
     char     *inner_string;
     lex_file *old_lexer    = ftepp->lex;
@@ -736,6 +740,12 @@ static bool ftepp_macro_expand(ftepp_t *ftepp, ppmacro *macro, macroparam *param
                 ftepp_param_out(ftepp, &params[out->constval.i + vararg_start]);
                 break;
 
+            case TOKEN_VA_COUNT:
+                util_asprintf(&buffer, "%d", varargs);
+                ftepp_out(ftepp, buffer, false);
+                mem_d(buffer);
+                break;
+
             case TOKEN_IDENT:
             case TOKEN_TYPENAME:
             case TOKEN_KEYWORD:
@@ -1250,9 +1260,9 @@ static char *ftepp_include_find_path(const char *file, const char *pathfile)
     memcpy(vec_add(filename, len+1), file, len);
     vec_last(filename) = 0;
 
-    fp = file_open(filename, "rb");
+    fp = fs_file_open(filename, "rb");
     if (fp) {
-        file_close(fp);
+        fs_file_close(fp);
         return filename;
     }
     vec_free(filename);
@@ -1285,11 +1295,17 @@ static bool ftepp_directive_warning(ftepp_t *ftepp) {
             ftepp_next(ftepp);
         }
         vec_push(message, '\0');
-        store = ftepp_warn(ftepp, WARN_CPP, message);
+        if (ftepp->output_on)
+            store = ftepp_warn(ftepp, WARN_CPP, message);
+        else
+            store = false;
         vec_free(message);
         return store;
     }
 
+    if (!ftepp->output_on)
+        return false;
+
     unescape  (ftepp_tokval(ftepp), ftepp_tokval(ftepp));
     return ftepp_warn(ftepp, WARN_CPP, "#warning %s", ftepp_tokval(ftepp));
 }
@@ -1309,11 +1325,15 @@ static void ftepp_directive_error(ftepp_t *ftepp) {
             ftepp_next(ftepp);
         }
         vec_push(message, '\0');
-        ftepp_error(ftepp, message);
+        if (ftepp->output_on)
+            ftepp_error(ftepp, message);
         vec_free(message);
         return;
     }
 
+    if (!ftepp->output_on)
+        return;
+
     unescape  (ftepp_tokval(ftepp), ftepp_tokval(ftepp));
     ftepp_error(ftepp, "#error %s", ftepp_tokval(ftepp));
 }
@@ -1333,11 +1353,15 @@ static void ftepp_directive_message(ftepp_t *ftepp) {
             ftepp_next(ftepp);
         }
         vec_push(message, '\0');
-        con_cprintmsg(&ftepp->lex->tok.ctx, LVL_MSG, "message", message);
+        if (ftepp->output_on)
+            con_cprintmsg(&ftepp->lex->tok.ctx, LVL_MSG, "message", message);
         vec_free(message);
         return;
     }
 
+    if (!ftepp->output_on)
+        return;
+
     unescape     (ftepp_tokval(ftepp), ftepp_tokval(ftepp));
     con_cprintmsg(&ftepp->lex->tok.ctx, LVL_MSG, "message",  ftepp_tokval(ftepp));
 }
@@ -1365,6 +1389,11 @@ static bool ftepp_include(ftepp_t *ftepp)
         return false;
     }
 
+    if (!ftepp->output_on) {
+        ftepp_next(ftepp);
+        return true;
+    }
+
     ctx = ftepp_ctx(ftepp);
 
     unescape(ftepp_tokval(ftepp), ftepp_tokval(ftepp));