dc: fix '?'
authorDenys Vlasenko <vda.linux@googlemail.com>
Fri, 4 Jan 2019 04:41:47 +0000 (05:41 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Thu, 14 Feb 2019 13:40:57 +0000 (14:40 +0100)
function                                             old     new   delta
zdc_parse_expr                                       470     479      +9
zxc_vm_process                                       839     814     -25
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/1 up/down: 9/-25)             Total: -16 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
miscutils/bc.c
testsuite/dc.tests

index ec3560c2b4d7ccb82deac9ac2b4395718bbb5dc6..1e8056c019e5a4dc393a5a6e3db405a3b863fcef 100644 (file)
@@ -5054,6 +5054,9 @@ static BC_STATUS zdc_parse_expr(void)
        BcParse *p = &G.prs;
        int i;
 
+       if (p->lex == XC_LEX_NLINE)
+               RETURN_STATUS(zxc_lex_next());
+
        i = (int)p->lex - (int)XC_LEX_OP_POWER;
        if (i >= 0) {
                BcInst inst = dc_LEX_to_INST[i];
@@ -6766,14 +6769,6 @@ static BC_STATUS zxc_vm_process(const char *text)
 #endif
                } else {
 #if ENABLE_DC
-                       // Most of dc parsing assumes all whitespace,
-                       // including '\n', is eaten.
-                       while (G.prs.lex == XC_LEX_NLINE) {
-                               s = zxc_lex_next();
-                               if (s) goto err;
-                               if (G.prs.lex == XC_LEX_EOF)
-                                       goto done;
-                       }
                        s = zdc_parse_expr();
 #endif
                }
@@ -6836,7 +6831,7 @@ static BC_STATUS zxc_vm_process(const char *text)
                bc_vec_pop_all(&f->code);
                ip->inst_idx = 0;
        }
- IF_DC(done:)
+
        dbg_lex_done("%s:%d done", __func__, __LINE__);
        RETURN_STATUS(s);
 }
index 29b413cad678099c0e97707dd9c943882e6543be..87b1e71c3084cded0bc6bd022679578d4c72360a 100755 (executable)
@@ -41,6 +41,11 @@ testing "dc complex without spaces (multiple args)" \
        "16\n" \
        "" ""
 
+testing "dc read" \
+       "dc -finput" \
+       "2\n9\n1\n" \
+       "1?2\nf" "9\n"
+
 optional FEATURE_DC_BIG
 # All tests below depend on FEATURE_DC_BIG