]> andersk Git - openssh.git/blame - mdoc2man.awk
- djm@cvs.openbsd.org 2010/01/30 02:54:53
[openssh.git] / mdoc2man.awk
CommitLineData
4bbf95fa 1#!/usr/bin/awk
2#
f43b2695 3# $Id$
4#
4bbf95fa 5# Version history:
f43b2695 6# v4+ Adapted for OpenSSH Portable (see cvs Id and history)
4bbf95fa 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
544842de 38 breakw=0
4bbf95fa 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))
aff51935 83 add(OFS)
4bbf95fa 84 } else if(match(words[w],"^Xc$")) {
85 skip=1
86 ext=0
87 if(!extopt)
aff51935 88 prenl++
4bbf95fa 89 w=nwords
90 } else if(match(words[w],"^Bd$")) {
91 skip=1
92 if(match(words[w+1],"-literal")) {
aff51935 93 literal=1
94 prenl++
95 w=nwords
4bbf95fa 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)
aff51935 103 nospace=1
4bbf95fa 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],"^[\\.,]"))
aff51935 114 add(OFS words[++w])
4bbf95fa 115 add("''")
116 if(!nospace&&match(words[w+1],"^[\\.,]"))
aff51935 117 nospace=1
4bbf95fa 118 } else if(match(words[w],"^Sq|Ql$")) {
119 skip=1
120 add("`" words[++w] "'")
121 if(!nospace&&match(words[w+1],"^[\\.,]"))
aff51935 122 nospace=1
4bbf95fa 123 } else if(match(words[w],"^Oo$")) {
124 skip=1
125 extopt=1
126 if(!nospace)
aff51935 127 nospace=1
4bbf95fa 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))
aff51935 136 add(OFS)
4bbf95fa 137 if(nospace==1)
aff51935 138 nospace=0
4bbf95fa 139 }
140 if(match(words[w],"^Dd$")) {
8c5a3b27 141 if(match(words[w+1],"^\\$Mdocdate:")) {
f43b2695 142 w++;
143 if(match(words[w+4],"^\\$$")) {
144 words[w+4] = ""
145 }
146 }
4bbf95fa 147 date=wtail()
148 next
149 } else if(match(words[w],"^Dt$")) {
150 id=wtail()
151 next
aaeda216 152 } else if(match(words[w],"^Ux$")) {
153 add("UNIX")
154 skip=1
cbcabe98 155 } else if(match(words[w],"^Ox$")) {
156 add("OpenBSD")
157 skip=1
4bbf95fa 158 } else if(match(words[w],"^Os$")) {
159 add(".TH " id " \"" date "\" \"" wtail() "\"")
160 } else if(match(words[w],"^Sh$")) {
161 add(".SH")
162 synopsis=match(words[w+1],"SYNOPSIS")
163 } else if(match(words[w],"^Xr$")) {
164 add("\\fB" words[++w] "\\fP(" words[++w] ")" words[++w])
165 } else if(match(words[w],"^Rs$")) {
166 split("",refauthors)
167 nrefauthors=0
168 reftitle=""
169 refissue=""
170 refdate=""
171 refopt=""
757841b2 172 refreport=""
4bbf95fa 173 reference=1
174 next
175 } else if(match(words[w],"^Re$")) {
176 prenl++
177 for(i=nrefauthors-1;i>0;i--) {
aff51935 178 add(refauthors[i])
179 if(i>1)
180 add(", ")
4bbf95fa 181 }
182 if(nrefauthors>1)
aff51935 183 add(" and ")
757841b2 184 if(nrefauthors>0)
185 add(refauthors[0] ", ")
186 add("\\fI" reftitle "\\fP")
4bbf95fa 187 if(length(refissue))
aff51935 188 add(", " refissue)
757841b2 189 if(length(refreport)) {
190 add(", " refreport)
191 }
4bbf95fa 192 if(length(refdate))
aff51935 193 add(", " refdate)
4bbf95fa 194 if(length(refopt))
aff51935 195 add(", " refopt)
4bbf95fa 196 add(".")
197 reference=0
198 } else if(reference) {
199 if(match(words[w],"^%A$")) { refauthors[nrefauthors++]=wtail() }
200 if(match(words[w],"^%T$")) {
aff51935 201 reftitle=wtail()
202 sub("^\"","",reftitle)
203 sub("\"$","",reftitle)
4bbf95fa 204 }
205 if(match(words[w],"^%N$")) { refissue=wtail() }
206 if(match(words[w],"^%D$")) { refdate=wtail() }
207 if(match(words[w],"^%O$")) { refopt=wtail() }
757841b2 208 if(match(words[w],"^%R$")) { refreport=wtail() }
4bbf95fa 209 } else if(match(words[w],"^Nm$")) {
210 if(synopsis) {
aff51935 211 add(".br")
212 prenl++
4bbf95fa 213 }
214 n=words[++w]
215 if(!length(name))
aff51935 216 name=n
4bbf95fa 217 if(!length(n))
aff51935 218 n=name
4bbf95fa 219 add("\\fB" n "\\fP")
220 if(!nospace&&match(words[w+1],"^[\\.,]"))
aff51935 221 nospace=1
4bbf95fa 222 } else if(match(words[w],"^Nd$")) {
223 add("\\- " wtail())
224 } else if(match(words[w],"^Fl$")) {
225 add("\\fB\\-" words[++w] "\\fP")
226 if(!nospace&&match(words[w+1],"^[\\.,]"))
aff51935 227 nospace=1
4bbf95fa 228 } else if(match(words[w],"^Ar$")) {
229 add("\\fI")
230 if(w==nwords)
aff51935 231 add("file ...\\fP")
4bbf95fa 232 else {
aff51935 233 add(words[++w] "\\fP")
234 while(match(words[w+1],"^\\|$"))
235 add(OFS words[++w] " \\fI" words[++w] "\\fP")
4bbf95fa 236 }
237 if(!nospace&&match(words[w+1],"^[\\.,]"))
aff51935 238 nospace=1
4bbf95fa 239 } else if(match(words[w],"^Cm$")) {
240 add("\\fB" words[++w] "\\fP")
241 while(w<nwords&&match(words[w+1],"^[\\.,:;)]"))
aff51935 242 add(words[++w])
4bbf95fa 243 } else if(match(words[w],"^Op$")) {
244 option=1
245 if(!nospace)
aff51935 246 nospace=1
4bbf95fa 247 add("[")
248 } else if(match(words[w],"^Pp$")) {
249 prenl++
250 } else if(match(words[w],"^An$")) {
251 prenl++
252 } else if(match(words[w],"^Ss$")) {
253 add(".SS")
254 } else if(match(words[w],"^Pa$")&&!option) {
255 add("\\fI")
256 w++
257 if(match(words[w],"^\\."))
aff51935 258 add("\\&")
4bbf95fa 259 add(words[w] "\\fP")
260 while(w<nwords&&match(words[w+1],"^[\\.,:;)]"))
aff51935 261 add(words[++w])
4bbf95fa 262 } else if(match(words[w],"^Dv$")) {
263 add(".BR")
264 } else if(match(words[w],"^Em|Ev$")) {
265 add(".IR")
266 } else if(match(words[w],"^Pq$")) {
267 add("(")
268 nospace=1
269 parens=1
270 } else if(match(words[w],"^Aq$")) {
271 add("<")
272 nospace=1
273 angles=1
274 } else if(match(words[w],"^S[xy]$")) {
275 add(".B " wtail())
276 } else if(match(words[w],"^Ic$")) {
277 plain=1
278 add("\\fB")
279 while(w<nwords) {
aff51935 280 w++
281 if(match(words[w],"^Op$")) {
282 w++
283 add("[")
284 words[nwords]=words[nwords] "]"
285 }
286 if(match(words[w],"^Ar$")) {
287 add("\\fI" words[++w] "\\fP")
288 } else if(match(words[w],"^[\\.,]")) {
289 sub(" $","",line)
290 if(plain) {
291 add("\\fP")
292 plain=0
293 }
294 add(words[w])
295 } else {
296 if(!plain) {
297 add("\\fB")
298 plain=1
299 }
300 add(words[w])
301 }
302 if(!nospace)
303 add(OFS)
4bbf95fa 304 }
305 sub(" $","",line)
306 if(plain)
aff51935 307 add("\\fP")
4bbf95fa 308 } else if(match(words[w],"^Bl$")) {
309 oldoptlist=optlist
310 if(match(words[w+1],"-bullet"))
aff51935 311 optlist=1
4bbf95fa 312 else if(match(words[w+1],"-enum")) {
aff51935 313 optlist=2
314 enum=0
4bbf95fa 315 } else if(match(words[w+1],"-tag"))
aff51935 316 optlist=3
4bbf95fa 317 else if(match(words[w+1],"-item"))
aff51935 318 optlist=4
4bbf95fa 319 else if(match(words[w+1],"-bullet"))
aff51935 320 optlist=1
4bbf95fa 321 w=nwords
322 } else if(match(words[w],"^El$")) {
323 optlist=oldoptlist
544842de 324 } else if(match(words[w],"^Bk$")) {
325 if(match(words[w+1],"-words")) {
326 w++
327 breakw=1
328 }
329 } else if(match(words[w],"^Ek$")) {
330 breakw=0
4bbf95fa 331 } else if(match(words[w],"^It$")&&optlist) {
332 if(optlist==1)
aff51935 333 add(".IP \\(bu")
4bbf95fa 334 else if(optlist==2)
aff51935 335 add(".IP " ++enum ".")
4bbf95fa 336 else if(optlist==3) {
aff51935 337 add(".TP")
338 prenl++
78666263 339 if(match(words[w+1],"^Pa$|^Ev$")) {
aff51935 340 add(".B")
341 w++
342 }
4bbf95fa 343 } else if(optlist==4)
aff51935 344 add(".IP")
4bbf95fa 345 } else if(match(words[w],"^Sm$")) {
346 if(match(words[w+1],"off"))
aff51935 347 nospace=2
4bbf95fa 348 else if(match(words[w+1],"on"))
aff51935 349 nospace=0
4bbf95fa 350 w++
351 } else if(!skip) {
352 add(words[w])
353 }
354 }
355 if(match(line,"^\\.[^a-zA-Z]"))
356 sub("^\\.","",line)
357 if(parens)
358 add(")")
359 if(angles)
360 add(">")
361 if(option)
362 add("]")
363 if(ext&&!extopt&&!match(line," $"))
364 add(OFS)
365 if(!ext&&!extopt&&length(line)) {
366 print line
367 prenl=0
368 line=""
369 }
370}
This page took 0.190772 seconds and 5 git commands to generate.