From 6243aa2e9019bd3aee8bc7c23ce1cc6f86e387d2 Mon Sep 17 00:00:00 2001
From: brinn <brinn>
Date: Mon, 26 Apr 2010 19:01:02 +0000
Subject: [PATCH] fix: bug in NativeData.copyXXXToByte() methods when using a
 non-native byte order and only overwriting a part of the outArray change: for
 Sparc V8 do not use -fast to avoid using UltraSparcIII instruction set
 commands

SVN: 15645
---
 base/source/c/compile_solaris_sparc.sh        |  4 +--
 base/source/c/copyByteTarget.ctempl           |  8 ++---
 .../cisd/base/convert/NativeDataTests.java    | 33 +++++++++++++++++--
 3 files changed, 37 insertions(+), 8 deletions(-)

diff --git a/base/source/c/compile_solaris_sparc.sh b/base/source/c/compile_solaris_sparc.sh
index edd75cd52a3..99e2dd295b1 100755
--- a/base/source/c/compile_solaris_sparc.sh
+++ b/base/source/c/compile_solaris_sparc.sh
@@ -1,6 +1,6 @@
 #! /bin/bash
 
-cc -G -KPIC -fast -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE -I/usr/java/include -I/usr/java/include/solaris unix.c -o libunix.so
+cc -G -KPIC -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE -I/usr/java/include -I/usr/java/include/solaris unix.c -o libunix.so
 
 # MACHINE_BYTE_ORDER=2 corresponds to 'big endian'
-cc -G -KPIC -fast -DMACHINE_BYTE_ORDER=2 copy*.c  -I/usr/java/include -I/usr/java/include/solaris -o libnativedata.so
+cc -G -KPIC -DMACHINE_BYTE_ORDER=2 copy*.c  -I/usr/java/include -I/usr/java/include/solaris -o libnativedata.so
diff --git a/base/source/c/copyByteTarget.ctempl b/base/source/c/copyByteTarget.ctempl
index f982126e91d..71cba8f7f6d 100644
--- a/base/source/c/copyByteTarget.ctempl
+++ b/base/source/c/copyByteTarget.ctempl
@@ -129,9 +129,9 @@ JNIEXPORT void JNICALL FUNCTIONNAMETB
 
     if (byteOrder > 0 && byteOrder != MACHINE_BYTE_ORDER)
     {
-        jbyte *buf = outArray;
+        jbyte *buf = outArray + outStart;
         int nelmts;
-        for(nelmts=len; nelmts >= 0; --nelmts)
+        for(nelmts = 0; nelmts < len; ++nelmts)
         {
             CHANGE_BYTE_ORDER(buf);
             buf += sizeof(TARGET);
@@ -217,9 +217,9 @@ JNIEXPORT void JNICALL FUNCTIONNAMEBT
 
     if (byteOrder > 0 && byteOrder != MACHINE_BYTE_ORDER)
     {
-        jbyte *buf = (jbyte*) outArray;
+        jbyte *buf = (jbyte*) outArray + outStart;
         int nelmts;
-        for(nelmts=len; nelmts >= 0; --nelmts)
+        for(nelmts = 0; nelmts < len; ++nelmts)
         {
             CHANGE_BYTE_ORDER(buf);
             buf += sizeof(TARGET);
diff --git a/base/sourceTest/java/ch/systemsx/cisd/base/convert/NativeDataTests.java b/base/sourceTest/java/ch/systemsx/cisd/base/convert/NativeDataTests.java
index 9a303599a9b..ef8d4219cb7 100644
--- a/base/sourceTest/java/ch/systemsx/cisd/base/convert/NativeDataTests.java
+++ b/base/sourceTest/java/ch/systemsx/cisd/base/convert/NativeDataTests.java
@@ -24,6 +24,7 @@ import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.util.Arrays;
 
+import org.apache.commons.lang.ArrayUtils;
 import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
 
@@ -99,7 +100,7 @@ public class NativeDataTests
     @Test(dataProvider = "getOfs")
     public void testShortToByteToShort(int sourceOfs, int targetOfs)
     {
-        final int sizeOfTarget = 8;
+        final int sizeOfTarget = 2;
         final short[] orignalArr = new short[]
             { -1, 17, 20000, (short) -50000 };
         final short[] iarr = new short[sourceOfs + orignalArr.length];
@@ -116,7 +117,7 @@ public class NativeDataTests
     @Test(dataProvider = "getOfs")
     public void testFloatToByteToFloat(int sourceOfs, int targetOfs)
     {
-        final int sizeOfTarget = 8;
+        final int sizeOfTarget = 4;
         final float[] orignalArr = new float[]
             { -1, 17, 3.14159f, -1e6f };
         final float[] iarr = new float[sourceOfs + orignalArr.length];
@@ -272,6 +273,34 @@ public class NativeDataTests
         }
     }
 
+    @Test
+    public void testFloatToByteNonNativeByteOrderPartialOutputArray()
+    {
+        final int sizeOfTarget = 4;
+        final ByteOrder nonNativeByteOrder =
+                (NativeData.getNativeByteOrder() == ByteOrder.LITTLE_ENDIAN) ? ByteOrder.BIG_ENDIAN
+                        : ByteOrder.LITTLE_ENDIAN;
+        final float[] iarr = new float[]
+            { -1, 17, 3.14159f, -1e6f };
+        final byte[] headerArray = new byte[]
+            { 1, 2, 3, 4 };
+        final byte[] trailerArray = new byte[]
+            { 5, 6, 7, 8 };
+        final byte[] barr =
+            new byte[iarr.length * sizeOfTarget + headerArray.length + trailerArray.length];
+        System.arraycopy(headerArray, 0, barr, 0, headerArray.length);
+        System.arraycopy(trailerArray, 0, barr, headerArray.length + iarr.length * sizeOfTarget,
+                trailerArray.length);
+        NativeData.copyFloatToByte(iarr, 0, barr, headerArray.length, iarr.length,
+                nonNativeByteOrder);
+        final byte[] headerArray2 = ArrayUtils.subarray(barr, 0, headerArray.length);
+        final byte[] trailerArray2 =
+                ArrayUtils.subarray(barr, headerArray.length + iarr.length * sizeOfTarget,
+                        barr.length);
+        assertTrue(Arrays.equals(headerArray, headerArray2));
+        assertTrue(Arrays.equals(trailerArray, trailerArray2));
+    }
+
     private void afterClass()
     {
     }
-- 
GitLab