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