xref: /PHP-5.5/ext/bcmath/libbcmath/src/bcmath.h (revision f763fbb1)
1 /* bcmath.h: bcmath library header.    	*/
2 /*
3     Copyright (C) 1991, 1992, 1993, 1994, 1997 Free Software Foundation, Inc.
4     Copyright (C) 2000 Philip A. Nelson
5 
6     This library is free software; you can redistribute it and/or
7     modify it under the terms of the GNU Lesser General Public
8     License as published by the Free Software Foundation; either
9     version 2 of the License, or (at your option) any later version.
10 
11     This library is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14     Lesser General Public License for more details.  (COPYING.LIB)
15 
16     You should have received a copy of the GNU Lesser General Public
17     License along with this library; if not, write to:
18 
19       The Free Software Foundation, Inc.
20       59 Temple Place, Suite 330
21       Boston, MA 02111-1307 USA.
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 _BCMATH_H_
33 #define _BCMATH_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 #ifdef HAVE_CONFIG_H
56 #include "config.h"
57 #endif
58 
59 #include "php.h"
60 #include "../../php_bcmath.h"
61 
62 /* The base used in storing the numbers in n_value above.
63    Currently this MUST be 10. */
64 
65 #define BASE 10
66 
67 /*  Some useful macros and constants. */
68 
69 #define CH_VAL(c)     (c - '0')
70 #define BCD_CHAR(d)   (d + '0')
71 
72 #ifdef MIN
73 #undef MIN
74 #undef MAX
75 #endif
76 #define MAX(a, b)      ((a)>(b)?(a):(b))
77 #define MIN(a, b)      ((a)>(b)?(b):(a))
78 #define ODD(a)        ((a)&1)
79 
80 #ifndef TRUE
81 #define TRUE 1
82 #define FALSE 0
83 #endif
84 
85 #ifndef LONG_MAX
86 #define LONG_MAX 0x7ffffff
87 #endif
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, (TSRMLS_D));
103 
104 _PROTOTYPE(bc_num _bc_new_num_ex, (int length, int scale, int persistent));
105 
106 _PROTOTYPE(void _bc_free_num_ex, (bc_num *num, int persistent));
107 
108 _PROTOTYPE(bc_num bc_copy_num, (bc_num num));
109 
110 _PROTOTYPE(void bc_init_num, (bc_num *num TSRMLS_DC));
111 
112 _PROTOTYPE(void bc_str2num, (bc_num *num, char *str, int scale TSRMLS_DC));
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 TSRMLS_DC));
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 TSRMLS_DC));
133 
134 _PROTOTYPE(int bc_divide, (bc_num n1, bc_num n2, bc_num *quot, int scale TSRMLS_DC));
135 
136 _PROTOTYPE(int bc_modulo, (bc_num num1, bc_num num2, bc_num *result,
137 			   int scale TSRMLS_DC));
138 
139 _PROTOTYPE(int bc_divmod, (bc_num num1, bc_num num2, bc_num *quot,
140 			   bc_num *rem, int scale TSRMLS_DC));
141 
142 _PROTOTYPE(int bc_raisemod, (bc_num base, bc_num expo, bc_num mod,
143 			     bc_num *result, int scale TSRMLS_DC));
144 
145 _PROTOTYPE(void bc_raise, (bc_num num1, bc_num num2, bc_num *result,
146 			   int scale TSRMLS_DC));
147 
148 _PROTOTYPE(int bc_sqrt, (bc_num *num, int scale TSRMLS_DC));
149 
150 _PROTOTYPE(void bc_out_num, (bc_num num, int o_base, void (* out_char)(int),
151 			     int leading_zero TSRMLS_DC));
152 
153 /* Prototypes needed for external utility routines. */
154 
155 _PROTOTYPE(void bc_rt_warn, (char *mesg ,...));
156 _PROTOTYPE(void bc_rt_error, (char *mesg ,...));
157 _PROTOTYPE(void bc_out_of_memory, (void));
158 
159 #define bc_new_num(length, scale)	_bc_new_num_ex((length), (scale), 0)
160 #define bc_free_num(num)			_bc_free_num_ex((num), 0)
161 
162 #endif
163