void lexerror(lex_file *lex, const char *fmt, ...)
{
- va_list ap;
+ va_list ap;
- va_start(ap, fmt);
- if (lex)
+ va_start(ap, fmt);
+ if (lex)
con_vprintmsg(LVL_ERROR, lex->name, lex->sline, "parse error", fmt, ap);
else
con_vprintmsg(LVL_ERROR, "", 0, "parse error", fmt, ap);
- va_end(ap);
+ va_end(ap);
}
bool lexwarn(lex_file *lex, int warntype, const char *fmt, ...)
{
- va_list ap;
- int lvl = LVL_WARNING;
+ va_list ap;
+ int lvl = LVL_WARNING;
if (!OPTS_WARN(warntype))
return false;
if (opts_werror)
- lvl = LVL_ERROR;
+ lvl = LVL_ERROR;
- va_start(ap, fmt);
+ va_start(ap, fmt);
con_vprintmsg(lvl, lex->name, lex->sline, "warning", fmt, ap);
- va_end(ap);
+ va_end(ap);
- return opts_werror;
+ return opts_werror;
}
char *pragma = NULL;
char *command = NULL;
char *param = NULL;
+ size_t line;
if (lex->flags.preprocessing)
return false;
+ line = lex->line;
+
ch = lex_getch(lex);
if (ch != '#') {
lex_ungetch(lex, ch);
if (!strcmp(command, "push")) {
if (!strcmp(param, "line")) {
lex->push_line++;
- lex->line--;
+ --line;
}
else
goto unroll;
if (!strcmp(param, "line")) {
if (lex->push_line)
lex->push_line--;
- lex->line--;
+ --line;
}
else
goto unroll;
}
+ else if (!strcmp(command, "file")) {
+ lex->name = util_strdup(param);
+ vec_push(lex_filenames, lex->name);
+ }
+ else if (!strcmp(command, "line")) {
+ line = strtol(param, NULL, 0)-1;
+ }
else
goto unroll;
- while (ch != '\n')
+ lex->line = line;
+ while (ch != '\n' && ch != EOF)
ch = lex_getch(lex);
return true;
vec_free(pragma);
}
lex_ungetch(lex, '#');
+
+ lex->line = line;
return false;
}
ch = lex_getch(lex);
while (ch != EOF && isspace(ch)) {
if (ch == '\n') {
- if (lex_try_pragma(lex)) {
- ch = lex_getch(lex);
+ if (lex_try_pragma(lex))
continue;
- }
}
if (lex->flags.preprocessing) {
if (ch == '\n') {