source: Daodan/MinGW/msys/1.0/share/awk/getopt.awk@ 1126

Last change on this file since 1126 was 1046, checked in by alloc, 8 years ago

Daodan: Added Windows MinGW and build batch file

File size: 2.2 KB
Line 
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
21function 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}
66BEGIN {
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}
Note: See TracBrowser for help on using the repository browser.