Skip to content

Commit c476bce

Browse files
committed
At long last, import the bcmath library, by Phil Nelson
1 parent be6ab20 commit c476bce

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+6932
-67
lines changed

NEWS

+2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ PHP 4.0 NEWS
22
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
33

44
?? ??? 2000, Version 4.0.4
5+
- Integrated the Phil Nelson's bc math library routines into PHP, now that
6+
the license allows it (Phil Nelson <[email protected]>)
57
- Added the xslt_set_error_handler() function to the Sablotron extension.
68
(Sterling)
79
- Improved Sablotron's error handling system allowing you to catch all

ext/bcmath/bcmath.c

+97-67
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@
2222

2323
#if WITH_BCMATH
2424

25-
#include "number.h"
2625
#include "ext/standard/info.h"
2726
#include "php_bcmath.h"
27+
#include "ext/bcmath/libbcmath/src/bcmath.h"
2828

2929
function_entry bcmath_functions[] = {
3030
PHP_FE(bcadd, NULL)
@@ -58,16 +58,44 @@ ZEND_GET_MODULE(bcmath)
5858
static long bc_precision;
5959
#endif
6060

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+
6182
PHP_MINIT_FUNCTION(bcmath)
6283
{
6384
extern bc_num _zero_;
6485
extern bc_num _one_;
6586
extern bc_num _two_;
6687

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;
6893
persist_alloc(_zero_);
6994
persist_alloc(_one_);
7095
persist_alloc(_two_);
96+
persist_alloc(_zero_->n_ptr);
97+
persist_alloc(_one_->n_ptr);
98+
persist_alloc(_two_->n_ptr);
7199

72100
return SUCCESS;
73101
}
@@ -76,7 +104,9 @@ PHP_MINIT_FUNCTION(bcmath)
76104

77105
PHP_MSHUTDOWN_FUNCTION(bcmath)
78106
{
79-
destruct_numbers();
107+
bc_free_num(&_zero_);
108+
bc_free_num(&_one_);
109+
bc_free_num(&_two_);
80110
return SUCCESS;
81111
}
82112

@@ -124,18 +154,18 @@ PHP_FUNCTION(bcadd)
124154
}
125155
convert_to_string_ex(left);
126156
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);
132162
bc_add (first,second,&result, scale);
133-
return_value->value.str.val = num2str(result);
163+
return_value->value.str.val = bc_num2str(result);
134164
return_value->value.str.len = strlen(return_value->value.str.val);
135165
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);
139169
return;
140170
}
141171
/* }}} */
@@ -167,18 +197,18 @@ PHP_FUNCTION(bcsub)
167197
}
168198
convert_to_string_ex(left);
169199
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);
175205
bc_sub (first,second,&result, scale);
176-
return_value->value.str.val = num2str(result);
206+
return_value->value.str.val = bc_num2str(result);
177207
return_value->value.str.len = strlen(return_value->value.str.val);
178208
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);
182212
return;
183213
}
184214
/* }}} */
@@ -210,18 +240,18 @@ PHP_FUNCTION(bcmul)
210240
}
211241
convert_to_string_ex(left);
212242
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);
218248
bc_multiply (first,second,&result, scale);
219-
return_value->value.str.val = num2str(result);
249+
return_value->value.str.val = bc_num2str(result);
220250
return_value->value.str.len = strlen(return_value->value.str.val);
221251
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);
225255
return;
226256
}
227257
/* }}} */
@@ -253,24 +283,24 @@ PHP_FUNCTION(bcdiv)
253283
}
254284
convert_to_string_ex(left);
255285
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);
261291
switch (bc_divide (first,second,&result, scale)) {
262292
case 0: /* OK */
263-
return_value->value.str.val = num2str(result);
293+
return_value->value.str.val = bc_num2str(result);
264294
return_value->value.str.len = strlen(return_value->value.str.val);
265295
return_value->type = IS_STRING;
266296
break;
267297
case -1: /* division by zero */
268298
php_error(E_WARNING,"Division by zero");
269299
break;
270300
}
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);
274304
return;
275305
}
276306
/* }}} */
@@ -294,24 +324,24 @@ PHP_FUNCTION(bcmod)
294324
}
295325
convert_to_string_ex(left);
296326
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);
302332
switch (bc_modulo(first,second,&result, 0)) {
303333
case 0:
304-
return_value->value.str.val = num2str(result);
334+
return_value->value.str.val = bc_num2str(result);
305335
return_value->value.str.len = strlen(return_value->value.str.val);
306336
return_value->type = IS_STRING;
307337
break;
308338
case -1:
309339
php_error(E_WARNING,"Division by zero");
310340
break;
311341
}
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);
315345
return;
316346
}
317347
/* }}} */
@@ -343,18 +373,18 @@ PHP_FUNCTION(bcpow)
343373
}
344374
convert_to_string_ex(left);
345375
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);
351381
bc_raise (first,second,&result, scale);
352-
return_value->value.str.val = num2str(result);
382+
return_value->value.str.val = bc_num2str(result);
353383
return_value->value.str.len = strlen(return_value->value.str.val);
354384
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);
358388
return;
359389
}
360390
/* }}} */
@@ -385,16 +415,16 @@ PHP_FUNCTION(bcsqrt)
385415
break;
386416
}
387417
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);
390420
if (bc_sqrt (&result, scale) != 0) {
391-
return_value->value.str.val = num2str(result);
421+
return_value->value.str.val = bc_num2str(result);
392422
return_value->value.str.len = strlen(return_value->value.str.val);
393423
return_value->type = IS_STRING;
394424
} else {
395425
php_error(E_WARNING,"Square root of negative number");
396426
}
397-
free_num(&result);
427+
bc_free_num(&result);
398428
return;
399429
}
400430
/* }}} */
@@ -427,16 +457,16 @@ PHP_FUNCTION(bccomp)
427457

428458
convert_to_string_ex(left);
429459
convert_to_string_ex(right);
430-
init_num(&first);
431-
init_num(&second);
460+
bc_init_num(&first);
461+
bc_init_num(&second);
432462

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);
435465
return_value->value.lval = bc_compare(first,second);
436466
return_value->type = IS_LONG;
437467

438-
free_num(&first);
439-
free_num(&second);
468+
bc_free_num(&first);
469+
bc_free_num(&second);
440470
return;
441471
}
442472
/* }}} */

ext/bcmath/libbcmath/AUTHORS

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Phil Nelson <[email protected]> wrote bcmath library.
2+
3+

0 commit comments

Comments
 (0)