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
*
do {
l = cfile -> line;
p = cfile -> lpos;
- u = cfile -> ugflag;
c = get_char (cfile);
if (!((c == '\n') && cfile->eol_token) &&
/*
* Put the last (non-whitespace) character back.
*/
- if (c != EOF) {
- cfile->bufix--;
- }
+ unget_char(cfile, c);
/*
* Return our token.
* 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:
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))
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;