perlopt.tpl revision 290001
1[= AutoGen5 template foo=(base-name) -*- Mode: scheme -*-=]
2[=
3
4(emit (dne "# "))
5
6(if (not (and (exist? "prog-name") (exist? "prog-title") (exist? "version")))
7    (error "prog-name and prog-title are required"))
8(define prog-name (get "prog-name"))
9
10(if (> (string-length prog-name) 16)
11    (error (sprintf "prog-name limited to 16 characters:  %s"
12           prog-name)) )
13(if (not (exist? "long-opts"))
14    (error "long-opts is required"))
15
16;; perl list containing string to initialize the option hash
17(define perl_opts "")
18;; perl list containing option definitions for Getopt::Long
19(define perl_defs "       ")
20;; usage string
21(define perl_usage "")
22
23(define optname-from "A-Z_^")
24(define optname-to   "a-z--")
25(define counter 0)
26
27(define q (lambda (s) (string-append "'" s "'")))
28(define qp (lambda (s) (string-append "q{" s "}")))
29
30=][=
31
32FOR flag =][=
33
34(define optarg "")      ;; the option argument for Getopt::Long
35(define opttarget "''") ;; the value of a hash key that represents option
36(define optargname "")
37(define optisarray #f)
38(define optname (string-tr! (get "name") optname-from optname-to))
39
40=][= #
41;; since autoopts doesn't support float we take the combination arg-name =
42;; float and arg-type = string as float
43=][=
44  IF arg-type       =][=
45    CASE arg-type   =][=
46
47    =* num          =][= (set! optarg "=i") =][=
48
49    =* str          =][=
50        (if (and (exist? "arg-name") (== (get "arg-name") "float"))
51            (set! optarg "=f")
52            (set! optarg "=s")
53        )           =][=
54
55    *               =][=
56        (error (string-append "unknown arg type '"
57        (get "arg-type") "' for " (get "name"))) =][=
58    ESAC arg-type   =][=
59  ENDIF             =][=
60
61(if (exist? "stack-arg")
62    ;; set optarget to array reference if can take more than one value
63    ;;  FIXME:  if "max" exists, then just presume it is greater than 1
64    ;;
65    (if (and (exist? "max") (== (get "max") "NOLIMIT"))
66        (begin
67          (set! opttarget (string-append
68            "["
69            (if (exist? "arg-default") (q (get "arg-default")) "")
70            "]"
71            )
72          )
73          (set! optisarray #t)
74        )
75        (error "If stack-arg then max has to be NOLIMIT")
76    )
77    ;; just scalar otherwise
78    (if (exist? "arg-default") (set! opttarget (q (get "arg-default"))))
79)
80
81(set! perl_opts (string-append perl_opts
82      "'" (get "name") "' => " opttarget ",\n        "))
83
84(define def_add (string-append "'" optname (if (exist? "value")
85                  (string-append "|" (get "value")) "") optarg "',"))
86
87(define add_len (+ (string-length def_add) counter))
88(if (> add_len 80)
89    (begin
90      (set! perl_defs (string-append perl_defs "\n        " def_add))
91      (set! counter 8)
92    )
93    (begin
94      (set! perl_defs (string-append perl_defs " " def_add))
95      (set! counter (+ counter add_len))
96    )
97)
98
99(if (exist? "arg-type")
100    (if (and (exist? "arg-name") (== (get "arg-name") "float"))
101        (set! optargname "=float")
102        (set! optargname (string-append "=" (substring (get "arg-type") 0 3)))
103    )
104    (set! optargname "  ")
105)
106
107(if (not (exist? "deprecated"))
108    (set! perl_usage (string-append perl_usage
109       (sprintf "\n    %-28s %s" (string-append
110            (if (exist? "value") (string-append "-" (get "value") ",") "   ")
111            " --"
112            (get "name")
113            optargname)
114         (get "descrip"))
115)   )  )
116(if optisarray
117  (set! perl_usage (string-append perl_usage
118        "\n                                   - may appear multiple times"))
119)
120
121=][=
122
123ENDFOR each "flag" =]
124
125use Getopt::Long qw(GetOptionsFromArray);
126Getopt::Long::Configure(qw(no_auto_abbrev no_ignore_case_always));
127
128my $usage;
129
130sub usage {
131    my ($ret) = @_;
132    print STDERR $usage;
133    exit $ret;
134}
135
136sub paged_usage {
137    my ($ret) = @_;
138    my $pager = $ENV{PAGER} || '(less || more)';
139
140    open STDOUT, "| $pager" or die "Can't fork a pager: $!";
141    print $usage;
142
143    exit $ret;
144}
145
146sub processOptions {
147    my $args = shift;
148
149    my $opts = {
150        [= (. perl_opts) =]'help' => '', 'more-help' => ''
151    };
152    my $argument = '[= argument =]';
153    my $ret = GetOptionsFromArray($args, $opts, (
154[= (. perl_defs) =]
155        'help|?', 'more-help'));
156
157    $usage = <<'USAGE';
158[= prog-name =] - [= prog-title =] - Ver. [= version =]
159USAGE: [= prog-name =] [ -<flag> [<val>] | --<name>[{=| }<val>] ]... [= argument =]
160[= (. perl_usage)   =]
161    -?, --help                   Display usage information and exit
162        --more-help              Pass the extended usage information through a pager
163
164Options are specified by doubled hyphens and their name or by a single
165hyphen and the flag character.
166USAGE
167
168    usage(0)       if $opts->{'help'};
169    paged_usage(0) if $opts->{'more-help'};[=
170
171CASE argument       =][=
172!E                  =][=
173==* "["             =][=
174*                   =]
175
176    if ($argument && $argument =~ /^[^\[]/ && !@$args) {
177        print STDERR "Not enough arguments supplied (See --help/-?)\n";
178        exit 1;
179    }[=
180
181ESAC
182
183=]
184    $_[0] = $opts;
185    return $ret;
186}
187
188END { close STDOUT };
189