Home | History | Annotate | Line # | Download | only in sh
mknodes.sh revision 1.3.2.1
      1      1.1       dsl #! /bin/sh
      2  1.3.2.1  christos #	$NetBSD: mknodes.sh,v 1.3.2.1 2019/06/10 21:41:04 christos 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.3.2.1  christos 		case "$name" in
     87  1.3.2.1  christos 		type)	if [ -n "$typetype" ] && [ "$typetype" != "$2" ]
     88  1.3.2.1  christos 			then
     89  1.3.2.1  christos 				echo >&2 "Conflicting type fields: node" \
     90  1.3.2.1  christos 					"$struct has $2, others $typetype"
     91  1.3.2.1  christos 				exit 1
     92  1.3.2.1  christos 			fi
     93  1.3.2.1  christos 			if [ $field -ne 1 ]
     94  1.3.2.1  christos 			then
     95  1.3.2.1  christos 				echo >&2 "Node $struct has type as field" \
     96  1.3.2.1  christos 					"$field (should only be first)"
     97  1.3.2.1  christos 				exit 1
     98  1.3.2.1  christos 			fi
     99  1.3.2.1  christos 			typetype=$2
    100  1.3.2.1  christos 			;;
    101  1.3.2.1  christos 		*)
    102  1.3.2.1  christos 			if [ $field -eq 1 ]
    103  1.3.2.1  christos 			then
    104  1.3.2.1  christos 				echo >&2 "Node $struct does not have" \
    105  1.3.2.1  christos 					"type as first field"
    106  1.3.2.1  christos 				exit 1
    107  1.3.2.1  christos 			fi
    108  1.3.2.1  christos 			;;
    109  1.3.2.1  christos 		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.3.2.1  christos 		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.3.2.1  christos 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.3.2.1  christos 				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