mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-08 10:44:56 +00:00
Bug 988829 - convert intl/uconv/ucvlatin/ to use Endian.h; r=smontagu
This commit is contained in:
parent
69a01a96c8
commit
968f30feea
@ -5,6 +5,7 @@
|
||||
|
||||
#include "nsUTF16ToUnicode.h"
|
||||
#include "nsCharTraits.h"
|
||||
#include "mozilla/Endian.h"
|
||||
|
||||
enum {
|
||||
STATE_NORMAL = 0,
|
||||
@ -75,7 +76,7 @@ nsUTF16ToUnicodeBase::UTF16ConvertToUnicode(const char * aSrc,
|
||||
// the 1st byte of a 16-bit code unit was stored in |mOddByte| in the
|
||||
// previous run while the 2nd byte has to come from |*src|.
|
||||
mState = STATE_NORMAL;
|
||||
#ifdef IS_BIG_ENDIAN
|
||||
#if MOZ_BIG_ENDIAN
|
||||
u = (mOddByte << 8) | uint8_t(*src++); // safe, we know we have at least one byte.
|
||||
#else
|
||||
u = (*src++ << 8) | mOddByte; // safe, we know we have at least one byte.
|
||||
@ -209,7 +210,7 @@ nsUTF16BEToUnicode::Convert(const char * aSrc, int32_t * aSrcLength,
|
||||
mState = STATE_SECOND_BYTE;
|
||||
return NS_OK_UDEC_MOREINPUT;
|
||||
}
|
||||
#ifdef IS_LITTLE_ENDIAN
|
||||
#if MOZ_LITTLE_ENDIAN
|
||||
// on LE machines, BE BOM is 0xFFFE
|
||||
if (0xFFFE != *((char16_t*)aSrc)) {
|
||||
mState = STATE_NORMAL;
|
||||
@ -233,14 +234,8 @@ nsUTF16BEToUnicode::Convert(const char * aSrc, int32_t * aSrcLength,
|
||||
break;
|
||||
}
|
||||
|
||||
nsresult rv = UTF16ConvertToUnicode(aSrc, aSrcLength, aDest, aDestLength,
|
||||
#ifdef IS_LITTLE_ENDIAN
|
||||
true
|
||||
#else
|
||||
false
|
||||
#endif
|
||||
);
|
||||
return rv;
|
||||
return UTF16ConvertToUnicode(aSrc, aSrcLength, aDest, aDestLength,
|
||||
bool(MOZ_LITTLE_ENDIAN));
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
@ -262,7 +257,7 @@ nsUTF16LEToUnicode::Convert(const char * aSrc, int32_t * aSrcLength,
|
||||
mState = STATE_SECOND_BYTE;
|
||||
return NS_OK_UDEC_MOREINPUT;
|
||||
}
|
||||
#ifdef IS_BIG_ENDIAN
|
||||
#if MOZ_BIG_ENDIAN
|
||||
// on BE machines, LE BOM is 0xFFFE
|
||||
if (0xFFFE != *((char16_t*)aSrc)) {
|
||||
mState = STATE_NORMAL;
|
||||
@ -286,14 +281,8 @@ nsUTF16LEToUnicode::Convert(const char * aSrc, int32_t * aSrcLength,
|
||||
break;
|
||||
}
|
||||
|
||||
nsresult rv = UTF16ConvertToUnicode(aSrc, aSrcLength, aDest, aDestLength,
|
||||
#ifdef IS_BIG_ENDIAN
|
||||
true
|
||||
#else
|
||||
false
|
||||
#endif
|
||||
);
|
||||
return rv;
|
||||
return UTF16ConvertToUnicode(aSrc, aSrcLength, aDest, aDestLength,
|
||||
bool(MOZ_BIG_ENDIAN));
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
@ -348,12 +337,10 @@ nsUTF16ToUnicode::Convert(const char * aSrc, int32_t * aSrcLength,
|
||||
}
|
||||
|
||||
nsresult rv = UTF16ConvertToUnicode(aSrc, aSrcLength, aDest, aDestLength,
|
||||
#ifdef IS_BIG_ENDIAN
|
||||
#if MOZ_BIG_ENDIAN
|
||||
(mEndian == kLittleEndian)
|
||||
#elif defined(IS_LITTLE_ENDIAN)
|
||||
(mEndian == kBigEndian)
|
||||
#else
|
||||
#error "Unknown endianness"
|
||||
(mEndian == kBigEndian)
|
||||
#endif
|
||||
);
|
||||
|
||||
|
@ -6,8 +6,6 @@
|
||||
#include "nsUnicodeToUTF16.h"
|
||||
#include <string.h>
|
||||
|
||||
inline static void SwapBytes(char *aDest, const char16_t* aSrc, int32_t aLen);
|
||||
|
||||
NS_IMETHODIMP nsUnicodeToUTF16BE::Convert(const char16_t * aSrc, int32_t * aSrcLength,
|
||||
char * aDest, int32_t * aDestLength)
|
||||
{
|
||||
@ -97,40 +95,12 @@ NS_IMETHODIMP nsUnicodeToUTF16BE::SetOutputErrorBehavior(int32_t aBehavior,
|
||||
|
||||
NS_IMETHODIMP nsUnicodeToUTF16BE::CopyData(char* aDest, const char16_t* aSrc, int32_t aLen )
|
||||
{
|
||||
#ifdef IS_BIG_ENDIAN
|
||||
//UnicodeToUTF16SameEndian
|
||||
::memcpy(aDest, (void*) aSrc, aLen * 2);
|
||||
#elif defined(IS_LITTLE_ENDIAN)
|
||||
//UnicodeToUTF16DiffEndian
|
||||
SwapBytes(aDest, aSrc, aLen);
|
||||
#else
|
||||
#error "Unknown endianness"
|
||||
#endif
|
||||
mozilla::NativeEndian::copyAndSwapToBigEndian(aDest, aSrc, aLen);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP nsUnicodeToUTF16LE::CopyData(char* aDest, const char16_t* aSrc, int32_t aLen )
|
||||
{
|
||||
#ifdef IS_LITTLE_ENDIAN
|
||||
//UnicodeToUTF16SameEndian
|
||||
::memcpy(aDest, (void*) aSrc, aLen * 2);
|
||||
#elif defined(IS_BIG_ENDIAN)
|
||||
//UnicodeToUTF16DiffEndian
|
||||
SwapBytes(aDest, aSrc, aLen);
|
||||
#else
|
||||
#error "Unknown endianness"
|
||||
#endif
|
||||
mozilla::NativeEndian::copyAndSwapToLittleEndian(aDest, aSrc, aLen);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
inline void SwapBytes(char *aDest, const char16_t* aSrc, int32_t aLen)
|
||||
{
|
||||
char16_t *p = (char16_t*) aDest;
|
||||
// copy the data by swaping
|
||||
for(int32_t i = 0; i < aLen; i++)
|
||||
{
|
||||
char16_t aChar = *aSrc++;
|
||||
*p++ = (0x00FF & (aChar >> 8)) | (0xFF00 & (aChar << 8));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -7,6 +7,7 @@
|
||||
#define nsUnicodeToUTF16_h_
|
||||
|
||||
#include "nsUCSupport.h"
|
||||
#include "mozilla/Endian.h"
|
||||
|
||||
class nsUnicodeToUTF16BE: public nsBasicEncoder
|
||||
{
|
||||
@ -39,14 +40,10 @@ protected:
|
||||
NS_IMETHOD CopyData(char* aDest, const char16_t* aSrc, int32_t aLen );
|
||||
};
|
||||
|
||||
// XXX In theory, we have to check the endianness at run-time because some
|
||||
// modern RISC processors can be run at both LE and BE.
|
||||
#ifdef IS_LITTLE_ENDIAN
|
||||
#if MOZ_LITTLE_ENDIAN
|
||||
class nsUnicodeToUTF16: public nsUnicodeToUTF16LE
|
||||
#elif defined(IS_BIG_ENDIAN)
|
||||
class nsUnicodeToUTF16: public nsUnicodeToUTF16BE
|
||||
#else
|
||||
#error "Unknown endianness"
|
||||
class nsUnicodeToUTF16: public nsUnicodeToUTF16BE
|
||||
#endif
|
||||
{
|
||||
public:
|
||||
|
Loading…
Reference in New Issue
Block a user