package shakuhachi
Source file util.ml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64(*****************************************************************************) (* *) (* Copyright (C) 2026 Yves Ndiaye *) (* *) (* This Source Code Form is subject to the terms of the Mozilla Public *) (* License, v. 2.0. If a copy of the MPL was not distributed with this *) (* file, You can obtain one at https://mozilla.org/MPL/2.0/. *) (* *) (*****************************************************************************) module StringUtil = struct let make_path_safe s = String.map (function '/' | '\\' | '\000' -> '_' | c -> c) s end module ListUtil = struct let rec fold_ok f acc = function | [] -> Result.ok acc | t :: q -> let ( let* ) = Result.bind in let* acc = f acc t in fold_ok f acc q end module FileSys = struct let split_path s = let regex = Re.(compile @@ str Filename.dir_sep) in Re.split regex s let rec remove_prefix prefix path = match (prefix, path) with | [], [] | _ :: _, [] -> String.empty | [], (_ :: _ as s) -> String.concat Filename.dir_sep s | t1 :: q1, (t2 :: q2 as s) -> if String.equal t1 t2 then remove_prefix q1 q2 else String.concat Filename.dir_sep s let remove_prefix prefix path = let prefix = Unix.realpath prefix in let path = Unix.realpath path in let prefix = split_path prefix in let path = split_path path in remove_prefix prefix path let read_chan chan = let buffer = Buffer.create 4_096 in let size = 1024 in let bytes = Bytes.create size in let continue = ref true in let () = while !continue do let read = input chan bytes 0 size in let () = Buffer.add_subbytes buffer bytes 0 read in continue := read = size done in Buffer.contents buffer end