X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=lexer.c;h=7642d261b89b4b3b9eae3e8fa6c4c1ec0751b96e;hb=48211572e529c37fb2be9ac05c7e810e690757f3;hp=541104127393fb9ba393f64f9f49edd62214d97d;hpb=d6ca5673dc7f2760faca1200477808d919a290ca;p=xonotic%2Fgmqcc.git diff --git a/lexer.c b/lexer.c index 5411041..7642d26 100644 --- a/lexer.c +++ b/lexer.c @@ -37,8 +37,6 @@ static const char *keywords_qc[] = { "return", "const" }; -static size_t num_keywords_qc = sizeof(keywords_qc) / sizeof(keywords_qc[0]); - /* For fte/gmgqcc */ static const char *keywords_fg[] = { "switch", "case", "default", @@ -49,12 +47,10 @@ static const char *keywords_fg[] = { "__builtin_debug_printtype" }; -static size_t num_keywords_fg = sizeof(keywords_fg) / sizeof(keywords_fg[0]); /* * Lexer code */ - static char* *lex_filenames; static void lexerror(lex_file *lex, const char *fmt, ...) @@ -356,14 +352,18 @@ static int lex_getch(lex_file *lex) if (lex->peekpos) { lex->peekpos--; - if (!lex->push_line && lex->peek[lex->peekpos] == '\n') + if (!lex->push_line && lex->peek[lex->peekpos] == '\n') { lex->line++; + lex->column = 0; + } return lex->peek[lex->peekpos]; } ch = lex_fgetc(lex); - if (!lex->push_line && ch == '\n') + if (!lex->push_line && ch == '\n') { lex->line++; + lex->column = 0; + } else if (ch == '?') return lex_try_trigraph(lex, ch); else if (!lex->flags.nodigraphs && (ch == '<' || ch == ':' || ch == '%')) @@ -1306,7 +1306,7 @@ int lex_do(lex_file *lex) } if (ch == '+' || ch == '-' || /* ++, --, +=, -= and -> as well! */ - ch == '>' || ch == '<' || /* <<, >>, <=, >= */ + ch == '>' || ch == '<' || /* <<, >>, <=, >= and >< as well! */ ch == '=' || ch == '!' || /* <=>, ==, != */ ch == '&' || ch == '|' || /* &&, ||, &=, |= */ ch == '~' || ch == '^' /* ~=, ~, ^ */ @@ -1314,7 +1314,9 @@ int lex_do(lex_file *lex) lex_tokench(lex, ch); nextch = lex_getch(lex); - if ((nextch == '=' && ch != '<') || (nextch == ch && ch != '!')) { + if ((nextch == '=' && ch != '<') || + (nextch == ch && ch != '!') || + (nextch == '<' && ch == '>')) { lex_tokench(lex, nextch); } else if (ch == '<' && nextch == '=') { lex_tokench(lex, nextch); @@ -1416,12 +1418,12 @@ int lex_do(lex_file *lex) lex->tok.constval.t = TYPE_VECTOR; } else { size_t kw; - for (kw = 0; kw < num_keywords_qc; ++kw) { + for (kw = 0; kw < GMQCC_ARRAY_COUNT(keywords_qc); ++kw) { if (!strcmp(v, keywords_qc[kw])) return (lex->tok.ttype = TOKEN_KEYWORD); } if (OPTS_OPTION_U32(OPTION_STANDARD) != COMPILER_QCC) { - for (kw = 0; kw < num_keywords_fg; ++kw) { + for (kw = 0; kw < GMQCC_ARRAY_COUNT(keywords_fg); ++kw) { if (!strcmp(v, keywords_fg[kw])) return (lex->tok.ttype = TOKEN_KEYWORD); } @@ -1517,6 +1519,6 @@ int lex_do(lex_file *lex) return (lex->tok.ttype = ch); } - lexerror(lex, "unknown token: `%s`", lex->tok.value); + lexerror(lex, "unknown token: `%c`", ch); return (lex->tok.ttype = TOKEN_ERROR); }