#! /bin/sh

#
# Copyright 2000-2005 Sun Microsystems, Inc.  All Rights Reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation.  Sun designates this
# particular file as subject to the "Classpath" exception as provided
# by Sun in the LICENSE file that accompanied this code.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
# CA 95054 USA or visit www.sun.com if you need additional information or
# have any questions.
#

# Generate concrete buffer classes

# Required environment variables
#   NAWK SED SPP    To invoke tools
#   TYPE            Primitive type
#   SRC             Source file
#   DST             Destination file
#
# Optional environment variables
#   RW              Mutability: R(ead only), W(ritable)
#   BO              Byte order: B(ig), L(ittle), S(wapped), U(nswapped)
#   BIN             Defined => generate binary-data access methods

type=$TYPE
rw=$RW
rwkey=XX

case $type in
  char)  fulltype=character;;
  *)     fulltype=$type;;
esac

case $type in
  byte)           LBPV=0;;
  char | short)   LBPV=1;;
  int | float)    LBPV=2;;
  long | double)  LBPV=3;;
esac

typesAndBits() {

  type="$1"; BO="$2"
  memtype=$type; swaptype=$type; frombits=; tobits=

  case $type in
    float)   memtype=int
             if [ x$BO != xU ]; then
	       swaptype=int
	       fromBits=Float.intBitsToFloat
	       toBits=Float.floatToRawIntBits
	     fi;;
    double)  memtype=long
             if [ x$BO != xU ]; then
	       swaptype=long
	       fromBits=Double.longBitsToDouble
	       toBits=Double.doubleToRawLongBits
	     fi;;
  esac

  echo memtype=$memtype swaptype=$swaptype fromBits=$fromBits toBits=$toBits

  echo $type $fulltype $memtype $swaptype \
  | $NAWK '{ type = $1; fulltype = $2; memtype = $3; swaptype = $4;
	     x = substr(type, 1, 1);
	     Type = toupper(x) substr(type, 2);
	     Fulltype = toupper(x) substr(fulltype, 2);
	     Memtype = toupper(substr(memtype, 1, 1)) substr(memtype, 2);
	     Swaptype = toupper(substr(swaptype, 1, 1)) substr(swaptype, 2);
	     printf("Type=%s x=%s Fulltype=%s Memtype=%s Swaptype=%s ",
		    Type, x, Fulltype, Memtype, Swaptype); }'

  echo "swap=`if [ x$BO = xS ]; then echo Bits.swap; fi`"

}

eval `typesAndBits $type $BO`

a=`if [ $type = int ]; then echo an; else echo a; fi`
A=`if [ $type = int ]; then echo An; else echo A; fi`

if [ "x$rw" = xR ]; then rwkey=ro; else rwkey=rw; fi

set -e

$SPP <$SRC >$DST \
  -K$type \
  -Dtype=$type \
  -DType=$Type \
  -Dfulltype=$fulltype \
  -DFulltype=$Fulltype \
  -Dx=$x \
  -Dmemtype=$memtype \
  -DMemtype=$Memtype \
  -DSwaptype=$Swaptype \
  -DfromBits=$fromBits \
  -DtoBits=$toBits \
  -DLG_BYTES_PER_VALUE=$LBPV \
  -DBYTES_PER_VALUE="(1 << $LBPV)" \
  -DBO=$BO \
  -Dswap=$swap \
  -DRW=$rw \
  -K$rwkey \
  -Da=$a \
  -DA=$A \
  -Kbo$BO

if [ $BIN ]; then

  genBinOps() {
    type="$1"
    Type=`echo $1 | $NAWK '{ print toupper(substr($1, 1, 1)) substr($1, 2) }'`
    fulltype="$2"
    LBPV="$3"
    nbytes="$4"
    nbytesButOne="$5"
    a=`if [ $type = int ]; then echo an; else echo a; fi`
    src=$6
    eval `typesAndBits $type`
    $SPP <$src \
      -Dtype=$type \
      -DType=$Type \
      -Dfulltype=$fulltype \
      -Dmemtype=$memtype \
      -DMemtype=$Memtype \
      -DfromBits=$fromBits \
      -DtoBits=$toBits \
      -DLG_BYTES_PER_VALUE=$LBPV \
      -DBYTES_PER_VALUE="(1 << $LBPV)" \
      -Dnbytes=$nbytes \
      -DnbytesButOne=$nbytesButOne \
      -DRW=$rw \
      -K$rwkey \
      -Da=$a \
      -be
  }

  mv $DST $DST.tmp
  sed -e '/#BIN/,$d' <$DST.tmp >$DST
  rm -f $DST.tmp
  binops=`dirname $SRC`/`basename $SRC .java`-bin.java
  genBinOps char character 1 two one $binops >>$DST
  genBinOps short short 1 two one $binops >>$DST
  genBinOps int integer 2 four three $binops >>$DST
  genBinOps long long 3 eight seven $binops >>$DST
  genBinOps float float 2 four three $binops >>$DST
  genBinOps double double 3 eight seven $binops >>$DST
  echo '}' >>$DST

fi
