Skip to content

Commit fee9d4c

Browse files
committed
Refactor bcmath
1 parent 7e3989f commit fee9d4c

File tree

3 files changed

+40
-55
lines changed

3 files changed

+40
-55
lines changed

ext/bcmath/bcmath.c

+9-26
Original file line numberDiff line numberDiff line change
@@ -230,9 +230,7 @@ PHP_FUNCTION(bcadd)
230230
result->n_scale = scale;
231231
}
232232

233-
Z_STRVAL_P(return_value) = bc_num2str(result);
234-
Z_STRLEN_P(return_value) = strlen(Z_STRVAL_P(return_value));
235-
Z_TYPE_P(return_value) = IS_STRING;
233+
RETVAL_STR(bc_num2str(result));
236234
bc_free_num(&first);
237235
bc_free_num(&second);
238236
bc_free_num(&result);
@@ -269,9 +267,7 @@ PHP_FUNCTION(bcsub)
269267
result->n_scale = scale;
270268
}
271269

272-
Z_STRVAL_P(return_value) = bc_num2str(result);
273-
Z_STRLEN_P(return_value) = strlen(Z_STRVAL_P(return_value));
274-
Z_TYPE_P(return_value) = IS_STRING;
270+
RETVAL_STR(bc_num2str(result));
275271
bc_free_num(&first);
276272
bc_free_num(&second);
277273
bc_free_num(&result);
@@ -308,9 +304,7 @@ PHP_FUNCTION(bcmul)
308304
result->n_scale = scale;
309305
}
310306

311-
Z_STRVAL_P(return_value) = bc_num2str(result);
312-
Z_STRLEN_P(return_value) = strlen(Z_STRVAL_P(return_value));
313-
Z_TYPE_P(return_value) = IS_STRING;
307+
RETVAL_STR(bc_num2str(result));
314308
bc_free_num(&first);
315309
bc_free_num(&second);
316310
bc_free_num(&result);
@@ -347,9 +341,7 @@ PHP_FUNCTION(bcdiv)
347341
if (result->n_scale > scale) {
348342
result->n_scale = scale;
349343
}
350-
Z_STRVAL_P(return_value) = bc_num2str(result);
351-
Z_STRLEN_P(return_value) = strlen(Z_STRVAL_P(return_value));
352-
Z_TYPE_P(return_value) = IS_STRING;
344+
RETVAL_STR(bc_num2str(result));
353345
break;
354346
case -1: /* division by zero */
355347
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Division by zero");
@@ -383,9 +375,7 @@ PHP_FUNCTION(bcmod)
383375

384376
switch (bc_modulo(first, second, &result, 0 TSRMLS_CC)) {
385377
case 0:
386-
Z_STRVAL_P(return_value) = bc_num2str(result);
387-
Z_STRLEN_P(return_value) = strlen(Z_STRVAL_P(return_value));
388-
Z_TYPE_P(return_value) = IS_STRING;
378+
RETVAL_STR(bc_num2str(result));
389379
break;
390380
case -1:
391381
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Division by zero");
@@ -427,9 +417,7 @@ PHP_FUNCTION(bcpowmod)
427417
if (result->n_scale > scale) {
428418
result->n_scale = scale;
429419
}
430-
Z_STRVAL_P(return_value) = bc_num2str(result);
431-
Z_STRLEN_P(return_value) = strlen(Z_STRVAL_P(return_value));
432-
Z_TYPE_P(return_value) = IS_STRING;
420+
RETVAL_STR(bc_num2str(result));
433421
} else {
434422
RETVAL_FALSE;
435423
}
@@ -471,9 +459,7 @@ PHP_FUNCTION(bcpow)
471459
result->n_scale = scale;
472460
}
473461

474-
Z_STRVAL_P(return_value) = bc_num2str(result);
475-
Z_STRLEN_P(return_value) = strlen(Z_STRVAL_P(return_value));
476-
Z_TYPE_P(return_value) = IS_STRING;
462+
RETVAL_STR(bc_num2str(result));
477463
bc_free_num(&first);
478464
bc_free_num(&second);
479465
bc_free_num(&result);
@@ -506,9 +492,7 @@ PHP_FUNCTION(bcsqrt)
506492
if (result->n_scale > scale) {
507493
result->n_scale = scale;
508494
}
509-
Z_STRVAL_P(return_value) = bc_num2str(result);
510-
Z_STRLEN_P(return_value) = strlen(Z_STRVAL_P(return_value));
511-
Z_TYPE_P(return_value) = IS_STRING;
495+
RETVAL_STR(bc_num2str(result));
512496
} else {
513497
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Square root of negative number");
514498
}
@@ -541,8 +525,7 @@ PHP_FUNCTION(bccomp)
541525

