oweals/busybox.git
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>
5 years agobc: pull zbc_lex_next() call out of zbc_parse_operator() into one caller that uses it
Denys Vlasenko [Fri, 14 Dec 2018 22:12:48 +0000 (23:12 +0100)]
bc: pull zbc_lex_next() call out of zbc_parse_operator() into one caller that uses it

function                                             old     new   delta
bc_parse_operator                                      -     144    +144
bc_parse_expr_empty_ok                              1788    1792      +4
zbc_parse_operator                                   170       -    -170
------------------------------------------------------------------------------
(add/remove: 1/1 grow/shrink: 1/0 up/down: 148/-170)          Total: -22 bytes
   text    data     bss     dec     hex filename
 979938     485    7296  987719   f1247 busybox_old
 979916     485    7296  987697   f1231 busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobx: add more debug scaffolding
Denys Vlasenko [Fri, 14 Dec 2018 22:00:24 +0000 (23:00 +0100)]
bx: add more debug scaffolding

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: convert macro bc_parse_push() to function, add debug infrastructure
Denys Vlasenko [Fri, 14 Dec 2018 16:51:17 +0000 (17:51 +0100)]
bc: convert macro bc_parse_push() to function, add debug infrastructure

function                                             old     new   delta
bc_parse_push                                          -      14     +14
zbc_parse_else                                       132     134      +2
bc_parse_pushName                                     63      61      -2
zbc_parse_operator                                   174     170      -4
bc_parse_number                                       87      83      -4
zbc_parse_string                                      97      89      -8
bc_parse_pushIndex                                    68      60      -8
zbc_parse_endBody                                    339     326     -13
zbc_parse_name                                       401     387     -14
zdc_parse_mem                                        107      91     -16
zdc_parse_expr                                       680     638     -42
zbc_parse_stmt                                      1502    1456     -46
bc_parse_expr_empty_ok                              1838    1788     -50
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 1/11 up/down: 16/-207)         Total: -191 bytes
   text    data     bss     dec     hex filename
 980129     485    7296  987910   f1306 busybox_old
 979938     485    7296  987719   f1247 busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: rename zbc_parse_text() to ..._init(), reuse existing code for library parsing
Denys Vlasenko [Fri, 14 Dec 2018 16:01:56 +0000 (17:01 +0100)]
bc: rename zbc_parse_text() to ..._init(), reuse existing code for library parsing

function                                             old     new   delta
zbc_parse_text_init                                    -     123    +123
bc_vm_run                                            423     398     -25
zbc_parse_text                                       123       -    -123
------------------------------------------------------------------------------
(add/remove: 1/1 grow/shrink: 0/1 up/down: 123/-148)          Total: -25 bytes
   text    data     bss     dec     hex filename
 980154     485    7296  987935   f131f busybox_old
 980129     485    7296  987910   f1306 busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: compress two constant arguments of bc_lex_assign() to one
Denys Vlasenko [Fri, 14 Dec 2018 15:48:34 +0000 (16:48 +0100)]
bc: compress two constant arguments of bc_lex_assign() to one

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>
5 years agobc: remove stale comment, empty lines, regularize comment style
Denys Vlasenko [Fri, 14 Dec 2018 15:30:56 +0000 (16:30 +0100)]
bc: remove stale comment, empty lines, regularize comment style

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: tweak bc_num_parseDecimal() for readability, logic is not changed
Denys Vlasenko [Fri, 14 Dec 2018 15:24:01 +0000 (16:24 +0100)]
bc: tweak bc_num_parseDecimal() for readability, logic is not changed

function                                             old     new   delta
zbc_program_num                                      836     835      -1

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: shrink s() in library again
Denys Vlasenko [Fri, 14 Dec 2018 10:27:09 +0000 (11:27 +0100)]
bc: shrink s() in library again

function                                             old     new   delta
bc_lib                                              1596    1586     -10
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-10)             Total: -10 bytes
   text    data     bss     dec     hex filename
 980152     485    7296  987933   f131d busybox_old
 980142     485    7296  987923   f1313 busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: yet another library shrink
Denys Vlasenko [Fri, 14 Dec 2018 10:00:23 +0000 (11:00 +0100)]
bc: yet another library shrink

function                                             old     new   delta
bc_lib                                              1604    1596      -8
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-8)               Total: -8 bytes
   text    data     bss     dec     hex filename
 980160     485    7296  987941   f1325 busybox_old
 980152     485    7296  987933   f131d busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: shrink internal library yet more
Denys Vlasenko [Fri, 14 Dec 2018 09:10:37 +0000 (10:10 +0100)]
bc: shrink internal library yet more

function                                             old     new   delta
bc_lib                                              1609    1604      -5
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-5)               Total: -5 bytes
   text    data     bss     dec     hex filename
 980165     485    7296  987946   f132a busybox_old
 980160     485    7296  987941   f1325 busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: shrink internal library more
