1#! /usr/bin/awk -f 2# $NetBSD: devlist2h.awk,v 1.10 2017/06/03 14:46:29 christos 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# 4. The name of the author(s) may not be used to endorse or promote products 46# derived from this software without specific prior written permission 47# 48# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 49# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 50# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 51# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 52# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 53# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 54# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 55# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 56# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 57# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 58# 59function collectline(f) { 60 oparen = 0 61 line = "" 62 while (f <= NF) { 63 if ($f == "#") { 64 line = line "(" 65 oparen = 1 66 f++ 67 continue 68 } 69 if (oparen) { 70 line = line $f 71 if (f < NF) 72 line = line " " 73 f++ 74 continue 75 } 76 line = line $f 77 if (f < NF) 78 line = line " " 79 f++ 80 } 81 if (oparen) 82 line = line ")" 83 return line 84} 85function checkdecl() { 86 done = 1 87 if (!decl) { 88 decl = 1; 89 printf("struct isapnp_matchinfo {\n") > hfile 90 printf("\tconst char *name;\n") > hfile 91 printf("\tint variant;\n") > hfile 92 printf("};\n\n") > hfile 93 printf("struct isapnp_devinfo {\n") > hfile 94 printf("\tconst struct isapnp_matchinfo *devlogic;\n") > hfile 95 printf("\tint nlogic;\n") > hfile 96 printf("\tconst struct isapnp_matchinfo *devcompat;\n") > hfile 97 printf("\tint ncompat;\n") > hfile 98 printf("};\n\n") > hfile 99 printf("\n#include <sys/cdefs.h>\n__KERNEL_RCSID(0, \"$NetBSD" "$\");\n\n") > cfile 100 printf("#include <sys/param.h>\n") > cfile 101 printf("#include <dev/isapnp/isapnpdevs.h>\n\n") > cfile 102 } 103} 104BEGIN { 105 decl = done = ncompat = nlogicals = ndriver = blanklines = ncompats = 0 106 cfile="isapnpdevs.c" 107 hfile="isapnpdevs.h" 108} 109NR == 1 { 110 VERSION = $0 111 gsub("\\$", "", VERSION) 112 gsub(/ $/, "", VERSION) 113 114 printf("/*\t$NetBSD" "$\t*/\n\n") > cfile 115 printf("/*\n") > cfile 116 printf(" * THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT.\n") \ 117 > cfile 118 printf(" *\n") > cfile 119 printf(" * generated from:\n") > cfile 120 printf(" *\t%s\n", VERSION) > cfile 121 printf(" */\n") > cfile 122 123 printf("/*\t$NetBSD" "$\t*/\n\n") > hfile 124 printf("/*\n") > hfile 125 printf(" * THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT.\n") \ 126 > hfile 127 printf(" *\n") > hfile 128 printf(" * generated from:\n") > hfile 129 printf(" *\t%s\n", VERSION) > hfile 130 printf(" */\n") > hfile 131 printf("\n") > hfile 132 next 133} 134NF > 0 && $1 == "driver" { 135 checkdecl() 136 ndriver++ 137 138 driverindex[$2] = ndriver; 139 driver[ndriver, 1] = $2; 140 driver[ndriver, 2] = collectline(3); 141 printf("/* %s */\n", driver[ndriver, 2]) > hfile 142 printf("extern const struct isapnp_devinfo isapnp_%s_devinfo;\n", 143 driver[ndriver, 1]) > hfile 144 next 145} 146NF > 0 && $1 == "devlogic" { 147 checkdecl() 148 nlogicals++ 149 150 logicals[nlogicals, 1] = $2; 151 logicals[nlogicals, 2] = $3; 152 logicals[nlogicals, 3] = $4; 153 logicals[nlogicals, 4] = collectline(5); 154 next 155} 156NF > 0 && $1 == "devcompat" { 157 checkdecl() 158 ncompats++ 159 160 compats[ncompats, 1] = $2; 161 compats[ncompats, 2] = $3; 162 compats[ncompats, 3] = $4; 163 compats[ncompats, 4] = collectline(5); 164 next 165} 166{ 167 if (!done) { 168 if ($0 == "") 169 blanklines++ 170 print $0 > hfile 171 if (blanklines < 2) 172 print $0 > cfile 173 } 174} 175END { 176 # print out the match tables 177 178 printf("\n") > cfile 179 180 for (i = 1; i <= ndriver; i++) { 181 nlogical = ncompat = 0; 182 printf("/* %s */\n", driver[i, 2]) > cfile 183 for (j = 1; j <= nlogicals; j++) { 184 if (logicals[j, 1] == driver[i, 1]) { 185 if (nlogical == 0) 186 printf("static const struct isapnp_matchinfo isapnp_%s_devlogic[] = {\n", 187 driver[i, 1]) > cfile 188 nlogical++; 189 printf("\t{\"%s\", %d},\t/* %s */\n", 190 logicals[j, 2], logicals[j, 3], 191 logicals[j, 4]) > cfile 192 } 193 } 194 if (nlogical != 0) 195 printf("};\n") > cfile 196 for (j = 1; j <= ncompats; j++) { 197 if (compats[j, 1] == driver[i, 1]) { 198 if (ncompat == 0) 199 printf("static const struct isapnp_matchinfo isapnp_%s_devcompat[] = {\n", 200 driver[i, 1]) > cfile 201 ncompat++; 202 printf("\t{\"%s\", %d},\t/* %s */\n", 203 compats[j, 2], compats[j, 3], 204 compats[j, 4]) > cfile 205 } 206 } 207 if (ncompat != 0) 208 printf("};\n") > cfile 209 printf("const struct isapnp_devinfo isapnp_%s_devinfo = {\n", 210 driver[i, 1]) > cfile 211 if (nlogical != 0) 212 printf("\tisapnp_%s_devlogic, %d,\n", 213 driver[i, 1], nlogical) > cfile 214 else 215 printf("\tNULL, 0,\n") > cfile 216 if (ncompat != 0) 217 printf("\tisapnp_%s_devcompat, %d,\n", 218 driver[i, 1], ncompat) > cfile 219 else 220 printf("\tNULL, 0,\n") > cfile 221 printf("};\n\n") > cfile; 222 223 } 224 close(cfile) 225 close(hfile) 226} 227