X-Git-Url: https://git.xonotic.org/?p=xonotic%2Fgmqcc.git;a=blobdiff_plain;f=lexer.c;h=a00814dc093e8fef32e3df97f4e01db419fe7822;hp=e0dafc3a6184a094a776e40caed6cb36337007b7;hb=cddf70f46bc9c46b6adda39a83e9564bf0cf34d3;hpb=4a3794ea2bd99a4e653b25685fc45352d177ab9d diff --git a/lexer.c b/lexer.c index e0dafc3..a00814d 100644 --- a/lexer.c +++ b/lexer.c @@ -63,7 +63,7 @@ static void lexerror(lex_file *lex, const char *fmt, ...) va_start(ap, fmt); if (lex) - con_vprintmsg(LVL_ERROR, lex->name, lex->sline, lex->column, "parse error", fmt, ap); + con_vprintmsg(LVL_ERROR, lex->ctx.file, lex->sline, lex->ctx.column, "parse error", fmt, ap); else con_vprintmsg(LVL_ERROR, "", 0, 0, "parse error", fmt, ap); va_end(ap); @@ -72,15 +72,10 @@ static void lexerror(lex_file *lex, const char *fmt, ...) static bool lexwarn(lex_file *lex, int warntype, const char *fmt, ...) { bool r; - lex_ctx ctx; va_list ap; - ctx.file = lex->name; - ctx.line = lex->sline; - ctx.column = lex->column; - va_start(ap, fmt); - r = vcompile_warning(ctx, warntype, fmt, ap); + r = vcompile_warning(lex->ctx, warntype, fmt, ap); va_end(ap); return r; } @@ -174,9 +169,7 @@ static void lex_token_new(lex_file *lex) vec_shrinkto(lex->tok.value, 0); lex->tok.constval.t = 0; - lex->tok.ctx.line = lex->sline; - lex->tok.ctx.file = lex->name; - lex->tok.ctx.column = lex->column; + lex->tok.ctx = &lex->ctx; /* this is 'shallow' */ #endif } #endif @@ -200,14 +193,14 @@ lex_file* lex_open(const char *file) memset(lex, 0, sizeof(*lex)); - lex->file = in; - lex->name = util_strdup(file); - lex->line = 1; /* we start counting at 1 */ - lex->column = 0; - lex->peekpos = 0; - lex->eof = false; + lex->file = in; + lex->ctx.file = util_strdup(file); + lex->ctx.line = 1; /* we start counting at 1 */ + lex->ctx.column = 0; + lex->peekpos = 0; + lex->eof = false; - vec_push(lex_filenames, lex->name); + vec_push(lex_filenames, (char *)lex->ctx.file); return lex; } @@ -228,13 +221,13 @@ lex_file* lex_open_string(const char *str, size_t len, const char *name) lex->open_string_length = len; lex->open_string_pos = 0; - lex->name = util_strdup(name ? name : ""); - lex->line = 1; /* we start counting at 1 */ - lex->peekpos = 0; - lex->eof = false; - lex->column = 0; + lex->ctx.file = util_strdup(name ? name : ""); + lex->ctx.line = 1; /* we start counting at 1 */ + lex->ctx.column = 0; + lex->peekpos = 0; + lex->eof = false; - vec_push(lex_filenames, lex->name); + vec_push(lex_filenames, (char*)lex->ctx.file); return lex; } @@ -272,13 +265,13 @@ void lex_close(lex_file *lex) static int lex_fgetc(lex_file *lex) { if (lex->file) { - lex->column++; + lex->ctx.column++; return fs_file_getc(lex->file); } if (lex->open_string) { if (lex->open_string_pos >= lex->open_string_length) return EOF; - lex->column++; + lex->ctx.column++; return lex->open_string[lex->open_string_pos++]; } return EOF; @@ -295,8 +288,8 @@ static int lex_try_trigraph(lex_file *lex, int old) int c2, c3; c2 = lex_fgetc(lex); if (!lex->push_line && c2 == '\n') { - lex->line++; - lex->column = 0; + lex->ctx.line++; + lex->ctx.column = 0; } if (c2 != '?') { @@ -306,8 +299,8 @@ static int lex_try_trigraph(lex_file *lex, int old) c3 = lex_fgetc(lex); if (!lex->push_line && c3 == '\n') { - lex->line++; - lex->column = 0; + lex->ctx.line++; + lex->ctx.column = 0; } switch (c3) { @@ -335,7 +328,7 @@ static int lex_try_digraph(lex_file *lex, int ch) * need to offset a \n the ungetch would recognize */ if (!lex->push_line && c2 == '\n') - lex->line++; + lex->ctx.line++; if (ch == '<' && c2 == ':') return '['; else if (ch == ':' && c2 == '>') @@ -357,13 +350,13 @@ static int lex_getch(lex_file *lex) if (lex->peekpos) { lex->peekpos--; if (!lex->push_line && lex->peek[lex->peekpos] == '\n') - lex->line++; + lex->ctx.line++; return lex->peek[lex->peekpos]; } ch = lex_fgetc(lex); if (!lex->push_line && ch == '\n') - lex->line++; + lex->ctx.line++; else if (ch == '?') return lex_try_trigraph(lex, ch); else if (!lex->flags.nodigraphs && (ch == '<' || ch == ':' || ch == '%')) @@ -374,10 +367,10 @@ static int lex_getch(lex_file *lex) static void lex_ungetch(lex_file *lex, int ch) { lex->peek[lex->peekpos++] = ch; - lex->column--; + lex->ctx.column--; if (!lex->push_line && ch == '\n') { - lex->line--; - lex->column = 0; + lex->ctx.line--; + lex->ctx.column = 0; } } @@ -428,7 +421,7 @@ static bool lex_try_pragma(lex_file *lex) if (lex->flags.preprocessing) return false; - line = lex->line; + line = lex->ctx.line; ch = lex_getch(lex); if (ch != '#') { @@ -483,8 +476,8 @@ static bool lex_try_pragma(lex_file *lex) goto unroll; } else if (!strcmp(command, "file")) { - lex->name = util_strdup(param); - vec_push(lex_filenames, lex->name); + lex->ctx.file = util_strdup(param); + vec_push(lex_filenames, (char*)lex->ctx.file); } else if (!strcmp(command, "line")) { line = strtol(param, NULL, 0)-1; @@ -492,7 +485,7 @@ static bool lex_try_pragma(lex_file *lex) else goto unroll; - lex->line = line; + lex->ctx.line = line; while (ch != '\n' && ch != EOF) ch = lex_getch(lex); vec_free(command); @@ -529,7 +522,7 @@ unroll: } lex_ungetch(lex, '#'); - lex->line = line; + lex->ctx.line = line; return false; } @@ -884,7 +877,7 @@ static int GMQCC_WARN lex_finish_string(lex_file *lex, int quote) ch = 0; else { --u8len; - lex->column += u8len; + lex->ctx.column += u8len; for (uc = 0; uc < u8len; ++uc) lex_tokench(lex, u8buf[uc]); /* the last character will be inserted with the tokench() call @@ -1024,9 +1017,9 @@ int lex_do(lex_file *lex) return (lex->tok.ttype = ch); } - lex->sline = lex->line; - lex->tok.ctx.line = lex->sline; - lex->tok.ctx.file = lex->name; + lex->sline = lex->ctx.line; + lex->tok.ctx->line = lex->sline; + lex->tok.ctx->file = lex->ctx.file; if (lex->eof) return (lex->tok.ttype = TOKEN_FATAL);