1*9354STim.Marsland@Sun.COM#! /usr/bin/awk -f 2*9354STim.Marsland@Sun.COM 3*9354STim.Marsland@Sun.COM# Copyright 2009 Sun Microsystems, Inc. All rights reserved. 4*9354STim.Marsland@Sun.COM# Use is subject to license terms. 5*9354STim.Marsland@Sun.COM 6*9354STim.Marsland@Sun.COM# CDDL HEADER START 7*9354STim.Marsland@Sun.COM# 8*9354STim.Marsland@Sun.COM# The contents of this file are subject to the terms of the 9*9354STim.Marsland@Sun.COM# Common Development and Distribution License (the "License"). 10*9354STim.Marsland@Sun.COM# You may not use this file except in compliance with the License. 11*9354STim.Marsland@Sun.COM# 12*9354STim.Marsland@Sun.COM# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 13*9354STim.Marsland@Sun.COM# or http://www.opensolaris.org/os/licensing. 14*9354STim.Marsland@Sun.COM# See the License for the specific language governing permissions 15*9354STim.Marsland@Sun.COM# and limitations under the License. 16*9354STim.Marsland@Sun.COM# 17*9354STim.Marsland@Sun.COM# When distributing Covered Code, include this CDDL HEADER in each 18*9354STim.Marsland@Sun.COM# file and include the License file at usr/src/OPENSOLARIS.LICENSE. 19*9354STim.Marsland@Sun.COM# If applicable, add the following below this CDDL HEADER, with the 20*9354STim.Marsland@Sun.COM# fields enclosed by brackets "[]" replaced with your own identifying 21*9354STim.Marsland@Sun.COM# information: Portions Copyright [yyyy] [name of copyright owner] 22*9354STim.Marsland@Sun.COM# 23*9354STim.Marsland@Sun.COM# CDDL HEADER END 24*9354STim.Marsland@Sun.COM 25*9354STim.Marsland@Sun.COM#- 26*9354STim.Marsland@Sun.COM# $NetBSD: usb/devlist2h.awk,v 1.9 2001/01/18 20:28:22 jdolecek Exp $ 27*9354STim.Marsland@Sun.COM# $FreeBSD: src/sys/tools/usbdevs2h.awk,v 1.7 2005/01/07 02:29:25 imp Exp $ 28*9354STim.Marsland@Sun.COM# 29*9354STim.Marsland@Sun.COM# Copyright (c) 1995, 1996 Christopher G. Demetriou 30*9354STim.Marsland@Sun.COM# All rights reserved. 31*9354STim.Marsland@Sun.COM# 32*9354STim.Marsland@Sun.COM# Redistribution and use in source and binary forms, with or without 33*9354STim.Marsland@Sun.COM# modification, are permitted provided that the following conditions 34*9354STim.Marsland@Sun.COM# are met: 35*9354STim.Marsland@Sun.COM# 1. Redistributions of source code must retain the above copyright 36*9354STim.Marsland@Sun.COM# notice, this list of conditions and the following disclaimer. 37*9354STim.Marsland@Sun.COM# 2. Redistributions in binary form must reproduce the above copyright 38*9354STim.Marsland@Sun.COM# notice, this list of conditions and the following disclaimer in the 39*9354STim.Marsland@Sun.COM# documentation and/or other materials provided with the distribution. 40*9354STim.Marsland@Sun.COM# 3. All advertising materials mentioning features or use of this software 41*9354STim.Marsland@Sun.COM# must display the following acknowledgement: 42*9354STim.Marsland@Sun.COM# This product includes software developed by Christopher G. Demetriou. 43*9354STim.Marsland@Sun.COM# 4. The name of the author may not be used to endorse or promote products 44*9354STim.Marsland@Sun.COM# derived from this software without specific prior written permission 45*9354STim.Marsland@Sun.COM# 46*9354STim.Marsland@Sun.COM# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 47*9354STim.Marsland@Sun.COM# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 48*9354STim.Marsland@Sun.COM# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 49*9354STim.Marsland@Sun.COM# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 50*9354STim.Marsland@Sun.COM# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 51*9354STim.Marsland@Sun.COM# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 52*9354STim.Marsland@Sun.COM# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 53*9354STim.Marsland@Sun.COM# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 54*9354STim.Marsland@Sun.COM# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 55*9354STim.Marsland@Sun.COM# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 56*9354STim.Marsland@Sun.COM# 57*9354STim.Marsland@Sun.COM 58*9354STim.Marsland@Sun.COMfunction usage() 59*9354STim.Marsland@Sun.COM{ 60*9354STim.Marsland@Sun.COM print "usage: usbdevs2h.awk <srcfile> [-d|-D|-h|-H]"; 61*9354STim.Marsland@Sun.COM exit 1; 62*9354STim.Marsland@Sun.COM} 63*9354STim.Marsland@Sun.COM 64*9354STim.Marsland@Sun.COMfunction header(file) 65*9354STim.Marsland@Sun.COM{ 66*9354STim.Marsland@Sun.COM if (os == "NetBSD") 67*9354STim.Marsland@Sun.COM printf("/*\t\$NetBSD\$\t*/\n\n") > file 68*9354STim.Marsland@Sun.COM else if (os == "FreeBSD") 69*9354STim.Marsland@Sun.COM printf("/* \$FreeBSD\$ */\n\n") > file 70*9354STim.Marsland@Sun.COM else if (os == "OpenBSD") 71*9354STim.Marsland@Sun.COM printf("/*\t\$OpenBSD\$\t*/\n\n") > file 72*9354STim.Marsland@Sun.COM 73*9354STim.Marsland@Sun.COM printf("/*\n") > file 74*9354STim.Marsland@Sun.COM printf(" * THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT.\n") \ 75*9354STim.Marsland@Sun.COM > file 76*9354STim.Marsland@Sun.COM printf(" *\n") > file 77*9354STim.Marsland@Sun.COM printf(" * generated from:\n") > file 78*9354STim.Marsland@Sun.COM printf(" * %s\n", VERSION) > file 79*9354STim.Marsland@Sun.COM printf(" */\n") > file 80*9354STim.Marsland@Sun.COM} 81*9354STim.Marsland@Sun.COM 82*9354STim.Marsland@Sun.COMfunction header_guard(file) 83*9354STim.Marsland@Sun.COM{ 84*9354STim.Marsland@Sun.COM printf("\n") > file 85*9354STim.Marsland@Sun.COM printf("#ifndef\t_SYS_USB_USBDEVS_H\n") > file 86*9354STim.Marsland@Sun.COM printf("#define\t_SYS_USB_USBDEVS_H\n\n") > file 87*9354STim.Marsland@Sun.COM} 88*9354STim.Marsland@Sun.COM 89*9354STim.Marsland@Sun.COMfunction header_trailer(file) 90*9354STim.Marsland@Sun.COM{ 91*9354STim.Marsland@Sun.COM printf("\n") > file 92*9354STim.Marsland@Sun.COM printf("#endif\t/* _SYS_USB_USBDEVS_H */\n") > file 93*9354STim.Marsland@Sun.COM} 94*9354STim.Marsland@Sun.COM 95*9354STim.Marsland@Sun.COMfunction vendor(hfile) 96*9354STim.Marsland@Sun.COM{ 97*9354STim.Marsland@Sun.COM nvendors++ 98*9354STim.Marsland@Sun.COM 99*9354STim.Marsland@Sun.COM vendorindex[$2] = nvendors; # record index for this name, for later. 100*9354STim.Marsland@Sun.COM vendors[nvendors, 1] = $2; # name 101*9354STim.Marsland@Sun.COM vendors[nvendors, 2] = $3; # id 102*9354STim.Marsland@Sun.COM if (hfile) 103*9354STim.Marsland@Sun.COM printf("#define\tUSB_VENDOR_%s\t%s\t", vendors[nvendors, 1], 104*9354STim.Marsland@Sun.COM vendors[nvendors, 2]) > hfile 105*9354STim.Marsland@Sun.COM 106*9354STim.Marsland@Sun.COM i = 3; f = 4; 107*9354STim.Marsland@Sun.COM 108*9354STim.Marsland@Sun.COM # comments 109*9354STim.Marsland@Sun.COM ocomment = oparen = 0 110*9354STim.Marsland@Sun.COM if (f <= NF) { 111*9354STim.Marsland@Sun.COM if (hfile) 112*9354STim.Marsland@Sun.COM printf("\t/* ") > hfile 113*9354STim.Marsland@Sun.COM ocomment = 1; 114*9354STim.Marsland@Sun.COM } 115*9354STim.Marsland@Sun.COM while (f <= NF) { 116*9354STim.Marsland@Sun.COM if ($f == "#") { 117*9354STim.Marsland@Sun.COM if (hfile) 118*9354STim.Marsland@Sun.COM printf("(") > hfile 119*9354STim.Marsland@Sun.COM oparen = 1 120*9354STim.Marsland@Sun.COM f++ 121*9354STim.Marsland@Sun.COM continue 122*9354STim.Marsland@Sun.COM } 123*9354STim.Marsland@Sun.COM if (oparen) { 124*9354STim.Marsland@Sun.COM if (hfile) 125*9354STim.Marsland@Sun.COM printf("%s", $f) > hfile 126*9354STim.Marsland@Sun.COM if (f < NF && hfile) 127*9354STim.Marsland@Sun.COM printf(" ") > hfile 128*9354STim.Marsland@Sun.COM f++ 129*9354STim.Marsland@Sun.COM continue 130*9354STim.Marsland@Sun.COM } 131*9354STim.Marsland@Sun.COM vendors[nvendors, i] = $f 132*9354STim.Marsland@Sun.COM if (hfile) 133*9354STim.Marsland@Sun.COM printf("%s", vendors[nvendors, i]) > hfile 134*9354STim.Marsland@Sun.COM if (f < NF && hfile) 135*9354STim.Marsland@Sun.COM printf(" ") > hfile 136*9354STim.Marsland@Sun.COM i++; f++; 137*9354STim.Marsland@Sun.COM } 138*9354STim.Marsland@Sun.COM if (oparen && hfile) 139*9354STim.Marsland@Sun.COM printf(")") > hfile 140*9354STim.Marsland@Sun.COM if (ocomment && hfile) 141*9354STim.Marsland@Sun.COM printf(" */") > hfile 142*9354STim.Marsland@Sun.COM if (hfile) 143*9354STim.Marsland@Sun.COM printf("\n") > hfile 144*9354STim.Marsland@Sun.COM} 145*9354STim.Marsland@Sun.COM 146*9354STim.Marsland@Sun.COMfunction product(hfile) 147*9354STim.Marsland@Sun.COM{ 148*9354STim.Marsland@Sun.COM nproducts++ 149*9354STim.Marsland@Sun.COM 150*9354STim.Marsland@Sun.COM products[nproducts, 1] = $2; # vendor name 151*9354STim.Marsland@Sun.COM products[nproducts, 2] = $3; # product id 152*9354STim.Marsland@Sun.COM products[nproducts, 3] = $4; # id 153*9354STim.Marsland@Sun.COM if (hfile) 154*9354STim.Marsland@Sun.COM printf("#define\tUSB_PRODUCT_%s_%s\t%s\t", \ 155*9354STim.Marsland@Sun.COM products[nproducts, 1], products[nproducts, 2], \ 156*9354STim.Marsland@Sun.COM products[nproducts, 3]) > hfile 157*9354STim.Marsland@Sun.COM 158*9354STim.Marsland@Sun.COM i=4; f = 5; 159*9354STim.Marsland@Sun.COM 160*9354STim.Marsland@Sun.COM # comments 161*9354STim.Marsland@Sun.COM ocomment = oparen = 0 162*9354STim.Marsland@Sun.COM if (f <= NF) { 163*9354STim.Marsland@Sun.COM if (hfile) 164*9354STim.Marsland@Sun.COM printf("\t/* ") > hfile 165*9354STim.Marsland@Sun.COM ocomment = 1; 166*9354STim.Marsland@Sun.COM } 167*9354STim.Marsland@Sun.COM while (f <= NF) { 168*9354STim.Marsland@Sun.COM if ($f == "#") { 169*9354STim.Marsland@Sun.COM if (hfile) 170*9354STim.Marsland@Sun.COM printf("(") > hfile 171*9354STim.Marsland@Sun.COM oparen = 1 172*9354STim.Marsland@Sun.COM f++ 173*9354STim.Marsland@Sun.COM continue 174*9354STim.Marsland@Sun.COM } 175*9354STim.Marsland@Sun.COM if (oparen) { 176*9354STim.Marsland@Sun.COM if (hfile) 177*9354STim.Marsland@Sun.COM printf("%s", $f) > hfile 178*9354STim.Marsland@Sun.COM if (f < NF && hfile) 179*9354STim.Marsland@Sun.COM printf(" ") > hfile 180*9354STim.Marsland@Sun.COM f++ 181*9354STim.Marsland@Sun.COM continue 182*9354STim.Marsland@Sun.COM } 183*9354STim.Marsland@Sun.COM products[nproducts, i] = $f 184*9354STim.Marsland@Sun.COM if (hfile) 185*9354STim.Marsland@Sun.COM printf("%s", products[nproducts, i]) > hfile 186*9354STim.Marsland@Sun.COM if (f < NF && hfile) 187*9354STim.Marsland@Sun.COM printf(" ") > hfile 188*9354STim.Marsland@Sun.COM i++; f++; 189*9354STim.Marsland@Sun.COM } 190*9354STim.Marsland@Sun.COM if (oparen && hfile) 191*9354STim.Marsland@Sun.COM printf(")") > hfile 192*9354STim.Marsland@Sun.COM if (ocomment && hfile) 193*9354STim.Marsland@Sun.COM printf(" */") > hfile 194*9354STim.Marsland@Sun.COM if (hfile) 195*9354STim.Marsland@Sun.COM printf("\n") > hfile 196*9354STim.Marsland@Sun.COM} 197*9354STim.Marsland@Sun.COM 198*9354STim.Marsland@Sun.COMfunction dump_dfile(dfile) 199*9354STim.Marsland@Sun.COM{ 200*9354STim.Marsland@Sun.COM printf("\n") > dfile 201*9354STim.Marsland@Sun.COM printf("const struct usb_knowndev usb_knowndevs[] = {\n") > dfile 202*9354STim.Marsland@Sun.COM for (i = 1; i <= nproducts; i++) { 203*9354STim.Marsland@Sun.COM printf("\t{\n") > dfile 204*9354STim.Marsland@Sun.COM printf("\t USB_VENDOR_%s, USB_PRODUCT_%s_%s,\n", 205*9354STim.Marsland@Sun.COM products[i, 1], products[i, 1], products[i, 2]) > dfile 206*9354STim.Marsland@Sun.COM printf("\t ") > dfile 207*9354STim.Marsland@Sun.COM printf("0") > dfile 208*9354STim.Marsland@Sun.COM printf(",\n") > dfile 209*9354STim.Marsland@Sun.COM 210*9354STim.Marsland@Sun.COM vendi = vendorindex[products[i, 1]]; 211*9354STim.Marsland@Sun.COM printf("\t \"") > dfile 212*9354STim.Marsland@Sun.COM j = 3; 213*9354STim.Marsland@Sun.COM needspace = 0; 214*9354STim.Marsland@Sun.COM while (vendors[vendi, j] != "") { 215*9354STim.Marsland@Sun.COM if (needspace) 216*9354STim.Marsland@Sun.COM printf(" ") > dfile 217*9354STim.Marsland@Sun.COM printf("%s", vendors[vendi, j]) > dfile 218*9354STim.Marsland@Sun.COM needspace = 1 219*9354STim.Marsland@Sun.COM j++ 220*9354STim.Marsland@Sun.COM } 221*9354STim.Marsland@Sun.COM printf("\",\n") > dfile 222*9354STim.Marsland@Sun.COM 223*9354STim.Marsland@Sun.COM printf("\t \"") > dfile 224*9354STim.Marsland@Sun.COM j = 4; 225*9354STim.Marsland@Sun.COM needspace = 0; 226*9354STim.Marsland@Sun.COM while (products[i, j] != "") { 227*9354STim.Marsland@Sun.COM if (needspace) 228*9354STim.Marsland@Sun.COM printf(" ") > dfile 229*9354STim.Marsland@Sun.COM printf("%s", products[i, j]) > dfile 230*9354STim.Marsland@Sun.COM needspace = 1 231*9354STim.Marsland@Sun.COM j++ 232*9354STim.Marsland@Sun.COM } 233*9354STim.Marsland@Sun.COM printf("\",\n") > dfile 234*9354STim.Marsland@Sun.COM printf("\t},\n") > dfile 235*9354STim.Marsland@Sun.COM } 236*9354STim.Marsland@Sun.COM for (i = 1; i <= nvendors; i++) { 237*9354STim.Marsland@Sun.COM printf("\t{\n") > dfile 238*9354STim.Marsland@Sun.COM printf("\t USB_VENDOR_%s, 0,\n", vendors[i, 1]) > dfile 239*9354STim.Marsland@Sun.COM printf("\t USB_KNOWNDEV_NOPROD,\n") > dfile 240*9354STim.Marsland@Sun.COM printf("\t \"") > dfile 241*9354STim.Marsland@Sun.COM j = 3; 242*9354STim.Marsland@Sun.COM needspace = 0; 243*9354STim.Marsland@Sun.COM while (vendors[i, j] != "") { 244*9354STim.Marsland@Sun.COM if (needspace) 245*9354STim.Marsland@Sun.COM printf(" ") > dfile 246*9354STim.Marsland@Sun.COM printf("%s", vendors[i, j]) > dfile 247*9354STim.Marsland@Sun.COM needspace = 1 248*9354STim.Marsland@Sun.COM j++ 249*9354STim.Marsland@Sun.COM } 250*9354STim.Marsland@Sun.COM printf("\",\n") > dfile 251*9354STim.Marsland@Sun.COM printf("\t NULL,\n") > dfile 252*9354STim.Marsland@Sun.COM printf("\t},\n") > dfile 253*9354STim.Marsland@Sun.COM } 254*9354STim.Marsland@Sun.COM printf("\t{ 0, 0, 0, NULL, NULL, }\n") > dfile 255*9354STim.Marsland@Sun.COM printf("};\n") > dfile 256*9354STim.Marsland@Sun.COM} 257*9354STim.Marsland@Sun.COM 258*9354STim.Marsland@Sun.COMBEGIN { 259*9354STim.Marsland@Sun.COM 260*9354STim.Marsland@Sun.COMnproducts = nvendors = 0 261*9354STim.Marsland@Sun.COM# Process the command line 262*9354STim.Marsland@Sun.COMfor (i = 1; i < ARGC; i++) { 263*9354STim.Marsland@Sun.COM arg = ARGV[i]; 264*9354STim.Marsland@Sun.COM if (arg !~ /^-[dDhH]+$/ && arg !~ /devs$/) 265*9354STim.Marsland@Sun.COM usage(); 266*9354STim.Marsland@Sun.COM if (arg ~ /^-.*d/) 267*9354STim.Marsland@Sun.COM dfile="usbdevs_data.h" 268*9354STim.Marsland@Sun.COM if (arg ~ /^-.*D/) 269*9354STim.Marsland@Sun.COM dfile="/dev/stdout" 270*9354STim.Marsland@Sun.COM if (arg ~ /^-.*h/) 271*9354STim.Marsland@Sun.COM hfile="usbdevs.h" 272*9354STim.Marsland@Sun.COM if (arg ~ /^-.*H/) 273*9354STim.Marsland@Sun.COM hfile="/dev/stdout" 274*9354STim.Marsland@Sun.COM if (arg ~ /devs$/) 275*9354STim.Marsland@Sun.COM srcfile = arg; 276*9354STim.Marsland@Sun.COM} 277*9354STim.Marsland@Sun.COMARGC = 1; 278*9354STim.Marsland@Sun.COMline=0; 279*9354STim.Marsland@Sun.COM 280*9354STim.Marsland@Sun.COMwhile ((getline < srcfile) > 0) { 281*9354STim.Marsland@Sun.COM line++; 282*9354STim.Marsland@Sun.COM if (line == 1) { 283*9354STim.Marsland@Sun.COM VERSION = $0 284*9354STim.Marsland@Sun.COM gsub("\\$", "", VERSION) 285*9354STim.Marsland@Sun.COM if (dfile) 286*9354STim.Marsland@Sun.COM header(dfile) 287*9354STim.Marsland@Sun.COM if (hfile) { 288*9354STim.Marsland@Sun.COM header(hfile) 289*9354STim.Marsland@Sun.COM header_guard(hfile) 290*9354STim.Marsland@Sun.COM } 291*9354STim.Marsland@Sun.COM continue; 292*9354STim.Marsland@Sun.COM } 293*9354STim.Marsland@Sun.COM if ($1 == "vendor") { 294*9354STim.Marsland@Sun.COM vendor(hfile) 295*9354STim.Marsland@Sun.COM continue 296*9354STim.Marsland@Sun.COM } 297*9354STim.Marsland@Sun.COM if ($1 == "product") { 298*9354STim.Marsland@Sun.COM product(hfile) 299*9354STim.Marsland@Sun.COM continue 300*9354STim.Marsland@Sun.COM } 301*9354STim.Marsland@Sun.COM if ($0 == "") 302*9354STim.Marsland@Sun.COM blanklines++ 303*9354STim.Marsland@Sun.COM if (hfile) 304*9354STim.Marsland@Sun.COM print $0 > hfile 305*9354STim.Marsland@Sun.COM if (blanklines < 2 && dfile) 306*9354STim.Marsland@Sun.COM print $0 > dfile 307*9354STim.Marsland@Sun.COM} 308*9354STim.Marsland@Sun.COM 309*9354STim.Marsland@Sun.COM# close off the header guard 310*9354STim.Marsland@Sun.COM 311*9354STim.Marsland@Sun.COMif (hfile) 312*9354STim.Marsland@Sun.COM header_trailer(hfile) 313*9354STim.Marsland@Sun.COM 314*9354STim.Marsland@Sun.COM# print out the match tables 315*9354STim.Marsland@Sun.COM 316*9354STim.Marsland@Sun.COMif (dfile) 317*9354STim.Marsland@Sun.COM dump_dfile(dfile) 318*9354STim.Marsland@Sun.COM} 319