* Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
*/
-#include "busybox.h"
-#include <ctype.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
+#include "libbb.h"
#include <math.h>
/* Tiny RPN calculator, because "expr" didn't give me bitwise operations. */
-static double stack[100];
+enum { STACK_SIZE = COMMON_BUFSIZE / sizeof(double) };
+
+#define stack ((double*)&bb_common_bufsiz1)
static unsigned int pointer;
static unsigned char base;
static void push(double a)
{
- if (pointer >= (sizeof(stack) / sizeof(*stack)))
+ if (pointer >= STACK_SIZE)
bb_error_msg_and_die("stack overflow");
stack[pointer++] = a;
}
static void set_output_base(void)
{
- base=(unsigned char)pop();
+ base = (unsigned char)pop();
if ((base != 10) && (base != 16)) {
- fprintf(stderr, "Error: base = %d is not supported.\n", base);
- base=10;
+ bb_error_msg("error, base %d is not supported", base);
+ base = 10;
}
}
if (base == 16)
printf("%x\n", (unsigned int)print);
else
- printf("%g\n", print);
+ printf("%g\n", print);
}
static void print_stack_no_pop(void)
{
- unsigned int i=pointer;
+ unsigned int i = pointer;
while (i)
print_base(stack[--i]);
}
}
struct op {
- const char *name;
+ const char name[4];
void (*function) (void);
};
{"p", print_no_pop},
{"f", print_stack_no_pop},
{"o", set_output_base},
- {0, 0}
+ {"", 0}
};
static void stack_machine(const char *argument)
return;
}
- while (o->name != 0) {
+ while (o->name[0]) {
if (strcmp(o->name, argument) == 0) {
- (*(o->function)) ();
+ o->function();
return;
}
o++;
*/
static char *get_token(char **buffer)
{
- char *start = NULL;
- char *current = *buffer;
+ char *start = NULL;
+ char *current;
- while (isspace(*current)) { current++; }
+ current = skip_whitespace(*buffer);
if (*current != 0) {
start = current;
- while (!isspace(*current) && *current != 0) { current++; }
+ current = skip_non_whitespace(current);
*buffer = current;
}
return start;
return i;
}
+int dc_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
int dc_main(int argc, char **argv)
{
/* take stuff from stdin if no args are given */
free(line);
}
} else {
- if (*argv[1]=='-')
+ if (*argv[1] == '-')
bb_show_usage();
while (argc >= 2) {
stack_machine(argv[1]);