aboutsummaryrefslogtreecommitdiffstats
path: root/strings.csc
blob: 0828363b0502db33da8e314608eae9290aef6bf1 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
(define-library (csc strings)
  (export
    find
    not-found-error?
    prefix?
    str-quote)
  (import (scheme base)
          (scheme case-lambda)
          (only (scheme write) write))
  (begin


    (define prefix?
      (case-lambda
        ((prefix str) (prefix? prefix str 0))
        ((prefix str start)
         (and (<= (string-length prefix) (- (string-length str) start))
              (string=? prefix (substring str start (+ start (string-length prefix))))))))


    (define (str-quote s)
      (let ((out (open-output-string)))
        (write s out)
        (get-output-string out)))


    (define-record-type <not-found-error>
      (make-not-found-error)
      not-found-error?)


    (define find
      (case-lambda
        ((match str) (find match str 0 (string-length str)))
        ((match str start) (find match str start (string-length str)))
        ((match str start end)
         (let loop ((i start))
           (cond ((>= i end) (raise (make-not-found-error)))
                 ((prefix? match str i) i)
                 (else (loop (+ 1 i))))))))))