aboutsummaryrefslogtreecommitdiff
path: root/interp/numTok.ml
diff options
context:
space:
mode:
Diffstat (limited to 'interp/numTok.ml')
-rw-r--r--interp/numTok.ml41
1 files changed, 24 insertions, 17 deletions
diff --git a/interp/numTok.ml b/interp/numTok.ml
index bb14649b91..e90e4d25d3 100644
--- a/interp/numTok.ml
+++ b/interp/numTok.ml
@@ -62,6 +62,13 @@ struct
compare s "0" = 0
end
+(* Helper function *)
+let div2_with_rest =
+ let two = Z.of_int 2 in
+ fun n ->
+ let res, rem = Z.div_rem n two in
+ res, Z.equal rem Z.one
+
type sign = SPlus | SMinus
type 'a exp = EDec of 'a | EBin of 'a
@@ -84,31 +91,31 @@ struct
(* nasty code to remove when switching to zarith
since zarith's of_string handles hexadecimal *)
match UnsignedNat.classify n with
- | CDec -> Bigint.of_string (to_string (sign,n))
+ | CDec -> Z.of_string (to_string (sign,n))
| CHex ->
let int_of_char c = match c with
| 'a'..'f' -> 10 + int_of_char c - int_of_char 'a'
| _ -> int_of_char c - int_of_char '0' in
- let c16 = Bigint.of_int 16 in
+ let c16 = Z.of_int 16 in
let s = UnsignedNat.to_string n in
- let n = ref Bigint.zero in
+ let n = ref Z.zero in
let len = String.length s in
for d = 2 to len - 1 do
- n := Bigint.(add (mult !n c16) (of_int (int_of_char s.[d])))
+ n := Z.(add (mul !n c16) (of_int (int_of_char s.[d])))
done;
- match sign with SPlus -> !n | SMinus -> Bigint.neg !n
+ match sign with SPlus -> !n | SMinus -> Z.neg !n
let to_bigint n = bigint_of_string n
let string_of_nonneg_bigint c n =
(* nasty code to remove when switching to zarith
since zarith's format handles hexadecimal *)
match c with
- | CDec -> Bigint.to_string n
+ | CDec -> Z.to_string n
| CHex ->
let div16 n =
- let n, r0 = Bigint.div2_with_rest n in
- let n, r1 = Bigint.div2_with_rest n in
- let n, r2 = Bigint.div2_with_rest n in
- let n, r3 = Bigint.div2_with_rest n in
+ let n, r0 = div2_with_rest n in
+ let n, r1 = div2_with_rest n in
+ let n, r2 = div2_with_rest n in
+ let n, r3 = div2_with_rest n in
let r = match r3, r2, r1, r0 with
| false, false, false, false -> "0"
| false, false, false, true -> "1"
@@ -129,14 +136,14 @@ struct
n, r in
let n = ref n in
let l = ref [] in
- while Bigint.is_strictly_pos !n do
+ while Int.equal 1 (Z.sign !n) do
let n', r = div16 !n in
n := n';
l := r :: !l
done;
"0x" ^ String.concat "" (List.rev !l)
let of_bigint c n =
- let sign, n = if Bigint.is_strictly_neg n then (SMinus, Bigint.neg n) else (SPlus, n) in
+ let sign, n = if Int.equal (-1) (Z.sign n) then (SMinus, Z.neg n) else (SPlus, n) in
(sign, string_of_nonneg_bigint c n)
end
@@ -339,13 +346,13 @@ struct
let frac = UnsignedNat.to_string frac in
let i = SignedNat.to_bigint (s, int ^ frac) in
let e =
- let e = if exp = "" then Bigint.zero else match exp.[1] with
- | '+' -> Bigint.of_string (UnsignedNat.to_string (string_del_head 2 exp))
- | '-' -> Bigint.(neg (of_string (UnsignedNat.to_string (string_del_head 2 exp))))
- | _ -> Bigint.of_string (UnsignedNat.to_string (string_del_head 1 exp)) in
+ let e = if exp = "" then Z.zero else match exp.[1] with
+ | '+' -> Z.of_string (UnsignedNat.to_string (string_del_head 2 exp))
+ | '-' -> Z.(neg (of_string (UnsignedNat.to_string (string_del_head 2 exp))))
+ | _ -> Z.of_string (UnsignedNat.to_string (string_del_head 1 exp)) in
let l = String.length frac in
let l = match c with CDec -> l | CHex -> 4 * l in
- Bigint.(sub e (of_int l)) in
+ Z.(sub e (of_int l)) in
(i, match c with CDec -> EDec e | CHex -> EBin e)
let of_bigint_and_exponent i e =