oweals/busybox.git
5 years agobc: do not yet allow 2^2.1
Denys Vlasenko [Sat, 22 Dec 2018 22:14:48 +0000 (23:14 +0100)]
bc: do not yet allow 2^2.1

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: avoid having to twiddle b->neg in zbc_num_p()
Denys Vlasenko [Sat, 22 Dec 2018 20:52:30 +0000 (21:52 +0100)]
bc: avoid having to twiddle b->neg in zbc_num_p()

function                                             old     new   delta
zbc_num_ulong_abs                                      -      70     +70
zbc_num_p                                            424     413     -11
zbc_num_ulong                                         81      21     -60
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 0/2 up/down: 70/-71)             Total: -1 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: do not disallow powers to N.0000 degree - it's even shorter code
Denys Vlasenko [Sat, 22 Dec 2018 20:45:18 +0000 (21:45 +0100)]
bc: do not disallow powers to N.0000 degree - it's even shorter code

function                                             old     new   delta
zbc_num_p                                            440     424     -16

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: shrink zbc_num_ulong()
Denys Vlasenko [Sat, 22 Dec 2018 20:37:46 +0000 (21:37 +0100)]
bc: shrink zbc_num_ulong()

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: make long-running dc drop data it does not need (when it can)
Denys Vlasenko [Sat, 22 Dec 2018 18:23:46 +0000 (19:23 +0100)]
bc: make long-running dc drop data it does not need (when it can)

function                                             old     new   delta
zbc_vm_process                                       765     824     +59

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: unbreak "z function" macro machinery
Denys Vlasenko [Sat, 22 Dec 2018 17:24:19 +0000 (18:24 +0100)]
bc: unbreak "z function" macro machinery

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agodc: unbreak interactive mode - was trying to get next tokens instead of executing
Denys Vlasenko [Sat, 22 Dec 2018 17:04:08 +0000 (18:04 +0100)]
dc: unbreak interactive mode - was trying to get next tokens instead of executing

function                                             old     new   delta
zbc_program_read                                       -     268    +268
zdc_program_printStream                                -     146    +146
zbc_program_exec                                    4046    4182    +136
zdc_program_execStr                                  472     512     +40
zdc_parse_exprs_until_eof                              -      26     +26
zbc_vm_process                                       740     765     +25
zbc_lex_next                                        2225    2240     +15
zdc_parse_expr                                       569     535     -34
zbc_program_pushArray                                147       -    -147
zdc_program_asciify                                  370       -    -370
------------------------------------------------------------------------------
(add/remove: 3/2 grow/shrink: 4/1 up/down: 656/-551)          Total: 105 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: move zbc_lex_next() out of zdc_parse_string() and zdc_parse_mem()
Denys Vlasenko [Sat, 22 Dec 2018 15:40:38 +0000 (16:40 +0100)]
bc: move zbc_lex_next() out of zdc_parse_string() and zdc_parse_mem()

function                                             old     new   delta
zdc_parse_mem                                         99      93      -6
zdc_parse_expr                                       586     569     -17
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/2 up/down: 0/-23)             Total: -23 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: shorten sanity-check code
Denys Vlasenko [Sat, 22 Dec 2018 13:18:47 +0000 (14:18 +0100)]
bc: shorten sanity-check code

function                                             old     new   delta
zbc_vm_process                                       745     740      -5

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: fold single-callsite functions into callers, commonalize code
Denys Vlasenko [Sat, 22 Dec 2018 05:00:25 +0000 (06:00 +0100)]
bc: fold single-callsite functions into callers, commonalize code

function                                             old     new   delta
zbc_vm_process                                       699     745     +46
zbc_parse_stmt_possibly_auto                        1689    1682      -7
bc_parse_reset                                       113       -    -113
------------------------------------------------------------------------------
(add/remove: 0/1 grow/shrink: 1/1 up/down: 46/-120)           Total: -74 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: zcommon_parse_expr() has only one user, fold it in
Denys Vlasenko [Sat, 22 Dec 2018 02:38:52 +0000 (03:38 +0100)]
bc: zcommon_parse_expr() has only one user, fold it in

function                                             old     new   delta
zbc_program_exec                                    4021    4046     +25
zdc_parse_expr                                       589     586      -3
zcommon_parse_expr                                    28       -     -28
------------------------------------------------------------------------------
(add/remove: 0/1 grow/shrink: 1/1 up/down: 25/-31)             Total: -6 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: zcommon_parse_expr() lost its flags argument
Denys Vlasenko [Sat, 22 Dec 2018 01:30:18 +0000 (02:30 +0100)]
bc: zcommon_parse_expr() lost its flags argument

function                                             old     new   delta
zcommon_parse_expr                                     -      28     +28
zdc_program_execStr                                  474     472      -2
zbc_program_exec                                    4023    4021      -2
common_parse_expr                                     29       -     -29
------------------------------------------------------------------------------
(add/remove: 1/1 grow/shrink: 0/2 up/down: 28/-33)             Total: -5 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: stop using BC_PARSE_NOCALL in dc code
Denys Vlasenko [Sat, 22 Dec 2018 01:23:08 +0000 (02:23 +0100)]
bc: stop using BC_PARSE_NOCALL in dc code

function                                             old     new   delta
zdc_program_execStr                                  465     474      +9
zbc_vm_process                                       701     699      -2
common_parse_expr                                     32      29      -3
zdc_parse_expr                                       615     586     -29
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/3 up/down: 9/-34)             Total: -25 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: unbreak read(), remove checks for nested read()
Denys Vlasenko [Sat, 22 Dec 2018 00:34:10 +0000 (01:34 +0100)]
bc: unbreak read(), remove checks for nested read()

function                                             old     new   delta
zbc_parse_pushSTR                                      -      65     +65
common_parse_expr                                      -      32     +32
bc_error_nested_read_call                             10       -     -10
bc_parse_expr_empty_ok                              1977    1963     -14
zdc_parse_expr                                       635     615     -20
zcommon_parse_expr                                    32       -     -32
zbc_program_exec                                    4064    4023     -41
bc_parse_pushSTR                                      65       -     -65
------------------------------------------------------------------------------
(add/remove: 2/3 grow/shrink: 0/3 up/down: 97/-182)           Total: -85 bytes
   text    data     bss     dec     hex filename
 981661     485    7296  989442   f1902 busybox_old
 981540     485    7296  989321   f1889 busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: code shrink
