#!/usr/bin/awk # # Version history: # v3, I put the program under a proper license # Dan Nelson added .An, .Aq and fixed a typo # v2, fixed to work on GNU awk --posix and MacOS X # v1, first attempt, didn't work on MacOS X # # Copyright (c) 2003 Peter Stuge # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. BEGIN { optlist=0 oldoptlist=0 nospace=0 synopsis=0 reference=0 block=0 ext=0 extopt=0 literal=0 prenl=0 breakw=0 line="" proto=0 bl_level=0 } function wtail() { retval="" while(w0;i--) { add(refauthors[i]) if(i>1) add(", ") } if(nrefauthors>1) add(" and ") add(refauthors[0] ", \\fI" reftitle "\\fP") if(length(refissue)) add(", " refissue) if(length(refdate)) add(", " refdate) if(length(refopt)) add(", " refopt) add(".") reference=0 } else if(reference) { if(match(words[w],"^%A$")) { refauthors[nrefauthors++]=wtail() } if(match(words[w],"^%T$")) { reftitle=wtail() sub("^\"","",reftitle) sub("\"$","",reftitle) } if(match(words[w],"^%N$")) { refissue=wtail() } if(match(words[w],"^%D$")) { refdate=wtail() } if(match(words[w],"^%O$")) { refopt=wtail() } } else if(match(words[w],"^Nm$")) { if(synopsis) { add(".br") prenl++ } n=words[++w] if(!length(name)) name=n if(!length(n)) n=name add("\\fB" n "\\fP") if(!nospace&&match(words[w+1],"^[\\.,]")) nospace=1 } else if(match(words[w],"^Nd$")) { add("\\- " wtail()) } else if(match(words[w],"^Fl$")) { add("\\fB\\-" words[++w] "\\fP") if(!nospace&&match(words[w+1],"^[\\.,]")) nospace=1 } else if(match(words[w],"^Ar$")) { add("\\fI") if(w==nwords) add("file ...\\fP") else { add(words[++w] "\\fP") while(match(words[w+1],"^\\|$")) add(OFS words[++w] " \\fI" words[++w] "\\fP") } if(!nospace&&match(words[w+1],"^[\\.,]")) nospace=1 } else if(match(words[w],"^Cm$")) { add("\\fB" words[++w] "\\fP") while(w 1) add(".RS") oldoptlist=optlist if(match(words[w+1],"-bullet")) optlist=1 else if(match(words[w+1],"-enum")) { optlist=2 enum=0 } else if(match(words[w+1],"-tag")) optlist=3 else if(match(words[w+1],"-item")) optlist=4 else if(match(words[w+1],"-bullet")) optlist=1 w=nwords } else if(match(words[w],"^El$")) { if (bl_level > 1) add(".RE") --bl_level optlist=oldoptlist } else if(match(words[w],"^Bk$")) { if(match(words[w+1],"-words")) { w++ breakw=1 } } else if(match(words[w],"^Ek$")) { breakw=0 } else if(match(words[w],"^It$")&&optlist) { if(optlist==1) add(".IP \\(bu") else if(optlist==2) add(".IP " ++enum ".") else if(optlist==3) { add(".TP") prenl++ if(match(words[w+1],"^Pa$|^Ev$")) { add(".B") w++ } } else if(optlist==4) add(".IP") } else if(match(words[w],"^Sm$")) { if(match(words[w+1],"off")) nospace=2 else if(match(words[w+1],"on")) nospace=0 w++ } else if(match(words[w],"^Lb$")) { wtail() add("Command Line Editor Library (libedit, -ledit)") } else if(match(words[w],"^In$")) { add(".PP\n") add("\\fB#include <" wtail() ">\\fP") } else if(match(words[w],"^Ft$")) { add(".PP\n") add("\\fI" wtail() "\\fP\n") add(".br") proto=1 } else if(match(words[w],"^Fn$")) { add("\\fB" words[++w] "\\fP(") punct=0 while(++w<=nwords) { if(match(words[w], "^\".*\"$")) { sub("^\"", "", words[w]) sub("\"$", "", words[w]) add("\\fI" words[w] "\\fP") if (w!=nwords) { add(", ") } } else if(match(words[w], "^\"")) { sub("^\"", "", words[w]) add("\\fI" words[w] " ") } else if (match(words[w], "\"$")) { sub("\"$", "", words[w]) add(words[w] "\\fP") if (w!=nwords) { add(", ") } } else { if (w==nwords&&(match(words[w], "^[.,]$"))) { punct=1 } else { add(words[w] " ") } } } add(")") if (punct==1) { add(words[w-1]) } else { if (proto==1) { add(";") proto=0 } } } else if(match(words[w],"^Fa$")) { punct=0 add("\\fI") while(++w<=nwords) { if(match(words[w], "^\".*\"$")) { sub("^\"", "", words[w]) sub("\"$", "", words[w]) add(words[w]) } else if(match(words[w], "^\"")) { sub("^\"", "", words[w]) add(words[w] " ") } else if (match(words[w], "\"$")) { sub("\"$", "", words[w]) add(words[w]) } else { if (w==nwords&&(match(words[w], "^[.,]$"))) { punct=1 } else { if (w+1==nwords&&(match(words[w+1], "^[.,]$"))) { add(words[w]) } else { add(words[w] " ") } } } } add("\\fP") if (punct==1) { add(words[w-1]) } } else if(!skip) { add(words[w]) } } if(match(line,"^\\.[^a-zA-Z]")) sub("^\\.","",line) if(parens) add(")") if(angles) add(">") if(option) add("]") if(ext&&!extopt&&!match(line," $")) add(OFS) if(!ext&&!extopt&&length(line)) { print line prenl=0 line="" } }