(define-library (csc strings) (export contains? has-prefix? index join split str-quote) (import (scheme base) (only (scheme case-lambda) case-lambda) (only (scheme write) write) (only (csc list) intercalate) (only (csc loop) loop return)) (begin (define (has-prefix? str prefix) (and (<= (string-length prefix) (string-length str)) (string=? prefix (substring str 0 (string-length prefix))))) (define (str-quote s) (let ((out (open-output-string))) (write s out) (get-output-string out))) (define (index s substr) (loop for i from 0 for s = s then (string-copy s 1) until (string=? "" s) if (has-prefix? s substr) return i finally (return -1))) (define (contains? s substr) (if (string=? "" substr) #t (not (negative? (index s substr))))) (define (join sep strings) (apply string-append (intercalate sep strings))) (define split (case-lambda ((s sep n) (if (= 0 n) '() (loop for n = n then (- n 1) for s = s then (string-copy s (+ i (string-length sep))) for i = (let ((i (index s sep))) (if (or (negative? i) (= 1 n)) (string-length s) i)) collect (substring s 0 i) while (< i (string-length s))))) ((s sep) (split s sep -1))))))