fun line ->
Pcre.pmatch ~rex:blank_line_RE line
+let normalize_dir s = (* append "/" if missing *)
+ let len = String.length s in
+ try
+ if s.[len - 1] = '/' then s
+ else s ^ "/"
+ with Invalid_argument _ -> (* string is empty *) "/"
+
+let strip_trailing_slash s =
+ try
+ let len = String.length s in
+ if s.[len - 1] = '/' then String.sub s 0 (len - 1)
+ else s
+ with Invalid_argument _ -> s
+
+let strip_suffix ~suffix s =
+ try
+ let s_len = String.length s in
+ let suffix_len = String.length suffix in
+ let suffix_sub = String.sub s (s_len - suffix_len) suffix_len in
+ if suffix_sub <> suffix then raise (Invalid_argument "");
+ String.sub s 0 (s_len - suffix_len)
+ with Invalid_argument _ ->
+ raise (Invalid_argument "Http_getter_misc.strip_suffix")
+
+let rec list_uniq = function
+ | [] -> []
+ | h::[] -> [h]
+ | h1::h2::tl when h1 = h2 -> list_uniq (h2 :: tl)
+ | h1::tl (* when h1 <> h2 *) -> h1 :: list_uniq tl
+
+let extension s =
+ let idx = String.rindex s '.' in
+ String.sub s idx (String.length s - idx)
+
(** like Hashtbl.iter but keys are processed ordered *)
val hashtbl_sorted_iter : ('a -> 'b -> unit) -> ('a, 'b) Hashtbl.t -> unit
+val list_uniq: 'a list -> 'a list (* uniq unix filter on lists *)
+
(** cp frontend *)
val cp: string -> string -> unit
(** wget frontend, if output is given it is the destination file, otherwise
suffix is used (actually "_http_getter" *)
val tempfile: unit -> string
(** mkdir frontend, if parents = true also parent directories will be created.
- If the given directory already exists doesn't act *)
-val mkdir: ?parents: bool -> string -> unit
+ If the given directory already exists doesn't act.
+ parents defaults to false *)
+val mkdir: ?parents:bool -> string -> unit
(** pretty printer for Unix.process_status values *)
val string_of_proc_status : Unix.process_status -> string
(** true on blanks-only and #-commented lines, false otherwise *)
val is_blank_line: string -> bool
+val normalize_dir: string -> string (** add trailing "/" if missing *)
+val strip_trailing_slash: string -> string
+val strip_suffix: suffix:string -> string -> string
+
+val extension: string -> string (** @return string part after rightmost "." *)
+