#! /bin/sh
#
# Copyright (c) 2000, 2005, Oracle and/or its affiliates. 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. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.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;;
int) fulltype=integer;;
*) fulltype=$type;;
esac
case $type in
byte) LBPV=0;;
char | short) LBPV=1;;
int | float) LBPV=2;;
long | double) LBPV=3;;
esac
case $type in
float|double) floatingPointOrIntegralType=floatingPointType;;
*) floatingPointOrIntegralType=integralType;;
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 \
-K$floatingPointOrIntegralType \
-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.template`-bin.java.template
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