1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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;
43 int n_scale;
44 int n_refs;
45 bc_num n_next;
46 char *n_ptr;
47
48
49
50 char *n_value;
51
52
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
63
64
65 #define BASE 10
66
67
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
91
92
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_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));
111
112 _PROTOTYPE(void bc_str2num, (bc_num *num, char *str, int scale));
113
114 _PROTOTYPE(zend_string *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
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