xref: /onnv-gate/usr/src/uts/common/io/usb/usbdevs2h.awk (revision 9354:9559ac454e7e)
1*9354STim.Marsland@Sun.COM#! /usr/bin/awk -f
2*9354STim.Marsland@Sun.COM
3*9354STim.Marsland@Sun.COM# Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
4*9354STim.Marsland@Sun.COM# Use is subject to license terms.
5*9354STim.Marsland@Sun.COM
6*9354STim.Marsland@Sun.COM# CDDL HEADER START
7*9354STim.Marsland@Sun.COM#
8*9354STim.Marsland@Sun.COM# The contents of this file are subject to the terms of the
9*9354STim.Marsland@Sun.COM# Common Development and Distribution License (the "License").
10*9354STim.Marsland@Sun.COM# You may not use this file except in compliance with the License.
11*9354STim.Marsland@Sun.COM#
12*9354STim.Marsland@Sun.COM# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
13*9354STim.Marsland@Sun.COM# or http://www.opensolaris.org/os/licensing.
14*9354STim.Marsland@Sun.COM# See the License for the specific language governing permissions
15*9354STim.Marsland@Sun.COM# and limitations under the License.
16*9354STim.Marsland@Sun.COM#
17*9354STim.Marsland@Sun.COM# When distributing Covered Code, include this CDDL HEADER in each
18*9354STim.Marsland@Sun.COM# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
19*9354STim.Marsland@Sun.COM# If applicable, add the following below this CDDL HEADER, with the
20*9354STim.Marsland@Sun.COM# fields enclosed by brackets "[]" replaced with your own identifying
21*9354STim.Marsland@Sun.COM# information: Portions Copyright [yyyy] [name of copyright owner]
22*9354STim.Marsland@Sun.COM#
23*9354STim.Marsland@Sun.COM# CDDL HEADER END
24*9354STim.Marsland@Sun.COM
25*9354STim.Marsland@Sun.COM#-
26*9354STim.Marsland@Sun.COM#	$NetBSD: usb/devlist2h.awk,v 1.9 2001/01/18 20:28:22 jdolecek Exp $
27*9354STim.Marsland@Sun.COM#  $FreeBSD: src/sys/tools/usbdevs2h.awk,v 1.7 2005/01/07 02:29:25 imp Exp $
28*9354STim.Marsland@Sun.COM#
29*9354STim.Marsland@Sun.COM# Copyright (c) 1995, 1996 Christopher G. Demetriou
30*9354STim.Marsland@Sun.COM# All rights reserved.
31*9354STim.Marsland@Sun.COM#
32*9354STim.Marsland@Sun.COM# Redistribution and use in source and binary forms, with or without
33*9354STim.Marsland@Sun.COM# modification, are permitted provided that the following conditions
34*9354STim.Marsland@Sun.COM# are met:
35*9354STim.Marsland@Sun.COM# 1. Redistributions of source code must retain the above copyright
36*9354STim.Marsland@Sun.COM#    notice, this list of conditions and the following disclaimer.
37*9354STim.Marsland@Sun.COM# 2. Redistributions in binary form must reproduce the above copyright
38*9354STim.Marsland@Sun.COM#    notice, this list of conditions and the following disclaimer in the
39*9354STim.Marsland@Sun.COM#    documentation and/or other materials provided with the distribution.
40*9354STim.Marsland@Sun.COM# 3. All advertising materials mentioning features or use of this software
41*9354STim.Marsland@Sun.COM#    must display the following acknowledgement:
42*9354STim.Marsland@Sun.COM#      This product includes software developed by Christopher G. Demetriou.
43*9354STim.Marsland@Sun.COM# 4. The name of the author may not be used to endorse or promote products
44*9354STim.Marsland@Sun.COM#    derived from this software without specific prior written permission
45*9354STim.Marsland@Sun.COM#
46*9354STim.Marsland@Sun.COM# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
47*9354STim.Marsland@Sun.COM# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
48*9354STim.Marsland@Sun.COM# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
49*9354STim.Marsland@Sun.COM# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
50*9354STim.Marsland@Sun.COM# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
51*9354STim.Marsland@Sun.COM# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
52*9354STim.Marsland@Sun.COM# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
53*9354STim.Marsland@Sun.COM# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
54*9354STim.Marsland@Sun.COM# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
55*9354STim.Marsland@Sun.COM# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
56*9354STim.Marsland@Sun.COM#
57*9354STim.Marsland@Sun.COM
58*9354STim.Marsland@Sun.COMfunction usage()
59*9354STim.Marsland@Sun.COM{
60*9354STim.Marsland@Sun.COM	print "usage: usbdevs2h.awk <srcfile> [-d|-D|-h|-H]";
61*9354STim.Marsland@Sun.COM	exit 1;
62*9354STim.Marsland@Sun.COM}
63*9354STim.Marsland@Sun.COM
64*9354STim.Marsland@Sun.COMfunction header(file)
65*9354STim.Marsland@Sun.COM{
66*9354STim.Marsland@Sun.COM	if (os == "NetBSD")
67*9354STim.Marsland@Sun.COM		printf("/*\t\$NetBSD\$\t*/\n\n") > file
68*9354STim.Marsland@Sun.COM	else if (os == "FreeBSD")
69*9354STim.Marsland@Sun.COM		printf("/* \$FreeBSD\$ */\n\n") > file
70*9354STim.Marsland@Sun.COM	else if (os == "OpenBSD")
71*9354STim.Marsland@Sun.COM		printf("/*\t\$OpenBSD\$\t*/\n\n") > file
72*9354STim.Marsland@Sun.COM
73*9354STim.Marsland@Sun.COM	printf("/*\n") > file
74*9354STim.Marsland@Sun.COM	printf(" * THIS FILE IS AUTOMATICALLY GENERATED.  DO NOT EDIT.\n") \
75*9354STim.Marsland@Sun.COM	    > file
76*9354STim.Marsland@Sun.COM	printf(" *\n") > file
77*9354STim.Marsland@Sun.COM	printf(" * generated from:\n") > file
78*9354STim.Marsland@Sun.COM	printf(" *  %s\n", VERSION) > file
79*9354STim.Marsland@Sun.COM	printf(" */\n") > file
80*9354STim.Marsland@Sun.COM}
81*9354STim.Marsland@Sun.COM
82*9354STim.Marsland@Sun.COMfunction header_guard(file)
83*9354STim.Marsland@Sun.COM{
84*9354STim.Marsland@Sun.COM	printf("\n") > file
85*9354STim.Marsland@Sun.COM	printf("#ifndef\t_SYS_USB_USBDEVS_H\n") > file
86*9354STim.Marsland@Sun.COM	printf("#define\t_SYS_USB_USBDEVS_H\n\n") > file
87*9354STim.Marsland@Sun.COM}
88*9354STim.Marsland@Sun.COM
89*9354STim.Marsland@Sun.COMfunction header_trailer(file)
90*9354STim.Marsland@Sun.COM{
91*9354STim.Marsland@Sun.COM	printf("\n") > file
92*9354STim.Marsland@Sun.COM	printf("#endif\t/* _SYS_USB_USBDEVS_H */\n") > file
93*9354STim.Marsland@Sun.COM}
94*9354STim.Marsland@Sun.COM
95*9354STim.Marsland@Sun.COMfunction vendor(hfile)
96*9354STim.Marsland@Sun.COM{
97*9354STim.Marsland@Sun.COM	nvendors++
98*9354STim.Marsland@Sun.COM
99*9354STim.Marsland@Sun.COM	vendorindex[$2] = nvendors;		# record index for this name, for later.
100*9354STim.Marsland@Sun.COM	vendors[nvendors, 1] = $2;		# name
101*9354STim.Marsland@Sun.COM	vendors[nvendors, 2] = $3;		# id
102*9354STim.Marsland@Sun.COM	if (hfile)
103*9354STim.Marsland@Sun.COM		printf("#define\tUSB_VENDOR_%s\t%s\t", vendors[nvendors, 1],
104*9354STim.Marsland@Sun.COM		    vendors[nvendors, 2]) > hfile
105*9354STim.Marsland@Sun.COM
106*9354STim.Marsland@Sun.COM	i = 3; f = 4;
107*9354STim.Marsland@Sun.COM
108*9354STim.Marsland@Sun.COM	# comments
109*9354STim.Marsland@Sun.COM	ocomment = oparen = 0
110*9354STim.Marsland@Sun.COM	if (f <= NF) {
111*9354STim.Marsland@Sun.COM		if (hfile)
112*9354STim.Marsland@Sun.COM			printf("\t/* ") > hfile
113*9354STim.Marsland@Sun.COM		ocomment = 1;
114*9354STim.Marsland@Sun.COM	}
115*9354STim.Marsland@Sun.COM	while (f <= NF) {
116*9354STim.Marsland@Sun.COM		if ($f == "#") {
117*9354STim.Marsland@Sun.COM			if (hfile)
118*9354STim.Marsland@Sun.COM				printf("(") > hfile
119*9354STim.Marsland@Sun.COM			oparen = 1
120*9354STim.Marsland@Sun.COM			f++
121*9354STim.Marsland@Sun.COM			continue
122*9354STim.Marsland@Sun.COM		}
123*9354STim.Marsland@Sun.COM		if (oparen) {
124*9354STim.Marsland@Sun.COM			if (hfile)
125*9354STim.Marsland@Sun.COM				printf("%s", $f) > hfile
126*9354STim.Marsland@Sun.COM			if (f < NF && hfile)
127*9354STim.Marsland@Sun.COM				printf(" ") > hfile
128*9354STim.Marsland@Sun.COM			f++
129*9354STim.Marsland@Sun.COM			continue
130*9354STim.Marsland@Sun.COM		}
131*9354STim.Marsland@Sun.COM		vendors[nvendors, i] = $f
132*9354STim.Marsland@Sun.COM		if (hfile)
133*9354STim.Marsland@Sun.COM			printf("%s", vendors[nvendors, i]) > hfile
134*9354STim.Marsland@Sun.COM		if (f < NF && hfile)
135*9354STim.Marsland@Sun.COM			printf(" ") > hfile
136*9354STim.Marsland@Sun.COM		i++; f++;
137*9354STim.Marsland@Sun.COM	}
138*9354STim.Marsland@Sun.COM	if (oparen && hfile)
139*9354STim.Marsland@Sun.COM		printf(")") > hfile
140*9354STim.Marsland@Sun.COM	if (ocomment && hfile)
141*9354STim.Marsland@Sun.COM		printf(" */") > hfile
142*9354STim.Marsland@Sun.COM	if (hfile)
143*9354STim.Marsland@Sun.COM		printf("\n") > hfile
144*9354STim.Marsland@Sun.COM}
145*9354STim.Marsland@Sun.COM
146*9354STim.Marsland@Sun.COMfunction product(hfile)
147*9354STim.Marsland@Sun.COM{
148*9354STim.Marsland@Sun.COM	nproducts++
149*9354STim.Marsland@Sun.COM
150*9354STim.Marsland@Sun.COM	products[nproducts, 1] = $2;		# vendor name
151*9354STim.Marsland@Sun.COM	products[nproducts, 2] = $3;		# product id
152*9354STim.Marsland@Sun.COM	products[nproducts, 3] = $4;		# id
153*9354STim.Marsland@Sun.COM	if (hfile)
154*9354STim.Marsland@Sun.COM		printf("#define\tUSB_PRODUCT_%s_%s\t%s\t", \
155*9354STim.Marsland@Sun.COM		  products[nproducts, 1], products[nproducts, 2], \
156*9354STim.Marsland@Sun.COM		  products[nproducts, 3]) > hfile
157*9354STim.Marsland@Sun.COM
158*9354STim.Marsland@Sun.COM	i=4; f = 5;
159*9354STim.Marsland@Sun.COM
160*9354STim.Marsland@Sun.COM	# comments
161*9354STim.Marsland@Sun.COM	ocomment = oparen = 0
162*9354STim.Marsland@Sun.COM	if (f <= NF) {
163*9354STim.Marsland@Sun.COM		if (hfile)
164*9354STim.Marsland@Sun.COM			printf("\t/* ") > hfile
165*9354STim.Marsland@Sun.COM		ocomment = 1;
166*9354STim.Marsland@Sun.COM	}
167*9354STim.Marsland@Sun.COM	while (f <= NF) {
168*9354STim.Marsland@Sun.COM		if ($f == "#") {
169*9354STim.Marsland@Sun.COM			if (hfile)
170*9354STim.Marsland@Sun.COM				printf("(") > hfile
171*9354STim.Marsland@Sun.COM			oparen = 1
172*9354STim.Marsland@Sun.COM			f++
173*9354STim.Marsland@Sun.COM			continue
174*9354STim.Marsland@Sun.COM		}
175*9354STim.Marsland@Sun.COM		if (oparen) {
176*9354STim.Marsland@Sun.COM			if (hfile)
177*9354STim.Marsland@Sun.COM				printf("%s", $f) > hfile
178*9354STim.Marsland@Sun.COM			if (f < NF && hfile)
179*9354STim.Marsland@Sun.COM				printf(" ") > hfile
180*9354STim.Marsland@Sun.COM			f++
181*9354STim.Marsland@Sun.COM			continue
182*9354STim.Marsland@Sun.COM		}
183*9354STim.Marsland@Sun.COM		products[nproducts, i] = $f
184*9354STim.Marsland@Sun.COM		if (hfile)
185*9354STim.Marsland@Sun.COM			printf("%s", products[nproducts, i]) > hfile
186*9354STim.Marsland@Sun.COM		if (f < NF && hfile)
187*9354STim.Marsland@Sun.COM			printf(" ") > hfile
188*9354STim.Marsland@Sun.COM		i++; f++;
189*9354STim.Marsland@Sun.COM	}
190*9354STim.Marsland@Sun.COM	if (oparen && hfile)
191*9354STim.Marsland@Sun.COM		printf(")") > hfile
192*9354STim.Marsland@Sun.COM	if (ocomment && hfile)
193*9354STim.Marsland@Sun.COM		printf(" */") > hfile
194*9354STim.Marsland@Sun.COM	if (hfile)
195*9354STim.Marsland@Sun.COM		printf("\n") > hfile
196*9354STim.Marsland@Sun.COM}
197*9354STim.Marsland@Sun.COM
198*9354STim.Marsland@Sun.COMfunction dump_dfile(dfile)
199*9354STim.Marsland@Sun.COM{
200*9354STim.Marsland@Sun.COM	printf("\n") > dfile
201*9354STim.Marsland@Sun.COM	printf("const struct usb_knowndev usb_knowndevs[] = {\n") > dfile
202*9354STim.Marsland@Sun.COM	for (i = 1; i <= nproducts; i++) {
203*9354STim.Marsland@Sun.COM		printf("\t{\n") > dfile
204*9354STim.Marsland@Sun.COM		printf("\t    USB_VENDOR_%s, USB_PRODUCT_%s_%s,\n",
205*9354STim.Marsland@Sun.COM		    products[i, 1], products[i, 1], products[i, 2]) > dfile
206*9354STim.Marsland@Sun.COM		printf("\t    ") > dfile
207*9354STim.Marsland@Sun.COM		printf("0") > dfile
208*9354STim.Marsland@Sun.COM		printf(",\n") > dfile
209*9354STim.Marsland@Sun.COM
210*9354STim.Marsland@Sun.COM		vendi = vendorindex[products[i, 1]];
211*9354STim.Marsland@Sun.COM		printf("\t    \"") > dfile
212*9354STim.Marsland@Sun.COM		j = 3;
213*9354STim.Marsland@Sun.COM		needspace = 0;
214*9354STim.Marsland@Sun.COM		while (vendors[vendi, j] != "") {
215*9354STim.Marsland@Sun.COM			if (needspace)
216*9354STim.Marsland@Sun.COM				printf(" ") > dfile
217*9354STim.Marsland@Sun.COM			printf("%s", vendors[vendi, j]) > dfile
218*9354STim.Marsland@Sun.COM			needspace = 1
219*9354STim.Marsland@Sun.COM			j++
220*9354STim.Marsland@Sun.COM		}
221*9354STim.Marsland@Sun.COM		printf("\",\n") > dfile
222*9354STim.Marsland@Sun.COM
223*9354STim.Marsland@Sun.COM		printf("\t    \"") > dfile
224*9354STim.Marsland@Sun.COM		j = 4;
225*9354STim.Marsland@Sun.COM		needspace = 0;
226*9354STim.Marsland@Sun.COM		while (products[i, j] != "") {
227*9354STim.Marsland@Sun.COM			if (needspace)
228*9354STim.Marsland@Sun.COM				printf(" ") > dfile
229*9354STim.Marsland@Sun.COM			printf("%s", products[i, j]) > dfile
230*9354STim.Marsland@Sun.COM			needspace = 1
231*9354STim.Marsland@Sun.COM			j++
232*9354STim.Marsland@Sun.COM		}
233*9354STim.Marsland@Sun.COM		printf("\",\n") > dfile
234*9354STim.Marsland@Sun.COM		printf("\t},\n") > dfile
235*9354STim.Marsland@Sun.COM	}
236*9354STim.Marsland@Sun.COM	for (i = 1; i <= nvendors; i++) {
237*9354STim.Marsland@Sun.COM		printf("\t{\n") > dfile
238*9354STim.Marsland@Sun.COM		printf("\t    USB_VENDOR_%s, 0,\n", vendors[i, 1]) > dfile
239*9354STim.Marsland@Sun.COM		printf("\t    USB_KNOWNDEV_NOPROD,\n") > dfile
240*9354STim.Marsland@Sun.COM		printf("\t    \"") > dfile
241*9354STim.Marsland@Sun.COM		j = 3;
242*9354STim.Marsland@Sun.COM		needspace = 0;
243*9354STim.Marsland@Sun.COM		while (vendors[i, j] != "") {
244*9354STim.Marsland@Sun.COM			if (needspace)
245*9354STim.Marsland@Sun.COM				printf(" ") > dfile
246*9354STim.Marsland@Sun.COM			printf("%s", vendors[i, j]) > dfile
247*9354STim.Marsland@Sun.COM			needspace = 1
248*9354STim.Marsland@Sun.COM			j++
249*9354STim.Marsland@Sun.COM		}
250*9354STim.Marsland@Sun.COM		printf("\",\n") > dfile
251*9354STim.Marsland@Sun.COM		printf("\t    NULL,\n") > dfile
252*9354STim.Marsland@Sun.COM		printf("\t},\n") > dfile
253*9354STim.Marsland@Sun.COM	}
254*9354STim.Marsland@Sun.COM	printf("\t{ 0, 0, 0, NULL, NULL, }\n") > dfile
255*9354STim.Marsland@Sun.COM	printf("};\n") > dfile
256*9354STim.Marsland@Sun.COM}
257*9354STim.Marsland@Sun.COM
258*9354STim.Marsland@Sun.COMBEGIN {
259*9354STim.Marsland@Sun.COM
260*9354STim.Marsland@Sun.COMnproducts = nvendors = 0
261*9354STim.Marsland@Sun.COM# Process the command line
262*9354STim.Marsland@Sun.COMfor (i = 1; i < ARGC; i++) {
263*9354STim.Marsland@Sun.COM	arg = ARGV[i];
264*9354STim.Marsland@Sun.COM	if (arg !~ /^-[dDhH]+$/ && arg !~ /devs$/)
265*9354STim.Marsland@Sun.COM		usage();
266*9354STim.Marsland@Sun.COM	if (arg ~ /^-.*d/)
267*9354STim.Marsland@Sun.COM		dfile="usbdevs_data.h"
268*9354STim.Marsland@Sun.COM	if (arg ~ /^-.*D/)
269*9354STim.Marsland@Sun.COM		dfile="/dev/stdout"
270*9354STim.Marsland@Sun.COM	if (arg ~ /^-.*h/)
271*9354STim.Marsland@Sun.COM		hfile="usbdevs.h"
272*9354STim.Marsland@Sun.COM	if (arg ~ /^-.*H/)
273*9354STim.Marsland@Sun.COM		hfile="/dev/stdout"
274*9354STim.Marsland@Sun.COM	if (arg ~ /devs$/)
275*9354STim.Marsland@Sun.COM		srcfile = arg;
276*9354STim.Marsland@Sun.COM}
277*9354STim.Marsland@Sun.COMARGC = 1;
278*9354STim.Marsland@Sun.COMline=0;
279*9354STim.Marsland@Sun.COM
280*9354STim.Marsland@Sun.COMwhile ((getline < srcfile) > 0) {
281*9354STim.Marsland@Sun.COM	line++;
282*9354STim.Marsland@Sun.COM	if (line == 1) {
283*9354STim.Marsland@Sun.COM		VERSION = $0
284*9354STim.Marsland@Sun.COM		gsub("\\$", "", VERSION)
285*9354STim.Marsland@Sun.COM		if (dfile)
286*9354STim.Marsland@Sun.COM			header(dfile)
287*9354STim.Marsland@Sun.COM		if (hfile) {
288*9354STim.Marsland@Sun.COM			header(hfile)
289*9354STim.Marsland@Sun.COM			header_guard(hfile)
290*9354STim.Marsland@Sun.COM		}
291*9354STim.Marsland@Sun.COM		continue;
292*9354STim.Marsland@Sun.COM	}
293*9354STim.Marsland@Sun.COM	if ($1 == "vendor") {
294*9354STim.Marsland@Sun.COM		vendor(hfile)
295*9354STim.Marsland@Sun.COM		continue
296*9354STim.Marsland@Sun.COM	}
297*9354STim.Marsland@Sun.COM	if ($1 == "product") {
298*9354STim.Marsland@Sun.COM		product(hfile)
299*9354STim.Marsland@Sun.COM		continue
300*9354STim.Marsland@Sun.COM	}
301*9354STim.Marsland@Sun.COM	if ($0 == "")
302*9354STim.Marsland@Sun.COM		blanklines++
303*9354STim.Marsland@Sun.COM	if (hfile)
304*9354STim.Marsland@Sun.COM		print $0 > hfile
305*9354STim.Marsland@Sun.COM	if (blanklines < 2 && dfile)
306*9354STim.Marsland@Sun.COM	    print $0 > dfile
307*9354STim.Marsland@Sun.COM}
308*9354STim.Marsland@Sun.COM
309*9354STim.Marsland@Sun.COM# close off the header guard
310*9354STim.Marsland@Sun.COM
311*9354STim.Marsland@Sun.COMif (hfile)
312*9354STim.Marsland@Sun.COM	header_trailer(hfile)
313*9354STim.Marsland@Sun.COM
314*9354STim.Marsland@Sun.COM# print out the match tables
315*9354STim.Marsland@Sun.COM
316*9354STim.Marsland@Sun.COMif (dfile)
317*9354STim.Marsland@Sun.COM	dump_dfile(dfile)
318*9354STim.Marsland@Sun.COM}
319