ref: 1537ee3c105f0ba568d4a3b40adf4021da40b7c9
parent: fe8c715e58c377228207548a27aed474839feca5
author: Roberto E. Vargas Caballero <k0ga@shike2.com>
date: Sun Oct 4 17:07:40 EDT 2015
Move keyword initialization to more specific places It is better if each module initializes the own keywords, instead of having a function that initializes the keywords for all the modules.
--- a/cc1/cc1.h
+++ b/cc1/cc1.h
@@ -46,6 +46,10 @@
} min;
};
+struct keyword {
+ char *str;
+ unsigned char token, value;
+};
struct type {
unsigned char op; /* type builder operator */
@@ -345,9 +349,9 @@
extern Symbol *install(int ns, Symbol *sym);
extern Symbol *newsym(int ns);
extern void pushctx(void), popctx(void);
-extern void ikeywords(void);
extern void killsym(Symbol *sym);
extern Symbol *newlabel(void);
+extern void keywords(struct keyword *key, int ns);
/* stmt.c */
extern void compound(Symbol *lbreak, Symbol *lcont, Caselist *lswitch);
--- a/cc1/cpp.c
+++ b/cc1/cpp.c
@@ -37,12 +37,27 @@
static char sdate[17], stime[14];
struct tm *tm;
time_t t;
- char **bp, *list[] = {
+ static char **bp, *list[] = {
"__STDC__",
"__STDC_HOSTED__",
"__SCC__",
NULL
};
+ static struct keyword keys[] = {
+ {"define", DEFINE, DEFINE},
+ {"include", INCLUDE, INCLUDE},
+ {"line", LINE, LINE},
+ {"ifdef", IFDEF, IFDEF},
+ {"if", IF, IF},
+ {"elif", ELIF, ELIF},
+ {"else", ELSE, ELSE},
+ {"ifndef", IFNDEF, IFNDEF},
+ {"endif", ENDIF, ENDIF},
+ {"undef", UNDEF, UNDEF},
+ {"pragma", PRAGMA, PRAGMA},
+ {"error", ERROR, ERROR},
+ {NULL, 0, 0}
+ };
t = time(NULL);
tm = localtime(&t);
@@ -57,6 +72,7 @@
for (bp = list; *bp; ++bp)
defmacro(*bp)->u.s = "-1#1";
+ keywords(keys, NS_CPPCLAUSES);
}
static void
--- a/cc1/lex.c
+++ b/cc1/lex.c
@@ -39,6 +39,44 @@
void
ilex(char *fname)
{
+ static struct keyword keys[] = {
+ {"auto", SCLASS, AUTO},
+ {"break", BREAK, BREAK},
+ {"_Bool", TYPE, BOOL},
+ {"case", CASE, CASE},
+ {"char", TYPE, CHAR},
+ {"const", TQUALIFIER, CONST},
+ {"continue", CONTINUE, CONTINUE},
+ {"default", DEFAULT, DEFAULT},
+ {"do", DO, DO},
+ {"double", TYPE, DOUBLE},
+ {"else", ELSE, ELSE},
+ {"enum", TYPE, ENUM},
+ {"extern", SCLASS, EXTERN},
+ {"float", TYPE, FLOAT},
+ {"for", FOR, FOR},
+ {"goto", GOTO, GOTO},
+ {"if", IF, IF},
+ {"inline", TQUALIFIER, INLINE},
+ {"int", TYPE, INT},
+ {"long", TYPE, LONG},
+ {"register", SCLASS, REGISTER},
+ {"restrict", TQUALIFIER, RESTRICT},
+ {"return", RETURN, RETURN},
+ {"short", TYPE, SHORT},
+ {"signed", TYPE, SIGNED},
+ {"sizeof", SIZEOF, SIZEOF},
+ {"static", SCLASS, STATIC},
+ {"struct", TYPE, STRUCT},
+ {"switch", SWITCH, SWITCH},
+ {"typedef", SCLASS, TYPEDEF},
+ {"union", TYPE, UNION},
+ {"unsigned", TYPE, UNSIGNED},
+ {"void", TYPE, VOID},
+ {"volatile", TQUALIFIER, VOLATILE},
+ {"while", WHILE, WHILE},
+ {NULL, 0, 0},
+ };
FILE *fp;
if (!fname) {
@@ -52,6 +90,7 @@
}
allocinput(fname, fp);
*input->begin = '\0';
+ keywords(keys, NS_KEYWORD);
}
bool
--- a/cc1/main.c
+++ b/cc1/main.c
@@ -75,7 +75,6 @@
usage();
icpp();
- ikeywords();
ilex(*argv);
if (onlycpp) {
--- a/cc1/symbol.c
+++ b/cc1/symbol.c
@@ -282,11 +282,6 @@
return linkhash(sym);
}
-struct keyword {
- char *str;
- unsigned char token, value;
-};
-
void
keywords(struct keyword *key, int ns)
{
@@ -304,63 +299,4 @@
*/
counterid = 0;
head = NULL;
-}
-
-void
-ikeywords(void)
-{
- static struct keyword ckeywords[] = {
- {"auto", SCLASS, AUTO},
- {"break", BREAK, BREAK},
- {"_Bool", TYPE, BOOL},
- {"case", CASE, CASE},
- {"char", TYPE, CHAR},
- {"const", TQUALIFIER, CONST},
- {"continue", CONTINUE, CONTINUE},
- {"default", DEFAULT, DEFAULT},
- {"do", DO, DO},
- {"double", TYPE, DOUBLE},
- {"else", ELSE, ELSE},
- {"enum", TYPE, ENUM},
- {"extern", SCLASS, EXTERN},
- {"float", TYPE, FLOAT},
- {"for", FOR, FOR},
- {"goto", GOTO, GOTO},
- {"if", IF, IF},
- {"inline", TQUALIFIER, INLINE},
- {"int", TYPE, INT},
- {"long", TYPE, LONG},
- {"register", SCLASS, REGISTER},
- {"restrict", TQUALIFIER, RESTRICT},
- {"return", RETURN, RETURN},
- {"short", TYPE, SHORT},
- {"signed", TYPE, SIGNED},
- {"sizeof", SIZEOF, SIZEOF},
- {"static", SCLASS, STATIC},
- {"struct", TYPE, STRUCT},
- {"switch", SWITCH, SWITCH},
- {"typedef", SCLASS, TYPEDEF},
- {"union", TYPE, UNION},
- {"unsigned", TYPE, UNSIGNED},
- {"void", TYPE, VOID},
- {"volatile", TQUALIFIER, VOLATILE},
- {"while", WHILE, WHILE},
- {NULL, 0, 0},
- }, cppclauses[] = {
- {"define", DEFINE, DEFINE},
- {"include", INCLUDE, INCLUDE},
- {"line", LINE, LINE},
- {"ifdef", IFDEF, IFDEF},
- {"if", IF, IF},
- {"elif", ELIF, ELIF},
- {"else", ELSE, ELSE},
- {"ifndef", IFNDEF, IFNDEF},
- {"endif", ENDIF, ENDIF},
- {"undef", UNDEF, UNDEF},
- {"pragma", PRAGMA, PRAGMA},
- {"error", ERROR, ERROR},
- {NULL, 0, 0}
- };
- keywords(ckeywords, NS_KEYWORD);
- keywords(cppclauses, NS_CPPCLAUSES);
}