va_list args;
va_start(args, fmt);
+ u_fprintf(u_stderr, "error at %s:%d: ", v->path, v->line_num);
res = u_vfprintf(u_stderr, fmt, args);
va_end(args);
LRTS_UNUSED(err);
va_start(args, fmt);
+ u_fprintf(u_stderr, "warning at %s:%d: ", v->path, v->line_num);
res = u_vfprintf(u_stderr, fmt, args);
va_end(args);
return res;
|| c == '_' || l_lsl_isnum(c);
}
+lrts_bool l_lsl_isspace(char c) {
+ return c == ' ' || c == '\t'
+ || c == '\n' || c == '\r';
+}
+
+lrts_bool l_lsl_isterm(char c) {
+ return c == '\0' || l_lsl_isspace(c);
+}
+
/* peeks current token */
#define l_lsl_lex_peek(v, code) \
(code)[v->lex_pos]
u_memset(&t, 0, sizeof(t));
t.val = tokbuf;
+
c = l_lsl_lex_peek(v, code);
+ /* consume all spaces */
+ while (l_lsl_isspace(c)) {
+ if (c == '\n') {
+ v->line_num++;
+ }
+ c = l_lsl_lex_advance(v, code);
+ }
+
if (l_lsl_isnum(c)) {
t.type = L_LSL_TOK_INT;
if (c == '0') {
l_lsl_lex_term_token(t);
+ /* end of a token must be a term */
+ c = l_lsl_lex_peek(v, code);
+ if (!l_lsl_isterm(c)) {
+ l_lsl_err(v, L_LSL_ERR_LEX, "unexpected end of token\n", c);
+ t.type = L_LSL_TOK_NONE;
+ }
+
return t;
}
u32 prev_lex_pos = v->lex_pos;
const char *prev_file_name = v->path;
+ u32 prev_line_num = v->line_num;
v->lex_pos = 0;
v->path = path;
+ v->line_num = 1;
if (src == LRTS_NULL) {
u_log(U_LOG_CRIT, "%s: No such file or directory\n", path);
v->lex_pos = prev_lex_pos;
v->path = prev_file_name;
+ v->line_num = prev_line_num;
return val;
}