#!/bin/sh -
#
# This file is simply an example of what can be done using the new binary
# and symbol table output functions. As shown it can be used to produce
# a C file containing the encapsulated binary of the assembly, plus any
# public symbols in the source are accessable to the C program.
#
# Use it in a makefile:
#
# .s.v:
#	as86_encap $*.s $*.v $*_ $(AS86FLAGS)
#

[ $# -lt 2 ] && {
   echo "Usage: `basename $0` infile outfile prefix [as86 opts]" 1>&2
   exit 1
}

trap "rm -f _$$.* ; exit 99" 1 2 3 15 

LIBDIR='/usr/lib/bcc'	# Set by make install
BINDIR='/usr/bin'	# Set by make install

# If the one set by install fails then try a couple of others.
[ -x "$LIBDIR/as86" ] || LIBDIR="`dirname $0`"
[ -x "$LIBDIR/as86" ] || LIBDIR="$BINDIR"
[ -x "$LIBDIR/as86" ] || LIBDIR="`dirname $0`/../lib"
[ -x "$LIBDIR/as86" ] || LIBDIR=/usr/bin

IFILE="$1"
OFILE="$2"
PREFIX="`basename $IFILE .s`_"

shift ; shift
if [ $# -ge 1 ]
then case "$1" in 
     -* ) ;; 
     [A-Za-z_]* ) PREFIX="$1"
                  shift
		  ;;
     esac
fi
RV=0

$LIBDIR/as86 "$@" "$IFILE" -b _$$.bin -s _$$.sym || RV=$?

echo '#ifndef __ASSEMBLY__'	 > _$$.0
echo 				>> _$$.0
echo '#else'			 > _$$.3
echo 				>> _$$.3
echo '#endif'			 > _$$.5

[ "$RV" = 0 ] && {
  (
    sort _$$.sym
    echo %%%%
    od -v -t uC _$$.bin
  ) | \
  awk -v prefix=$PREFIX -v ofile=_$$ ' BEGIN{
       sname = prefix "start";
       sn_file= ofile ".1";
       bn_file= ofile ".2";
       as_file= ofile ".4";
    }
    /^%%%%$/ { flg++; 
       if( flg == 1 )
       {
	  if( !started )
	  {
	     printf "#define %s 0\n", sname > sn_file;
	     printf "%s = 0\n", sname > as_file;
	  }

	  printf "static char %sdata[] = {\n", prefix >bn_file;
          bincount=0;
       }
       next;
    }
    flg==0 {
       if(NF == 0) next;
       if( substr($2,1,4) == "0000" ) $2=substr($2,5);
       if( $1 == "+" && $4 == "$start" )
       {
          printf "#define %s 0x%s\n", sname, $2 > sn_file;
          printf "%s = $%s\n", sname, $2 > as_file;
	  started = 1;
       }
       else if( substr($3, 1, 1) == "E" && $4 != "start" && $4 != "size" && $4 != "data" )
       {
          printf "#define %s%s 0x%s\n", prefix, $4, $2 > sn_file;
          printf "%s%s = $%s\n", prefix, $4, $2 > as_file;
       }
       next;
    }
    flg==1 {
        if(NF == 0) next;
	printf "   " > bn_file;
	for(i=2;i<=NF;i++) {
	   if( $i >= 32 && $i < 127 && $i != 39 && $i != 92 )
	      printf("\047%c\047,", $i) > bn_file;
	   else
	      printf("%3d,", $i) > bn_file;
	   bincount++;
	}
	printf "\n" > bn_file;
    }
    END {
       printf "};\n\n" > bn_file;
       printf "#define %ssize %d\n\n", prefix, bincount > sn_file;
       printf "%ssize = $%04x\n\n", prefix, bincount > as_file;
    }
  '
  RV=$?
}

[ "$RV" = 0 ] && {
   if [ "X$OFILE" = "X-" ]
   then cat _$$.[0-9]
   else cat _$$.[0-9] > "$OFILE" || RV=$?
   fi
}

rm -f _$$.*
exit $RV
