More error checking on some SRE syntax

When char-set, w/case, w/nocase, w/ascii or w/unicode is applied on a
<cset-sre>, only (cadr sre) is taken, the rest is ignored. Which is the
right thing to do only if (null? (cddr sre)). If there are more
arguments, error out instead of silently ignoring them.
This commit is contained in:
Nguyễn Thái Ngọc Duy 2019-07-21 10:41:30 +07:00
parent b3831c3995
commit 829d963a9d

View file

@ -676,7 +676,9 @@
(if (string? (car sre)) (if (string? (car sre))
(maybe-ci (string->char-set (car sre))) (maybe-ci (string->char-set (car sre)))
(case (car sre) (case (car sre)
((char-set) (maybe-ci (string->char-set (cadr sre)))) ((char-set) (if (null? (cddr sre))
(maybe-ci (string->char-set (cadr sre)))
(error "(char-set) takes only one char-set" sre)))
((/ char-range) ((/ char-range)
(->cs (->cs
`(or ,@(map (lambda (x) `(or ,@(map (lambda (x)
@ -689,10 +691,18 @@
((~ complement) (char-set-complement (->cs `(or ,@(cdr sre))))) ((~ complement) (char-set-complement (->cs `(or ,@(cdr sre)))))
((- difference) (char-set-difference (->cs (cadr sre)) ((- difference) (char-set-difference (->cs (cadr sre))
(->cs `(or ,@(cddr sre))))) (->cs `(or ,@(cddr sre)))))
((w/case) (sre->char-set (cadr sre) (flag-clear flags ~ci?))) ((w/case) (if (null? (cddr sre))
((w/nocase) (sre->char-set (cadr sre) (flag-join flags ~ci?))) (sre->char-set (cadr sre) (flag-clear flags ~ci?))
((w/ascii) (sre->char-set (cadr sre) (flag-join flags ~ascii?))) (error "w/case takes only one char-set" sre)))
((w/unicode) (sre->char-set (cadr sre) (flag-clear flags ~ascii?))) ((w/nocase) (if (null? (cddr sre))
(sre->char-set (cadr sre) (flag-join flags ~ci?))
(error "w/nocase takes only one char-set" sre)))
((w/ascii) (if (null? (cddr sre))
(sre->char-set (cadr sre) (flag-join flags ~ascii?))
(error "w/ascii takes only one char-set" sre)))
((w/unicode) (if (null? (cddr sre))
(sre->char-set (cadr sre) (flag-clear flags ~ascii?))
(error "w/unicode takes only one char-set" sre)))
(else (error "invalid sre char-set" sre))))) (else (error "invalid sre char-set" sre)))))
(else (error "invalid sre char-set" sre))))) (else (error "invalid sre char-set" sre)))))