Denys Vlasenko [Fri, 21 Dec 2018 22:13:48 +0000 (23:13 +0100)]
bc: code shrink

function                                             old     new   delta
bc_result_pop_and_push                                 -      73     +73
zbc_program_exec                                    4068    4064      -4
bc_program_binOpRetire                                46      32     -14
zdc_program_assignStr                                146     126     -20
zdc_program_asciify                                  395     370     -25
bc_program_retire                                     35       7     -28
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 0/5 up/down: 73/-91)            Total: -18 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: rename BcInstPtr::idx and ::len
Denys Vlasenko [Fri, 21 Dec 2018 22:01:26 +0000 (23:01 +0100)]
bc: rename BcInstPtr::idx and ::len

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: remove unnecessary initializations
Denys Vlasenko [Fri, 21 Dec 2018 21:43:53 +0000 (22:43 +0100)]
bc: remove unnecessary initializations

function                                             old     new   delta
zdc_program_asciify                                  403     395      -8
zbc_program_print                                    691     683      -8
zbc_program_exec                                    4079    4068     -11
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/3 up/down: 0/-27)             Total: -27 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: use non-allocated BcNum's where appropriate
Denys Vlasenko [Fri, 21 Dec 2018 21:36:04 +0000 (22:36 +0100)]
bc: use non-allocated BcNum's where appropriate

function                                             old     new   delta
zbc_num_printNum                                     540     543      +3
zdc_program_asciify                                  407     403      -4
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/1 up/down: 3/-4)               Total: -1 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: optimize bc_vec_push() usage
Denys Vlasenko [Fri, 21 Dec 2018 21:16:17 +0000 (22:16 +0100)]
bc: optimize bc_vec_push() usage

function                                             old     new   delta
bc_parse_pushNUM                                      87      80      -7
zbc_parse_stmt_possibly_auto                        1697    1689      -8
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/2 up/down: 0/-15)             Total: -15 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: fix for() to not leave data on stack
Denys Vlasenko [Fri, 21 Dec 2018 19:29:34 +0000 (20:29 +0100)]
bc: fix for() to not leave data on stack

function                                             old     new   delta
zbc_parse_stmt_possibly_auto                        1665    1697     +32
zbc_vm_process                                       672     701     +29
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/0 up/down: 61/0)               Total: 61 bytes
   text    data     bss     dec     hex filename
 981656     485    7296  989437   f18fd busybox_old
 981748     485    7296  989529   f1959 busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: fix infinite state growth for "yes 1 | bc" case
Denys Vlasenko [Fri, 21 Dec 2018 15:22:26 +0000 (16:22 +0100)]
bc: fix infinite state growth for "yes 1 | bc" case

function                                             old     new   delta
zbc_vm_process                                       585     672     +87
bc_func_init                                          50      86     +36
zbc_program_num                                      990    1022     +32
bc_program_str                                        17      47     +30
bc_program_current_func                                -      22     +22
bc_parse_pushNUM                                      66      87     +21
bc_func_free                                          27      43     +16
zbc_num_binary                                       145     147      +2
bc_program_reset                                      64      61      -3
bc_parse_pushSTR                                      73      65      -8
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 7/2 up/down: 246/-11)           Total: 235 bytes
   text    data     bss     dec     hex filename
 981393     485    7296  989174   f17f6 busybox_old
 981656     485    7296  989437   f18fd busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: fix comment
Denys Vlasenko [Thu, 20 Dec 2018 23:39:02 +0000 (00:39 +0100)]
bc: fix comment

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: for(;;) fix from upstream
Denys Vlasenko [Thu, 20 Dec 2018 23:35:22 +0000 (00:35 +0100)]
bc: for(;;) fix from upstream

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: shrink bc_program_add_fn()
Denys Vlasenko [Thu, 20 Dec 2018 23:10:26 +0000 (00:10 +0100)]
bc: shrink bc_program_add_fn()

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: "dc only" config does not need G.prog.fn_map
Denys Vlasenko [Thu, 20 Dec 2018 19:34:09 +0000 (20:34 +0100)]
bc: "dc only" config does not need G.prog.fn_map

function                                             old     new   delta
bc_program_add_fn                                      -      43     +43
bc_vm_init                                           655     675     +20
bc_program_addFunc                                   138     118     -20
zdc_parse_expr                                       658     635     -23
zdc_program_asciify                                  447     407     -40
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 1/3 up/down: 63/-83)            Total: -20 bytes
   text    data     bss     dec     hex filename
 984739     489    7312  992540   f251c busybox_old
 984712     489    7312  992513   f2501 busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: fix keyword matching to not think "ifz" is the "if" keyword
Denys Vlasenko [Thu, 20 Dec 2018 15:48:50 +0000 (16:48 +0100)]
bc: fix keyword matching to not think "ifz" is the "if" keyword

function                                             old     new   delta
zbc_lex_next                                        2224    2225      +1

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: shrink "dc only" code by dropping unused structure members
Denys Vlasenko [Thu, 20 Dec 2018 15:24:18 +0000 (16:24 +0100)]
bc: shrink "dc only" code by dropping unused structure members

