]> 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 1cb8d0c9cff314953b3978530ee35f5ebbdc578c..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",
+       "void",
+       "string",
+       "float",
+       "vector",
+       "entity",
 };
 
-struct lex_file *lex_open(const char *name) {
+struct lex_file *lex_open(FILE *fp) {
        struct lex_file *lex = mem_a(sizeof(struct lex_file));
        if (lex) {
-               lex->file = fopen(name, "r");
+               lex->file = fp;
                fseek(lex->file, 0, SEEK_END);
                lex->length = ftell(lex->file);
                lex->size   = lex->length; /* copy, this is never changed */
@@ -152,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 ' ';
@@ -235,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);
                }
@@ -267,7 +281,7 @@ int lex_token(struct lex_file *file) {
        /* valid identifier */
        if (ch > 0 && (ch == '_' || isalpha(ch))) {
                lex_clear(file);
-               while (ch > 0 && (isalpha(ch) || isdigit(ch) || ch == '_')) {
+               while (ch > 0 && (isalpha(ch) || ch == '_')) {
                        lex_addch(ch, file);
                        ch = lex_getsource(file);
                }
@@ -279,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;
@@ -340,6 +360,7 @@ int lex_debug(struct lex_file *file) {
        while ((token = lex_token(file)) != ERROR_LEX && file->length >= 0)
                if (token == LEX_IDENT)
                        printf("%s ", file->lastok);
+       fputc('\n', stdout);
        lex_reset(file);
        return 1;
 }