Skip to content

Commit e87f1f5

Browse files
committed
refactor bc_str2num
1 parent 8528ec5 commit e87f1f5

File tree

1 file changed

+23
-22
lines changed

1 file changed

+23
-22
lines changed

ext/bcmath/libbcmath/src/str2num.c

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,9 @@
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);
4544
sign num_sign = PLUS;
4645

4746
/* Prepare num. */
@@ -82,45 +81,43 @@ bool bc_str2num(bc_num *num, char *str, size_t scale)
8281
if (decimal_point) {
8382
/* search */
8483
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) {
84+
fractional_end = fractional_ptr + strlen(fractional_ptr) - 1;
85+
while (*fractional_end == '0' && fractional_end >= decimal_point) {
8886
fractional_end--;
89-
has_trailing_zero = true;
90-
}
91-
if (has_trailing_zero) {
92-
fractional_end++;
9387
}
88+
fractional_end++;
89+
str_scale = fractional_end - fractional_ptr;
9490

9591
/* validate */
96-
strscale = fractional_end - fractional_ptr;
97-
if (strspn(fractional_ptr, "0123456789") < strscale) {
92+
if (strspn(fractional_ptr, "0123456789") < str_scale) {
9893
/* invalid num */
99-
*num = bc_copy_num(BCG(_zero_));
100-
return false;
94+
goto fail;
95+
}
96+
97+
while (str_scale > scale) {
98+
fractional_end--;
99+
str_scale--;
101100
}
102101
}
103102

104-
if (digits + strscale == 0) {
105-
*num = bc_copy_num(BCG(_zero_));
106-
return true;
103+
if (digits + str_scale == 0) {
104+
goto zero;
107105
}
108106

109107
/* Adjust numbers and allocate storage and initialize fields. */
110-
strscale = MIN(strscale, scale);
111108
if (digits == 0) {
112109
zero_int = true;
113110
digits = 1;
114111
}
115112

116-
*num = bc_new_num(digits, strscale);
113+
*num = bc_new_num(digits, str_scale);
117114
(*num)->n_sign = num_sign;
118115
nptr = (*num)->n_value;
119116

120117
if (zero_int) {
121118
nptr++;
122-
if (decimal_point) {
123-
while (fractional_ptr <= fractional_end) {
119+
if (str_scale > 0) {
120+
while (fractional_ptr < fractional_end) {
124121
*nptr = CH_VAL(*fractional_ptr);
125122
nptr++;
126123
fractional_ptr++;
@@ -133,8 +130,8 @@ bool bc_str2num(bc_num *num, char *str, size_t scale)
133130
nptr++;
134131
integer_ptr++;
135132
}
136-
if (decimal_point) {
137-
while (fractional_ptr <= fractional_end) {
133+
if (str_scale > 0) {
134+
while (fractional_ptr < fractional_end) {
138135
*nptr = CH_VAL(*fractional_ptr);
139136
nptr++;
140137
fractional_ptr++;
@@ -144,6 +141,10 @@ bool bc_str2num(bc_num *num, char *str, size_t scale)
144141

145142
return true;
146143

144+
zero:
145+
*num = bc_copy_num(BCG(_zero_));
146+
return true;
147+
147148
fail:
148149
*num = bc_copy_num(BCG(_zero_));
149150
return false;

0 commit comments

Comments
 (0)