(define-library (csc strings) (export str-find str-not-found-error? str-prefix? str-quote) (import (scheme base) (scheme case-lambda) (only (scheme write) write)) (begin (define str-prefix? (let ((str-prefix?' (lambda (prefix str start) (and (<= (string-length prefix) (- (string-length str) start)) (string=? prefix (substring str start (+ start (string-length prefix)))))))) (case-lambda ((prefix str) (str-prefix?' prefix str 0)) ((prefix str start) (str-prefix?' prefix str start))))) (define (str-quote s) (let ((out (open-output-string))) (write s out) (get-output-string out))) (define-record-type (make-str-not-found-error) str-not-found-error?) (define str-find (let ((str-find' (lambda (match str start end) (let loop ((i start)) (cond ((>= i end) (raise (make-str-not-found-error))) ((str-prefix? match str i) i) (else (loop (+ 1 i)))))))) (case-lambda ((match str) (str-find' match str 0 (string-length str))) ((match str start) (str-find' match str start (string-length str))) ((match str start end) (str-find' match str start end)))))))