jcs's openbsd hax
openbsd
1#! /usr/bin/awk -f
2# $OpenBSD: devlist2h.awk,v 1.8 2007/02/21 13:17:28 deraadt Exp $
3# $NetBSD: devlist2h.awk,v 1.2 1996/01/22 21:08:09 cgd Exp $
4#
5# Copyright (c) 1995, 1996 Christopher G. Demetriou
6# All rights reserved.
7#
8# Redistribution and use in source and binary forms, with or without
9# modification, are permitted provided that the following conditions
10# are met:
11# 1. Redistributions of source code must retain the above copyright
12# notice, this list of conditions and the following disclaimer.
13# 2. Redistributions in binary form must reproduce the above copyright
14# notice, this list of conditions and the following disclaimer in the
15# documentation and/or other materials provided with the distribution.
16# 3. All advertising materials mentioning features or use of this software
17# must display the following acknowledgement:
18# This product includes software developed by Christopher G. Demetriou.
19# 4. The name of the author may not be used to endorse or promote products
20# derived from this software without specific prior written permission
21#
22# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
23# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
26# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
27# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
31# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32#
33BEGIN {
34 nproducts = nvendor_dup = nvendors = 0
35 dfile="pcidevs_data.h"
36 hfile="pcidevs.h"
37}
38NR == 1 {
39 VERSION = $0
40 gsub("\\$", "", VERSION)
41
42 printf("/*\n") > dfile
43 printf(" * THIS FILE AUTOMATICALLY GENERATED. DO NOT EDIT.\n") \
44 > dfile
45 printf(" *\n") > dfile
46 printf(" * generated from:\n") > dfile
47 printf(" *\t%s\n", VERSION) > dfile
48 printf(" */\n\n") > dfile
49
50 printf("/*\n") > hfile
51 printf(" * THIS FILE AUTOMATICALLY GENERATED. DO NOT EDIT.\n") \
52 > hfile
53 printf(" *\n") > hfile
54 printf(" * generated from:\n") > hfile
55 printf(" *\t%s\n", VERSION) > hfile
56 printf(" */\n") > hfile
57
58 next
59}
60$1 == "vendor" {
61 nvendors++
62
63 if ($2 in vendorindex) {
64 printf("duplicate vendor name %s\n", $2);
65 nvendor_dup++;
66 }
67
68 vendorindex[$2] = nvendors; # record index for this name, for later.
69 vendors[nvendors, 1] = $2; # name
70 vendors[nvendors, 2] = $3; # id
71 printf("#define\tPCI_VENDOR_%s\t%s\t", vendors[nvendors, 1],
72 vendors[nvendors, 2]) > hfile
73
74 i = 3; f = 4;
75
76 # comments
77 ocomment = oparen = 0
78 if (f <= NF) {
79 printf("\t/* ") > hfile
80 ocomment = 1;
81 }
82 while (f <= NF) {
83 if ($f == "#") {
84 printf("(") > hfile
85 oparen = 1
86 f++
87 continue
88 }
89 if (oparen) {
90 printf("%s", $f) > hfile
91 if (f < NF)
92 printf(" ") > hfile
93 f++
94 continue
95 }
96 vendors[nvendors, i] = $f
97 printf("%s", vendors[nvendors, i]) > hfile
98 if (f < NF)
99 printf(" ") > hfile
100 i++; f++;
101 }
102 if (oparen)
103 printf(")") > hfile
104 if (ocomment)
105 printf(" */") > hfile
106 printf("\n") > hfile
107
108 next
109}
110$1 == "product" {
111 nproducts++
112
113 products[nproducts, 1] = $2; # vendor name
114 products[nproducts, 2] = $3; # product id
115 products[nproducts, 3] = $4; # id
116 printf("#define\tPCI_PRODUCT_%s_%s\t%s\t", products[nproducts, 1],
117 products[nproducts, 2], products[nproducts, 3]) > hfile
118
119 i=4; f = 5;
120
121 # comments
122 ocomment = oparen = 0
123 if (f <= NF) {
124 printf("\t/* ") > hfile
125 ocomment = 1;
126 }
127 while (f <= NF) {
128 if ($f == "#") {
129 printf("(") > hfile
130 oparen = 1
131 f++
132 continue
133 }
134 if (oparen) {
135 printf("%s", $f) > hfile
136 if (f < NF)
137 printf(" ") > hfile
138 f++
139 continue
140 }
141 products[nproducts, i] = $f
142 printf("%s", products[nproducts, i]) > hfile
143 if (f < NF)
144 printf(" ") > hfile
145 i++; f++;
146 }
147 if (oparen)
148 printf(")") > hfile
149 if (ocomment)
150 printf(" */") > hfile
151 printf("\n") > hfile
152
153 next
154}
155{
156 if ($0 == "")
157 blanklines++
158 print $0 > hfile
159 if (blanklines < 2)
160 print $0 > dfile
161}
162END {
163 # print out the match tables
164
165 printf("\n") > dfile
166
167 if (nvendor_dup > 0)
168 exit(1);
169
170 printf("/* Descriptions of known vendors and devices. */\n") > dfile
171 printf("struct pci_known_vendor {\n") > dfile
172 printf("\tpci_vendor_id_t vendor;\n") > dfile
173 printf("\tconst char *vendorname;\n") > dfile
174 printf("};\n\n") > dfile
175
176 printf("struct pci_known_product {\n") > dfile
177 printf("\tpci_vendor_id_t vendor;\n") > dfile
178 printf("\tpci_product_id_t product;\n") > dfile
179 printf("\tconst char *productname;\n") > dfile
180 printf("};\n\n") > dfile
181
182
183 printf("static const struct pci_known_product pci_known_products[] = {\n") \
184 > dfile
185 for (i = 1; i <= nproducts; i++) {
186 printf("\t{\n") > dfile
187 printf("\t PCI_VENDOR_%s, PCI_PRODUCT_%s_%s,\n",
188 products[i, 1], products[i, 1], products[i, 2]) \
189 > dfile
190
191 printf("\t \"") > dfile
192 j = 4;
193 needspace = 0;
194 while (products[i, j] != "") {
195 if (needspace)
196 printf(" ") > dfile
197 printf("%s", products[i, j]) > dfile
198 needspace = 1
199 j++
200 }
201 printf("\",\n") > dfile
202 printf("\t},\n") > dfile
203 }
204 printf("\t{ 0, 0, NULL, }\n") > dfile
205 printf("};\n\n") > dfile
206
207 printf("static const struct pci_known_vendor pci_known_vendors[] = {\n") \
208 > dfile
209 for (i = 1; i <= nvendors; i++) {
210 printf("\t{\n") > dfile
211 printf("\t PCI_VENDOR_%s,\n", vendors[i, 1]) \
212 > dfile
213 printf("\t \"") > dfile
214 j = 3;
215 needspace = 0;
216 while (vendors[i, j] != "") {
217 if (needspace)
218 printf(" ") > dfile
219 printf("%s", vendors[i, j]) > dfile
220 needspace = 1
221 j++
222 }
223 printf("\",\n") > dfile
224 printf("\t},\n") > dfile
225 }
226 printf("\t{ 0, NULL, }\n") > dfile
227 printf("};\n") > dfile
228}