Home | History | Annotate | Line # | Download | only in sh
      1 #! /bin/sh
      2 #	$NetBSD: mknodes.sh,v 1.4 2019/01/19 13:08:50 kre Exp $
      3 
      4 # Copyright (c) 2003 The NetBSD Foundation, Inc.
      5 # All rights reserved.
      6 #
      7 # This code is derived from software contributed to The NetBSD Foundation
      8 # by David Laight.
      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 nodetypes=$1
     32 nodes_pat=$2
     33 objdir="$3"
     34 
     35 exec <$nodetypes
     36 exec >$objdir/nodes.h.tmp
     37 
     38 echo "/*"
     39 echo " * This file was generated by mknodes.sh"
     40 echo " */"
     41 echo
     42 
     43 tagno=0
     44 while IFS=; read -r line; do
     45 	line="${line%%#*}"
     46 	IFS=' 	'
     47 	set -- $line
     48 	IFS=
     49 	[ -z "$2" ] && continue
     50 	case "$line" in
     51 	[" 	"]* )
     52 		IFS=' '
     53 		[ $field = 0 ] && struct_list="$struct_list $struct"
     54 		eval field_${struct}_$field=\"\$*\"
     55 		eval numfld_$struct=\$field
     56 		field=$(($field + 1))
     57 		;;
     58 	* )
     59 		define=$1
     60 		struct=$2
     61 		echo "#define $define $tagno"
     62 		tagno=$(($tagno + 1))
     63 		eval define_$struct=\"\$define_$struct \$define\"
     64 		struct_define="$struct_define $struct"
     65 		field=0
     66 		;;
     67 	esac
     68 done
     69 
     70 echo
     71 
     72 IFS=' '
     73 for struct in $struct_list; do
     74 	echo
     75 	echo
     76 	echo "struct $struct {"
     77 	field=0
     78 	while
     79 		eval line=\"\$field_${struct}_$field\"
     80 		field=$(($field + 1))
     81 		[ -n "$line" ]
     82 	do
     83 		IFS=' '
     84 		set -- $line
     85 		name=$1
     86 		case "$name" in
     87 		type)	if [ -n "$typetype" ] && [ "$typetype" != "$2" ]
     88 			then
     89 				echo >&2 "Conflicting type fields: node" \
     90 					"$struct has $2, others $typetype"
     91 				exit 1
     92 			fi
     93 			if [ $field -ne 1 ]
     94 			then
     95 				echo >&2 "Node $struct has type as field" \
     96 					"$field (should only be first)"
     97 				exit 1
     98 			fi
     99 			typetype=$2
    100 			;;
    101 		*)
    102 			if [ $field -eq 1 ]
    103 			then
    104 				echo >&2 "Node $struct does not have" \
    105 					"type as first field"
    106 				exit 1
    107 			fi
    108 			;;
    109 		esac
    110 		case $2 in
    111 		nodeptr ) type="union node *";;
    112 		nodelist ) type="struct nodelist *";;
    113 		string ) type="char *";;
    114 		int*_t | uint*_t | int ) type="$2 ";;
    115 		* ) name=; shift 2; type="$*";;
    116 		esac
    117 		echo "      $type$name;"
    118 	done
    119 	echo "};"
    120 done
    121 
    122 echo
    123 echo
    124 echo "union node {"
    125 echo "      $typetype type;"
    126 for struct in $struct_list; do
    127 	echo "      struct $struct $struct;"
    128 done
    129 echo "};"
    130 echo
    131 echo
    132 echo "struct nodelist {"
    133 echo "	struct nodelist *next;"
    134 echo "	union node *n;"
    135 echo "};"
    136 echo
    137 echo
    138 echo 'struct funcdef;'
    139 echo 'struct funcdef *copyfunc(union node *);'
    140 echo 'union node *getfuncnode(struct funcdef *);'
    141 echo 'void reffunc(struct funcdef *);'
    142 echo 'void unreffunc(struct funcdef *);'
    143 echo 'void freefunc(struct funcdef *);'
    144 
    145 mv $objdir/nodes.h.tmp $objdir/nodes.h || exit 1
    146 
    147 exec <$nodes_pat
    148 exec >$objdir/nodes.c.tmp
    149 
    150 echo "/*"
    151 echo " * This file was generated by mknodes.sh"
    152 echo " */"
    153 echo
    154 
    155 while IFS=; read -r line; do
    156 	IFS=' 	'
    157 	set -- $line
    158 	IFS=
    159 	case "$1" in
    160 	'%SIZES' )
    161 		echo "static const short nodesize[$tagno] = {"
    162 		IFS=' '
    163 		for struct in $struct_define; do
    164 			echo "      SHELL_ALIGN(sizeof (struct $struct)),"
    165 		done
    166 		echo "};"
    167 		;;
    168 	'%CALCSIZE' )
    169 		echo "      if (n == NULL)"
    170 		echo "	    return;"
    171 		echo "      res->bsize += nodesize[n->type];"
    172 		echo "      switch (n->type) {"
    173 		IFS=' '
    174 		for struct in $struct_list; do
    175 			eval defines=\"\$define_$struct\"
    176 			for define in $defines; do
    177 				echo "      case $define:"
    178 			done
    179 			eval field=\$numfld_$struct
    180 			while
    181 				[ $field != 0 ]
    182 			do
    183 				eval line=\"\$field_${struct}_$field\"
    184 				field=$(($field - 1))
    185 				IFS=' '
    186 				set -- $line
    187 				name=$1
    188 				cl=", res)"
    189 				case $2 in
    190 				nodeptr ) fn=calcsize;;
    191 				nodelist ) fn=sizenodelist;;
    192 				string ) fn="res->ssize += strlen"
    193 					cl=") + 1";;
    194 				* ) continue;;
    195 				esac
    196 				echo "	    ${fn}(n->$struct.$name${cl};"
    197 			done
    198 			echo "	    break;"
    199 		done
    200 		echo "      };"
    201 		;;
    202 	'%COPY' )
    203 		echo "      if (n == NULL)"
    204 		echo "	    return NULL;"
    205 		echo "      new = st->block;"
    206 		echo "      st->block = (char *) st->block + nodesize[n->type];"
    207 		echo "      switch (n->type) {"
    208 		IFS=' '
    209 		for struct in $struct_list; do
    210 			eval defines=\"\$define_$struct\"
    211 			for define in $defines; do
    212 				echo "      case $define:"
    213 			done
    214 			eval field=\$numfld_$struct
    215 			while
    216 				[ $field != 0 ]
    217 			do
    218 				eval line=\"\$field_${struct}_$field\"
    219 				field=$(($field - 1))
    220 				IFS=' '
    221 				set -- $line
    222 				name=$1
    223 				case $2 in
    224 				nodeptr ) fn="copynode(";;
    225 				nodelist ) fn="copynodelist(";;
    226 				string ) fn="nodesavestr(";;
    227 				int*_t| uint*_t | int ) fn=;;
    228 				* ) continue;;
    229 				esac
    230 				f="$struct.$name"
    231 				echo "	    new->$f = ${fn}n->$f${fn:+, st)};"
    232 			done
    233 			echo "	    break;"
    234 		done
    235 		echo "      };"
    236 		echo "      new->type = n->type;"
    237 		;;
    238 	* ) echo "$line";;
    239 	esac
    240 done
    241 
    242 mv $objdir/nodes.c.tmp $objdir/nodes.c || exit 1
    243