diff options
Diffstat (limited to 'tools/mpicalc.c')
-rw-r--r-- | tools/mpicalc.c | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/tools/mpicalc.c b/tools/mpicalc.c index 22af505ac..95ab47c29 100644 --- a/tools/mpicalc.c +++ b/tools/mpicalc.c @@ -131,6 +131,18 @@ do_mul(void) } static void +do_mulm(void) +{ + if( stackidx < 3 ) { + fputs("stack underflow\n", stderr); + return; + } + mpi_mulm( stack[stackidx-3], stack[stackidx-3], + stack[stackidx-2], stack[stackidx-1] ); + stackidx -= 2; +} + +static void do_div(void) { if( stackidx < 2 ) { @@ -237,7 +249,7 @@ main(int argc, char **argv) while( (c=getc(stdin)) != EOF ) { if( !state ) { /* waiting */ - if( isdigit(c) || (c >='A' && c <= 'F') ) { + if( isdigit(c) ) { state = 1; ungetc(c, stdin); strbuf[0] = '0'; @@ -275,6 +287,9 @@ main(int argc, char **argv) case '*': do_mul(); break; + case 'm': + do_mulm(); + break; case '/': do_div(); break; @@ -338,7 +353,7 @@ main(int argc, char **argv) } } else if( state == 1 ) { /* in a number */ - if( !(isdigit(c) || (c >='A' && c <= 'F')) ) { /* store the number */ + if( !isxdigit(c) ) { /* store the number */ state = 0; ungetc(c, stdin); if( stridx < 1000 ) |