function                                             old     new   delta
zbc_program_num                                      979     981      +2
zbc_program_pushArray                                147     145      -2
bc_program_pushVar                                   198     196      -2
bc_program_func                                       17      15      -2
dc_num_printChar                                      24      21      -3
bc_program_retire                                     35      32      -3
bc_program_binOpRetire                                46      43      -3
zdc_program_printStream                              153     148      -5
zbc_program_prep                                      91      86      -5
zbc_program_copyToVar                                300     295      -5
zdc_program_modexp                                   721     715      -6
zbc_program_binOpPrep                                311     305      -6
bc_program_addFunc                                   138     132      -6
bc_num_printNewline                                   51      45      -6
bc_num_printHex                                       67      61      -6
bc_num_printDigits                                   137     131      -6
zdc_program_assignStr                                146     137      -9
bc_program_reset                                      64      55      -9
bc_func_free                                          27       5     -22
bc_parse_free                                         38       8     -30
bc_parse_create                                       92      47     -45
bc_func_init                                          50       5     -45
dc_main                                              691     645     -46
zdc_program_execStr                                  496     442     -54
zbc_program_print                                    677     623     -54
zbc_vm_process                                       204     137     -67
zbc_program_exec                                    4132    4057     -75
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/26 up/down: 2/-522)          Total: -520 bytes
   text    data     bss     dec     hex filename
 969767     485    7296  977548   eea8c busybox_old
 969210     485    7296  976991   ee85f busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: shorten bc_program_addFunc()
Denys Vlasenko [Wed, 19 Dec 2018 19:05:50 +0000 (20:05 +0100)]
bc: shorten bc_program_addFunc()

function                                             old     new   delta
bc_func_init                                           -      50     +50
bc_program_addFunc                                   201     138     -63
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 0/1 up/down: 50/-63)            Total: -13 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: fix "dc only" and "bc only" configs
Denys Vlasenko [Wed, 19 Dec 2018 18:43:03 +0000 (19:43 +0100)]
bc: fix "dc only" and "bc only" configs

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: rename dc-specific functions, simplify zdc_program_execStr() a bit
Denys Vlasenko [Wed, 19 Dec 2018 18:35:40 +0000 (19:35 +0100)]
bc: rename dc-specific functions, simplify zdc_program_execStr() a bit

function                                             old     new   delta
zbc_program_execStr                                  496       -    -496
zdc_program_execStr                                    -     491    +491

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: rename zbc_parse_string->bc_parse_pushSTR, do not emit next opcode in it
Denys Vlasenko [Wed, 19 Dec 2018 18:10:40 +0000 (19:10 +0100)]
bc: rename zbc_parse_string->bc_parse_pushSTR, do not emit next opcode in it

function                                             old     new   delta
bc_parse_pushSTR                                       -      73     +73
zbc_parse_stmt_possibly_auto                        1638    1640      +2
zbc_parse_string                                      89       -     -89
------------------------------------------------------------------------------
(add/remove: 1/1 grow/shrink: 1/0 up/down: 75/-89)            Total: -14 bytes
   text    data     bss     dec     hex filename
 981377     485    7296  989158   f17e6 busybox_old
 981363     485    7296  989144   f17d8 busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: avoid bc_vec_item() calls in bc_vm_run()
Denys Vlasenko [Wed, 19 Dec 2018 17:09:31 +0000 (18:09 +0100)]
bc: avoid bc_vec_item() calls in bc_vm_run()

function                                             old     new   delta
bc_vm_run                                            124     112     -12

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: avoid bc_vec_item() calls in bc_array_copy()
Denys Vlasenko [Wed, 19 Dec 2018 16:59:30 +0000 (17:59 +0100)]
bc: avoid bc_vec_item() calls in bc_array_copy()

function                                             old     new   delta
zbc_program_copyToVar                                311     300     -11

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: avoid successive bc_vec_item(&func->autos, i)
Denys Vlasenko [Wed, 19 Dec 2018 16:55:23 +0000 (17:55 +0100)]
bc: avoid successive bc_vec_item(&func->autos, i)

function                                             old     new   delta
zbc_func_insert                                       97     100      +3
zbc_program_call                                     353     354      +1
zbc_program_exec                                    4085    4078      -7
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/1 up/down: 4/-7)               Total: -3 bytes
   text    data     bss     dec     hex filename
 981403     485    7296  989184   f1800 busybox_old
 981400     485    7296  989181   f17fd busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: remove unnecessary union use
Denys Vlasenko [Wed, 19 Dec 2018 16:15:04 +0000 (17:15 +0100)]
bc: remove unnecessary union use

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: "unsigned_n > 0" is shorter code than "unsigned_n >= 1"
Denys Vlasenko [Wed, 19 Dec 2018 16:09:01 +0000 (17:09 +0100)]
bc: "unsigned_n > 0" is shorter code than "unsigned_n >= 1"

function                                             old     new   delta
zbc_program_print                                    680     677      -3
zbc_program_exec                                    4089    4085      -4
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/2 up/down: 0/-7)               Total: -7 bytes
   text    data     bss     dec     hex filename
 981404     485    7296  989185   f1801 busybox_old
 981397     485    7296  989178   f17fa busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: open-code bc_parse_updateFunc() macro
Denys Vlasenko [Wed, 19 Dec 2018 14:13:14 +0000 (15:13 +0100)]
bc: open-code bc_parse_updateFunc() macro

This clearly shows one place which would need changing
for nested funcdefs to work.

function                                             old     new   delta
bc_parse_reset                                       106     110      +4
zbc_vm_process                                       586     585      -1
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/1 up/down: 4/-1)                Total: 3 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: make bc_program_addFunc() return new idx, untangle &p->fidx interaction
Denys Vlasenko [Wed, 19 Dec 2018 13:57:23 +0000 (14:57 +0100)]
bc: make bc_program_addFunc() return new idx, untangle &p->fidx interaction

In:
       bc_program_addFunc(name, idx);
       p->func = bc_program_func(p->fidx);
in some cases p->fidx was updated by _first_ statement - because passed idx
was pointing at it. This was very obscure.

function                                             old     new   delta
zdc_parse_expr                                       653     658      +5
bc_program_addFunc                                   204     201      -3
zbc_vm_process                                       594     586      -8
bc_vm_init                                           663     655      -8
zbc_parse_name                                       482     472     -10
bc_parse_addFunc                                      25       -     -25
zbc_program_asciify                                  473     447     -26
------------------------------------------------------------------------------
(add/remove: 0/1 grow/shrink: 1/5 up/down: 5/-80)             Total: -75 bytes
   text    data     bss     dec     hex filename
 981482     485    7296  989263   f184f busybox_old
 981401     485    7296  989182   f17fe busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: "reload stack only after insts" change missed a few places
