Commit d19e816e authored by Shane Kerr's avatar Shane Kerr
Browse files

Fix ugly output on config errors.

See RT ticket #17011 for more.
parent f800f4f6
......@@ -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))
......
......@@ -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;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment