/opensource.apple.com/source/libarchive/libarchive-13.1/libarchive/doc/mdoc2man.awk
AWK | 353 lines | 337 code | 13 blank | 3 comment | 0 complexity | 238ee1ce5d0a04b696eca3fe2e01b7e7 MD5 | raw file
Possible License(s): GPL-2.0, AGPL-1.0, AGPL-3.0, CC-BY-SA-3.0, MPL-2.0-no-copyleft-exception, MPL-2.0, JSON, 0BSD, LGPL-2.1, Apache-2.0, BSD-3-Clause, ISC, LGPL-2.0, WTFPL, MIT
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
- <head>
- <title>mdoc2man.awk</title>
- <style type="text/css">
- .enscript-comment { font-style: italic; color: rgb(178,34,34); }
- .enscript-function-name { font-weight: bold; color: rgb(0,0,255); }
- .enscript-variable-name { font-weight: bold; color: rgb(184,134,11); }
- .enscript-keyword { font-weight: bold; color: rgb(160,32,240); }
- .enscript-reference { font-weight: bold; color: rgb(95,158,160); }
- .enscript-string { font-weight: bold; color: rgb(188,143,143); }
- .enscript-builtin { font-weight: bold; color: rgb(218,112,214); }
- .enscript-type { font-weight: bold; color: rgb(34,139,34); }
- .enscript-highlight { text-decoration: underline; color: 0; }
- </style>
- </head>
- <body id="top">
- <h1 style="margin:8px;" id="f1">mdoc2man.awk <span style="font-weight: normal; font-size: 0.5em;">[<a href="?txt">plain text</a>]</span></h1>
- <hr/>
- <div></div>
- <pre>
- <span class="enscript-reference">#!/usr/bin/awk
- </span><span class="enscript-comment">#
- </span><span class="enscript-comment"># Copyright (c) 2003 Peter Stuge <<a href="mailto:stuge-mdoc2man@cdy.org">stuge-mdoc2man@cdy.org</a>>
- </span><span class="enscript-comment">#
- </span><span class="enscript-comment"># Permission to use, copy, modify, and distribute this software for any
- </span><span class="enscript-comment"># purpose with or without fee is hereby granted, provided that the above
- </span><span class="enscript-comment"># copyright notice and this permission notice appear in all copies.
- </span><span class="enscript-comment">#
- </span><span class="enscript-comment"># THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- </span><span class="enscript-comment"># WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- </span><span class="enscript-comment"># MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- </span><span class="enscript-comment"># ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- </span><span class="enscript-comment"># WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- </span><span class="enscript-comment"># ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- </span><span class="enscript-comment"># OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- </span>
- <span class="enscript-comment"># Dramatically overhauled by Tim Kientzle. This version almost
- </span><span class="enscript-comment"># handles library-style pages with Fn, Ft, etc commands. Still
- </span><span class="enscript-comment"># a lot of problems...
- </span>
- <span class="enscript-keyword">BEGIN</span> {
- displaylines = 0
- trailer = <span class="enscript-string">""</span>
- out = <span class="enscript-string">""</span>
- sep = <span class="enscript-string">""</span>
- nextsep = <span class="enscript-string">" "</span>
- }
- <span class="enscript-comment"># Add a word with appropriate preceding whitespace
- </span><span class="enscript-comment"># Maintain a short queue of the expected upcoming word separators.
- </span><span class="enscript-keyword">function</span> add(str) {
- out=out sep str
- sep = nextsep
- nextsep = <span class="enscript-string">" "</span>
- }
- <span class="enscript-comment"># Add a word with no following whitespace
- </span><span class="enscript-comment"># Use for opening punctuation such as '('
- </span><span class="enscript-keyword">function</span> addopen(str) {
- add(str)
- sep = <span class="enscript-string">""</span>
- }
- <span class="enscript-comment"># Add a word with no preceding whitespace
- </span><span class="enscript-comment"># Use for closing punctuation such as ')' or '.'
- </span><span class="enscript-keyword">function</span> addclose(str) {
- sep = <span class="enscript-string">""</span>
- add(str)
- }
- <span class="enscript-comment"># Add a word with no space before or after
- </span><span class="enscript-comment"># Use for separating punctuation such as '='
- </span><span class="enscript-keyword">function</span> addpunct(str) {
- sep = <span class="enscript-string">""</span>
- add(str)
- sep = <span class="enscript-string">""</span>
- }
- <span class="enscript-comment"># Emit the current line so far
- </span><span class="enscript-keyword">function</span> endline() {
- addclose(trailer)
- trailer = <span class="enscript-string">""</span>
- <span class="enscript-keyword">if</span>(<span class="enscript-keyword">length</span>(out) > 0) {
- <span class="enscript-keyword">print</span> out
- out=<span class="enscript-string">""</span>
- }
- <span class="enscript-keyword">if</span>(displaylines > 0) {
- displaylines = displaylines - 1
- <span class="enscript-keyword">if</span> (displaylines == 0)
- dispend()
- }
- <span class="enscript-comment"># First word on next line has no preceding whitespace
- </span> sep = <span class="enscript-string">""</span>
- }
- <span class="enscript-keyword">function</span> linecmd(cmd) {
- endline()
- add(cmd)
- endline()
- }
- <span class="enscript-keyword">function</span> breakline() {
- linecmd(<span class="enscript-string">".br"</span>)
- }
- <span class="enscript-comment"># Start an indented display
- </span><span class="enscript-keyword">function</span> dispstart() {
- linecmd(<span class="enscript-string">".RS"</span>)
- }
- <span class="enscript-comment"># End an indented display
- </span><span class="enscript-keyword">function</span> dispend() {
- linecmd(<span class="enscript-string">".RE"</span>)
- }
- <span class="enscript-comment"># Collect rest of input line
- </span><span class="enscript-keyword">function</span> wtail() {
- retval=<span class="enscript-string">""</span>
- <span class="enscript-keyword">while</span>(w<nwords) {
- <span class="enscript-keyword">if</span>(<span class="enscript-keyword">length</span>(retval))
- retval=retval <span class="enscript-string">" "</span>
- retval=retval words[++w]
- }
- <span class="enscript-keyword">return</span> retval
- }
- ! /^\./ {
- out = $0
- endline()
- <span class="enscript-keyword">next</span>
- }
- /^\.\\<span class="enscript-string">"/ { next }
- {
- sub("</span>^\\.<span class="enscript-string">","</span><span class="enscript-string">")
- nwords=split($0,words)
- # TODO: Instead of iterating 'w' over the array, have a separate
- # function that returns 'next word' and use that. This will allow
- # proper handling of double-quoted arguments as well.
- for(w=1;w<=nwords;w++) {
- if(match(words[w],"</span>^Li$<span class="enscript-string">")) { # Literal; rest of line is unformatted
- dispstart()
- displaylines = 1
- } else if(match(words[w],"</span>^Dl$<span class="enscript-string">")) { # Display literal
- dispstart()
- displaylines = 1
- } else if(match(words[w],"</span>^Bd$<span class="enscript-string">")) { # Begin display
- if(match(words[w+1],"</span>-literal<span class="enscript-string">")) {
- dispstart()
- displaylines=10000
- w=nwords
- }
- } else if(match(words[w],"</span>^Ed$<span class="enscript-string">")) { # End display
- displaylines = 0
- dispend()
- } else if(match(words[w],"</span>^Ns$<span class="enscript-string">")) { # Suppress space after next word
- nextsep = "</span><span class="enscript-string">"
- } else if(match(words[w],"</span>^No$<span class="enscript-string">")) { # Normal text
- add(words[++w])
- } else if(match(words[w],"</span>^Dq$<span class="enscript-string">")) { # Quote
- addopen("</span>``<span class="enscript-string">")
- add(words[++w])
- while(w<nwords&&!match(words[w+1],"</span>^[\\.,]<span class="enscript-string">"))
- add(words[++w])
- addclose("</span>''<span class="enscript-string">")
- } else if(match(words[w],"</span>^Oo$<span class="enscript-string">")) {
- addopen("</span>[<span class="enscript-string">")
- } else if(match(words[w],"</span>^Oc$<span class="enscript-string">")) {
- addclose("</span>]<span class="enscript-string">")
- } else if(match(words[w],"</span>^Ao$<span class="enscript-string">")) {
- addopen("</span><<span class="enscript-string">")
- } else if(match(words[w],"</span>^Ac$<span class="enscript-string">")) {
- addclose("</span>><span class="enscript-string">")
- } else if(match(words[w],"</span>^Dd$<span class="enscript-string">")) {
- date=wtail()
- next
- } else if(match(words[w],"</span>^Dt$<span class="enscript-string">")) {
- id=wtail()
- next
- } else if(match(words[w],"</span>^Ox$<span class="enscript-string">")) {
- add("</span>OpenBSD<span class="enscript-string">")
- } else if(match(words[w],"</span>^Fx$<span class="enscript-string">")) {
- add("</span>FreeBSD<span class="enscript-string">")
- } else if(match(words[w],"</span>^Nx$<span class="enscript-string">")) {
- add("</span>NetBSD<span class="enscript-string">")
- } else if(match(words[w],"</span>^St$<span class="enscript-string">")) {
- if (match(words[w+1], "</span>^-p1003.1$<span class="enscript-string">")) {
- w++
- add("</span>IEEE Std 1003.1 (``POSIX.1'')<span class="enscript-string">")
- } else if(match(words[w+1], "</span>^-p1003.1-96$<span class="enscript-string">")) {
- w++
- add("</span>ISO/IEC 9945-1:1996 (``POSIX.1'')<span class="enscript-string">")
- } else if(match(words[w+1], "</span>^-p1003.1-88$<span class="enscript-string">")) {
- w++
- add("</span>IEEE Std 1003.1-1988 (``POSIX.1'')<span class="enscript-string">")
- } else if(match(words[w+1], "</span>^-p1003.1-2001$<span class="enscript-string">")) {
- w++
- add("</span>IEEE Std 1003.1-2001 (``POSIX.1'')<span class="enscript-string">")
- } else if(match(words[w+1], "</span>^-susv2$<span class="enscript-string">")) {
- w++
- add("</span>Version 2 of the Single UNIX Specification (``SUSv2'')<span class="enscript-string">")
- }
- } else if(match(words[w],"</span>^Ex$<span class="enscript-string">")) {
- if (match(words[w+1], "</span>^-std$<span class="enscript-string">")) {
- w++
- add("</span>The \\fB<span class="enscript-string">" name "</span>\\fP utility exits 0 on success, and >0 <span class="enscript-keyword">if</span> an error occurs.<span class="enscript-string">")
- }
- } else if(match(words[w],"</span>^Os$<span class="enscript-string">")) {
- add("</span>.TH <span class="enscript-string">" id "</span> \<span class="enscript-string">""</span> date <span class="enscript-string">"\" \""</span> wtail() <span class="enscript-string">"\""</span>)
- } <span class="enscript-keyword">else</span> <span class="enscript-keyword">if</span>(<span class="enscript-keyword">match</span>(words[w],<span class="enscript-string">"^Sh$"</span>)) {
- add(<span class="enscript-string">".SH"</span>)
- section=words[w+1]
- } <span class="enscript-keyword">else</span> <span class="enscript-keyword">if</span>(<span class="enscript-keyword">match</span>(words[w],<span class="enscript-string">"^Xr$"</span>)) {
- add(<span class="enscript-string">"\\fB"</span> words[++w] <span class="enscript-string">"\\fP("</span> words[++w] <span class="enscript-string">")"</span> words[++w])
- } <span class="enscript-keyword">else</span> <span class="enscript-keyword">if</span>(<span class="enscript-keyword">match</span>(words[w],<span class="enscript-string">"^Nm$"</span>)) {
- <span class="enscript-keyword">if</span>(<span class="enscript-keyword">match</span>(section,<span class="enscript-string">"SYNOPSIS"</span>))
- breakline()
- <span class="enscript-keyword">if</span>(w>1)
- n=name
- <span class="enscript-keyword">else</span> {
- n=words[++w]
- <span class="enscript-keyword">if</span>(!<span class="enscript-keyword">length</span>(name))
- name=n
- }
- <span class="enscript-keyword">if</span>(!<span class="enscript-keyword">length</span>(n))
- n=name
- add(<span class="enscript-string">"\\fB"</span> n <span class="enscript-string">"\\fP"</span>)
- } <span class="enscript-keyword">else</span> <span class="enscript-keyword">if</span>(<span class="enscript-keyword">match</span>(words[w],<span class="enscript-string">"^Nd$"</span>)) {
- add(<span class="enscript-string">"\\- "</span> wtail())
- } <span class="enscript-keyword">else</span> <span class="enscript-keyword">if</span>(<span class="enscript-keyword">match</span>(words[w],<span class="enscript-string">"^Fl$"</span>)) {
- add(<span class="enscript-string">"\\fB\\-"</span> words[++w] <span class="enscript-string">"\\fP"</span>)
- } <span class="enscript-keyword">else</span> <span class="enscript-keyword">if</span>(<span class="enscript-keyword">match</span>(words[w],<span class="enscript-string">"^Ar$"</span>)) {
- addopen(<span class="enscript-string">"\\fI"</span>)
- <span class="enscript-keyword">if</span>(w==nwords)
- add(<span class="enscript-string">"file ...\\fP"</span>)
- <span class="enscript-keyword">else</span> {
- add(words[++w] <span class="enscript-string">"\\fP"</span>)
- <span class="enscript-keyword">while</span>(<span class="enscript-keyword">match</span>(words[w+1],<span class="enscript-string">"^\\|$"</span>))
- add(words[++w] <span class="enscript-string">" \\fI"</span> words[++w] <span class="enscript-string">"\\fP"</span>)
- }
- } <span class="enscript-keyword">else</span> <span class="enscript-keyword">if</span>(<span class="enscript-keyword">match</span>(words[w],<span class="enscript-string">"^Cm$"</span>)) {
- add(<span class="enscript-string">"\\fB"</span> words[++w] <span class="enscript-string">"\\fP"</span>)
- } <span class="enscript-keyword">else</span> <span class="enscript-keyword">if</span>(<span class="enscript-keyword">match</span>(words[w],<span class="enscript-string">"^Op$"</span>)) {
- addopen(<span class="enscript-string">"["</span>)
- option=1
- trailer=<span class="enscript-string">"]"</span> trailer
- } <span class="enscript-keyword">else</span> <span class="enscript-keyword">if</span>(<span class="enscript-keyword">match</span>(words[w],<span class="enscript-string">"^Pp$"</span>)) {
- endline()
- } <span class="enscript-keyword">else</span> <span class="enscript-keyword">if</span>(<span class="enscript-keyword">match</span>(words[w],<span class="enscript-string">"^An$"</span>)) {
- endline()
- } <span class="enscript-keyword">else</span> <span class="enscript-keyword">if</span>(<span class="enscript-keyword">match</span>(words[w],<span class="enscript-string">"^Ss$"</span>)) {
- add(<span class="enscript-string">".SS"</span>)
- } <span class="enscript-keyword">else</span> <span class="enscript-keyword">if</span>(<span class="enscript-keyword">match</span>(words[w],<span class="enscript-string">"^Ft$"</span>)) {
- addopen(<span class="enscript-string">"\\fI"</span>)
- trailer = <span class="enscript-string">"\\fP"</span> trailer
- displaylines = 1
- } <span class="enscript-keyword">else</span> <span class="enscript-keyword">if</span>(<span class="enscript-keyword">match</span>(words[w],<span class="enscript-string">"^Fn$"</span>)) {
- <span class="enscript-comment"># Using '.nh' to suppress hyphenation doesn't really work...
- </span> <span class="enscript-comment"># TODO: Fix this.
- </span> add(<span class="enscript-string">".nh"</span>)
- endline()
- addopen(<span class="enscript-string">"\\fB"</span>)
- w++
- add(words[w])
- addclose(<span class="enscript-string">"\\fP"</span>)
- endline()
- add(<span class="enscript-string">".hy"</span>)
- endline()
- addpunct(<span class="enscript-string">"("</span>)
- <span class="enscript-comment"># This is broken; Fn should peek ahead and put each double-quoted
- </span> <span class="enscript-comment"># arg in .Ty and be smarter about following punct.
- </span> trailer = <span class="enscript-string">");"</span> trailer
- } <span class="enscript-keyword">else</span> <span class="enscript-keyword">if</span>(<span class="enscript-keyword">match</span>(words[w],<span class="enscript-string">"^Va$"</span>)) {
- w++
- add(<span class="enscript-string">"\\fI"</span> words[w] <span class="enscript-string">"\\fP"</span>)
- } <span class="enscript-keyword">else</span> <span class="enscript-keyword">if</span>(<span class="enscript-keyword">match</span>(words[w],<span class="enscript-string">"^In$"</span>)) {
- w++
- add(<span class="enscript-string">"\\fB#include <"</span> words[w] <span class="enscript-string">">\\fP"</span>)
- breakline()
- } <span class="enscript-keyword">else</span> <span class="enscript-keyword">if</span>(<span class="enscript-keyword">match</span>(words[w],<span class="enscript-string">"^Pa$"</span>)) {
- addopen(<span class="enscript-string">"\\fI"</span>)
- w++
- <span class="enscript-keyword">if</span>(<span class="enscript-keyword">match</span>(words[w],<span class="enscript-string">"^\\."</span>))
- add(<span class="enscript-string">"\\&"</span>)
- add(words[w] <span class="enscript-string">"\\fP"</span>)
- } <span class="enscript-keyword">else</span> <span class="enscript-keyword">if</span>(<span class="enscript-keyword">match</span>(words[w],<span class="enscript-string">"^Dv$"</span>)) {
- add(<span class="enscript-string">".BR"</span>)
- } <span class="enscript-keyword">else</span> <span class="enscript-keyword">if</span>(<span class="enscript-keyword">match</span>(words[w],<span class="enscript-string">"^Em|Ev$"</span>)) {
- add(<span class="enscript-string">".IR"</span>)
- } <span class="enscript-keyword">else</span> <span class="enscript-keyword">if</span>(<span class="enscript-keyword">match</span>(words[w],<span class="enscript-string">"^Pq$"</span>)) {
- addopen(<span class="enscript-string">"("</span>)
- trailer=<span class="enscript-string">")"</span> trailer
- } <span class="enscript-keyword">else</span> <span class="enscript-keyword">if</span>(<span class="enscript-keyword">match</span>(words[w],<span class="enscript-string">"^Aq$"</span>)) {
- addopen(<span class="enscript-string">"<"</span>)
- trailer=<span class="enscript-string">">"</span> trailer
- } <span class="enscript-keyword">else</span> <span class="enscript-keyword">if</span>(<span class="enscript-keyword">match</span>(words[w],<span class="enscript-string">"^Brq$"</span>)) {
- addopen(<span class="enscript-string">"{"</span>)
- trailer=<span class="enscript-string">"}"</span> trailer
- } <span class="enscript-keyword">else</span> <span class="enscript-keyword">if</span>(<span class="enscript-keyword">match</span>(words[w],<span class="enscript-string">"^S[xy]$"</span>)) {
- add(<span class="enscript-string">".B "</span> wtail())
- } <span class="enscript-keyword">else</span> <span class="enscript-keyword">if</span>(<span class="enscript-keyword">match</span>(words[w],<span class="enscript-string">"^Ic$"</span>)) {
- add(<span class="enscript-string">"\\fB"</span>)
- trailer=<span class="enscript-string">"\\fP"</span> trailer
- } <span class="enscript-keyword">else</span> <span class="enscript-keyword">if</span>(<span class="enscript-keyword">match</span>(words[w],<span class="enscript-string">"^Bl$"</span>)) {
- oldoptlist=optlist
- <span class="enscript-keyword">if</span>(<span class="enscript-keyword">match</span>(words[w+1],<span class="enscript-string">"-bullet"</span>))
- optlist=1
- <span class="enscript-keyword">else</span> <span class="enscript-keyword">if</span>(<span class="enscript-keyword">match</span>(words[w+1],<span class="enscript-string">"-enum"</span>)) {
- optlist=2
- enum=0
- } <span class="enscript-keyword">else</span> <span class="enscript-keyword">if</span>(<span class="enscript-keyword">match</span>(words[w+1],<span class="enscript-string">"-tag"</span>))
- optlist=3
- <span class="enscript-keyword">else</span> <span class="enscript-keyword">if</span>(<span class="enscript-keyword">match</span>(words[w+1],<span class="enscript-string">"-item"</span>))
- optlist=4
- <span class="enscript-keyword">else</span> <span class="enscript-keyword">if</span>(<span class="enscript-keyword">match</span>(words[w+1],<span class="enscript-string">"-bullet"</span>))
- optlist=1
- w=nwords
- } <span class="enscript-keyword">else</span> <span class="enscript-keyword">if</span>(<span class="enscript-keyword">match</span>(words[w],<span class="enscript-string">"^El$"</span>)) {
- optlist=oldoptlist
- } <span class="enscript-keyword">else</span> <span class="enscript-keyword">if</span>(<span class="enscript-keyword">match</span>(words[w],<span class="enscript-string">"^It$"</span>)&&optlist) {
- <span class="enscript-keyword">if</span>(optlist==1)
- add(<span class="enscript-string">".IP \\(bu"</span>)
- <span class="enscript-keyword">else</span> <span class="enscript-keyword">if</span>(optlist==2)
- add(<span class="enscript-string">".IP "</span> ++enum <span class="enscript-string">"."</span>)
- <span class="enscript-keyword">else</span> <span class="enscript-keyword">if</span>(optlist==3) {
- add(<span class="enscript-string">".TP"</span>)
- endline()
- <span class="enscript-keyword">if</span>(<span class="enscript-keyword">match</span>(words[w+1],<span class="enscript-string">"^Pa$|^Ev$"</span>)) {
- add(<span class="enscript-string">".B"</span>)
- w++
- }
- } <span class="enscript-keyword">else</span> <span class="enscript-keyword">if</span>(optlist==4)
- add(<span class="enscript-string">".IP"</span>)
- } <span class="enscript-keyword">else</span> <span class="enscript-keyword">if</span>(<span class="enscript-keyword">match</span>(words[w],<span class="enscript-string">"^[=]$"</span>)) {
- addpunct(words[w])
- } <span class="enscript-keyword">else</span> <span class="enscript-keyword">if</span>(<span class="enscript-keyword">match</span>(words[w],<span class="enscript-string">"^[\[{(]$"</span>)) {
- addopen(words[w])
- } <span class="enscript-keyword">else</span> <span class="enscript-keyword">if</span>(<span class="enscript-keyword">match</span>(words[w],<span class="enscript-string">"^[\\\])}.,;:]$"</span>)) {
- addclose(words[w])
- } <span class="enscript-keyword">else</span> {
- add(words[w])
- }
- }
- <span class="enscript-keyword">if</span>(<span class="enscript-keyword">match</span>(out,<span class="enscript-string">"^\\.[^a-zA-Z]"</span>))
- <span class="enscript-keyword">sub</span>(<span class="enscript-string">"^\\."</span>,<span class="enscript-string">""</span>,out)
- endline()
- }
- </pre>
- <hr />
- </body></html>