* Free the current file, and retrieve the contents
* of the previous packet if any.
*/
-LEX *
-lex_close_file(LEX *lf)
+LEX *lex_close_file(LEX *lf)
{
LEX *of;
* the next field.
*
*/
-LEX *
-lex_open_file(LEX *lf, char *filename, LEX_ERROR_HANDLER *scan_error)
+LEX *lex_open_file(LEX *lf, char *filename, LEX_ERROR_HANDLER *scan_error)
{
LEX *nf;
* L_EOF if end of file
* L_EOL if end of line
*/
-int
-lex_get_char(LEX *lf)
+int lex_get_char(LEX *lf)
{
- if (lf->ch == L_EOF)
+ if (lf->ch == L_EOF) {
Emsg0(M_ABORT, 0, "get_char: called after EOF\n");
+ }
if (lf->ch == L_EOL) {
if (fgets(lf->line, MAXSTRING, lf->fd) == NULL) {
lf->ch = L_EOF;
return lf->ch;
}
-void
-lex_unget_char(LEX *lf)
+void lex_unget_char(LEX *lf)
{
lf->col_no--;
if (lf->ch == L_EOL)
}
#ifdef DEBUG
-static char *
-lex_state_to_str(int state)
+static char *lex_state_to_str(int state)
{
switch (state) {
case lex_none: return "none";
* Convert a lex token to a string
* used for debug/error printing.
*/
-char *
-lex_tok_to_str(int token)
+char *lex_tok_to_str(int token)
{
switch(token) {
case L_EOF: return "L_EOF";
if (ch == L_EOL) {
lf->state = lex_none;
token = T_EOL;
+ } else if (ch == L_EOF) {
+ token = T_ERROR;
}
break;
case lex_number:
Dmsg2(290, "Lex state lex_number ch=%x %c\n", ch, ch);
+ if (ch == L_EOF) {
+ token = T_ERROR;
+ break;
+ }
/* Might want to allow trailing specifications here */
if (B_ISDIGIT(ch)) {
add_str(lf, ch);
lex_unget_char(lf);
break;
case lex_ip_addr:
+ if (ch == L_EOF) {
+ token = T_ERROR;
+ break;
+ }
Dmsg1(290, "Lex state lex_ip_addr ch=%x\n", ch);
break;
case lex_string:
Dmsg1(290, "Lex state lex_string ch=%x\n", ch);
+ if (ch == L_EOF) {
+ token = T_ERROR;
+ break;
+ }
if (ch == '\n' || ch == L_EOL || ch == '=' || ch == '}' || ch == '{' ||
ch == ';' || ch == ',' || ch == '#' || (B_ISSPACE(ch)) ) {
lex_unget_char(lf);
break;
case lex_quoted_string:
Dmsg2(290, "Lex state lex_quoted_string ch=%x %c\n", ch, ch);
+ if (ch == L_EOF) {
+ token = T_ERROR;
+ break;
+ }
if (ch == L_EOL) {
esc_next = FALSE;
break;
add_str(lf, ch);
break;
case lex_include: /* scanning a filename */
+ if (ch == L_EOF) {
+ token = T_ERROR;
+ break;
+ }
if (B_ISSPACE(ch) || ch == '\n' || ch == L_EOL || ch == '}' || ch == '{' ||
ch == ';' || ch == ',' || ch == '"' || ch == '#') {
lf->state = lex_none;
case T_STRING:
if (token != T_IDENTIFIER && token != T_UNQUOTED_STRING && token != T_QUOTED_STRING) {
- scan_err2(lf, "expected a name, got %s: %s",
+ scan_err2(lf, "expected a string, got %s: %s",
lex_tok_to_str(token), lf->str);
token = T_ERROR;
} else {