]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Conf: Show the line:char position where the syntax error happens
authorJan Maria Matejka <mq@ucw.cz>
Tue, 11 Sep 2018 14:55:41 +0000 (16:55 +0200)
committerJan Maria Matejka <mq@ucw.cz>
Tue, 11 Sep 2018 14:58:09 +0000 (16:58 +0200)
conf/cf-lex.l
conf/conf.c
conf/conf.h
sysdep/unix/main.c

index 66be38113aaf4b0f45b481cf5280f27ea82a963f..6d534c191f8c2605d0c711d2a4d37383531fb834 100644 (file)
@@ -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>.
index 7f4eb7e8a3b13b7cb386195de4f35639d12f70e4..f64932f5bda4ef26b4678b7c877ae9d120eb9866 100644 (file)
@@ -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);
index bf74b76b1a4479a74afdc6675f43c097c2be47c4..6d8ed5ca1b77835b4de373d71fe41f23efcf6daf 100644 (file)
@@ -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);
index 8aa19fce419109db913cfe8d7d741294aade92b8..99cfab17e64fdff0c299d3c1fc9cccd1d96e5aff 100644 (file)
@@ -212,7 +212,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);
     }
@@ -229,7 +229,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);
@@ -250,7 +250,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);