# getopt BEGIN { msg = "usage: [-befhmn] [-D string]" print "There are", getopt("befhmnD:", msg), "options." for (flag in OPTS) { print flag, OPTS[flag] } } function getopt(defn, msg, n, i, flag, rest) { # collect flag/value pairs in OPTS, # remove from ARGV, and return count # initialize i, loop runs forever for (i = 1; ;) { # stop at end of arguments if (i == ARGC) { return n+0 } if (ARGV[i] == "--") { ARGV[i] = ""; return n+0 } if (ARGV[i] == "") { i++; continue } if (substr(ARGV[i],1,1) != "-") { return n+0 } # found argument; parse flag from rest of string flag = substr(ARGV[i],2,1); rest = substr(ARGV[i],3) # argument requires an associated value if (index(defn, flag ":") > 0) { if (rest != "") { # value in same argument as flag OPTS[flag] = rest; ARGV[i] = ""; i++; n++ } else if (i < ARGC) { # value in next argument OPTS[flag] = ARGV[i+1]; ARGV[i] = ARGV[i+1] = "" i += 2; n++ } else { print "ERROR: " flag " flag requires value " \ ": " msg | "cat 1>&2"; exit 1 } } # argument has no associated value else if (index(defn, flag) > 0) { if (rest != "") { OPTS[flag] = ""; ARGV[i] = "-" rest; n++ } else { OPTS[flag] = ARGV[i] = ""; n++ } } # unrecognized flag else { print "ERROR: unrecognized flag " flag \ ": " msg | "cat 1>&2"; exit 1 } } }