summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Maria Matejka <mq@ucw.cz>2018-09-11 16:55:41 +0200
committerJan Maria Matejka <mq@ucw.cz>2018-09-11 17:35:13 +0200
commitd50b0bc437f5ffd0d2c9f843217f8ed098c8d675 (patch)
treeececf183d0de0293c59b4db8b2cdaeb48a71085f
parent89b0af3978caf15e1478922a8d9d4f7e38145a61 (diff)
Conf: Show the line:char position where the syntax error happens
-rw-r--r--conf/cf-lex.l6
-rw-r--r--conf/conf.c1
-rw-r--r--conf/conf.h4
-rw-r--r--sysdep/unix/main.c6
4 files changed, 11 insertions, 6 deletions
diff --git a/conf/cf-lex.l b/conf/cf-lex.l
index c3154b36..9bbb3660 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);
@@ -313,7 +314,7 @@ else: {
{WHITE}+
-\n ifs->lino++;
+\n ifs->lino++; ifs->chno = 0;
# BEGIN(COMMENT);
@@ -323,13 +324,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 885e2e7e..8dbefe96 100644
--- a/conf/conf.c
+++ b/conf/conf.c
@@ -512,6 +512,7 @@ cf_error(const 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 f174d352..5689fb67 100644
--- a/conf/conf.h
+++ b/conf/conf.h
@@ -47,6 +47,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 */
@@ -139,6 +140,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 */
@@ -147,7 +150,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);
diff --git a/sysdep/unix/main.c b/sysdep/unix/main.c
index 0912a9c5..d2380501 100644
--- a/sysdep/unix/main.c
+++ b/sysdep/unix/main.c
@@ -213,7 +213,7 @@ read_config(void)
if (!unix_read_config(&conf, config_name))
{
if (conf->err_msg)
- die("%s, line %d: %s", conf->err_file_name, conf->err_lino, conf->err_msg);
+ die("%s:%d:%d %s", conf->err_file_name, conf->err_lino, conf->err_chno, conf->err_msg);
else
die("Unable to open configuration file %s: %m", config_name);
}
@@ -230,7 +230,7 @@ async_config(void)
if (!unix_read_config(&conf, config_name))
{
if (conf->err_msg)
- log(L_ERR "%s, line %d: %s", conf->err_file_name, conf->err_lino, conf->err_msg);
+ log(L_ERR "%s:%d:%d %s", conf->err_file_name, conf->err_lino, conf->err_chno, conf->err_msg);
else
log(L_ERR "Unable to open configuration file %s: %m", config_name);
config_free(conf);
@@ -251,7 +251,7 @@ cmd_read_config(char *name)
if (!unix_read_config(&conf, name))
{
if (conf->err_msg)
- cli_msg(8002, "%s, line %d: %s", conf->err_file_name, conf->err_lino, conf->err_msg);
+ cli_msg(8002, "%s:%d:%d %s", conf->err_file_name, conf->err_lino, conf->err_chno, conf->err_msg);
else
cli_msg(8002, "%s: %m", name);
config_free(conf);