hush: strip NULs from file input, they are PITA/impossible to handle correctly

function                                             old     new   delta
file_peek                                             89      93      +4
file_get                                             260     264      +4
This commit is contained in:
Denis Vlasenko 2009-04-05 22:17:04 +00:00
parent 258275d85f
commit 913a201bf0

View File

@ -1225,6 +1225,7 @@ static int file_get(struct in_str *i)
ch = *i->p++;
if (i->eof_flag && !*i->p)
ch = EOF;
/* note: ch is never NUL */
} else {
/* need to double check i->file because we might be doing something
* more complicated by now, like sourcing or substituting. */
@ -1238,9 +1239,9 @@ static int file_get(struct in_str *i)
goto take_cached;
}
#endif
ch = fgetc(i->file);
do ch = fgetc(i->file); while (ch == '\0');
}
debug_printf("file_get: got a '%c' %d\n", ch, ch);
debug_printf("file_get: got '%c' %d\n", ch, ch);
#if ENABLE_HUSH_INTERACTIVE
if (ch == '\n')
i->promptme = 1;
@ -1248,8 +1249,8 @@ static int file_get(struct in_str *i)
return ch;
}
/* All the callers guarantee this routine will never be
* used right after a newline, so prompting is not needed.
/* All callers guarantee this routine will never
* be used right after a newline, so prompting is not needed.
*/
static int file_peek(struct in_str *i)
{
@ -1258,13 +1259,14 @@ static int file_peek(struct in_str *i)
if (i->eof_flag && !i->p[1])
return EOF;
return *i->p;
/* note: ch is never NUL */
}
ch = fgetc(i->file);
do ch = fgetc(i->file); while (ch == '\0');
i->eof_flag = (ch == EOF);
i->peek_buf[0] = ch;
i->peek_buf[1] = '\0';
i->p = i->peek_buf;
debug_printf("file_peek: got a '%c' %d\n", *i->p, *i->p);
debug_printf("file_peek: got '%c' %d\n", ch, ch);
return ch;
}