Subject: toolchain/23177: devlist2h.awk errors and warnings with GNU Awk 3.1.3
To: None <gnats-bugs@gnats.NetBSD.org>
From: dieter <dieter.NetBSD@pandora.be>
List: netbsd-bugs
Date: 10/17/2003 16:55:44
>Number:         23177
>Category:       toolchain
>Synopsis:       devlist2h.awk errors and warnings with GNU Awk 3.1.3
>Confidential:   no
>Severity:       critical
>Priority:       medium
>Responsible:    toolchain-manager
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Fri Oct 17 14:58:00 UTC 2003
>Closed-Date:
>Last-Modified:
>Originator:     dieter Roelants
>Release:        NetBSD 1.6ZC
>Organization:

>Environment:
System: NetBSD okuma 1.6ZC NetBSD 1.6ZC (OKUMA) #70: Wed Oct 15 22:32:48 CEST 2003  root@okuma:/usr/src/sys/arch/i386/compile/OKUMA i386
Architecture: i386
Machine: i386
>Description:

	Since the GNU awk update in -current, some of the devlist2h.awk
	scripts (at least pcmcia and isapnp, I don't remember if
	there were others) let awk dump core with an abort signal.
	These and also other devlist2h.awk's produce a lot of
	warnings when run with --lint.


>How-To-Repeat:

	cd src/sys/dev/pcmcia
	awk --lint -f devlist2h.awk pcmciadevs
	(with GNU Awk 3.1.3)


>Fix:

	Attached are patches for:

	src/sys/arch/hp300/dev/devlist2h.awk
	src/sys/arch/hp700/dev/devlist2h.awk
	src/sys/dev/acpi/devlist2h.awk
	src/sys/dev/cardbus/devlist2h.awk
	src/sys/dev/eisa/devlist2h.awk
	src/sys/dev/isapnp/devlist2h.awk
	src/sys/dev/mca/devlist2h.awk
	src/sys/dev/mii/devlist2h.awk
	src/sys/dev/pci/devlist2h.awk
	src/sys/dev/pcmcia/devlist2h.awk
	src/sys/dev/tc/devlist2h.awk
	src/sys/dev/usb/devlist2h.awk

	I have verified that the patched scripts produce the same
	result as the in-tree header files. They do, except for
	src/sys/arch/hp700/dev/devlist2h.awk, which for some reason,
	unknown to me, prints its own ident string in the produced
	headers. (Well, I know why, because the script says so,
	but I don't know why this was done.)


--- src/sys/dev/acpi/devlist2h.awk	2003-02-04 02:42:32.000000000 +0100
+++ devlist2h.awk	2003-10-17 12:25:39.000000000 +0200
@@ -43,7 +43,7 @@
 	VERSION = $0
 	gsub("\\$", "", VERSION)

-	printf("/*\t\$NetBSD\$\t*/\n\n") > dfile
+	printf("/*\t$NetBSD$\t*/\n\n") > dfile
 	printf("/*\n") > dfile
 	printf(" * THIS FILE AUTOMATICALLY GENERATED.  DO NOT EDIT.\n") \
 	    > dfile
@@ -76,4 +76,6 @@
 		printf("\t},\n") > dfile
 	}
 	printf("};\n") > dfile
+
+	close(dfile)
 }

--- src/sys/dev/cardbus/devlist2h.awk	2001-02-07 11:05:37.000000000 +0100
+++ devlist2h.awk	2003-10-17 13:51:01.000000000 +0200
@@ -30,7 +30,7 @@
 # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #
 BEGIN {
-	nproducts = nvendors = 0
+	nproducts = nvendors = blanklines = 0
 	dfile="cardbusdevs_data.h"
 	hfile="cardbusdevs.h"
 }
@@ -38,7 +38,7 @@
 	VERSION = $0
 	gsub("\\$", "", VERSION)

-	printf("/*\t\$NetBSD\$\t*/\n\n") > dfile
+	printf("/*\t$NetBSD$\t*/\n\n") > dfile
 	printf("/*\n") > dfile
 	printf(" * THIS FILE AUTOMATICALLY GENERATED.  DO NOT EDIT.\n") \
 	    > dfile