Denys Vlasenko [Wed, 19 Dec 2018 13:02:59 +0000 (14:02 +0100)]
bc: "reload stack only after insts" change missed a few places

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: rename a few functions
Denys Vlasenko [Wed, 19 Dec 2018 12:55:53 +0000 (13:55 +0100)]
bc: rename a few functions

function                                             old     new   delta
bc_map_find_ge                                         -      71     +71
bc_map_find_exact                                      -      50     +50
bc_map_index                                          50       -     -50
bc_map_find                                           71       -     -71
------------------------------------------------------------------------------
(add/remove: 2/2 grow/shrink: 0/0 up/down: 121/-121)            Total: 0 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: remove redundant strdup+free in zbc_parse_call()
Denys Vlasenko [Wed, 19 Dec 2018 12:19:44 +0000 (13:19 +0100)]
bc: remove redundant strdup+free in zbc_parse_call()

function                                             old     new   delta
zbc_parse_name                                       527     482     -45
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-45)             Total: -45 bytes
   text    data     bss     dec     hex filename
 981541     485    7296  989322   f188a busybox_old
 981486     485    7296  989267   f1853 busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: delete G.prog.strmb for real
Denys Vlasenko [Wed, 19 Dec 2018 11:47:45 +0000 (12:47 +0100)]
bc: delete G.prog.strmb for real

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: in execution loop, reload stack only after insts which can change it
Denys Vlasenko [Wed, 19 Dec 2018 11:35:27 +0000 (12:35 +0100)]
bc: in execution loop, reload stack only after insts which can change it

Only these functions affect G.prog.exestack:
zbc_program_read
zbc_program_call
zbc_program_return
zbc_program_nquit
zbc_program_execStr

function                                             old     new   delta
zbc_program_exec                                    3995    4093     +98
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/0 up/down: 98/0)               Total: 98 bytes
   text    data     bss     dec     hex filename
 981364     485    7296  989145   f17d9 busybox_old
 981462     485    7296  989243   f183b busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: simplify bc_array_expand()
Denys Vlasenko [Tue, 18 Dec 2018 19:10:48 +0000 (20:10 +0100)]
bc: simplify bc_array_expand()

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: code shrink
Denys Vlasenko [Tue, 18 Dec 2018 18:20:04 +0000 (19:20 +0100)]
bc: code shrink

function                                             old     new   delta
zbc_program_print                                    684     680      -4
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-4)               Total: -4 bytes
   text    data     bss     dec     hex filename
 981368     485    7296  989149   f17dd busybox_old
 981364     485    7296  989145   f17d9 busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: code shrink
Denys Vlasenko [Tue, 18 Dec 2018 18:17:11 +0000 (19:17 +0100)]
bc: code shrink

function                                             old     new   delta
bc_program_name                                       67      63      -4
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-4)               Total: -4 bytes
   text    data     bss     dec     hex filename
 981372     485    7296  989153   f17e1 busybox_old
 981368     485    7296  989149   f17dd busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: shrink bc_program_pushVar()
Denys Vlasenko [Tue, 18 Dec 2018 16:14:34 +0000 (17:14 +0100)]
bc: shrink bc_program_pushVar()

function                                             old     new   delta
bc_program_pushVar                                   203     198      -5

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: get rid of G.prog.ob, G.prog.strmb
Denys Vlasenko [Tue, 18 Dec 2018 16:00:35 +0000 (17:00 +0100)]
bc: get rid of G.prog.ob, G.prog.strmb

function                                             old     new   delta
zbc_num_printNum                                     489     540     +51
zbc_program_asciify                                  426     473     +47
zbc_program_print                                    686     684      -2
zbc_program_exec                                    4008    3995     -13
zbc_program_assign                                   474     440     -34
bc_vm_init                                           739     663     -76
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/4 up/down: 98/-125)           Total: -27 bytes
   text    data     bss     dec     hex filename
 981404     485    7296  989185   f1801 busybox_old
 981377     485    7296  989158   f17e6 busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: do not show -i in --help, it's a NOP (for now)
Denys Vlasenko [Tue, 18 Dec 2018 15:32:25 +0000 (16:32 +0100)]
bc: do not show -i in --help, it's a NOP (for now)

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: style edit, no code changes
Denys Vlasenko [Tue, 18 Dec 2018 15:24:07 +0000 (16:24 +0100)]
bc: style edit, no code changes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: shrink bc_program_index()
Denys Vlasenko [Tue, 18 Dec 2018 14:49:42 +0000 (15:49 +0100)]
bc: shrink bc_program_index()

function                                             old     new   delta
bc_program_index                                      66      47     -19
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-19)             Total: -19 bytes
   text    data     bss     dec     hex filename
 981418     485    7296  989199   f180f busybox_old
 981399     485    7296  989180   f17fc busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: fix "echo -n '#foo' | bc" not eating last 'o'
Denys Vlasenko [Tue, 18 Dec 2018 13:37:16 +0000 (14:37 +0100)]
bc: fix "echo -n '#foo' | bc" not eating last 'o'

function                                             old     new   delta
zdc_parse_expr                                       656     653      -3
bc_lex_lineComment                                    39      36      -3
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/2 up/down: 0/-6)               Total: -6 bytes
   text    data     bss     dec     hex filename
 981424     485    7296  989205   f1815 busybox_old
 981418     485    7296  989199   f180f busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: shrink zdc_parse_expr()
Denys Vlasenko [Tue, 18 Dec 2018 13:11:35 +0000 (14:11 +0100)]
bc: shrink zdc_parse_expr()

function                                             old     new   delta
zdc_parse_expr                                       656     653      -3

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: optimize zbc_lex_string()
Denys Vlasenko [Tue, 18 Dec 2018 13:03:20 +0000 (14:03 +0100)]
bc: optimize zbc_lex_string()

