From 89b0e397f78b316a1b0be582abdc3dc8f2381e1a Mon Sep 17 00:00:00 2001 From: Rudi Grinberg Date: Sun, 27 May 2018 01:23:55 +0700 Subject: [PATCH] Check suffix and prefix without allocation Signed-off-by: Rudi Grinberg --- src/stdune/string.ml | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/stdune/string.ml b/src/stdune/string.ml index 3b6995d7..3e5920b5 100644 --- a/src/stdune/string.ml +++ b/src/stdune/string.ml @@ -29,17 +29,24 @@ let break s ~pos = let is_empty s = length s = 0 +let rec check_prefix s ~prefix len i = + i = len || s.[i] = prefix.[i] && check_prefix s ~prefix len (i + 1) + +let rec check_suffix s ~suffix suffix_len offset i = + i = suffix_len || + s.[offset + i] = suffix.[i] && + check_suffix s ~suffix suffix_len offset (i + 1) + let is_prefix s ~prefix = let len = length s in let prefix_len = length prefix in - len >= prefix_len && - sub s ~pos:0 ~len:prefix_len = prefix + len >= prefix_len && (check_prefix s ~prefix prefix_len 0) let is_suffix s ~suffix = let len = length s in let suffix_len = length suffix in len >= suffix_len && - sub s ~pos:(len - suffix_len) ~len:suffix_len = suffix + (check_suffix s ~suffix suffix_len (len - suffix_len) 0) let drop_prefix s ~prefix = if is_prefix s ~prefix then