xref: /netbsd-src/share/man/man8/MAKEDEV2manpage.awk (revision 4a4de35bc769ace5058f589f3e37b7a3e0e80b12)
1*4a4de35bSjakllsch#       $NetBSD: MAKEDEV2manpage.awk,v 1.13 2010/03/23 19:19:03 jakllsch Exp $
2*4a4de35bSjakllsch#
3*4a4de35bSjakllsch# Copyright (c) 2002
4*4a4de35bSjakllsch#	Dieter Baron <dillo@NetBSD.org>.  All rights reserved.
5*4a4de35bSjakllsch# Copyright (c) 1999
6*4a4de35bSjakllsch#       Hubert Feyrer <hubertf@NetBSD.org>.  All rights reserved.
7*4a4de35bSjakllsch# [converted from Hubert's Perl version]
8*4a4de35bSjakllsch#
9*4a4de35bSjakllsch# Redistribution and use in source and binary forms, with or without
10*4a4de35bSjakllsch# modification, are permitted provided that the following conditions
11*4a4de35bSjakllsch# are met:
12*4a4de35bSjakllsch# 1. Redistributions of source code must retain the above copyright
13*4a4de35bSjakllsch#    notice, this list of conditions and the following disclaimer.
14*4a4de35bSjakllsch# 2. Redistributions in binary form must reproduce the above copyright
15*4a4de35bSjakllsch#    notice, this list of conditions and the following disclaimer in the
16*4a4de35bSjakllsch#    documentation and/or other materials provided with the distribution.
17*4a4de35bSjakllsch# 3. All advertising materials mentioning features or use of this software
18*4a4de35bSjakllsch#    must display the following acknowledgement:
19*4a4de35bSjakllsch#      This product includes software developed by Hubert Feyrer for
20*4a4de35bSjakllsch#      the NetBSD Project.
21*4a4de35bSjakllsch# 4. Neither the name of the University nor the names of its contributors
22*4a4de35bSjakllsch#    may be used to endorse or promote products derived from this software
23*4a4de35bSjakllsch#    without specific prior written permission.
24*4a4de35bSjakllsch#
25*4a4de35bSjakllsch# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
26*4a4de35bSjakllsch# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27*4a4de35bSjakllsch# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28*4a4de35bSjakllsch# ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
29*4a4de35bSjakllsch# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
30*4a4de35bSjakllsch# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
31*4a4de35bSjakllsch# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32*4a4de35bSjakllsch# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33*4a4de35bSjakllsch# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
34*4a4de35bSjakllsch# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35*4a4de35bSjakllsch# SUCH DAMAGE.
36*4a4de35bSjakllsch#
37*4a4de35bSjakllsch#
38*4a4de35bSjakllsch###########################################################################
39*4a4de35bSjakllsch#
40*4a4de35bSjakllsch# Convert src/etc/MAKEDEV.tmpl and
41*4a4de35bSjakllsch# src/share/man/man8/MAKEDEV.8.template to
42*4a4de35bSjakllsch# src/share/man/man8/MAKEDEV.8, replacing
43*4a4de35bSjakllsch#  - @@@SPECIAL@@@ with all targets in the first section (all, std, ...)
44*4a4de35bSjakllsch#  - @@@DEVICES@@@ with the remaining targets
45*4a4de35bSjakllsch#  - @@@ARCH@@@ with the architecture name
46*4a4de35bSjakllsch#
47*4a4de35bSjakllsch
48*4a4de35bSjakllsch# XXX: uses non-standard AWK function toupper()
49*4a4de35bSjakllsch
50*4a4de35bSjakllschBEGIN {
51*4a4de35bSjakllsch	MAKEDEV = "../../../etc/MAKEDEV.tmpl";
52*4a4de35bSjakllsch    print ".\\\" *** ------------------------------------------------------------------";
53*4a4de35bSjakllsch    print ".\\\" *** This file was generated automatically";
54*4a4de35bSjakllsch    print ".\\\" *** from src/etc/MAKEDEV.tmpl and";
55*4a4de35bSjakllsch    print ".\\\" *** src/share/man/man8/MAKEDEV.8.template";
56*4a4de35bSjakllsch    print ".\\\" ***";
57*4a4de35bSjakllsch    print ".\\\" *** DO NOT EDIT - any changes will be lost!!!";
58*4a4de35bSjakllsch    print ".\\\" *** ------------------------------------------------------------------";
59*4a4de35bSjakllsch    print ".\\\"";
60*4a4de35bSjakllsch}
61*4a4de35bSjakllsch
62*4a4de35bSjakllschfunction read1line() {
63*4a4de35bSjakllsch	if (r1kept)
64*4a4de35bSjakllsch		r1l = r1last;
65*4a4de35bSjakllsch	else
66*4a4de35bSjakllsch		getline r1l < MAKEDEV;
67*4a4de35bSjakllsch
68*4a4de35bSjakllsch	while (r1l ~ /^#[ \t]*$/)
69*4a4de35bSjakllsch		getline r1l < MAKEDEV;
70*4a4de35bSjakllsch
71*4a4de35bSjakllsch	if (r1l ~ /^#[ \t]/) {
72*4a4de35bSjakllsch		if (r1l ~ /^# /) {
73*4a4de35bSjakllsch            		# Not a device/other target
74*4a4de35bSjakllsch            		r1kept = 0;
75*4a4de35bSjakllsch		}
76*4a4de35bSjakllsch        	else {
77*4a4de35bSjakllsch            		# Continuation line (?)
78*4a4de35bSjakllsch			getline r1ll < MAKEDEV;
79*4a4de35bSjakllsch			while (r1ll ~ /^#\t[ \t]/) {
80*4a4de35bSjakllsch				sub(/^#\t[ \t]/, " ", r1ll);
81*4a4de35bSjakllsch				r1l = r1l r1ll;
82*4a4de35bSjakllsch				getline r1ll < MAKEDEV;
83*4a4de35bSjakllsch			}
84*4a4de35bSjakllsch			r1last = r1ll;
85*4a4de35bSjakllsch			r1kept = 1;
86*4a4de35bSjakllsch        	}
87*4a4de35bSjakllsch    	}
88*4a4de35bSjakllsch	else
89*4a4de35bSjakllsch		r1kept = 0;
90*4a4de35bSjakllsch
91*4a4de35bSjakllsch	return 1;
92*4a4de35bSjakllsch}
93*4a4de35bSjakllsch
94*4a4de35bSjakllsch/^@@@SPECIAL@@@$/ {
95*4a4de35bSjakllsch        print ".\\\" " $0;
96*4a4de35bSjakllsch    	print ".Bl -tag -width 01234567 -compact";
97*4a4de35bSjakllsch
98*4a4de35bSjakllsch	while (getline l < MAKEDEV > 0 && l !~ /^#.*Device.*Valid.*argument/)
99*4a4de35bSjakllsch		;
100*4a4de35bSjakllsch	while (read1line() && r1l ~ /^#\t/) {
101*4a4de35bSjakllsch		sub(/#[ \t]*/, "", r1l);
102*4a4de35bSjakllsch		target=r1l;
103*4a4de35bSjakllsch		sub(/[ \t].*/, "", target);
104*4a4de35bSjakllsch		line=r1l;
105*4a4de35bSjakllsch		sub(/[^ \t]*[ \t]/, "", line);
106*4a4de35bSjakllsch		# replace "foo" with ``foo''
107*4a4de35bSjakllsch		gsub(/\"[^\"]*\"/, "``&''", line)
108*4a4de35bSjakllsch		gsub(/\"/, "", line)
109*4a4de35bSjakllsch		gsub(/[ \t]+/, " ", line);
110*4a4de35bSjakllsch          	print ".It Ar " target;
111*4a4de35bSjakllsch		print toupper(substr(line, 1, 1)) substr(line, 2);
112*4a4de35bSjakllsch
113*4a4de35bSjakllsch	}
114*4a4de35bSjakllsch	r1last = r1l;
115*4a4de35bSjakllsch	r1kept = 1;
116*4a4de35bSjakllsch	print ".El";
117*4a4de35bSjakllsch	next;
118*4a4de35bSjakllsch}
119*4a4de35bSjakllsch/^@@@DEVICES@@@$/ {
120*4a4de35bSjakllsch        print ".\\\" " $0;
121*4a4de35bSjakllsch    	print ".Bl -tag -width 01";
122*4a4de35bSjakllsch
123*4a4de35bSjakllsch	read1line();
124*4a4de35bSjakllsch    	do {
125*4a4de35bSjakllsch		sub(/^#[ \t]+/, "", r1l);
126*4a4de35bSjakllsch		if (r1l ~ /[^ \t]:$/)
127*4a4de35bSjakllsch			sub(/:$/, " :", r1l);
128*4a4de35bSjakllsch		print ".It " r1l;	# print section heading
129*4a4de35bSjakllsch
130*4a4de35bSjakllsch        	print ". Bl -tag -width 0123456789 -compact";
131*4a4de35bSjakllsch        	while(read1line() && r1l ~ /^#\t/) {
132*4a4de35bSjakllsch			gsub(/#[ \t]+/, "", r1l);
133*4a4de35bSjakllsch			target=r1l;
134*4a4de35bSjakllsch			sub(/[ \t].*/, "", target);
135*4a4de35bSjakllsch			line=r1l;
136*4a4de35bSjakllsch			sub(/[^ \t]*[ \t]+/, "", line);
137*4a4de35bSjakllsch			sub(/\*/, "#", target);
138*4a4de35bSjakllsch			# replace "foo" with ``foo''
139*4a4de35bSjakllsch			gsub(/\"[^\"]*\"/, "``&''", line)
140*4a4de35bSjakllsch			gsub(/\"/, "", line)
141*4a4de35bSjakllsch			# fix collateral damage of previous
142*4a4de35bSjakllsch			sub(/5 1\/4''/, "5 1/4\"", line)
143*4a4de35bSjakllsch			sub(/3 1\/2``/, "3 1/2\"", line)
144*4a4de35bSjakllsch			# gc whitespace
145*4a4de35bSjakllsch			sub(/\(XXX[^)]*\)/, "", line);
146*4a4de35bSjakllsch			sub(/[ \t]*$/, "", line);
147*4a4de35bSjakllsch
148*4a4de35bSjakllsch              		# add manpage, if available
149*4a4de35bSjakllsch			if (target == "fd#")
150*4a4de35bSjakllsch				page = "fdc"
151*4a4de35bSjakllsch			else if (target == "pms#")
152*4a4de35bSjakllsch				page = "opms"
153*4a4de35bSjakllsch			else if (target == "ed#")
154*4a4de35bSjakllsch				page = "edc"
155*4a4de35bSjakllsch			else if (target == "ttye#")
156*4a4de35bSjakllsch				page = "ite"
157*4a4de35bSjakllsch			else if (target == "ttyh#")
158*4a4de35bSjakllsch				page = "sab"
159*4a4de35bSjakllsch			else if (target == "ttyU#")
160*4a4de35bSjakllsch				page = "ucom"
161*4a4de35bSjakllsch			else if (target == "fd")
162*4a4de35bSjakllsch				page = "-----" # force no .Xr
163*4a4de35bSjakllsch			else if (target == "sysmon")
164*4a4de35bSjakllsch				page = "envsys"
165*4a4de35bSjakllsch			else if (target == "ttyZ#")
166*4a4de35bSjakllsch				page = "zstty"
167*4a4de35bSjakllsch			else if (target == "ttyCZ?")
168*4a4de35bSjakllsch				page = "cz"
169*4a4de35bSjakllsch			else if (target == "ttyCY?")
170*4a4de35bSjakllsch				page = "cy"
171*4a4de35bSjakllsch			else if (target == "ttyB?")
172*4a4de35bSjakllsch				page = "scc"
173*4a4de35bSjakllsch			else if (target == "random")
174*4a4de35bSjakllsch				page = "rnd"
175*4a4de35bSjakllsch			else if (target == "scsibus#")
176*4a4de35bSjakllsch				page = "scsi"
177*4a4de35bSjakllsch			else {
178*4a4de35bSjakllsch				page=target;
179*4a4de35bSjakllsch				sub(/[^a-zA-Z]+/, "", page);
180*4a4de35bSjakllsch			}
181*4a4de35bSjakllsch
182*4a4de35bSjakllsch			str = "ls ../man4/" page ".4 ../man4/man4.*/" page ".4 2>/dev/null"
183*4a4de35bSjakllsch			while(str | getline) {
184*4a4de35bSjakllsch				if (system("test -f " $0) != 0)
185*4a4de35bSjakllsch					continue
186*4a4de35bSjakllsch
187*4a4de35bSjakllsch				# get the manpage including opt. arch name
188*4a4de35bSjakllsch				sub(/^\.\.\/man4\//, "")
189*4a4de35bSjakllsch				sub(/^man4\./, "")
190*4a4de35bSjakllsch				sub(/\.4$/, "")
191*4a4de35bSjakllsch
192*4a4de35bSjakllsch				sub(/[ \t]*$/, "", line);
193*4a4de35bSjakllsch				if (line ~ /see/) {
194*4a4de35bSjakllsch                      		    # already a manpage there, e.g. scsictl(8)
195*4a4de35bSjakllsch				    line = line " ,";
196*4a4de35bSjakllsch				}
197*4a4de35bSjakllsch				else
198*4a4de35bSjakllsch				    line = line ", see";
199*4a4de35bSjakllsch				# Add .Xr \&foo 4 - ampersand to work around
200*4a4de35bSjakllsch				# manpages that are *roff commands at the same
201*4a4de35bSjakllsch				# time
202*4a4de35bSjakllsch                  		line = line "\n.Xr \\&" $0 " 4";
203*4a4de35bSjakllsch			}
204*4a4de35bSjakllsch			close(str)
205*4a4de35bSjakllsch
206*4a4de35bSjakllsch			gsub(/[ \t]+$/, "", line);
207*4a4de35bSjakllsch			gsub(/[ \t]+/, " ", line);
208*4a4de35bSjakllsch
209*4a4de35bSjakllsch              		print ". It Ar " target;
210*4a4de35bSjakllsch			line2=toupper(substr(line, 1, 1)) substr(line, 2);
211*4a4de35bSjakllsch			sub(/Wscons/, "wscons", line2);
212*4a4de35bSjakllsch			sub(/Pccons/, "pccons", line2);
213*4a4de35bSjakllsch			print line2;
214*4a4de35bSjakllsch        	}
215*4a4de35bSjakllsch        	print MANPAGE ". El";
216*4a4de35bSjakllsch    	} while (r1l ~ /^# /);
217*4a4de35bSjakllsch
218*4a4de35bSjakllsch    	print ".El";
219*4a4de35bSjakllsch	next;
220*4a4de35bSjakllsch}
221*4a4de35bSjakllsch/@@@ARCH@@@/ {
222*4a4de35bSjakllsch	gsub(/@@@ARCH@@@/, ARCH);
223*4a4de35bSjakllsch}
224*4a4de35bSjakllsch# date is substituted in the shell script
225*4a4de35bSjakllsch#/@@@DATE@@@/ {
226*4a4de35bSjakllsch#	# date
227*4a4de35bSjakllsch#}
228*4a4de35bSjakllsch/\$NetBSD/ {
229*4a4de35bSjakllsch	sub(/\$NetBSD.*\$/, "$""NetBSD$");
230*4a4de35bSjakllsch}
231*4a4de35bSjakllsch{ print }
232