function                                             old     new   delta
zbc_lex_next                                        2359    2353      -6

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: shrink zdc_lex_string()
Denys Vlasenko [Tue, 18 Dec 2018 12:48:37 +0000 (13:48 +0100)]
bc: shrink zdc_lex_string()

This actually fixes a rather obscure bug. This was failing to find
end of the string:

$ echo -n '[foo]' | dc
dc: string end could not be found

function                                             old     new   delta
zbc_lex_next                                        2230    2141     -89
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-89)             Total: -89 bytes
   text    data     bss     dec     hex filename
 981461     485    7296  989242   f183a busybox_old
 981372     485    7296  989153   f17e1 busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: another for() loop simplified
Denys Vlasenko [Tue, 18 Dec 2018 12:22:23 +0000 (13:22 +0100)]
bc: another for() loop simplified

function                                             old     new   delta
zbc_program_print                                    688     686      -2

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: simplify another for() loop
Denys Vlasenko [Tue, 18 Dec 2018 12:15:55 +0000 (13:15 +0100)]
bc: simplify another for() loop

function                                             old     new   delta
zbc_num_d                                            563     557      -6

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: rewrite more for() loops
Denys Vlasenko [Tue, 18 Dec 2018 11:55:40 +0000 (12:55 +0100)]
bc: rewrite more for() loops

function                                             old     new   delta
bc_program_name                                       75      67      -8

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: rewrite another for() loop
Denys Vlasenko [Tue, 18 Dec 2018 11:43:21 +0000 (12:43 +0100)]
bc: rewrite another for() loop

function                                             old     new   delta
zbc_num_d                                            570     563      -7

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: replace signed division / 10 by unsigned
Denys Vlasenko [Tue, 18 Dec 2018 11:23:16 +0000 (12:23 +0100)]
bc: replace signed division / 10 by unsigned

function                                             old     new   delta
zbc_num_a                                            443     441      -2

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: rewrite bc_num_compare() to be readable
Denys Vlasenko [Mon, 17 Dec 2018 23:39:24 +0000 (00:39 +0100)]
bc: rewrite bc_num_compare() to be readable

function                                             old     new   delta
bc_num_compare                                        59      51      -8

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: fold zbc_num_stream() into its single caller
Denys Vlasenko [Mon, 17 Dec 2018 20:14:05 +0000 (21:14 +0100)]
bc: fold zbc_num_stream() into its single caller

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: get rid of BcNum BcProgram::ib,hexb
Denys Vlasenko [Mon, 17 Dec 2018 20:05:09 +0000 (21:05 +0100)]
bc: get rid of BcNum BcProgram::ib,hexb

function                                             old     new   delta
zbc_program_num                                      907     943     +36
zbc_program_assign                                   485     474     -11
bc_vm_init                                           757     739     -18
bc_num_ten                                            30       -     -30
------------------------------------------------------------------------------
(add/remove: 0/1 grow/shrink: 1/2 up/down: 36/-59)            Total: -23 bytes
   text    data     bss     dec     hex filename
 981532     485    7296  989313   f1881 busybox_old
 981509     485    7296  989290   f186a busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: fixes to bugs found while testing 64-bit build
Denys Vlasenko [Tue, 18 Dec 2018 02:16:48 +0000 (03:16 +0100)]
bc: fixes to bugs found while testing 64-bit build

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: fixed from 64-bit compile
Denys Vlasenko [Tue, 18 Dec 2018 01:23:53 +0000 (02:23 +0100)]
bc: fixed from 64-bit compile

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agoudhcpc: check that 4-byte options are indeed 4-byte, closes 11506
Denys Vlasenko [Mon, 17 Dec 2018 17:07:18 +0000 (18:07 +0100)]
udhcpc: check that 4-byte options are indeed 4-byte, closes 11506

function                                             old     new   delta
udhcp_get_option32                                     -      27     +27
udhcp_get_option                                     231     248     +17
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 1/0 up/down: 44/0)               Total: 44 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: remove "error after expression parsing" check
Denys Vlasenko [Mon, 17 Dec 2018 15:54:37 +0000 (16:54 +0100)]
bc: remove "error after expression parsing" check

It is misplaced: caller knows better what can or cannot follow the expression.
Sometimes even caller's caller: "if (1) return a+b else..." -
parser of "return" does not know that "else" after it is valid,
parser of stmt does not know it either, - only parser of
"if" knows it!

The removed code balked on e.g. "{ print 1 }" statement.

This does not break any valid programs, but starts accepting some
invalid ones, e.g. "print 1 print 2" would work.

function                                             old     new   delta
zcommon_parse_expr                                    40      32      -8
zbc_parse_name                                       509     494     -15
zbc_parse_stmt_possibly_auto                        1678    1638     -40
bc_parse_expr_empty_ok                              2025    1977     -48
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/4 up/down: 0/-111)           Total: -111 bytes
   text    data     bss     dec     hex filename
 981599     485    7296  989380   f18c4 busybox_old
 981488     485    7296  989269   f1855 busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: tighten up input NUL handling
Denys Vlasenko [Mon, 17 Dec 2018 10:58:20 +0000 (11:58 +0100)]
bc: tighten up input NUL handling

function                                             old     new   delta
static.dc_lex_tokens                                   -      90     +90
bc_error_bad_character                                17      31     +14
static.dc_lex_regs                                     -      13     +13
bc_read_line                                         406     410      +4
bc_program_index                                      64      66      +2
dc_lex_regs                                           13       -     -13
zdc_parse_expr                                       671     656     -15
zbc_lex_next                                        2318    2230     -88
dc_lex_tokens                                         91       -     -91
------------------------------------------------------------------------------
(add/remove: 2/2 grow/shrink: 3/2 up/down: 123/-207)          Total: -84 bytes
   text    data     bss     dec     hex filename
 981667     485    7296  989448   f1908 busybox_old
 981599     485    7296  989380   f18c4 busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: simplify zdc_parse_string()
Denys Vlasenko [Mon, 17 Dec 2018 10:02:26 +0000 (11:02 +0100)]
bc: simplify zdc_parse_string()

