ustring (string-trim): Handle strings trimmed to nothing.
authorMatt Birkholz <matt@birchwood-abbey.net>
Thu, 2 Nov 2017 16:00:09 +0000 (09:00 -0700)
committerMatt Birkholz <matt@birchwood-abbey.net>
Thu, 2 Nov 2017 16:00:09 +0000 (09:00 -0700)
Also added tests for string-trim.  Thanks to Peter <craven@gmx.net>.

src/runtime/ustring.scm
tests/runtime/test-string.scm

index 2cada76b39d80691d34356a8eed897542a006a07..dd7394479255255cfaf7a1b1a733cd1d8c5b90a8 100644 (file)
@@ -1962,23 +1962,23 @@ USA.
     (let ((predicate (char-matcher->predicate to-trim 'string-trimmer))
          (get-trimmed (if copy? substring string-slice)))
       (lambda (string)
-       (let ((end (string-length string)))
-         (get-trimmed
-          string
-          (if (eq? where 'trailing)
-              0
-              (let loop ((index 0))
-                (if (and (fix:< index end)
-                         (predicate (string-ref string index)))
-                    (loop (fix:+ index 1))
-                    index)))
-          (if (eq? where 'leading)
-              end
-              (let loop ((index end))
-                (if (and (fix:> index 0)
-                         (predicate (string-ref string (fix:- index 1))))
-                    (loop (fix:- index 1))
-                    index)))))))))
+       (let* ((end (string-length string))
+              (start (if (eq? where 'trailing)
+                         0
+                         (let loop ((index 0))
+                           (if (and (fix:< index end)
+                                    (predicate (string-ref string index)))
+                               (loop (fix:+ index 1))
+                               index))))
+              (end (if (eq? where 'leading)
+                       end
+                       (let loop ((index end))
+                         (if (and (fix:> index 0)
+                                  (predicate
+                                   (string-ref string (fix:- index 1))))
+                             (loop (fix:- index 1))
+                             index)))))
+         (get-trimmed string (min start end) end))))))
 
 (define-deferred string-trimmer-options
   (keyword-option-parser
index 44f37966a6549d74d72f1a47c72d1e0acf7d4000..0291229d2cf0a76b2e17e94dd4ae61dc297a3d71 100644 (file)
@@ -3075,4 +3075,19 @@ USA.
         (#t #\x0061 #f #\x005F #f #\x0061 #t #\x002C #t #\x002C #t #\x0031 #t)
         (#t #\x0061 #t #\x002C #t #\x002C #t #\x0061 #t)
         (#t #\x0061 #f #\x005F #f #\x0031 #t #\x002C #t #\x002C #t #\x0061 #t)
-        (#t #\x0061 #f #\x005F #f #\x0061 #t #\x002C #t #\x002C #t #\x0061 #t))))
\ No newline at end of file
+        (#t #\x0061 #f #\x005F #f #\x0061 #t #\x002C #t #\x002C #t #\x0061 #t))))
+\f
+(define-test 'string-trim
+  (lambda ()
+    (define-integrable = assert-string=)
+    (= "foo" (string-trim "foo   "))
+    (= "foo" (string-trim "   foo"))
+    (= "foo" (string-trim "   foo   "))
+    (= "foo   " (string-trim-left "   foo   "))
+    (= "   foo" (string-trim-right "   foo   "))
+    (= "" (string-trim "\"\"" (char-set-invert (char-set #\"))))
+    (= "" (string-trim-left "\"\"" (char-set-invert (char-set #\"))))
+    (= "" (string-trim-right "\"\"" (char-set-invert (char-set #\"))))
+    (= "foo" (string-trim "aaafooaaa" (char-set #\f #\o)))
+    (= "fooaaa" (string-trim-left "aaafooaaa" (char-set #\f #\o)))
+    (= "aaafoo" (string-trim-right "aaafooaaa" (char-set #\f #\o)))))
\ No newline at end of file