mknodes.sh revision 1.1 1 1.1 dsl #! /bin/sh
2 1.1 dsl # $NetBSD: mknodes.sh,v 1.1 2004/01/16 23:24:38 dsl 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 # 3. Neither the name of The NetBSD Foundation nor the names of its
19 1.1 dsl # contributors may be used to endorse or promote products derived
20 1.1 dsl # from this software without specific prior written permission.
21 1.1 dsl #
22 1.1 dsl # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
23 1.1 dsl # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
24 1.1 dsl # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
25 1.1 dsl # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
26 1.1 dsl # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27 1.1 dsl # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28 1.1 dsl # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29 1.1 dsl # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30 1.1 dsl # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31 1.1 dsl # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32 1.1 dsl # POSSIBILITY OF SUCH DAMAGE.
33 1.1 dsl
34 1.1 dsl nodetypes=$1
35 1.1 dsl nodes_pat=$2
36 1.1 dsl objdir="$3"
37 1.1 dsl
38 1.1 dsl exec <$nodetypes
39 1.1 dsl exec >$objdir/nodes.h.tmp
40 1.1 dsl
41 1.1 dsl echo "/*"
42 1.1 dsl echo " * This file was generated by mknodes.sh"
43 1.1 dsl echo " */"
44 1.1 dsl echo
45 1.1 dsl
46 1.1 dsl tagno=0
47 1.1 dsl while IFS=; read -r line; do
48 1.1 dsl line="${line%%#*}"
49 1.1 dsl IFS=' '
50 1.1 dsl set -- $line
51 1.1 dsl IFS=
52 1.1 dsl [ -z "$2" ] && continue
53 1.1 dsl case "$line" in
54 1.1 dsl [" "]* )
55 1.1 dsl IFS=' '
56 1.1 dsl [ $field = 0 ] && struct_list="$struct_list $struct"
57 1.1 dsl eval field_${struct}_$field=\"\$*\"
58 1.1 dsl eval numfld_$struct=\$field
59 1.1 dsl field=$(($field + 1))
60 1.1 dsl ;;
61 1.1 dsl * )
62 1.1 dsl define=$1
63 1.1 dsl struct=$2
64 1.1 dsl echo "#define $define $tagno"
65 1.1 dsl tagno=$(($tagno + 1))
66 1.1 dsl eval define_$struct=\"\$define_$struct \$define\"
67 1.1 dsl struct_define="$struct_define $struct"
68 1.1 dsl field=0
69 1.1 dsl ;;
70 1.1 dsl esac
71 1.1 dsl done
72 1.1 dsl
73 1.1 dsl echo
74 1.1 dsl
75 1.1 dsl IFS=' '
76 1.1 dsl for struct in $struct_list; do
77 1.1 dsl echo
78 1.1 dsl echo
79 1.1 dsl echo "struct $struct {"
80 1.1 dsl field=0
81 1.1 dsl while
82 1.1 dsl eval line=\"\$field_${struct}_$field\"
83 1.1 dsl field=$(($field + 1))
84 1.1 dsl [ -n "$line" ]
85 1.1 dsl do
86 1.1 dsl IFS=' '
87 1.1 dsl set -- $line
88 1.1 dsl name=$1
89 1.1 dsl case $2 in
90 1.1 dsl nodeptr ) type="union node *";;
91 1.1 dsl nodelist ) type="struct nodelist *";;
92 1.1 dsl string ) type="char *";;
93 1.1 dsl int ) type="int ";;
94 1.1 dsl * ) name=; shift 2; type="$*";;
95 1.1 dsl esac
96 1.1 dsl echo " $type$name;"
97 1.1 dsl done
98 1.1 dsl echo "};"
99 1.1 dsl done
100 1.1 dsl
101 1.1 dsl echo
102 1.1 dsl echo
103 1.1 dsl echo "union node {"
104 1.1 dsl echo " int type;"
105 1.1 dsl for struct in $struct_list; do
106 1.1 dsl echo " struct $struct $struct;"
107 1.1 dsl done
108 1.1 dsl echo "};"
109 1.1 dsl echo
110 1.1 dsl echo
111 1.1 dsl echo "struct nodelist {"
112 1.1 dsl echo " struct nodelist *next;"
113 1.1 dsl echo " union node *n;"
114 1.1 dsl echo "};"
115 1.1 dsl echo
116 1.1 dsl echo
117 1.1 dsl echo "union node *copyfunc(union node *);"
118 1.1 dsl echo "void freefunc(union node *);"
119 1.1 dsl
120 1.1 dsl mv $objdir/nodes.h.tmp $objdir/nodes.h || exit 1
121 1.1 dsl
122 1.1 dsl exec <$nodes_pat
123 1.1 dsl exec >$objdir/nodes.c.tmp
124 1.1 dsl
125 1.1 dsl echo "/*"
126 1.1 dsl echo " * This file was generated by mknodes.sh"
127 1.1 dsl echo " */"
128 1.1 dsl echo
129 1.1 dsl
130 1.1 dsl while IFS=; read -r line; do
131 1.1 dsl IFS=' '
132 1.1 dsl set -- $line
133 1.1 dsl IFS=
134 1.1 dsl case "$1" in
135 1.1 dsl '%SIZES' )
136 1.1 dsl echo "static const short nodesize[$tagno] = {"
137 1.1 dsl IFS=' '
138 1.1 dsl for struct in $struct_define; do
139 1.1 dsl echo " SHELL_ALIGN(sizeof (struct $struct)),"
140 1.1 dsl done
141 1.1 dsl echo "};"
142 1.1 dsl ;;
143 1.1 dsl '%CALCSIZE' )
144 1.1 dsl echo " if (n == NULL)"
145 1.1 dsl echo " return;"
146 1.1 dsl echo " funcblocksize += nodesize[n->type];"
147 1.1 dsl echo " switch (n->type) {"
148 1.1 dsl IFS=' '
149 1.1 dsl for struct in $struct_list; do
150 1.1 dsl eval defines=\"\$define_$struct\"
151 1.1 dsl for define in $defines; do
152 1.1 dsl echo " case $define:"
153 1.1 dsl done
154 1.1 dsl eval field=\$numfld_$struct
155 1.1 dsl while
156 1.1 dsl [ $field != 0 ]
157 1.1 dsl do
158 1.1 dsl eval line=\"\$field_${struct}_$field\"
159 1.1 dsl field=$(($field - 1))
160 1.1 dsl IFS=' '
161 1.1 dsl set -- $line
162 1.1 dsl name=$1
163 1.1 dsl cl=")"
164 1.1 dsl case $2 in
165 1.1 dsl nodeptr ) fn=calcsize;;
166 1.1 dsl nodelist ) fn=sizenodelist;;
167 1.1 dsl string ) fn="funcstringsize += strlen"
168 1.1 dsl cl=") + 1";;
169 1.1 dsl * ) continue;;
170 1.1 dsl esac
171 1.1 dsl echo " ${fn}(n->$struct.$name${cl};"
172 1.1 dsl done
173 1.1 dsl echo " break;"
174 1.1 dsl done
175 1.1 dsl echo " };"
176 1.1 dsl ;;
177 1.1 dsl '%COPY' )
178 1.1 dsl echo " if (n == NULL)"
179 1.1 dsl echo " return NULL;"
180 1.1 dsl echo " new = funcblock;"
181 1.1 dsl echo " funcblock = (char *) funcblock + nodesize[n->type];"
182 1.1 dsl echo " switch (n->type) {"
183 1.1 dsl IFS=' '
184 1.1 dsl for struct in $struct_list; do
185 1.1 dsl eval defines=\"\$define_$struct\"
186 1.1 dsl for define in $defines; do
187 1.1 dsl echo " case $define:"
188 1.1 dsl done
189 1.1 dsl eval field=\$numfld_$struct
190 1.1 dsl while
191 1.1 dsl [ $field != 0 ]
192 1.1 dsl do
193 1.1 dsl eval line=\"\$field_${struct}_$field\"
194 1.1 dsl field=$(($field - 1))
195 1.1 dsl IFS=' '
196 1.1 dsl set -- $line
197 1.1 dsl name=$1
198 1.1 dsl case $2 in
199 1.1 dsl nodeptr ) fn="copynode(";;
200 1.1 dsl nodelist ) fn="copynodelist(";;
201 1.1 dsl string ) fn="nodesavestr(";;
202 1.1 dsl int ) fn=;;
203 1.1 dsl * ) continue;;
204 1.1 dsl esac
205 1.1 dsl f="$struct.$name"
206 1.1 dsl echo " new->$f = ${fn}n->$f${fn:+)};"
207 1.1 dsl done
208 1.1 dsl echo " break;"
209 1.1 dsl done
210 1.1 dsl echo " };"
211 1.1 dsl echo " new->type = n->type;"
212 1.1 dsl ;;
213 1.1 dsl * ) echo "$line";;
214 1.1 dsl esac
215 1.1 dsl done
216 1.1 dsl
217 1.1 dsl mv $objdir/nodes.c.tmp $objdir/nodes.c || exit 1
218