Denys Vlasenko [Fri, 14 Dec 2018 08:53:50 +0000 (09:53 +0100)]
bc: shrink internal library more

function                                             old     new   delta
bc_lib                                              1618    1609      -9

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: shrink internal library
Denys Vlasenko [Fri, 14 Dec 2018 00:01:01 +0000 (01:01 +0100)]
bc: shrink internal library

function                                             old     new   delta
bc_lib                                              1674    1618     -56

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: group ENABLE_BC code a bit better, no logic changes
Denys Vlasenko [Thu, 13 Dec 2018 23:12:13 +0000 (00:12 +0100)]
bc: group ENABLE_BC code a bit better, no logic changes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: fix "dc only" bug
Denys Vlasenko [Thu, 13 Dec 2018 21:49:59 +0000 (22:49 +0100)]
bc: fix "dc only" bug

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: unbreak "only bc" and "only dc" configs
Denys Vlasenko [Thu, 13 Dec 2018 21:25:28 +0000 (22:25 +0100)]
bc: unbreak "only bc" and "only dc" configs

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: simplify bc_lex_whitespace()
Denys Vlasenko [Thu, 13 Dec 2018 20:31:29 +0000 (21:31 +0100)]
bc: simplify bc_lex_whitespace()

function                                             old     new   delta
bc_lex_whitespace                                     52      41     -11

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: G.sbgn and G.send are unused, remove them
Denys Vlasenko [Thu, 13 Dec 2018 20:17:43 +0000 (21:17 +0100)]
bc: G.sbgn and G.send are unused, remove them

function                                             old     new   delta
bc_program_index                                      66      64      -2
bc_parse_expr_empty_ok                              1840    1838      -2
dc_main                                              176     168      -8
bc_main                                               73      65      -8
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/4 up/down: 0/-20)             Total: -20 bytes
   text    data     bss     dec     hex filename
 980327     485    7296  988108   f13cc busybox_old
 980307     485    7296  988088   f13b8 busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: simplify filename saving in zbc_vm_file()
Denys Vlasenko [Thu, 13 Dec 2018 18:58:58 +0000 (19:58 +0100)]
bc: simplify filename saving in zbc_vm_file()

function                                             old     new   delta
bc_vm_run                                            433     423     -10
zbc_vm_file                                          187     174     -13
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/2 up/down: 0/-23)             Total: -23 bytes
   text    data     bss     dec     hex filename
 980350     485    7296  988131   f13e3 busybox_old
 980327     485    7296  988108   f13cc busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: do not append duplicate NUL, reduce indentation in bc_read_line()
Denys Vlasenko [Thu, 13 Dec 2018 18:28:41 +0000 (19:28 +0100)]
bc: do not append duplicate NUL, reduce indentation in bc_read_line()

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: change bc_read_line() and zbc_vm_stdin() to avoid double buffers
Denys Vlasenko [Thu, 13 Dec 2018 18:23:45 +0000 (19:23 +0100)]
bc: change bc_read_line() and zbc_vm_stdin() to avoid double buffers

function                                             old     new   delta
bc_read_line                                         129     124      -5
bc_vm_run                                            523     433     -90
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/2 up/down: 0/-95)             Total: -95 bytes
   text    data     bss     dec     hex filename
 980445     485    7296  988226   f1442 busybox_old
 980350     485    7296  988131   f13e3 busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: further simplification in zbc_vm_stdin()
Denys Vlasenko [Thu, 13 Dec 2018 17:16:39 +0000 (18:16 +0100)]
bc: further simplification in zbc_vm_stdin()

function                                             old     new   delta
bc_vm_run                                            500     523     +23
bc_vec_concat                                         66       -     -66
------------------------------------------------------------------------------
(add/remove: 0/1 grow/shrink: 1/0 up/down: 23/-66)            Total: -43 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: fix another thinko
Denys Vlasenko [Thu, 13 Dec 2018 16:56:35 +0000 (17:56 +0100)]
bc: fix another thinko

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: fix a thinko: dc uses [] string delimiters, bot bc!
Denys Vlasenko [Thu, 13 Dec 2018 16:46:26 +0000 (17:46 +0100)]
bc: fix a thinko: dc uses [] string delimiters, bot bc!

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: fix comment handling
Denys Vlasenko [Thu, 13 Dec 2018 16:23:24 +0000 (17:23 +0100)]
bc: fix comment handling

function                                             old     new   delta
bc_vm_run                                            514     513      -1

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: further zbc_vm_stdin() optimizations
Denys Vlasenko [Thu, 13 Dec 2018 16:36:41 +0000 (17:36 +0100)]
bc: further zbc_vm_stdin() optimizations

function                                             old     new   delta
bc_vm_run                                            534     514     -20

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: shrink zbc_vm_stdin()
Denys Vlasenko [Thu, 13 Dec 2018 15:59:24 +0000 (16:59 +0100)]
bc: shrink zbc_vm_stdin()

