83 lines
2.2 KiB
Awk
83 lines
2.2 KiB
Awk
|
# getopt --- do C library getopt(3) function in awk
|
||
|
#
|
||
|
# arnold@gnu.org
|
||
|
# Public domain
|
||
|
#
|
||
|
# Initial version: March, 1991
|
||
|
# Revised: May, 1993
|
||
|
|
||
|
# External variables:
|
||
|
# Optind -- index of ARGV for first non-option argument
|
||
|
# Optarg -- string value of argument to current option
|
||
|
# Opterr -- if non-zero, print our own diagnostic
|
||
|
# Optopt -- current option letter
|
||
|
|
||
|
# Returns
|
||
|
# -1 at end of options
|
||
|
# ? for unrecognized option
|
||
|
# <c> a character representing the current option
|
||
|
|
||
|
# Private Data
|
||
|
# _opti index in multi-flag option, e.g., -abc
|
||
|
function getopt(argc, argv, options, optl, thisopt, i)
|
||
|
{
|
||
|
optl = length(options)
|
||
|
if (optl == 0) # no options given
|
||
|
return -1
|
||
|
|
||
|
if (argv[Optind] == "--") { # all done
|
||
|
Optind++
|
||
|
_opti = 0
|
||
|
return -1
|
||
|
} else if (argv[Optind] !~ /^-[^: \t\n\f\r\v\b]/) {
|
||
|
_opti = 0
|
||
|
return -1
|
||
|
}
|
||
|
if (_opti == 0)
|
||
|
_opti = 2
|
||
|
thisopt = substr(argv[Optind], _opti, 1)
|
||
|
Optopt = thisopt
|
||
|
i = index(options, thisopt)
|
||
|
if (i == 0) {
|
||
|
if (Opterr)
|
||
|
printf("%c -- invalid option\n",
|
||
|
thisopt) > "/dev/stderr"
|
||
|
if (_opti >= length(argv[Optind])) {
|
||
|
Optind++
|
||
|
_opti = 0
|
||
|
} else
|
||
|
_opti++
|
||
|
return "?"
|
||
|
}
|
||
|
if (substr(options, i + 1, 1) == ":") {
|
||
|
# get option argument
|
||
|
if (length(substr(argv[Optind], _opti + 1)) > 0)
|
||
|
Optarg = substr(argv[Optind], _opti + 1)
|
||
|
else
|
||
|
Optarg = argv[++Optind]
|
||
|
_opti = 0
|
||
|
} else
|
||
|
Optarg = ""
|
||
|
if (_opti == 0 || _opti >= length(argv[Optind])) {
|
||
|
Optind++
|
||
|
_opti = 0
|
||
|
} else
|
||
|
_opti++
|
||
|
return thisopt
|
||
|
}
|
||
|
BEGIN {
|
||
|
Opterr = 1 # default is to diagnose
|
||
|
Optind = 1 # skip ARGV[0]
|
||
|
|
||
|
# test program
|
||
|
if (_getopt_test) {
|
||
|
while ((_go_c = getopt(ARGC, ARGV, "ab:cd")) != -1)
|
||
|
printf("c = <%c>, optarg = <%s>\n",
|
||
|
_go_c, Optarg)
|
||
|
printf("non-option arguments:\n")
|
||
|
for (; Optind < ARGC; Optind++)
|
||
|
printf("\tARGV[%d] = <%s>\n",
|
||
|
Optind, ARGV[Optind])
|
||
|
}
|
||
|
}
|