38
38
bool bc_str2num (bc_num * num , char * str , size_t scale )
39
39
{
40
40
size_t digits = 0 ;
41
- size_t strscale = 0 ;
41
+ size_t str_scale = 0 ;
42
42
char * ptr , * nptr , * integer_ptr , * integer_end , * fractional_ptr = NULL , * fractional_end = NULL , * decimal_point ;
43
43
bool zero_int = false;
44
44
size_t len = strlen (str );
@@ -83,44 +83,42 @@ bool bc_str2num(bc_num *num, char *str, size_t scale)
83
83
/* search */
84
84
fractional_ptr = decimal_point + 1 ;
85
85
fractional_end = str + len - 1 ;
86
- bool has_trailing_zero = false;
87
- while (* fractional_end == '0' && fractional_end >= fractional_ptr ) {
86
+ while (* fractional_end == '0' && fractional_end >= decimal_point ) {
88
87
fractional_end -- ;
89
- has_trailing_zero = true;
90
- }
91
- if (has_trailing_zero ) {
92
- fractional_end ++ ;
93
88
}
89
+ fractional_end ++ ;
90
+ str_scale = fractional_end - fractional_ptr ;
94
91
95
92
/* validate */
96
- strscale = fractional_end - fractional_ptr ;
97
- if (strspn (fractional_ptr , "0123456789" ) < strscale ) {
93
+ if (strspn (fractional_ptr , "0123456789" ) < str_scale ) {
98
94
/* invalid num */
99
- * num = bc_copy_num (BCG (_zero_ ));
100
- return false;
95
+ goto fail ;
96
+ }
97
+
98
+ while (str_scale > scale ) {
99
+ fractional_end -- ;
100
+ str_scale -- ;
101
101
}
102
102
}
103
103
104
- if (digits + strscale == 0 ) {
105
- * num = bc_copy_num (BCG (_zero_ ));
106
- return true;
104
+ if (digits + str_scale == 0 ) {
105
+ goto zero ;
107
106
}
108
107
109
108
/* Adjust numbers and allocate storage and initialize fields. */
110
- strscale = MIN (strscale , scale );
111
109
if (digits == 0 ) {
112
110
zero_int = true;
113
111
digits = 1 ;
114
112
}
115
113
116
- * num = bc_new_num (digits , strscale );
114
+ * num = bc_new_num (digits , str_scale );
117
115
(* num )-> n_sign = num_sign ;
118
116
nptr = (* num )-> n_value ;
119
117
120
118
if (zero_int ) {
121
119
nptr ++ ;
122
- if (decimal_point ) {
123
- while (fractional_ptr <= fractional_end ) {
120
+ if (str_scale > 0 ) {
121
+ while (fractional_ptr < fractional_end ) {
124
122
* nptr = CH_VAL (* fractional_ptr );
125
123
nptr ++ ;
126
124
fractional_ptr ++ ;
@@ -133,8 +131,8 @@ bool bc_str2num(bc_num *num, char *str, size_t scale)
133
131
nptr ++ ;
134
132
integer_ptr ++ ;
135
133
}
136
- if (decimal_point ) {
137
- while (fractional_ptr <= fractional_end ) {
134
+ if (str_scale > 0 ) {
135
+ while (fractional_ptr < fractional_end ) {
138
136
* nptr = CH_VAL (* fractional_ptr );
139
137
nptr ++ ;
140
138
fractional_ptr ++ ;
@@ -144,6 +142,10 @@ bool bc_str2num(bc_num *num, char *str, size_t scale)
144
142
145
143
return true;
146
144
145
+ zero :
146
+ * num = bc_copy_num (BCG (_zero_ ));
147
+ return true;
148
+
147
149
fail :
148
150
* num = bc_copy_num (BCG (_zero_ ));
149
151
return false;
0 commit comments