xref: /netbsd-src/external/bsd/bc/dist/number.h (revision ed857e95db3fec367bb6764523110eb0ac99cb49)
1 /*	$NetBSD: number.h,v 1.1 2017/04/10 02:28:23 phil Exp $ */
2 /* number.h: Arbitrary precision numbers header file. */
3 /*
4  * Copyright (C) 1991, 1992, 1993, 1994, 1997, 2012-2017 Free Software Foundation, Inc.
5  * Copyright (C) 2000, 2004, 2017 Philip A. Nelson.
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  * 3. Neither the name of Philip A. Nelson nor the name of the Free Software
17  *    Foundation may not be used to endorse or promote products derived from
18  *    this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY PHILIP A. NELSON ``AS IS'' AND ANY EXPRESS OR
21  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23  * IN NO EVENT SHALL PHILIP A. NELSON OR THE FREE SOFTWARE FOUNDATION BE
24  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
30  * THE POSSIBILITY OF SUCH DAMAGE.
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 void bc_init_numbers (void);
93 
94 bc_num bc_new_num (int length, int scale);
95 
96 void bc_free_num (bc_num *num);
97 
98 bc_num bc_copy_num (bc_num num);
99 
100 void bc_init_num (bc_num *num);
101 
102 void bc_str2num (bc_num *num, char *str, int scale);
103 
104 char *bc_num2str (bc_num num);
105 
106 void bc_int2num (bc_num *num, int val);
107 
108 long bc_num2long (bc_num num);
109 
110 int bc_compare (bc_num n1, bc_num n2);
111 
112 char bc_is_zero (bc_num num);
113 
114 char bc_is_near_zero (bc_num num, int scale);
115 
116 char bc_is_neg (bc_num num);
117 
118 void bc_add (bc_num n1, bc_num n2, bc_num *result, int scale_min);
119 
120 void bc_sub (bc_num n1, bc_num n2, bc_num *result, int scale_min);
121 
122 void bc_multiply (bc_num n1, bc_num n2, bc_num *prod, int scale);
123 
124 int bc_divide (bc_num n1, bc_num n2, bc_num *quot, int scale);
125 
126 int bc_modulo (bc_num num1, bc_num num2, bc_num *result, int scale);
127 
128 int bc_divmod (bc_num num1, bc_num num2, bc_num *quot,
129 			   bc_num *rem, int scale);
130 
131 int bc_raisemod (bc_num base, bc_num expo, bc_num mod,
132 			     bc_num *result, int scale);
133 
134 void bc_raise (bc_num num1, bc_num num2, bc_num *result,
135 			   int scale);
136 
137 int bc_sqrt (bc_num *num, int scale);
138 
139 void bc_out_num (bc_num num, int o_base, void (* out_char)(int),
140 			     int leading_zero);
141 
142 void bc_out_long (long val, int size, int space, void (*out_char)(int));
143 #endif
144