[PATCH] mllib: Add isspace, triml, trimr and trim functions.
--- mllib/common_utils.ml | 29 +++++++++++++++++++++++++++++ mllib/common_utils.mli | 8 ++++++++ 2 files changed, 37 insertions(+) diff --git a/mllib/common_utils.ml b/mllib/common_utils.ml index 64bf3d3..34e1285 100644 --- a/mllib/common_utils.ml +++ b/mllib/common_utils.ml @@ -49,6 +49,35 @@ module String = struct and len = length str in len >= sufflen && sub str (len - sufflen) sufflen = suffix + (* Note OCaml stdlib has an "is_space" function. *) + let isspace c = + c = ' ' + (* || c = '\f' *) || c = '\n' || c = '\r' || c = '\t' (* || c = '\v' *) + + let triml ?(test = isspace) str = + let i = ref 0 in + let n = ref (String.length str) in + while !n > 0 && test str.[!i]; do + decr n; + incr i + done; + if !i = 0 then str + else String.sub str !i !n + + let trimr ?(test = isspace) str = + let n = ref (String.length str) in + while !n > 0 && test str.[!n-1]; do + decr n + done; + if !n = String.length str then str + else String.sub str 0 !n + + (* Note OCaml stdlib has a function with the same name and + * different signature. + *) + let trim ?(test = isspace) str = + trimr ~test (triml ~test str) + let rec find s sub = let len = length s in let sublen = length sub in diff --git a/mllib/common_utils.mli b/mllib/common_utils.mli index 5b0b9bb..a04a784 100644 --- a/mllib/common_utils.mli +++ b/mllib/common_utils.mli @@ -56,6 +56,14 @@ module String : sig (** [is_prefix str prefix] returns true if [prefix] is a prefix of [str]. *) val is_suffix : string -> string -> bool (** [is_suffix str suffix] returns true if [suffix] is a suffix of [str]. *) + val isspace : char -> bool + (** Return true if char is a whitespace character. *) + val triml : ?test:(char -> bool) -> string -> string + (** Trim left. *) + val trimr : ?test:(char -> bool) -> string -> string + (** Trim right. *) + val trim : ?test:(char -> bool) -> string -> string + (** Trim left and right. *) val find : string -> string -> int (** [find str sub] searches for [sub] as a substring of [str]. If found it returns the index. If not found, it returns [-1]. *) -- 2.7.4
On Thursday 16 June 2016 14:44:19 Richard W.M. Jones wrote:
--- mllib/common_utils.ml | 29 +++++++++++++++++++++++++++++ mllib/common_utils.mli | 8 ++++++++ 2 files changed, 37 insertions(+)
The patch makes sense to me, I'd like to use these in the customize code. Just one note below.
diff --git a/mllib/common_utils.ml b/mllib/common_utils.ml index 64bf3d3..34e1285 100644 --- a/mllib/common_utils.ml +++ b/mllib/common_utils.ml @@ -49,6 +49,35 @@ module String = struct and len = length str in len >= sufflen && sub str (len - sufflen) sufflen = suffix
+ (* Note OCaml stdlib has an "is_space" function. *) + let isspace c = + c = ' ' + (* || c = '\f' *) || c = '\n' || c = '\r' || c = '\t' (* || c = '\v' *)
Since it's new code for Common_utils, why not just use the standard is_space here, and in case provide an own function only where needed? This way we can easily drop these implementations when bumping the required OCaml version to 4.00. Thanks, -- Pino Toscano
participants (2)
-
Pino Toscano -
Richard W.M. Jones