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