| # getopt.awk --- Do C library getopt(3) function in awk |
| # |
| # Arnold Robbins, arnold@skeeve.com, Public Domain |
| # |
| # Initial version: March, 1991 |
| # Revised: May, 1993 |
| |
| # External variables: |
| # Optind -- index in ARGV of first nonoption argument |
| # Optarg -- string value of argument to current option |
| # Opterr -- if nonzero, 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, thisopt, i) |
| { |
| if (length(options) == 0) # no options given |
| return -1 |
| |
| if (argv[Optind] == "--") { # all done |
| Optind++ |
| _opti = 0 |
| return -1 |
| } else if (argv[Optind] !~ /^-[^:[:space:]]/) { |
| _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]) |
| } |
| } |