22
22
23
23
#if WITH_BCMATH
24
24
25
- #include "number.h"
26
25
#include "ext/standard/info.h"
27
26
#include "php_bcmath.h"
27
+ #include "ext/bcmath/libbcmath/src/bcmath.h"
28
28
29
29
function_entry bcmath_functions [] = {
30
30
PHP_FE (bcadd , NULL )
@@ -58,16 +58,44 @@ ZEND_GET_MODULE(bcmath)
58
58
static long bc_precision ;
59
59
#endif
60
60
61
+ /* Storage used for special numbers. */
62
+ bc_num _zero_ ;
63
+ bc_num _one_ ;
64
+ bc_num _two_ ;
65
+
66
+
67
+ /* Make a copy of a number! Just increments the reference count! */
68
+ bc_num copy_num (bc_num num )
69
+ {
70
+ num -> n_refs ++ ;
71
+ return num ;
72
+ }
73
+
74
+
75
+ /* Initialize a number NUM by making it a copy of zero. */
76
+ void init_num (bc_num * num )
77
+ {
78
+ * num = copy_num (_zero_ );
79
+ }
80
+
81
+
61
82
PHP_MINIT_FUNCTION (bcmath )
62
83
{
63
84
extern bc_num _zero_ ;
64
85
extern bc_num _one_ ;
65
86
extern bc_num _two_ ;
66
87
67
- init_numbers ();
88
+ _zero_ = bc_new_num (1 ,0 );
89
+ _one_ = bc_new_num (1 ,0 );
90
+ _one_ -> n_value [0 ] = 1 ;
91
+ _two_ = bc_new_num (1 ,0 );
92
+ _two_ -> n_value [0 ] = 2 ;
68
93
persist_alloc (_zero_ );
69
94
persist_alloc (_one_ );
70
95
persist_alloc (_two_ );
96
+ persist_alloc (_zero_ -> n_ptr );
97
+ persist_alloc (_one_ -> n_ptr );
98
+ persist_alloc (_two_ -> n_ptr );
71
99
72
100
return SUCCESS ;
73
101
}
@@ -76,7 +104,9 @@ PHP_MINIT_FUNCTION(bcmath)
76
104
77
105
PHP_MSHUTDOWN_FUNCTION (bcmath )
78
106
{
79
- destruct_numbers ();
107
+ bc_free_num (& _zero_ );
108
+ bc_free_num (& _one_ );
109
+ bc_free_num (& _two_ );
80
110
return SUCCESS ;
81
111
}
82
112
@@ -124,18 +154,18 @@ PHP_FUNCTION(bcadd)
124
154
}
125
155
convert_to_string_ex (left );
126
156
convert_to_string_ex (right );
127
- init_num (& first );
128
- init_num (& second );
129
- init_num (& result );
130
- str2num (& first ,(* left )-> value .str .val ,scale );
131
- str2num (& second ,(* right )-> value .str .val ,scale );
157
+ bc_init_num (& first );
158
+ bc_init_num (& second );
159
+ bc_init_num (& result );
160
+ bc_str2num (& first ,(* left )-> value .str .val ,scale );
161
+ bc_str2num (& second ,(* right )-> value .str .val ,scale );
132
162
bc_add (first ,second ,& result , scale );
133
- return_value -> value .str .val = num2str (result );
163
+ return_value -> value .str .val = bc_num2str (result );
134
164
return_value -> value .str .len = strlen (return_value -> value .str .val );
135
165
return_value -> type = IS_STRING ;
136
- free_num (& first );
137
- free_num (& second );
138
- free_num (& result );
166
+ bc_free_num (& first );
167
+ bc_free_num (& second );
168
+ bc_free_num (& result );
139
169
return ;
140
170
}
141
171
/* }}} */
@@ -167,18 +197,18 @@ PHP_FUNCTION(bcsub)
167
197
}
168
198
convert_to_string_ex (left );
169
199
convert_to_string_ex (right );
170
- init_num (& first );
171
- init_num (& second );
172
- init_num (& result );
173
- str2num (& first ,(* left )-> value .str .val ,scale );
174
- str2num (& second ,(* right )-> value .str .val ,scale );
200
+ bc_init_num (& first );
201
+ bc_init_num (& second );
202
+ bc_init_num (& result );
203
+ bc_str2num (& first ,(* left )-> value .str .val ,scale );
204
+ bc_str2num (& second ,(* right )-> value .str .val ,scale );
175
205
bc_sub (first ,second ,& result , scale );
176
- return_value -> value .str .val = num2str (result );
206
+ return_value -> value .str .val = bc_num2str (result );
177
207
return_value -> value .str .len = strlen (return_value -> value .str .val );
178
208
return_value -> type = IS_STRING ;
179
- free_num (& first );
180
- free_num (& second );
181
- free_num (& result );
209
+ bc_free_num (& first );
210
+ bc_free_num (& second );
211
+ bc_free_num (& result );
182
212
return ;
183
213
}
184
214
/* }}} */
@@ -210,18 +240,18 @@ PHP_FUNCTION(bcmul)
210
240
}
211
241
convert_to_string_ex (left );
212
242
convert_to_string_ex (right );
213
- init_num (& first );
214
- init_num (& second );
215
- init_num (& result );
216
- str2num (& first ,(* left )-> value .str .val ,scale );
217
- str2num (& second ,(* right )-> value .str .val ,scale );
243
+ bc_init_num (& first );
244
+ bc_init_num (& second );
245
+ bc_init_num (& result );
246
+ bc_str2num (& first ,(* left )-> value .str .val ,scale );
247
+ bc_str2num (& second ,(* right )-> value .str .val ,scale );
218
248
bc_multiply (first ,second ,& result , scale );
219
- return_value -> value .str .val = num2str (result );
249
+ return_value -> value .str .val = bc_num2str (result );
220
250
return_value -> value .str .len = strlen (return_value -> value .str .val );
221
251
return_value -> type = IS_STRING ;
222
- free_num (& first );
223
- free_num (& second );
224
- free_num (& result );
252
+ bc_free_num (& first );
253
+ bc_free_num (& second );
254
+ bc_free_num (& result );
225
255
return ;
226
256
}
227
257
/* }}} */
@@ -253,24 +283,24 @@ PHP_FUNCTION(bcdiv)
253
283
}
254
284
convert_to_string_ex (left );
255
285
convert_to_string_ex (right );
256
- init_num (& first );
257
- init_num (& second );
258
- init_num (& result );
259
- str2num (& first ,(* left )-> value .str .val ,scale );
260
- str2num (& second ,(* right )-> value .str .val ,scale );
286
+ bc_init_num (& first );
287
+ bc_init_num (& second );
288
+ bc_init_num (& result );
289
+ bc_str2num (& first ,(* left )-> value .str .val ,scale );
290
+ bc_str2num (& second ,(* right )-> value .str .val ,scale );
261
291
switch (bc_divide (first ,second ,& result , scale )) {
262
292
case 0 : /* OK */
263
- return_value -> value .str .val = num2str (result );
293
+ return_value -> value .str .val = bc_num2str (result );
264
294
return_value -> value .str .len = strlen (return_value -> value .str .val );
265
295
return_value -> type = IS_STRING ;
266
296
break ;
267
297
case -1 : /* division by zero */
268
298
php_error (E_WARNING ,"Division by zero" );
269
299
break ;
270
300
}
271
- free_num (& first );
272
- free_num (& second );
273
- free_num (& result );
301
+ bc_free_num (& first );
302
+ bc_free_num (& second );
303
+ bc_free_num (& result );
274
304
return ;
275
305
}
276
306
/* }}} */
@@ -294,24 +324,24 @@ PHP_FUNCTION(bcmod)
294
324
}
295
325
convert_to_string_ex (left );
296
326
convert_to_string_ex (right );
297
- init_num (& first );
298
- init_num (& second );
299
- init_num (& result );
300
- str2num (& first ,(* left )-> value .str .val ,0 );
301
- str2num (& second ,(* right )-> value .str .val ,0 );
327
+ bc_init_num (& first );
328
+ bc_init_num (& second );
329
+ bc_init_num (& result );
330
+ bc_str2num (& first ,(* left )-> value .str .val ,0 );
331
+ bc_str2num (& second ,(* right )-> value .str .val ,0 );
302
332
switch (bc_modulo (first ,second ,& result , 0 )) {
303
333
case 0 :
304
- return_value -> value .str .val = num2str (result );
334
+ return_value -> value .str .val = bc_num2str (result );
305
335
return_value -> value .str .len = strlen (return_value -> value .str .val );
306
336
return_value -> type = IS_STRING ;
307
337
break ;
308
338
case -1 :
309
339
php_error (E_WARNING ,"Division by zero" );
310
340
break ;
311
341
}
312
- free_num (& first );
313
- free_num (& second );
314
- free_num (& result );
342
+ bc_free_num (& first );
343
+ bc_free_num (& second );
344
+ bc_free_num (& result );
315
345
return ;
316
346
}
317
347
/* }}} */
@@ -343,18 +373,18 @@ PHP_FUNCTION(bcpow)
343
373
}
344
374
convert_to_string_ex (left );
345
375
convert_to_string_ex (right );
346
- init_num (& first );
347
- init_num (& second );
348
- init_num (& result );
349
- str2num (& first ,(* left )-> value .str .val ,scale );
350
- str2num (& second ,(* right )-> value .str .val ,scale );
376
+ bc_init_num (& first );
377
+ bc_init_num (& second );
378
+ bc_init_num (& result );
379
+ bc_str2num (& first ,(* left )-> value .str .val ,scale );
380
+ bc_str2num (& second ,(* right )-> value .str .val ,scale );
351
381
bc_raise (first ,second ,& result , scale );
352
- return_value -> value .str .val = num2str (result );
382
+ return_value -> value .str .val = bc_num2str (result );
353
383
return_value -> value .str .len = strlen (return_value -> value .str .val );
354
384
return_value -> type = IS_STRING ;
355
- free_num (& first );
356
- free_num (& second );
357
- free_num (& result );
385
+ bc_free_num (& first );
386
+ bc_free_num (& second );
387
+ bc_free_num (& result );
358
388
return ;
359
389
}
360
390
/* }}} */
@@ -385,16 +415,16 @@ PHP_FUNCTION(bcsqrt)
385
415
break ;
386
416
}
387
417
convert_to_string_ex (left );
388
- init_num (& result );
389
- str2num (& result ,(* left )-> value .str .val ,scale );
418
+ bc_init_num (& result );
419
+ bc_str2num (& result ,(* left )-> value .str .val ,scale );
390
420
if (bc_sqrt (& result , scale ) != 0 ) {
391
- return_value -> value .str .val = num2str (result );
421
+ return_value -> value .str .val = bc_num2str (result );
392
422
return_value -> value .str .len = strlen (return_value -> value .str .val );
393
423
return_value -> type = IS_STRING ;
394
424
} else {
395
425
php_error (E_WARNING ,"Square root of negative number" );
396
426
}
397
- free_num (& result );
427
+ bc_free_num (& result );
398
428
return ;
399
429
}
400
430
/* }}} */
@@ -427,16 +457,16 @@ PHP_FUNCTION(bccomp)
427
457
428
458
convert_to_string_ex (left );
429
459
convert_to_string_ex (right );
430
- init_num (& first );
431
- init_num (& second );
460
+ bc_init_num (& first );
461
+ bc_init_num (& second );
432
462
433
- str2num (& first ,(* left )-> value .str .val ,scale );
434
- str2num (& second ,(* right )-> value .str .val ,scale );
463
+ bc_str2num (& first ,(* left )-> value .str .val ,scale );
464
+ bc_str2num (& second ,(* right )-> value .str .val ,scale );
435
465
return_value -> value .lval = bc_compare (first ,second );
436
466
return_value -> type = IS_LONG ;
437
467
438
- free_num (& first );
439
- free_num (& second );
468
+ bc_free_num (& first );
469
+ bc_free_num (& second );
440
470
return ;
441
471
}
442
472
/* }}} */
0 commit comments