function                                             old     new   delta
bc_vm_run                                            592     534     -58

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: trim config help text, add a few comments, no code changes
Denys Vlasenko [Thu, 13 Dec 2018 15:35:52 +0000 (16:35 +0100)]
bc: trim config help text, add a few comments, no code changes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: unbreak CONFIG_FEATURE_BC_SIGNALS=y config
Denys Vlasenko [Wed, 12 Dec 2018 22:25:13 +0000 (23:25 +0100)]
bc: unbreak CONFIG_FEATURE_BC_SIGNALS=y config

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: remove lexer function pointer
Denys Vlasenko [Wed, 12 Dec 2018 22:10:08 +0000 (23:10 +0100)]
bc: remove lexer function pointer

function                                             old     new   delta
zbc_lex_next                                          81    1930   +1849
bc_parse_create                                      131     124      -7
common_parse_init                                     31       -     -31
zdc_lex_token                                        672       -    -672
zbc_lex_token                                       1193       -   -1193
------------------------------------------------------------------------------
(add/remove: 0/3 grow/shrink: 1/1 up/down: 1849/-1903)        Total: -54 bytes
   text    data     bss     dec     hex filename
 980634     485    7296  988415   f14ff busybox_old
 980580     485    7296  988361   f14c9 busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: remove parse function pointer
Denys Vlasenko [Wed, 12 Dec 2018 22:03:10 +0000 (23:03 +0100)]
bc: remove parse function pointer

function                                             old     new   delta
zbc_program_asciify                                    -     372    +372
zcommon_parse                                          -     341    +341
zbc_program_printStream                                -     141    +141
zbc_program_pushArray                                  -     111    +111
zbc_program_nquit                                      -      92     +92
zbc_vm_process                                        61      63      +2
zbc_parse_text                                       122     123      +1
bc_vm_run                                            591     592      +1
zdc_parse_mem                                        108     107      -1
zbc_parse_operator                                   175     174      -1
zbc_parse_else                                       133     132      -1
zbc_parse_body                                       104     103      -1
zbc_program_read                                     261     259      -2
zdc_parse_register                                    40      37      -3
zbc_parse_string                                     100      97      -3
zbc_parse_endBody                                    343     339      -4
zdc_parse_expr                                       688     680      -8
zbc_parse_auto                                       198     188     -10
zbc_parse_name                                       414     401     -13
common_parse_init                                     45      31     -14
zdc_parse_parse                                       23       -     -23
bc_parse_create                                      158     131     -27
zbc_parse_stmt                                      1540    1502     -38
bc_parse_expr_empty_ok                              1882    1840     -42
zbc_program_exec                                    3963    3837    -126
zbc_parse_parse                                      311       -    -311
zbc_program_modexp                                   556       -    -556
------------------------------------------------------------------------------
(add/remove: 5/3 grow/shrink: 3/16 up/down: 1061/-1184)      Total: -123 bytes
   text    data     bss     dec     hex filename
 980757     485    7296  988538   f157a busybox_old
 980634     485    7296  988415   f14ff busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: convert two more functions to "z" logic
Denys Vlasenko [Wed, 12 Dec 2018 21:48:19 +0000 (22:48 +0100)]
bc: convert two more functions to "z" logic

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: remove BC_STATUS_EOF (again), the condition is detectable as len==0
Denys Vlasenko [Wed, 12 Dec 2018 21:43:58 +0000 (22:43 +0100)]
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>
5 years agodc: fix EOF handling in case of last line being incomplete
Denys Vlasenko [Wed, 12 Dec 2018 20:56:06 +0000 (21:56 +0100)]
dc: fix EOF handling in case of last line being incomplete

This wasn't working correctly:

$ echo -ne '10 20+p' | dc
30

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agotestsuite: add bc and dc tests
Denys Vlasenko [Wed, 12 Dec 2018 20:41:40 +0000 (21:41 +0100)]
testsuite: add bc and dc tests

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: further conversions to "z" logic
Denys Vlasenko [Wed, 12 Dec 2018 20:39:10 +0000 (21:39 +0100)]
bc: further conversions to "z" logic

function                                             old     new   delta
bc_program_exec                                     3876       -   -3876
zbc_program_exec                                       -    3963   +3963
bc_program_execStr                                   429       -    -429
zbc_program_execStr                                    -     427    +427
bc_vm_file                                           197       -    -197
zbc_vm_file                                            -     187    +187
bc_vm_process                                         74       -     -74
zbc_vm_process                                         -      61     +61
bc_parse_pushIndex                                    66      68      +2
bc_vm_run                                            624     618      -6
dc_main                                              187     176     -11
bc_program_reset                                      64       -     -64
zbc_program_pushArray                                111       -    -111
------------------------------------------------------------------------------
(add/remove: 4/6 grow/shrink: 1/2 up/down: 4640/-4768)       Total: -128 bytes
   text    data     bss     dec     hex filename
 980922     485    7296  988703   f161f busybox_old
 980794     485    7296  988575   f159f busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: optimize bc_parse_pushIndex()
Denys Vlasenko [Wed, 12 Dec 2018 15:44:34 +0000 (16:44 +0100)]
bc: optimize bc_parse_pushIndex()

function                                             old     new   delta
bc_parse_pushIndex                                    80      68     -12

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: convert even more of lexer functions to "z" convention
Denys Vlasenko [Wed, 12 Dec 2018 15:08:46 +0000 (16:08 +0100)]
bc: convert even more of lexer functions to "z" convention

function                                             old     new   delta
bc_parse_name                                        416       -    -416
zbc_parse_name                                         -     414    +414
bc_parse_parse                                       305       -    -305
zbc_parse_parse                                        -     311    +311
bc_program_read                                      271       -    -271
zbc_program_read                                       -     261    +261
bc_parse_text                                        129       -    -129
zbc_parse_text                                         -     122    +122
dc_parse_parse                                        26       -     -26
zdc_parse_parse                                        -      23     +23
bc_program_index                                      66      64      -2
bc_vm_process                                         92      74     -18
bc_program_execStr                                   460     429     -31
bc_parse_expr_empty_ok                              1939    1882     -57
------------------------------------------------------------------------------
(add/remove: 5/5 grow/shrink: 0/4 up/down: 1131/-1255)       Total: -124 bytes
   text    data     bss     dec     hex filename
 981058     485    7296  988839   f16a7 busybox_old
 980934     485    7296  988715   f162b busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: convert even more of lexer functions to "z" convention
Denys Vlasenko [Wed, 12 Dec 2018 14:19:54 +0000 (15:19 +0100)]
bc: convert even more of lexer functions to "z" convention

function                                             old     new   delta
bc_parse_stmt                                       1594       -   -1594
zbc_parse_stmt                                         -    1540   +1540
common_parse_expr                                     43       -     -43
zcommon_parse_expr                                     -      40     +40
bc_parse_expr                                         24       -     -24
zbc_parse_expr                                         -      24     +24
zbc_parse_body                                       108     104      -4
bc_program_read                                      277     271      -6
bc_program_execStr                                   468     460      -8
bc_parse_expr_empty_ok                              1955    1939     -16
bc_parse_name                                        451     416     -35
bc_parse_parse                                       476     305    -171
------------------------------------------------------------------------------
(add/remove: 3/3 grow/shrink: 0/6 up/down: 1604/-1901)       Total: -297 bytes
   text    data     bss     dec     hex filename
 981355     485    7296  989136   f17d0 busybox_old
 981058     485    7296  988839   f16a7 busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: convert more of lexer functions to "z" convention
Denys Vlasenko [Wed, 12 Dec 2018 13:54:38 +0000 (14:54 +0100)]
bc: convert more of lexer functions to "z" convention

function                                             old     new   delta
dc_parse_expr                                        748       -    -748
zdc_parse_expr                                         -     688    +688
bc_parse_endBody                                     338       -    -338
zbc_parse_endBody                                      -     343    +343
bc_parse_auto                                        201       -    -201
zbc_parse_auto                                         -     198    +198
dc_parse_mem                                         115       -    -115
zdc_parse_mem                                          -     108    +108
bc_parse_body                                        116       -    -116
zbc_parse_body                                         -     108    +108
bc_parse_string                                      102       -    -102
zbc_parse_string                                       -     100    +100
dc_parse_register                                     43       -     -43
zdc_parse_register                                     -      40     +40
common_parse_expr                                     40      43      +3
bc_parse_parse                                       321     476    +155
bc_parse_stmt                                       1598    1594      -4
dc_parse_parse                                        44      26     -18
bc_parse_reset                                       153       -    -153
------------------------------------------------------------------------------
(add/remove: 7/8 grow/shrink: 2/2 up/down: 1743/-1838)        Total: -95 bytes
   text    data     bss     dec     hex filename
 981450     485    7296  989231   f182f busybox_old
 981355     485    7296  989136   f17d0 busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: partially convert lexer functions to "z" convention
Denys Vlasenko [Wed, 12 Dec 2018 12:58:55 +0000 (13:58 +0100)]
bc: partially convert lexer functions to "z" convention

function                                             old     new   delta
bc_lex_token                                        1228       -   -1228
zbc_lex_token                                          -    1193   +1193
dc_lex_token                                         674       -    -674
zdc_lex_token                                          -     672    +672
bc_parse_operator                                    177       -    -177
zbc_parse_operator                                     -     175    +175
bc_parse_else                                        133       -    -133
zbc_parse_else                                         -     133    +133
bc_lex_next                                           91       -     -91
zbc_lex_next                                           -      81     +81
dc_parse_expr                                        744     748      +4
bc_parse_string                                      100     102      +2
bc_parse_body                                        114     116      +2
dc_parse_mem                                         116     115      -1
bc_parse_text                                        130     129      -1
dc_parse_register                                     51      43      -8
bc_parse_endBody                                     358     338     -20
bc_parse_name                                        513     451     -62
bc_parse_auto                                        265     201     -64
bc_parse_expr_empty_ok                              2032    1955     -77
bc_parse_parse                                       417     321     -96
bc_parse_stmt                                       1753    1598    -155
------------------------------------------------------------------------------
(add/remove: 5/5 grow/shrink: 3/9 up/down: 2262/-2787)       Total: -525 bytes
   text    data     bss     dec     hex filename
 981975     485    7296  989756   f1a3c busybox_old
 981450     485    7296  989231   f182f busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: code shrink in bc_num_cmp()
Denys Vlasenko [Wed, 12 Dec 2018 10:51:32 +0000 (11:51 +0100)]
bc: code shrink in bc_num_cmp()

function                                             old     new   delta
bc_num_cmp                                           275     231     -44

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: simplify zbc_program_logical()
Denys Vlasenko [Tue, 11 Dec 2018 23:50:23 +0000 (00:50 +0100)]
bc: simplify zbc_program_logical()

function                                             old     new   delta
bc_program_exec                                     3918    3876     -42
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-42)             Total: -42 bytes
   text    data     bss     dec     hex filename
 982061     485    7296  989842   f1a92 busybox_old
 982019     485    7296  989800   f1a68 busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: simplify nested read() check
Denys Vlasenko [Tue, 11 Dec 2018 23:29:24 +0000 (00:29 +0100)]
bc: simplify nested read() check

function                                             old     new   delta
bc_vm_run                                            622     624      +2
dc_main                                              186     187      +1
bc_main                                               72      73      +1
bc_program_read                                      312     277     -35
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 3/1 up/down: 4/-35)             Total: -31 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: in non-interactive config, POSIX error functions never return nonzero
Denys Vlasenko [Tue, 11 Dec 2018 22:50:14 +0000 (23:50 +0100)]
bc: in non-interactive config, POSIX error functions never return nonzero

function                                             old     new   delta
bc_parse_expr_empty_ok                              2036    2032      -4
bc_parse_stmt                                       1767    1753     -14
bc_lex_token                                        1259    1228     -31
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/3 up/down: 0/-49)             Total: -49 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: use common_parse_init() in bc_vm_init()
Denys Vlasenko [Tue, 11 Dec 2018 22:22:52 +0000 (23:22 +0100)]
bc: use common_parse_init() in bc_vm_init()

function                                             old     new   delta
common_parse_init                                     26      45     +19
dc_parse_init                                         17       -     -17
bc_parse_init                                         17       -     -17
bc_vm_init                                           744     725     -19
------------------------------------------------------------------------------
(add/remove: 0/2 grow/shrink: 1/1 up/down: 19/-53)            Total: -34 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: fix EOF handling in bc_program_read()
Denys Vlasenko [Tue, 11 Dec 2018 21:26:38 +0000 (22:26 +0100)]
bc: fix EOF handling in bc_program_read()

$ bc -q
read()
2^D^D2
     ^ prints the result of read()'ed expression

function                                             old     new   delta
zbc_program_print                                    629     642     +13
bc_program_read                                      322     312     -10
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/1 up/down: 13/-10)              Total: 3 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: tweak comment
Denys Vlasenko [Tue, 11 Dec 2018 20:21:14 +0000 (21:21 +0100)]
bc: tweak comment

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: convert bc_program_asciify to "z" function
Denys Vlasenko [Tue, 11 Dec 2018 19:57:53 +0000 (20:57 +0100)]
bc: convert bc_program_asciify to "z" function

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

function                                             old     new   delta
zbc_program_print                                    665     642     -23

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: convert zbc_program_op to "z" function, fix a thinko in prev commits
Denys Vlasenko [Tue, 11 Dec 2018 18:42:05 +0000 (19:42 +0100)]
bc: convert zbc_program_op to "z" function, fix a thinko in prev commits

function                                             old     new   delta
zbc_program_assign                                   448     447      -1

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: convert bc_program_logical to "z" function
Denys Vlasenko [Tue, 11 Dec 2018 18:37:00 +0000 (19:37 +0100)]
bc: convert bc_program_logical to "z" function

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: do not use "(cond ? f1 : f2)(params)" idiom, it messes up static function optimiz...
Denys Vlasenko [Tue, 11 Dec 2018 18:29:35 +0000 (19:29 +0100)]
bc: do not use "(cond ? f1 : f2)(params)" idiom, it messes up static function optimizations

With direct calls, GCC no longer thinks that we take addresses of the functions,
and can use "more optimal" internal ABI for _all_ calls to these functions,
not only at this callsite. On i486, regparm is used, and:

