#! /usr/bin/nawk -f # # AWK script: getnames # # Usage: getnames opt= file ... # # Generates a list of file names followed by the commands that are linked # to the file name. Output is piped to the awk script addinst # Called from manrules. # BEGIN { err = 0 } NF == 2 && $1 == ".SH" && $2 == "NAME" { getline # Process the man pages from MIPS if ($1 == ".nf") { NAMELIST = "" getline while ($1 != ".fi") { gsub(/\t/, "", $0) gsub(/ /, "", $0) gsub(/,/, " ", $0) gsub(/:/, "", $0) gsub(/\\f./, "", $0) gsub(/\\s[-+]?[0-9]/, "", $0) if (split($0, NAMES, "\\") == 1) error("missing \\- in NAMES line") else NAMELIST = NAMELIST NAMES[1] " " getline } outline(FILENAME, NAMELIST) } else if ($1 == ".Op") { # Process the GL man pages with .Op's if (opt == "") { error("getnames requires opt= for GL "\ "man pages -- aborting") exit(1) } # state values: # 0 = outside .Op pair # 1 = inside .Op for our option # 2 = inside .Op for another option # 3 = abort # 4 = done state = parseln() - 1; NAMELIST = "" while (state < 3) { if (state == 1) { if ($1 == ".B") { gsub(/,/, "", $0) gsub(/"/, "", $0) gsub(/\.B/, "", $0) gsub(/\\f./, "", $0) gsub(/\\s[-+]?[0-9]/, "", $0) NAMELIST = NAMELIST $0 " " } } getline ltype = parseln() if (state == 0) { if (ltype == 1) { error("unexpected .Op with no arguments") next } else state = ltype - 1 } else { # state == 1 or 2 if (ltype == 4) state = 3 else if (ltype > 1) { error("unexpected .Op with arguments") next } else if (ltype == 1) { if (state == 1) state = 4 else state = 0 } } } if (NAMELIST != "") outline(FILENAME, NAMELIST) } else { # Process all other man pages # state values # 0 = haven't found \- # 1 = found \- (actually just `\') # 2 = found .SH state = 0; NAMELIST = ""; while (state == 0) { if ($1 == ".SH") state = 2; else { gsub(/,/, " ", $0) gsub(/"/, "", $0) gsub(/:/, "", $0) gsub(/\.B/, "", $0) gsub(/\\f./, "", $0) gsub(/\\s[-+]?[0-9]/, "", $0) temp = split($0, NAMES, "\\") NAMELIST = NAMELIST NAMES[1] " " if (temp > 1) state = 1 } getline; } if (state == 2) error("missing \\- in NAMES section") else if (NAMELIST == "") error("nothing before \\- in NAMES section") else outline(FILENAME, NAMELIST) } } # parse .Op GL man page line, return values are: # 0 = not .Op or .SH line # 1 = .Op with no arguments # 2 = .Op containing our option # 3 = .Op not containing our option # 4 = .SH line func parseln() { if ($1 == ".SH") return 4 else if ($1 != ".Op") return 0 else if (NF == 1) return 1 else { for (i = 2; i <= NF; i++) { if ($i == opt) return 2 } return 3 } } END { exit(err) } # all man page filenames are lowercase func outline(fname, names) { printf "%20s: %s\n", fname, names | "tr '[A-Z]' '[a-z]'" } func error(msg) { print "getnames:", msg ": file", FILENAME ", line", FNR | "cat 1>&2" err = 1 }