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