function                                             old     new   delta
zbc_num_inv                                           56      57      +1
zbc_num_k                                            852     851      -1
zbc_program_modexp                                   558     556      -2
zbc_num_d                                            541     539      -2
bc_num_ulong2num                                      59      57      -2
zbc_program_num                                      840     836      -4
bc_num_zero                                           11       7      -4
bc_num_one                                            28      24      -4
bc_program_exec                                     3928    3918     -10
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/8 up/down: 1/-29)             Total: -28 bytes
   text    data     bss     dec     hex filename
 982237     485    7296  990018   f1b42 busybox_old
 982209     485    7296  989990   f1b26 busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: convert arithmetic calc functions to "z" logic
Denys Vlasenko [Tue, 11 Dec 2018 18:04:44 +0000 (19:04 +0100)]
bc: convert arithmetic calc functions to "z" logic

In order for magic macros to work, a bit of reordering was necessary.

function                                             old     new   delta
zbc_program_modexp                                     -     558    +558
zbc_program_assign                                     -     448    +448
zbc_program_pushArray                                  -     111    +111
zbc_num_s                                            239     237      -2
zbc_num_d                                            543     541      -2
zbc_num_binary                                       145     143      -2
zbc_num_a                                            443     441      -2
zbc_num_rem                                           95      91      -4
zbc_num_divmod                                       150     146      -4
zbc_num_m                                            269     257     -12
zbc_num_r                                            230     208     -22
zbc_num_printNum                                     447     417     -30
bc_program_exec                                     3960    3928     -32
zbc_num_p                                            434     399     -35
zbc_program_num                                      880     840     -40
zbc_num_k                                            913     852     -61
zbc_program_printStream                              141       -    -141
bc_program_assign                                    455       -    -455
bc_program_modexp                                    668       -    -668
------------------------------------------------------------------------------
(add/remove: 3/3 grow/shrink: 0/13 up/down: 1117/-1512)      Total: -395 bytes
   text    data     bss     dec     hex filename
 982632     485    7296  990413   f1ccd busybox_old
 982237     485    7296  990018   f1b42 busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: rename arithmetic calc functions to "z" functions, no code changes
Denys Vlasenko [Tue, 11 Dec 2018 18:12:13 +0000 (19:12 +0100)]
bc: rename arithmetic calc functions to "z" functions, no code changes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: move declarations around, no code changes
Denys Vlasenko [Tue, 11 Dec 2018 16:56:09 +0000 (17:56 +0100)]
bc: move declarations around, no code changes

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

function                                             old     new   delta
zbc_lex_number                                       279     190     -89

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: make bc_program_pushVar "z-function"
Denys Vlasenko [Tue, 11 Dec 2018 14:45:15 +0000 (15:45 +0100)]
bc: make bc_program_pushVar "z-function"

function                                             old     new   delta
bc_program_pushVar                                   200     198      -2

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: improve "noninteractive" macro machinery so that even "return zero" code is not...
Denys Vlasenko [Tue, 11 Dec 2018 14:29:32 +0000 (15:29 +0100)]
bc: improve "noninteractive" macro machinery so that even "return zero" code is not generated

Most affected functions shrink by 2 bytes on x86.

function                                             old     new   delta
zbc_program_num                                        -     880    +880
zbc_program_print                                      -     665    +665
zbc_num_printNum                                       -     447    +447
zbc_program_call                                       -     323    +323
zbc_program_copyToVar                                  -     287    +287
zbc_lex_number                                         -     279    +279
zbc_program_binOpPrep                                  -     269    +269
zbc_program_assignStr                                  -     142    +142
zbc_program_printStream                                -     141    +141
zbc_func_insert                                        -      93     +93
zbc_num_ulong                                          -      88     +88
zbc_program_prep                                       -      79     +79
zbc_num_shift                                          -      53     +53
bc_num_shift                                          54       -     -54
bc_program_prep                                       81       -     -81
bc_num_ulong                                          90       -     -90
bc_func_insert                                        95       -     -95
bc_program_printStream                               143       -    -143
bc_program_assignStr                                 144       -    -144
bc_program_binOpPrep                                 271       -    -271
bc_lex_number                                        281       -    -281
bc_program_copyToVar                                 289       -    -289
bc_program_call                                      325       -    -325
bc_num_printNum                                      471       -    -471
bc_program_print                                     667       -    -667
bc_program_num                                       880       -    -880
------------------------------------------------------------------------------
(add/remove: 13/13 grow/shrink: 0/0 up/down: 3746/-3791)      Total: -45 bytes
   text    data     bss     dec     hex filename
 982779     485    7296  990560   f1d60 busybox_old
 982734     485    7296  990515   f1d33 busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: it's not clear bc_vm_file() always exits on errors, remove ERRORS_ARE_FATAL
