BEGIN { end = "" if (emit == "enum") { print "enum args {" } else if (emit == "argtbl") { print "struct tblrow argtbl[] = {" } else if (emit == "olong") { print "#define kpw_emit_long_option_switch \\" end = "\\" } else if (emit == "oshort") { print "#define kpw_emit_short_option_switch \\" end = "\\" } else if (emit == "usage") { print "const char kpw_usage[] =" } globalc = 0 } function cify(str) { gsub(/[- ]/, "_", str); return str; } function say(line) { if (NF == 5) { print "\tkpw_only_" $5 "(" line ") " end globals[globalc] = $5 ++ globalc } else { print "\t" line " " end } } { optstr = optstr $1 } emit == "enum" { say("arg_" cify($2) ",") } emit == "argtbl" { say("{ arg_" cify($2)", \"" $2 "\" },") } emit == "olong" { say("case arg_" cify($2) ": " $3 "; break;") } emit == "oshort" { say("case '" $1 "': " $3 "; break;") } emit == "usage" { say("\"\\t-"$1", --"$2": "$4"\\n\"") } emit == "cond" { if (NF == 5 && !($5 in condlist)) { condlist[$5] = 1 print "#ifdef " $5 print "# define kpw_only_" $5 "(x...) x" print "#else" print "# define kpw_only_" $5 "(...)" print "#endif" } } END { if (emit == "olong" || emit == "oshort") { print "" } else if (emit == "usage") { print ";" print "const char kpw_optstr[] = \" [-" optstr "] [args]\\n\";" } else if (emit != "cond") { print "};" } }