bc: compress two constant arguments of bc_lex_assign() to one
authorDenys Vlasenko <vda.linux@googlemail.com>
Fri, 14 Dec 2018 15:48:34 +0000 (16:48 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Fri, 14 Dec 2018 15:48:34 +0000 (16:48 +0100)
function                                             old     new   delta
zbc_program_num                                      836     835      -1
bc_lex_assign                                         34      31      -3
zbc_lex_next                                        1930    1880     -50
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/3 up/down: 0/-54)             Total: -54 bytes
   text    data     bss     dec     hex filename
 980208     485    7296  987989   f1355 busybox_old
 980154     485    7296  987935   f131f busybox_unstripped

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

index b22cd41f1bc8ca50c159f3576eb8d89220104da4..918cf46388da61db2931ac491dd81ddc001be440 100644 (file)
 # include "dc.c"
 #else
 
+#if 0
+# define dbg_lex(...) bb_error_msg(__VA_ARGS__)
+#else
+# define dbg_lex(...) ((void)0)
+#endif
+
 typedef enum BcStatus {
        BC_STATUS_SUCCESS = 0,
        BC_STATUS_FAILURE = 1,
@@ -2935,8 +2941,12 @@ static BC_STATUS zbc_lex_next(BcLex *l)
        // is so the parser doesn't get inundated with whitespace.
        s = BC_STATUS_SUCCESS;
        do {
+               dbg_lex("next token:'%.*s'",
+                       (int)(strchrnul(l->buf + l->i, '\n') - (l->buf + l->i)),
+                       l->buf + l->i);
                ERROR_RETURN(s =) zcommon_lex_token(l);
        } while (!s && l->t.t == BC_LEX_WHITESPACE);
+       dbg_lex("next l->t.t:%d", l->t.t);
 
        RETURN_STATUS(s);
 }
@@ -3035,15 +3045,16 @@ static BC_STATUS zbc_lex_string(BcLex *l)
 # define zbc_lex_string(...) (zbc_lex_string(__VA_ARGS__), BC_STATUS_SUCCESS)
 #endif
 
-static void bc_lex_assign(BcLex *l, BcLexType with, BcLexType without)
+static void bc_lex_assign(BcLex *l, unsigned with_and_without)
 {
        if (l->buf[l->i] == '=') {
                ++l->i;
-               l->t.t = with;
-       }
-       else
-               l->t.t = without;
+               with_and_without >>= 8; // store "with" value
+       } // else store "without" value
+       l->t.t = (with_and_without & 0xff);
 }
+#define bc_lex_assign(l, with, without) \
+       bc_lex_assign(l, ((with)<<8)|(without))
 
 static BC_STATUS zbc_lex_comment(BcLex *l)
 {
@@ -7523,11 +7534,11 @@ int dc_main(int argc UNUSED_PARAM, char **argv)
        // 1 char wider than bc from the same package.
        // Both default width, and xC_LINE_LENGTH=N are wider:
        // "DC_LINE_LENGTH=5 dc -e'123456 p'" prints:
-       //      1234\
-       //      56
+       //      |1234\   |
+       //      |56      |
        // "echo '123456' | BC_LINE_LENGTH=5 bc" prints:
-       //      123\
-       //      456
+       //      |123\    |
+       //      |456     |
        // Do the same, or it's a bug?
        bc_vm_init("DC_LINE_LENGTH");