1#! /usr/bin/awk -f
2#	$NetBSD: devlist2h.awk,v 1.10 2017/06/03 14:46:29 christos 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# 4. The name of the author(s) may not be used to endorse or promote products
46#    derived from this software without specific prior written permission
47#
48# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
49# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
50# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
51# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
52# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
53# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
54# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
55# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
56# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
57# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
58#
59function collectline(f) {
60	oparen = 0
61	line = ""
62	while (f <= NF) {
63		if ($f == "#") {
64			line = line "("
65			oparen = 1
66			f++
67			continue
68		}
69		if (oparen) {
70			line = line $f
71			if (f < NF)
72				line = line " "
73			f++
74			continue
75		}
76		line = line $f
77		if (f < NF)
78			line = line " "
79		f++
80	}
81	if (oparen)
82		line = line ")"
83	return line
84}
85function checkdecl() {
86	done = 1
87	if (!decl) {
88		decl = 1;
89		printf("struct isapnp_matchinfo {\n") > hfile
90		printf("\tconst char *name;\n") > hfile
91		printf("\tint variant;\n") > hfile
92		printf("};\n\n") > hfile
93		printf("struct isapnp_devinfo {\n") > hfile
94		printf("\tconst struct isapnp_matchinfo *devlogic;\n") > hfile
95		printf("\tint nlogic;\n") > hfile
96		printf("\tconst struct isapnp_matchinfo *devcompat;\n") > hfile
97		printf("\tint ncompat;\n") > hfile
98		printf("};\n\n") > hfile
99		printf("\n#include <sys/cdefs.h>\n__KERNEL_RCSID(0, \"$NetBSD" "$\");\n\n") > cfile
100		printf("#include <sys/param.h>\n") > cfile
101		printf("#include <dev/isapnp/isapnpdevs.h>\n\n") > cfile
102	}
103}
104BEGIN {
105	decl = done = ncompat = nlogicals = ndriver = blanklines = ncompats = 0
106	cfile="isapnpdevs.c"
107	hfile="isapnpdevs.h"
108}
109NR == 1 {
110	VERSION = $0
111	gsub("\\$", "", VERSION)
112	gsub(/ $/, "", VERSION)
113
114	printf("/*\t$NetBSD" "$\t*/\n\n") > cfile
115	printf("/*\n") > cfile
116	printf(" * THIS FILE IS AUTOMATICALLY GENERATED.  DO NOT EDIT.\n") \
117	    > cfile
118	printf(" *\n") > cfile
119	printf(" * generated from:\n") > cfile
120	printf(" *\t%s\n", VERSION) > cfile
121	printf(" */\n") > cfile
122
123	printf("/*\t$NetBSD" "$\t*/\n\n") > hfile
124	printf("/*\n") > hfile
125	printf(" * THIS FILE IS AUTOMATICALLY GENERATED.  DO NOT EDIT.\n") \
126	    > hfile
127	printf(" *\n") > hfile
128	printf(" * generated from:\n") > hfile
129	printf(" *\t%s\n", VERSION) > hfile
130	printf(" */\n") > hfile
131	printf("\n") > hfile
132	next
133}
134NF > 0 && $1 == "driver" {
135	checkdecl()
136	ndriver++
137
138	driverindex[$2] = ndriver;
139	driver[ndriver, 1] = $2;
140	driver[ndriver, 2] = collectline(3);
141	printf("/* %s */\n", driver[ndriver, 2]) > hfile
142	printf("extern const struct isapnp_devinfo isapnp_%s_devinfo;\n",
143	    driver[ndriver, 1]) > hfile
144	next
145}
146NF > 0 && $1 == "devlogic" {
147	checkdecl()
148	nlogicals++
149
150	logicals[nlogicals, 1] = $2;
151	logicals[nlogicals, 2] = $3;
152	logicals[nlogicals, 3] = $4;
153	logicals[nlogicals, 4] = collectline(5);
154	next
155}
156NF > 0 && $1 == "devcompat" {
157	checkdecl()
158	ncompats++
159
160	compats[ncompats, 1] = $2;
161	compats[ncompats, 2] = $3;
162	compats[ncompats, 3] = $4;
163	compats[ncompats, 4] = collectline(5);
164	next
165}
166{
167	if (!done) {
168		if ($0 == "")
169			blanklines++
170		print $0 > hfile
171		if (blanklines < 2)
172			print $0 > cfile
173	}
174}
175END {
176	# print out the match tables
177
178	printf("\n") > cfile
179
180	for (i = 1; i <= ndriver; i++) {
181		nlogical = ncompat = 0;
182		printf("/* %s */\n", driver[i, 2]) > cfile
183		for (j = 1; j <= nlogicals; j++) {
184			if (logicals[j, 1] == driver[i, 1]) {
185				if (nlogical == 0)
186					printf("static const struct isapnp_matchinfo isapnp_%s_devlogic[] = {\n",
187					    driver[i, 1]) > cfile
188				nlogical++;
189				printf("\t{\"%s\", %d},\t/* %s */\n",
190				    logicals[j, 2], logicals[j, 3],
191				    logicals[j, 4]) > cfile
192			}
193		}
194		if (nlogical != 0)
195			printf("};\n") > cfile
196		for (j = 1; j <= ncompats; j++) {
197			if (compats[j, 1] == driver[i, 1]) {
198				if (ncompat == 0)
199					printf("static const struct isapnp_matchinfo isapnp_%s_devcompat[] = {\n",
200					    driver[i, 1]) > cfile
201				ncompat++;
202				printf("\t{\"%s\", %d},\t/* %s */\n",
203				    compats[j, 2], compats[j, 3],
204				    compats[j, 4]) > cfile
205			}
206		}
207		if (ncompat != 0)
208			printf("};\n") > cfile
209		printf("const struct isapnp_devinfo isapnp_%s_devinfo = {\n",
210		    driver[i, 1]) > cfile
211		if (nlogical != 0)
212			printf("\tisapnp_%s_devlogic, %d,\n",
213			    driver[i, 1], nlogical) > cfile
214		else
215			printf("\tNULL, 0,\n") > cfile
216		if (ncompat != 0)
217			printf("\tisapnp_%s_devcompat, %d,\n",
218			    driver[i, 1], ncompat) > cfile
219		else
220			printf("\tNULL, 0,\n") > cfile
221		printf("};\n\n") > cfile;
222
223	}
224	close(cfile)
225	close(hfile)
226}
227