diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2009-12-30 20:37:08 +0300 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2009-12-30 20:37:08 +0300 |
commit | bd1de181ad9a3486ad35e71272fe2cf21d63916c (patch) | |
tree | 0a20790787deb5f6a47cc5010058985183fccdb3 /miscutils | |
parent | 6879a7ae4393e4a94490e297dbe8b836c6c7dd15 (diff) |
dc: make "dc -1.23 ..." work
function old new delta
stack_machine 97 103 +6
dc_main 121 110 -11
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/2 up/down: 9/-58) Total: -49 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'miscutils')
-rw-r--r-- | miscutils/dc.c | 17 |
1 files changed, 8 insertions, 9 deletions
diff --git a/miscutils/dc.c b/miscutils/dc.c index 3656cddc6..7348ed349 100644 --- a/miscutils/dc.c +++ b/miscutils/dc.c @@ -191,24 +191,21 @@ static void stack_machine(const char *argument) double d; const struct op *o = operators; - if (argument == 0) - return; - d = strtod(argument, &endPointer); - if (endPointer != argument) { + if (endPointer != argument && *endPointer == '\0') { push(d); return; } - while (o->name[0]) { + while (o->function) { if (strcmp(o->name, argument) == 0) { o->function(); return; } o++; } - bb_error_msg_and_die("%s: syntax error", argument); + bb_error_msg_and_die("syntax error at '%s'", argument); } /* return pointer to next token in buffer and set *buffer to one char @@ -239,15 +236,17 @@ int dc_main(int argc UNUSED_PARAM, char **argv) cursor = line; while (1) { token = get_token(&cursor); - if (!token) break; + if (!token) + break; *cursor++ = '\0'; stack_machine(token); } free(line); } } else { - if (argv[0][0] == '-') - bb_show_usage(); + // why? it breaks "dc -2 2 * p" + //if (argv[0][0] == '-') + // bb_show_usage(); do { stack_machine(*argv); } while (*++argv); |