X-Git-Url: https://git.xonotic.org/?p=xonotic%2Fgmqcc.git;a=blobdiff_plain;f=lexer.c;h=e0dafc3a6184a094a776e40caed6cb36337007b7;hp=862131e1162ecb764acdd3ae7e72d569b65f0e95;hb=17318af62fa6ed5c5b48652150740c9ea241a536;hpb=b0a07695344c805381fdca64aac229ee98725130 diff --git a/lexer.c b/lexer.c index 862131e..e0dafc3 100644 --- a/lexer.c +++ b/lexer.c @@ -20,14 +20,11 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ -#include -#include #include -#include +#include #include "gmqcc.h" #include "lexer.h" - /* * List of Keywords */ @@ -78,8 +75,9 @@ static bool lexwarn(lex_file *lex, int warntype, const char *fmt, ...) lex_ctx ctx; va_list ap; - ctx.file = lex->name; - ctx.line = lex->sline; + ctx.file = lex->name; + ctx.line = lex->sline; + ctx.column = lex->column; va_start(ap, fmt); r = vcompile_warning(ctx, warntype, fmt, ap); @@ -174,7 +172,7 @@ static void lex_token_new(lex_file *lex) #else if (lex->tok.value) vec_shrinkto(lex->tok.value, 0); - + lex->tok.constval.t = 0; lex->tok.ctx.line = lex->sline; lex->tok.ctx.file = lex->name; @@ -300,7 +298,7 @@ static int lex_try_trigraph(lex_file *lex, int old) lex->line++; lex->column = 0; } - + if (c2 != '?') { lex_ungetch(lex, c2); return old; @@ -311,7 +309,7 @@ static int lex_try_trigraph(lex_file *lex, int old) lex->line++; lex->column = 0; } - + switch (c3) { case '=': return '#'; case '/': return '\\'; @@ -390,12 +388,12 @@ static void lex_ungetch(lex_file *lex, int ch) /* Idents are alphanumberic, but they start with alpha or _ */ static bool isident_start(int ch) { - return isalpha(ch) || ch == '_'; + return util_isalpha(ch) || ch == '_'; } static bool isident(int ch) { - return isident_start(ch) || isdigit(ch); + return isident_start(ch) || util_isdigit(ch); } /* isxdigit_only is used when we already know it's not a digit @@ -575,7 +573,7 @@ static int lex_skipwhite(lex_file *lex, bool hadwhite) do { ch = lex_getch(lex); - while (ch != EOF && isspace(ch)) { + while (ch != EOF && util_isspace(ch)) { if (ch == '\n') { if (lex_try_pragma(lex)) continue; @@ -673,7 +671,7 @@ static int lex_skipwhite(lex_file *lex, bool hadwhite) ch = '/'; break; } - } while (ch != EOF && isspace(ch)); + } while (ch != EOF && util_isspace(ch)); if (haswhite) { lex_endtoken(lex); @@ -709,7 +707,7 @@ static int lex_parse_frame(lex_file *lex) lex_token_new(lex); ch = lex_getch(lex); - while (ch != EOF && ch != '\n' && isspace(ch)) + while (ch != EOF && ch != '\n' && util_isspace(ch)) ch = lex_getch(lex); if (ch == '\n') @@ -931,7 +929,7 @@ static int GMQCC_WARN lex_finish_digit(lex_file *lex, int lastch) lex_tokench(lex, ch); ch = lex_getch(lex); - if (ch != '.' && !isdigit(ch)) + if (ch != '.' && !util_isdigit(ch)) { if (lastch != '0' || ch != 'x') { @@ -952,7 +950,7 @@ static int GMQCC_WARN lex_finish_digit(lex_file *lex, int lastch) { lex_tokench(lex, ch); ch = lex_getch(lex); - while (isdigit(ch) || (ishex && isxdigit_only(ch))) + while (util_isdigit(ch) || (ishex && isxdigit_only(ch))) { lex_tokench(lex, ch); ch = lex_getch(lex); @@ -967,7 +965,7 @@ static int GMQCC_WARN lex_finish_digit(lex_file *lex, int lastch) /* continue digits-only */ ch = lex_getch(lex); - while (isdigit(ch)) + while (util_isdigit(ch)) { lex_tokench(lex, ch); ch = lex_getch(lex); @@ -1070,10 +1068,10 @@ int lex_do(lex_file *lex) if (!strcmp(v, "framevalue")) { ch = lex_getch(lex); - while (ch != EOF && isspace(ch) && ch != '\n') + while (ch != EOF && util_isspace(ch) && ch != '\n') ch = lex_getch(lex); - if (!isdigit(ch)) { + if (!util_isdigit(ch)) { lexerror(lex, "$framevalue requires an integer parameter"); return lex_do(lex); } @@ -1231,7 +1229,7 @@ int lex_do(lex_file *lex) if (ch == '.') { nextch = lex_getch(lex); /* digits starting with a dot */ - if (isdigit(nextch)) { + if (util_isdigit(nextch)) { lex_ungetch(lex, nextch); lex->tok.ttype = lex_finish_digit(lex, ch); lex_endtoken(lex); @@ -1311,7 +1309,7 @@ int lex_do(lex_file *lex) ch == '>' || ch == '<' || /* <<, >>, <=, >= */ ch == '=' || ch == '!' || /* <=>, ==, != */ ch == '&' || ch == '|' || /* &&, ||, &=, |= */ - ch == '~' /* ~=, ~ */ + ch == '~' || ch == '^' /* ~=, ~, ^ */ ) { lex_tokench(lex, ch); @@ -1339,7 +1337,7 @@ int lex_do(lex_file *lex) } } else if (lex->flags.preprocessing && - ch == '-' && isdigit(nextch)) + ch == '-' && util_isdigit(nextch)) { lex->tok.ttype = lex_finish_digit(lex, nextch); if (lex->tok.ttype == TOKEN_INTCONST) @@ -1506,7 +1504,7 @@ int lex_do(lex_file *lex) return lex->tok.ttype; } - if (isdigit(ch)) + if (util_isdigit(ch)) { lex->tok.ttype = lex_finish_digit(lex, ch); lex_endtoken(lex);