34 lines
1012 B
Racket
34 lines
1012 B
Racket
|
|
(module cmdargs mzscheme
|
|
|
|
(provide split-command-line-args)
|
|
|
|
(define (split-command-line-args v)
|
|
(let loop ([v (strip-leading-spaces (strip-trailing-spaces v))])
|
|
(if (string=? v "")
|
|
null
|
|
(let-values ([(s v) (let loop ([v v])
|
|
(cond
|
|
[(string=? v "") (values "" "")]
|
|
[(regexp-match #rx"^[ \t\r\n]" v) (values "" v)]
|
|
[(regexp-match-positions #rx"^\"[^\"]*\"" v)
|
|
=> (combine v loop 1)]
|
|
[(regexp-match-positions #rx"^'[^']*'" v)
|
|
=> (combine v loop 1)]
|
|
[(regexp-match-positions #rx"^[^ \t\r\n]+" v)
|
|
=> (combine v loop 0)]))])
|
|
(cons s (loop (strip-leading-spaces v)))))))
|
|
|
|
(define (combine v loop inset)
|
|
(lambda (m)
|
|
(let-values ([(rest leftover) (loop (substring v (cdar m)))])
|
|
(values (string-append
|
|
(substring v (+ (caar m) inset) (- (cdar m) inset)))
|
|
leftover))))
|
|
|
|
(define (strip-leading-spaces v)
|
|
(regexp-replace #rx"^[\t \r\n]+" v ""))
|
|
|
|
(define (strip-trailing-spaces v)
|
|
(regexp-replace #rx"[\t \r\n]+$" v "")))
|