xref: /netbsd-src/sys/dev/isapnp/devlist2h.awk (revision b1c86f5f087524e68db12794ee9c3e3da1ab17a0)
1#! /usr/bin/awk -f
2#	$NetBSD: devlist2h.awk,v 1.9 2008/05/02 18:11:05 martin Exp $
3#
4# Copyright (c) 1998 The NetBSD Foundation, Inc.
5# All rights reserved.
6#
7# This code is derived from software contributed to The NetBSD Foundation
8# by Christos Zoulas.
9#
10# Redistribution and use in source and binary forms, with or without
11# modification, are permitted provided that the following conditions
12# are met:
13# 1. Redistributions of source code must retain the above copyright
14#    notice, this list of conditions and the following disclaimer.
15# 2. Redistributions in binary form must reproduce the above copyright
16#    notice, this list of conditions and the following disclaimer in the
17#    documentation and/or other materials provided with the distribution.
18#
19# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29# POSSIBILITY OF SUCH DAMAGE.
30#
31# Copyright (c) 1995, 1996 Christopher G. Demetriou
32# All rights reserved.
33#
34# Redistribution and use in source and binary forms, with or without
35# modification, are permitted provided that the following conditions
36# are met:
37# 1. Redistributions of source code must retain the above copyright
38#    notice, this list of conditions and the following disclaimer.
39# 2. Redistributions in binary form must reproduce the above copyright
40#    notice, this list of conditions and the following disclaimer in the
41#    documentation and/or other materials provided with the distribution.
42# 3. All advertising materials mentioning features or use of this software
43#    must display the following acknowledgement:
44#      This product includes software developed by Christopher G. Demetriou.
45#      This product includes software developed by Christos Zoulas
46# 4. The name of the author(s) may not be used to endorse or promote products
47#    derived from this software without specific prior written permission
48#
49# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
50# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
51# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
52# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
53# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
54# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
55# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
56# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
57# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
58# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
59#
60function collectline(f) {
61	oparen = 0
62	line = ""
63	while (f <= NF) {
64		if ($f == "#") {
65			line = line "("
66			oparen = 1
67			f++
68			continue
69		}
70		if (oparen) {
71			line = line $f
72			if (f < NF)
73				line = line " "
74			f++
75			continue
76		}
77		line = line $f
78		if (f < NF)
79			line = line " "
80		f++
81	}
82	if (oparen)
83		line = line ")"
84	return line
85}
86function checkdecl() {
87	done = 1
88	if (!decl) {
89		decl = 1;
90		printf("struct isapnp_matchinfo {\n") > hfile
91		printf("\tconst char *name;\n") > hfile
92		printf("\tint variant;\n") > hfile
93		printf("};\n\n") > hfile
94		printf("struct isapnp_devinfo {\n") > hfile
95		printf("\tconst struct isapnp_matchinfo *devlogic;\n") > hfile
96		printf("\tint nlogic;\n") > hfile
97		printf("\tconst struct isapnp_matchinfo *devcompat;\n") > hfile
98		printf("\tint ncompat;\n") > hfile
99		printf("};\n\n") > hfile
100		printf("\n#include <sys/cdefs.h>\n__KERNEL_RCSID(0, \"$NetBSD" "$\");\n\n") > cfile
101		printf("#include <sys/param.h>\n") > cfile
102		printf("#include <dev/isapnp/isapnpdevs.h>\n\n") > cfile
103	}
104}
105BEGIN {
106	decl = done = ncompat = nlogicals = ndriver = blanklines = ncompats = 0
107	cfile="isapnpdevs.c"
108	hfile="isapnpdevs.h"
109}
110NR == 1 {
111	VERSION = $0
112	gsub("\\$", "", VERSION)
113	gsub(/ $/, "", VERSION)
114
115	printf("/*\t$NetBSD" "$\t*/\n\n") > cfile
116	printf("/*\n") > cfile
117	printf(" * THIS FILE IS AUTOMATICALLY GENERATED.  DO NOT EDIT.\n") \
118	    > cfile
119	printf(" *\n") > cfile
120	printf(" * generated from:\n") > cfile
121	printf(" *\t%s\n", VERSION) > cfile
122	printf(" */\n") > cfile
123
124	printf("/*\t$NetBSD" "$\t*/\n\n") > hfile
125	printf("/*\n") > hfile
126	printf(" * THIS FILE IS AUTOMATICALLY GENERATED.  DO NOT EDIT.\n") \
127	    > hfile
128	printf(" *\n") > hfile
129	printf(" * generated from:\n") > hfile
130	printf(" *\t%s\n", VERSION) > hfile
131	printf(" */\n") > hfile
132	printf("\n") > hfile
133	next
134}
135NF > 0 && $1 == "driver" {
136	checkdecl()
137	ndriver++
138
139	driverindex[$2] = ndriver;
140	driver[ndriver, 1] = $2;
141	driver[ndriver, 2] = collectline(3);
142	printf("/* %s */\n", driver[ndriver, 2]) > hfile
143	printf("extern const struct isapnp_devinfo isapnp_%s_devinfo;\n",
144	    driver[ndriver, 1]) > hfile
145	next
146}
147NF > 0 && $1 == "devlogic" {
148	checkdecl()
149	nlogicals++
150
151	logicals[nlogicals, 1] = $2;
152	logicals[nlogicals, 2] = $3;
153	logicals[nlogicals, 3] = $4;
154	logicals[nlogicals, 4] = collectline(5);
155	next
156}
157NF > 0 && $1 == "devcompat" {
158	checkdecl()
159	ncompats++
160
161	compats[ncompats, 1] = $2;
162	compats[ncompats, 2] = $3;
163	compats[ncompats, 3] = $4;
164	compats[ncompats, 4] = collectline(5);
165	next
166}
167{
168	if (!done) {
169		if ($0 == "")
170			blanklines++
171		print $0 > hfile
172		if (blanklines < 2)
173			print $0 > cfile
174	}
175}
176END {
177	# print out the match tables
178
179	printf("\n") > cfile
180
181	for (i = 1; i <= ndriver; i++) {
182		nlogical = ncompat = 0;
183		printf("/* %s */\n", driver[i, 2]) > cfile
184		for (j = 1; j <= nlogicals; j++) {
185			if (logicals[j, 1] == driver[i, 1]) {
186				if (nlogical == 0)
187					printf("static const struct isapnp_matchinfo isapnp_%s_devlogic[] = {\n",
188					    driver[i, 1]) > cfile
189				nlogical++;
190				printf("\t{\"%s\", %d},\t/* %s */\n",
191				    logicals[j, 2], logicals[j, 3],
192				    logicals[j, 4]) > cfile
193			}
194		}
195		if (nlogical != 0)
196			printf("};\n") > cfile
197		for (j = 1; j <= ncompats; j++) {
198			if (compats[j, 1] == driver[i, 1]) {
199				if (ncompat == 0)
200					printf("static const struct isapnp_matchinfo isapnp_%s_devcompat[] = {\n",
201					    driver[i, 1]) > cfile
202				ncompat++;
203				printf("\t{\"%s\", %d},\t/* %s */\n",
204				    compats[j, 2], compats[j, 3],
205				    compats[j, 4]) > cfile
206			}
207		}
208		if (ncompat != 0)
209			printf("};\n") > cfile
210		printf("const struct isapnp_devinfo isapnp_%s_devinfo = {\n",
211		    driver[i, 1]) > cfile
212		if (nlogical != 0)
213			printf("\tisapnp_%s_devlogic, %d,\n",
214			    driver[i, 1], nlogical) > cfile
215		else
216			printf("\tNULL, 0,\n") > cfile
217		if (ncompat != 0)
218			printf("\tisapnp_%s_devcompat, %d,\n",
219			    driver[i, 1], ncompat) > cfile
220		else
221			printf("\tNULL, 0,\n") > cfile
222		printf("};\n\n") > cfile;
223
224	}
225	close(cfile)
226	close(hfile)
227}
228