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