diff options
author | Jan Maria Matejka <mq@ucw.cz> | 2018-09-11 16:55:41 +0200 |
---|---|---|
committer | Jan Maria Matejka <mq@ucw.cz> | 2018-09-11 16:58:09 +0200 |
commit | afa14f1868f2c753efdc81ce8e2c2d44e6bdd80e (patch) | |
tree | 68c418466255db01d1513ad341ccccf384981196 /conf | |
parent | b1f6c439f55233338a5f7cca5070c70618fe7f1d (diff) |
Conf: Show the line:char position where the syntax error happens
Diffstat (limited to 'conf')
-rw-r--r-- | conf/cf-lex.l | 6 | ||||
-rw-r--r-- | conf/conf.c | 1 | ||||
-rw-r--r-- | conf/conf.h | 4 |
3 files changed, 8 insertions, 3 deletions
diff --git a/conf/cf-lex.l b/conf/cf-lex.l index 66be3811..6d534c19 100644 --- a/conf/cf-lex.l +++ b/conf/cf-lex.l @@ -100,6 +100,7 @@ static struct include_file_stack *ifs_head; #define YY_INPUT(buf,result,max) result = cf_read_hook(buf, max, ifs->fd); #define YY_NO_UNPUT #define YY_FATAL_ERROR(msg) cf_error(msg) +#define YY_USER_ACTION ifs->chno += yyleng; ifs->toklen = yyleng; static void cf_include(char *arg, int alen); static int check_eof(void); @@ -237,7 +238,7 @@ else: { {WHITE}+ -\n ifs->lino++; +\n ifs->lino++; ifs->chno = 0; # BEGIN(COMMENT); @@ -247,13 +248,14 @@ else: { <COMMENT>\n { ifs->lino++; + ifs->chno = 0; BEGIN(INITIAL); } <COMMENT>. <CCOMM>\*\/ BEGIN(INITIAL); -<CCOMM>\n ifs->lino++; +<CCOMM>\n ifs->lino++; ifs->chno = 0; <CCOMM>\/\* cf_error("Comment nesting not supported"); <CCOMM><<EOF>> cf_error("Unterminated comment"); <CCOMM>. diff --git a/conf/conf.c b/conf/conf.c index 7f4eb7e8..f64932f5 100644 --- a/conf/conf.c +++ b/conf/conf.c @@ -515,6 +515,7 @@ cf_error(char *msg, ...) va_end(args); new_config->err_msg = cfg_strdup(buf); new_config->err_lino = ifs->lino; + new_config->err_chno = ifs->chno - ifs->toklen + 1; new_config->err_file_name = ifs->file_name; cf_lex_unwind(); longjmp(conf_jmpbuf, 1); diff --git a/conf/conf.h b/conf/conf.h index bf74b76b..6d8ed5ca 100644 --- a/conf/conf.h +++ b/conf/conf.h @@ -48,6 +48,7 @@ struct config { u32 watchdog_timeout; /* Watchdog timeout (in seconds, 0 = disabled) */ char *err_msg; /* Parser error message */ int err_lino; /* Line containing error */ + int err_chno; /* Character where the parser stopped */ char *err_file_name; /* File name containing error */ char *file_name; /* Name of main configuration file */ int file_fd; /* File descriptor of main configuration file */ @@ -141,6 +142,8 @@ struct include_file_stack { char *file_name; /* File name */ int fd; /* File descriptor */ int lino; /* Current line num */ + int chno; /* Current char num (on current line) */ + int toklen; /* Current token length */ int depth; /* Include depth, 0 = cannot include */ struct include_file_stack *prev; /* Previous record in stack */ @@ -149,7 +152,6 @@ struct include_file_stack { extern struct include_file_stack *ifs; - int cf_lex(void); void cf_lex_init(int is_cli, struct config *c); void cf_lex_unwind(void); |