Denys Vlasenko [Mon, 10 Dec 2018 19:56:08 +0000 (20:56 +0100)]
bc: it's not clear bc_vm_file() always exits on errors, remove ERRORS_ARE_FATAL

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: more ERRORS_ARE_FATAL annotations
Denys Vlasenko [Mon, 10 Dec 2018 19:41:05 +0000 (20:41 +0100)]
bc: more ERRORS_ARE_FATAL annotations

function                                             old     new   delta
bc_program_exec                                     3920    3969     +49
bc_program_call                                      329     325      -4
bc_vm_run                                            622     616      -6
bc_program_modexp                                    677     668      -9
bc_program_assign                                    471     455     -16
bc_program_pushArray                                 113       -    -113
------------------------------------------------------------------------------
(add/remove: 0/1 grow/shrink: 1/4 up/down: 49/-148)           Total: -99 bytes
   text    data     bss     dec     hex filename
 982872     485    7296  990653   f1dbd busybox_old
 982773     485    7296  990554   f1d5a busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: stop checking for name length in bc_lex_name()
Denys Vlasenko [Mon, 10 Dec 2018 19:26:04 +0000 (20:26 +0100)]
bc: stop checking for name length in bc_lex_name()

Gigabyte-long names are not a practical concern.

function                                             old     new   delta
bc_lex_name                                           73      69      -4
bc_lex_token                                        1266    1259      -7
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/2 up/down: 0/-11)             Total: -11 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: optimize non-interactive config: we know that many functions always succeed
Denys Vlasenko [Mon, 10 Dec 2018 19:17:24 +0000 (20:17 +0100)]
bc: optimize non-interactive config: we know that many functions always succeed

function                                             old     new   delta
bc_program_assign                                    475     471      -4
bc_program_prep                                       87      81      -6
bc_parse_parse                                       423     417      -6
bc_num_p                                             440     434      -6
bc_program_printStream                               153     143     -10
bc_program_execStr                                   478     468     -10
bc_parse_auto                                        275     265     -10
bc_num_k                                             925     913     -12
bc_program_copyToVar                                 307     289     -18
bc_program_binOpPrep                                 289     271     -18
bc_num_printNum                                      489     471     -18
bc_num_m                                             287     269     -18
bc_program_pushArray                                 139     113     -26
bc_program_modexp                                    707     677     -30
bc_program_print                                     704     667     -37
bc_program_exec                                     4010    3920     -90
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/16 up/down: 0/-319)          Total: -319 bytes
   text    data     bss     dec     hex filename
 983202     485    7296  990983   f1f07 busybox_old
 982883     485    7296  990664   f1dc8 busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: in non-interactive config, let compiler know that error funcs do not return
Denys Vlasenko [Mon, 10 Dec 2018 18:46:53 +0000 (19:46 +0100)]
bc: in non-interactive config, let compiler know that error funcs do not return

function                                             old     new   delta
bc_num_s                                             235     239      +4
bc_lex_next                                           92      91      -1
dc_parse_register                                     53      51      -2
dc_parse_parse                                        46      44      -2
bc_vm_run                                            624     622      -2
bc_program_assignStr                                 146     144      -2
bc_parse_else                                        135     133      -2
bc_parse_body                                        116     114      -2
bc_num_a                                             445     443      -2
bc_func_insert                                        97      95      -2
bc_program_pushVar                                   203     200      -3
bc_parse_text                                        133     130      -3
bc_error_bad_character                                17      14      -3
bc_error                                              14      11      -3
bc_program_printStream                               157     153      -4
bc_program_prep                                       91      87      -4
bc_program_copyToVar                                 311     307      -4
bc_num_ulong                                          95      90      -5
bc_num_p                                             445     440      -5
bc_program_print                                     711     704      -7
bc_parse_endBody                                     365     358      -7
bc_num_r                                             237     230      -7
bc_num_d                                             550     543      -7
dc_lex_token                                         682     674      -8
bc_program_pushArray                                 147     139      -8
bc_program_assign                                    485     475     -10
bc_program_read                                      333     322     -11
bc_lex_token                                        1278    1266     -12
bc_parse_stmt                                       1780    1767     -13
bc_program_modexp                                    723     707     -16
dc_parse_expr                                        762     744     -18
bc_program_execStr                                   496     478     -18
bc_program_call                                      347     329     -18
bc_vm_file                                           219     197     -22
bc_program_binOpPrep                                 311     289     -22
bc_parse_name                                        539     513     -26
bc_parse_parse                                       451     423     -28
bc_program_num                                       912     880     -32
bc_read_line                                         172     139     -33
bc_program_exec                                     4048    4010     -38
bc_parse_auto                                        313     275     -38
bc_parse_expr_empty_ok                              2095    2036     -59
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/41 up/down: 4/-509)          Total: -505 bytes
   text    data     bss     dec     hex filename
 983707     485    7296  991488   f2100 busybox_old
 983202     485    7296  990983   f1f07 busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agotls: prepare for ECDH_anon ciphers
