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