Files
fuse-tar/bin/octal.ml
2025-11-26 23:36:52 +03:00

44 lines
1.0 KiB
OCaml

let until_nul s =
match String.index_opt s '\x00' with
| None -> s
| Some i -> String.sub s 0 i
module type IntType = sig
type t
val add : t -> t -> t
val sub : t -> t -> t
val mul : t -> t -> t
val of_int : int -> t
val to_int : t -> int
end
module IntForInt = struct
type t = int
let add = Int.add
let sub = Int.sub
let mul = Int.mul
let of_int x = x
let to_int x = x
end
let octal_reader (type a) (module I : IntType with type t = a) sin : a =
let ( + ) = I.add in
let ( * ) = I.mul in
let ( - ) = I.sub in
let s = (until_nul sin) in
let l = List.init (String.length s) (String.get s) in
let rec aux a = function
| c :: rest ->
if (Char.code c) > (Char.code '7') || (Char.code c) < (Char.code '0') then
I.of_int 0
else
aux ((a * (I.of_int 8)) + (I.of_int (int_of_char c)) - (I.of_int (int_of_char '0'))) rest
| [] -> a
in aux (I.of_int 0) l
(* lmao *)
let to_int = octal_reader (module IntForInt)
let to_int64 = octal_reader (module Int64)