diff options
Diffstat (limited to 'contrib/bc/dc/numeric.c')
-rw-r--r-- | contrib/bc/dc/numeric.c | 133 |
1 files changed, 69 insertions, 64 deletions
diff --git a/contrib/bc/dc/numeric.c b/contrib/bc/dc/numeric.c index d5abf13..6086be5 100644 --- a/contrib/bc/dc/numeric.c +++ b/contrib/bc/dc/numeric.c @@ -1,7 +1,7 @@ /* * interface dc to the bc numeric routines * - * Copyright (C) 1994, 1997, 1998 Free Software Foundation, Inc. + * Copyright (C) 1994, 1997, 1998, 2000 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -15,8 +15,10 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, you can either send email to this - * program's author (see below) or write to: The Free Software Foundation, - * Inc.; 675 Mass Ave. Cambridge, MA 02139, USA. + * program's author (see below) or write to: + * The Free Software Foundation, Inc. + * 59 Temple Place, Suite 330 + * Boston, MA 02111 USA */ /* This should be the only module that knows the internals of type dc_num */ @@ -33,18 +35,23 @@ #else # define UCHAR_MAX ((unsigned char)~0) #endif -#include "bcdefs.h" -#include "proto.h" -#include "global.h" +#include <stdlib.h> +#include "number.h" #include "dc.h" #include "dc-proto.h" #ifdef __GNUC__ -# define ATTRIB(x) __attribute__(x) -#else +# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__-0 >= 7) +# define ATTRIB(x) __attribute__(x) +# endif +#endif +#ifndef ATTRIB # define ATTRIB(x) #endif +/* Forward prototype */ +static void out_char (int); + /* there is no POSIX standard for dc, so we'll take the GNU definitions */ int std_only = FALSE; @@ -61,7 +68,7 @@ dc_add DC_DECLARG((a, b, kscale, result)) int kscale ATTRIB((unused)) DC_DECLSEP dc_num *result DC_DECLEND { - init_num((bc_num *)result); + bc_init_num((bc_num *)result); bc_add(CastNum(a), CastNum(b), (bc_num *)result, 0); return DC_SUCCESS; } @@ -76,7 +83,7 @@ dc_sub DC_DECLARG((a, b, kscale, result)) int kscale ATTRIB((unused)) DC_DECLSEP dc_num *result DC_DECLEND { - init_num((bc_num *)result); + bc_init_num((bc_num *)result); bc_sub(CastNum(a), CastNum(b), (bc_num *)result, 0); return DC_SUCCESS; } @@ -91,7 +98,7 @@ dc_mul DC_DECLARG((a, b, kscale, result)) int kscale DC_DECLSEP dc_num *result DC_DECLEND { - init_num((bc_num *)result); + bc_init_num((bc_num *)result); bc_multiply(CastNum(a), CastNum(b), (bc_num *)result, kscale); return DC_SUCCESS; } @@ -106,7 +113,7 @@ dc_div DC_DECLARG((a, b, kscale, result)) int kscale DC_DECLSEP dc_num *result DC_DECLEND { - init_num((bc_num *)result); + bc_init_num((bc_num *)result); if (bc_divide(CastNum(a), CastNum(b), (bc_num *)result, kscale)){ fprintf(stderr, "%s: divide by zero\n", progname); return DC_DOMAIN_ERROR; @@ -126,8 +133,8 @@ dc_divrem DC_DECLARG((a, b, kscale, quotient, remainder)) dc_num *quotient DC_DECLSEP dc_num *remainder DC_DECLEND { - init_num((bc_num *)quotient); - init_num((bc_num *)remainder); + bc_init_num((bc_num *)quotient); + bc_init_num((bc_num *)remainder); if (bc_divmod(CastNum(a), CastNum(b), (bc_num *)quotient, (bc_num *)remainder, kscale)){ fprintf(stderr, "%s: divide by zero\n", progname); @@ -146,7 +153,7 @@ dc_rem DC_DECLARG((a, b, kscale, result)) int kscale DC_DECLSEP dc_num *result DC_DECLEND { - init_num((bc_num *)result); + bc_init_num((bc_num *)result); if (bc_modulo(CastNum(a), CastNum(b), (bc_num *)result, kscale)){ fprintf(stderr, "%s: remainder by zero\n", progname); return DC_DOMAIN_ERROR; @@ -162,10 +169,10 @@ dc_modexp DC_DECLARG((base, expo, mod, kscale, result)) int kscale DC_DECLSEP dc_num *result DC_DECLEND { - init_num((bc_num *)result); + bc_init_num((bc_num *)result); if (bc_raisemod(CastNum(base), CastNum(expo), CastNum(mod), (bc_num *)result, kscale)){ - if (is_zero(CastNum(mod))) + if (bc_is_zero(CastNum(mod))) fprintf(stderr, "%s: remainder by zero\n", progname); return DC_DOMAIN_ERROR; } @@ -182,7 +189,7 @@ dc_exp DC_DECLARG((a, b, kscale, result)) int kscale DC_DECLSEP dc_num *result DC_DECLEND { - init_num((bc_num *)result); + bc_init_num((bc_num *)result); bc_raise(CastNum(a), CastNum(b), (bc_num *)result, kscale); return DC_SUCCESS; } @@ -198,10 +205,10 @@ dc_sqrt DC_DECLARG((value, kscale, result)) { bc_num tmp; - tmp = copy_num(CastNum(value)); + tmp = bc_copy_num(CastNum(value)); if (!bc_sqrt(&tmp, kscale)){ fprintf(stderr, "%s: square root of negative number\n", progname); - free_num(&tmp); + bc_free_num(&tmp); return DC_DOMAIN_ERROR; } *((bc_num *)result) = tmp; @@ -231,7 +238,7 @@ dc_num2int DC_DECLARG((value, discard_p)) { long result; - result = num2long(CastNum(value)); + result = bc_num2long(CastNum(value)); if (discard_p == DC_TOSS) dc_free_num(&value); return (int)result; @@ -247,8 +254,8 @@ dc_int2data DC_DECLARG((value)) { dc_data result; - init_num((bc_num *)&result.v.number); - int2num((bc_num *)&result.v.number, value); + bc_init_num((bc_num *)&result.v.number); + bc_int2num((bc_num *)&result.v.number, value); result.dc_type = DC_NUMBER; return result; } @@ -279,11 +286,11 @@ dc_getnum DC_DECLARG((input, ibase, readahead)) int decimal; int c; - init_num(&tmp); - init_num(&build); - init_num(&base); - result = copy_num(_zero_); - int2num(&base, ibase); + bc_init_num(&tmp); + bc_init_num(&build); + bc_init_num(&base); + result = bc_copy_num(_zero_); + bc_int2num(&base, ibase); c = (*input)(); while (isspace(c)) c = (*input)(); @@ -303,15 +310,15 @@ dc_getnum DC_DECLARG((input, ibase, readahead)) else break; c = (*input)(); - int2num(&tmp, digit); + bc_int2num(&tmp, digit); bc_multiply(result, base, &result, 0); bc_add(result, tmp, &result, 0); } if (c == '.'){ - free_num(&build); - free_num(&tmp); - divisor = copy_num(_one_); - build = copy_num(_zero_); + bc_free_num(&build); + bc_free_num(&tmp); + divisor = bc_copy_num(_one_); + build = bc_copy_num(_zero_); decimal = 0; for (;;){ c = (*input)(); @@ -321,7 +328,7 @@ dc_getnum DC_DECLARG((input, ibase, readahead)) digit = 10 + c - 'A'; else break; - int2num(&tmp, digit); + bc_int2num(&tmp, digit); bc_multiply(build, base, &build, 0); bc_add(build, tmp, &build, 0); bc_multiply(divisor, base, &divisor, 0); @@ -334,9 +341,9 @@ dc_getnum DC_DECLARG((input, ibase, readahead)) if (negative) bc_sub(_zero_, result, &result, 0); - free_num(&tmp); - free_num(&build); - free_num(&base); + bc_free_num(&tmp); + bc_free_num(&build); + bc_free_num(&base); if (readahead) *readahead = c; full_result.v.number = (dc_num)result; @@ -353,7 +360,7 @@ dc_numlen DC_DECLARG((value)) bc_num num = CastNum(value); /* is this right??? */ - return num->n_len + num->n_scale; + return num->n_len + num->n_scale - (*num->n_value == '\0'); } /* return the scale factor of the passed dc_num @@ -377,7 +384,7 @@ dc_tell_scale DC_DECLARG((value, discard_p)) void dc_math_init DC_DECLVOID() { - init_numbers(); + bc_init_numbers(); } /* print out a dc_num in output base obase to stdout; @@ -391,9 +398,10 @@ dc_out_num DC_DECLARG((value, obase, newline_p, discard_p)) dc_newline newline_p DC_DECLSEP dc_discard discard_p DC_DECLEND { - out_num(CastNum(value), obase, out_char); + out_char('\0'); /* clear the column counter */ + bc_out_num(CastNum(value), obase, out_char, 0); if (newline_p == DC_WITHNL) - out_char('\n'); + putchar ('\n'); if (discard_p == DC_TOSS) dc_free_num(&value); } @@ -403,7 +411,7 @@ dc_out_num DC_DECLARG((value, obase, newline_p, discard_p)) * if discard_p is DC_TOSS then deallocate the value after use */ void -dc_dump_num DC_DECLARG((value, discard_p)) +dc_dump_num DC_DECLARG((dcvalue, discard_p)) dc_num dcvalue DC_DECLSEP dc_discard discard_p DC_DECLEND { @@ -415,9 +423,9 @@ dc_dump_num DC_DECLARG((value, discard_p)) bc_num obase; bc_num digit; - init_num(&value); - init_num(&obase); - init_num(&digit); + bc_init_num(&value); + bc_init_num(&obase); + bc_init_num(&digit); /* we only handle the integer portion: */ bc_divide(CastNum(dcvalue), _one_, &value, 0); @@ -427,14 +435,14 @@ dc_dump_num DC_DECLARG((value, discard_p)) if (discard_p == DC_TOSS) dc_free_num(&dcvalue); - int2num(&obase, 1+UCHAR_MAX); + bc_int2num(&obase, 1+UCHAR_MAX); do { (void) bc_divmod(value, obase, &value, &digit, 0); cur = dc_malloc(sizeof *cur); - cur->digit = (int)num2long(digit); + cur->digit = (int)bc_num2long(digit); cur->link = top_of_stack; top_of_stack = cur; - } while (!is_zero(value)); + } while (!bc_is_zero(value)); for (cur=top_of_stack; cur; cur=next) { putchar(cur->digit); @@ -442,9 +450,9 @@ dc_dump_num DC_DECLARG((value, discard_p)) free(cur); } - free_num(&digit); - free_num(&obase); - free_num(&value); + bc_free_num(&digit); + bc_free_num(&obase); + bc_free_num(&value); } /* deallocate an instance of a dc_num */ @@ -452,7 +460,7 @@ void dc_free_num DC_DECLARG((value)) dc_num *value DC_DECLEND { - free_num((bc_num *)value); + bc_free_num((bc_num *)value); } /* return a duplicate of the number in the passed value */ @@ -498,15 +506,14 @@ int out_col = 0; It keeps track of the number of characters output and may break the output with a "\<cr>". */ -void +static void out_char (ch) - char ch; + int ch; { - if (ch == '\n') + if (ch == '\0') { out_col = 0; - putchar ('\n'); } else { @@ -547,17 +554,16 @@ rt_error (mesg, va_alist) #endif { va_list args; - char error_mesg [255]; + fprintf (stderr, "Runtime error: "); #ifdef HAVE_STDARG_H va_start (args, mesg); #else va_start (args); #endif - vsprintf (error_mesg, mesg, args); + vfprintf (stderr, mesg, args); va_end (args); - - fprintf (stderr, "Runtime error: %s\n", error_mesg); + fprintf (stderr, "\n"); } @@ -581,15 +587,14 @@ rt_warn (mesg, va_alist) #endif { va_list args; - char error_mesg [255]; + fprintf (stderr, "Runtime warning: "); #ifdef HAVE_STDARG_H va_start (args, mesg); #else va_start (args); #endif - vsprintf (error_mesg, mesg, args); + vfprintf (stderr, mesg, args); va_end (args); - - fprintf (stderr, "Runtime warning: %s\n", error_mesg); + fprintf (stderr, "\n"); } |