1 1.1 dsl #! /bin/sh 2 1.4 kre # $NetBSD: mknodes.sh,v 1.4 2019/01/19 13:08:50 kre Exp $ 3 1.1 dsl 4 1.1 dsl # Copyright (c) 2003 The NetBSD Foundation, Inc. 5 1.1 dsl # All rights reserved. 6 1.1 dsl # 7 1.1 dsl # This code is derived from software contributed to The NetBSD Foundation 8 1.1 dsl # by David Laight. 9 1.1 dsl # 10 1.1 dsl # Redistribution and use in source and binary forms, with or without 11 1.1 dsl # modification, are permitted provided that the following conditions 12 1.1 dsl # are met: 13 1.1 dsl # 1. Redistributions of source code must retain the above copyright 14 1.1 dsl # notice, this list of conditions and the following disclaimer. 15 1.1 dsl # 2. Redistributions in binary form must reproduce the above copyright 16 1.1 dsl # notice, this list of conditions and the following disclaimer in the 17 1.1 dsl # documentation and/or other materials provided with the distribution. 18 1.1 dsl # 19 1.1 dsl # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 1.1 dsl # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 1.1 dsl # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 1.1 dsl # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 1.1 dsl # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 1.1 dsl # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 1.1 dsl # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 1.1 dsl # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 1.1 dsl # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 1.1 dsl # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 1.1 dsl # POSSIBILITY OF SUCH DAMAGE. 30 1.1 dsl 31 1.1 dsl nodetypes=$1 32 1.1 dsl nodes_pat=$2 33 1.1 dsl objdir="$3" 34 1.1 dsl 35 1.1 dsl exec <$nodetypes 36 1.1 dsl exec >$objdir/nodes.h.tmp 37 1.1 dsl 38 1.1 dsl echo "/*" 39 1.1 dsl echo " * This file was generated by mknodes.sh" 40 1.1 dsl echo " */" 41 1.1 dsl echo 42 1.1 dsl 43 1.1 dsl tagno=0 44 1.1 dsl while IFS=; read -r line; do 45 1.1 dsl line="${line%%#*}" 46 1.1 dsl IFS=' ' 47 1.1 dsl set -- $line 48 1.1 dsl IFS= 49 1.1 dsl [ -z "$2" ] && continue 50 1.1 dsl case "$line" in 51 1.1 dsl [" "]* ) 52 1.1 dsl IFS=' ' 53 1.1 dsl [ $field = 0 ] && struct_list="$struct_list $struct" 54 1.1 dsl eval field_${struct}_$field=\"\$*\" 55 1.1 dsl eval numfld_$struct=\$field 56 1.1 dsl field=$(($field + 1)) 57 1.1 dsl ;; 58 1.1 dsl * ) 59 1.1 dsl define=$1 60 1.1 dsl struct=$2 61 1.1 dsl echo "#define $define $tagno" 62 1.1 dsl tagno=$(($tagno + 1)) 63 1.1 dsl eval define_$struct=\"\$define_$struct \$define\" 64 1.1 dsl struct_define="$struct_define $struct" 65 1.1 dsl field=0 66 1.1 dsl ;; 67 1.1 dsl esac 68 1.1 dsl done 69 1.1 dsl 70 1.1 dsl echo 71 1.1 dsl 72 1.1 dsl IFS=' ' 73 1.1 dsl for struct in $struct_list; do 74 1.1 dsl echo 75 1.1 dsl echo 76 1.1 dsl echo "struct $struct {" 77 1.1 dsl field=0 78 1.1 dsl while 79 1.1 dsl eval line=\"\$field_${struct}_$field\" 80 1.1 dsl field=$(($field + 1)) 81 1.1 dsl [ -n "$line" ] 82 1.1 dsl do 83 1.1 dsl IFS=' ' 84 1.1 dsl set -- $line 85 1.1 dsl name=$1 86 1.4 kre case "$name" in 87 1.4 kre type) if [ -n "$typetype" ] && [ "$typetype" != "$2" ] 88 1.4 kre then 89 1.4 kre echo >&2 "Conflicting type fields: node" \ 90 1.4 kre "$struct has $2, others $typetype" 91 1.4 kre exit 1 92 1.4 kre fi 93 1.4 kre if [ $field -ne 1 ] 94 1.4 kre then 95 1.4 kre echo >&2 "Node $struct has type as field" \ 96 1.4 kre "$field (should only be first)" 97 1.4 kre exit 1 98 1.4 kre fi 99 1.4 kre typetype=$2 100 1.4 kre ;; 101 1.4 kre *) 102 1.4 kre if [ $field -eq 1 ] 103 1.4 kre then 104 1.4 kre echo >&2 "Node $struct does not have" \ 105 1.4 kre "type as first field" 106 1.4 kre exit 1 107 1.4 kre fi 108 1.4 kre ;; 109 1.4 kre esac 110 1.1 dsl case $2 in 111 1.1 dsl nodeptr ) type="union node *";; 112 1.1 dsl nodelist ) type="struct nodelist *";; 113 1.1 dsl string ) type="char *";; 114 1.4 kre int*_t | uint*_t | int ) type="$2 ";; 115 1.1 dsl * ) name=; shift 2; type="$*";; 116 1.1 dsl esac 117 1.1 dsl echo " $type$name;" 118 1.1 dsl done 119 1.1 dsl echo "};" 120 1.1 dsl done 121 1.1 dsl 122 1.1 dsl echo 123 1.1 dsl echo 124 1.1 dsl echo "union node {" 125 1.4 kre echo " $typetype type;" 126 1.1 dsl for struct in $struct_list; do 127 1.1 dsl echo " struct $struct $struct;" 128 1.1 dsl done 129 1.1 dsl echo "};" 130 1.1 dsl echo 131 1.1 dsl echo 132 1.1 dsl echo "struct nodelist {" 133 1.1 dsl echo " struct nodelist *next;" 134 1.1 dsl echo " union node *n;" 135 1.1 dsl echo "};" 136 1.1 dsl echo 137 1.1 dsl echo 138 1.3 kre echo 'struct funcdef;' 139 1.3 kre echo 'struct funcdef *copyfunc(union node *);' 140 1.3 kre echo 'union node *getfuncnode(struct funcdef *);' 141 1.3 kre echo 'void reffunc(struct funcdef *);' 142 1.3 kre echo 'void unreffunc(struct funcdef *);' 143 1.3 kre echo 'void freefunc(struct funcdef *);' 144 1.1 dsl 145 1.1 dsl mv $objdir/nodes.h.tmp $objdir/nodes.h || exit 1 146 1.1 dsl 147 1.1 dsl exec <$nodes_pat 148 1.1 dsl exec >$objdir/nodes.c.tmp 149 1.1 dsl 150 1.1 dsl echo "/*" 151 1.1 dsl echo " * This file was generated by mknodes.sh" 152 1.1 dsl echo " */" 153 1.1 dsl echo 154 1.1 dsl 155 1.1 dsl while IFS=; read -r line; do 156 1.1 dsl IFS=' ' 157 1.1 dsl set -- $line 158 1.1 dsl IFS= 159 1.1 dsl case "$1" in 160 1.1 dsl '%SIZES' ) 161 1.1 dsl echo "static const short nodesize[$tagno] = {" 162 1.1 dsl IFS=' ' 163 1.1 dsl for struct in $struct_define; do 164 1.1 dsl echo " SHELL_ALIGN(sizeof (struct $struct))," 165 1.1 dsl done 166 1.1 dsl echo "};" 167 1.1 dsl ;; 168 1.1 dsl '%CALCSIZE' ) 169 1.1 dsl echo " if (n == NULL)" 170 1.1 dsl echo " return;" 171 1.3 kre echo " res->bsize += nodesize[n->type];" 172 1.1 dsl echo " switch (n->type) {" 173 1.1 dsl IFS=' ' 174 1.1 dsl for struct in $struct_list; do 175 1.1 dsl eval defines=\"\$define_$struct\" 176 1.1 dsl for define in $defines; do 177 1.1 dsl echo " case $define:" 178 1.1 dsl done 179 1.1 dsl eval field=\$numfld_$struct 180 1.1 dsl while 181 1.1 dsl [ $field != 0 ] 182 1.1 dsl do 183 1.1 dsl eval line=\"\$field_${struct}_$field\" 184 1.1 dsl field=$(($field - 1)) 185 1.1 dsl IFS=' ' 186 1.1 dsl set -- $line 187 1.1 dsl name=$1 188 1.3 kre cl=", res)" 189 1.1 dsl case $2 in 190 1.1 dsl nodeptr ) fn=calcsize;; 191 1.1 dsl nodelist ) fn=sizenodelist;; 192 1.3 kre string ) fn="res->ssize += strlen" 193 1.1 dsl cl=") + 1";; 194 1.1 dsl * ) continue;; 195 1.1 dsl esac 196 1.1 dsl echo " ${fn}(n->$struct.$name${cl};" 197 1.1 dsl done 198 1.1 dsl echo " break;" 199 1.1 dsl done 200 1.1 dsl echo " };" 201 1.1 dsl ;; 202 1.1 dsl '%COPY' ) 203 1.1 dsl echo " if (n == NULL)" 204 1.1 dsl echo " return NULL;" 205 1.3 kre echo " new = st->block;" 206 1.3 kre echo " st->block = (char *) st->block + nodesize[n->type];" 207 1.1 dsl echo " switch (n->type) {" 208 1.1 dsl IFS=' ' 209 1.1 dsl for struct in $struct_list; do 210 1.1 dsl eval defines=\"\$define_$struct\" 211 1.1 dsl for define in $defines; do 212 1.1 dsl echo " case $define:" 213 1.1 dsl done 214 1.1 dsl eval field=\$numfld_$struct 215 1.1 dsl while 216 1.1 dsl [ $field != 0 ] 217 1.1 dsl do 218 1.1 dsl eval line=\"\$field_${struct}_$field\" 219 1.1 dsl field=$(($field - 1)) 220 1.1 dsl IFS=' ' 221 1.1 dsl set -- $line 222 1.1 dsl name=$1 223 1.1 dsl case $2 in 224 1.1 dsl nodeptr ) fn="copynode(";; 225 1.1 dsl nodelist ) fn="copynodelist(";; 226 1.1 dsl string ) fn="nodesavestr(";; 227 1.4 kre int*_t| uint*_t | int ) fn=;; 228 1.1 dsl * ) continue;; 229 1.1 dsl esac 230 1.1 dsl f="$struct.$name" 231 1.3 kre echo " new->$f = ${fn}n->$f${fn:+, st)};" 232 1.1 dsl done 233 1.1 dsl echo " break;" 234 1.1 dsl done 235 1.1 dsl echo " };" 236 1.1 dsl echo " new->type = n->type;" 237 1.1 dsl ;; 238 1.1 dsl * ) echo "$line";; 239 1.1 dsl esac 240 1.1 dsl done 241 1.1 dsl 242 1.1 dsl mv $objdir/nodes.c.tmp $objdir/nodes.c || exit 1 243