diff --git a/common/conflex.c b/common/conflex.c index 7f27f111..84c65ecd 100644 --- a/common/conflex.c +++ b/common/conflex.c @@ -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)) diff --git a/includes/dhcpd.h b/includes/dhcpd.h index faedd05e..017026cd 100644 --- a/includes/dhcpd.h +++ b/includes/dhcpd.h @@ -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;