]> git.xonotic.org Git - xonotic/gmqcc.git/blobdiff - lex.c
Cleaups and README
[xonotic/gmqcc.git] / lex.c
diff --git a/lex.c b/lex.c
index 5333171ef2e28a63d57cf6bc1ccdd8720bda1d9c..9296158fd196cd5390e47fb60d7e1d096a936e7f 100644 (file)
--- a/lex.c
+++ b/lex.c
 #include <string.h>
 #include "gmqcc.h"
 
+/*
+ * Keywords are multichar, punctuation lexing is a bit more complicated
+ * than keyword lexing.
+ */
 static const char *const lex_keywords[] = {
        "do",    "else",     "if",     "while",
        "break", "continue", "return", "goto",
-       "for",
+       "for",   "typedef",
        
        /* types */
        "int",
-       "bool",
        "void",
        "string",
        "float",
@@ -161,8 +164,10 @@ static int lex_get(struct lex_file *file) {
        while (isspace(ch) && ch != '\n')
                ch = lex_getch(file);
                
-       if (ch == '\n')
+       if (ch == '\n') {
+               file->line ++;
                return ch;
+       }
                
        lex_unget(ch, file);
        return ' ';
@@ -244,7 +249,7 @@ static int lex_skipcmt(struct lex_file *file) {
                lex_addch(ch, file);
                while ((ch = lex_getch(file)) != '*') {
                        if (ch == EOF)
-                               return error(ERROR_LEX, "malformatted comment", " ");
+                               return error(ERROR_LEX, "malformatted comment at line %d", file->line);
                        else
                                lex_addch(ch, file);
                }
@@ -288,6 +293,12 @@ int lex_token(struct lex_file *file) {
                        if (!strncmp(file->lastok, lex_keywords[it], sizeof(lex_keywords[it])))
                                return it;
                                
+               /* try the hashtable for typedefs? */
+               if (typedef_find(file->lastok))
+                       for (it = 0; it < sizeof(lex_keywords)/sizeof(*lex_keywords); it++)
+                               if (!strncmp(typedef_find(file->lastok)->name, lex_keywords[it], sizeof(lex_keywords[it])))
+                                       return it;
+                               
                return LEX_IDENT;
        }
        return ch;