~vcs-imports/gawk/master

« back to all changes in this revision

Viewing changes to awklib/eg/lib/getopt.awk

  • Committer: Arnold D. Robbins
  • Date: 2010-07-16 09:41:09 UTC
  • Revision ID: git-v1:8c042f99cc7465c86351d21331a129111b75345d
Tags: gawk-3.0.0
Move to gawk-3.0.0.

Show diffs side-by-side

added added

removed removed

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