Skip to content

Commit 89bcbbd

Browse files
committed
refactor bc_str2num
1 parent 8528ec5 commit 89bcbbd

File tree

1 file changed

+25
-32
lines changed

1 file changed

+25
-32
lines changed

ext/bcmath/libbcmath/src/str2num.c

Lines changed: 25 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -38,26 +38,17 @@
3838
bool bc_str2num(bc_num *num, char *str, size_t scale)
3939
{
4040
size_t digits = 0;
41-
size_t strscale = 0;
41+
size_t str_scale = 0;
4242
char *ptr, *nptr, *integer_ptr, *integer_end, *fractional_ptr = NULL, *fractional_end = NULL, *decimal_point;
4343
bool zero_int = false;
44-
size_t len = strlen(str);
45-
sign num_sign = PLUS;
4644

4745
/* Prepare num. */
4846
bc_free_num (num);
4947

5048
/* Check for valid number and count digits. */
5149
ptr = str;
5250

53-
if (*ptr == '+') {
54-
/* Skip Sign */
55-
ptr++;
56-
} else if (*ptr == '-') {
57-
/* Skip Sign */
58-
num_sign = MINUS;
59-
ptr++;
60-
}
51+
ptr += (*ptr == '-' || *ptr == '+');
6152

6253
/* Skip leading zeros. */
6354
while (*ptr == '0') {
@@ -82,45 +73,43 @@ bool bc_str2num(bc_num *num, char *str, size_t scale)
8273
if (decimal_point) {
8374
/* search */
8475
fractional_ptr = decimal_point + 1;
85-
fractional_end = str + len - 1;
86-
bool has_trailing_zero = false;
87-
while (*fractional_end == '0' && fractional_end >= fractional_ptr) {
76+
fractional_end = fractional_ptr + strlen(fractional_ptr) - 1;
77+
while (*fractional_end == '0' && fractional_end >= decimal_point) {
8878
fractional_end--;
89-
has_trailing_zero = true;
90-
}
91-
if (has_trailing_zero) {
92-
fractional_end++;
9379
}
80+
fractional_end++;
81+
str_scale = fractional_end - fractional_ptr;
9482

9583
/* validate */
96-
strscale = fractional_end - fractional_ptr;
97-
if (strspn(fractional_ptr, "0123456789") < strscale) {
84+
if (strspn(fractional_ptr, "0123456789") < str_scale) {
9885
/* invalid num */
99-
*num = bc_copy_num(BCG(_zero_));
100-
return false;
86+
goto fail;
87+
}
88+
89+
while (str_scale > scale) {
90+
fractional_end--;
91+
str_scale--;
10192
}
10293
}
10394

104-
if (digits + strscale == 0) {
105-
*num = bc_copy_num(BCG(_zero_));
106-
return true;
95+
if (digits + str_scale == 0) {
96+
goto zero;
10797
}
10898

10999
/* Adjust numbers and allocate storage and initialize fields. */
110-
strscale = MIN(strscale, scale);
111100
if (digits == 0) {
112101
zero_int = true;
113102
digits = 1;
114103
}
115104

116-
*num = bc_new_num(digits, strscale);
117-
(*num)->n_sign = num_sign;
105+
*num = bc_new_num(digits, str_scale);
106+
(*num)->n_sign = *str == '-' ? MINUS : PLUS;
118107
nptr = (*num)->n_value;
119108

120109
if (zero_int) {
121110
nptr++;
122-
if (decimal_point) {
123-
while (fractional_ptr <= fractional_end) {
111+
if (str_scale > 0) {
112+
while (fractional_ptr < fractional_end) {
124113
*nptr = CH_VAL(*fractional_ptr);
125114
nptr++;
126115
fractional_ptr++;
@@ -133,8 +122,8 @@ bool bc_str2num(bc_num *num, char *str, size_t scale)
133122
nptr++;
134123
integer_ptr++;
135124
}
136-
if (decimal_point) {
137-
while (fractional_ptr <= fractional_end) {
125+
if (str_scale > 0) {
126+
while (fractional_ptr < fractional_end) {
138127
*nptr = CH_VAL(*fractional_ptr);
139128
nptr++;
140129
fractional_ptr++;
@@ -144,6 +133,10 @@ bool bc_str2num(bc_num *num, char *str, size_t scale)
144133

145134
return true;
146135

136+
zero:
137+
*num = bc_copy_num(BCG(_zero_));
138+
return true;
139+
147140
fail:
148141
*num = bc_copy_num(BCG(_zero_));
149142
return false;

0 commit comments

Comments
 (0)