package xtmpl
Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file misc.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 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
(*********************************************************************************) (* Xtmpl *) (* *) (* Copyright (C) 2012-2021 Institut National de Recherche en Informatique *) (* et en Automatique. All rights reserved. *) (* *) (* This program is free software; you can redistribute it and/or modify *) (* it under the terms of the GNU Lesser General Public License version *) (* 3 as published by the Free Software Foundation. *) (* *) (* This program is distributed in the hope that it will be useful, *) (* but WITHOUT ANY WARRANTY; without even the implied warranty of *) (* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *) (* GNU Library General Public License for more details. *) (* *) (* You should have received a copy of the GNU Lesser General Public *) (* License along with this program; if not, write to the Free Software *) (* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA *) (* 02111-1307 USA *) (* *) (* Contact: Maxence.Guesdon@inria.fr *) (* *) (* *) (*********************************************************************************) (** *) (*c==v=[File.string_of_file]=1.1====*) let string_of_file name = let chanin = open_in_bin name in let len = 1024 in let s = Bytes.create len in let buf = Buffer.create len in let rec iter () = try let n = input chanin s 0 len in if n = 0 then () else ( Buffer.add_subbytes buf s 0 n; iter () ) with End_of_file -> () in iter (); close_in chanin; Buffer.contents buf (*/c==v=[File.string_of_file]=1.1====*) (*c==v=[String.split_string]=1.2====*) let split_string ?(keep_empty=false) s chars = let len = String.length s in let rec iter acc pos = if pos >= len then match acc with "" -> if keep_empty then [""] else [] | _ -> [acc] else if List.mem s.[pos] chars then match acc with "" -> if keep_empty then "" :: iter "" (pos + 1) else iter "" (pos + 1) | _ -> acc :: (iter "" (pos + 1)) else iter (Printf.sprintf "%s%c" acc s.[pos]) (pos + 1) in iter "" 0 (*/c==v=[String.split_string]=1.2====*) (*c==v=[String.strip_string]=1.0====*) let strip_string s = let len = String.length s in let rec iter_first n = if n >= len then None else match s.[n] with ' ' | '\t' | '\n' | '\r' -> iter_first (n+1) | _ -> Some n in match iter_first 0 with None -> "" | Some first -> let rec iter_last n = if n <= first then None else match s.[n] with ' ' | '\t' | '\n' | '\r' -> iter_last (n-1) | _ -> Some n in match iter_last (len-1) with None -> String.sub s first 1 | Some last -> String.sub s first ((last-first)+1) (*/c==v=[String.strip_string]=1.0====*) (*c==v=[File.file_of_string]=1.1====*) let file_of_string ~file s = let oc = open_out file in output_string oc s; close_out oc (*/c==v=[File.file_of_string]=1.1====*)