mirror of
https://github.com/AdaCore/why3.git
synced 2026-02-12 12:34:55 -08:00
50 lines
946 B
OCaml
50 lines
946 B
OCaml
|
|
open BigInt__N
|
|
|
|
exception SyntaxError
|
|
|
|
let times10 a =
|
|
let a2 = add a a in
|
|
let a4 = add a2 a2 in
|
|
let a5 = add a4 a in
|
|
add a5 a5
|
|
|
|
let parse_dec s idx =
|
|
let a = ref (from_small_int 0) in
|
|
let i = ref idx in
|
|
try
|
|
while !i < String.length s do
|
|
match String.get s !i with
|
|
| '0'..'9' as c ->
|
|
let d = Char.code c - Char.code '0' in
|
|
a := add (times10 !a) (from_small_int d);
|
|
i := succ !i
|
|
| _ ->
|
|
raise Exit
|
|
done;
|
|
raise Exit
|
|
with Exit ->
|
|
if !i = idx then raise SyntaxError else !a,!i
|
|
|
|
let parse_sep_star s idx =
|
|
let i = ref idx in
|
|
try
|
|
while !i < String.length s do
|
|
match String.get s !i with
|
|
| ' ' | '\t' | '\n' | '\r' -> i := succ !i
|
|
| _ -> raise Exit
|
|
done;
|
|
raise Exit
|
|
with Exit -> !i
|
|
|
|
open Format
|
|
|
|
let pr fmt a =
|
|
let a = a.digits in
|
|
let l = Array.length a in
|
|
fprintf fmt "%d" a.(l-1);
|
|
for i=l-2 downto 0 do
|
|
fprintf fmt "%04d" a.(i);
|
|
done
|
|
|