1*ef4aa9ffSSascha Wildner#! /usr/bin/awk -f 2*ef4aa9ffSSascha Wildner#- 3*ef4aa9ffSSascha Wildner# $NetBSD: usb/devlist2h.awk,v 1.9 2001/01/18 20:28:22 jdolecek Exp $ 4*ef4aa9ffSSascha Wildner# $FreeBSD$ 5*ef4aa9ffSSascha Wildner# 6*ef4aa9ffSSascha Wildner# Copyright (c) 1995, 1996 Christopher G. Demetriou 7*ef4aa9ffSSascha Wildner# All rights reserved. 8*ef4aa9ffSSascha Wildner# 9*ef4aa9ffSSascha Wildner# Redistribution and use in source and binary forms, with or without 10*ef4aa9ffSSascha Wildner# modification, are permitted provided that the following conditions 11*ef4aa9ffSSascha Wildner# are met: 12*ef4aa9ffSSascha Wildner# 1. Redistributions of source code must retain the above copyright 13*ef4aa9ffSSascha Wildner# notice, this list of conditions and the following disclaimer. 14*ef4aa9ffSSascha Wildner# 2. Redistributions in binary form must reproduce the above copyright 15*ef4aa9ffSSascha Wildner# notice, this list of conditions and the following disclaimer in the 16*ef4aa9ffSSascha Wildner# documentation and/or other materials provided with the distribution. 17*ef4aa9ffSSascha Wildner# 3. All advertising materials mentioning features or use of this software 18*ef4aa9ffSSascha Wildner# must display the following acknowledgement: 19*ef4aa9ffSSascha Wildner# This product includes software developed by Christopher G. Demetriou. 20*ef4aa9ffSSascha Wildner# 4. The name of the author may not be used to endorse or promote products 21*ef4aa9ffSSascha Wildner# derived from this software without specific prior written permission 22*ef4aa9ffSSascha Wildner# 23*ef4aa9ffSSascha Wildner# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 24*ef4aa9ffSSascha Wildner# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 25*ef4aa9ffSSascha Wildner# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 26*ef4aa9ffSSascha Wildner# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 27*ef4aa9ffSSascha Wildner# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 28*ef4aa9ffSSascha Wildner# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 29*ef4aa9ffSSascha Wildner# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 30*ef4aa9ffSSascha Wildner# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 31*ef4aa9ffSSascha Wildner# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 32*ef4aa9ffSSascha Wildner# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 33*ef4aa9ffSSascha Wildner# 34*ef4aa9ffSSascha Wildner 35*ef4aa9ffSSascha Wildnerfunction usage() 36*ef4aa9ffSSascha Wildner{ 37*ef4aa9ffSSascha Wildner print "usage: usbdevs2h.awk <srcfile> [-d|-h]"; 38*ef4aa9ffSSascha Wildner exit 1; 39*ef4aa9ffSSascha Wildner} 40*ef4aa9ffSSascha Wildner 41*ef4aa9ffSSascha Wildnerfunction header(file) 42*ef4aa9ffSSascha Wildner{ 43*ef4aa9ffSSascha Wildner printf("/*\n") > file 44*ef4aa9ffSSascha Wildner printf(" * THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT.\n") \ 45*ef4aa9ffSSascha Wildner > file 46*ef4aa9ffSSascha Wildner printf(" */\n") > file 47*ef4aa9ffSSascha Wildner} 48*ef4aa9ffSSascha Wildner 49*ef4aa9ffSSascha Wildnerfunction vendor(hfile) 50*ef4aa9ffSSascha Wildner{ 51*ef4aa9ffSSascha Wildner nvendors++ 52*ef4aa9ffSSascha Wildner 53*ef4aa9ffSSascha Wildner vendorindex[$2] = nvendors; # record index for this name, for later. 54*ef4aa9ffSSascha Wildner vendors[nvendors, 1] = $2; # name 55*ef4aa9ffSSascha Wildner vendors[nvendors, 2] = $3; # id 56*ef4aa9ffSSascha Wildner if (hfile) 57*ef4aa9ffSSascha Wildner printf("#define\tUSB_VENDOR_%s\t%s\t", vendors[nvendors, 1], 58*ef4aa9ffSSascha Wildner vendors[nvendors, 2]) > hfile 59*ef4aa9ffSSascha Wildner i = 3; f = 4; 60*ef4aa9ffSSascha Wildner 61*ef4aa9ffSSascha Wildner # comments 62*ef4aa9ffSSascha Wildner ocomment = oparen = 0 63*ef4aa9ffSSascha Wildner if (f <= NF) { 64*ef4aa9ffSSascha Wildner if (hfile) 65*ef4aa9ffSSascha Wildner printf("\t/* ") > hfile 66*ef4aa9ffSSascha Wildner ocomment = 1; 67*ef4aa9ffSSascha Wildner } 68*ef4aa9ffSSascha Wildner while (f <= NF) { 69*ef4aa9ffSSascha Wildner if ($f == "#") { 70*ef4aa9ffSSascha Wildner if (hfile) 71*ef4aa9ffSSascha Wildner printf("(") > hfile 72*ef4aa9ffSSascha Wildner oparen = 1 73*ef4aa9ffSSascha Wildner f++ 74*ef4aa9ffSSascha Wildner continue 75*ef4aa9ffSSascha Wildner } 76*ef4aa9ffSSascha Wildner if (oparen) { 77*ef4aa9ffSSascha Wildner if (hfile) 78*ef4aa9ffSSascha Wildner printf("%s", $f) > hfile 79*ef4aa9ffSSascha Wildner if (f < NF && hfile) 80*ef4aa9ffSSascha Wildner printf(" ") > hfile 81*ef4aa9ffSSascha Wildner f++ 82*ef4aa9ffSSascha Wildner continue 83*ef4aa9ffSSascha Wildner } 84*ef4aa9ffSSascha Wildner vendors[nvendors, i] = $f 85*ef4aa9ffSSascha Wildner if (hfile) 86*ef4aa9ffSSascha Wildner printf("%s", vendors[nvendors, i]) > hfile 87*ef4aa9ffSSascha Wildner if (f < NF && hfile) 88*ef4aa9ffSSascha Wildner printf(" ") > hfile 89*ef4aa9ffSSascha Wildner i++; f++; 90*ef4aa9ffSSascha Wildner } 91*ef4aa9ffSSascha Wildner if (oparen && hfile) 92*ef4aa9ffSSascha Wildner printf(")") > hfile 93*ef4aa9ffSSascha Wildner if (ocomment && hfile) 94*ef4aa9ffSSascha Wildner printf(" */") > hfile 95*ef4aa9ffSSascha Wildner if (hfile) 96*ef4aa9ffSSascha Wildner printf("\n") > hfile 97*ef4aa9ffSSascha Wildner} 98*ef4aa9ffSSascha Wildner 99*ef4aa9ffSSascha Wildnerfunction product(hfile) 100*ef4aa9ffSSascha Wildner{ 101*ef4aa9ffSSascha Wildner nproducts++ 102*ef4aa9ffSSascha Wildner 103*ef4aa9ffSSascha Wildner products[nproducts, 1] = $2; # vendor name 104*ef4aa9ffSSascha Wildner products[nproducts, 2] = $3; # product id 105*ef4aa9ffSSascha Wildner products[nproducts, 3] = $4; # id 106*ef4aa9ffSSascha Wildner if (hfile) 107*ef4aa9ffSSascha Wildner printf("#define\tUSB_PRODUCT_%s_%s\t%s\t", \ 108*ef4aa9ffSSascha Wildner products[nproducts, 1], products[nproducts, 2], \ 109*ef4aa9ffSSascha Wildner products[nproducts, 3]) > hfile 110*ef4aa9ffSSascha Wildner 111*ef4aa9ffSSascha Wildner i=4; f = 5; 112*ef4aa9ffSSascha Wildner 113*ef4aa9ffSSascha Wildner # comments 114*ef4aa9ffSSascha Wildner ocomment = oparen = 0 115*ef4aa9ffSSascha Wildner if (f <= NF) { 116*ef4aa9ffSSascha Wildner if (hfile) 117*ef4aa9ffSSascha Wildner printf("\t/* ") > hfile 118*ef4aa9ffSSascha Wildner ocomment = 1; 119*ef4aa9ffSSascha Wildner } 120*ef4aa9ffSSascha Wildner while (f <= NF) { 121*ef4aa9ffSSascha Wildner if ($f == "#") { 122*ef4aa9ffSSascha Wildner if (hfile) 123*ef4aa9ffSSascha Wildner printf("(") > hfile 124*ef4aa9ffSSascha Wildner oparen = 1 125*ef4aa9ffSSascha Wildner f++ 126*ef4aa9ffSSascha Wildner continue 127*ef4aa9ffSSascha Wildner } 128*ef4aa9ffSSascha Wildner if (oparen) { 129*ef4aa9ffSSascha Wildner if (hfile) 130*ef4aa9ffSSascha Wildner printf("%s", $f) > hfile 131*ef4aa9ffSSascha Wildner if (f < NF && hfile) 132*ef4aa9ffSSascha Wildner printf(" ") > hfile 133*ef4aa9ffSSascha Wildner f++ 134*ef4aa9ffSSascha Wildner continue 135*ef4aa9ffSSascha Wildner } 136*ef4aa9ffSSascha Wildner products[nproducts, i] = $f 137*ef4aa9ffSSascha Wildner if (hfile) 138*ef4aa9ffSSascha Wildner printf("%s", products[nproducts, i]) > hfile 139*ef4aa9ffSSascha Wildner if (f < NF && hfile) 140*ef4aa9ffSSascha Wildner printf(" ") > hfile 141*ef4aa9ffSSascha Wildner i++; f++; 142*ef4aa9ffSSascha Wildner } 143*ef4aa9ffSSascha Wildner if (oparen && hfile) 144*ef4aa9ffSSascha Wildner printf(")") > hfile 145*ef4aa9ffSSascha Wildner if (ocomment && hfile) 146*ef4aa9ffSSascha Wildner printf(" */") > hfile 147*ef4aa9ffSSascha Wildner if (hfile) 148*ef4aa9ffSSascha Wildner printf("\n") > hfile 149*ef4aa9ffSSascha Wildner} 150*ef4aa9ffSSascha Wildner 151*ef4aa9ffSSascha Wildnerfunction dump_dfile(dfile) 152*ef4aa9ffSSascha Wildner{ 153*ef4aa9ffSSascha Wildner printf("\n") > dfile 154*ef4aa9ffSSascha Wildner printf("const struct usb_knowndev usb_knowndevs[] = {\n") > dfile 155*ef4aa9ffSSascha Wildner for (i = 1; i <= nproducts; i++) { 156*ef4aa9ffSSascha Wildner printf("\t{\n") > dfile 157*ef4aa9ffSSascha Wildner printf("\t USB_VENDOR_%s, USB_PRODUCT_%s_%s,\n", 158*ef4aa9ffSSascha Wildner products[i, 1], products[i, 1], products[i, 2]) > dfile 159*ef4aa9ffSSascha Wildner printf("\t ") > dfile 160*ef4aa9ffSSascha Wildner printf("0") > dfile 161*ef4aa9ffSSascha Wildner printf(",\n") > dfile 162*ef4aa9ffSSascha Wildner 163*ef4aa9ffSSascha Wildner vendi = vendorindex[products[i, 1]]; 164*ef4aa9ffSSascha Wildner printf("\t \"") > dfile 165*ef4aa9ffSSascha Wildner j = 3; 166*ef4aa9ffSSascha Wildner needspace = 0; 167*ef4aa9ffSSascha Wildner while (vendors[vendi, j] != "") { 168*ef4aa9ffSSascha Wildner if (needspace) 169*ef4aa9ffSSascha Wildner printf(" ") > dfile 170*ef4aa9ffSSascha Wildner printf("%s", vendors[vendi, j]) > dfile 171*ef4aa9ffSSascha Wildner needspace = 1 172*ef4aa9ffSSascha Wildner j++ 173*ef4aa9ffSSascha Wildner } 174*ef4aa9ffSSascha Wildner printf("\",\n") > dfile 175*ef4aa9ffSSascha Wildner 176*ef4aa9ffSSascha Wildner printf("\t \"") > dfile 177*ef4aa9ffSSascha Wildner j = 4; 178*ef4aa9ffSSascha Wildner needspace = 0; 179*ef4aa9ffSSascha Wildner while (products[i, j] != "") { 180*ef4aa9ffSSascha Wildner if (needspace) 181*ef4aa9ffSSascha Wildner printf(" ") > dfile 182*ef4aa9ffSSascha Wildner printf("%s", products[i, j]) > dfile 183*ef4aa9ffSSascha Wildner needspace = 1 184*ef4aa9ffSSascha Wildner j++ 185*ef4aa9ffSSascha Wildner } 186*ef4aa9ffSSascha Wildner printf("\",\n") > dfile 187*ef4aa9ffSSascha Wildner printf("\t},\n") > dfile 188*ef4aa9ffSSascha Wildner } 189*ef4aa9ffSSascha Wildner for (i = 1; i <= nvendors; i++) { 190*ef4aa9ffSSascha Wildner printf("\t{\n") > dfile 191*ef4aa9ffSSascha Wildner printf("\t USB_VENDOR_%s, 0,\n", vendors[i, 1]) > dfile 192*ef4aa9ffSSascha Wildner printf("\t USB_KNOWNDEV_NOPROD,\n") > dfile 193*ef4aa9ffSSascha Wildner printf("\t \"") > dfile 194*ef4aa9ffSSascha Wildner j = 3; 195*ef4aa9ffSSascha Wildner needspace = 0; 196*ef4aa9ffSSascha Wildner while (vendors[i, j] != "") { 197*ef4aa9ffSSascha Wildner if (needspace) 198*ef4aa9ffSSascha Wildner printf(" ") > dfile 199*ef4aa9ffSSascha Wildner printf("%s", vendors[i, j]) > dfile 200*ef4aa9ffSSascha Wildner needspace = 1 201*ef4aa9ffSSascha Wildner j++ 202*ef4aa9ffSSascha Wildner } 203*ef4aa9ffSSascha Wildner printf("\",\n") > dfile 204*ef4aa9ffSSascha Wildner printf("\t NULL,\n") > dfile 205*ef4aa9ffSSascha Wildner printf("\t},\n") > dfile 206*ef4aa9ffSSascha Wildner } 207*ef4aa9ffSSascha Wildner printf("\t{ 0, 0, 0, NULL, NULL, }\n") > dfile 208*ef4aa9ffSSascha Wildner printf("};\n") > dfile 209*ef4aa9ffSSascha Wildner} 210*ef4aa9ffSSascha Wildner 211*ef4aa9ffSSascha WildnerBEGIN { 212*ef4aa9ffSSascha Wildner 213*ef4aa9ffSSascha Wildnernproducts = nvendors = 0 214*ef4aa9ffSSascha Wildner# Process the command line 215*ef4aa9ffSSascha Wildnerfor (i = 1; i < ARGC; i++) { 216*ef4aa9ffSSascha Wildner arg = ARGV[i]; 217*ef4aa9ffSSascha Wildner if (arg !~ /^-[dh]+$/ && arg !~ /devs$/) 218*ef4aa9ffSSascha Wildner usage(); 219*ef4aa9ffSSascha Wildner if (arg ~ /^-.*d/) 220*ef4aa9ffSSascha Wildner dfile="usbdevs_data.h" 221*ef4aa9ffSSascha Wildner if (arg ~ /^-.*h/) 222*ef4aa9ffSSascha Wildner hfile="usbdevs.h" 223*ef4aa9ffSSascha Wildner if (arg ~ /devs$/) 224*ef4aa9ffSSascha Wildner srcfile = arg; 225*ef4aa9ffSSascha Wildner} 226*ef4aa9ffSSascha WildnerARGC = 1; 227*ef4aa9ffSSascha Wildnerline=0; 228*ef4aa9ffSSascha Wildner 229*ef4aa9ffSSascha Wildnerwhile ((getline < srcfile) > 0) { 230*ef4aa9ffSSascha Wildner line++; 231*ef4aa9ffSSascha Wildner if (line == 1) { 232*ef4aa9ffSSascha Wildner if (dfile) 233*ef4aa9ffSSascha Wildner header(dfile) 234*ef4aa9ffSSascha Wildner if (hfile) 235*ef4aa9ffSSascha Wildner header(hfile) 236*ef4aa9ffSSascha Wildner continue; 237*ef4aa9ffSSascha Wildner } 238*ef4aa9ffSSascha Wildner if ($1 == "vendor") { 239*ef4aa9ffSSascha Wildner vendor(hfile) 240*ef4aa9ffSSascha Wildner continue 241*ef4aa9ffSSascha Wildner } 242*ef4aa9ffSSascha Wildner if ($1 == "product") { 243*ef4aa9ffSSascha Wildner product(hfile) 244*ef4aa9ffSSascha Wildner continue 245*ef4aa9ffSSascha Wildner } 246*ef4aa9ffSSascha Wildner if ($0 == "") 247*ef4aa9ffSSascha Wildner blanklines++ 248*ef4aa9ffSSascha Wildner if (hfile) 249*ef4aa9ffSSascha Wildner print $0 > hfile 250*ef4aa9ffSSascha Wildner if (blanklines < 2 && dfile) 251*ef4aa9ffSSascha Wildner print $0 > dfile 252*ef4aa9ffSSascha Wildner} 253*ef4aa9ffSSascha Wildner 254*ef4aa9ffSSascha Wildner# print out the match tables 255*ef4aa9ffSSascha Wildner 256*ef4aa9ffSSascha Wildnerif (dfile) 257*ef4aa9ffSSascha Wildner dump_dfile(dfile) 258*ef4aa9ffSSascha Wildner} 259