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