1 # Usage: awk -f checkman.awk man?/*.?
4 # - .TH is first line, and has proper name section number
5 # - sections are in order NAME, SYNOPSIS, DESCRIPTION, EXAMPLES,
6 # FILES, SOURCE, SEE ALSO, DIAGNOSTICS, BUGS
7 # - there's a manual page for each cross-referenced page
11 # .SH sections should come in the following order
14 Weight["SYNOPSIS"] = 2
15 Weight["DESCRIPTION"] = 4
17 Weight["EXAMPLES"] = 16
20 Weight["SEE ALSO"] = 128
21 Weight["DIAGNOSTICS"] = 256
22 Weight["SYSTEM CALLS"] = 512
28 Skipdirs["aviation"] = 1
36 Skipdirs["service.alt"] = 1
43 Omitted["mousereset"] = 1
44 Omitted["postalias"] = 1
45 Omitted["mksacfs"] = 1
50 Omitted["netlib_find"] = 1
51 Omitted["uuencode"] = 1
52 Omitted["uudecode"] = 1
55 Omitted["tcp17032"] = 1
56 Omitted["tcp17033"] = 1
59 Omitted["tcp7330"] = 1
62 Omitted["tcp1723"] = 1
64 Omitted["allmail"] = 1
66 Omittedlib["brk_"] = 1
67 Omittedlib["creadimage"] = 1
68 Omittedlib["main"] = 1
69 Omittedlib["opasstokey"] = 1
70 Omittedlib["oseek"] = 1
71 Omittedlib["sysr1"] = 1
77 if (substr(FILENAME, 2, 1) == "/")
79 else if (substr(FILENAME, 3, 1) == "/")
82 print "FILENAME", FILENAME, "not of form [0-9][0-9]?/*"
83 else if(!(substr(FILENAME, seclen+2, n-seclen-1) ~ /^[A-Z]+(.html)?$/)){
84 section = substr(FILENAME, 1, seclen)
85 name = substr(FILENAME, seclen+2, n-seclen-1)
86 if($1 != ".TH" || NF != 3)
87 print "First line of", FILENAME, "not a proper .TH"
88 else if($2 != toupper(name) || substr($3, 1, seclen) != section){
89 if($2!="INTRO" || name!="0intro")
90 print ".TH of", FILENAME, "doesn't match filename"
92 Pages[section "/" $2] = 1
99 print "Unterminated .EX in", FILENAME, ":", $0
101 if (substr($2, 1, 1) == "\"") {
103 print "Unneeded quote in", FILENAME, ":", $0
104 $2 = substr($2, 2, length($2)-2)
105 } else if (NF == 3) {
106 $2 = substr($2, 2) substr($3, 1, length($3)-1)
110 if(Sh == 0 && $2 != "NAME")
111 print FILENAME, "has no .SH NAME"
115 print "Heading", $2, "out of order in", FILENAME
122 print "Nested .EX in", FILENAME, ":", $0
128 print "Bad .EE in", FILENAME, ":", $0
136 $1 == ".PD" || $1 == ".SH" || $1 == ".SS" || $1 == ".TH" {
145 if(smallspace && !lastre)
146 print "Possible missing .PD at " FILENAME ":" FNR
154 $0 ~ /^\.[A-Z].*\([1-9]\)/ {
155 if ($1 == ".IR" && $3 ~ /\([0-9]\)/) {
158 }else if ($1 == ".RI" && $2 == "(" && $4 ~ /\([0-9]\)/) {
161 }else if ($1 == ".IR" && $3 ~ /9.\([0-9]\)/) {
164 }else if ($1 == ".RI" && $2 == "(" && $4 ~ /9.\([0-9]\)/) {
168 print "Possible bad cross-reference format in", FILENAME ":" FNR
172 gsub(/[^0-9]/, "", section)
173 Refs[section "/" toupper(name)]++
177 print "Checking Cross-Referenced Pages"
180 split(tolower(i), a, "/")
181 print "grep -n " a[2] ".*" a[1] " ?/* # Need " tolower(i)
185 print "Checking commands"
186 getindex("/sys/man/1")
187 getindex("/sys/man/4")
188 getindex("/sys/man/7")
189 getindex("/sys/man/8")
190 getbinlist("/386/bin")
191 getbinlist("/rc/bin")
193 if (!(i in Index) && !(i in Omitted))
194 print "Need", i, "(in " List[i] ")"
198 if (!(i in Index) && (i in Omitted))
199 print "Omit", i, "(in " List[i] ")"
204 print "Checking libraries"
205 getindex("/sys/man/2")
206 getnmlist("/386/lib/lib9p.a")
207 getnmlist("/386/lib/libauth.a")
208 getnmlist("/386/lib/libauthsrv.a")
209 getnmlist("/386/lib/libbin.a")
210 getnmlist("/386/lib/libbio.a")
211 getnmlist("/386/lib/libc.a")
212 getnmlist("/386/lib/libcontrol.a")
213 getnmlist("/386/lib/libdisk.a")
214 getnmlist("/386/lib/libdraw.a")
215 getnmlist("/386/lib/libflate.a")
216 getnmlist("/386/lib/libframe.a")
217 getnmlist("/386/lib/libgeometry.a")
218 getnmlist("/386/lib/libhtml.a")
219 getnmlist("/386/lib/libhttpd.a")
220 getnmlist("/386/lib/libip.a")
221 getnmlist("/386/lib/libmach.a")
222 getnmlist("/386/lib/libmemdraw.a")
223 getnmlist("/386/lib/libmemlayer.a")
224 getnmlist("/386/lib/libmp.a")
225 getnmlist("/386/lib/libndb.a")
226 getnmlist("/386/lib/libplumb.a")
227 getnmlist("/386/lib/libregexp.a")
228 getnmlist("/386/lib/libsec.a")
229 getnmlist("/386/lib/libstdio.a")
230 getnmlist("/386/lib/libString.a")
231 getnmlist("/386/lib/libthread.a")
233 if (!(i in Index) && !(i in Omittedlib))
234 print "Need", i, "(in " List[i] ")"
238 if (!(i in Index) && (i in Omittedlib))
239 print "Omit", i, "(in " List[i] ")"
243 func getindex(dir, fname)
246 while ((getline < fname) > 0)
251 func getbinlist(dir, cmd, subdirs, nsd)
253 cmd = "ls -p -l " dir
255 while (cmd | getline) {
257 if (!($10 in Skipdirs))
259 } else if ($10 !~ "^_")
262 for ( ; nsd > 0 ; nsd--)
263 getbinlist(dir "/" subdirs[nsd])
267 func getnmlist(lib, cmd)
269 cmd = "nm -g -h " lib
270 while (cmd | getline) {
271 if (($1 == "T" || $1 == "L") && $2 !~ "^_")