ECHO=echo
RM='rm -f'
TOUCH=touch

#  execute command, possibly echoing to stdout
trace() {
    # sed protects dollar signs from expansion; tr protects sed from long lines
    CMD=`echo "$@" | tr ' ' '\012' | sed 's/\\$/\\\\$/g' | tr '\012' ' '`
    $ECHO + "$CMD"
    eval "$CMD" || exit 1
}

$RM $1.c
$TOUCH $1.c
$ECHO "#include \"$1.h\"" >> $1.c
$ECHO "" >> $1.c
$ECHO "struct Class_s * $1_V;" >> $1.c
$ECHO "" >> $1.c
$ECHO "static struct $1_bidirectional_DV The_$1_DV = {" >> $1.c
$ECHO "	{" >> $1.c
$ECHO "		0, /* self_class */" >> $1.c
$ECHO "" >> $1.c
$ECHO "		/* The following fields are not used for primitive types */" >> $1.c
$ECHO "" >> $1.c
$ECHO "		0, /* bf */" >> $1.c
$ECHO "		0, /* num_slots */" >> $1.c
$ECHO "		0, /* num_methods */" >> $1.c
$ECHO "		0, /* methods */" >> $1.c
$ECHO "		0, /* nsupers */" >> $1.c
$ECHO "		0, /* supers */" >> $1.c
$ECHO "		0, /* ninters */" >> $1.c
$ECHO "		0, /* ndinters */" >> $1.c
$ECHO "		0, /* inters */" >> $1.c
$ECHO "		0, /* nothers */" >> $1.c
$ECHO "		0, /* others */" >> $1.c
$ECHO "	}," >> $1.c
$ECHO "};" >> $1.c
$ECHO "" >> $1.c
$ECHO "void Init_$1()" >> $1.c
$ECHO "{" >> $1.c
$ECHO "	if ($1_V != 0) return;" >> $1.c
$ECHO "	$1_V = NEW_CLASS();" >> $1.c
$ECHO "	/* $1_V->name = \"$1\"; */" >> $1.c
$ECHO "	$1_V->flags = (IS_PRIMITIVE | IS_PERSISTABLE);" >> $1.c
$ECHO "	CREATE_DV($1);" >> $1.c
$ECHO "};" >> $1.c

$RM $1.h
$TOUCH $1.h
$ECHO "#ifndef $1_H" >> $1.h
$ECHO "#define $1_H" >> $1.h
$ECHO "" >> $1.h
$ECHO "#include \"compiler/C/compiler.h\"" >> $1.h
$ECHO "" >> $1.h
$ECHO "extern struct Class_s *$1_V;" >> $1.h
$ECHO "" >> $1.h
$ECHO "struct $1_bidirectional_DV {" >> $1.h
$ECHO "	struct DV_hdr_s hdr;" >> $1.h
$ECHO "};" >> $1.h
$ECHO "" >> $1.h
$ECHO "struct $1_DV {" >> $1.h
$ECHO "	struct DV_hdr_s hdr;" >> $1.h
$ECHO "};" >> $1.h
$ECHO "" >> $1.h
$ECHO "#endif /* $1_H */" >> $1.h

$RM $1.data
$TOUCH $1.data
$ECHO "$1	$1_V	WK_$1_OREF	Init_$1" >> $1.data

$RM $1.externs.h
$TOUCH $1.externs.h
$ECHO "#ifndef $1_EXTERNS_H" >> $1.externs.h
$ECHO "#define $1_EXTERNS_H" >> $1.externs.h
$ECHO "" >> $1.externs.h
$ECHO "extern struct Class_s *$1_V;" >> $1.externs.h
$ECHO "extern void Init_$1();" >> $1.externs.h
$ECHO "" >> $1.externs.h
$ECHO "#endif /* $1_EXTERNS_H */" >> $1.externs.h

trace $CC $CFLAGS -c $1.c 2>&1 | grep -v used | grep -v "In function" | grep -v memcpy

