Home | History | Annotate | Line # | Download | only in 0-old
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