1#lang racket/base
2(require "config.rkt"
3         "special.rkt"
4         "wrap.rkt"
5         "readtable.rkt"
6         "consume.rkt"
7         "accum-string.rkt"
8         "error.rkt"
9         "string.rkt")
10
11(provide read-regexp)
12
13(define (read-regexp mode-c accum-str in config)
14  (define c3 (read-char/special in config))
15  (define no-wrap-config (disable-wrapping config))
16
17  (define rx
18    (case c3
19      [(#\")
20       (accum-string-abandon! accum-str config)
21       (define str (read-string in no-wrap-config))
22       (catch-and-reraise-as-reader
23        in config
24        ((if (char=? mode-c #\r) regexp pregexp) str))]
25      [(#\#)
26       (accum-string-add! accum-str c3)
27       (define c4 (read-char/special in config))
28       (case c4
29         [(#\")
30          (accum-string-abandon! accum-str config)
31          (define bstr
32            (read-string in no-wrap-config #:mode '|byte string|))
33          (catch-and-reraise-as-reader
34           in config
35           ((if (char=? mode-c #\r) byte-regexp byte-pregexp) bstr))]
36         [else
37          (reader-error in config #:due-to c4
38                        "expected `\"` after `~a`"
39                        (accum-string-get! accum-str config))])]
40      [else
41       (reader-error in config #:due-to c3
42                     "expected `\"` or `#` after `~a`"
43                     (accum-string-get! accum-str config))]))
44
45  (wrap rx
46        in
47        config
48        #f))
49