1 | # getopt.awk --- do C library getopt(3) function in awk
|
---|
2 | #
|
---|
3 | # Arnold Robbins, arnold@skeeve.com, Public Domain
|
---|
4 | #
|
---|
5 | # Initial version: March, 1991
|
---|
6 | # Revised: May, 1993
|
---|
7 |
|
---|
8 | # External variables:
|
---|
9 | # Optind -- index in ARGV of first nonoption argument
|
---|
10 | # Optarg -- string value of argument to current option
|
---|
11 | # Opterr -- if nonzero, print our own diagnostic
|
---|
12 | # Optopt -- current option letter
|
---|
13 |
|
---|
14 | # Returns:
|
---|
15 | # -1 at end of options
|
---|
16 | # ? for unrecognized option
|
---|
17 | # <c> a character representing the current option
|
---|
18 |
|
---|
19 | # Private Data:
|
---|
20 | # _opti -- index in multi-flag option, e.g., -abc
|
---|
21 | function getopt(argc, argv, options, thisopt, i)
|
---|
22 | {
|
---|
23 | if (length(options) == 0) # no options given
|
---|
24 | return -1
|
---|
25 |
|
---|
26 | if (argv[Optind] == "--") { # all done
|
---|
27 | Optind++
|
---|
28 | _opti = 0
|
---|
29 | return -1
|
---|
30 | } else if (argv[Optind] !~ /^-[^: \t\n\f\r\v\b]/) {
|
---|
31 | _opti = 0
|
---|
32 | return -1
|
---|
33 | }
|
---|
34 | if (_opti == 0)
|
---|
35 | _opti = 2
|
---|
36 | thisopt = substr(argv[Optind], _opti, 1)
|
---|
37 | Optopt = thisopt
|
---|
38 | i = index(options, thisopt)
|
---|
39 | if (i == 0) {
|
---|
40 | if (Opterr)
|
---|
41 | printf("%c -- invalid option\n",
|
---|
42 | thisopt) > "/dev/stderr"
|
---|
43 | if (_opti >= length(argv[Optind])) {
|
---|
44 | Optind++
|
---|
45 | _opti = 0
|
---|
46 | } else
|
---|
47 | _opti++
|
---|
48 | return "?"
|
---|
49 | }
|
---|
50 | if (substr(options, i + 1, 1) == ":") {
|
---|
51 | # get option argument
|
---|
52 | if (length(substr(argv[Optind], _opti + 1)) > 0)
|
---|
53 | Optarg = substr(argv[Optind], _opti + 1)
|
---|
54 | else
|
---|
55 | Optarg = argv[++Optind]
|
---|
56 | _opti = 0
|
---|
57 | } else
|
---|
58 | Optarg = ""
|
---|
59 | if (_opti == 0 || _opti >= length(argv[Optind])) {
|
---|
60 | Optind++
|
---|
61 | _opti = 0
|
---|
62 | } else
|
---|
63 | _opti++
|
---|
64 | return thisopt
|
---|
65 | }
|
---|
66 | BEGIN {
|
---|
67 | Opterr = 1 # default is to diagnose
|
---|
68 | Optind = 1 # skip ARGV[0]
|
---|
69 |
|
---|
70 | # test program
|
---|
71 | if (_getopt_test) {
|
---|
72 | while ((_go_c = getopt(ARGC, ARGV, "ab:cd")) != -1)
|
---|
73 | printf("c = <%c>, optarg = <%s>\n",
|
---|
74 | _go_c, Optarg)
|
---|
75 | printf("non-option arguments:\n")
|
---|
76 | for (; Optind < ARGC; Optind++)
|
---|
77 | printf("\tARGV[%d] = <%s>\n",
|
---|
78 | Optind, ARGV[Optind])
|
---|
79 | }
|
---|
80 | }
|
---|