xref: /dflybsd-src/sys/tools/usbdevs2h.awk (revision ef4aa9ff09964a62f07be43a1605f73a4df4d740)
1*ef4aa9ffSSascha Wildner#! /usr/bin/awk -f
2*ef4aa9ffSSascha Wildner#-
3*ef4aa9ffSSascha Wildner#	$NetBSD: usb/devlist2h.awk,v 1.9 2001/01/18 20:28:22 jdolecek Exp $
4*ef4aa9ffSSascha Wildner#  $FreeBSD$
5*ef4aa9ffSSascha Wildner#
6*ef4aa9ffSSascha Wildner# Copyright (c) 1995, 1996 Christopher G. Demetriou
7*ef4aa9ffSSascha Wildner# All rights reserved.
8*ef4aa9ffSSascha Wildner#
9*ef4aa9ffSSascha Wildner# Redistribution and use in source and binary forms, with or without
10*ef4aa9ffSSascha Wildner# modification, are permitted provided that the following conditions
11*ef4aa9ffSSascha Wildner# are met:
12*ef4aa9ffSSascha Wildner# 1. Redistributions of source code must retain the above copyright
13*ef4aa9ffSSascha Wildner#    notice, this list of conditions and the following disclaimer.
14*ef4aa9ffSSascha Wildner# 2. Redistributions in binary form must reproduce the above copyright
15*ef4aa9ffSSascha Wildner#    notice, this list of conditions and the following disclaimer in the
16*ef4aa9ffSSascha Wildner#    documentation and/or other materials provided with the distribution.
17*ef4aa9ffSSascha Wildner# 3. All advertising materials mentioning features or use of this software
18*ef4aa9ffSSascha Wildner#    must display the following acknowledgement:
19*ef4aa9ffSSascha Wildner#      This product includes software developed by Christopher G. Demetriou.
20*ef4aa9ffSSascha Wildner# 4. The name of the author may not be used to endorse or promote products
21*ef4aa9ffSSascha Wildner#    derived from this software without specific prior written permission
22*ef4aa9ffSSascha Wildner#
23*ef4aa9ffSSascha Wildner# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
24*ef4aa9ffSSascha Wildner# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
25*ef4aa9ffSSascha Wildner# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26*ef4aa9ffSSascha Wildner# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
27*ef4aa9ffSSascha Wildner# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
28*ef4aa9ffSSascha Wildner# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29*ef4aa9ffSSascha Wildner# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30*ef4aa9ffSSascha Wildner# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31*ef4aa9ffSSascha Wildner# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
32*ef4aa9ffSSascha Wildner# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33*ef4aa9ffSSascha Wildner#
34*ef4aa9ffSSascha Wildner
35*ef4aa9ffSSascha Wildnerfunction usage()
36*ef4aa9ffSSascha Wildner{
37*ef4aa9ffSSascha Wildner	print "usage: usbdevs2h.awk <srcfile> [-d|-h]";
38*ef4aa9ffSSascha Wildner	exit 1;
39*ef4aa9ffSSascha Wildner}
40*ef4aa9ffSSascha Wildner
41*ef4aa9ffSSascha Wildnerfunction header(file)
42*ef4aa9ffSSascha Wildner{
43*ef4aa9ffSSascha Wildner	printf("/*\n") > file
44*ef4aa9ffSSascha Wildner	printf(" * THIS FILE IS AUTOMATICALLY GENERATED.  DO NOT EDIT.\n") \
45*ef4aa9ffSSascha Wildner	    > file
46*ef4aa9ffSSascha Wildner	printf(" */\n") > file
47*ef4aa9ffSSascha Wildner}
48*ef4aa9ffSSascha Wildner
49*ef4aa9ffSSascha Wildnerfunction vendor(hfile)
50*ef4aa9ffSSascha Wildner{
51*ef4aa9ffSSascha Wildner	nvendors++
52*ef4aa9ffSSascha Wildner
53*ef4aa9ffSSascha Wildner	vendorindex[$2] = nvendors;		# record index for this name, for later.
54*ef4aa9ffSSascha Wildner	vendors[nvendors, 1] = $2;		# name
55*ef4aa9ffSSascha Wildner	vendors[nvendors, 2] = $3;		# id
56*ef4aa9ffSSascha Wildner	if (hfile)
57*ef4aa9ffSSascha Wildner		printf("#define\tUSB_VENDOR_%s\t%s\t", vendors[nvendors, 1],
58*ef4aa9ffSSascha Wildner		    vendors[nvendors, 2]) > hfile
59*ef4aa9ffSSascha Wildner	i = 3; f = 4;
60*ef4aa9ffSSascha Wildner
61*ef4aa9ffSSascha Wildner	# comments
62*ef4aa9ffSSascha Wildner	ocomment = oparen = 0
63*ef4aa9ffSSascha Wildner	if (f <= NF) {
64*ef4aa9ffSSascha Wildner		if (hfile)
65*ef4aa9ffSSascha Wildner			printf("\t/* ") > hfile
66*ef4aa9ffSSascha Wildner		ocomment = 1;
67*ef4aa9ffSSascha Wildner	}
68*ef4aa9ffSSascha Wildner	while (f <= NF) {
69*ef4aa9ffSSascha Wildner		if ($f == "#") {
70*ef4aa9ffSSascha Wildner			if (hfile)
71*ef4aa9ffSSascha Wildner				printf("(") > hfile
72*ef4aa9ffSSascha Wildner			oparen = 1
73*ef4aa9ffSSascha Wildner			f++
74*ef4aa9ffSSascha Wildner			continue
75*ef4aa9ffSSascha Wildner		}
76*ef4aa9ffSSascha Wildner		if (oparen) {
77*ef4aa9ffSSascha Wildner			if (hfile)
78*ef4aa9ffSSascha Wildner				printf("%s", $f) > hfile
79*ef4aa9ffSSascha Wildner			if (f < NF && hfile)
80*ef4aa9ffSSascha Wildner				printf(" ") > hfile
81*ef4aa9ffSSascha Wildner			f++
82*ef4aa9ffSSascha Wildner			continue
83*ef4aa9ffSSascha Wildner		}
84*ef4aa9ffSSascha Wildner		vendors[nvendors, i] = $f
85*ef4aa9ffSSascha Wildner		if (hfile)
86*ef4aa9ffSSascha Wildner			printf("%s", vendors[nvendors, i]) > hfile
87*ef4aa9ffSSascha Wildner		if (f < NF && hfile)
88*ef4aa9ffSSascha Wildner			printf(" ") > hfile
89*ef4aa9ffSSascha Wildner		i++; f++;
90*ef4aa9ffSSascha Wildner	}
91*ef4aa9ffSSascha Wildner	if (oparen && hfile)
92*ef4aa9ffSSascha Wildner		printf(")") > hfile
93*ef4aa9ffSSascha Wildner	if (ocomment && hfile)
94*ef4aa9ffSSascha Wildner		printf(" */") > hfile
95*ef4aa9ffSSascha Wildner	if (hfile)
96*ef4aa9ffSSascha Wildner		printf("\n") > hfile
97*ef4aa9ffSSascha Wildner}
98*ef4aa9ffSSascha Wildner
99*ef4aa9ffSSascha Wildnerfunction product(hfile)
100*ef4aa9ffSSascha Wildner{
101*ef4aa9ffSSascha Wildner	nproducts++
102*ef4aa9ffSSascha Wildner
103*ef4aa9ffSSascha Wildner	products[nproducts, 1] = $2;		# vendor name
104*ef4aa9ffSSascha Wildner	products[nproducts, 2] = $3;		# product id
105*ef4aa9ffSSascha Wildner	products[nproducts, 3] = $4;		# id
106*ef4aa9ffSSascha Wildner	if (hfile)
107*ef4aa9ffSSascha Wildner		printf("#define\tUSB_PRODUCT_%s_%s\t%s\t", \
108*ef4aa9ffSSascha Wildner		  products[nproducts, 1], products[nproducts, 2], \
109*ef4aa9ffSSascha Wildner		  products[nproducts, 3]) > hfile
110*ef4aa9ffSSascha Wildner
111*ef4aa9ffSSascha Wildner	i=4; f = 5;
112*ef4aa9ffSSascha Wildner
113*ef4aa9ffSSascha Wildner	# comments
114*ef4aa9ffSSascha Wildner	ocomment = oparen = 0
115*ef4aa9ffSSascha Wildner	if (f <= NF) {
116*ef4aa9ffSSascha Wildner		if (hfile)
117*ef4aa9ffSSascha Wildner			printf("\t/* ") > hfile
118*ef4aa9ffSSascha Wildner		ocomment = 1;
119*ef4aa9ffSSascha Wildner	}
120*ef4aa9ffSSascha Wildner	while (f <= NF) {
121*ef4aa9ffSSascha Wildner		if ($f == "#") {
122*ef4aa9ffSSascha Wildner			if (hfile)
123*ef4aa9ffSSascha Wildner				printf("(") > hfile
124*ef4aa9ffSSascha Wildner			oparen = 1
125*ef4aa9ffSSascha Wildner			f++
126*ef4aa9ffSSascha Wildner			continue
127*ef4aa9ffSSascha Wildner		}
128*ef4aa9ffSSascha Wildner		if (oparen) {
129*ef4aa9ffSSascha Wildner			if (hfile)
130*ef4aa9ffSSascha Wildner				printf("%s", $f) > hfile
131*ef4aa9ffSSascha Wildner			if (f < NF && hfile)
132*ef4aa9ffSSascha Wildner				printf(" ") > hfile
133*ef4aa9ffSSascha Wildner			f++
134*ef4aa9ffSSascha Wildner			continue
135*ef4aa9ffSSascha Wildner		}
136*ef4aa9ffSSascha Wildner		products[nproducts, i] = $f
137*ef4aa9ffSSascha Wildner		if (hfile)
138*ef4aa9ffSSascha Wildner			printf("%s", products[nproducts, i]) > hfile
139*ef4aa9ffSSascha Wildner		if (f < NF && hfile)
140*ef4aa9ffSSascha Wildner			printf(" ") > hfile
141*ef4aa9ffSSascha Wildner		i++; f++;
142*ef4aa9ffSSascha Wildner	}
143*ef4aa9ffSSascha Wildner	if (oparen && hfile)
144*ef4aa9ffSSascha Wildner		printf(")") > hfile
145*ef4aa9ffSSascha Wildner	if (ocomment && hfile)
146*ef4aa9ffSSascha Wildner		printf(" */") > hfile
147*ef4aa9ffSSascha Wildner	if (hfile)
148*ef4aa9ffSSascha Wildner		printf("\n") > hfile
149*ef4aa9ffSSascha Wildner}
150*ef4aa9ffSSascha Wildner
151*ef4aa9ffSSascha Wildnerfunction dump_dfile(dfile)
152*ef4aa9ffSSascha Wildner{
153*ef4aa9ffSSascha Wildner	printf("\n") > dfile
154*ef4aa9ffSSascha Wildner	printf("const struct usb_knowndev usb_knowndevs[] = {\n") > dfile
155*ef4aa9ffSSascha Wildner	for (i = 1; i <= nproducts; i++) {
156*ef4aa9ffSSascha Wildner		printf("\t{\n") > dfile
157*ef4aa9ffSSascha Wildner		printf("\t    USB_VENDOR_%s, USB_PRODUCT_%s_%s,\n",
158*ef4aa9ffSSascha Wildner		    products[i, 1], products[i, 1], products[i, 2]) > dfile
159*ef4aa9ffSSascha Wildner		printf("\t    ") > dfile
160*ef4aa9ffSSascha Wildner		printf("0") > dfile
161*ef4aa9ffSSascha Wildner		printf(",\n") > dfile
162*ef4aa9ffSSascha Wildner
163*ef4aa9ffSSascha Wildner		vendi = vendorindex[products[i, 1]];
164*ef4aa9ffSSascha Wildner		printf("\t    \"") > dfile
165*ef4aa9ffSSascha Wildner		j = 3;
166*ef4aa9ffSSascha Wildner		needspace = 0;
167*ef4aa9ffSSascha Wildner		while (vendors[vendi, j] != "") {
168*ef4aa9ffSSascha Wildner			if (needspace)
169*ef4aa9ffSSascha Wildner				printf(" ") > dfile
170*ef4aa9ffSSascha Wildner			printf("%s", vendors[vendi, j]) > dfile
171*ef4aa9ffSSascha Wildner			needspace = 1
172*ef4aa9ffSSascha Wildner			j++
173*ef4aa9ffSSascha Wildner		}
174*ef4aa9ffSSascha Wildner		printf("\",\n") > dfile
175*ef4aa9ffSSascha Wildner
176*ef4aa9ffSSascha Wildner		printf("\t    \"") > dfile
177*ef4aa9ffSSascha Wildner		j = 4;
178*ef4aa9ffSSascha Wildner		needspace = 0;
179*ef4aa9ffSSascha Wildner		while (products[i, j] != "") {
180*ef4aa9ffSSascha Wildner			if (needspace)
181*ef4aa9ffSSascha Wildner				printf(" ") > dfile
182*ef4aa9ffSSascha Wildner			printf("%s", products[i, j]) > dfile
183*ef4aa9ffSSascha Wildner			needspace = 1
184*ef4aa9ffSSascha Wildner			j++
185*ef4aa9ffSSascha Wildner		}
186*ef4aa9ffSSascha Wildner		printf("\",\n") > dfile
187*ef4aa9ffSSascha Wildner		printf("\t},\n") > dfile
188*ef4aa9ffSSascha Wildner	}
189*ef4aa9ffSSascha Wildner	for (i = 1; i <= nvendors; i++) {
190*ef4aa9ffSSascha Wildner		printf("\t{\n") > dfile
191*ef4aa9ffSSascha Wildner		printf("\t    USB_VENDOR_%s, 0,\n", vendors[i, 1]) > dfile
192*ef4aa9ffSSascha Wildner		printf("\t    USB_KNOWNDEV_NOPROD,\n") > dfile
193*ef4aa9ffSSascha Wildner		printf("\t    \"") > dfile
194*ef4aa9ffSSascha Wildner		j = 3;
195*ef4aa9ffSSascha Wildner		needspace = 0;
196*ef4aa9ffSSascha Wildner		while (vendors[i, j] != "") {
197*ef4aa9ffSSascha Wildner			if (needspace)
198*ef4aa9ffSSascha Wildner				printf(" ") > dfile
199*ef4aa9ffSSascha Wildner			printf("%s", vendors[i, j]) > dfile
200*ef4aa9ffSSascha Wildner			needspace = 1
201*ef4aa9ffSSascha Wildner			j++
202*ef4aa9ffSSascha Wildner		}
203*ef4aa9ffSSascha Wildner		printf("\",\n") > dfile
204*ef4aa9ffSSascha Wildner		printf("\t    NULL,\n") > dfile
205*ef4aa9ffSSascha Wildner		printf("\t},\n") > dfile
206*ef4aa9ffSSascha Wildner	}
207*ef4aa9ffSSascha Wildner	printf("\t{ 0, 0, 0, NULL, NULL, }\n") > dfile
208*ef4aa9ffSSascha Wildner	printf("};\n") > dfile
209*ef4aa9ffSSascha Wildner}
210*ef4aa9ffSSascha Wildner
211*ef4aa9ffSSascha WildnerBEGIN {
212*ef4aa9ffSSascha Wildner
213*ef4aa9ffSSascha Wildnernproducts = nvendors = 0
214*ef4aa9ffSSascha Wildner# Process the command line
215*ef4aa9ffSSascha Wildnerfor (i = 1; i < ARGC; i++) {
216*ef4aa9ffSSascha Wildner	arg = ARGV[i];
217*ef4aa9ffSSascha Wildner	if (arg !~ /^-[dh]+$/ && arg !~ /devs$/)
218*ef4aa9ffSSascha Wildner		usage();
219*ef4aa9ffSSascha Wildner	if (arg ~ /^-.*d/)
220*ef4aa9ffSSascha Wildner		dfile="usbdevs_data.h"
221*ef4aa9ffSSascha Wildner	if (arg ~ /^-.*h/)
222*ef4aa9ffSSascha Wildner		hfile="usbdevs.h"
223*ef4aa9ffSSascha Wildner	if (arg ~ /devs$/)
224*ef4aa9ffSSascha Wildner		srcfile = arg;
225*ef4aa9ffSSascha Wildner}
226*ef4aa9ffSSascha WildnerARGC = 1;
227*ef4aa9ffSSascha Wildnerline=0;
228*ef4aa9ffSSascha Wildner
229*ef4aa9ffSSascha Wildnerwhile ((getline < srcfile) > 0) {
230*ef4aa9ffSSascha Wildner	line++;
231*ef4aa9ffSSascha Wildner	if (line == 1) {
232*ef4aa9ffSSascha Wildner		if (dfile)
233*ef4aa9ffSSascha Wildner			header(dfile)
234*ef4aa9ffSSascha Wildner		if (hfile)
235*ef4aa9ffSSascha Wildner			header(hfile)
236*ef4aa9ffSSascha Wildner		continue;
237*ef4aa9ffSSascha Wildner	}
238*ef4aa9ffSSascha Wildner	if ($1 == "vendor") {
239*ef4aa9ffSSascha Wildner		vendor(hfile)
240*ef4aa9ffSSascha Wildner		continue
241*ef4aa9ffSSascha Wildner	}
242*ef4aa9ffSSascha Wildner	if ($1 == "product") {
243*ef4aa9ffSSascha Wildner		product(hfile)
244*ef4aa9ffSSascha Wildner		continue
245*ef4aa9ffSSascha Wildner	}
246*ef4aa9ffSSascha Wildner	if ($0 == "")
247*ef4aa9ffSSascha Wildner		blanklines++
248*ef4aa9ffSSascha Wildner	if (hfile)
249*ef4aa9ffSSascha Wildner		print $0 > hfile
250*ef4aa9ffSSascha Wildner	if (blanklines < 2 && dfile)
251*ef4aa9ffSSascha Wildner		print $0 > dfile
252*ef4aa9ffSSascha Wildner}
253*ef4aa9ffSSascha Wildner
254*ef4aa9ffSSascha Wildner# print out the match tables
255*ef4aa9ffSSascha Wildner
256*ef4aa9ffSSascha Wildnerif (dfile)
257*ef4aa9ffSSascha Wildner	dump_dfile(dfile)
258*ef4aa9ffSSascha Wildner}
259