Blame


1 02f38ca6 2005-01-04 devnull # Usage: cd $PLAN9; awk -f dist/checkman.awk man?/*.?
2 02f38ca6 2005-01-04 devnull #
3 02f38ca6 2005-01-04 devnull # Checks:
4 02f38ca6 2005-01-04 devnull # - .TH is first line, and has proper name section number
5 02f38ca6 2005-01-04 devnull # - sections are in order NAME, SYNOPSIS, DESCRIPTION, EXAMPLES,
6 02f38ca6 2005-01-04 devnull # FILES, SOURCE, SEE ALSO, DIAGNOSTICS, BUGS
7 02f38ca6 2005-01-04 devnull # - there's a manual page for each cross-referenced page
8 02f38ca6 2005-01-04 devnull
9 02f38ca6 2005-01-04 devnull BEGIN {
10 02f38ca6 2005-01-04 devnull
11 02f38ca6 2005-01-04 devnull # .SH sections should come in the following order
12 02f38ca6 2005-01-04 devnull
13 02f38ca6 2005-01-04 devnull Weight["NAME"] = 1
14 02f38ca6 2005-01-04 devnull Weight["SYNOPSIS"] = 2
15 02f38ca6 2005-01-04 devnull Weight["DESCRIPTION"] = 4
16 02f38ca6 2005-01-04 devnull Weight["EXAMPLE"] = 8
17 02f38ca6 2005-01-04 devnull Weight["EXAMPLES"] = 16
18 02f38ca6 2005-01-04 devnull Weight["FILES"] = 32
19 02f38ca6 2005-01-04 devnull Weight["SOURCE"] = 64
20 02f38ca6 2005-01-04 devnull Weight["SEE ALSO"] = 128
21 02f38ca6 2005-01-04 devnull Weight["DIAGNOSTICS"] = 256
22 02f38ca6 2005-01-04 devnull Weight["SYSTEM CALLS"] = 512
23 02f38ca6 2005-01-04 devnull Weight["BUGS"] = 1024
24 02f38ca6 2005-01-04 devnull
25 02f38ca6 2005-01-04 devnull Skipdirs["CVS"] = 1
26 02f38ca6 2005-01-04 devnull
27 02f38ca6 2005-01-04 devnull # allow references to pages provded
28 02f38ca6 2005-01-04 devnull # by the underlying Unix system
29 02f38ca6 2005-01-04 devnull Omitman["awk(1)"] = 1
30 02f38ca6 2005-01-04 devnull Omitman["bash(1)"] = 1
31 02f38ca6 2005-01-04 devnull Omitman["chmod(1)"] = 1
32 02f38ca6 2005-01-04 devnull Omitman["compress(1)"] = 1
33 02f38ca6 2005-01-04 devnull Omitman["cp(1)"] = 1
34 02f38ca6 2005-01-04 devnull Omitman["egrep(1)"] = 1
35 02f38ca6 2005-01-04 devnull Omitman["gs(1)"] = 1
36 02f38ca6 2005-01-04 devnull Omitman["gv(1)"] = 1
37 02f38ca6 2005-01-04 devnull Omitman["lex(1)"] = 1
38 02f38ca6 2005-01-04 devnull Omitman["lp(1)"] = 1
39 02f38ca6 2005-01-04 devnull Omitman["lpr(1)"] = 1
40 02f38ca6 2005-01-04 devnull Omitman["mail(1)"] = 1
41 83c4506a 2005-02-11 devnull Omitman["make(1)"] = 1
42 02f38ca6 2005-01-04 devnull Omitman["nm(1)"] = 1
43 02f38ca6 2005-01-04 devnull Omitman["prof(1)"] = 1
44 02f38ca6 2005-01-04 devnull Omitman["pwd(1)"] = 1
45 c8b6342d 2005-01-13 devnull Omitman["qiv(1)"] = 1
46 11f10a6c 2005-05-07 devnull Omitman["sftp(1)"] = 1
47 02f38ca6 2005-01-04 devnull Omitman["sh(1)"] = 1
48 02f38ca6 2005-01-04 devnull Omitman["ssh(1)"] = 1
49 c8b6342d 2005-01-13 devnull Omitman["stty(1)"] = 1
50 02f38ca6 2005-01-04 devnull Omitman["tex(1)"] = 1
51 02f38ca6 2005-01-04 devnull Omitman["unutf(1)"] = 1
52 83c4506a 2005-02-11 devnull Omitman["vnc(1)"] = 1
53 02f38ca6 2005-01-04 devnull Omitman["xterm(1)"] = 1
54 02f38ca6 2005-01-04 devnull
55 02f38ca6 2005-01-04 devnull Omitman["access(2)"] = 1
56 02f38ca6 2005-01-04 devnull Omitman["brk(2)"] = 1
57 c8b6342d 2005-01-13 devnull Omitman["chdir(2)"] = 1
58 02f38ca6 2005-01-04 devnull Omitman["close(2)"] = 1
59 02f38ca6 2005-01-04 devnull Omitman["connect(2)"] = 1
60 02f38ca6 2005-01-04 devnull Omitman["fork(2)"] = 1
61 02f38ca6 2005-01-04 devnull Omitman["gethostname(2)"] = 1
62 02f38ca6 2005-01-04 devnull Omitman["getpid(2)"] = 1
63 02f38ca6 2005-01-04 devnull Omitman["getuid(2)"] = 1
64 02f38ca6 2005-01-04 devnull Omitman["open(2)"] = 1
65 02f38ca6 2005-01-04 devnull Omitman["pipe(2)"] = 1
66 02f38ca6 2005-01-04 devnull Omitman["ptrace(2)"] = 1
67 02f38ca6 2005-01-04 devnull Omitman["rmdir(2)"] = 1
68 02f38ca6 2005-01-04 devnull Omitman["send(2)"] = 1
69 02f38ca6 2005-01-04 devnull Omitman["signal(2)"] = 1
70 02f38ca6 2005-01-04 devnull Omitman["sigprocmask(2)"] = 1
71 02f38ca6 2005-01-04 devnull Omitman["socketpair(2)"] = 1
72 02f38ca6 2005-01-04 devnull Omitman["unlink(2)"] = 1
73 02f38ca6 2005-01-04 devnull
74 02f38ca6 2005-01-04 devnull Omitman["abort(3)"] = 1
75 02f38ca6 2005-01-04 devnull Omitman["assert(3)"] = 1
76 02f38ca6 2005-01-04 devnull Omitman["fprintf(3)"] = 1
77 02f38ca6 2005-01-04 devnull Omitman["fscanf(3)"] = 1
78 02f38ca6 2005-01-04 devnull Omitman["fopen(3)"] = 1
79 02f38ca6 2005-01-04 devnull Omitman["isalpha(3)"] = 1
80 02f38ca6 2005-01-04 devnull Omitman["malloc(3)"] = 1
81 02f38ca6 2005-01-04 devnull Omitman["perror(3)"] = 1
82 02f38ca6 2005-01-04 devnull Omitman["remove(3)"] = 1
83 02f38ca6 2005-01-04 devnull Omitman["sin(3)"] = 1
84 02f38ca6 2005-01-04 devnull Omitman["strerror(3)"] = 1
85 02f38ca6 2005-01-04 devnull
86 02f38ca6 2005-01-04 devnull Omitman["core(5)"] = 1
87 02f38ca6 2005-01-04 devnull Omitman["passwd(5)"] = 1
88 02f38ca6 2005-01-04 devnull
89 02f38ca6 2005-01-04 devnull Omitman["signal(7)"] = 1
90 02f38ca6 2005-01-04 devnull
91 02f38ca6 2005-01-04 devnull Omitman["cron(8)"] = 1
92 98deccf3 2005-07-19 devnull Omitman["mount(8)"] = 1
93 02f38ca6 2005-01-04 devnull
94 02f38ca6 2005-01-04 devnull # don't need documentation for these in bin
95 02f38ca6 2005-01-04 devnull Omitted[".cvsignore"] = 1
96 02f38ca6 2005-01-04 devnull Omitted["Getdir"] = 1
97 83c4506a 2005-02-11 devnull Omitted["Irc"] = 1
98 83c4506a 2005-02-11 devnull Omitted["Juke"] = 1
99 83c4506a 2005-02-11 devnull Omitted["ajuke"] = 1
100 83c4506a 2005-02-11 devnull Omitted["goodmk"] = 1
101 83c4506a 2005-02-11 devnull Omitted["jukefmt"] = 1
102 83c4506a 2005-02-11 devnull Omitted["jukeget"] = 1
103 83c4506a 2005-02-11 devnull Omitted["jukeindex"] = 1
104 83c4506a 2005-02-11 devnull Omitted["jukeinfo"] = 1
105 83c4506a 2005-02-11 devnull Omitted["jukeplay"] = 1
106 83c4506a 2005-02-11 devnull Omitted["jukeput"] = 1
107 83c4506a 2005-02-11 devnull Omitted["jukesearch"] = 1
108 83c4506a 2005-02-11 devnull Omitted["jukesongfile"] = 1
109 83c4506a 2005-02-11 devnull Omitted["m4ainfo"] = 1
110 83c4506a 2005-02-11 devnull Omitted["mp3info"] = 1
111 83c4506a 2005-02-11 devnull Omitted["notes"] = 1
112 c8b6342d 2005-01-13 devnull Omitted["tcolors"] = 1
113 c8b6342d 2005-01-13 devnull Omitted["tref"] = 1
114 c8b6342d 2005-01-13 devnull Omitted["unutf"] = 1
115 83c4506a 2005-02-11 devnull Omitted["volume"] = 1
116 c8b6342d 2005-01-13 devnull Omitted["vtdump"] = 1
117 98deccf3 2005-07-19 devnull Omitted["netfilelib.rc"] = 1
118 02f38ca6 2005-01-04 devnull
119 02f38ca6 2005-01-04 devnull # not for users
120 02f38ca6 2005-01-04 devnull Omittedlib["creadimage"] = 1
121 02f38ca6 2005-01-04 devnull Omittedlib["pixelbits"] = 1
122 02f38ca6 2005-01-04 devnull Omittedlib["bouncemouse"] = 1
123 02f38ca6 2005-01-04 devnull Omittedlib["main"] = 1 # in libthread
124 83c4506a 2005-02-11 devnull
125 83c4506a 2005-02-11 devnull Omittedlib["opasstokey"] = 1 # in libauthsrv
126 02f38ca6 2005-01-04 devnull
127 02f38ca6 2005-01-04 devnull # functions provided for -lthread_db
128 02f38ca6 2005-01-04 devnull Omittedlib["ps_get_thread_area"] = 1
129 02f38ca6 2005-01-04 devnull Omittedlib["ps_getpid"] = 1
130 02f38ca6 2005-01-04 devnull Omittedlib["ps_lcontinue"] = 1
131 02f38ca6 2005-01-04 devnull Omittedlib["ps_lgetfpregs"] = 1
132 02f38ca6 2005-01-04 devnull Omittedlib["ps_lgetregs"] = 1
133 02f38ca6 2005-01-04 devnull Omittedlib["ps_lsetfpregs"] = 1
134 02f38ca6 2005-01-04 devnull Omittedlib["ps_lsetregs"] = 1
135 02f38ca6 2005-01-04 devnull Omittedlib["ps_lstop"] = 1
136 02f38ca6 2005-01-04 devnull Omittedlib["ps_pcontinue"] = 1
137 02f38ca6 2005-01-04 devnull Omittedlib["ps_pdread"] = 1
138 02f38ca6 2005-01-04 devnull Omittedlib["ps_pdwrite"] = 1
139 02f38ca6 2005-01-04 devnull Omittedlib["ps_pglobal_lookup"] = 1
140 02f38ca6 2005-01-04 devnull Omittedlib["ps_pstop"] = 1
141 02f38ca6 2005-01-04 devnull Omittedlib["ps_ptread"] = 1
142 02f38ca6 2005-01-04 devnull Omittedlib["ps_ptwrite"] = 1
143 02f38ca6 2005-01-04 devnull
144 02f38ca6 2005-01-04 devnull # libmach includes a small dwarf and elf library
145 02f38ca6 2005-01-04 devnull Omittedlib["corecmdfreebsd386"] = 1
146 02f38ca6 2005-01-04 devnull Omittedlib["corecmdlinux386"] = 1
147 02f38ca6 2005-01-04 devnull Omittedlib["coreregsfreebsd386"] = 1
148 02f38ca6 2005-01-04 devnull Omittedlib["coreregslinux386"] = 1
149 02f38ca6 2005-01-04 devnull Omittedlib["coreregsmachopower"] = 1
150 02f38ca6 2005-01-04 devnull Omittedlib["crackelf"] = 1
151 02f38ca6 2005-01-04 devnull Omittedlib["crackmacho"] = 1
152 02f38ca6 2005-01-04 devnull Omittedlib["dwarfaddrtounit"] = 1
153 02f38ca6 2005-01-04 devnull Omittedlib["dwarfclose"] = 1
154 02f38ca6 2005-01-04 devnull Omittedlib["dwarfenum"] = 1
155 02f38ca6 2005-01-04 devnull Omittedlib["dwarfenumunit"] = 1
156 02f38ca6 2005-01-04 devnull Omittedlib["dwarfget1"] = 1
157 02f38ca6 2005-01-04 devnull Omittedlib["dwarfget128"] = 1
158 02f38ca6 2005-01-04 devnull Omittedlib["dwarfget128s"] = 1
159 02f38ca6 2005-01-04 devnull Omittedlib["dwarfget2"] = 1
160 02f38ca6 2005-01-04 devnull Omittedlib["dwarfget4"] = 1
161 02f38ca6 2005-01-04 devnull Omittedlib["dwarfget8"] = 1
162 02f38ca6 2005-01-04 devnull Omittedlib["dwarfgetabbrev"] = 1
163 02f38ca6 2005-01-04 devnull Omittedlib["dwarfgetaddr"] = 1
164 02f38ca6 2005-01-04 devnull Omittedlib["dwarfgetn"] = 1
165 02f38ca6 2005-01-04 devnull Omittedlib["dwarfgetnref"] = 1
166 02f38ca6 2005-01-04 devnull Omittedlib["dwarfgetstring"] = 1
167 02f38ca6 2005-01-04 devnull Omittedlib["dwarflookupfn"] = 1
168 02f38ca6 2005-01-04 devnull Omittedlib["dwarflookupname"] = 1
169 02f38ca6 2005-01-04 devnull Omittedlib["dwarflookupnameinunit"] = 1
170 02f38ca6 2005-01-04 devnull Omittedlib["dwarflookupsubname"] = 1
171 02f38ca6 2005-01-04 devnull Omittedlib["dwarflookuptag"] = 1
172 02f38ca6 2005-01-04 devnull Omittedlib["dwarfnextsym"] = 1
173 02f38ca6 2005-01-04 devnull Omittedlib["dwarfnextsymat"] = 1
174 02f38ca6 2005-01-04 devnull Omittedlib["dwarfopen"] = 1
175 02f38ca6 2005-01-04 devnull Omittedlib["dwarfpctoline"] = 1
176 02f38ca6 2005-01-04 devnull Omittedlib["dwarfseeksym"] = 1
177 02f38ca6 2005-01-04 devnull Omittedlib["dwarfskip"] = 1
178 02f38ca6 2005-01-04 devnull Omittedlib["dwarfunwind"] = 1
179 02f38ca6 2005-01-04 devnull Omittedlib["elfclose"] = 1
180 02f38ca6 2005-01-04 devnull Omittedlib["elfdl386mapdl"] = 1
181 02f38ca6 2005-01-04 devnull Omittedlib["elfinit"] = 1
182 02f38ca6 2005-01-04 devnull Omittedlib["elfmachine"] = 1
183 02f38ca6 2005-01-04 devnull Omittedlib["elfmap"] = 1
184 02f38ca6 2005-01-04 devnull Omittedlib["elfopen"] = 1
185 02f38ca6 2005-01-04 devnull Omittedlib["elfsection"] = 1
186 02f38ca6 2005-01-04 devnull Omittedlib["elfsym"] = 1
187 02f38ca6 2005-01-04 devnull Omittedlib["elfsymlookup"] = 1
188 02f38ca6 2005-01-04 devnull Omittedlib["elftype"] = 1
189 02f38ca6 2005-01-04 devnull Omittedlib["machoclose"] = 1
190 02f38ca6 2005-01-04 devnull Omittedlib["machoinit"] = 1
191 02f38ca6 2005-01-04 devnull Omittedlib["machoopen"] = 1
192 02f38ca6 2005-01-04 devnull Omittedlib["stabsym"] = 1
193 02f38ca6 2005-01-04 devnull Omittedlib["symdwarf"] = 1
194 02f38ca6 2005-01-04 devnull Omittedlib["symelf"] = 1
195 02f38ca6 2005-01-04 devnull Omittedlib["symmacho"] = 1
196 02f38ca6 2005-01-04 devnull Omittedlib["symstabs"] = 1
197 83c4506a 2005-02-11 devnull Omittedlib["elfcorelinux386"] = 1
198 83c4506a 2005-02-11 devnull Omittedlib["linux2ureg386"] = 1
199 83c4506a 2005-02-11 devnull Omittedlib["ureg2linux386"] = 1
200 83c4506a 2005-02-11 devnull Omittedlib["coreregs"] = 1 # haven't documented mach yet
201 83c4506a 2005-02-11 devnull Omittedlib["regdesc"] = 1
202 83c4506a 2005-02-11 devnull
203 83c4506a 2005-02-11 devnull Omittedlib["auth_attr"] = 1 # not happy about this
204 83c4506a 2005-02-11 devnull
205 83c4506a 2005-02-11 devnull Omittedlib["ndbnew"] = 1 # private to library
206 83c4506a 2005-02-11 devnull Omittedlib["ndbsetval"] = 1
207 02f38ca6 2005-01-04 devnull
208 02f38ca6 2005-01-04 devnull Renamelib["chanalt"] = "alt"
209 02f38ca6 2005-01-04 devnull Renamelib["channbrecv"] = "nbrecv"
210 02f38ca6 2005-01-04 devnull Renamelib["channbrecvp"] = "nbrecvp"
211 02f38ca6 2005-01-04 devnull Renamelib["channbrecvul"] = "nbrecvul"
212 02f38ca6 2005-01-04 devnull Renamelib["channbsend"] = "nbsend"
213 02f38ca6 2005-01-04 devnull Renamelib["channbsendp"] = "nbsendp"
214 02f38ca6 2005-01-04 devnull Renamelib["channbsendul"] = "nbsendul"
215 02f38ca6 2005-01-04 devnull Renamelib["chanrecv"] = "recv"
216 02f38ca6 2005-01-04 devnull Renamelib["chanrecvp"] = "recvp"
217 02f38ca6 2005-01-04 devnull Renamelib["chanrecvul"] = "recvul"
218 02f38ca6 2005-01-04 devnull Renamelib["chansend"] = "send"
219 02f38ca6 2005-01-04 devnull Renamelib["chansendp"] = "sendp"
220 02f38ca6 2005-01-04 devnull Renamelib["chansendul"] = "sendul"
221 02f38ca6 2005-01-04 devnull Renamelib["threadyield"] = "yield"
222 02f38ca6 2005-01-04 devnull
223 02f38ca6 2005-01-04 devnull Renamelib["fmtcharstod"] = "charstod"
224 02f38ca6 2005-01-04 devnull Renamelib["fmtstrtod"] = "strtod"
225 02f38ca6 2005-01-04 devnull
226 02f38ca6 2005-01-04 devnull Renamelib["regcomp9"] = "regcomp"
227 02f38ca6 2005-01-04 devnull Renamelib["regcomplit9"] = "regcomplit"
228 02f38ca6 2005-01-04 devnull Renamelib["regcompnl9"] = "regcompnl"
229 02f38ca6 2005-01-04 devnull Renamelib["regerror9"] = "regerror"
230 02f38ca6 2005-01-04 devnull Renamelib["regexec9"] = "regexec"
231 02f38ca6 2005-01-04 devnull Renamelib["regsub9"] = "regsub"
232 02f38ca6 2005-01-04 devnull Renamelib["rregexec9"] = "rregexec"
233 02f38ca6 2005-01-04 devnull Renamelib["rregsub9"] = "rregsub"
234 c8b6342d 2005-01-13 devnull
235 c8b6342d 2005-01-13 devnull lastline = "XXX";
236 c8b6342d 2005-01-13 devnull lastfile = FILENAME;
237 9e50a7da 2005-03-21 devnull }
238 9e50a7da 2005-03-21 devnull
239 9e50a7da 2005-03-21 devnull func getnmlist(lib, cmd)
240 9e50a7da 2005-03-21 devnull {
241 9e50a7da 2005-03-21 devnull cmd = "nm -g " lib
242 9e50a7da 2005-03-21 devnull while (cmd | getline) {
243 9e50a7da 2005-03-21 devnull if (($2 == "T" || $2 == "L") && $3 !~ "^_"){
244 9e50a7da 2005-03-21 devnull sym = $3
245 9e50a7da 2005-03-21 devnull sub("^p9", "", sym)
246 9e50a7da 2005-03-21 devnull if(sym in Renamelib)
247 9e50a7da 2005-03-21 devnull List[Renamelib[sym]] = lib " as " sym
248 9e50a7da 2005-03-21 devnull else
249 9e50a7da 2005-03-21 devnull List[sym] = lib
250 9e50a7da 2005-03-21 devnull }
251 9e50a7da 2005-03-21 devnull }
252 9e50a7da 2005-03-21 devnull close(cmd)
253 9e50a7da 2005-03-21 devnull }
254 9e50a7da 2005-03-21 devnull
255 9e50a7da 2005-03-21 devnull
256 9e50a7da 2005-03-21 devnull func getindex(dir, fname)
257 9e50a7da 2005-03-21 devnull {
258 9e50a7da 2005-03-21 devnull fname = dir "/INDEX"
259 9e50a7da 2005-03-21 devnull while ((getline < fname) > 0)
260 9e50a7da 2005-03-21 devnull Index[$1] = dir
261 9e50a7da 2005-03-21 devnull close(fname)
262 9e50a7da 2005-03-21 devnull }
263 9e50a7da 2005-03-21 devnull
264 9e50a7da 2005-03-21 devnull func getbinlist(dir, cmd, subdirs, nsd)
265 9e50a7da 2005-03-21 devnull {
266 9e50a7da 2005-03-21 devnull cmd = "ls -p -l " dir
267 9e50a7da 2005-03-21 devnull nsd = 0
268 9e50a7da 2005-03-21 devnull while (cmd | getline) {
269 9e50a7da 2005-03-21 devnull if ($1 ~ /^d/) {
270 9e50a7da 2005-03-21 devnull if (!($10 in Skipdirs))
271 9e50a7da 2005-03-21 devnull subdirs[++nsd] = $10
272 9e50a7da 2005-03-21 devnull } else if ($10 !~ "^_")
273 9e50a7da 2005-03-21 devnull List[$10] = dir
274 9e50a7da 2005-03-21 devnull }
275 9e50a7da 2005-03-21 devnull for ( ; nsd > 0 ; nsd--)
276 9e50a7da 2005-03-21 devnull getbinlist(dir "/" subdirs[nsd])
277 9e50a7da 2005-03-21 devnull close(cmd)
278 02f38ca6 2005-01-04 devnull }
279 02f38ca6 2005-01-04 devnull
280 9e50a7da 2005-03-21 devnull func clearindex( i)
281 9e50a7da 2005-03-21 devnull {
282 9e50a7da 2005-03-21 devnull for (i in Index)
283 9e50a7da 2005-03-21 devnull delete Index[i]
284 9e50a7da 2005-03-21 devnull }
285 9e50a7da 2005-03-21 devnull
286 9e50a7da 2005-03-21 devnull func clearlist( i)
287 9e50a7da 2005-03-21 devnull {
288 9e50a7da 2005-03-21 devnull for (i in List)
289 9e50a7da 2005-03-21 devnull delete List[i]
290 9e50a7da 2005-03-21 devnull }
291 9e50a7da 2005-03-21 devnull
292 9e50a7da 2005-03-21 devnull
293 02f38ca6 2005-01-04 devnull FNR==1 {
294 c8b6342d 2005-01-13 devnull if(lastline == ""){
295 c8b6342d 2005-01-13 devnull # screws up troff headers
296 c8b6342d 2005-01-13 devnull print lastfile ":$ is a blank line"
297 c8b6342d 2005-01-13 devnull }
298 c8b6342d 2005-01-13 devnull
299 c8b6342d 2005-01-13 devnull n = length(FILENAME)
300 c8b6342d 2005-01-13 devnull nam = FILENAME
301 c8b6342d 2005-01-13 devnull if(nam ~ /\.html$/)
302 c8b6342d 2005-01-13 devnull next
303 c8b6342d 2005-01-13 devnull if(nam !~ /^man\/man(.*)\/(.*)\.(.*)$/){
304 c8b6342d 2005-01-13 devnull print "nam", nam, "not of form [0-9][0-9]?/*"
305 c8b6342d 2005-01-13 devnull next
306 c8b6342d 2005-01-13 devnull }
307 c8b6342d 2005-01-13 devnull nam = substr(nam, 8)
308 c8b6342d 2005-01-13 devnull gsub("[/.]", " ", nam);
309 c8b6342d 2005-01-13 devnull n = split(nam, a)
310 c8b6342d 2005-01-13 devnull sec = a[1]
311 c8b6342d 2005-01-13 devnull name = a[2]
312 c8b6342d 2005-01-13 devnull section = a[3]
313 c8b6342d 2005-01-13 devnull if($1 != ".TH" || NF != 3)
314 c8b6342d 2005-01-13 devnull print "First line of", FILENAME, "not a proper .TH"
315 c8b6342d 2005-01-13 devnull else if(($2 != toupper(name) || substr($3, 1, length(sec)) != sec || $3 != toupper(section)) \
316 c8b6342d 2005-01-13 devnull && ($2!="INTRO" || name!="0intro") \
317 c8b6342d 2005-01-13 devnull && (name !~ /^9/ || $2!=toupper(substr(name, 2)))){
318 c8b6342d 2005-01-13 devnull print ".TH of", FILENAME, "doesn't match filename"
319 c8b6342d 2005-01-13 devnull }else
320 c8b6342d 2005-01-13 devnull Pages[tolower($2) "(" tolower($3) ")"] = 1
321 c8b6342d 2005-01-13 devnull Sh = 0
322 02f38ca6 2005-01-04 devnull }
323 02f38ca6 2005-01-04 devnull
324 c8b6342d 2005-01-13 devnull { lastline=$0; lastfile=FILENAME; }
325 c8b6342d 2005-01-13 devnull
326 02f38ca6 2005-01-04 devnull $1 == ".SH" {
327 c8b6342d 2005-01-13 devnull if(inex)
328 c8b6342d 2005-01-13 devnull print "Unterminated .EX in", FILENAME, ":", $0
329 c8b6342d 2005-01-13 devnull inex = 0;
330 c8b6342d 2005-01-13 devnull if (substr($2, 1, 1) == "\"") {
331 c8b6342d 2005-01-13 devnull if (NF == 2) {
332 c8b6342d 2005-01-13 devnull print "Unneeded quote in", FILENAME, ":", $0
333 c8b6342d 2005-01-13 devnull $2 = substr($2, 2, length($2)-2)
334 c8b6342d 2005-01-13 devnull } else if (NF == 3) {
335 c8b6342d 2005-01-13 devnull $2 = substr($2, 2) substr($3, 1, length($3)-1)
336 c8b6342d 2005-01-13 devnull NF = 2
337 02f38ca6 2005-01-04 devnull }
338 c8b6342d 2005-01-13 devnull }
339 c8b6342d 2005-01-13 devnull if(Sh == 0 && $2 != "NAME")
340 c8b6342d 2005-01-13 devnull print FILENAME, "has no .SH NAME"
341 c8b6342d 2005-01-13 devnull w = Weight[$2]
342 c8b6342d 2005-01-13 devnull if (w) {
343 c8b6342d 2005-01-13 devnull if (w < Sh)
344 c8b6342d 2005-01-13 devnull print "Heading", $2, "out of order in", FILENAME
345 c8b6342d 2005-01-13 devnull Sh += w
346 c8b6342d 2005-01-13 devnull }
347 c8b6342d 2005-01-13 devnull sh = $2
348 02f38ca6 2005-01-04 devnull }
349 02f38ca6 2005-01-04 devnull
350 02f38ca6 2005-01-04 devnull $1 == ".EX" {
351 02f38ca6 2005-01-04 devnull if(inex)
352 02f38ca6 2005-01-04 devnull print "Nested .EX in", FILENAME ":" FNR, ":", $0
353 02f38ca6 2005-01-04 devnull inex = 1
354 02f38ca6 2005-01-04 devnull }
355 02f38ca6 2005-01-04 devnull
356 02f38ca6 2005-01-04 devnull $1 == ".EE" {
357 c8b6342d 2005-01-13 devnull if(!inex)
358 c8b6342d 2005-01-13 devnull print "Bad .EE in", FILENAME ":" FNR ":", $0
359 c8b6342d 2005-01-13 devnull inex = 0;
360 02f38ca6 2005-01-04 devnull }
361 02f38ca6 2005-01-04 devnull
362 02f38ca6 2005-01-04 devnull $1 == ".TF" {
363 c8b6342d 2005-01-13 devnull smallspace = 1
364 02f38ca6 2005-01-04 devnull }
365 02f38ca6 2005-01-04 devnull
366 02f38ca6 2005-01-04 devnull $1 == ".PD" || $1 == ".SH" || $1 == ".SS" || $1 == ".TH" {
367 c8b6342d 2005-01-13 devnull smallspace = 0
368 02f38ca6 2005-01-04 devnull }
369 02f38ca6 2005-01-04 devnull
370 02f38ca6 2005-01-04 devnull $1 == ".RE" {
371 c8b6342d 2005-01-13 devnull lastre = 1
372 02f38ca6 2005-01-04 devnull }
373 02f38ca6 2005-01-04 devnull
374 02f38ca6 2005-01-04 devnull $1 == ".PP" {
375 c8b6342d 2005-01-13 devnull if(smallspace && !lastre)
376 c8b6342d 2005-01-13 devnull print "Possible missing .PD at " FILENAME ":" FNR
377 c8b6342d 2005-01-13 devnull smallspace = 0
378 02f38ca6 2005-01-04 devnull }
379 02f38ca6 2005-01-04 devnull
380 02f38ca6 2005-01-04 devnull $1 != ".RE" {
381 c8b6342d 2005-01-13 devnull lastre = 0
382 02f38ca6 2005-01-04 devnull }
383 02f38ca6 2005-01-04 devnull
384 c8b6342d 2005-01-13 devnull sh == "BUGS" && $1 == ".br" {
385 c8b6342d 2005-01-13 devnull print FILENAME ":" FNR ": .br in BUGS"
386 c8b6342d 2005-01-13 devnull }
387 c8b6342d 2005-01-13 devnull
388 c8b6342d 2005-01-13 devnull sh == "SOURCE" && $1 ~ /^\\\*9\// {
389 c8b6342d 2005-01-13 devnull s = ENVIRON["PLAN9"] substr($1, 4)
390 8bead109 2005-01-11 devnull Sources[s] = 1
391 02f38ca6 2005-01-04 devnull }
392 02f38ca6 2005-01-04 devnull
393 c8b6342d 2005-01-13 devnull sh == "SOURCE" && $2 ~ /^\\\*9\// {
394 c8b6342d 2005-01-13 devnull s = ENVIRON["PLAN9"] substr($2, 4)
395 8bead109 2005-01-11 devnull Sources[s] = 1
396 02f38ca6 2005-01-04 devnull }
397 02f38ca6 2005-01-04 devnull
398 c8b6342d 2005-01-13 devnull sh == "SOURCE" && $1 ~ /^\// {
399 c8b6342d 2005-01-13 devnull Sources[$1] = 1
400 c8b6342d 2005-01-13 devnull }
401 c8b6342d 2005-01-13 devnull
402 c8b6342d 2005-01-13 devnull sh == "SOURCE" && $2 ~ /^\// {
403 c8b6342d 2005-01-13 devnull Sources[$2] = 1
404 c8b6342d 2005-01-13 devnull }
405 c8b6342d 2005-01-13 devnull
406 02f38ca6 2005-01-04 devnull $0 ~ /^\.[A-Z].*\([1-9]\)/ {
407 02f38ca6 2005-01-04 devnull if ($1 == ".IR" && $3 ~ /\([0-9]\)/) {
408 02f38ca6 2005-01-04 devnull name = $2
409 02f38ca6 2005-01-04 devnull section = $3
410 02f38ca6 2005-01-04 devnull }else if ($1 == ".RI" && $2 == "(" && $4 ~ /\([0-9]\)/) {
411 02f38ca6 2005-01-04 devnull name = $3
412 02f38ca6 2005-01-04 devnull section = $4
413 02f38ca6 2005-01-04 devnull }else if ($1 == ".IR" && $3 ~ /9.\([0-9]\)/) {
414 02f38ca6 2005-01-04 devnull name = $2
415 02f38ca6 2005-01-04 devnull section = "9"
416 02f38ca6 2005-01-04 devnull }else if ($1 == ".RI" && $2 == "(" && $4 ~ /9.\([0-9]\)/) {
417 02f38ca6 2005-01-04 devnull name = $3
418 02f38ca6 2005-01-04 devnull section = "9"
419 02f38ca6 2005-01-04 devnull } else {
420 83c4506a 2005-02-11 devnull if ($1 == ".HR" && $3 == "\"Section")
421 83c4506a 2005-02-11 devnull next;
422 02f38ca6 2005-01-04 devnull print "Possible bad cross-reference format in", FILENAME ":" FNR
423 02f38ca6 2005-01-04 devnull print $0
424 02f38ca6 2005-01-04 devnull next
425 02f38ca6 2005-01-04 devnull }
426 02f38ca6 2005-01-04 devnull gsub(/[^0-9]/, "", section)
427 02f38ca6 2005-01-04 devnull Refs[toupper(name) "(" section ")"]++
428 02f38ca6 2005-01-04 devnull }
429 02f38ca6 2005-01-04 devnull
430 02f38ca6 2005-01-04 devnull END {
431 c8b6342d 2005-01-13 devnull if(lastline == ""){
432 c8b6342d 2005-01-13 devnull print lastfile ":$ is a blank line"
433 c8b6342d 2005-01-13 devnull }
434 c8b6342d 2005-01-13 devnull
435 02f38ca6 2005-01-04 devnull print "Checking Source References"
436 02f38ca6 2005-01-04 devnull cmd = "xargs -n 100 ls -d 2>&1 >/dev/null | sed 's/^ls: / /; s/: .*//'"
437 02f38ca6 2005-01-04 devnull for (i in Sources) {
438 02f38ca6 2005-01-04 devnull print i |cmd
439 02f38ca6 2005-01-04 devnull }
440 02f38ca6 2005-01-04 devnull close(cmd)
441 02f38ca6 2005-01-04 devnull print ""
442 02f38ca6 2005-01-04 devnull print "Checking Cross-Referenced Pages"
443 02f38ca6 2005-01-04 devnull for (i in Refs) {
444 02f38ca6 2005-01-04 devnull if (!(tolower(i) in Pages) && !(tolower(i) in Omitman)){
445 02f38ca6 2005-01-04 devnull b = tolower(i)
446 02f38ca6 2005-01-04 devnull gsub("\\(", " \\(", b)
447 02f38ca6 2005-01-04 devnull gsub("\\)", "\\)", b)
448 02f38ca6 2005-01-04 devnull split(tolower(i), a, "/")
449 02f38ca6 2005-01-04 devnull print "egrep -in '^\\.IR.*" b "' $PLAN9/man/man*/* # Need " tolower(i) |"sort"
450 02f38ca6 2005-01-04 devnull }
451 02f38ca6 2005-01-04 devnull }
452 02f38ca6 2005-01-04 devnull close("sort")
453 02f38ca6 2005-01-04 devnull print ""
454 02f38ca6 2005-01-04 devnull print "Checking commands"
455 02f38ca6 2005-01-04 devnull getindex("man/man1")
456 02f38ca6 2005-01-04 devnull getindex("man/man4")
457 02f38ca6 2005-01-04 devnull getindex("man/man7")
458 02f38ca6 2005-01-04 devnull getindex("man/man8")
459 02f38ca6 2005-01-04 devnull getbinlist("bin")
460 02f38ca6 2005-01-04 devnull for (i in List) {
461 02f38ca6 2005-01-04 devnull if (!(i in Index) && !(i in Omitted))
462 02f38ca6 2005-01-04 devnull print "Need", i, "(in " List[i] ")" |"sort"
463 02f38ca6 2005-01-04 devnull }
464 02f38ca6 2005-01-04 devnull close("sort")
465 02f38ca6 2005-01-04 devnull print ""
466 02f38ca6 2005-01-04 devnull for (i in List) {
467 02f38ca6 2005-01-04 devnull if (!(i in Index) && (i in Omitted))
468 02f38ca6 2005-01-04 devnull print "Omit", i, "(in " List[i] ")" |"sort"
469 02f38ca6 2005-01-04 devnull }
470 02f38ca6 2005-01-04 devnull close("sort")
471 02f38ca6 2005-01-04 devnull clearindex()
472 02f38ca6 2005-01-04 devnull clearlist()
473 02f38ca6 2005-01-04 devnull print ""
474 02f38ca6 2005-01-04 devnull print "Checking libraries"
475 02f38ca6 2005-01-04 devnull getindex("man/man3")
476 02f38ca6 2005-01-04 devnull getnmlist("lib/lib9.a")
477 02f38ca6 2005-01-04 devnull getnmlist("lib/lib9p.a")
478 02f38ca6 2005-01-04 devnull getnmlist("lib/lib9pclient.a")
479 02f38ca6 2005-01-04 devnull getnmlist("lib/libString.a")
480 83c4506a 2005-02-11 devnull getnmlist("lib/libauth.a")
481 83c4506a 2005-02-11 devnull getnmlist("lib/libauthsrv.a")
482 02f38ca6 2005-01-04 devnull getnmlist("lib/libbin.a")
483 02f38ca6 2005-01-04 devnull getnmlist("lib/libbio.a")
484 02f38ca6 2005-01-04 devnull getnmlist("lib/libcomplete.a")
485 02f38ca6 2005-01-04 devnull # getnmlist("lib/libcontrol.a")
486 02f38ca6 2005-01-04 devnull getnmlist("lib/libdisk.a")
487 02f38ca6 2005-01-04 devnull getnmlist("lib/libdraw.a")
488 02f38ca6 2005-01-04 devnull getnmlist("lib/libflate.a")
489 02f38ca6 2005-01-04 devnull getnmlist("lib/libframe.a")
490 02f38ca6 2005-01-04 devnull getnmlist("lib/libgeometry.a")
491 02f38ca6 2005-01-04 devnull getnmlist("lib/libhtml.a")
492 02f38ca6 2005-01-04 devnull # getnmlist("lib/libhttpd.a")
493 02f38ca6 2005-01-04 devnull getnmlist("lib/libip.a")
494 02f38ca6 2005-01-04 devnull getnmlist("lib/libmach.a")
495 02f38ca6 2005-01-04 devnull # getnmlist("lib/libmemdraw.a")
496 02f38ca6 2005-01-04 devnull # getnmlist("lib/libmemlayer.a")
497 02f38ca6 2005-01-04 devnull getnmlist("lib/libmp.a")
498 02f38ca6 2005-01-04 devnull getnmlist("lib/libmux.a")
499 83c4506a 2005-02-11 devnull getnmlist("lib/libndb.a")
500 02f38ca6 2005-01-04 devnull getnmlist("lib/libplumb.a")
501 02f38ca6 2005-01-04 devnull getnmlist("lib/libregexp9.a")
502 02f38ca6 2005-01-04 devnull getnmlist("lib/libsec.a")
503 02f38ca6 2005-01-04 devnull getnmlist("lib/libthread.a")
504 02f38ca6 2005-01-04 devnull # getnmlist("lib/libventi.a")
505 02f38ca6 2005-01-04 devnull for (i in List) {
506 02f38ca6 2005-01-04 devnull if (!(i in Index) && !(i in Omittedlib))
507 02f38ca6 2005-01-04 devnull print "Need", List[i], i |"sort"
508 02f38ca6 2005-01-04 devnull # print "Need", i, "(in " List[i] ")" |"sort"
509 02f38ca6 2005-01-04 devnull }
510 02f38ca6 2005-01-04 devnull close("sort")
511 02f38ca6 2005-01-04 devnull print ""
512 02f38ca6 2005-01-04 devnull for (i in List) {
513 02f38ca6 2005-01-04 devnull if (!(i in Index) && (i in Omittedlib))
514 02f38ca6 2005-01-04 devnull print "Omit", List[i], i |"sort"
515 02f38ca6 2005-01-04 devnull # print "Omit", i, "(in " List[i] ")" |"sort"
516 02f38ca6 2005-01-04 devnull }
517 02f38ca6 2005-01-04 devnull close("sort")
518 02f38ca6 2005-01-04 devnull }
519 02f38ca6 2005-01-04 devnull