function                                             old     new   delta
bc_program_index                                      64      66      +2
zdc_parse_expr                                       671     656     -15
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/1 up/down: 2/-15)             Total: -13 bytes
   text    data     bss     dec     hex filename
 981667     485    7296  989448   f1908 busybox_old
 981655     485    7296  989436   f18fc busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: use common strings
Denys Vlasenko [Mon, 17 Dec 2018 09:42:31 +0000 (10:42 +0100)]
bc: use common strings

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: tidy up "z-function" macro machinery
Denys Vlasenko [Mon, 17 Dec 2018 09:34:02 +0000 (10:34 +0100)]
bc: tidy up "z-function" macro machinery

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: parse file arguments piecemeal (do not read entire file)
Denys Vlasenko [Mon, 17 Dec 2018 08:51:43 +0000 (09:51 +0100)]
bc: parse file arguments piecemeal (do not read entire file)

function                                             old     new   delta
bc_read_line                                         336     406     +70
zbc_vm_execute_FILE                                    -      67     +67
zbc_lex_next                                        2309    2318      +9
zbc_program_exec                                    4002    4008      +6
bc_program_index                                      66      64      -2
bc_vm_run                                            139     124     -15
zbc_vm_file                                          208      32    -176
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 3/3 up/down: 152/-193)          Total: -41 bytes
   text    data     bss     dec     hex filename
 981736     485    7296  989517   f194d busybox_old
 981667     485    7296  989448   f1908 busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: move fflush to the _actual_ execution loop
Denys Vlasenko [Mon, 17 Dec 2018 00:22:53 +0000 (01:22 +0100)]
bc: move fflush to the _actual_ execution loop

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: fix typo: defone -> define
Denys Vlasenko [Sun, 16 Dec 2018 23:15:35 +0000 (00:15 +0100)]
bc: fix typo: defone -> define

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: factor out common code
Denys Vlasenko [Sun, 16 Dec 2018 23:07:48 +0000 (00:07 +0100)]
bc: factor out common code

function                                             old     new   delta
zbc_parse_stmt_allow_NLINE_before                      -      59     +59
bc_parse_pushJUMP_ZERO                                 -      27     +27
bc_parse_pushJUMP                                      -      27     +27
rewrite_label_to_current                               -      19     +19
zbc_vm_process                                       594     599      +5
zbc_lex_next_and_skip_NLINE                           22       -     -22
zbc_parse_stmt_fail_if_bare_NLINE                     28       -     -28
zbc_parse_stmt_possibly_auto                        1909    1678    -231
------------------------------------------------------------------------------
(add/remove: 4/2 grow/shrink: 1/1 up/down: 137/-281)         Total: -144 bytes
   text    data     bss     dec     hex filename
 981879     485    7296  989660   f19dc busybox_old
 981755     485    7296  989536   f1960 busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: remove use of "BcInstPtr ip" object from loop parsing
Denys Vlasenko [Sun, 16 Dec 2018 22:35:04 +0000 (23:35 +0100)]
bc: remove use of "BcInstPtr ip" object from loop parsing

function                                             old     new   delta
zbc_parse_stmt_possibly_auto                        1964    1909     -55
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-55)             Total: -55 bytes
   text    data     bss     dec     hex filename
 981934     485    7296  989715   f1a13 busybox_old
 981879     485    7296  989660   f19dc busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: store only index in p->exits, it's the only thing used there
Denys Vlasenko [Sun, 16 Dec 2018 22:24:25 +0000 (23:24 +0100)]
bc: store only index in p->exits, it's the only thing used there

function                                             old     new   delta
zbc_parse_stmt_possibly_auto                        1967    1964      -3
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-3)               Total: -3 bytes
   text    data     bss     dec     hex filename
 981937     485    7296  989718   f1a16 busybox_old
 981934     485    7296  989715   f1a13 busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: p->exits.func is never zero, do not check for that
Denys Vlasenko [Sun, 16 Dec 2018 22:18:28 +0000 (23:18 +0100)]
bc: p->exits.func is never zero, do not check for that

function                                             old     new   delta
zbc_parse_stmt_possibly_auto                        1978    1967     -11
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-11)             Total: -11 bytes
   text    data     bss     dec     hex filename
 981948     485    7296  989729   f1a21 busybox_old
 981937     485    7296  989718   f1a16 busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: remove redundant JUMP generation when parsing 'while'
Denys Vlasenko [Sun, 16 Dec 2018 22:02:22 +0000 (23:02 +0100)]
bc: remove redundant JUMP generation when parsing 'while'

function                                             old     new   delta
zbc_parse_stmt_possibly_auto                        2065    2025     -40
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-40)             Total: -40 bytes
   text    data     bss     dec     hex filename
 982035     485    7296  989816   f1a78 busybox_old
 981995     485    7296  989776   f1a50 busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: simplify use of "ip" in loop parsing functions
Denys Vlasenko [Sun, 16 Dec 2018 21:44:51 +0000 (22:44 +0100)]
bc: simplify use of "ip" in loop parsing functions

function                                             old     new   delta
zbc_parse_stmt_possibly_auto                        2106    2065     -41
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-41)             Total: -41 bytes
   text    data     bss     dec     hex filename
 982076     485    7296  989857   f1aa1 busybox_old
 982035     485    7296  989816   f1a78 busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: shring bc_lib[]
Denys Vlasenko [Sun, 16 Dec 2018 20:46:11 +0000 (21:46 +0100)]
bc: shring bc_lib[]

function                                             old     new   delta
bc_lib                                              1586    1584      -2

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: shrink zbc_parse_if() a bit more
Denys Vlasenko [Sun, 16 Dec 2018 20:40:54 +0000 (21:40 +0100)]
bc: shrink zbc_parse_if() a bit more

function                                             old     new   delta
zbc_parse_stmt_possibly_auto                        2180    2106     -74
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-74)             Total: -74 bytes
   text    data     bss     dec     hex filename
 982152     485    7296  989933   f1aed busybox_old
 982078     485    7296  989859   f1aa3 busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: stop using p->exits when parsing if()
