56 lines
1.9 KiB
Scheme
56 lines
1.9 KiB
Scheme
;;; Splitting the command line at `--'.
|
|
;;;
|
|
;;; getopt-long cannot do this: it consumes the separator and merges
|
|
;;; everything after it into `@' alongside the input file. So sexc
|
|
;;; splits the raw argv first, and only the head is parsed as options.
|
|
;;; Everything else reaches the C compiler exactly as written --
|
|
;;; including the words that do not start with a dash, which a previous
|
|
;;; leading-dash heuristic used to drop.
|
|
|
|
(import sexc)
|
|
|
|
(define full '("foo.sex" "-o" "bar" "--" "-framework" "OpenGL" "-Wall"))
|
|
|
|
(test-group "argument separator"
|
|
|
|
(test "options and input file stay with sexc"
|
|
'("foo.sex" "-o" "bar")
|
|
(args-before-separator full))
|
|
|
|
(test "the tail reaches the compiler verbatim"
|
|
'("-framework" "OpenGL" "-Wall")
|
|
(args-after-separator full))
|
|
|
|
;; The case that motivated this: `OpenGL' has no leading dash and was
|
|
;; silently dropped, leaving `-framework' to swallow whatever flag
|
|
;; came next.
|
|
(test "a word without a dash survives"
|
|
'("-framework" "OpenGL")
|
|
(args-after-separator '("x.sex" "--" "-framework" "OpenGL")))
|
|
|
|
(test "no separator means nothing for the compiler"
|
|
'()
|
|
(args-after-separator '("foo.sex" "-o" "bar")))
|
|
|
|
(test "no separator leaves every argument with sexc"
|
|
'("foo.sex" "-o" "bar")
|
|
(args-before-separator '("foo.sex" "-o" "bar")))
|
|
|
|
(test "a trailing separator is allowed"
|
|
'()
|
|
(args-after-separator '("foo.sex" "--")))
|
|
|
|
(test "a leading separator leaves no input file"
|
|
'()
|
|
(args-before-separator '("--" "-lm")))
|
|
|
|
;; Only the first `--' separates; a later one is an ordinary compiler
|
|
;; argument (ld takes several).
|
|
(test "only the first separator counts"
|
|
'("-Wl,--as-needed" "--" "-lm")
|
|
(args-after-separator '("x.sex" "--" "-Wl,--as-needed" "--" "-lm")))
|
|
|
|
(test "an empty command line is handled"
|
|
'()
|
|
(args-before-separator '())))
|