"Fossies" - the Fresh Open Source Software Archive

Member "bc-1.06.95/h/number.h" (5 Sep 2006, 4316 Bytes) of package /linux/misc/old/bc-1.06.95.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "number.h" see the Fossies "Dox" file reference documentation and the last Fossies "Diffs" side-by-side code changes report: 1.06.95_vs_1.07.

    1 /* number.h: Arbitrary precision numbers header file. */
    2 /*
    3     Copyright (C) 1991, 1992, 1993, 1994, 1997, 2000 Free Software Foundation, Inc.
    4 
    5     This program is free software; you can redistribute it and/or modify
    6     it under the terms of the GNU General Public License as published by
    7     the Free Software Foundation; either version 2 of the License , or
    8     (at your option) any later version.
    9 
   10     This program is distributed in the hope that it will be useful,
   11     but WITHOUT ANY WARRANTY; without even the implied warranty of
   12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   13     GNU General Public License for more details.
   14 
   15     You should have received a copy of the GNU General Public License
   16     along with this program; see the file COPYING.  If not, write to:
   17 
   18       The Free Software Foundation, Inc.
   19       51 Franklin Street, Fifth Floor
   20       Boston, MA 02110-1301  USA
   21 
   22 
   23     You may contact the author by:
   24        e-mail:  philnelson@acm.org
   25       us-mail:  Philip A. Nelson
   26                 Computer Science Department, 9062
   27                 Western Washington University
   28                 Bellingham, WA 98226-9062
   29        
   30 *************************************************************************/
   31 
   32 #ifndef _NUMBER_H_
   33 #define _NUMBER_H_
   34 
   35 typedef enum {PLUS, MINUS} sign;
   36 
   37 typedef struct bc_struct *bc_num;
   38 
   39 typedef struct bc_struct
   40     {
   41       sign  n_sign;
   42       int   n_len;  /* The number of digits before the decimal point. */
   43       int   n_scale;    /* The number of digits after the decimal point. */
   44       int   n_refs;     /* The number of pointers to this number. */
   45       bc_num n_next;    /* Linked list for available list. */
   46       char *n_ptr;  /* The pointer to the actual storage.
   47                If NULL, n_value points to the inside of
   48                another number (bc_multiply...) and should
   49                not be "freed." */
   50       char *n_value;    /* The number. Not zero char terminated.
   51                May not point to the same place as n_ptr as
   52                in the case of leading zeros generated. */
   53     } bc_struct;
   54 
   55 
   56 /* The base used in storing the numbers in n_value above.
   57    Currently this MUST be 10. */
   58 
   59 #define BASE 10
   60 
   61 /*  Some useful macros and constants. */
   62 
   63 #define CH_VAL(c)     (c - '0')
   64 #define BCD_CHAR(d)   (d + '0')
   65 
   66 #ifdef MIN
   67 #undef MIN
   68 #undef MAX
   69 #endif
   70 #define MAX(a,b)      ((a)>(b)?(a):(b))
   71 #define MIN(a,b)      ((a)>(b)?(b):(a))
   72 #define ODD(a)        ((a)&1)
   73 
   74 #ifndef TRUE
   75 #define TRUE 1
   76 #define FALSE 0
   77 #endif
   78 
   79 #ifndef LONG_MAX
   80 #define LONG_MAX 0x7fffffff
   81 #endif
   82 
   83 
   84 /* Global numbers. */
   85 extern bc_num _zero_;
   86 extern bc_num _one_;
   87 extern bc_num _two_;
   88 
   89 
   90 /* Function Prototypes */
   91 
   92 /* Define the _PROTOTYPE macro if it is needed. */
   93 
   94 #ifndef _PROTOTYPE
   95 #ifdef __STDC__
   96 #define _PROTOTYPE(func, args) func args
   97 #else
   98 #define _PROTOTYPE(func, args) func()
   99 #endif
  100 #endif
  101 
  102 _PROTOTYPE(void bc_init_numbers, (void));
  103 
  104 _PROTOTYPE(bc_num bc_new_num, (int length, int scale));
  105 
  106 _PROTOTYPE(void bc_free_num, (bc_num *num));
  107 
  108 _PROTOTYPE(bc_num bc_copy_num, (bc_num num));
  109 
  110 _PROTOTYPE(void bc_init_num, (bc_num *num));
  111 
  112 _PROTOTYPE(void bc_str2num, (bc_num *num, char *str, int scale));
  113 
  114 _PROTOTYPE(char *bc_num2str, (bc_num num));
  115 
  116 _PROTOTYPE(void bc_int2num, (bc_num *num, int val));
  117 
  118 _PROTOTYPE(long bc_num2long, (bc_num num));
  119 
  120 _PROTOTYPE(int bc_compare, (bc_num n1, bc_num n2));
  121 
  122 _PROTOTYPE(char bc_is_zero, (bc_num num));
  123 
  124 _PROTOTYPE(char bc_is_near_zero, (bc_num num, int scale));
  125 
  126 _PROTOTYPE(char bc_is_neg, (bc_num num));
  127 
  128 _PROTOTYPE(void bc_add, (bc_num n1, bc_num n2, bc_num *result, int scale_min));
  129 
  130 _PROTOTYPE(void bc_sub, (bc_num n1, bc_num n2, bc_num *result, int scale_min));
  131 
  132 _PROTOTYPE(void bc_multiply, (bc_num n1, bc_num n2, bc_num *prod, int scale));
  133 
  134 _PROTOTYPE(int bc_divide, (bc_num n1, bc_num n2, bc_num *quot, int scale));
  135 
  136 _PROTOTYPE(int bc_modulo, (bc_num num1, bc_num num2, bc_num *result,
  137                int scale));
  138 
  139 _PROTOTYPE(int bc_divmod, (bc_num num1, bc_num num2, bc_num *quot,
  140                bc_num *rem, int scale));
  141 
  142 _PROTOTYPE(int bc_raisemod, (bc_num base, bc_num expo, bc_num mod,
  143                  bc_num *result, int scale));
  144 
  145 _PROTOTYPE(void bc_raise, (bc_num num1, bc_num num2, bc_num *result,
  146                int scale));
  147 
  148 _PROTOTYPE(int bc_sqrt, (bc_num *num, int scale));
  149 
  150 _PROTOTYPE(void bc_out_num, (bc_num num, int o_base, void (* out_char)(int),
  151                  int leading_zero));
  152 
  153 #endif