diff options
Diffstat (limited to 'strings.csc')
| -rw-r--r-- | strings.csc | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/strings.csc b/strings.csc new file mode 100644 index 0000000..963565c --- /dev/null +++ b/strings.csc @@ -0,0 +1,42 @@ +(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 <str-not-found-error> + (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))))))) |