@@ -47,7 +47,7 @@
 	printf(" *\t%s\n", VERSION) > dfile
 	printf(" */\n") > dfile

-	printf("/*\t\$NetBSD\$\t*/\n\n") > hfile
+	printf("/*\t$NetBSD$\t*/\n\n") > hfile
 	printf("/*\n") > hfile
 	printf(" * THIS FILE AUTOMATICALLY GENERATED.  DO NOT EDIT.\n") \
 	    > hfile
@@ -58,7 +58,7 @@

 	next
 }
-$1 == "vendor" {
+NF > 0 && $1 == "vendor" {
 	nvendors++

 	vendorindex[$2] = nvendors;		# record index for this name, for later.
@@ -103,7 +103,7 @@

 	next
 }
-$1 == "product" {
+NF > 0 && $1 == "product" {
 	nproducts++

 	products[nproducts, 1] = $2;		# vendor name
@@ -183,7 +183,7 @@
 		printf("\t    \"") > dfile
 		j = 3;
 		needspace = 0;
-		while (vendors[vendi, j] != "") {
+		while ((vendi, j) in vendors) {
 			if (needspace)
 				printf(" ") > dfile
 			printf("%s", vendors[vendi, j]) > dfile
@@ -195,7 +195,7 @@
 		printf("\t    \"") > dfile
 		j = 4;
 		needspace = 0;
-		while (products[i, j] != "") {
+		while ((i, j) in products) {
 			if (needspace)
 				printf(" ") > dfile
 			printf("%s", products[i, j]) > dfile
@@ -214,7 +214,7 @@
 		printf("\t    \"") > dfile
 		j = 3;
 		needspace = 0;
-		while (vendors[i, j] != "") {
+		while ((i, j) in vendors) {
 			if (needspace)
 				printf(" ") > dfile
 			printf("%s", vendors[i, j]) > dfile
@@ -227,4 +227,7 @@
 	}
 	printf("\t{ 0, 0, 0, NULL, NULL, }\n") > dfile
 	printf("};\n") > dfile
+
+	close(dfile)
+	close(hfile)
 }

--- src/sys/dev/eisa/devlist2h.awk	2001-01-18 21:28:25.000000000 +0100
+++ devlist2h.awk	2003-10-17 12:59:55.000000000 +0200
@@ -30,7 +30,7 @@
 # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #
 BEGIN {
-	nproducts = nvendors = 0
+	nproducts = nvendors = blanklines = 0
 	dfile="eisadevs_data.h"
 	hfile="eisadevs.h"
 }
@@ -38,7 +38,7 @@
 	VERSION = $0
 	gsub("\\$", "", VERSION)

-	printf("/*\t\$NetBSD\$\t*/\n\n") > dfile
+	printf("/*\t$NetBSD$\t*/\n\n") > dfile
 	printf("/*\n") > dfile
 	printf(" * THIS FILE AUTOMATICALLY GENERATED.  DO NOT EDIT.\n") \
 	    > dfile
@@ -47,7 +47,7 @@
 	printf(" *\t%s\n", VERSION) > dfile
 	printf(" */\n") > dfile

-	printf("/*\t\$NetBSD\$\t*/\n\n") > hfile
+	printf("/*\t$NetBSD$\t*/\n\n") > hfile
 	printf("/*\n") > hfile
 	printf(" * THIS FILE AUTOMATICALLY GENERATED.  DO NOT EDIT.\n") \
 	    > hfile
@@ -58,7 +58,7 @@

 	next
 }
-$1 == "vendor" {
+NF > 0 && $1 == "vendor" {
 	nvendors++

 	vendorindex[$2] = nvendors;	# record index for this name, for later.
@@ -86,7 +86,7 @@

 	next
 }
-$1 == "product" {
+NF > 0 && $1 == "product" {
 	nproducts++

 	products[nproducts, 1] = $2;		# vendor name
@@ -96,7 +96,7 @@

 	i = vendorindex[products[nproducts, 1]]; j = 2;
 	needspace = 0;
-	while (vendors[i, j] != "") {
+	while ((i, j) in vendors) {
 		if (needspace)
 			printf(" ") > hfile
 		printf("%s", vendors[i, j]) > hfile
@@ -176,7 +176,7 @@
 		printf("\t    \"") > dfile
 		j = 2;
 		needspace = 0;
-		while (vendors[i, j] != "") {
+		while ((i, j) in vendors) {
 			if (needspace)
 				printf(" ") > dfile
 			printf("%s", vendors[i, j]) > dfile
@@ -188,4 +188,7 @@
 	}
 	printf("\t{ 0, NULL, NULL, }\n") > dfile
 	printf("};\n") > dfile
+
+	close(dfile)
+	close(hfile)
 }

--- src/sys/arch/hp300/dev/devlist2h.awk	1998-01-09 07:59:10.000000000 +0100
+++ devlist2h.awk	2003-10-17 12:06:51.000000000 +0200
@@ -34,6 +34,7 @@
 BEGIN {
 	ndevices = 0
 	fbid = 0
+	blanklines = 0
 	dfile="diodevs_data.h"
 	hfile="diodevs.h"
 }
@@ -41,7 +42,7 @@
 	VERSION = $0
 	gsub("\\$", "", VERSION)

-	printf("/*\t\$NetBSD\$\t*/\n\n") > dfile
+	printf("/*\t$NetBSD$\t*/\n\n") > dfile
 	printf("/*\n") > dfile
 	printf(" * THIS FILE AUTOMATICALLY GENERATED.  DO NOT EDIT.\n") \
 	    > dfile
@@ -50,7 +51,7 @@
 	printf(" *\t%s\n", VERSION) > dfile
 	printf(" */\n") > dfile

-	printf("/*\t\$NetBSD\$\t*/\n\n") > hfile
+	printf("/*\t$NetBSD$\t*/\n\n") > hfile
 	printf("/*\n") > hfile
 	printf(" * THIS FILE AUTOMATICALLY GENERATED.  DO NOT EDIT.\n") \
 	    > hfile
@@ -61,7 +62,7 @@

 	next
 }
-$1 == "device" {
+NF > 0 && $1 == "device" {
 	ndevices++

 	devices[ndevices, 1] = $2		# nickname
@@ -95,7 +96,7 @@

 	next
 }
-$1 == "framebuffer" {
+NF > 0 && $1 == "framebuffer" {
 	ndevices++

 	devices[ndevices, 1] = $2		# nickname
@@ -165,4 +166,7 @@
 	printf("};\n") > dfile

 	printf("#endif /* DIOVERBOSE */\n") > dfile
+
+	close(dfile)
+	close(hfile)
 }

--- src/sys/arch/hp700/dev/devlist2h.awk	2002-08-05 22:58:36.000000000 +0200
+++ devlist2h.awk	2003-10-17 12:09:51.000000000 +0200
@@ -36,6 +36,7 @@
 	ncpu = 0;
 	cpuh="cpudevs.h";
 	cpud="cpudevs_data.h";
+	busted = 0;
 	SUBSEP = "_";
 }

@@ -133,5 +134,8 @@
 		exit(1);
 	}
 	printf("{ -1 }\n") > cpud;
+
+	close(cpuh)
+	close(cpud)
 }

--- src/sys/dev/isapnp/devlist2h.awk	2001-11-13 08:52:41.000000000 +0100
+++ devlist2h.awk	2003-10-17 13:07:59.000000000 +0200
@@ -64,7 +64,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #
-function collectline(f, line) {
+function collectline(f) {
 	oparen = 0
 	line = ""
 	while (f <= NF) {
@@ -104,13 +104,13 @@
 		printf("\tconst struct isapnp_matchinfo *devcompat;\n") > hfile
 		printf("\tint ncompat;\n") > hfile
 		printf("};\n\n") > hfile
-		printf("\n#include <sys/cdefs.h>\n__KERNEL_RCSID(0, \"\$NetBSD\$\");\n\n") > cfile
+		printf("\n#include <sys/cdefs.h>\n__KERNEL_RCSID(0, \"$NetBSD$\");\n\n") > cfile
 		printf("#include <sys/param.h>\n") > cfile
 		printf("#include <dev/isapnp/isapnpdevs.h>\n\n") > cfile
 	}
 }
 BEGIN {
-	decl = done = ncompat = nlogicals = ndriver = 0
+	decl = done = ncompats = nlogicals = ndriver = blanklines = 0
 	cfile="isapnpdevs.c"
 	hfile="isapnpdevs.h"
 }
@@ -118,7 +118,7 @@
 	VERSION = $0
 	gsub("\\$", "", VERSION)

-	printf("/*\t\$NetBSD\$\t*/\n\n") > cfile
+	printf("/*\t$NetBSD$\t*/\n\n") > cfile
 	printf("/*\n") > cfile
 	printf(" * THIS FILE IS AUTOMATICALLY GENERATED.  DO NOT EDIT.\n") \
 	    > cfile
@@ -127,7 +127,7 @@
 	printf(" *\t%s\n", VERSION) > cfile
 	printf(" */\n") > cfile

-	printf("/*\t\$NetBSD\$\t*/\n\n") > hfile
+	printf("/*\t$NetBSD$\t*/\n\n") > hfile
 	printf("/*\n") > hfile
 	printf(" * THIS FILE IS AUTOMATICALLY GENERATED.  DO NOT EDIT.\n") \
 	    > hfile
@@ -138,36 +138,36 @@
 	printf("\n") > hfile
 	next
 }
-$1 == "driver" {
+NF > 0 && $1 == "driver" {
 	checkdecl()
 	ndriver++

 	driverindex[$2] = ndriver;
 	driver[ndriver, 1] = $2;
-	driver[ndriver, 2] = collectline(3, line);
+	driver[ndriver, 2] = collectline(3);
 	printf("/* %s */\n", driver[ndriver, 2]) > hfile
 	printf("extern const struct isapnp_devinfo isapnp_%s_devinfo;\n",
 	    driver[ndriver, 1]) > hfile
 	next
 }
-$1 == "devlogic" {
+NF > 0 && $1 == "devlogic" {
 	checkdecl()
 	nlogicals++

 	logicals[nlogicals, 1] = $2;
 	logicals[nlogicals, 2] = $3;
 	logicals[nlogicals, 3] = $4;
-	logicals[nlogicals, 4] = collectline(5, line);
+	logicals[nlogicals, 4] = collectline(5);
 	next
 }
-$1 == "devcompat" {
+NF > 0 && $1 == "devcompat" {
 	checkdecl()
 	ncompats++

 	compats[ncompats, 1] = $2;
 	compats[ncompats, 2] = $3;
 	compats[ncompats, 3] = $4;
-	compats[ncompats, 4] = collectline(5, line);
+	compats[ncompats, 4] = collectline(5);
 	next
 }
 {
@@ -228,4 +228,7 @@
 		printf("};\n\n") > cfile;

 	}
+
+	close(cfile)
+	close(hfile)
 }

--- src/sys/dev/mca/devlist2h.awk	2000-05-11 17:42:04.000000000 +0200
+++ devlist2h.awk	2003-10-17 13:11:52.000000000 +0200
@@ -33,7 +33,7 @@
 # Adapted for MCA needs by Jaromir Dolecek.

 BEGIN {
-	nproducts = nvendors = 0
+	nproducts = nvendors = blanklines = 0
 	dfile="mcadevs_data.h"
 	hfile="mcadevs.h"
 	FS=" "
@@ -44,7 +44,7 @@
 	VERSION = $0
 	gsub("\\$", "", VERSION)

-	printf("/*\t\$NetBSD\$\t*/\n\n") > dfile
+	printf("/*\t$NetBSD$\t*/\n\n") > dfile
 	printf("/*\n") > dfile
 	printf(" * THIS FILE AUTOMATICALLY GENERATED.  DO NOT EDIT.\n") \
 	    > dfile
@@ -53,7 +53,7 @@
 	printf(" *\t%s\n", VERSION) > dfile
 	printf(" */\n") > dfile

-	printf("/*\t\$NetBSD\$\t*/\n\n") > hfile
+	printf("/*\t$NetBSD$\t*/\n\n") > hfile
 	printf("/*\n") > hfile
 	printf(" * THIS FILE AUTOMATICALLY GENERATED.  DO NOT EDIT.\n") \
 	    > hfile
@@ -65,7 +65,7 @@
 	next
 }

-$1 == "product" {
+NF > 0 && $1 == "product" {
 	nproducts++

 	alias = $3
@@ -110,4 +110,7 @@
 	}
 	printf("    { 0, NULL, }\n") > dfile
 	printf("};\n") > dfile
+
+	close(dfile)
+	close(hfile)
 }


--- src/sys/dev/mii/devlist2h.awk	2000-05-08 15:25:35.000000000 +0200
+++ devlist2h.awk	2003-10-17 15:21:42.000000000 +0200
@@ -64,7 +64,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #
-function collectline(f, line) {
+function collectline(f) {
 	oparen = 0
 	line = ""
 	while (f <= NF) {
@@ -91,7 +91,7 @@
 	return line
 }
 BEGIN {
-	nmodels = nouis = 0
+	nmodels = blanklines = firstdone = 0
 	hfile="miidevs.h"
 	dfile="miidevs_data.h"
 }
@@ -99,7 +99,7 @@
 	VERSION = $0
 	gsub("\\$", "", VERSION)

-	printf("/*\t\$NetBSD\$\t*/\n\n") > hfile
+	printf("/*\t$NetBSD$\t*/\n\n") > hfile
 	printf("/*\n") > hfile
 	printf(" * THIS FILE AUTOMATICALLY GENERATED.  DO NOT EDIT.\n") \
 	    > hfile
@@ -108,7 +108,7 @@
 	printf(" *\t%s\n", VERSION) > hfile
 	printf(" */\n") > hfile

-	printf("/*\t\$NetBSD\$\t*/\n\n") > dfile
+	printf("/*\t$NetBSD$\t*/\n\n") > dfile
 	printf("/*\n") > dfile
 	printf(" * THIS FILE AUTOMATICALLY GENERATED.  DO NOT EDIT.\n") \
 	    > dfile
@@ -119,20 +119,14 @@

 	next
 }
-$1 == "oui" {
-	nuios++
+NF > 0 && $1 == "oui" {

-	ouiindex[$2] = nouis;		# record index for this name, for later.
-
-	ouis[nouis, 1] = $2;		# name
-	ouis[nouis, 2] = $3;		# id
-	printf("#define\tMII_OUI_%s\t%s\t", ouis[nouis, 1],
-	    ouis[nouis, 2]) > hfile
-	ouis[nouis, 3] = collectline(4, line)
-	printf("/* %s */\n", ouis[nouis, 3]) > hfile
+	# $2 is the name, $3 the id
+	printf("#define\tMII_OUI_%s\t%s\t", $2, $3) > hfile
+	printf("/* %s */\n", collectline(4)) > hfile
 	next
 }
-$1 == "model" {
+NF > 0 && $1 == "model" {
 	nmodels++

 	models[nmodels, 1] = $2;		# oui name
@@ -142,7 +136,7 @@
 	printf("#define\tMII_MODEL_%s_%s\t%s\n", models[nmodels, 1],
 	    models[nmodels, 2], models[nmodels, 3]) > hfile

-	models[nmodels, 4] = collectline(5, line)
+	models[nmodels, 4] = collectline(5)

 	printf("#define\tMII_STR_%s_%s\t\"%s\"\n",
 	    models[nmodels, 1], models[nmodels, 2],
@@ -168,4 +162,7 @@
 END {
 	printf(" { 0, 0, NULL }\n") > dfile
 	printf("};\n") > dfile
+
+	close(hfile)
+	close(dfile)
 }

--- src/sys/dev/pci/devlist2h.awk	2001-01-18 14:03:22.000000000 +0100
+++ devlist2h.awk	2003-10-17 13:36:41.000000000 +0200
@@ -30,7 +30,7 @@
 # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #
 BEGIN {
-	nproducts = nvendors = 0
+	nproducts = nvendors = blanklines = 0
 	dfile="pcidevs_data.h"
 	hfile="pcidevs.h"
 }
@@ -38,7 +38,7 @@
 	VERSION = $0
 	gsub("\\$", "", VERSION)

-	printf("/*\t\$NetBSD\$\t*/\n\n") > dfile
+	printf("/*\t$NetBSD$\t*/\n\n") > dfile
 	printf("/*\n") > dfile
 	printf(" * THIS FILE AUTOMATICALLY GENERATED.  DO NOT EDIT.\n") \
 	    > dfile
@@ -47,7 +47,7 @@
 	printf(" *\t%s\n", VERSION) > dfile
 	printf(" */\n") > dfile

-	printf("/*\t\$NetBSD\$\t*/\n\n") > hfile
+	printf("/*\t$NetBSD$\t*/\n\n") > hfile
 	printf("/*\n") > hfile
 	printf(" * THIS FILE AUTOMATICALLY GENERATED.  DO NOT EDIT.\n") \
 	    > hfile
@@ -58,7 +58,7 @@

 	next
 }
-$1 == "vendor" {
+NF > 0 && $1 == "vendor" {
 	nvendors++

 	vendorindex[$2] = nvendors;		# record index for this name, for later.
@@ -103,7 +103,7 @@

 	next
 }
-$1 == "product" {
+NF > 0 && $1 == "product" {
 	nproducts++

 	products[nproducts, 1] = $2;		# vendor name
@@ -174,7 +174,7 @@
 		printf("\t    \"") > dfile
 		j = 3;
 		needspace = 0;
-		while (vendors[vendi, j] != "") {
+		while ((vendi, j) in vendors) {
 			if (needspace)
 				printf(" ") > dfile
 			printf("%s", vendors[vendi, j]) > dfile
@@ -186,7 +186,7 @@
 		printf("\t    \"") > dfile
 		j = 4;
 		needspace = 0;
-		while (products[i, j] != "") {
+		while ((i, j) in products) {
 			if (needspace)
 				printf(" ") > dfile
 			printf("%s", products[i, j]) > dfile
@@ -205,7 +205,7 @@
 		printf("\t    \"") > dfile
 		j = 3;
 		needspace = 0;
-		while (vendors[i, j] != "") {
+		while ((i, j) in vendors) {
 			if (needspace)
 				printf(" ") > dfile
 			printf("%s", vendors[i, j]) > dfile
@@ -218,4 +218,7 @@
 	}
 	printf("\t{ 0, 0, 0, NULL, NULL, }\n") > dfile
 	printf("};\n") > dfile
+
+	close(dfile)
+	close(hfile)
 }

--- src/sys/dev/pcmcia/devlist2h.awk	2003-10-15 13:37:19.000000000 +0200
+++ devlist2h.awk	2003-10-17 14:00:40.000000000 +0200
@@ -64,7 +64,7 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #
-function collectline(f, line) {
+function collectline(f) {
 	oparen = 0
 	line = ""
 	while (f <= NF) {
@@ -91,7 +91,7 @@
 	return line
 }
 BEGIN {
-	nproducts = nvendors = 0
+	nproducts = nvendors = blanklines = 0
 	dfile="pcmciadevs_data.h"
 	hfile="pcmciadevs.h"
 }
@@ -99,7 +99,7 @@
 	VERSION = $0
 	gsub("\\$", "", VERSION)

-	printf("/*\t\$NetBSD\$\t*/\n\n") > dfile
+	printf("/*\t$NetBSD$\t*/\n\n") > dfile
 	printf("/*\n") > dfile
 	printf(" * THIS FILE AUTOMATICALLY GENERATED.  DO NOT EDIT.\n") \
 	    > dfile
@@ -108,7 +108,7 @@
 	printf(" *\t%s\n", VERSION) > dfile
 	printf(" */\n") > dfile

-	printf("/*\t\$NetBSD\$\t*/\n\n") > hfile
+	printf("/*\t$NetBSD$\t*/\n\n") > hfile
 	printf("/*\n") > hfile
 	printf(" * THIS FILE AUTOMATICALLY GENERATED.  DO NOT EDIT.\n") \
 	    > hfile
@@ -119,7 +119,7 @@

 	next
 }
-$1 == "vendor" {
+NF > 0 && $1 == "vendor" {
 	nvendors++

 	vendorindex[$2] = nvendors;		# record index for this name, for later.
@@ -127,29 +127,29 @@
 	vendors[nvendors, 2] = $3;		# id
 	printf("#define\tPCMCIA_VENDOR_%s\t%s\t", vendors[nvendors, 1],
 	    vendors[nvendors, 2]) > hfile
-	vendors[nvendors, 3] = collectline(4, line)
+	vendors[nvendors, 3] = collectline(4)
 	printf("/* %s */\n", vendors[nvendors, 3]) > hfile
 	next
 }
-$1 == "product" {
+NF > 0 && $1 == "product" {
 	nproducts++

 	products[nproducts, 1] = $2;		# vendor name
 	products[nproducts, 2] = $3;		# product id
 	products[nproducts, 3] = $4;		# id

-	f = 5;
+	field = 5;

 	if ($4 == "{") {
 		products[nproducts, 3] = -1
 		z = "{ "
 		for (i = 0; i < 4; i++) {
-			if (f <= NF) {
-				gsub("&sp", " ", $f)
-				gsub("&tab", "\t", $f)
-				gsub("&nl", "\n", $f)
-				z = z $f " "
-				f++
+			if (field <= NF) {
+				gsub("&sp", " ", $field)
+				gsub("&tab", "\t", $field)
+				gsub("&nl", "\n", $field)
+				z = z $field " "
+				field++
 			}
 			else {
 				if (i == 3)
@@ -158,8 +158,8 @@
 					z = z "NULL, "
 			}
 		}
-		products[nproducts, 4] = z $f
-		f++
+		products[nproducts, 4] = z $field
+		field++
 	}
 	else {
 		products[nproducts, 4] = "{ NULL, NULL, NULL, NULL }"
@@ -170,7 +170,7 @@
 	printf("#define\tPCMCIA_PRODUCT_%s_%s\t%s\n", products[nproducts, 1],
 	    products[nproducts, 2], products[nproducts, 3]) > hfile

-	products[nproducts, 5] = collectline(f, line)
+	products[nproducts, 5] = collectline(field)

 	printf("#define\tPCMCIA_STR_%s_%s\t\"%s\"\n",
 	    products[nproducts, 1], products[nproducts, 2],
@@ -222,8 +222,13 @@
 		printf("0") > dfile
 		printf(",\n") > dfile

-		vendi = vendorindex[products[i, 1]];
-		printf("\t    \"%s\",\n", vendors[vendi, 3]) > dfile
+		if (products[i, 1] in vendorindex) {
+			vendi = vendorindex[products[i, 1]]
+			vendname = vendors[vendi, 3]
+		}
+		else
+			vendname = ""
+		printf("\t    \"%s\",\n", vendname) > dfile
 		printf("\t    \"%s\",\t}\n", products[i, 5]) > dfile
 		printf("\t,\n") > dfile
 	}
@@ -239,4 +244,6 @@
 	}
 	printf("\t{ 0, 0, { NULL, NULL, NULL, NULL }, 0, NULL, NULL, }\n") > dfile
 	printf("};\n") > dfile
+	close(dfile)
+	close(hfile)
 }

--- src/sys/dev/tc/devlist2h.awk	1998-01-09 07:56:23.000000000 +0100
+++ devlist2h.awk	2003-10-17 13:42:08.000000000 +0200
@@ -30,7 +30,7 @@
 # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #
 BEGIN {
-	nproducts = 0
+	nproducts = ndevices = blanklines = 0
 	dfile="tcdevs_data.h"
 	hfile="tcdevs.h"
 }
@@ -38,7 +38,7 @@
 	VERSION = $0
 	gsub("\\$", "", VERSION)

-	printf("/*\t\$NetBSD\$\t*/\n\n") > dfile
+	printf("/*\t$NetBSD$\t*/\n\n") > dfile
 	printf("/*\n") > dfile
 	printf(" * THIS FILE AUTOMATICALLY GENERATED.  DO NOT EDIT.\n") \
 	    > dfile
@@ -47,7 +47,7 @@
 	printf(" *\t%s\n", VERSION) > dfile
 	printf(" */\n") > dfile

-	printf("/*\t\$NetBSD\$\t*/\n\n") > hfile
+	printf("/*\t$NetBSD$\t*/\n\n") > hfile
 	printf("/*\n") > hfile
 	printf(" * THIS FILE AUTOMATICALLY GENERATED.  DO NOT EDIT.\n") \
 	    > hfile
@@ -58,7 +58,7 @@

 	next
 }
-$1 == "device" {
+NF > 0 && $1 == "device" {
 	ndevices++

 	devices[ndevices, 0] = $2;		# devices id
@@ -136,4 +136,7 @@
 	}
 	printf("\t{ NULL, NULL, NULL, }\n") > dfile
 	printf("};\n") > dfile
+
+	close(dfile)
+	close(hfile)
 }

--- src/sys/dev/usb/devlist2h.awk	2001-01-18 21:28:22.000000000 +0100
+++ devlist2h.awk	2003-10-17 13:47:30.000000000 +0200
@@ -30,7 +30,7 @@
 # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #
 BEGIN {
-	nproducts = nvendors = 0
+	nproducts = nvendors = blanklines = 0
 	dfile="usbdevs_data.h"
 	hfile="usbdevs.h"
 }
@@ -39,11 +39,11 @@
 	gsub("\\$", "", VERSION)

 	if (os == "NetBSD")
-		printf("/*\t\$NetBSD\$\t*/\n\n") > dfile
+		printf("/*\t$NetBSD$\t*/\n\n") > dfile
 	else if (os == "FreeBSD")
-		printf("/*\t\$FreeBSD\$\t*/\n\n") > dfile
+		printf("/*\t$FreeBSD$\t*/\n\n") > dfile
 	else if (os == "OpenBSD")
-		printf("/*\t\$OpenBSD\$\t*/\n\n") > dfile
+		printf("/*\t$OpenBSD$\t*/\n\n") > dfile
 	else
 		printf("/* ??? */\n\n") > dfile
 	printf("/*\n") > dfile
@@ -55,11 +55,11 @@
 	printf(" */\n") > dfile

 	if (os == "NetBSD")
-		printf("/*\t\$NetBSD\$\t*/\n\n") > hfile
+		printf("/*\t$NetBSD$\t*/\n\n") > hfile
 	else if (os == "FreeBSD")
-		printf("/*\t\$FreeBSD\$\t*/\n\n") > hfile
+		printf("/*\t$FreeBSD$\t*/\n\n") > hfile
 	else if (os == "OpenBSD")
-		printf("/*\t\$OpenBSD\$\t*/\n\n") > hfile
+		printf("/*\t$OpenBSD$\t*/\n\n") > hfile
 	else
 		printf("/* ??? */\n\n") > hfile
 	printf("/*\n") > hfile
@@ -72,7 +72,7 @@

 	next
 }
-$1 == "vendor" {
+NF > 0 && $1 == "vendor" {
 	nvendors++

 	vendorindex[$2] = nvendors;		# record index for this name, for later.
@@ -117,7 +117,7 @@

 	next
 }
-$1 == "product" {
+NF > 0 && $1 == "product" {
 	nproducts++

 	products[nproducts, 1] = $2;		# vendor name
@@ -188,7 +188,7 @@
 		printf("\t    \"") > dfile
 		j = 3;
 		needspace = 0;
-		while (vendors[vendi, j] != "") {
+		while ((vendi, j) in vendors) {
 			if (needspace)
 				printf(" ") > dfile
 			printf("%s", vendors[vendi, j]) > dfile
@@ -200,7 +200,7 @@
 		printf("\t    \"") > dfile
 		j = 4;
 		needspace = 0;
-		while (products[i, j] != "") {
+		while ((i, j)  in products) {
 			if (needspace)
 				printf(" ") > dfile
 			printf("%s", products[i, j]) > dfile
@@ -219,7 +219,7 @@
 		printf("\t    \"") > dfile
 		j = 3;
 		needspace = 0;
-		while (vendors[i, j] != "") {
+		while ((i, j) in vendors) {
 			if (needspace)
 				printf(" ") > dfile
 			printf("%s", vendors[i, j]) > dfile
@@ -232,4 +232,7 @@
 	}
 	printf("\t{ 0, 0, 0, NULL, NULL, }\n") > dfile
 	printf("};\n") > dfile
+
+	close(dfile)
+	close(hfile)
 }
>Release-Note:
>Audit-Trail:
>Unformatted: