xref: /freebsd-src/sys/tools/usbdevs2h.awk (revision 031beb4e239bfce798af17f5fe8dba8bcaf13d99)
15630d313SNick Hibma#! /usr/bin/awk -f
260727d8bSWarner Losh#-
3a4c63369SJosef Karthauser#	$NetBSD: usb/devlist2h.awk,v 1.9 2001/01/18 20:28:22 jdolecek Exp $
45630d313SNick Hibma#
5*fe267a55SPedro F. Giffuni# SPDX-License-Identifier: BSD-4-Clause
6*fe267a55SPedro F. Giffuni#
75630d313SNick Hibma# Copyright (c) 1995, 1996 Christopher G. Demetriou
85630d313SNick Hibma# All rights reserved.
95630d313SNick Hibma#
105630d313SNick Hibma# Redistribution and use in source and binary forms, with or without
115630d313SNick Hibma# modification, are permitted provided that the following conditions
125630d313SNick Hibma# are met:
135630d313SNick Hibma# 1. Redistributions of source code must retain the above copyright
145630d313SNick Hibma#    notice, this list of conditions and the following disclaimer.
155630d313SNick Hibma# 2. Redistributions in binary form must reproduce the above copyright
165630d313SNick Hibma#    notice, this list of conditions and the following disclaimer in the
175630d313SNick Hibma#    documentation and/or other materials provided with the distribution.
185630d313SNick Hibma# 3. All advertising materials mentioning features or use of this software
195630d313SNick Hibma#    must display the following acknowledgement:
205630d313SNick Hibma#      This product includes software developed by Christopher G. Demetriou.
215630d313SNick Hibma# 4. The name of the author may not be used to endorse or promote products
225630d313SNick Hibma#    derived from this software without specific prior written permission
235630d313SNick Hibma#
245630d313SNick Hibma# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
255630d313SNick Hibma# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
265630d313SNick Hibma# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
275630d313SNick Hibma# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
285630d313SNick Hibma# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
295630d313SNick Hibma# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
305630d313SNick Hibma# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
315630d313SNick Hibma# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
325630d313SNick Hibma# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
335630d313SNick Hibma# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
345630d313SNick Hibma#
3570eefcc5SWarner Losh
362fe2cbd5SWarner Loshfunction usage()
372fe2cbd5SWarner Losh{
382fe2cbd5SWarner Losh	print "usage: usbdevs2h.awk <srcfile> [-d|-h]";
392fe2cbd5SWarner Losh	exit 1;
405630d313SNick Hibma}
412fe2cbd5SWarner Losh
423c20c603SWarner Loshfunction header(file)
4370eefcc5SWarner Losh{
443c20c603SWarner Losh	printf("/*\n") > file
455630d313SNick Hibma	printf(" * THIS FILE IS AUTOMATICALLY GENERATED.  DO NOT EDIT.\n") \
463c20c603SWarner Losh	    > file
473c20c603SWarner Losh	printf(" */\n") > file
482fe2cbd5SWarner Losh}
495630d313SNick Hibma
5070eefcc5SWarner Loshfunction vendor(hfile)
5170eefcc5SWarner Losh{
525630d313SNick Hibma	nvendors++
535630d313SNick Hibma
545630d313SNick Hibma	vendorindex[$2] = nvendors;		# record index for this name, for later.
555630d313SNick Hibma	vendors[nvendors, 1] = $2;		# name
565630d313SNick Hibma	vendors[nvendors, 2] = $3;		# id
572fe2cbd5SWarner Losh	if (hfile)
585630d313SNick Hibma		printf("#define\tUSB_VENDOR_%s\t%s\t", vendors[nvendors, 1],
595630d313SNick Hibma		    vendors[nvendors, 2]) > hfile
605630d313SNick Hibma	i = 3; f = 4;
615630d313SNick Hibma
625630d313SNick Hibma	# comments
635630d313SNick Hibma	ocomment = oparen = 0
645630d313SNick Hibma	if (f <= NF) {
652fe2cbd5SWarner Losh		if (hfile)
665630d313SNick Hibma			printf("\t/* ") > hfile
675630d313SNick Hibma		ocomment = 1;
685630d313SNick Hibma	}
695630d313SNick Hibma	while (f <= NF) {
705630d313SNick Hibma		if ($f == "#") {
712fe2cbd5SWarner Losh			if (hfile)
725630d313SNick Hibma				printf("(") > hfile
735630d313SNick Hibma			oparen = 1
745630d313SNick Hibma			f++
755630d313SNick Hibma			continue
765630d313SNick Hibma		}
775630d313SNick Hibma		if (oparen) {
782fe2cbd5SWarner Losh			if (hfile)
795630d313SNick Hibma				printf("%s", $f) > hfile
802fe2cbd5SWarner Losh			if (f < NF && hfile)
815630d313SNick Hibma				printf(" ") > hfile
825630d313SNick Hibma			f++
835630d313SNick Hibma			continue
845630d313SNick Hibma		}
855630d313SNick Hibma		vendors[nvendors, i] = $f
862fe2cbd5SWarner Losh		if (hfile)
875630d313SNick Hibma			printf("%s", vendors[nvendors, i]) > hfile
882fe2cbd5SWarner Losh		if (f < NF && hfile)
895630d313SNick Hibma			printf(" ") > hfile
905630d313SNick Hibma		i++; f++;
915630d313SNick Hibma	}
922fe2cbd5SWarner Losh	if (oparen && hfile)
935630d313SNick Hibma		printf(")") > hfile
942fe2cbd5SWarner Losh	if (ocomment && hfile)
955630d313SNick Hibma		printf(" */") > hfile
962fe2cbd5SWarner Losh	if (hfile)
975630d313SNick Hibma		printf("\n") > hfile
985630d313SNick Hibma}
9970eefcc5SWarner Losh
10070eefcc5SWarner Loshfunction product(hfile)
10170eefcc5SWarner Losh{
1025630d313SNick Hibma	nproducts++
1035630d313SNick Hibma
1045630d313SNick Hibma	products[nproducts, 1] = $2;		# vendor name
1055630d313SNick Hibma	products[nproducts, 2] = $3;		# product id
1065630d313SNick Hibma	products[nproducts, 3] = $4;		# id
1072fe2cbd5SWarner Losh	if (hfile)
1082fe2cbd5SWarner Losh		printf("#define\tUSB_PRODUCT_%s_%s\t%s\t", \
1092fe2cbd5SWarner Losh		  products[nproducts, 1], products[nproducts, 2], \
1102fe2cbd5SWarner Losh		  products[nproducts, 3]) > hfile
1115630d313SNick Hibma
1125630d313SNick Hibma	i=4; f = 5;
1135630d313SNick Hibma
1145630d313SNick Hibma	# comments
1155630d313SNick Hibma	ocomment = oparen = 0
1165630d313SNick Hibma	if (f <= NF) {
1172fe2cbd5SWarner Losh		if (hfile)
1185630d313SNick Hibma			printf("\t/* ") > hfile
1195630d313SNick Hibma		ocomment = 1;
1205630d313SNick Hibma	}
1215630d313SNick Hibma	while (f <= NF) {
1225630d313SNick Hibma		if ($f == "#") {
1232fe2cbd5SWarner Losh			if (hfile)
1245630d313SNick Hibma				printf("(") > hfile
1255630d313SNick Hibma			oparen = 1
1265630d313SNick Hibma			f++
1275630d313SNick Hibma			continue
1285630d313SNick Hibma		}
1295630d313SNick Hibma		if (oparen) {
1302fe2cbd5SWarner Losh			if (hfile)
1315630d313SNick Hibma				printf("%s", $f) > hfile
1322fe2cbd5SWarner Losh			if (f < NF && hfile)
1335630d313SNick Hibma				printf(" ") > hfile
1345630d313SNick Hibma			f++
1355630d313SNick Hibma			continue
1365630d313SNick Hibma		}
1375630d313SNick Hibma		products[nproducts, i] = $f
1382fe2cbd5SWarner Losh		if (hfile)
1395630d313SNick Hibma			printf("%s", products[nproducts, i]) > hfile
1402fe2cbd5SWarner Losh		if (f < NF && hfile)
1415630d313SNick Hibma			printf(" ") > hfile
1425630d313SNick Hibma		i++; f++;
1435630d313SNick Hibma	}
1442fe2cbd5SWarner Losh	if (oparen && hfile)
1455630d313SNick Hibma		printf(")") > hfile
1462fe2cbd5SWarner Losh	if (ocomment && hfile)
1475630d313SNick Hibma		printf(" */") > hfile
1482fe2cbd5SWarner Losh	if (hfile)
1495630d313SNick Hibma		printf("\n") > hfile
1505630d313SNick Hibma}
1515630d313SNick Hibma
15270eefcc5SWarner Loshfunction dump_dfile(dfile)
15370eefcc5SWarner Losh{
1545630d313SNick Hibma	printf("\n") > dfile
155a4c63369SJosef Karthauser	printf("const struct usb_knowndev usb_knowndevs[] = {\n") > dfile
1565630d313SNick Hibma	for (i = 1; i <= nproducts; i++) {
1575630d313SNick Hibma		printf("\t{\n") > dfile
1585630d313SNick Hibma		printf("\t    USB_VENDOR_%s, USB_PRODUCT_%s_%s,\n",
15970eefcc5SWarner Losh		    products[i, 1], products[i, 1], products[i, 2]) > dfile
1605630d313SNick Hibma		printf("\t    ") > dfile
1615630d313SNick Hibma		printf("0") > dfile
1625630d313SNick Hibma		printf(",\n") > dfile
1635630d313SNick Hibma
1645630d313SNick Hibma		vendi = vendorindex[products[i, 1]];
1655630d313SNick Hibma		printf("\t    \"") > dfile
1665630d313SNick Hibma		j = 3;
1675630d313SNick Hibma		needspace = 0;
1685630d313SNick Hibma		while (vendors[vendi, j] != "") {
1695630d313SNick Hibma			if (needspace)
1705630d313SNick Hibma				printf(" ") > dfile
1715630d313SNick Hibma			printf("%s", vendors[vendi, j]) > dfile
1725630d313SNick Hibma			needspace = 1
1735630d313SNick Hibma			j++
1745630d313SNick Hibma		}
1755630d313SNick Hibma		printf("\",\n") > dfile
1765630d313SNick Hibma
1775630d313SNick Hibma		printf("\t    \"") > dfile
1785630d313SNick Hibma		j = 4;
1795630d313SNick Hibma		needspace = 0;
1805630d313SNick Hibma		while (products[i, j] != "") {
1815630d313SNick Hibma			if (needspace)
1825630d313SNick Hibma				printf(" ") > dfile
1835630d313SNick Hibma			printf("%s", products[i, j]) > dfile
1845630d313SNick Hibma			needspace = 1
1855630d313SNick Hibma			j++
1865630d313SNick Hibma		}
1875630d313SNick Hibma		printf("\",\n") > dfile
1885630d313SNick Hibma		printf("\t},\n") > dfile
1895630d313SNick Hibma	}
1905630d313SNick Hibma	for (i = 1; i <= nvendors; i++) {
1915630d313SNick Hibma		printf("\t{\n") > dfile
19270eefcc5SWarner Losh		printf("\t    USB_VENDOR_%s, 0,\n", vendors[i, 1]) > dfile
19370eefcc5SWarner Losh		printf("\t    USB_KNOWNDEV_NOPROD,\n") > dfile
1945630d313SNick Hibma		printf("\t    \"") > dfile
1955630d313SNick Hibma		j = 3;
1965630d313SNick Hibma		needspace = 0;
1975630d313SNick Hibma		while (vendors[i, j] != "") {
1985630d313SNick Hibma			if (needspace)
1995630d313SNick Hibma				printf(" ") > dfile
2005630d313SNick Hibma			printf("%s", vendors[i, j]) > dfile
2015630d313SNick Hibma			needspace = 1
2025630d313SNick Hibma			j++
2035630d313SNick Hibma		}
2045630d313SNick Hibma		printf("\",\n") > dfile
2055630d313SNick Hibma		printf("\t    NULL,\n") > dfile
2065630d313SNick Hibma		printf("\t},\n") > dfile
2075630d313SNick Hibma	}
2085630d313SNick Hibma	printf("\t{ 0, 0, 0, NULL, NULL, }\n") > dfile
2095630d313SNick Hibma	printf("};\n") > dfile
2105630d313SNick Hibma}
21170eefcc5SWarner Losh
21270eefcc5SWarner LoshBEGIN {
21370eefcc5SWarner Losh
21470eefcc5SWarner Loshnproducts = nvendors = 0
21570eefcc5SWarner Losh# Process the command line
21670eefcc5SWarner Loshfor (i = 1; i < ARGC; i++) {
21770eefcc5SWarner Losh	arg = ARGV[i];
21870eefcc5SWarner Losh	if (arg !~ /^-[dh]+$/ && arg !~ /devs$/)
21970eefcc5SWarner Losh		usage();
22070eefcc5SWarner Losh	if (arg ~ /^-.*d/)
22170eefcc5SWarner Losh		dfile="usbdevs_data.h"
22270eefcc5SWarner Losh	if (arg ~ /^-.*h/)
22370eefcc5SWarner Losh		hfile="usbdevs.h"
22470eefcc5SWarner Losh	if (arg ~ /devs$/)
22570eefcc5SWarner Losh		srcfile = arg;
22670eefcc5SWarner Losh}
22770eefcc5SWarner LoshARGC = 1;
22870eefcc5SWarner Loshline=0;
22970eefcc5SWarner Losh
23070eefcc5SWarner Loshwhile ((getline < srcfile) > 0) {
23170eefcc5SWarner Losh	line++;
23270eefcc5SWarner Losh	if (line == 1) {
23370eefcc5SWarner Losh		if (dfile)
2343c20c603SWarner Losh			header(dfile)
23570eefcc5SWarner Losh		if (hfile)
2363c20c603SWarner Losh			header(hfile)
23770eefcc5SWarner Losh		continue;
23870eefcc5SWarner Losh	}
23970eefcc5SWarner Losh	if ($1 == "vendor") {
24070eefcc5SWarner Losh		vendor(hfile)
24170eefcc5SWarner Losh		continue
24270eefcc5SWarner Losh	}
24370eefcc5SWarner Losh	if ($1 == "product") {
24470eefcc5SWarner Losh		product(hfile)
24570eefcc5SWarner Losh		continue
24670eefcc5SWarner Losh	}
24770eefcc5SWarner Losh	if ($0 == "")
24870eefcc5SWarner Losh		blanklines++
24970eefcc5SWarner Losh	if (hfile)
25070eefcc5SWarner Losh		print $0 > hfile
25170eefcc5SWarner Losh	if (blanklines < 2 && dfile)
25270eefcc5SWarner Losh	    print $0 > dfile
25370eefcc5SWarner Losh}
25470eefcc5SWarner Losh
25570eefcc5SWarner Losh# print out the match tables
25670eefcc5SWarner Losh
25770eefcc5SWarner Loshif (dfile)
25870eefcc5SWarner Losh	dump_dfile(dfile)
2592fe2cbd5SWarner Losh}
260