]> andersk Git - gssapi-openssh.git/blame - openssh/mdoc2man.awk
The man2html from jbasney on pkilab2 works whereas the standard one doesn't.
[gssapi-openssh.git] / openssh / mdoc2man.awk
CommitLineData
c9307018 1#!/usr/bin/awk
2#
fa0f0f45 3# $Id$
4#
c9307018 5# Version history:
fa0f0f45 6# v4+ Adapted for OpenSSH Portable (see cvs Id and history)
c9307018 7# v3, I put the program under a proper license
8# Dan Nelson <dnelson@allantgroup.com> added .An, .Aq and fixed a typo
9# v2, fixed to work on GNU awk --posix and MacOS X
10# v1, first attempt, didn't work on MacOS X
11#
12# Copyright (c) 2003 Peter Stuge <stuge-mdoc2man@cdy.org>
13#
14# Permission to use, copy, modify, and distribute this software for any
15# purpose with or without fee is hereby granted, provided that the above
16# copyright notice and this permission notice appear in all copies.
17#
18# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
19# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
20# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
21# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
22# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
23# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
24# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
25
26
27BEGIN {
28 optlist=0
29 oldoptlist=0
30 nospace=0
31 synopsis=0
32 reference=0
33 block=0
34 ext=0
35 extopt=0
36 literal=0
37 prenl=0
7e82606e 38 breakw=0
c9307018 39 line=""
40}
41
42function wtail() {
43 retval=""
44 while(w<nwords) {
45 if(length(retval))
46 retval=retval OFS
47 retval=retval words[++w]
48 }
49 return retval
50}
51
52function add(str) {
53 for(;prenl;prenl--)
54 line=line "\n"
55 line=line str
56}
57
58! /^\./ {
59 for(;prenl;prenl--)
60 print ""
61 print
62 if(literal)
63 print ".br"
64 next
65}
66
67/^\.\\"/ { next }
68
69{
70 option=0
71 parens=0
72 angles=0
73 sub("^\\.","")
74 nwords=split($0,words)
75 for(w=1;w<=nwords;w++) {
76 skip=0
77 if(match(words[w],"^Li|Pf$")) {
78 skip=1
79 } else if(match(words[w],"^Xo$")) {
80 skip=1
81 ext=1
82 if(length(line)&&!(match(line," $")||prenl))
540d72c3 83 add(OFS)
c9307018 84 } else if(match(words[w],"^Xc$")) {
85 skip=1
86 ext=0
87 if(!extopt)
540d72c3 88 prenl++
c9307018 89 w=nwords
90 } else if(match(words[w],"^Bd$")) {
91 skip=1
92 if(match(words[w+1],"-literal")) {
540d72c3 93 literal=1
94 prenl++
95 w=nwords
c9307018 96 }
97 } else if(match(words[w],"^Ed$")) {
98 skip=1
99 literal=0
100 } else if(match(words[w],"^Ns$")) {
101 skip=1
102 if(!nospace)
540d72c3 103 nospace=1
c9307018 104 sub(" $","",line)
105 } else if(match(words[w],"^No$")) {
106 skip=1
107 sub(" $","",line)
108 add(words[++w])
109 } else if(match(words[w],"^Dq$")) {
110 skip=1
111 add("``")
112 add(words[++w])
113 while(w<nwords&&!match(words[w+1],"^[\\.,]"))
540d72c3 114 add(OFS words[++w])
c9307018 115 add("''")
116 if(!nospace&&match(words[w+1],"^[\\.,]"))
540d72c3 117 nospace=1
c9307018 118 } else if(match(words[w],"^Sq|Ql$")) {
119 skip=1
120 add("`" words[++w] "'")
121 if(!nospace&&match(words[w+1],"^[\\.,]"))
540d72c3 122 nospace=1
c9307018 123 } else if(match(words[w],"^Oo$")) {
124 skip=1
125 extopt=1
126 if(!nospace)
540d72c3 127 nospace=1
c9307018 128 add("[")
129 } else if(match(words[w],"^Oc$")) {
130 skip=1
131 extopt=0
132 add("]")
133 }
134 if(!skip) {
135 if(!nospace&&length(line)&&!(match(line," $")||prenl))
540d72c3 136 add(OFS)
c9307018 137 if(nospace==1)
540d72c3 138 nospace=0
c9307018 139 }
140 if(match(words[w],"^Dd$")) {
fa0f0f45 141 if(match(words[w+1],"^\\$Mdocdate:")) {
142 w++;
143 if(match(words[w+4],"^\\$$")) {
144 words[w+4] = ""
145 }
146 }
c9307018 147 date=wtail()
148 next
149 } else if(match(words[w],"^Dt$")) {
150 id=wtail()
151 next
2ce0bfe4 152 } else if(match(words[w],"^Ox$")) {
153 add("OpenBSD")
154 skip=1
c9307018 155 } else if(match(words[w],"^Os$")) {
156 add(".TH " id " \"" date "\" \"" wtail() "\"")
157 } else if(match(words[w],"^Sh$")) {
158 add(".SH")
159 synopsis=match(words[w+1],"SYNOPSIS")
160 } else if(match(words[w],"^Xr$")) {
161 add("\\fB" words[++w] "\\fP(" words[++w] ")" words[++w])
162 } else if(match(words[w],"^Rs$")) {
163 split("",refauthors)
164 nrefauthors=0
165 reftitle=""
166 refissue=""
167 refdate=""
168 refopt=""
fa0f0f45 169 refreport=""
c9307018 170 reference=1
171 next
172 } else if(match(words[w],"^Re$")) {
173 prenl++
174 for(i=nrefauthors-1;i>0;i--) {
540d72c3 175 add(refauthors[i])
176 if(i>1)
177 add(", ")
c9307018 178 }
179 if(nrefauthors>1)
540d72c3 180 add(" and ")
fa0f0f45 181 if(nrefauthors>0)
182 add(refauthors[0] ", ")
183 add("\\fI" reftitle "\\fP")
c9307018 184 if(length(refissue))
540d72c3 185 add(", " refissue)
fa0f0f45 186 if(length(refreport)) {
187 add(", " refreport)
188 }
c9307018 189 if(length(refdate))
540d72c3 190 add(", " refdate)
c9307018 191 if(length(refopt))
540d72c3 192 add(", " refopt)
c9307018 193 add(".")
194 reference=0
195 } else if(reference) {
196 if(match(words[w],"^%A$")) { refauthors[nrefauthors++]=wtail() }
197 if(match(words[w],"^%T$")) {
540d72c3 198 reftitle=wtail()
199 sub("^\"","",reftitle)
200 sub("\"$","",reftitle)
c9307018 201 }
202 if(match(words[w],"^%N$")) { refissue=wtail() }
203 if(match(words[w],"^%D$")) { refdate=wtail() }
204 if(match(words[w],"^%O$")) { refopt=wtail() }
fa0f0f45 205 if(match(words[w],"^%R$")) { refreport=wtail() }
c9307018 206 } else if(match(words[w],"^Nm$")) {
207 if(synopsis) {
540d72c3 208 add(".br")
209 prenl++
c9307018 210 }
211 n=words[++w]
212 if(!length(name))
540d72c3 213 name=n
c9307018 214 if(!length(n))
540d72c3 215 n=name
c9307018 216 add("\\fB" n "\\fP")
217 if(!nospace&&match(words[w+1],"^[\\.,]"))
540d72c3 218 nospace=1
c9307018 219 } else if(match(words[w],"^Nd$")) {
220 add("\\- " wtail())
221 } else if(match(words[w],"^Fl$")) {
222 add("\\fB\\-" words[++w] "\\fP")
223 if(!nospace&&match(words[w+1],"^[\\.,]"))
540d72c3 224 nospace=1
c9307018 225 } else if(match(words[w],"^Ar$")) {
226 add("\\fI")
227 if(w==nwords)
540d72c3 228 add("file ...\\fP")
c9307018 229 else {
540d72c3 230 add(words[++w] "\\fP")
231 while(match(words[w+1],"^\\|$"))
232 add(OFS words[++w] " \\fI" words[++w] "\\fP")
c9307018 233 }
234 if(!nospace&&match(words[w+1],"^[\\.,]"))
540d72c3 235 nospace=1
c9307018 236 } else if(match(words[w],"^Cm$")) {
237 add("\\fB" words[++w] "\\fP")
238 while(w<nwords&&match(words[w+1],"^[\\.,:;)]"))
540d72c3 239 add(words[++w])
c9307018 240 } else if(match(words[w],"^Op$")) {
241 option=1
242 if(!nospace)
540d72c3 243 nospace=1
c9307018 244 add("[")
245 } else if(match(words[w],"^Pp$")) {
246 prenl++
247 } else if(match(words[w],"^An$")) {
248 prenl++
249 } else if(match(words[w],"^Ss$")) {
250 add(".SS")
251 } else if(match(words[w],"^Pa$")&&!option) {
252 add("\\fI")
253 w++
254 if(match(words[w],"^\\."))
540d72c3 255 add("\\&")
c9307018 256 add(words[w] "\\fP")
257 while(w<nwords&&match(words[w+1],"^[\\.,:;)]"))
540d72c3 258 add(words[++w])
c9307018 259 } else if(match(words[w],"^Dv$")) {
260 add(".BR")
261 } else if(match(words[w],"^Em|Ev$")) {
262 add(".IR")
263 } else if(match(words[w],"^Pq$")) {
264 add("(")
265 nospace=1
266 parens=1
267 } else if(match(words[w],"^Aq$")) {
268 add("<")
269 nospace=1
270 angles=1
271 } else if(match(words[w],"^S[xy]$")) {
272 add(".B " wtail())
273 } else if(match(words[w],"^Ic$")) {
274 plain=1
275 add("\\fB")
276 while(w<nwords) {
540d72c3 277 w++
278 if(match(words[w],"^Op$")) {
279 w++
280 add("[")
281 words[nwords]=words[nwords] "]"
282 }
283 if(match(words[w],"^Ar$")) {
284 add("\\fI" words[++w] "\\fP")
285 } else if(match(words[w],"^[\\.,]")) {
286 sub(" $","",line)
287 if(plain) {
288 add("\\fP")
289 plain=0
290 }
291 add(words[w])
292 } else {
293 if(!plain) {
294 add("\\fB")
295 plain=1
296 }
297 add(words[w])
298 }
299 if(!nospace)
300 add(OFS)
c9307018 301 }
302 sub(" $","",line)
303 if(plain)
540d72c3 304 add("\\fP")
c9307018 305 } else if(match(words[w],"^Bl$")) {
306 oldoptlist=optlist
307 if(match(words[w+1],"-bullet"))
540d72c3 308 optlist=1
c9307018 309 else if(match(words[w+1],"-enum")) {
540d72c3 310 optlist=2
311 enum=0
c9307018 312 } else if(match(words[w+1],"-tag"))
540d72c3 313 optlist=3
c9307018 314 else if(match(words[w+1],"-item"))
540d72c3 315 optlist=4
c9307018 316 else if(match(words[w+1],"-bullet"))
540d72c3 317 optlist=1
c9307018 318 w=nwords
319 } else if(match(words[w],"^El$")) {
320 optlist=oldoptlist
7e82606e 321 } else if(match(words[w],"^Bk$")) {
322 if(match(words[w+1],"-words")) {
323 w++
324 breakw=1
325 }
326 } else if(match(words[w],"^Ek$")) {
327 breakw=0
c9307018 328 } else if(match(words[w],"^It$")&&optlist) {
329 if(optlist==1)
540d72c3 330 add(".IP \\(bu")
c9307018 331 else if(optlist==2)
540d72c3 332 add(".IP " ++enum ".")
c9307018 333 else if(optlist==3) {
540d72c3 334 add(".TP")
335 prenl++
7e82606e 336 if(match(words[w+1],"^Pa$|^Ev$")) {
540d72c3 337 add(".B")
338 w++
339 }
c9307018 340 } else if(optlist==4)
540d72c3 341 add(".IP")
c9307018 342 } else if(match(words[w],"^Sm$")) {
343 if(match(words[w+1],"off"))
540d72c3 344 nospace=2
c9307018 345 else if(match(words[w+1],"on"))
540d72c3 346 nospace=0
c9307018 347 w++
348 } else if(!skip) {
349 add(words[w])
350 }
351 }
352 if(match(line,"^\\.[^a-zA-Z]"))
353 sub("^\\.","",line)
354 if(parens)
355 add(")")
356 if(angles)
357 add(">")
358 if(option)
359 add("]")
360 if(ext&&!extopt&&!match(line," $"))
361 add(OFS)
362 if(!ext&&!extopt&&length(line)) {
363 print line
364 prenl=0
365 line=""
366 }
367}
This page took 0.119823 seconds and 5 git commands to generate.