bc: remove BC_STATUS_EOF (again), the condition is detectable as len==0
function old new delta bc_read_line 147 129 -18 bc_vm_run 618 591 -27 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 0/2 up/down: 0/-45) Total: -45 bytes text data bss dec hex filename 980802 485 7296 988583 f15a7 busybox_old 980757 485 7296 988538 f157a busybox_unstripped Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
d8078a79be
commit
8a89247e0a
@ -187,7 +187,6 @@ typedef enum BcStatus {
|
|||||||
BC_STATUS_SUCCESS = 0,
|
BC_STATUS_SUCCESS = 0,
|
||||||
BC_STATUS_FAILURE = 1,
|
BC_STATUS_FAILURE = 1,
|
||||||
BC_STATUS_PARSE_EMPTY_EXP = 2, // bc_parse_expr_empty_ok() uses this
|
BC_STATUS_PARSE_EMPTY_EXP = 2, // bc_parse_expr_empty_ok() uses this
|
||||||
BC_STATUS_EOF = 3, // bc_vm_stdin() uses this
|
|
||||||
} BcStatus;
|
} BcStatus;
|
||||||
|
|
||||||
#define BC_VEC_INVALID_IDX ((size_t) -1)
|
#define BC_VEC_INVALID_IDX ((size_t) -1)
|
||||||
@ -1364,15 +1363,10 @@ static int push_input_byte(BcVec *vec, char c)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is not a "z" function:
|
static void bc_read_line(BcVec *vec)
|
||||||
// can return success (0) or BC_STATUS_EOF.
|
|
||||||
// Exits with error message if read error is detected.
|
|
||||||
static BcStatus bc_read_line(BcVec *vec)
|
|
||||||
{
|
{
|
||||||
BcStatus s;
|
|
||||||
bool bad_chars;
|
bool bad_chars;
|
||||||
|
|
||||||
s = BC_STATUS_SUCCESS;
|
|
||||||
do {
|
do {
|
||||||
int c;
|
int c;
|
||||||
|
|
||||||
@ -1397,7 +1391,6 @@ static BcStatus bc_read_line(BcVec *vec)
|
|||||||
if (n <= 0) { // read errors or EOF, or ^D, or ^C
|
if (n <= 0) { // read errors or EOF, or ^D, or ^C
|
||||||
if (n == 0) // ^C
|
if (n == 0) // ^C
|
||||||
goto intr;
|
goto intr;
|
||||||
s = BC_STATUS_EOF;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
i = 0;
|
i = 0;
|
||||||
@ -1425,9 +1418,6 @@ static BcStatus bc_read_line(BcVec *vec)
|
|||||||
if (c == EOF) {
|
if (c == EOF) {
|
||||||
if (ferror(stdin))
|
if (ferror(stdin))
|
||||||
quit(); // this emits error message
|
quit(); // this emits error message
|
||||||
// If we had some input before EOF, do not report EOF yet:
|
|
||||||
if (vec->len == 0)
|
|
||||||
s = BC_STATUS_EOF;
|
|
||||||
// Note: EOF does not append '\n', therefore:
|
// Note: EOF does not append '\n', therefore:
|
||||||
// printf 'print 123\n' | bc - works
|
// printf 'print 123\n' | bc - works
|
||||||
// printf 'print 123' | bc - fails (syntax error)
|
// printf 'print 123' | bc - fails (syntax error)
|
||||||
@ -1439,8 +1429,6 @@ static BcStatus bc_read_line(BcVec *vec)
|
|||||||
} while (bad_chars);
|
} while (bad_chars);
|
||||||
|
|
||||||
bc_vec_pushZeroByte(vec);
|
bc_vec_pushZeroByte(vec);
|
||||||
|
|
||||||
return s;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static char* bc_read_file(const char *path)
|
static char* bc_read_file(const char *path)
|
||||||
@ -5416,8 +5404,7 @@ static BC_STATUS zbc_program_read(void)
|
|||||||
G.prog.file = NULL;
|
G.prog.file = NULL;
|
||||||
G.in_read = 1;
|
G.in_read = 1;
|
||||||
|
|
||||||
s = bc_read_line(&buf);
|
bc_read_line(&buf);
|
||||||
//if (s) goto io_err; - wrong, nonzero return means EOF, not error
|
|
||||||
|
|
||||||
common_parse_init(&parse, BC_PROG_READ);
|
common_parse_init(&parse, BC_PROG_READ);
|
||||||
bc_lex_file(&parse.l);
|
bc_lex_file(&parse.l);
|
||||||
@ -7091,13 +7078,18 @@ static BcStatus bc_vm_stdin(void)
|
|||||||
// with a backslash to the parser. The reason for that is because the parser
|
// with a backslash to the parser. The reason for that is because the parser
|
||||||
// treats a backslash+newline combo as whitespace, per the bc spec. In that
|
// treats a backslash+newline combo as whitespace, per the bc spec. In that
|
||||||
// case, and for strings and comments, the parser will expect more stuff.
|
// case, and for strings and comments, the parser will expect more stuff.
|
||||||
|
s = BC_STATUS_SUCCESS;
|
||||||
comment = false;
|
comment = false;
|
||||||
str = 0;
|
str = 0;
|
||||||
while ((s = bc_read_line(&buf)) == BC_STATUS_SUCCESS) {
|
for (;;) {
|
||||||
size_t len;
|
size_t len;
|
||||||
char *string = buf.v;
|
char *string;
|
||||||
|
|
||||||
|
bc_read_line(&buf);
|
||||||
len = buf.len - 1;
|
len = buf.len - 1;
|
||||||
|
if (len == 0) // "" buf means EOF
|
||||||
|
break;
|
||||||
|
string = buf.v;
|
||||||
if (len == 1) {
|
if (len == 1) {
|
||||||
if (str && buf.v[0] == G.send)
|
if (str && buf.v[0] == G.send)
|
||||||
str -= 1;
|
str -= 1;
|
||||||
@ -7146,8 +7138,6 @@ static BcStatus bc_vm_stdin(void)
|
|||||||
|
|
||||||
bc_vec_pop_all(&buffer);
|
bc_vec_pop_all(&buffer);
|
||||||
}
|
}
|
||||||
if (s == BC_STATUS_EOF) // input EOF (^D) is not an error
|
|
||||||
s = BC_STATUS_SUCCESS;
|
|
||||||
|
|
||||||
if (str) {
|
if (str) {
|
||||||
s = bc_error("string end could not be found");
|
s = bc_error("string end could not be found");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user