diff --git a/intl/uconv/macbuild/uconv.xml b/intl/uconv/macbuild/uconv.xml
index a90570ce1773..c3256f973472 100644
--- a/intl/uconv/macbuild/uconv.xml
+++ b/intl/uconv/macbuild/uconv.xml
@@ -1859,14 +1859,7 @@
Name
- nsUnicodeToUCS4LE.cpp
- MacOS
- Text
- Debug
-
-
- Name
- nsUnicodeToUCS4BE.cpp
+ nsUnicodeToUTF32.cpp
MacOS
Text
Debug
@@ -1901,14 +1894,7 @@
Name
- nsUCS4LEToUnicode.cpp
- MacOS
- Text
- Debug
-
-
- Name
- nsUCS4BEToUnicode.cpp
+ nsUTF32ToUnicode.cpp
MacOS
Text
Debug
@@ -3175,12 +3161,7 @@
Name
- nsUnicodeToUCS4LE.cpp
- MacOS
-
-
- Name
- nsUnicodeToUCS4BE.cpp
+ nsUnicodeToUTF32.cpp
MacOS
@@ -3205,12 +3186,7 @@
Name
- nsUCS4LEToUnicode.cpp
- MacOS
-
-
- Name
- nsUCS4BEToUnicode.cpp
+ nsUTF32ToUnicode.cpp
MacOS
@@ -5491,14 +5467,7 @@
Name
- nsUnicodeToUCS4LE.cpp
- MacOS
- Text
- Debug
-
-
- Name
- nsUnicodeToUCS4BE.cpp
+ nsUnicodeToUTF32.cpp
MacOS
Text
Debug
@@ -5533,14 +5502,7 @@
Name
- nsUCS4LEToUnicode.cpp
- MacOS
- Text
- Debug
-
-
- Name
- nsUCS4BEToUnicode.cpp
+ nsUTF32ToUnicode.cpp
MacOS
Text
Debug
@@ -6807,12 +6769,7 @@
Name
- nsUnicodeToUCS4LE.cpp
- MacOS
-
-
- Name
- nsUnicodeToUCS4BE.cpp
+ nsUnicodeToUTF32.cpp
MacOS
@@ -6837,12 +6794,7 @@
Name
- nsUCS4LEToUnicode.cpp
- MacOS
-
-
- Name
- nsUCS4BEToUnicode.cpp
+ nsUTF32ToUnicode.cpp
MacOS
@@ -8374,13 +8326,7 @@
uconv.shlb
Name
- nsUCS4LEToUnicode.cpp
- MacOS
-
-
- uconv.shlb
- Name
- nsUCS4BEToUnicode.cpp
+ nsUTF32ToUnicode.cpp
MacOS
@@ -8412,13 +8358,7 @@
uconv.shlb
Name
- nsUnicodeToUCS4LE.cpp
- MacOS
-
-
- uconv.shlb
- Name
- nsUnicodeToUCS4BE.cpp
+ nsUnicodeToUTF32.cpp
MacOS
diff --git a/intl/uconv/src/nsUConvModule.cpp b/intl/uconv/src/nsUConvModule.cpp
index d3433e74c7ed..6acf7902bb5c 100644
--- a/intl/uconv/src/nsUConvModule.cpp
+++ b/intl/uconv/src/nsUConvModule.cpp
@@ -126,8 +126,7 @@
#include "nsVPSToUnicode.h"
#include "nsUTF7ToUnicode.h"
#include "nsMUTF7ToUnicode.h"
-#include "nsUCS4BEToUnicode.h"
-#include "nsUCS4LEToUnicode.h"
+#include "nsUTF32ToUnicode.h"
#include "nsUCS2BEToUnicode.h"
#include "nsUCS2LEToUnicode.h"
#include "nsT61ToUnicode.h"
@@ -180,8 +179,7 @@
#include "nsUnicodeToMUTF7.h"
#include "nsUnicodeToUCS2BE.h"
#include "nsUnicodeToUCS2LE.h"
-#include "nsUnicodeToUCS4BE.h"
-#include "nsUnicodeToUCS4LE.h"
+#include "nsUnicodeToUTF32.h"
#include "nsUnicodeToT61.h"
#include "nsUnicodeToUserDefined.h"
#include "nsUnicodeToSymbol.h"
@@ -437,8 +435,8 @@ NS_GENERIC_FACTORY_CONSTRUCTOR(nsUTF7ToUnicode);
NS_GENERIC_FACTORY_CONSTRUCTOR(nsMUTF7ToUnicode);
NS_GENERIC_FACTORY_CONSTRUCTOR(nsUTF16BEToUnicode);
NS_GENERIC_FACTORY_CONSTRUCTOR(nsUTF16LEToUnicode);
-NS_GENERIC_FACTORY_CONSTRUCTOR(nsUCS4BEToUnicode);
-NS_GENERIC_FACTORY_CONSTRUCTOR(nsUCS4LEToUnicode);
+NS_GENERIC_FACTORY_CONSTRUCTOR(nsUTF32BEToUnicode);
+NS_GENERIC_FACTORY_CONSTRUCTOR(nsUTF32LEToUnicode);
NS_GENERIC_FACTORY_CONSTRUCTOR(nsUnicodeToUEscape);
NS_GENERIC_FACTORY_CONSTRUCTOR(nsUEscapeToUnicode);
NS_GENERIC_FACTORY_CONSTRUCTOR(nsUnicodeToUTF7);
@@ -446,8 +444,8 @@ NS_GENERIC_FACTORY_CONSTRUCTOR(nsUnicodeToMUTF7);
NS_GENERIC_FACTORY_CONSTRUCTOR(nsUnicodeToUTF16BE);
NS_GENERIC_FACTORY_CONSTRUCTOR(nsUnicodeToUTF16LE);
NS_GENERIC_FACTORY_CONSTRUCTOR(nsUnicodeToUTF16);
-NS_GENERIC_FACTORY_CONSTRUCTOR(nsUnicodeToUCS4BE);
-NS_GENERIC_FACTORY_CONSTRUCTOR(nsUnicodeToUCS4LE);
+NS_GENERIC_FACTORY_CONSTRUCTOR(nsUnicodeToUTF32BE);
+NS_GENERIC_FACTORY_CONSTRUCTOR(nsUnicodeToUTF32LE);
NS_GENERIC_FACTORY_CONSTRUCTOR(nsUnicodeToLangBoxArabic8);
// ucvibm
@@ -958,12 +956,12 @@ static const nsModuleComponentInfo components[] =
{
DECODER_NAME_BASE "UTF-32BE" , NS_UTF32BETOUNICODE_CID,
NS_UNICODEDECODER_CONTRACTID_BASE "UTF-32BE",
- nsUCS4BEToUnicodeConstructor ,
+ nsUTF32BEToUnicodeConstructor ,
},
{
DECODER_NAME_BASE "UTF-32LE" , NS_UTF32LETOUNICODE_CID,
NS_UNICODEDECODER_CONTRACTID_BASE "UTF-32LE",
- nsUCS4LEToUnicodeConstructor ,
+ nsUTF32LEToUnicodeConstructor ,
},
{
DECODER_NAME_BASE "T.61-8bit" , NS_T61TOUNICODE_CID,
@@ -1258,12 +1256,12 @@ static const nsModuleComponentInfo components[] =
{
ENCODER_NAME_BASE "UTF-32BE" , NS_UNICODETOUTF32BE_CID,
NS_UNICODEENCODER_CONTRACTID_BASE "UTF-32BE",
- nsUnicodeToUCS4BEConstructor,
+ nsUnicodeToUTF32BEConstructor,
},
{
ENCODER_NAME_BASE "UTF-32LE" , NS_UNICODETOUTF32LE_CID,
NS_UNICODEENCODER_CONTRACTID_BASE "UTF-32LE",
- nsUnicodeToUCS4LEConstructor,
+ nsUnicodeToUTF32LEConstructor,
},
{
ENCODER_NAME_BASE "T.61-8bit" , NS_UNICODETOT61_CID,
diff --git a/intl/uconv/ucvlatin/Makefile.in b/intl/uconv/ucvlatin/Makefile.in
index eb7f98eb228f..557e793a69a6 100644
--- a/intl/uconv/ucvlatin/Makefile.in
+++ b/intl/uconv/ucvlatin/Makefile.in
@@ -93,8 +93,7 @@ CPPSRCS = \
nsMUTF7ToUnicode.cpp \
nsUCS2BEToUnicode.cpp \
nsUCS2LEToUnicode.cpp \
- nsUCS4BEToUnicode.cpp \
- nsUCS4LEToUnicode.cpp \
+ nsUTF32ToUnicode.cpp \
nsT61ToUnicode.cpp \
nsUserDefinedToUnicode.cpp \
nsUnicodeToUEscape.cpp \
@@ -155,8 +154,7 @@ CPPSRCS = \
nsUnicodeToMUTF7.cpp \
nsUnicodeToUCS2BE.cpp \
nsUnicodeToUCS2LE.cpp \
- nsUnicodeToUCS4BE.cpp \
- nsUnicodeToUCS4LE.cpp \
+ nsUnicodeToUTF32.cpp \
nsUnicodeToT61.cpp \
nsUnicodeToUserDefined.cpp \
nsUnicodeToSymbol.cpp \
diff --git a/intl/uconv/ucvlatin/nsUCS4BEToUnicode.cpp b/intl/uconv/ucvlatin/nsUCS4BEToUnicode.cpp
deleted file mode 100644
index 2af0aa1c2488..000000000000
--- a/intl/uconv/ucvlatin/nsUCS4BEToUnicode.cpp
+++ /dev/null
@@ -1,77 +0,0 @@
-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: NPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Netscape Public License
- * Version 1.1 (the "License"); you may not use this file except in
- * compliance with the License. You may obtain a copy of the License at
- * http://www.mozilla.org/NPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is Mozilla Communicator client code.
- *
- * The Initial Developer of the Original Code is
- * Netscape Communications Corporation.
- * Portions created by the Initial Developer are Copyright (C) 1998
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the NPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the NPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-#include "nsUCS4BEToUnicode.h"
-
-//----------------------------------------------------------------------
-// Global functions and data [declaration]
-
-static const PRUint16 g_UCS4BEMappingTable[] = {
- 0x0001, 0x0004, 0x0005, 0x0008, 0x0000, 0x0000, 0xFFFF, 0x0000
-};
-
-static const PRInt16 g_UCS4BEShiftTable[] = {
- 0, u4BytesCharset,
- ShiftCell(0, 0, 0, 0, 0, 0, 0, 0),
-};
-
-//----------------------------------------------------------------------
-// Class nsUCS4BEToUnicode [implementation]
-
-nsUCS4BEToUnicode::nsUCS4BEToUnicode()
-: nsTableDecoderSupport((uShiftTable*) &g_UCS4BEShiftTable,
- (uMappingTable*) &g_UCS4BEMappingTable, 0)
-{
-}
-
-//----------------------------------------------------------------------
-// Subclassing of nsTableDecoderSupport class [implementation]
-
-NS_IMETHODIMP nsUCS4BEToUnicode::GetMaxLength(const char * aSrc,
- PRInt32 aSrcLength,
- PRInt32 * aDestLength)
-{
- if(0 == (aSrcLength % 4))
- {
- *aDestLength = aSrcLength / 4;
- return NS_OK_UENC_EXACTLENGTH;
- } else {
- *aDestLength = (aSrcLength / 4) + 1;
- return NS_OK;
- }
-}
diff --git a/intl/uconv/ucvlatin/nsUCS4LEToUnicode.cpp b/intl/uconv/ucvlatin/nsUCS4LEToUnicode.cpp
deleted file mode 100644
index 89bfc7f35fe5..000000000000
--- a/intl/uconv/ucvlatin/nsUCS4LEToUnicode.cpp
+++ /dev/null
@@ -1,77 +0,0 @@
-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: NPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Netscape Public License
- * Version 1.1 (the "License"); you may not use this file except in
- * compliance with the License. You may obtain a copy of the License at
- * http://www.mozilla.org/NPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is Mozilla Communicator client code.
- *
- * The Initial Developer of the Original Code is
- * Netscape Communications Corporation.
- * Portions created by the Initial Developer are Copyright (C) 1998
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the NPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the NPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-#include "nsUCS4LEToUnicode.h"
-
-//----------------------------------------------------------------------
-// Global functions and data [declaration]
-
-static const PRUint16 g_UCS4LEMappingTable[] = {
- 0x0001, 0x0004, 0x0005, 0x0008, 0x0000, 0x0000, 0xFFFF, 0x0000
-};
-
-static const PRInt16 g_UCS4LEShiftTable[] = {
- 0, u4BytesSwapCharset,
- ShiftCell(0, 0, 0, 0, 0, 0, 0, 0),
-};
-
-//----------------------------------------------------------------------
-// Class nsUCS4LEToUnicode [implementation]
-
-nsUCS4LEToUnicode::nsUCS4LEToUnicode()
-: nsTableDecoderSupport((uShiftTable*) &g_UCS4LEShiftTable,
- (uMappingTable*) &g_UCS4LEMappingTable, 0)
-{
-}
-
-//----------------------------------------------------------------------
-// Subclassing of nsTableDecoderSupport class [implementation]
-
-NS_IMETHODIMP nsUCS4LEToUnicode::GetMaxLength(const char * aSrc,
- PRInt32 aSrcLength,
- PRInt32 * aDestLength)
-{
- if(0 == (aSrcLength % 4))
- {
- *aDestLength = aSrcLength / 4;
- return NS_OK_UENC_EXACTLENGTH;
- } else {
- *aDestLength = (aSrcLength / 4) + 1;
- return NS_OK;
- }
-}
diff --git a/intl/uconv/ucvlatin/nsUCS4LEToUnicode.h b/intl/uconv/ucvlatin/nsUCS4LEToUnicode.h
deleted file mode 100644
index 6d9e0615f1c2..000000000000
--- a/intl/uconv/ucvlatin/nsUCS4LEToUnicode.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: NPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Netscape Public License
- * Version 1.1 (the "License"); you may not use this file except in
- * compliance with the License. You may obtain a copy of the License at
- * http://www.mozilla.org/NPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is Mozilla Communicator client code.
- *
- * The Initial Developer of the Original Code is
- * Netscape Communications Corporation.
- * Portions created by the Initial Developer are Copyright (C) 1998
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the NPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the NPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-#ifndef nsUCS4LEToUnicode_h___
-#define nsUCS4LEToUnicode_h___
-
-#include "nsUCSupport.h"
-
-//----------------------------------------------------------------------
-// Class nsUCS4LEToUnicode [declaration]
-
-/**
- * A character set converter from UCS4LE to Unicode.
- *
- * @created 18/Mar/1998
- * @author Catalin Rotaru [CATA]
- */
-class nsUCS4LEToUnicode : public nsTableDecoderSupport
-{
-public:
-
- /**
- * Class constructor.
- */
- nsUCS4LEToUnicode();
-
-protected:
-
- //--------------------------------------------------------------------
- // Subclassing of nsDecoderSupport class [declaration]
-
- NS_IMETHOD GetMaxLength(const char * aSrc, PRInt32 aSrcLength,
- PRInt32 * aDestLength);
-};
-
-#endif /* nsUCS4LEToUnicode_h___ */
diff --git a/intl/uconv/ucvlatin/nsUTF32ToUnicode.cpp b/intl/uconv/ucvlatin/nsUTF32ToUnicode.cpp
new file mode 100644
index 000000000000..0c48af0da9b1
--- /dev/null
+++ b/intl/uconv/ucvlatin/nsUTF32ToUnicode.cpp
@@ -0,0 +1,237 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:expandtab:shiftwidth=2:tabstop=2:
+ */
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: NPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Netscape Public License
+ * Version 1.1 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/NPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is Mozilla Communicator client code.
+ *
+ * The Initial Developer of the Original Code is
+ * Netscape Communications Corporation.
+ * Portions created by the Initial Developer are Copyright (C) 1998
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s): Jungshik Shin
+ *
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the NPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the NPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+#include "nsUCSupport.h"
+#include "nsUTF32ToUnicode.h"
+#include
+
+//----------------------------------------------------------------------
+// static functions and macro definition common to nsUTF32(BE|LE)ToUnicode
+
+#ifdef IS_BIG_ENDIAN
+#define LE_STRING_TO_UCS4(s) \
+ (PRUint8(*(s)) | (PRUint8(*((s) + 1)) << 8) | \
+ (PRUint8(*((s) + 2)) << 16) | (PRUint8(*((s) + 3)) << 24))
+#else
+#define LE_STRING_TO_UCS4(s) (*(PRUint32*) (s))
+#endif
+
+#ifdef IS_BIG_ENDIAN
+#define BE_STRING_TO_UCS4(s) (*(PRUint32*) (s))
+#else
+#define BE_STRING_TO_UCS4(s) \
+ (PRUint8(*((s) + 3)) | (PRUint8(*((s) + 2)) << 8) | \
+ (PRUint8(*((s) + 1)) << 16) | (PRUint8(*(s)) << 24))
+#endif
+
+static nsresult ConvertCommon(const char * aSrc,
+ PRInt32 * aSrcLength,
+ PRUnichar * aDest,
+ PRInt32 * aDestLength,
+ PRUint16 * aState,
+ PRUint8 * aBuffer,
+ PRBool aIsLE)
+{
+
+ NS_ENSURE_TRUE(*aState < 4, NS_ERROR_INVALID_ARG);
+ NS_ENSURE_TRUE(*aDestLength > 0, NS_ERROR_INVALID_ARG);
+
+ const char *src = aSrc;
+ const char *srcEnd = aSrc + *aSrcLength;
+
+ PRUnichar *dest = aDest;
+ PRUnichar *destEnd = aDest + *aDestLength;
+
+ if (*aState > *aSrcLength)
+ {
+ memcpy(aBuffer + 4 - *aState, src, *aSrcLength);
+ *aDestLength = 0;
+ *aState -= *aSrcLength;
+ return NS_OK_UDEC_MOREINPUT;
+ }
+
+ PRUint32 ucs4;
+
+ // prev. run left a partial UTF-32 seq.
+ if (*aState > 0)
+ {
+ memcpy(aBuffer + 4 - *aState, src, *aState);
+ ucs4 = aIsLE ? LE_STRING_TO_UCS4(aBuffer) : BE_STRING_TO_UCS4(aBuffer);
+ if (ucs4 < 0x10000L) // BMP
+ {
+ // XXX Do we have to convert surrogate code points to the replacement
+ // character (0xfffd)?
+ *dest++= PRUnichar(ucs4);
+ }
+ else if (ucs4 < 0x110000L) // plane 1 through plane 16
+ {
+ if (destEnd - dest < 2)
+ {
+ *aSrcLength = 0;
+ *aDestLength = 0;
+ return NS_OK_UDEC_MOREOUTPUT;
+ }
+ // ((ucs4 - 0x10000) >> 10) + 0xd800;
+ *dest++= PRUnichar((ucs4 >> 10) + 0xd7c0); // high surrogate
+ *dest++= PRUnichar(ucs4 & 0x3ffL | 0xdc00); // low surrogate
+ }
+ // Codepoints in plane 17 and higher (> 0x10ffff)
+ // are not representable in UTF-16 we use for the internal
+ // character representation. This is not a problem
+ // because Unicode/ISO 10646 will never assign characters
+ // in plane 17 and higher. Therefore, we convert them
+ // to Unicode replacement character (0xfffd).
+ else
+ *dest++ = 0xfffd;
+ src += *aState;
+ *aState = 0;
+ }
+
+ nsresult rv = NS_OK; // conversion result
+
+ for ( ; src < srcEnd && dest < destEnd; src += 4)
+ {
+ if (srcEnd - src < 4)
+ {
+ // fill up aBuffer until src buffer gets exhausted.
+ memcpy(aBuffer, src, srcEnd - src);
+ *aState = 4 - (srcEnd - src); // set add. char to read in next run
+ src = srcEnd;
+ rv = NS_OK_UDEC_MOREINPUT;
+ break;
+ }
+
+ ucs4 = aIsLE ? LE_STRING_TO_UCS4(src) : BE_STRING_TO_UCS4(src);
+ if (ucs4 < 0x10000L) // BMP
+ {
+ // XXX Do we have to convert surrogate code points to the replacement
+ // character (0xfffd)?
+ *dest++= PRUnichar(ucs4);
+ }
+ else if (ucs4 < 0x110000L) // plane 1 through plane 16
+ {
+ if (destEnd - dest < 2)
+ break;
+ // ((ucs4 - 0x10000) >> 10) + 0xd800;
+ *dest++= PRUnichar((ucs4 >> 10) + 0xd7c0);
+ *dest++= PRUnichar(ucs4 & 0x3ffL | 0xdc00);
+ }
+ else // plane 17 and higher
+ *dest++ = 0xfffd;
+ }
+
+ //output not finished, output buffer too short
+ if((NS_OK == rv) && (src < srcEnd) && (dest >= destEnd))
+ rv = NS_OK_UDEC_MOREOUTPUT;
+
+ *aSrcLength = src - aSrc;
+ *aDestLength = dest - aDest;
+
+ return rv;
+}
+
+
+//----------------------------------------------------------------------
+// Class nsUTF32ToUnicode [implementation]
+
+nsUTF32ToUnicode::nsUTF32ToUnicode() : nsBasicDecoderSupport()
+{
+ Reset();
+}
+
+//----------------------------------------------------------------------
+// Subclassing of nsDecoderSupport class [implementation]
+
+NS_IMETHODIMP nsUTF32ToUnicode::GetMaxLength(const char * aSrc,
+ PRInt32 aSrcLength,
+ PRInt32 * aDestLength)
+{
+ // Non-BMP characters take two PRUnichars(a pair of surrogate codepoints)
+ // so that we have to divide by 2 instead of 4 for the worst case.
+ *aDestLength = aSrcLength / 2;
+ return NS_OK;
+}
+
+
+//----------------------------------------------------------------------
+// Subclassing of nsBasicDecoderSupport class [implementation]
+
+NS_IMETHODIMP nsUTF32ToUnicode::Reset()
+{
+ // the number of additional bytes to read to complete UTF-32 4byte seq.
+ mState = 0;
+ memset(mBufferInc, 0, 4);
+ return NS_OK;
+
+}
+
+
+//----------------------------------------------------------------------
+// Class nsUTF32BEToUnicode [implementation]
+
+//----------------------------------------------------------------------
+// Subclassing of nsUTF32ToUnicode class [implementation]
+
+NS_IMETHODIMP nsUTF32BEToUnicode::Convert(const char * aSrc,
+ PRInt32 * aSrcLength,
+ PRUnichar * aDest,
+ PRInt32 * aDestLength)
+{
+ return ConvertCommon(aSrc, aSrcLength, aDest, aDestLength, &mState,
+ mBufferInc, PR_FALSE);
+}
+
+//----------------------------------------------------------------------
+// Class nsUTF32LEToUnicode [implementation]
+
+//----------------------------------------------------------------------
+// Subclassing of nsUTF32ToUnicode class [implementation]
+
+NS_IMETHODIMP nsUTF32LEToUnicode::Convert(const char * aSrc,
+ PRInt32 * aSrcLength,
+ PRUnichar * aDest,
+ PRInt32 * aDestLength)
+{
+ return ConvertCommon(aSrc, aSrcLength, aDest, aDestLength, &mState,
+ mBufferInc, PR_TRUE);
+}
+
+// XXX : What to do with 'unflushed' mBufferInc?? : Finish()
+
diff --git a/intl/uconv/ucvlatin/nsUCS4BEToUnicode.h b/intl/uconv/ucvlatin/nsUTF32ToUnicode.h
similarity index 50%
rename from intl/uconv/ucvlatin/nsUCS4BEToUnicode.h
rename to intl/uconv/ucvlatin/nsUTF32ToUnicode.h
index 0892d01774c2..b5e9fb20137b 100644
--- a/intl/uconv/ucvlatin/nsUCS4BEToUnicode.h
+++ b/intl/uconv/ucvlatin/nsUTF32ToUnicode.h
@@ -1,4 +1,6 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:expandtab:shiftwidth=2:tabstop=2:
+ */
/* ***** BEGIN LICENSE BLOCK *****
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
*
@@ -19,7 +21,7 @@
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
- * Contributor(s):
+ * Contributor(s): Jungshik Shin
*
*
* Alternatively, the contents of this file may be used under the terms of
@@ -36,35 +38,92 @@
*
* ***** END LICENSE BLOCK ***** */
-#ifndef nsUCS4BEToUnicode_h___
-#define nsUCS4BEToUnicode_h___
-
-#include "nsUCSupport.h"
+#ifndef nsUTF32ToUnicode_h___
+#define nsUTF32ToUnicode_h___
//----------------------------------------------------------------------
-// Class nsUCS4BEToUnicode [declaration]
+// Class nsUTF32ToUnicode [declaration]
/**
- * A character set converter from UCS4BE to Unicode.
- *
- * @created 18/Mar/1998
+ * A character set converter from UTF32 to Unicode.
+ * The base class for UTF32BE/UTF32LE to Unicode converters.
+ * @created 08/Dec/2002
+ * @author Jungshik Shin
*/
-class nsUCS4BEToUnicode : public nsTableDecoderSupport
+
+class nsUTF32ToUnicode : public nsBasicDecoderSupport
{
+
public:
/**
* Class constructor.
*/
- nsUCS4BEToUnicode();
+ nsUTF32ToUnicode();
protected:
+ // the number of additional bytes to read to complete an incomplete UTF-32 4byte seq.
+ PRUint16 mState;
+ // buffer for an incomplete UTF-32 sequence.
+ PRUint8 mBufferInc[4];
+
//--------------------------------------------------------------------
- // Subclassing of nsDecoderSupport class [declaration]
+ // Subclassing of nsBasicDecoderSupport class [declaration]
NS_IMETHOD GetMaxLength(const char * aSrc, PRInt32 aSrcLength,
- PRInt32 * aDestLength);
+ PRInt32 * aDestLength);
+
+ NS_IMETHOD Reset();
+
};
-#endif /* nsUCS4BEToUnicode_h___ */
+//----------------------------------------------------------------------
+// Class nsUTF32BEToUnicode [declaration]
+
+/**
+ * A character set converter from UTF32BE to Unicode.
+ * A subclass of UTF32ToUnicode.
+ * @created 08/Dec/2002
+ * @author Jungshik Shin
+ */
+
+class nsUTF32BEToUnicode : public nsUTF32ToUnicode
+{
+public:
+
+
+ //--------------------------------------------------------------------
+ // Subclassing of nsBasicDecoderSupport class [declaration]
+
+ NS_IMETHOD Convert(const char * aSrc, PRInt32 * aSrcLength,
+ PRUnichar * aDest, PRInt32 * aDestLength);
+
+
+};
+
+//----------------------------------------------------------------------
+// Class nsUTF32LEToUnicode [declaration]
+
+/**
+ * A character set converter from UTF32LE to Unicode.
+ * A subclass of UTF32ToUnicode.
+ * @created 08/Dec/2002
+ * @author Jungshik Shin
+ */
+
+class nsUTF32LEToUnicode : public nsUTF32ToUnicode
+{
+public:
+
+
+ //--------------------------------------------------------------------
+ // Subclassing of nsBasicDecoderSupport class [declaration]
+
+ NS_IMETHOD Convert(const char * aSrc, PRInt32 * aSrcLength,
+ PRUnichar * aDest, PRInt32 * aDestLength);
+
+};
+
+#endif /* nsUTF32ToUnicode_h___ */
+
diff --git a/intl/uconv/ucvlatin/nsUnicodeToUCS4BE.cpp b/intl/uconv/ucvlatin/nsUnicodeToUCS4BE.cpp
deleted file mode 100644
index a569ce74fd81..000000000000
--- a/intl/uconv/ucvlatin/nsUnicodeToUCS4BE.cpp
+++ /dev/null
@@ -1,70 +0,0 @@
-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: NPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Netscape Public License
- * Version 1.1 (the "License"); you may not use this file except in
- * compliance with the License. You may obtain a copy of the License at
- * http://www.mozilla.org/NPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is Mozilla Communicator client code.
- *
- * The Initial Developer of the Original Code is
- * Netscape Communications Corporation.
- * Portions created by the Initial Developer are Copyright (C) 1998
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the NPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the NPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-#include "nsUnicodeToUCS4BE.h"
-#include
-
-//----------------------------------------------------------------------
-// Global functions and data [declaration]
-
-static const PRUint16 g_UCS4BEMappingTable[] = {
- 0x0001, 0x0004, 0x0005, 0x0008, 0x0000, 0x0000, 0xFFFF, 0x0000
-};
-
-static const PRInt16 g_UCS4BEShiftTable[] = {
- 0, u4BytesCharset,
- ShiftCell(0, 0, 0, 0, 0, 0, 0, 0)
-};
-
-//----------------------------------------------------------------------
-// Class nsUnicodeToUCS4BE [implementation]
-
-nsUnicodeToUCS4BE::nsUnicodeToUCS4BE()
-: nsTableEncoderSupport((uShiftTable*) &g_UCS4BEShiftTable,
- (uMappingTable*) &g_UCS4BEMappingTable, 4)
-{
-}
-
-//----------------------------------------------------------------------
-// Subclassing of nsTableEncoderSupport class [implementation]
-
-NS_IMETHODIMP nsUnicodeToUCS4BE::FillInfo(PRUint32 *aInfo)
-{
- memset(aInfo, 0xFF, (0x10000L >> 3));
- return NS_OK;
-}
diff --git a/intl/uconv/ucvlatin/nsUnicodeToUCS4BE.h b/intl/uconv/ucvlatin/nsUnicodeToUCS4BE.h
deleted file mode 100644
index 44561252890d..000000000000
--- a/intl/uconv/ucvlatin/nsUnicodeToUCS4BE.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: NPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Netscape Public License
- * Version 1.1 (the "License"); you may not use this file except in
- * compliance with the License. You may obtain a copy of the License at
- * http://www.mozilla.org/NPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is Mozilla Communicator client code.
- *
- * The Initial Developer of the Original Code is
- * Netscape Communications Corporation.
- * Portions created by the Initial Developer are Copyright (C) 1998
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the NPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the NPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-#ifndef nsUnicodeToUCS4BE_h___
-#define nsUnicodeToUCS4BE_h___
-
-#include "nsUCSupport.h"
-
-//----------------------------------------------------------------------
-// Class nsUnicodeToUCS4BE [declaration]
-
-/**
- * A character set converter from Unicode to UCS4BE.
- *
- * @created 05/Apr/1999
- */
-class nsUnicodeToUCS4BE : public nsTableEncoderSupport
-{
-public:
-
- /**
- * Class constructor.
- */
- nsUnicodeToUCS4BE();
-
- NS_IMETHOD FillInfo(PRUint32* aInfo);
-
-};
-
-#endif /* nsUnicodeToUCS4BE_h___ */
diff --git a/intl/uconv/ucvlatin/nsUnicodeToUCS4LE.cpp b/intl/uconv/ucvlatin/nsUnicodeToUCS4LE.cpp
deleted file mode 100644
index 136d306cfbeb..000000000000
--- a/intl/uconv/ucvlatin/nsUnicodeToUCS4LE.cpp
+++ /dev/null
@@ -1,70 +0,0 @@
-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: NPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Netscape Public License
- * Version 1.1 (the "License"); you may not use this file except in
- * compliance with the License. You may obtain a copy of the License at
- * http://www.mozilla.org/NPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is Mozilla Communicator client code.
- *
- * The Initial Developer of the Original Code is
- * Netscape Communications Corporation.
- * Portions created by the Initial Developer are Copyright (C) 1998
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the NPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the NPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-#include "nsUnicodeToUCS4LE.h"
-#include
-
-//----------------------------------------------------------------------
-// Global functions and data [declaration]
-
-static const PRUint16 g_UCS4LEMappingTable[] = {
- 0x0001, 0x0004, 0x0005, 0x0008, 0x0000, 0x0000, 0xFFFF, 0x0000
-};
-
-static const PRInt16 g_UCS4LEShiftTable[] = {
- 0, u4BytesSwapCharset,
- ShiftCell(0, 0, 0, 0, 0, 0, 0, 0)
-};
-
-//----------------------------------------------------------------------
-// Class nsUnicodeToUCS4LE [implementation]
-
-nsUnicodeToUCS4LE::nsUnicodeToUCS4LE()
-: nsTableEncoderSupport((uShiftTable*) &g_UCS4LEShiftTable,
- (uMappingTable*) &g_UCS4LEMappingTable, 4)
-{
-}
-
-//----------------------------------------------------------------------
-// Subclassing of nsTableEncoderSupport class [implementation]
-
-NS_IMETHODIMP nsUnicodeToUCS4LE::FillInfo(PRUint32 *aInfo)
-{
- memset(aInfo, 0xFF, (0x10000L >> 3));
- return NS_OK;
-}
diff --git a/intl/uconv/ucvlatin/nsUnicodeToUCS4LE.h b/intl/uconv/ucvlatin/nsUnicodeToUCS4LE.h
deleted file mode 100644
index c3c025db52b9..000000000000
--- a/intl/uconv/ucvlatin/nsUnicodeToUCS4LE.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: NPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Netscape Public License
- * Version 1.1 (the "License"); you may not use this file except in
- * compliance with the License. You may obtain a copy of the License at
- * http://www.mozilla.org/NPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is Mozilla Communicator client code.
- *
- * The Initial Developer of the Original Code is
- * Netscape Communications Corporation.
- * Portions created by the Initial Developer are Copyright (C) 1998
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the NPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the NPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-#ifndef nsUnicodeToUCS4LE_h___
-#define nsUnicodeToUCS4LE_h___
-
-#include "nsUCSupport.h"
-
-//----------------------------------------------------------------------
-// Class nsUnicodeToUCS4LE [declaration]
-
-/**
- * A character set converter from Unicode to UCS4LE.
- *
- * @created 05/Apr/1999
- * @author Catalin Rotaru [CATA]
- */
-class nsUnicodeToUCS4LE : public nsTableEncoderSupport
-{
-public:
-
- /**
- * Class constructor.
- */
- nsUnicodeToUCS4LE();
-
- NS_IMETHOD FillInfo(PRUint32* aInfo);
-
-};
-
-#endif /* nsUnicodeToUCS4LE_h___ */
diff --git a/intl/uconv/ucvlatin/nsUnicodeToUTF32.cpp b/intl/uconv/ucvlatin/nsUnicodeToUTF32.cpp
new file mode 100644
index 000000000000..b058cc0a579b
--- /dev/null
+++ b/intl/uconv/ucvlatin/nsUnicodeToUTF32.cpp
@@ -0,0 +1,262 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:expandtab:shiftwidth=2:tabstop=2:
+ */
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: NPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Netscape Public License
+ * Version 1.1 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/NPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is Mozilla Communicator client code.
+ *
+ * The Initial Developer of the Original Code is
+ * Netscape Communications Corporation.
+ * Portions created by the Initial Developer are Copyright (C) 1998
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s): Jungshik Shin
+ *
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the NPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the NPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+#include
+#include "nsUCSupport.h"
+#include "nsUnicodeToUTF32.h"
+
+#ifdef IS_BIG_ENDIAN
+#define UCS4_TO_LE_STRING(u, s) \
+ PR_BEGIN_MACRO \
+ s[3] = PRUint8(((u) >> 24) & 0xffL); \
+ s[2] = PRUint8(((u) >> 16) & 0xffL); \
+ s[1] = PRUint8(((u) >> 8) & 0xffL); \
+ s[0] = PRUint8((u) & 0xffL); \
+ PR_END_MACRO
+#else
+#define UCS4_TO_LE_STRING(u, s) \
+ PR_BEGIN_MACRO \
+ *((PRUint32*)(s)) = (u); \
+ PR_END_MACRO
+#endif
+
+#ifdef IS_BIG_ENDIAN
+#define UCS4_TO_BE_STRING(u, s) \
+ PR_BEGIN_MACRO \
+ *((PRUint32*)(s)) = (u); \
+ PR_END_MACRO
+#else
+#define UCS4_TO_BE_STRING(u, s) \
+ PR_BEGIN_MACRO \
+ s[0] = PRUint8(((u) >> 24) & 0xffL); \
+ s[1] = PRUint8(((u) >> 16) & 0xffL); \
+ s[2] = PRUint8(((u) >> 8) & 0xffL); \
+ s[3] = PRUint8((u) & 0xffL); \
+ PR_END_MACRO
+#endif
+
+//----------------------------------------------------------------------
+// Static functions common to nsUnicodeToUTF32LE and nsUnicodeToUTF32BE
+
+static nsresult ConvertCommon(const PRUnichar * aSrc,
+ PRInt32 * aSrcLength,
+ char * aDest,
+ PRInt32 * aDestLength,
+ PRUnichar * aHighSurrogate,
+ PRBool aIsLE)
+{
+ const PRUnichar * src = aSrc;
+ const PRUnichar * srcEnd = aSrc + *aSrcLength;
+ char * dest = aDest;
+ const char * destEnd = aDest + *aDestLength;
+ PRUint32 ucs4;
+
+
+ // left-over high surroage code point from the prev. run.
+ if (*aHighSurrogate)
+ {
+ if (! *aSrcLength)
+ {
+ *aDestLength = 0;
+ return NS_OK_UENC_MOREINPUT;
+ }
+ if (*aDestLength < 4)
+ {
+ *aSrcLength = 0;
+ *aDestLength = 0;
+ return NS_OK_UENC_MOREOUTPUT;
+ }
+ if ((*src & 0xfc00) != 0xdc00) // Not a low surrogate codepoint. Unpaird.
+ ucs4 = PRUint32(*aHighSurrogate);
+ else
+ ucs4 = (((*aHighSurrogate & 0x3ffL) << 10) | (*src & 0x3ffL)) + 0x10000;
+
+ ++src;
+ if (aIsLE)
+ UCS4_TO_LE_STRING(ucs4, dest);
+ else
+ UCS4_TO_BE_STRING(ucs4, dest);
+ dest += 4;
+ *aHighSurrogate = 0;
+ }
+
+ while (src < srcEnd) {
+ // regular codepoint or an unpaired low surrogate
+ if ((src[0] & 0xfc00) != 0xd800)
+ {
+ if (destEnd - dest < 4)
+ goto error_more_output;
+ ucs4 = PRUint32(src[0]);
+ }
+ else // high surrogate
+ {
+ if ((src+1) >= srcEnd) {
+ //we need another surrogate to complete this unicode char
+ *aHighSurrogate = src[0];
+ *aDestLength = dest - aDest;
+ return NS_OK_UENC_MOREINPUT;
+ }
+ //handle surrogate
+ if (destEnd - dest < 4)
+ goto error_more_output;
+ if ((src[1] & 0xfc00) != 0xdc00) // unpaired
+ ucs4 = PRUint32(src[0]);
+ else
+ { // convert surrogate pair to UCS4
+ ucs4 = (((src[0] & 0x3ffL) << 10) | (src[1] & 0x3ffL)) + 0x10000;
+ *aHighSurrogate = 0;
+ ++src;
+ }
+ }
+ if (aIsLE)
+ UCS4_TO_LE_STRING(ucs4, dest);
+ else
+ UCS4_TO_BE_STRING(ucs4, dest);
+ dest += 4;
+ ++src;
+ }
+
+ *aDestLength = dest - aDest;
+ return NS_OK;
+
+error_more_output:
+ *aSrcLength = src - aSrc;
+ *aDestLength = dest - aDest;
+ return NS_OK_UENC_MOREOUTPUT;
+
+}
+
+static nsresult FinishCommon(char * aDest,
+ PRInt32 * aDestLength,
+ PRUnichar * aHighSurrogate,
+ PRBool aIsLE)
+{
+ char * dest = aDest;
+
+ if (*aHighSurrogate) {
+ if (*aDestLength < 4) {
+ *aDestLength = 0;
+ return NS_OK_UENC_MOREOUTPUT;
+ }
+ PRUint32 high = PRUint32(*aHighSurrogate);
+ if (aIsLE)
+ UCS4_TO_LE_STRING(high, dest);
+ else
+ UCS4_TO_BE_STRING(high, dest);
+ *aHighSurrogate = 0;
+ *aDestLength = 4;
+ return NS_OK;
+ }
+
+ *aDestLength = 0;
+ return NS_OK;
+}
+
+
+
+//----------------------------------------------------------------------
+// Class nsUnicodeToUTF32 [implementation]
+
+NS_IMPL_ISUPPORTS1(nsUnicodeToUTF32, nsIUnicodeEncoder);
+
+
+//----------------------------------------------------------------------
+// Subclassing of nsIUnicodeEncoder class [implementation]
+
+NS_IMETHODIMP nsUnicodeToUTF32::GetMaxLength(const PRUnichar * aSrc,
+ PRInt32 aSrcLength,
+ PRInt32 * aDestLength)
+{
+ *aDestLength = aSrcLength * 4;
+ return NS_OK;
+}
+
+NS_IMETHODIMP nsUnicodeToUTF32::FillInfo(PRUint32 *aInfo)
+{
+ memset(aInfo, 0xFF, (0x10000L >> 3));
+ return NS_OK;
+}
+
+
+//----------------------------------------------------------------------
+// Class nsUnicodeToUTF32BE [implementation]
+
+//----------------------------------------------------------------------
+// Subclassing of nsUnicodeToUTF32 class [implementation]
+
+
+NS_IMETHODIMP nsUnicodeToUTF32BE::Convert(const PRUnichar * aSrc,
+ PRInt32 * aSrcLength,
+ char * aDest,
+ PRInt32 * aDestLength)
+{
+ return ConvertCommon(aSrc, aSrcLength, aDest, aDestLength,
+ &mHighSurrogate, PR_FALSE);
+}
+
+NS_IMETHODIMP nsUnicodeToUTF32BE::Finish(char * aDest,
+ PRInt32 * aDestLength)
+{
+ return FinishCommon(aDest, aDestLength, &mHighSurrogate, PR_FALSE);
+}
+
+
+//----------------------------------------------------------------------
+// Class nsUnicodeToUTF32LE [implementation]
+
+//----------------------------------------------------------------------
+// Subclassing of nsUnicodeToUTF32 class [implementation]
+
+
+NS_IMETHODIMP nsUnicodeToUTF32LE::Convert(const PRUnichar * aSrc,
+ PRInt32 * aSrcLength,
+ char * aDest,
+ PRInt32 * aDestLength)
+{
+ return ConvertCommon(aSrc, aSrcLength, aDest, aDestLength,
+ &mHighSurrogate, PR_TRUE);
+}
+
+NS_IMETHODIMP nsUnicodeToUTF32LE::Finish(char * aDest,
+ PRInt32 * aDestLength)
+{
+ return FinishCommon(aDest, aDestLength, &mHighSurrogate, PR_TRUE);
+}
+
diff --git a/intl/uconv/ucvlatin/nsUnicodeToUTF32.h b/intl/uconv/ucvlatin/nsUnicodeToUTF32.h
new file mode 100644
index 000000000000..ac598afd4aaa
--- /dev/null
+++ b/intl/uconv/ucvlatin/nsUnicodeToUTF32.h
@@ -0,0 +1,131 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:expandtab:shiftwidth=2:tabstop=2:
+ */
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: NPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Netscape Public License
+ * Version 1.1 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/NPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is Mozilla Communicator client code.
+ *
+ * The Initial Developer of the Original Code is
+ * Netscape Communications Corporation.
+ * Portions created by the Initial Developer are Copyright (C) 1998
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s): Jungshik Shin
+ *
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the NPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the NPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+#ifndef nsUnicodeToUTF32_h___
+#define nsUnicodeToUTF32_h___
+
+//----------------------------------------------------------------------
+// Class nsUnicodeToUTF32 [declaration]
+
+/**
+ * A character set converter from UTF32 to Unicode.
+ * The base class for UTF32BE/UTF32LE to Unicode converters.
+ * @created 08/Dec/2002
+ * @author Jungshik Shin
+ */
+
+class nsUnicodeToUTF32 : public nsIUnicodeEncoder
+{
+ NS_DECL_ISUPPORTS
+
+public:
+
+ /**
+ * Class constructor.
+ */
+ nsUnicodeToUTF32() {mHighSurrogate = 0;};
+ virtual ~nsUnicodeToUTF32() {};
+
+protected:
+ PRUnichar mHighSurrogate;
+
+ NS_IMETHOD GetMaxLength(const PRUnichar * aSrc, PRInt32 aSrcLength,
+ PRInt32 * aDestLength);
+
+ //--------------------------------------------------------------------
+ // Subclassing of nsIUnicodeEncoder class [declaration]
+
+ NS_IMETHOD Reset() {mHighSurrogate = 0; return NS_OK;};
+ NS_IMETHOD FillInfo(PRUint32* aInfo);
+ NS_IMETHOD SetOutputErrorBehavior(PRInt32 aBehavior,
+ nsIUnicharEncoder * aEncoder,
+ PRUnichar aChar)
+ {return NS_OK;};
+
+};
+
+//----------------------------------------------------------------------
+// Class nsUnicodeToUTF32BE [declaration]
+
+/**
+ * A character set converter from Unicode to UTF32BE.
+ * A subclass of UnicodeToUTF32.
+ * @created 08/Dec/2002
+ * @author Jungshik Shin
+ */
+
+class nsUnicodeToUTF32BE : public nsUnicodeToUTF32
+{
+public:
+
+ //--------------------------------------------------------------------
+ // Subclassing of nsIUnicodeEncoder class [declaration]
+
+ NS_IMETHOD Convert(const PRUnichar * aSrc, PRInt32 * aSrcLength,
+ char * aDest, PRInt32 * aDestLength);
+ NS_IMETHOD Finish(char * aDest, PRInt32 * aDestLength);
+
+
+};
+
+//----------------------------------------------------------------------
+// Class nsUnicodeToUTF32LE [declaration]
+
+/**
+ * A character set converter from Unicode to UTF32LE.
+ * A subclass of UnicodeToUTF32.
+ * @created 08/Dec/2002
+ * @author Jungshik Shin
+ */
+
+class nsUnicodeToUTF32LE : public nsUnicodeToUTF32
+{
+public:
+
+ //--------------------------------------------------------------------
+ // Subclassing of nsIUnicodeEncoder class [declaration]
+ NS_IMETHOD Convert(const PRUnichar * aSrc, PRInt32 * aSrcLength,
+ char * aDest, PRInt32 * aDestLength);
+ NS_IMETHOD Finish(char * aDest, PRInt32 * aDestLength);
+
+};
+
+#endif /* nsUnicodeToUTF32_h___ */
+