Denys Vlasenko [Mon, 10 Dec 2018 18:19:38 +0000 (19:19 +0100)]
tls: prepare for ECDH_anon ciphers

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agotls: fix a potential (currently "disabled" by a macro) SHA1-related bug
Denys Vlasenko [Mon, 10 Dec 2018 17:49:29 +0000 (18:49 +0100)]
tls: fix a potential (currently "disabled" by a macro) SHA1-related bug

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agotls: if !ENABLE_FEATURE_TLS_SHA1, tls->MAC_size is always SHA256_OUTSIZE for AES-CBC
Denys Vlasenko [Mon, 10 Dec 2018 15:43:53 +0000 (16:43 +0100)]
tls: if !ENABLE_FEATURE_TLS_SHA1, tls->MAC_size is always SHA256_OUTSIZE for AES-CBC

function                                             old     new   delta
tls_xread_record                                     634     636      +2
xwrite_encrypted                                     579     580      +1
tls_handshake                                       2095    2085     -10
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/1 up/down: 3/-10)              Total: -7 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agotls: introduce FEATURE_TLS_SHA1 to make SHA1 code optional
Denys Vlasenko [Mon, 10 Dec 2018 15:14:58 +0000 (16:14 +0100)]
tls: introduce FEATURE_TLS_SHA1 to make SHA1 code optional

When disabled:

function                                             old     new   delta
xwrite_encrypted                                     580     579      -1
prf_hmac_sha256                                      222     217      -5
hmac_begin                                           158     149      -9
static.ciphers                                        32      20     -12
tls_handshake                                       2115    2095     -20
hmac                                                  87      61     -26
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/6 up/down: 0/-73)             Total: -73 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: simplify bc_num_parseDecimal() further
Denys Vlasenko [Mon, 10 Dec 2018 14:38:52 +0000 (15:38 +0100)]
bc: simplify bc_num_parseDecimal() further

function                                             old     new   delta
bc_program_num                                       925     912     -13

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: make all function pointers FAST_FUNC, on i486 this saves ~400 bytes
Denys Vlasenko [Mon, 10 Dec 2018 14:37:14 +0000 (15:37 +0100)]
bc: make all function pointers FAST_FUNC, on i486 this saves ~400 bytes

function                                             old     new   delta
bc_num_rem                                            91      95      +4
bc_num_inv                                            53      56      +3
bc_num_d                                             569     572      +3
bc_num_printDigits                                   136     137      +1
bc_program_assign                                    486     485      -1
dc_lex_token                                         684     682      -2
bc_vec_pop                                            27      25      -2
bc_vec_npop                                           55      53      -2
bc_program_read                                      335     333      -2
bc_program_print                                     713     711      -2
bc_parse_parse                                       462     460      -2
bc_lex_token                                        1280    1278      -2
bc_num_printChar                                      27      24      -3
bc_num_binary                                        150     147      -3
dc_parse_parse                                        59      55      -4
bc_vm_run                                            630     626      -4
bc_num_printHex                                       71      67      -4
bc_num_divmod                                        155     150      -5
bc_vec_free                                           24      18      -6
bc_string_free                                        15       9      -6
bc_num_free                                           15       9      -6
bc_id_free                                            15       9      -6
bc_parse_free                                         53      46      -7
bc_program_scale                                       8       -      -8
bc_num_r                                             245     237      -8
bc_func_free                                          35      27      -8
bc_result_free                                        57      46     -11
bc_num_a                                             454     443     -11
bc_num_sub                                            77      65     -12
bc_num_add                                            77      65     -12
bc_program_modexp                                    736     723     -13
bc_num_s                                             252     239     -13
bc_num_mul                                            62      49     -13
bc_num_mod                                            62      49     -13
bc_num_div                                            62      49     -13
bc_num_pow                                            47      31     -16
bc_program_exec                                     4081    4059     -22
bc_num_printNum                                      514     489     -25
bc_num_p                                             478     445     -33
bc_program_len                                        34       -     -34
bc_program_num                                       963     925     -38
bc_num_k                                             988     944     -44
------------------------------------------------------------------------------
(add/remove: 0/2 grow/shrink: 4/36 up/down: 11/-416)         Total: -405 bytes
   text    data     bss     dec     hex filename
 984536     485    7296  992317   f243d busybox_old
 984131     485    7296  991912   f22a8 busybox_unstripped

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: 0xffffffffffffffff may be larger than unsigned long
Denys Vlasenko [Mon, 10 Dec 2018 14:15:42 +0000 (15:15 +0100)]
bc: 0xffffffffffffffff may be larger than unsigned long

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
5 years agobc: optimize bc_vec_concat()
Denys Vlasenko [Mon, 10 Dec 2018 14:12:58 +0000 (15:12 +0100)]
bc: optimize bc_vec_concat()

function                                             old     new   delta
bc_vec_concat                                         71      66      -5

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