542526
bc_str2num(&first, left, scale TSRMLS_CC);
543527
bc_str2num(&second, right, scale TSRMLS_CC);
544-
Z_LVAL_P(return_value) = bc_compare(first, second);
545-
Z_TYPE_P(return_value) = IS_LONG;
528+
RETVAL_LONG(bc_compare(first, second));
546529

547530
bc_free_num(&first);
548531
bc_free_num(&second);

ext/bcmath/libbcmath/src/bcmath.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ _PROTOTYPE(void bc_init_num, (bc_num *num TSRMLS_DC));
111111

112112
_PROTOTYPE(void bc_str2num, (bc_num *num, char *str, int scale TSRMLS_DC));
113113

114-
_PROTOTYPE(char *bc_num2str, (bc_num num));
114+
_PROTOTYPE(zend_string *bc_num2str, (bc_num num));
115115

116116
_PROTOTYPE(void bc_int2num, (bc_num *num, int val));
117117

ext/bcmath/libbcmath/src/num2str.c

+30-28
Original file line numberDiff line numberDiff line change
@@ -40,40 +40,42 @@
4040

4141
/* Convert a numbers to a string. Base 10 only.*/
4242

43-
char
43+
zend_string
4444
*bc_num2str (num)
4545
bc_num num;
4646
{
47-
char *str, *sptr;
48-
char *nptr;
49-
int index, signch;
47+
zend_string *str;
48+
char *sptr;
49+
char *nptr;
50+
int index, signch;
5051

51-
/* Allocate the string memory. */
52-
signch = ( num->n_sign == PLUS ? 0 : 1 ); /* Number of sign chars. */
53-
if (num->n_scale > 0)
54-
str = (char *) safe_emalloc (1, num->n_len + num->n_scale, 2 + signch);
55-
else
56-
str = (char *) safe_emalloc (1, num->n_len, 1 + signch);
57-
if (str == NULL) bc_out_of_memory();
52+
/* Allocate the string memory. */
53+
signch = ( num->n_sign == PLUS ? 0 : 1 ); /* Number of sign chars. */
54+
if (num->n_scale > 0)
55+
str = STR_ALLOC(num->n_len + num->n_scale + signch + 1, 0);
56+
else
57+
str = STR_ALLOC(num->n_len + signch, 0);
58+
if (str == NULL) bc_out_of_memory();
5859

59-
/* The negative sign if needed. */
60-
sptr = str;
61-
if (signch) *sptr++ = '-';
60+
/* The negative sign if needed. */
61+
sptr = str->val;
62+
if (signch) *sptr++ = '-';
6263

63-
/* Load the whole number. */
64-
nptr = num->n_value;
65-
for (index=num->n_len; index>0; index--)
66-
*sptr++ = BCD_CHAR(*nptr++);
64+
/* Load the whole number. */
65+
nptr = num->n_value;
66+
for (index=num->n_len; index>0; index--)
67+
*sptr++ = BCD_CHAR(*nptr++);
6768

68-
/* Now the fraction. */
69-
if (num->n_scale > 0)
70-
{
71-
*sptr++ = '.';
72-
for (index=0; index<num->n_scale; index++)
73-
*sptr++ = BCD_CHAR(*nptr++);
74-
}
69+
/* Now the fraction. */
70+
if (num->n_scale > 0)
71+
{
72+
*sptr++ = '.';
73+
for (index=0; index<num->n_scale; index++)
74+
*sptr++ = BCD_CHAR(*nptr++);
75+
}
7576

76-
/* Terminate the string and return it! */
77-
*sptr = '\0';
78-
return (str);
77+
/* Terminate the string and return it! */
78+
*sptr = '\0';
79+
str->len = sptr - (char *)str->val;
80+
return str;
7981
}

0 commit comments

Comments
 (0)