X-Git-Url: https://git.xonotic.org/?p=xonotic%2Fgmqcc.git;a=blobdiff_plain;f=lexer.c;h=7722f4f5795f02ee6c355aa6ea1b172c89948440;hp=42b21a1a6cd7de46bd45aa21b227cc412a4fbdec;hb=69b55ccc03b56af1f6c05eb45866ab198307487f;hpb=7b96b0bd6dd162078b23fa59e03f707737ce5b9b diff --git a/lexer.c b/lexer.c index 42b21a1..7722f4f 100644 --- a/lexer.c +++ b/lexer.c @@ -58,7 +58,7 @@ static size_t num_keywords_fg = sizeof(keywords_fg) / sizeof(keywords_fg[0]); * Lexer code */ -char* *lex_filenames; +static char* *lex_filenames; void lexerror(lex_file *lex, const char *fmt, ...) { @@ -184,7 +184,7 @@ static void lex_token_new(lex_file *lex) lex_file* lex_open(const char *file) { lex_file *lex; - FILE *in = file_open(file, "rb"); + FILE *in = fs_file_open(file, "rb"); if (!in) { lexerror(NULL, "open failed: '%s'\n", file); @@ -193,7 +193,7 @@ lex_file* lex_open(const char *file) lex = (lex_file*)mem_a(sizeof(*lex)); if (!lex) { - file_close(in); + fs_file_close(in); lexerror(NULL, "out of memory\n"); return NULL; } @@ -258,7 +258,7 @@ void lex_close(lex_file *lex) vec_free(lex->modelname); if (lex->file) - file_close(lex->file); + fs_file_close(lex->file); #if 0 if (lex->tok) token_delete(lex->tok); @@ -272,7 +272,7 @@ void lex_close(lex_file *lex) static int lex_fgetc(lex_file *lex) { if (lex->file) - return fgetc(lex->file); + return fs_file_getc(lex->file); if (lex->open_string) { if (lex->open_string_pos >= lex->open_string_length) return EOF; @@ -483,6 +483,9 @@ static bool lex_try_pragma(lex_file *lex) lex->line = line; while (ch != '\n' && ch != EOF) ch = lex_getch(lex); + vec_free(command); + vec_free(param); + vec_free(pragma); return true; unroll: @@ -495,13 +498,13 @@ unroll: vec_free(command); lex_ungetch(lex, ' '); } - if (command) { - vec_pop(command); - while (vec_size(command)) { - lex_ungetch(lex, (unsigned char)vec_last(command)); - vec_pop(command); + if (param) { + vec_pop(param); + while (vec_size(param)) { + lex_ungetch(lex, (unsigned char)vec_last(param)); + vec_pop(param); } - vec_free(command); + vec_free(param); lex_ungetch(lex, ' '); } if (pragma) { @@ -992,6 +995,8 @@ int lex_do(lex_file *lex) if (!lex->flags.mergelines || ch != '\\') break; ch = lex_getch(lex); + if (ch == '\r') + ch = lex_getch(lex); if (ch != '\n') { lex_ungetch(lex, ch); ch = '\\'; @@ -1289,15 +1294,22 @@ int lex_do(lex_file *lex) if (ch == '+' || ch == '-' || /* ++, --, +=, -= and -> as well! */ ch == '>' || ch == '<' || /* <<, >>, <=, >= */ - ch == '=' || ch == '!' || /* ==, != */ + ch == '=' || ch == '!' || /* <=>, ==, != */ ch == '&' || ch == '|' || /* &&, ||, &=, |= */ ch == '~' /* ~=, ~ */ ) { lex_tokench(lex, ch); nextch = lex_getch(lex); - if (nextch == '=' || (nextch == ch && ch != '!')) { + if ((nextch == '=' && ch != '<') || (nextch == ch && ch != '!')) { + lex_tokench(lex, nextch); + } else if (ch == '<' && nextch == '=') { lex_tokench(lex, nextch); + if ((thirdch = lex_getch(lex)) == '>') + lex_tokench(lex, thirdch); + else + lex_ungetch(lex, thirdch); + } else if (ch == '-' && nextch == '>') { lex_tokench(lex, nextch); } else if (ch == '&' && nextch == '~') { @@ -1321,8 +1333,9 @@ int lex_do(lex_file *lex) lex->tok.constval.f = -lex->tok.constval.f; lex_endtoken(lex); return lex->tok.ttype; - } else + } else { lex_ungetch(lex, nextch); + } lex_endtoken(lex); return (lex->tok.ttype = TOKEN_OPERATOR); @@ -1342,7 +1355,7 @@ int lex_do(lex_file *lex) lex_tokench(lex, ch); nextch = lex_getch(lex); - if (nextch == '=') { + if (nextch == '=' || nextch == '*') { lex_tokench(lex, nextch); } else lex_ungetch(lex, nextch); @@ -1351,6 +1364,12 @@ int lex_do(lex_file *lex) return (lex->tok.ttype = TOKEN_OPERATOR); } + if (ch == '%') { + lex_tokench(lex, ch); + lex_endtoken(lex); + return (lex->tok.ttype = TOKEN_OPERATOR); + } + if (isident_start(ch)) { const char *v;