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 "};"
	}
}
