]> git.ipfire.org Git - thirdparty/dhcp.git/commitdiff
Fix ugly output on config errors.
authorShane Kerr <shane@isc.org>
Wed, 29 Aug 2007 15:56:56 +0000 (15:56 +0000)
committerShane Kerr <shane@isc.org>
Wed, 29 Aug 2007 15:56:56 +0000 (15:56 +0000)
See RT ticket #17011 for more.

common/conflex.c
includes/dhcpd.h

index 7f27f11171d95b94b28398b9e52a9c2e3de7345d..84c65ecd96274280afa44ff18f7574b4d247ff53 100644 (file)
@@ -200,6 +200,19 @@ static int get_char (cfile)
        return c;               
 }
 
+/*
+ * Return a character to our input buffer.
+ */
+static int 
+unget_char(struct parse *cfile, int c) {
+       if (c != EOF) {
+               cfile->bufix--;
+               cfile->ugflag = 1;      /* do not put characters into
+                                          our error buffer on the next
+                                          call to get_char() */
+       }
+}
+
 /*
  * GENERAL NOTE ABOUT TOKENS
  *
@@ -231,7 +244,6 @@ get_raw_token(struct parse *cfile) {
        do {
                l = cfile -> line;
                p = cfile -> lpos;
-               u = cfile -> ugflag;
 
                c = get_char (cfile);
                if (!((c == '\n') && cfile->eol_token) && 
@@ -451,9 +463,7 @@ read_whitespace(int c, struct parse *cfile) {
        /*
         * Put the last (non-whitespace) character back.
         */
-       if (c != EOF) {
-               cfile->bufix--;
-       }
+       unget_char(cfile, c);
 
        /*
         * Return our token.
@@ -617,10 +627,7 @@ static enum dhcp_token read_number (c, cfile)
                         * token.  If not EOF, rewind the file one byte so
                         * the next token is read from there.
                         */
-                       if(c != EOF) {
-                               cfile->bufix--;
-                               cfile->ugflag = 1;
-                       }
+                       unget_char(cfile, c);
                        goto end_read;
 
                    default:
@@ -655,10 +662,7 @@ static enum dhcp_token read_num_or_name (c, cfile)
                c = get_char (cfile);
                if (!isascii (c) ||
                    (c != '-' && c != '_' && !isalnum (c))) {
-                       if (c != EOF) {
-                               cfile -> bufix--;
-                               cfile -> ugflag = 1;
-                       }
+                       unget_char(cfile, c);
                        break;
                }
                if (!isxdigit (c))
index faedd05e7f2fa8b4b2061fbd797d15d387a3a7e6..017026cd2c1a72d18d199dbcb2ab0a87db0d2ede 100644 (file)
@@ -254,6 +254,23 @@ struct parse {
        const char *tlname;
        int eol_token;
 
+       /*
+        * In order to give nice output when we have a parsing error 
+        * in our file, we keep track of where we are in the line so
+        * that we can show the user.
+        *
+        * We need to keep track of two lines, because we can look 
+        * ahead, via the "peek" function, to the next line sometimes.
+        *
+        * The "line1" and "line2" variables act as buffers for this 
+        * information. The "lpos" variable tells us where we are in the
+        * line.
+        *
+        * When we "put back" a character from the parsing context, we
+        * do not want to have the character appear twice in the error
+        * output. So, we set a flag, the "ugflag", which the
+        * get_char() function uses to check for this condition.
+        */
        char line1 [81];
        char line2 [81];
        int lpos;