dc: code shrink
authorDenys Vlasenko <vda.linux@googlemail.com>
Thu, 9 May 2019 13:58:46 +0000 (15:58 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Thu, 9 May 2019 13:58:46 +0000 (15:58 +0200)
function                                             old     new   delta
check_under                                           20      21      +1
print_no_pop                                          32      27      -5
pop                                                   24      18      -6
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/2 up/down: 1/-11)             Total: -10 bytes

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

index 17fdda8fd9e5fbb78b6b4be2cf127e7eba883647..5119c13836e824023092cf035408c702ee973a45 100644 (file)
@@ -35,10 +35,12 @@ enum { STACK_SIZE = (COMMON_BUFSIZE - offsetof(struct globals, stack)) / sizeof(
        base = 10; \
 } while (0)
 
-static void check_under(void)
+static unsigned check_under(void)
 {
-       if (pointer == 0)
+       unsigned p = pointer;
+       if (p == 0)
                bb_error_msg_and_die("stack underflow");
+       return p - 1;
 }
 
 static void push(double a)
@@ -50,8 +52,9 @@ static void push(double a)
 
 static double pop(void)
 {
-       check_under();
-       return stack[--pointer];
+       unsigned p = check_under();
+       pointer = p;
+       return stack[p];
 }
 
 static void add(void)
@@ -91,6 +94,14 @@ static void mod(void)
 {
        data_t d = pop();
 
+       //if (d == 0) {
+       //      bb_error_msg("remainder by zero");
+       //      pop();
+       //      push(0);
+       //      return;
+       //}
+       //^^^^ without this, we simply get SIGFPE and die
+
        push((data_t) pop() % d);
 }
 
@@ -171,8 +182,7 @@ static void print_stack_no_pop(void)
 
 static void print_no_pop(void)
 {
-       check_under();
-       print_base(stack[pointer-1]);
+       print_base(stack[check_under()]);
 }
 
 struct op {