#!/bin/sh
# Horrible mangler for keeping two forms of bytecode in sync.
# Should be applied to "newbytecode.h" to give "bytecode_o.h"
case $# in
0) input=
output= ;;
1) input=$1
output= ;;
2) input=$1
output=$2 ;;
*) echo "`basename $0`: too many arguments"
exit 1 ;;
esac
cat $input |\
tail +17 |\
sed -e "/^.*UNUSED_INSTRUCTIONS.*$/d" \
-e "/^.*Case.*/d" \
-e "/^\\\\$/d" \
-e "/^[ ]*$/d" \
-e "s/,[ ]*\\\\$//" \
-e "s/ ins(/\#define /" \
-e "s/)//" |\
awk "BEGIN {i = 0} { print \$0, i; i += 1 }" - |\
( echo "#ifndef _BYTECODE_O_H_" ;
echo "#define _BYTECODE_O_H_" ;
echo '/* This file defines an obsolete form of the bytecode, used by the' ;
echo ' * non-ANSI-C (assembler) backend of the compiler. This obsolete' ;
echo ' * form can be maintained in sync with the "real" bytecode (if the' ;
echo ' * "real" bytecode changes) by running the file script/mangler.' ;
echo ' */' ;
echo; cat; echo;
echo "#endif" ) |\
( if [ -z "$output" ]
then cat
else cat >$output
fi )
# Explanation:
# remove lines upto #define INSTRUCTION_LIST (tail +4)
#
# remove all of defn UNUSED_INSTRUCTIONS
# remove all blank lines with single trailing \
# remove trailing ,[\t]*\
#
# for all remaining lines change ins() into #define
# and add numbering
#
# finally add wrapper
# #ifndef _BYTECODE_O_H_
# #define _BYTECODE_O_H_
# ...
# #endif
|