diff --git a/.merlin b/.merlin index 385d469..d904327 100644 --- a/.merlin +++ b/.merlin @@ -6,3 +6,4 @@ B _build/tests/ B _build/bench/ PKG oUnit PKG benchmark +FLAG -safe-string diff --git a/_oasis b/_oasis index da48cfe..b84e725 100644 --- a/_oasis +++ b/_oasis @@ -30,6 +30,7 @@ Flag bigarray Library "sequence" Path: . Modules: Sequence + BuildDepends: bytes Library "invert" Path: invert diff --git a/_tags b/_tags index 5715982..45a0bee 100644 --- a/_tags +++ b/_tags @@ -28,3 +28,4 @@ : use_sequence # OASIS_STOP true: bin_annot +true: safe_string diff --git a/sequence.ml b/sequence.ml index 00dd7cd..e6d3ca5 100644 --- a/sequence.ml +++ b/sequence.ml @@ -751,7 +751,7 @@ module IO = struct fun k -> let ic = open_in_gen flags mode filename in try - let buf = String.create size in + let buf = Bytes.create size in let n = ref 0 in let stop = ref false in while not !stop do @@ -763,7 +763,7 @@ module IO = struct if n' = 0 then stop := true else n := !n + n'; done; if !n > 0 - then k (String.sub buf 0 !n) + then k (Bytes.sub_string buf 0 !n) done; close_in ic with e -> @@ -773,12 +773,19 @@ module IO = struct let write_to ?(mode=0o644) ?(flags=[Open_creat;Open_wronly]) filename seq = let oc = open_out_gen flags mode filename in try - seq (fun s -> output oc s 0 (String.length s)); + seq (fun s -> output oc s 0 (Bytes.length s)); close_out oc with e -> close_out oc; raise e + let write_str_to ?mode ?flags filename seq = + write_to ?mode ?flags filename (map Bytes.unsafe_of_string seq) + let write_lines ?mode ?flags filename seq = - write_to ?mode ?flags filename (snoc (intersperse "\n" seq) "\n") + let ret = Bytes.unsafe_of_string "\n" in + write_to ?mode ?flags filename (snoc (intersperse ret seq) ret) + + let write_str_lines ?mode ?flags filename seq = + write_lines ?mode ?flags filename (map Bytes.unsafe_of_string seq) end diff --git a/sequence.mli b/sequence.mli index 5397de7..7664060 100644 --- a/sequence.mli +++ b/sequence.mli @@ -586,13 +586,19 @@ module IO : sig different iterations might return different results *) val write_to : ?mode:int -> ?flags:open_flag list -> - string -> string t -> unit + string -> Bytes.t t -> unit (** [write_to filename seq] writes all strings from [seq] into the given file. It takes care of opening and closing the file. @param mode default [0o644] @param flags used by [open_out_gen]. Default: [[Open_creat;Open_wronly]]. *) + val write_str_to : ?mode:int -> ?flags:open_flag list -> + string -> string t -> unit + val write_lines : ?mode:int -> ?flags:open_flag list -> - string -> string t -> unit + string -> Bytes.t t -> unit (** Same as {!write_to}, but intercales ['\n'] between each string *) + + val write_str_lines : ?mode:int -> ?flags:open_flag list -> + string -> string t -> unit end