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