[m-rev.] for review: Slightly improve string stripping functions.

Peter Wang novalazy at gmail.com
Wed Oct 30 17:09:40 AEDT 2019


library/string.m:
    Use unsafe_between for chomp, lstrip_pred, rstrip_pred
    to avoid range checks.
---
 library/string.m | 16 +++++++++++-----
 1 file changed, 11 insertions(+), 5 deletions(-)

diff --git a/library/string.m b/library/string.m
index 37da065af..32d835c8c 100644
--- a/library/string.m
+++ b/library/string.m
@@ -4620,8 +4620,8 @@ pad_right(String0, PadChar, Width, String) :-
     ).
 
 chomp(S) = Chomp :-
-    ( if prev_index(S, length(S), Offset, '\n') then
-        Chomp = left(S, Offset)
+    ( if prev_index(S, length(S), Index, '\n') then
+        Chomp = unsafe_between(S, 0, Index)
     else
         Chomp = S
     ).
@@ -4629,15 +4629,21 @@ chomp(S) = Chomp :-
 strip(S0) = S :-
     L = prefix_length(char.is_whitespace, S0),
     R = suffix_length(char.is_whitespace, S0),
-    S = between(S0, L, length(S0) - R).
+    Start = L,
+    End = max(L, length(S0) - R),
+    S = unsafe_between(S0, Start, End).
 
 lstrip(S) = lstrip_pred(char.is_whitespace, S).
 
 rstrip(S) = rstrip_pred(char.is_whitespace, S).
 
-lstrip_pred(P, S) = right(S, length(S) - prefix_length(P, S)).
+lstrip_pred(P, S0) = S :-
+    L = prefix_length(P, S0),
+    S = unsafe_between(S0, L, length(S0)).
 
-rstrip_pred(P, S) = left(S, length(S) - suffix_length(P, S)).
+rstrip_pred(P, S0) = S :-
+    R = suffix_length(P, S0),
+    S = unsafe_between(S0, 0, length(S0) - R).
 
 %---------------------%
 
-- 
2.23.0



More information about the reviews mailing list