diff --git a/lib/chibi/snow/fort.scm b/lib/chibi/snow/fort.scm index e2d2aa8f..6797294d 100644 --- a/lib/chibi/snow/fort.scm +++ b/lib/chibi/snow/fort.scm @@ -19,7 +19,7 @@ (define (extract-snowball-package bv) (define (path-top path) - (substring path (string-cursor-start path) (string-find path #\/))) + (substring-cursor path (string-cursor-start path) (string-find path #\/))) (guard (exn (else (log-error "couldn't extract package.scm: " exn) diff --git a/lib/chibi/string-test.sld b/lib/chibi/string-test.sld index 07ad05a4..2890bfa8 100644 --- a/lib/chibi/string-test.sld +++ b/lib/chibi/string-test.sld @@ -79,15 +79,15 @@ (test "" (string-trim " ")) (test "" (string-trim " ")) - ;; (test #t (string-prefix? "abc" "abc")) - ;; (test #t (string-prefix? "abc" "abcde")) - ;; (test #f (string-prefix? "abcde" "abc")) + (test #t (string-prefix? "abc" "abc")) + (test #t (string-prefix? "abc" "abcde")) + (test #f (string-prefix? "abcde" "abc")) - ;; (test #t (string-suffix? "abc" "abc")) - ;; (test #f (string-suffix? "abc" "abcde")) - ;; (test #f (string-suffix? "abcde" "abc")) - ;; (test #f (string-suffix? "abcde" "cde")) - ;; (test #t (string-suffix? "cde" "abcde")) + (test #t (string-suffix? "abc" "abc")) + (test #f (string-suffix? "abc" "abcde")) + (test #f (string-suffix? "abcde" "abc")) + (test #f (string-suffix? "abcde" "cde")) + (test #t (string-suffix? "cde" "abcde")) (test 3 (string-count "!a0 bc /.," char-alphabetic?)) diff --git a/lib/chibi/string.scm b/lib/chibi/string.scm index cd497a62..eddb7358 100644 --- a/lib/chibi/string.scm +++ b/lib/chibi/string.scm @@ -198,11 +198,14 @@ ;;> Returns true iff \var{suffix} is a suffix of \var{str}. (define (string-suffix? suffix str) - (string-cursor=? (string-cursor-prev suffix (string-cursor-start suffix)) - (string-cursor-back - str - (string-mismatch-right suffix str) - (- (string-size str) (string-size suffix))))) + (let ((diff (- (string-size str) (string-size suffix)))) + (and (>= diff 0) + (string-cursor=? (string-cursor-prev suffix + (string-cursor-start suffix)) + (string-cursor-back + str + (string-mismatch-right suffix str) + diff))))) ;;> The fundamental string iterator. Calls \var{kons} on each ;;> character of \var{str} and an accumulator, starting with @@ -323,14 +326,14 @@ ;;> the cursor \var{i}. (define (string-cursor-forward str cursor n) - (if (zero? n) - cursor - (string-cursor-forward str (string-cursor-next str cursor) (- n 1)))) + (if (positive? n) + (string-cursor-forward str (string-cursor-next str cursor) (- n 1)) + cursor)) (define (string-cursor-back str cursor n) - (if (zero? n) - cursor - (string-cursor-back str (string-cursor-prev str cursor) (- n 1)))) + (if (positive? n) + (string-cursor-back str (string-cursor-prev str cursor) (- n 1)) + cursor)) ;;> \procedure{(string-cursor \procedure{(string-cursor>? i j)} diff --git a/lib/chibi/tar.scm b/lib/chibi/tar.scm index 8571d55e..0207ce15 100644 --- a/lib/chibi/tar.scm +++ b/lib/chibi/tar.scm @@ -97,7 +97,7 @@ ;; not a tar-bomb and no absolute paths (define (tar-safe? tarball) (define (path-top path) - (substring path 0 (string-find path #\/))) + (substring-cursor path (string-cursor-start path) (string-find path #\/))) (let ((files (map path-normalize (tar-files tarball)))) (and (every path-relative? files) (or (< (length files) 2) diff --git a/lib/chibi/uri.scm b/lib/chibi/uri.scm index 277d4ca5..3a19626a 100644 --- a/lib/chibi/uri.scm +++ b/lib/chibi/uri.scm @@ -350,7 +350,7 @@ (uri-with-path (uri-with-fragment (uri-with-query uri #f) #f) (path-resolve path - (if (string-suffix? (uri-path uri) "/") + (if (string-suffix? "/" (uri-path uri)) (uri-path uri) (path-directory (uri-path uri))))) (path-resolve path orig-uri)))))