Denys Vlasenko [Sun, 16 Dec 2018 20:29:08 +0000 (21:29 +0100)]
bc: stop using p->exits when parsing if()

function                                             old     new   delta
zbc_parse_stmt_possibly_auto                        2180    2138     -42

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: preparation to stop using p->exits when parsing if()
Denys Vlasenko [Sun, 16 Dec 2018 20:21:27 +0000 (21:21 +0100)]
bc: preparation to stop using p->exits when parsing if()

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: fix "print 1,2,3" parsing
Denys Vlasenko [Sun, 16 Dec 2018 20:08:30 +0000 (21:08 +0100)]
bc: fix "print 1,2,3" parsing

function                                             old     new   delta
zbc_parse_stmt_possibly_auto                        2245    2180     -65
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-65)             Total: -65 bytes
   text    data     bss     dec     hex filename
 982237     485    7296  990018   f1b42 busybox_old
 982152     485    7296  989933   f1aed busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: disallow empty statement as function body
Denys Vlasenko [Sun, 16 Dec 2018 19:46:15 +0000 (20:46 +0100)]
bc: disallow empty statement as function body

$ bc
define z() <cr>
<cr>
bc: no statement after 'define'

function                                             old     new   delta
zbc_parse_stmt_possibly_auto                        2239    2245      +6
zbc_vm_process                                       589     594      +5
zbc_parse_stmt_fail_if_bare_NLINE                     25      28      +3
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 3/0 up/down: 14/0)               Total: 14 bytes
   text    data     bss     dec     hex filename
 982216     485    7296  989997   f1b2d busybox_old
 982237     485    7296  990018   f1b42 busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: allow only one <newline> between if() and stmt
Denys Vlasenko [Sun, 16 Dec 2018 19:41:32 +0000 (20:41 +0100)]
bc: allow only one <newline> between if() and stmt

Attempt to have more than one causes this error message:

$ bc -q
if (1)<cr>
<cr>
bc: no statement after 'if'

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: simplify bc_parse_pushName(), do not free name in it - avoids one strdup
Denys Vlasenko [Sun, 16 Dec 2018 19:32:58 +0000 (20:32 +0100)]
bc: simplify bc_parse_pushName(), do not free name in it - avoids one strdup

function                                             old     new   delta
zbc_parse_name                                       511     509      -2
zdc_parse_register                                    50      43      -7
bc_parse_pushName                                     61      39     -22
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/3 up/down: 0/-31)             Total: -31 bytes
   text    data     bss     dec     hex filename
 982183     485    7296  989964   f1b0c busybox_old
 982152     485    7296  989933   f1aed busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: simplify zbc_parse_break_or_continue(), logic is the same
Denys Vlasenko [Sun, 16 Dec 2018 18:47:40 +0000 (19:47 +0100)]
bc: simplify zbc_parse_break_or_continue(), logic is the same

function                                             old     new   delta
zbc_parse_stmt_possibly_auto                        2259    2224     -35
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-35)             Total: -35 bytes
   text    data     bss     dec     hex filename
 982218     485    7296  989999   f1b2f busybox_old
 982183     485    7296  989964   f1b0c busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: fold zbc_parse_else() into its only caller
Denys Vlasenko [Sun, 16 Dec 2018 18:21:57 +0000 (19:21 +0100)]
bc: fold zbc_parse_else() into its only caller

While at it, allow newline between "else" and its body

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: fold bc_parse_noElse() into its only caller
Denys Vlasenko [Sun, 16 Dec 2018 18:10:38 +0000 (19:10 +0100)]
bc: fold bc_parse_noElse() into its only caller

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: delete unused (write-only) BcParse::nbraces member
Denys Vlasenko [Sun, 16 Dec 2018 17:43:51 +0000 (18:43 +0100)]
bc: delete unused (write-only) BcParse::nbraces member

function                                             old     new   delta
zbc_lex_next                                        2296    2309     +13
bc_parse_expr_empty_ok                              2021    2025      +4
bc_vm_init                                           760     757      -3
bc_num_printNewline                                   54      51      -3
zbc_num_divmod                                       156     150      -6
bc_parse_reset                                       113     106      -7
zbc_lex_number                                       200     192      -8
bc_parse_number                                       83      66     -17
zdc_parse_expr                                       707     671     -36
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/7 up/down: 17/-80)            Total: -63 bytes
   text    data     bss     dec     hex filename
 982275     485    7296  990056   f1b68 busybox_old
 982212     485    7296  989993   f1b29 busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: fixes for multi-line if/while/for
Denys Vlasenko [Sun, 16 Dec 2018 16:30:35 +0000 (17:30 +0100)]
bc: fixes for multi-line if/while/for

function                                             old     new   delta
zbc_vm_process                                       561     589     +28
zbc_lex_next_and_skip_NLINE                            -      22     +22
zbc_parse_stmt_possibly_auto                        2232    2253     +21
zbc_lex_skip_if_at_NLINE                               -      14     +14
zbc_lex_number                                       192     200      +8
zbc_num_divmod                                       150     156      +6
bc_vm_run                                            134     139      +5
bc_vm_init                                           757     760      +3
bc_num_printNewline                                   51      54      +3
------------------------------------------------------------------------------
(add/remove: 2/0 grow/shrink: 7/0 up/down: 110/0)             Total: 110 bytes
   text    data     bss     dec     hex filename
 982138     485    7296  989919   f1adf busybox_old
 982275     485    7296  990056   f1b68 busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: fix handling of 'return' not in functions, and 'define f()<newline>{...}'
Denys Vlasenko [Sun, 16 Dec 2018 16:06:07 +0000 (17:06 +0100)]
bc: fix handling of 'return' not in functions, and 'define f()<newline>{...}'

