Add specialized diagnostics for when predefined macros are used and ftepp predefined...
authorDale Weiler <killfieldengine@gmail.com>
Thu, 3 Jan 2013 12:04:32 +0000 (12:04 +0000)
committerDale Weiler <killfieldengine@gmail.com>
Thu, 3 Jan 2013 12:04:32 +0000 (12:04 +0000)
ftepp.c
gmqcc.h
lexer.h
parser.c

diff --git a/ftepp.c b/ftepp.c
index 436b05beab8ff4c351565881e441b6a1990a9e31..ea686612cfd08156d65fe7326a29a205516779e6 100644 (file)
--- a/ftepp.c
+++ b/ftepp.c
@@ -70,11 +70,6 @@ typedef struct {
     char        *includename;
 } ftepp_t;
 
-typedef struct {
-    const char  *name;
-    char      *(*func)(lex_file *);
-} predef_t;
-
 /*
  * Implement the predef subsystem now.  We can do this safely with the
  * help of lexer contexts.
@@ -168,7 +163,7 @@ char *ftepp_predef_randomlast(lex_file *context) {
     return value;
 }
 
-static const predef_t ftepp_predefs[] = {
+const ftepp_predef_t ftepp_predefs[FTEPP_PREDEF_COUNT] = {
     { "__LINE__",         &ftepp_predef_line        },
     { "__FILE__",         &ftepp_predef_file        },
     { "__COUNTER__",      &ftepp_predef_counter     },
diff --git a/gmqcc.h b/gmqcc.h
index 0bfe7ce23c0a902d4585c406bbe6506e204a0793..36a67fdf282bb6f78b7a9cb3bb437f51912ad427 100644 (file)
--- a/gmqcc.h
+++ b/gmqcc.h
@@ -963,6 +963,18 @@ void parser_cleanup       ();
 /*===================================================================*/
 /*====================== ftepp.c commandline ========================*/
 /*===================================================================*/
+struct lex_file_s;
+typedef struct {
+    const char  *name;
+    char      *(*func)(struct lex_file_s *);
+} ftepp_predef_t;
+
+/*
+ * line, file, counter, counter_last, random, random_last, date, time
+ * increment when items are added
+ */
+#define FTEPP_PREDEF_COUNT 8
+
 bool        ftepp_init             ();
 bool        ftepp_preprocess_file  (const char *filename);
 bool        ftepp_preprocess_string(const char *name, const char *str);
@@ -972,6 +984,8 @@ void        ftepp_flush            ();
 void        ftepp_add_define       (const char *source, const char *name);
 void        ftepp_add_macro        (const char *name,   const char *value);
 
+extern const ftepp_predef_t ftepp_predefs[FTEPP_PREDEF_COUNT];
+
 /*===================================================================*/
 /*======================= main.c commandline ========================*/
 /*===================================================================*/
diff --git a/lexer.h b/lexer.h
index 919dbec1d10078a7c2a449701e34251cc42ad5fe..5d7b7f611bd0ef8166ed8e70ad432c7173ea6e3b 100644 (file)
--- a/lexer.h
+++ b/lexer.h
@@ -99,7 +99,7 @@ typedef struct {
     int   value;
 } frame_macro;
 
-typedef struct {
+typedef struct lex_file_s {
     FILE   *file;
     const char *open_string;
     size_t      open_string_length;
index 14b4c810dab20c866ebbffbb025f89078d223feb..c0ca8b59f4ce6588c2600197a6511ecbc994ae2e 100644 (file)
--- a/parser.c
+++ b/parser.c
@@ -1604,6 +1604,21 @@ static ast_expression* parse_expression_leave(parser_t *parser, bool stopatcomma
                 }
                 else
                 {
+                    /*
+                     * sometimes people use preprocessing predefs without enabling them
+                     * i've done this thousands of times already myself.  Lets check for
+                     * it in the predef table.  And diagnose it better :)
+                     */
+                    if (!OPTS_FLAG(FTEPP_PREDEFS)) {
+                        size_t i;
+                        for (i = 0; i < sizeof(ftepp_predefs)/sizeof(*ftepp_predefs); i++) {
+                            if (!strcmp(ftepp_predefs[i].name, parser_tokval(parser))) {
+                                parseerror(parser, "unexpected ident: %s (use -fftepp-predef to enable pre-defined macros)", parser_tokval(parser));
+                                goto onerr;
+                            }
+                        }
+                    }
+
                     parseerror(parser, "unexpected ident: %s", parser_tokval(parser));
                     goto onerr;
                 }