usbdevs2h.awk revision 93569
153383Sn_hibma#! /usr/bin/awk -f
293569Sjoe#	$NetBSD: usb/devlist2h.awk,v 1.9 2001/01/18 20:28:22 jdolecek Exp $
353383Sn_hibma#  $FreeBSD: head/sys/tools/usbdevs2h.awk 93569 2002-04-01 19:22:04Z joe $
453383Sn_hibma#
553383Sn_hibma# Copyright (c) 1995, 1996 Christopher G. Demetriou
653383Sn_hibma# All rights reserved.
753383Sn_hibma#
853383Sn_hibma# Redistribution and use in source and binary forms, with or without
953383Sn_hibma# modification, are permitted provided that the following conditions
1053383Sn_hibma# are met:
1153383Sn_hibma# 1. Redistributions of source code must retain the above copyright
1253383Sn_hibma#    notice, this list of conditions and the following disclaimer.
1353383Sn_hibma# 2. Redistributions in binary form must reproduce the above copyright
1453383Sn_hibma#    notice, this list of conditions and the following disclaimer in the
1553383Sn_hibma#    documentation and/or other materials provided with the distribution.
1653383Sn_hibma# 3. All advertising materials mentioning features or use of this software
1753383Sn_hibma#    must display the following acknowledgement:
1853383Sn_hibma#      This product includes software developed by Christopher G. Demetriou.
1953383Sn_hibma# 4. The name of the author may not be used to endorse or promote products
2053383Sn_hibma#    derived from this software without specific prior written permission
2153383Sn_hibma#
2253383Sn_hibma# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
2353383Sn_hibma# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
2453383Sn_hibma# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
2553383Sn_hibma# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
2653383Sn_hibma# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
2753383Sn_hibma# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2853383Sn_hibma# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2953383Sn_hibma# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3053383Sn_hibma# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
3153383Sn_hibma# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3253383Sn_hibma#
3353383Sn_hibmaBEGIN {
3453383Sn_hibma	nproducts = nvendors = 0
3553383Sn_hibma	dfile="usbdevs_data.h"
3653383Sn_hibma	hfile="usbdevs.h"
3753383Sn_hibma}
3853383Sn_hibmaNR == 1 {
3953383Sn_hibma	VERSION = $0
4053383Sn_hibma	gsub("\\$", "", VERSION)
4153383Sn_hibma
4253383Sn_hibma	if (os == "NetBSD")
4353383Sn_hibma		printf("/*\t\$NetBSD\$\t*/\n\n") > dfile
4453383Sn_hibma	else if (os == "FreeBSD")
4553383Sn_hibma		printf("/*\t\$FreeBSD\$\t*/\n\n") > dfile
4653383Sn_hibma	else if (os == "OpenBSD")
4753383Sn_hibma		printf("/*\t\$OpenBSD\$\t*/\n\n") > dfile
4853383Sn_hibma	else
4953383Sn_hibma		printf("/* ??? */\n\n") > dfile
5053383Sn_hibma	printf("/*\n") > dfile
5153383Sn_hibma	printf(" * THIS FILE IS AUTOMATICALLY GENERATED.  DO NOT EDIT.\n") \
5253383Sn_hibma	    > dfile
5353383Sn_hibma	printf(" *\n") > dfile
5453383Sn_hibma	printf(" * generated from:\n") > dfile
5553383Sn_hibma	printf(" *\t%s\n", VERSION) > dfile
5653383Sn_hibma	printf(" */\n") > dfile
5753383Sn_hibma
5853383Sn_hibma	if (os == "NetBSD")
5953383Sn_hibma		printf("/*\t\$NetBSD\$\t*/\n\n") > hfile
6053383Sn_hibma	else if (os == "FreeBSD")
6153383Sn_hibma		printf("/*\t\$FreeBSD\$\t*/\n\n") > hfile
6253383Sn_hibma	else if (os == "OpenBSD")
6353383Sn_hibma		printf("/*\t\$OpenBSD\$\t*/\n\n") > hfile
6453383Sn_hibma	else
6553383Sn_hibma		printf("/* ??? */\n\n") > hfile
6653383Sn_hibma	printf("/*\n") > hfile
6753383Sn_hibma	printf(" * THIS FILE IS AUTOMATICALLY GENERATED.  DO NOT EDIT.\n") \
6853383Sn_hibma	    > hfile
6953383Sn_hibma	printf(" *\n") > hfile
7053383Sn_hibma	printf(" * generated from:\n") > hfile
7153383Sn_hibma	printf(" *\t%s\n", VERSION) > hfile
7253383Sn_hibma	printf(" */\n") > hfile
7353383Sn_hibma
7453383Sn_hibma	next
7553383Sn_hibma}
7653383Sn_hibma$1 == "vendor" {
7753383Sn_hibma	nvendors++
7853383Sn_hibma
7953383Sn_hibma	vendorindex[$2] = nvendors;		# record index for this name, for later.
8053383Sn_hibma	vendors[nvendors, 1] = $2;		# name
8153383Sn_hibma	vendors[nvendors, 2] = $3;		# id
8253383Sn_hibma	printf("#define\tUSB_VENDOR_%s\t%s\t", vendors[nvendors, 1],
8353383Sn_hibma	    vendors[nvendors, 2]) > hfile
8453383Sn_hibma
8553383Sn_hibma	i = 3; f = 4;
8653383Sn_hibma
8753383Sn_hibma	# comments
8853383Sn_hibma	ocomment = oparen = 0
8953383Sn_hibma	if (f <= NF) {
9053383Sn_hibma		printf("\t/* ") > hfile
9153383Sn_hibma		ocomment = 1;
9253383Sn_hibma	}
9353383Sn_hibma	while (f <= NF) {
9453383Sn_hibma		if ($f == "#") {
9553383Sn_hibma			printf("(") > hfile
9653383Sn_hibma			oparen = 1
9753383Sn_hibma			f++
9853383Sn_hibma			continue
9953383Sn_hibma		}
10053383Sn_hibma		if (oparen) {
10153383Sn_hibma			printf("%s", $f) > hfile
10253383Sn_hibma			if (f < NF)
10353383Sn_hibma				printf(" ") > hfile
10453383Sn_hibma			f++
10553383Sn_hibma			continue
10653383Sn_hibma		}
10753383Sn_hibma		vendors[nvendors, i] = $f
10853383Sn_hibma		printf("%s", vendors[nvendors, i]) > hfile
10953383Sn_hibma		if (f < NF)
11053383Sn_hibma			printf(" ") > hfile
11153383Sn_hibma		i++; f++;
11253383Sn_hibma	}
11353383Sn_hibma	if (oparen)
11453383Sn_hibma		printf(")") > hfile
11553383Sn_hibma	if (ocomment)
11653383Sn_hibma		printf(" */") > hfile
11753383Sn_hibma	printf("\n") > hfile
11853383Sn_hibma
11953383Sn_hibma	next
12053383Sn_hibma}
12153383Sn_hibma$1 == "product" {
12253383Sn_hibma	nproducts++
12353383Sn_hibma
12453383Sn_hibma	products[nproducts, 1] = $2;		# vendor name
12553383Sn_hibma	products[nproducts, 2] = $3;		# product id
12653383Sn_hibma	products[nproducts, 3] = $4;		# id
12753383Sn_hibma	printf("#define\tUSB_PRODUCT_%s_%s\t%s\t", products[nproducts, 1],
12853383Sn_hibma	    products[nproducts, 2], products[nproducts, 3]) > hfile
12953383Sn_hibma
13053383Sn_hibma	i=4; f = 5;
13153383Sn_hibma
13253383Sn_hibma	# comments
13353383Sn_hibma	ocomment = oparen = 0
13453383Sn_hibma	if (f <= NF) {
13553383Sn_hibma		printf("\t/* ") > hfile
13653383Sn_hibma		ocomment = 1;
13753383Sn_hibma	}
13853383Sn_hibma	while (f <= NF) {
13953383Sn_hibma		if ($f == "#") {
14053383Sn_hibma			printf("(") > hfile
14153383Sn_hibma			oparen = 1
14253383Sn_hibma			f++
14353383Sn_hibma			continue
14453383Sn_hibma		}
14553383Sn_hibma		if (oparen) {
14653383Sn_hibma			printf("%s", $f) > hfile
14753383Sn_hibma			if (f < NF)
14853383Sn_hibma				printf(" ") > hfile
14953383Sn_hibma			f++
15053383Sn_hibma			continue
15153383Sn_hibma		}
15253383Sn_hibma		products[nproducts, i] = $f
15353383Sn_hibma		printf("%s", products[nproducts, i]) > hfile
15453383Sn_hibma		if (f < NF)
15553383Sn_hibma			printf(" ") > hfile
15653383Sn_hibma		i++; f++;
15753383Sn_hibma	}
15853383Sn_hibma	if (oparen)
15953383Sn_hibma		printf(")") > hfile
16053383Sn_hibma	if (ocomment)
16153383Sn_hibma		printf(" */") > hfile
16253383Sn_hibma	printf("\n") > hfile
16353383Sn_hibma
16453383Sn_hibma	next
16553383Sn_hibma}
16653383Sn_hibma{
16753383Sn_hibma	if ($0 == "")
16853383Sn_hibma		blanklines++
16953383Sn_hibma	print $0 > hfile
17053383Sn_hibma	if (blanklines < 2)
17153383Sn_hibma		print $0 > dfile
17253383Sn_hibma}
17353383Sn_hibmaEND {
17453383Sn_hibma	# print out the match tables
17553383Sn_hibma
17653383Sn_hibma	printf("\n") > dfile
17753383Sn_hibma
17893569Sjoe	printf("const struct usb_knowndev usb_knowndevs[] = {\n") > dfile
17953383Sn_hibma	for (i = 1; i <= nproducts; i++) {
18053383Sn_hibma		printf("\t{\n") > dfile
18153383Sn_hibma		printf("\t    USB_VENDOR_%s, USB_PRODUCT_%s_%s,\n",
18253383Sn_hibma		    products[i, 1], products[i, 1], products[i, 2]) \
18353383Sn_hibma		    > dfile
18453383Sn_hibma		printf("\t    ") > dfile
18553383Sn_hibma		printf("0") > dfile
18653383Sn_hibma		printf(",\n") > dfile
18753383Sn_hibma
18853383Sn_hibma		vendi = vendorindex[products[i, 1]];
18953383Sn_hibma		printf("\t    \"") > dfile
19053383Sn_hibma		j = 3;
19153383Sn_hibma		needspace = 0;
19253383Sn_hibma		while (vendors[vendi, j] != "") {
19353383Sn_hibma			if (needspace)
19453383Sn_hibma				printf(" ") > dfile
19553383Sn_hibma			printf("%s", vendors[vendi, j]) > dfile
19653383Sn_hibma			needspace = 1
19753383Sn_hibma			j++
19853383Sn_hibma		}
19953383Sn_hibma		printf("\",\n") > dfile
20053383Sn_hibma
20153383Sn_hibma		printf("\t    \"") > dfile
20253383Sn_hibma		j = 4;
20353383Sn_hibma		needspace = 0;
20453383Sn_hibma		while (products[i, j] != "") {
20553383Sn_hibma			if (needspace)
20653383Sn_hibma				printf(" ") > dfile
20753383Sn_hibma			printf("%s", products[i, j]) > dfile
20853383Sn_hibma			needspace = 1
20953383Sn_hibma			j++
21053383Sn_hibma		}
21153383Sn_hibma		printf("\",\n") > dfile
21253383Sn_hibma		printf("\t},\n") > dfile
21353383Sn_hibma	}
21453383Sn_hibma	for (i = 1; i <= nvendors; i++) {
21553383Sn_hibma		printf("\t{\n") > dfile
21653383Sn_hibma		printf("\t    USB_VENDOR_%s, 0,\n", vendors[i, 1]) \
21753383Sn_hibma		    > dfile
21853383Sn_hibma		printf("\t    USB_KNOWNDEV_NOPROD,\n") \
21953383Sn_hibma		    > dfile
22053383Sn_hibma		printf("\t    \"") > dfile
22153383Sn_hibma		j = 3;
22253383Sn_hibma		needspace = 0;
22353383Sn_hibma		while (vendors[i, j] != "") {
22453383Sn_hibma			if (needspace)
22553383Sn_hibma				printf(" ") > dfile
22653383Sn_hibma			printf("%s", vendors[i, j]) > dfile
22753383Sn_hibma			needspace = 1
22853383Sn_hibma			j++
22953383Sn_hibma		}
23053383Sn_hibma		printf("\",\n") > dfile
23153383Sn_hibma		printf("\t    NULL,\n") > dfile
23253383Sn_hibma		printf("\t},\n") > dfile
23353383Sn_hibma	}
23453383Sn_hibma	printf("\t{ 0, 0, 0, NULL, NULL, }\n") > dfile
23553383Sn_hibma	printf("};\n") > dfile
23653383Sn_hibma}
237