Annotation of embedaddon/tmux/mdoc2man.awk, revision 1.1
1.1 ! misho 1: #!/usr/bin/awk
! 2: #
! 3: # $Id: mdoc2man.awk,v 1.9 2009/10/24 00:52:42 dtucker Exp $
! 4: #
! 5: # Version history:
! 6: # v4+ Adapted for OpenSSH Portable (see cvs Id and history)
! 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:
! 27: BEGIN {
! 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
! 38: breakw=0
! 39: line=""
! 40: }
! 41:
! 42: function 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:
! 52: function 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))
! 83: add(OFS)
! 84: } else if(match(words[w],"^Xc$")) {
! 85: skip=1
! 86: ext=0
! 87: if(!extopt)
! 88: prenl++
! 89: w=nwords
! 90: } else if(match(words[w],"^Bd$")) {
! 91: skip=1
! 92: if(match(words[w+1],"-literal")) {
! 93: literal=1
! 94: prenl++
! 95: w=nwords
! 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)
! 103: nospace=1
! 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],"^[\\.,]"))
! 114: add(OFS words[++w])
! 115: add("''")
! 116: if(!nospace&&match(words[w+1],"^[\\.,]"))
! 117: nospace=1
! 118: } else if(match(words[w],"^Sq|Ql$")) {
! 119: skip=1
! 120: add("`" words[++w] "'")
! 121: if(!nospace&&match(words[w+1],"^[\\.,]"))
! 122: nospace=1
! 123: } else if(match(words[w],"^Oo$")) {
! 124: skip=1
! 125: extopt=1
! 126: if(!nospace)
! 127: nospace=1
! 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))
! 136: add(OFS)
! 137: if(nospace==1)
! 138: nospace=0
! 139: }
! 140: if(match(words[w],"^Dd$")) {
! 141: if(match(words[w+1],"^\\$Mdocdate:")) {
! 142: w++;
! 143: if(match(words[w+4],"^\\$$")) {
! 144: words[w+4] = ""
! 145: }
! 146: }
! 147: date=wtail()
! 148: next
! 149: } else if(match(words[w],"^Dt$")) {
! 150: id=wtail()
! 151: next
! 152: } else if(match(words[w],"^Ux$")) {
! 153: add("UNIX")
! 154: skip=1
! 155: } else if(match(words[w],"^Ox$")) {
! 156: add("OpenBSD")
! 157: skip=1
! 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=""
! 172: refreport=""
! 173: reference=1
! 174: next
! 175: } else if(match(words[w],"^Re$")) {
! 176: prenl++
! 177: for(i=nrefauthors-1;i>0;i--) {
! 178: add(refauthors[i])
! 179: if(i>1)
! 180: add(", ")
! 181: }
! 182: if(nrefauthors>1)
! 183: add(" and ")
! 184: if(nrefauthors>0)
! 185: add(refauthors[0] ", ")
! 186: add("\\fI" reftitle "\\fP")
! 187: if(length(refissue))
! 188: add(", " refissue)
! 189: if(length(refreport)) {
! 190: add(", " refreport)
! 191: }
! 192: if(length(refdate))
! 193: add(", " refdate)
! 194: if(length(refopt))
! 195: add(", " refopt)
! 196: add(".")
! 197: reference=0
! 198: } else if(reference) {
! 199: if(match(words[w],"^%A$")) { refauthors[nrefauthors++]=wtail() }
! 200: if(match(words[w],"^%T$")) {
! 201: reftitle=wtail()
! 202: sub("^\"","",reftitle)
! 203: sub("\"$","",reftitle)
! 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() }
! 208: if(match(words[w],"^%R$")) { refreport=wtail() }
! 209: } else if(match(words[w],"^Nm$")) {
! 210: if(synopsis) {
! 211: add(".br")
! 212: prenl++
! 213: }
! 214: n=words[++w]
! 215: if(!length(name))
! 216: name=n
! 217: if(!length(n))
! 218: n=name
! 219: add("\\fB" n "\\fP")
! 220: if(!nospace&&match(words[w+1],"^[\\.,]"))
! 221: nospace=1
! 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],"^[\\.,]"))
! 227: nospace=1
! 228: } else if(match(words[w],"^Ar$")) {
! 229: add("\\fI")
! 230: if(w==nwords)
! 231: add("file ...\\fP")
! 232: else {
! 233: add(words[++w] "\\fP")
! 234: while(match(words[w+1],"^\\|$"))
! 235: add(OFS words[++w] " \\fI" words[++w] "\\fP")
! 236: }
! 237: if(!nospace&&match(words[w+1],"^[\\.,]"))
! 238: nospace=1
! 239: } else if(match(words[w],"^Cm$")) {
! 240: add("\\fB" words[++w] "\\fP")
! 241: while(w<nwords&&match(words[w+1],"^[\\.,:;)]"))
! 242: add(words[++w])
! 243: } else if(match(words[w],"^Op$")) {
! 244: option=1
! 245: if(!nospace)
! 246: nospace=1
! 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],"^\\."))
! 258: add("\\&")
! 259: add(words[w] "\\fP")
! 260: while(w<nwords&&match(words[w+1],"^[\\.,:;)]"))
! 261: add(words[++w])
! 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) {
! 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)
! 304: }
! 305: sub(" $","",line)
! 306: if(plain)
! 307: add("\\fP")
! 308: } else if(match(words[w],"^Bl$")) {
! 309: oldoptlist=optlist
! 310: if(match(words[w+1],"-bullet"))
! 311: optlist=1
! 312: else if(match(words[w+1],"-enum")) {
! 313: optlist=2
! 314: enum=0
! 315: } else if(match(words[w+1],"-tag"))
! 316: optlist=3
! 317: else if(match(words[w+1],"-item"))
! 318: optlist=4
! 319: else if(match(words[w+1],"-bullet"))
! 320: optlist=1
! 321: w=nwords
! 322: } else if(match(words[w],"^El$")) {
! 323: optlist=oldoptlist
! 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
! 331: } else if(match(words[w],"^It$")&&optlist) {
! 332: if(optlist==1)
! 333: add(".IP \\(bu")
! 334: else if(optlist==2)
! 335: add(".IP " ++enum ".")
! 336: else if(optlist==3) {
! 337: add(".TP")
! 338: prenl++
! 339: if(match(words[w+1],"^Pa$|^Ev$")) {
! 340: add(".B")
! 341: w++
! 342: }
! 343: } else if(optlist==4)
! 344: add(".IP")
! 345: } else if(match(words[w],"^Sm$")) {
! 346: if(match(words[w+1],"off"))
! 347: nospace=2
! 348: else if(match(words[w+1],"on"))
! 349: nospace=0
! 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: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>