function                                             old     new   delta
zbc_vm_process                                       561     597     +36
zbc_parse_stmt_possibly_auto                        2232    2253     +21
zbc_lex_number                                       192     200      +8
zbc_num_divmod                                       150     156      +6
bc_vm_run                                            134     139      +5
bc_vm_init                                           757     760      +3
bc_num_printNewline                                   51      54      +3
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 7/0 up/down: 82/0)               Total: 82 bytes
   text    data     bss     dec     hex filename
 982138     485    7296  989919   f1adf busybox_old
 982247     485    7296  990028   f1b4c busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: partially rewrite parser, tests pass, ^C might be broken now
Denys Vlasenko [Sun, 16 Dec 2018 15:03:03 +0000 (16:03 +0100)]
bc: partially rewrite parser, tests pass, ^C might be broken now

The entire control construct (if/while/for/funcdef) or {} block is
"eaten" by the corresponding parsing function, instead of maintaining
special "block flag stack" with magic bits in it, and returning to main
input loop after every inner statement (every input line, essentially).

This required moving line input deep into lexer - now zbc_lex_next()
triggers more reading when needed.

"block flag stack" is gone.

Correctness of ^C handling wasn't checked, might need fixing now.

if/else syntax is changed to match GNU bc: "else" can not be on
the next line (the rationale is that "if (1) 2" statement in interactive
mode should execute and print 2 instead of waiting for possible
"else ..." line).

This change fixes the following examples:

if (1) if (1) 1 else 2 else 3

if (0) 1 else if (1) 2

define w() { auto z; return 1; }

function                                             old     new   delta
zbc_parse_stmt_possibly_auto                           -    2232   +2232
zbc_vm_process                                        89     561    +472
zbc_lex_next                                        1982    2296    +314
bc_vm_init                                           749     757      +8
bc_parse_expr_empty_ok                              2016    2021      +5
bc_num_printNewline                                   54      51      -3
zbc_program_read                                     289     280      -9
bc_parse_free                                         47      38      -9
bc_parse_reset                                       126     113     -13
bc_parse_create                                      108      92     -16
bc_parse_push_block_flag                              47       -     -47
bc_parse_noElse                                       48       -     -48
zbc_parse_text_init                                  113      59     -54
zbc_parse_body                                       121       -    -121
zbc_parse_else                                       125       -    -125
zbc_parse_endBody                                    254       -    -254
bc_vm_run                                            421     134    -287
zbc_parse_auto                                       290       -    -290
zcommon_parse                                        476       -    -476
zbc_parse_stmt                                      1682       7   -1675
------------------------------------------------------------------------------
(add/remove: 1/7 grow/shrink: 4/8 up/down: 3031/-3427)       Total: -396 bytes
   text    data     bss     dec     hex filename
 982586     485    7296  990367   f1c9f busybox_old
 982138     485    7296  989919   f1adf busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: lexer debugging, added some failing test cases
Denys Vlasenko [Sat, 15 Dec 2018 19:06:59 +0000 (20:06 +0100)]
bc: lexer debugging, added some failing test cases

function                                             old     new   delta
bc_parse_push_block_flag                               -      47     +47
zbc_parse_body                                       107     121     +14
zbc_num_divmod                                       156     150      -6
zbc_lex_number                                       200     192      -8
zbc_parse_endBody                                    264     254     -10
bc_parse_startBody                                    47       -     -47
------------------------------------------------------------------------------
(add/remove: 1/1 grow/shrink: 1/3 up/down: 61/-71)            Total: -10 bytes
   text    data     bss     dec     hex filename
 982596     485    7296  990377   f1ca9 busybox_old
 982586     485    7296  990367   f1c9f busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: simplify BC_INST_JUMP[_ZERO] handling
Denys Vlasenko [Sat, 15 Dec 2018 14:07:14 +0000 (15:07 +0100)]
bc: simplify BC_INST_JUMP[_ZERO] handling

function                                             old     new   delta
zbc_program_exec                                    4063    4050     -13

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: rewrite "block flag stack" using simple realloc'ed byte array
Denys Vlasenko [Fri, 14 Dec 2018 23:39:17 +0000 (00:39 +0100)]
bc: rewrite "block flag stack" using simple realloc'ed byte array

Each access to current top flag took a function call + fetch of three data items
+ multiplication and some additions + and then following the resulting pointer.

After the change, it is: fetch pointer value + one byte access via this pointer.

function                                             old     new   delta
bc_parse_startBody                                    45      49      +4
bc_parse_free                                         46      47      +1
zbc_parse_auto                                       188     185      -3
bc_parse_push                                         14      11      -3
bc_vm_run                                            398     394      -4
zbc_vm_process                                        63      58      -5
zdc_parse_expr                                       638     632      -6
zbc_parse_body                                       101      95      -6
bc_parse_addFunc                                      31      25      -6
bc_parse_noElse                                       56      48      -8
zcommon_parse                                        341     331     -10
zbc_parse_else                                       134     123     -11
bc_parse_create                                      124     108     -16
zbc_parse_text_init                                  123     104     -19
zbc_parse_endBody                                    292     252     -40
zbc_parse_stmt                                      1479    1420     -59
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/14 up/down: 5/-196)          Total: -191 bytes
   text    data     bss     dec     hex filename
 979880     485    7296  987661   f120d busybox_old
 979689     485    7296  987470   f114e busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: drop zbc_parse_endBody() bool parameter, move its code to caller which uses it
Denys Vlasenko [Fri, 14 Dec 2018 22:41:33 +0000 (23:41 +0100)]
bc: drop zbc_parse_endBody() bool parameter, move its code to caller which uses it

function                                             old     new   delta
zbc_parse_stmt                                      1456    1479     +23
zbc_parse_body                                       103     101      -2
zbc_parse_endBody                                    326     292     -34
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/2 up/down: 23/-36)            Total: -13 bytes
   text    data     bss     dec     hex filename
 979893     485    7296  987674   f121a busybox_old
 979880     485    7296  987661   f120d busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: shorten one message, make defines more readable
Denys Vlasenko [Fri, 14 Dec 2018 22:32:51 +0000 (23:32 +0100)]
bc: shorten one message, make defines more readable

   text    data     bss     dec     hex filename
 979916     485    7296  987697   f1231 busybox_old
 979893     485    7296  987674   f121a busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>