Index: source/common/udataswp.c |
diff --git a/source/common/udataswp.c b/source/common/udataswp.c |
index cacf716610eb7cfff136926f5b0021120555fc4b..06fe85bc463c0defcf4ee78d1c4995ff89acd6cb 100644 |
--- a/source/common/udataswp.c |
+++ b/source/common/udataswp.c |
@@ -1,7 +1,7 @@ |
/* |
******************************************************************************* |
* |
-* Copyright (C) 2003, International Business Machines |
+* Copyright (C) 2003-2014, International Business Machines |
* Corporation and others. All Rights Reserved. |
* |
******************************************************************************* |
@@ -123,6 +123,55 @@ uprv_copyArray32(const UDataSwapper *ds, |
return length; |
} |
+static int32_t U_CALLCONV |
+uprv_swapArray64(const UDataSwapper *ds, |
+ const void *inData, int32_t length, void *outData, |
+ UErrorCode *pErrorCode) { |
+ const uint64_t *p; |
+ uint64_t *q; |
+ int32_t count; |
+ |
+ if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { |
+ return 0; |
+ } |
+ if(ds==NULL || inData==NULL || length<0 || (length&7)!=0 || outData==NULL) { |
+ *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; |
+ return 0; |
+ } |
+ |
+ /* setup and swapping */ |
+ p=(const uint64_t *)inData; |
+ q=(uint64_t *)outData; |
+ count=length/8; |
+ while(count>0) { |
+ uint64_t x=*p++; |
+ x=(x<<56)|((x&0xff00)<<40)|((x&0xff0000)<<24)|((x&0xff000000)<<8)| |
+ ((x>>8)&0xff000000)|((x>>24)&0xff0000)|((x>>40)&0xff00)|(x>>56); |
+ *q++=x; |
+ --count; |
+ } |
+ |
+ return length; |
+} |
+ |
+static int32_t U_CALLCONV |
+uprv_copyArray64(const UDataSwapper *ds, |
+ const void *inData, int32_t length, void *outData, |
+ UErrorCode *pErrorCode) { |
+ if(pErrorCode==NULL || U_FAILURE(*pErrorCode)) { |
+ return 0; |
+ } |
+ if(ds==NULL || inData==NULL || length<0 || (length&7)!=0 || outData==NULL) { |
+ *pErrorCode=U_ILLEGAL_ARGUMENT_ERROR; |
+ return 0; |
+ } |
+ |
+ if(length>0 && inData!=outData) { |
+ uprv_memcpy(outData, inData, length); |
+ } |
+ return length; |
+} |
+ |
static uint16_t U_CALLCONV |
uprv_readSwapUInt16(uint16_t x) { |
return (uint16_t)((x<<8)|(x>>8)); |
@@ -344,8 +393,15 @@ udata_openSwapper(UBool inIsBigEndian, uint8_t inCharset, |
swapper->compareInvChars= outCharset==U_ASCII_FAMILY ? uprv_compareInvAscii : uprv_compareInvEbcdic; |
- swapper->swapArray16= inIsBigEndian==outIsBigEndian ? uprv_copyArray16 : uprv_swapArray16; |
- swapper->swapArray32= inIsBigEndian==outIsBigEndian ? uprv_copyArray32 : uprv_swapArray32; |
+ if(inIsBigEndian==outIsBigEndian) { |
+ swapper->swapArray16=uprv_copyArray16; |
+ swapper->swapArray32=uprv_copyArray32; |
+ swapper->swapArray64=uprv_copyArray64; |
+ } else { |
+ swapper->swapArray16=uprv_swapArray16; |
+ swapper->swapArray32=uprv_swapArray32; |
+ swapper->swapArray64=uprv_swapArray64; |
+ } |
if(inCharset==U_ASCII_FAMILY) { |
swapper->swapInvChars= outCharset==U_ASCII_FAMILY ? uprv_copyAscii : uprv_ebcdicFromAscii; |