Bug 988829 - convert intl/uconv/ucvlatin/ to use Endian.h; r=smontagu

This commit is contained in:
Nathan Froyd 2014-02-26 20:42:29 -05:00
Родитель 69a01a96c8
Коммит 968f30feea
3 изменённых файлов: 15 добавлений и 61 удалений

Просмотреть файл

@ -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: