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