Home | History | Annotate | Line # | Download | only in sh
mknodes.sh revision 1.3
      1 #! /bin/sh
      2 #	$NetBSD: mknodes.sh,v 1.3 2018/06/22 11:04:55 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 $2 in
     87 		nodeptr ) type="union node *";;
     88 		nodelist ) type="struct nodelist *";;
     89 		string ) type="char *";;
     90 		int ) type="int ";;
     91 		* ) name=; shift 2; type="$*";;
     92 		esac
     93 		echo "      $type$name;"
     94 	done
     95 	echo "};"
     96 done
     97 
     98 echo
     99 echo
    100 echo "union node {"
    101 echo "      int type;"
    102 for struct in $struct_list; do
    103 	echo "      struct $struct $struct;"
    104 done
    105 echo "};"
    106 echo
    107 echo
    108 echo "struct nodelist {"
    109 echo "	struct nodelist *next;"
    110 echo "	union node *n;"
    111 echo "};"
    112 echo
    113 echo
    114 echo 'struct funcdef;'
    115 echo 'struct funcdef *copyfunc(union node *);'
    116 echo 'union node *getfuncnode(struct funcdef *);'
    117 echo 'void reffunc(struct funcdef *);'
    118 echo 'void unreffunc(struct funcdef *);'
    119 echo 'void freefunc(struct funcdef *);'
    120 
    121 mv $objdir/nodes.h.tmp $objdir/nodes.h || exit 1
    122 
    123 exec <$nodes_pat
    124 exec >$objdir/nodes.c.tmp
    125 
    126 echo "/*"
    127 echo " * This file was generated by mknodes.sh"
    128 echo " */"
    129 echo
    130 
    131 while IFS=; read -r line; do
    132 	IFS=' 	'
    133 	set -- $line
    134 	IFS=
    135 	case "$1" in
    136 	'%SIZES' )
    137 		echo "static const short nodesize[$tagno] = {"
    138 		IFS=' '
    139 		for struct in $struct_define; do
    140 			echo "      SHELL_ALIGN(sizeof (struct $struct)),"
    141 		done
    142 		echo "};"
    143 		;;
    144 	'%CALCSIZE' )
    145 		echo "      if (n == NULL)"
    146 		echo "	    return;"
    147 		echo "      res->bsize += nodesize[n->type];"
    148 		echo "      switch (n->type) {"
    149 		IFS=' '
    150 		for struct in $struct_list; do
    151 			eval defines=\"\$define_$struct\"
    152 			for define in $defines; do
    153 				echo "      case $define:"
    154 			done
    155 			eval field=\$numfld_$struct
    156 			while
    157 				[ $field != 0 ]
    158 			do
    159 				eval line=\"\$field_${struct}_$field\"
    160 				field=$(($field - 1))
    161 				IFS=' '
    162 				set -- $line
    163 				name=$1
    164 				cl=", res)"
    165 				case $2 in
    166 				nodeptr ) fn=calcsize;;
    167 				nodelist ) fn=sizenodelist;;
    168 				string ) fn="res->ssize += strlen"
    169 					cl=") + 1";;
    170 				* ) continue;;
    171 				esac
    172 				echo "	    ${fn}(n->$struct.$name${cl};"
    173 			done
    174 			echo "	    break;"
    175 		done
    176 		echo "      };"
    177 		;;
    178 	'%COPY' )
    179 		echo "      if (n == NULL)"
    180 		echo "	    return NULL;"
    181 		echo "      new = st->block;"
    182 		echo "      st->block = (char *) st->block + nodesize[n->type];"
    183 		echo "      switch (n->type) {"
    184 		IFS=' '
    185 		for struct in $struct_list; do
    186 			eval defines=\"\$define_$struct\"
    187 			for define in $defines; do
    188 				echo "      case $define:"
    189 			done
    190 			eval field=\$numfld_$struct
    191 			while
    192 				[ $field != 0 ]
    193 			do
    194 				eval line=\"\$field_${struct}_$field\"
    195 				field=$(($field - 1))
    196 				IFS=' '
    197 				set -- $line
    198 				name=$1
    199 				case $2 in
    200 				nodeptr ) fn="copynode(";;
    201 				nodelist ) fn="copynodelist(";;
    202 				string ) fn="nodesavestr(";;
    203 				int ) fn=;;
    204 				* ) continue;;
    205 				esac
    206 				f="$struct.$name"
    207 				echo "	    new->$f = ${fn}n->$f${fn:+, st)};"
    208 			done
    209 			echo "	    break;"
    210 		done
    211 		echo "      };"
    212 		echo "      new->type = n->type;"
    213 		;;
    214 	* ) echo "$line";;
    215 	esac
    216 done
    217 
    218 mv $objdir/nodes.c.tmp $objdir/nodes.c || exit 1
    219