@@ -138,13 +138,18 @@ let conv_bigint = s =>
138138 let accBits = ref (0 );
139139 let results = ref ([] );
140140 for (i in String . length(s) - 1 downto first) {
141- let digit = Int64 . of_int(digit_value(s. [i]));
142- acc := Int64 . logor(acc^, Int64 . shift_left(digit, accBits^ ));
143- accBits := accBits^ + bits;
144- if (accBits^ >= 64 ) {
145- results := [ acc^, ... results^ ] ;
146- accBits := accBits^ - 64 ;
147- acc := Int64 . shift_right_logical(digit, bits - accBits^ );
141+ switch (s. [i]) {
142+ | ('0' .. '9' | 'a' .. 'f' | 'A' .. 'F' ) as digit =>
143+ let digit = Int64 . of_int(digit_value(digit));
144+ acc := Int64 . logor(acc^, Int64 . shift_left(digit, accBits^ ));
145+ accBits := accBits^ + bits;
146+ if (accBits^ >= 64 ) {
147+ results := [ acc^, ... results^ ] ;
148+ accBits := accBits^ - 64 ;
149+ acc := Int64 . shift_right_logical(digit, bits - accBits^ );
150+ };
151+ | '_' => ()
152+ | _ => failwith ("Impossible: Bad char" )
148153 };
149154 };
150155 if (Int64 . unsigned_compare(acc^, Int64 . zero) > 0 ) {
@@ -171,21 +176,26 @@ let conv_bigint = s =>
171176 };
172177 let get_chunk = ((start_idx, end_idx)) => {
173178 let result = ref (Int64 . zero);
179+ let valid_digits = ref (0 );
174180 for (i in start_idx to end_idx - 1 ) {
175- result :=
176- Int64 . add(
177- Int64 . mul(result^, Int64 . of_int(base)),
178- Int64 . of_int(digit_value(s. [i])),
179- );
181+ let digit = s. [i];
182+ if (digit != '_' ) {
183+ incr (valid_digits);
184+ result :=
185+ Int64 . add(
186+ Int64 . mul(result^, Int64 . of_int(base)),
187+ Int64 . of_int(digit_value(s. [i])),
188+ );
189+ };
180190 };
181- result^;
191+ ( result^, valid_digits ^ ) ;
182192 };
183193 // factor == 10l ** (places_at_a_time)
184- let factor =
194+ let get_factor = num_digits =>
185195 List . fold_left(
186196 Int32 . mul,
187197 Int32 . one,
188- List . init(places_at_a_time , n => Int32 . of_int(base)),
198+ List . init(num_digits , n => Int32 . of_int(base)),
189199 );
190200 let chunks =
191201 List . map(
@@ -194,10 +204,10 @@ let conv_bigint = s =>
194204 );
195205 let result =
196206 List . fold_left(
197- (acc, chunk) => {
207+ (acc, ( chunk, num_digits) ) => {
198208 let ret =
199209 Mini_bigint . unsigned_add_i64(
200- Mini_bigint . unsigned_mul_i32(acc, factor ),
210+ Mini_bigint . unsigned_mul_i32(acc, get_factor(num_digits) ),
201211 chunk,
202212 );
203213 ret;
0 commit comments