Author: atsushi
Date: 2005-11-27 22:37:40 -0500 (Sun, 27 Nov 2005)
New Revision: 53537

Added:
   trunk/mcs/class/corlib/System.Text/UTF32Encoding.cs
Modified:
   trunk/mcs/class/corlib/ChangeLog
   trunk/mcs/class/corlib/System.Text/ChangeLog
   trunk/mcs/class/corlib/corlib.dll.sources
Log:
2005-11-28  Atsushi Enomoto  <[EMAIL PROTECTED]>

        * UTF32Encoding.cs : new file.

        * corlib.dll.sources: added UTF32Encoding.cs.



Modified: trunk/mcs/class/corlib/ChangeLog
===================================================================
--- trunk/mcs/class/corlib/ChangeLog    2005-11-28 03:14:10 UTC (rev 53536)
+++ trunk/mcs/class/corlib/ChangeLog    2005-11-28 03:37:40 UTC (rev 53537)
@@ -1,3 +1,7 @@
+2005-11-28  Atsushi Enomoto  <[EMAIL PROTECTED]>
+
+       * corlib.dll.sources: added UTF32Encoding.cs.
+
 2005-11-17  Zoltan Varga  <[EMAIL PROTECTED]>
 
        * corlib.dll.sources: Add 
System.Runtime.InteropServices.DefaultParameterValueAttribute.cs.

Modified: trunk/mcs/class/corlib/System.Text/ChangeLog
===================================================================
--- trunk/mcs/class/corlib/System.Text/ChangeLog        2005-11-28 03:14:10 UTC 
(rev 53536)
+++ trunk/mcs/class/corlib/System.Text/ChangeLog        2005-11-28 03:37:40 UTC 
(rev 53537)
@@ -1,3 +1,7 @@
+2005-11-28  Atsushi Enomoto  <[EMAIL PROTECTED]>
+
+       * UTF32Encoding.cs : new file.
+
 2005-11-22  Atsushi Enomoto  <[EMAIL PROTECTED]>
 
        * ASCIIEncoding.cs, Latin1Encoding.cs : added EncoderFallback support.

Added: trunk/mcs/class/corlib/System.Text/UTF32Encoding.cs
===================================================================
--- trunk/mcs/class/corlib/System.Text/UTF32Encoding.cs 2005-11-28 03:14:10 UTC 
(rev 53536)
+++ trunk/mcs/class/corlib/System.Text/UTF32Encoding.cs 2005-11-28 03:37:40 UTC 
(rev 53537)
@@ -0,0 +1,473 @@
+/*
+ * UTF32Encoding.cs - Implementation of the
+ *             "System.Text.UTF32Encoding" class.
+ *
+ * Author: Atsushi Enomoto <[EMAIL PROTECTED]>
+ *
+ * Copyright (C) 2005 Novell, Inc.  http://www.novell.com
+ *
+ * It is almost copied from UnicodeEncoding.cs.
+ * Original copyrights goes here:
+ *
+ * Copyright (c) 2001, 2002  Southern Storm Software, Pty Ltd
+ * Copyright (C) 2003, 2004 Novell, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#if NET_2_0
+
+namespace System.Text
+{
+
+using System;
+
+[Serializable]
+public class UTF32Encoding : Encoding
+{
+       // Magic numbers used by Windows for UTF32.
+       internal const int UTF32_CODE_PAGE     = 12000;
+       internal const int BIG_UTF32_CODE_PAGE = 12001;
+
+       // Internal state.
+       private bool bigEndian;
+       private bool byteOrderMark;
+
+       // Constructors.
+       public UTF32Encoding () : this (false, true)
+       {
+       }
+
+       public UTF32Encoding (bool bigEndian, bool byteOrderMark)
+               : base ((bigEndian ? BIG_UTF32_CODE_PAGE : UTF32_CODE_PAGE))
+       {
+               this.bigEndian = bigEndian;
+               this.byteOrderMark = byteOrderMark;
+
+               if (bigEndian){
+                       body_name = "utf-32BE";
+                       encoding_name = "UTF-32 (Big-Endian)";
+                       header_name = "utf-32BE";
+                       is_browser_save = false;
+                       web_name = "utf-32BE";
+               } else {
+                       body_name = "utf-32";
+                       encoding_name = "UTF-32";
+                       header_name = "utf-32";
+                       is_browser_save = true;
+                       web_name = "utf-32";
+               }
+               
+               // Windows reports the same code page number for
+               // both the little-endian and big-endian forms.
+               windows_code_page = UTF32_CODE_PAGE;
+       }
+
+       // Get the number of bytes needed to encode a character buffer.
+       [MonoTODO ("handle fallback")]
+       public override int GetByteCount (char[] chars, int index, int count)
+       {
+               if (chars == null) {
+                       throw new ArgumentNullException ("chars");
+               }
+               if (index < 0 || index > chars.Length) {
+                       throw new ArgumentOutOfRangeException ("index", 
_("ArgRange_Array"));
+               }
+               if (count < 0 || count > (chars.Length - index)) {
+                       throw new ArgumentOutOfRangeException ("count", 
_("ArgRange_Array"));
+               }
+               int ret = 0;
+               for (int i = index; i < count; i++) {
+                       if (Char.IsSurrogate (chars [i])) {
+                               if (i + 1 < chars.Length && Char.IsSurrogate 
(chars [i + 1]))
+                                       ret += 4;
+                               else
+                                       // FIXME: handle fallback
+//                                     ret += DecoderFallback.MaxCharCount;
+                                       ret += 4;
+                       }
+                       else
+                               ret += 4;
+               }
+               return ret;
+       }
+
+       // Get the bytes that result from encoding a character buffer.
+       [MonoTODO ("handle fallback")]
+       public override int GetBytes (char[] chars, int charIndex, int 
charCount,
+                                                                byte[] bytes, 
int byteIndex)
+       {
+               if (chars == null) {
+                       throw new ArgumentNullException ("chars");
+               }
+               if (bytes == null) {
+                       throw new ArgumentNullException ("bytes");
+               }
+               if (charIndex < 0 || charIndex > chars.Length) {
+                       throw new ArgumentOutOfRangeException ("charIndex", 
_("ArgRange_Array"));
+               }
+               if (charCount < 0 || charCount > (chars.Length - charIndex)) {
+                       throw new ArgumentOutOfRangeException ("charCount", 
_("ArgRange_Array"));
+               }
+               if (byteIndex < 0 || byteIndex > bytes.Length) {
+                       throw new ArgumentOutOfRangeException ("byteIndex", 
_("ArgRange_Array"));
+               }
+               if ((bytes.Length - byteIndex) < (charCount * 4)) {
+                       throw new ArgumentException 
(_("Arg_InsufficientSpace"));
+               }
+               int posn = byteIndex;
+               char ch;
+
+               while (charCount-- > 0) {
+                       ch = chars[charIndex++];
+                       if (Char.IsSurrogate (ch)) {
+                               if (charCount-- > 0) {
+                                       int value = 0x400 * (ch - 0xD800) + 
0x10000 + chars [charIndex++] - 0xDC00;
+                                       if (bigEndian) {
+                                               for (int i = 0; i < 4; i++) {
+                                                       bytes [posn + 3 - i] = 
(byte) (value % 0x100);
+                                                       value >>= 8;
+                                               }
+                                       } else {
+                                               for (int i = 0; i < 4; i++) {
+                                                       bytes [posn++] = (byte) 
(value % 0x100);
+                                                       value >>= 8;
+                                               }
+                                       }
+                               } else {
+                                       // Illegal surrogate
+                                       // FIXME: use fallback
+                                       if (bigEndian) {
+                                               bytes[posn++] = 0;
+                                               bytes[posn++] = 0;
+                                               bytes[posn++] = 0;
+                                               bytes[posn++] = (byte) '?';
+                                       } else {
+                                               bytes[posn++] = (byte) '?';
+                                               bytes[posn++] = 0;
+                                               bytes[posn++] = 0;
+                                               bytes[posn++] = 0;
+                                       }
+                               }
+                       } else {
+                               if (bigEndian) {
+                                       bytes[posn++] = 0;
+                                       bytes[posn++] = 0;
+                                       bytes[posn++] = (byte)(ch >> 8);
+                                       bytes[posn++] = (byte)ch;
+                               } else {
+                                       bytes[posn++] = (byte)ch;
+                                       bytes[posn++] = (byte)(ch >> 8);
+                                       bytes[posn++] = 0;
+                                       bytes[posn++] = 0;
+                               }
+                       }
+               }
+
+               return posn - byteIndex;
+       }
+
+       // Get the number of characters needed to decode a byte buffer.
+       public override int GetCharCount (byte[] bytes, int index, int count)
+       {
+               if (bytes == null) {
+                       throw new ArgumentNullException ("bytes");
+               }
+               if (index < 0 || index > bytes.Length) {
+                       throw new ArgumentOutOfRangeException ("index", 
_("ArgRange_Array"));
+               }
+               if (count < 0 || count > (bytes.Length - index)) {
+                       throw new ArgumentOutOfRangeException ("count", 
_("ArgRange_Array"));
+               }
+               return count / 4;
+       }
+
+       // Get the characters that result from decoding a byte buffer.
+       public override int GetChars (byte[] bytes, int byteIndex, int 
byteCount,
+                                                                char[] chars, 
int charIndex)
+       {
+               if (bytes == null) {
+                       throw new ArgumentNullException ("bytes");
+               }
+               if (chars == null) {
+                       throw new ArgumentNullException ("chars");
+               }
+               if (byteIndex < 0 || byteIndex > bytes.Length) {
+                       throw new ArgumentOutOfRangeException ("byteIndex", 
_("ArgRange_Array"));
+               }
+               if (byteCount < 0 || byteCount > (bytes.Length - byteIndex)) {
+                       throw new ArgumentOutOfRangeException ("byteCount", 
_("ArgRange_Array"));
+               }
+               if (charIndex < 0 || charIndex > chars.Length) {
+                       throw new ArgumentOutOfRangeException ("charIndex", 
_("ArgRange_Array"));
+               }
+
+/*
+               // Determine the byte order in the incoming buffer.
+               bool isBigEndian;
+               if (byteCount >= 2) {
+                       if (bytes[byteIndex] == (byte)0xFE && bytes[byteIndex + 
1] == (byte)0xFF) {
+                               isBigEndian = true;
+                       } else if (bytes[byteIndex] == (byte)0xFF && 
bytes[byteIndex + 1] == (byte)0xFE) {
+                               isBigEndian = false;
+                       } else {
+                               isBigEndian = bigEndian;
+                       }
+               } else {
+                       isBigEndian = bigEndian;
+               }
+*/
+
+               // Validate that we have sufficient space in "chars".
+               if ((chars.Length - charIndex) < (byteCount / 4)) {
+                       throw new ArgumentException 
(_("Arg_InsufficientSpace"));
+               }
+
+               // Convert the characters.
+               int posn = charIndex;
+               if (bigEndian) {
+                       while (byteCount >= 4) {
+                               chars[posn++] = (char) (
+                                               bytes[byteIndex] << 24 |
+                                               bytes[byteIndex + 1] << 16 |
+                                               bytes[byteIndex + 2] << 8 |
+                                               bytes[byteIndex + 3]);
+                               byteIndex += 4;
+                               byteCount -= 4;
+                       }
+               } else {
+                       while (byteCount >= 4) {
+                               chars[posn++] = (char) (
+                                               bytes[byteIndex] |
+                                               bytes[byteIndex + 1] << 8 |
+                                               bytes[byteIndex + 2] << 16 |
+                                               bytes[byteIndex + 3] << 24);
+                               byteIndex += 4;
+                               byteCount -= 4;
+                       }
+               }
+               return posn - charIndex;
+       }
+
+       // Get the maximum number of bytes needed to encode a
+       // specified number of characters.
+       public override int GetMaxByteCount (int charCount)
+       {
+               if (charCount < 0) {
+                       throw new ArgumentOutOfRangeException ("charCount", 
_("ArgRange_NonNegative"));
+               }
+               return charCount * 4;
+       }
+
+       // Get the maximum number of characters needed to decode a
+       // specified number of bytes.
+       public override int GetMaxCharCount (int byteCount)
+       {
+               if (byteCount < 0) {
+                       throw new ArgumentOutOfRangeException
+                               ("byteCount", _("ArgRange_NonNegative"));
+               }
+               return byteCount / 4;
+       }
+
+       // Get a UTF32-specific decoder that is attached to this instance.
+       public override Decoder GetDecoder ()
+       {
+               return new UTF32Decoder (bigEndian);
+       }
+
+       // Get the UTF32 preamble.
+       public override byte[] GetPreamble ()
+       {
+               if (byteOrderMark) {
+                       byte[] preamble = new byte[2];
+                       if (bigEndian) {
+                               preamble[0] = (byte)0xFE;
+                               preamble[1] = (byte)0xFF;
+                       } else {
+                               preamble[0] = (byte)0xFF;
+                               preamble[1] = (byte)0xFE;
+                       }
+                       return preamble;
+               } else {
+                       return new byte [0];
+               }
+       }
+
+       // Determine if this object is equal to another.
+       public override bool Equals (Object value)
+       {
+               UTF32Encoding enc = (value as UTF32Encoding);
+               if (enc != null) {
+                       return (codePage == enc.codePage &&
+                                       bigEndian == enc.bigEndian &&
+                                       byteOrderMark == enc.byteOrderMark);
+               } else {
+                       return false;
+               }
+       }
+
+       // Get the hash code for this object.
+       public override int GetHashCode ()
+       {
+               return base.GetHashCode ();
+       }
+
+       // UTF32 decoder implementation.
+       private sealed class UTF32Decoder : Decoder
+       {
+               private bool bigEndian;
+               private int leftOverByte;
+               private int leftOverLength;
+
+               // Constructor.
+               public UTF32Decoder (bool bigEndian)
+               {
+                       this.bigEndian = bigEndian;
+                       leftOverByte = -1;
+               }
+
+               // Override inherited methods.
+               public override int GetCharCount (byte[] bytes, int index, int 
count)
+               {
+                       if (bytes == null) {
+                               throw new ArgumentNullException ("bytes");
+                       }
+                       if (index < 0 || index > bytes.Length) {
+                               throw new ArgumentOutOfRangeException ("index", 
_("ArgRange_Array"));
+                       }
+                       if (count < 0 || count > (bytes.Length - index)) {
+                               throw new ArgumentOutOfRangeException ("count", 
_("ArgRange_Array"));
+                       }
+                       if (leftOverByte != -1) {
+                               return (count + 1) / 4;
+                       } else {
+                               return count / 4;
+                       }
+               }
+               
+               public override int GetChars (byte[] bytes, int byteIndex,
+                                                                        int 
byteCount, char[] chars,
+                                                                        int 
charIndex)
+               {
+                       if (bytes == null) {
+                               throw new ArgumentNullException ("bytes");
+                       }
+                       if (chars == null) {
+                               throw new ArgumentNullException ("chars");
+                       }
+                       if (byteIndex < 0 || byteIndex > bytes.Length) {
+                               throw new ArgumentOutOfRangeException 
("byteIndex", _("ArgRange_Array"));
+                       }
+                       if (byteCount < 0 || byteCount > (bytes.Length - 
byteIndex)) {
+                               throw new ArgumentOutOfRangeException 
("byteCount", _("ArgRange_Array"));
+                       }
+                       if (charIndex < 0 || charIndex > chars.Length) {
+                               throw new ArgumentOutOfRangeException 
("charIndex", _("ArgRange_Array"));
+                       }
+
+                       // Convert the characters.
+                       int posn = charIndex;
+                       int leftOver = leftOverByte;
+                       int length = chars.Length;
+                       char ch;
+
+                       int remain = 4 - leftOverLength;
+                       if (leftOverLength > 0 && byteCount > remain) {
+                               if (bigEndian) {
+                                       for (int i = 0; i < remain; i++)
+                                               leftOver += bytes [byteIndex++] 
<< (4 - byteCount--);
+                               } else {
+                                       for (int i = 0; i < remain; i++)
+                                               leftOver += bytes [byteIndex++] 
<< byteCount--;
+                               }
+                               if (leftOver > char.MaxValue && posn + 1 < 
length
+                                       || posn < length)
+                                       throw new ArgumentException 
(_("Arg_InsufficientSpace"));
+                               if (leftOver > char.MaxValue) {
+                                       chars [posn++] = (char) ((leftOver - 
10000) / 0x400 + 0xD800);
+                                       chars [posn++] = (char) ((leftOver - 
10000) % 0x400 + 0xDC00);
+                               }
+                               else
+                                       chars [posn++] = (char) leftOver;
+
+                               leftOver = -1;
+                               leftOverLength = 0;
+                       }
+
+                       while (byteCount > 3) {
+                               if (bigEndian) {
+                                       ch = (char) (
+                                            bytes[byteIndex++] << 24 |
+                                            bytes[byteIndex++] << 16 |
+                                            bytes[byteIndex++] << 8 |
+                                            bytes[byteIndex++]);
+                               } else {
+                                       ch = (char) (
+                                            bytes[byteIndex++] |
+                                            bytes[byteIndex++] << 8 |
+                                            bytes[byteIndex++] << 16 |
+                                            bytes[byteIndex++] << 24);
+                               }
+                               byteCount -= 4;
+
+                               if (posn < length) {
+                                       chars[posn++] = ch;
+                               } else {
+                                       throw new ArgumentException 
(_("Arg_InsufficientSpace"));
+                               }
+                       }
+                       if (byteCount > 0) {
+                               leftOverLength = byteCount;
+                               leftOver = 0;
+                               if (bigEndian) {
+                                       for (int i = 0; i < byteCount; i++)
+                                               leftOver += bytes [byteIndex++] 
<< (4 - byteCount--);
+                               } else {
+                                       for (int i = 0; i < byteCount; i++)
+                                               leftOver += bytes [byteIndex++] 
<< byteCount--;
+                               }
+                               leftOverByte = leftOver;
+                       }
+
+                       // Finished - return the converted length.
+                       return posn - charIndex;
+               }
+
+       } // class UTF32Decoder
+       
+#if NET_2_0
+       [CLSCompliantAttribute(false)]
+       public unsafe override int GetByteCount (char *chars, int count)
+       {
+               return count * 4;
+       }
+#else
+       public override byte [] GetBytes (String s)
+       {
+               return base.GetBytes (s);
+       }
+#endif
+       
+
+}; // class UTF32Encoding
+
+}; // namespace System.Text
+
+#endif


Property changes on: trunk/mcs/class/corlib/System.Text/UTF32Encoding.cs
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: trunk/mcs/class/corlib/corlib.dll.sources
===================================================================
--- trunk/mcs/class/corlib/corlib.dll.sources   2005-11-28 03:14:10 UTC (rev 
53536)
+++ trunk/mcs/class/corlib/corlib.dll.sources   2005-11-28 03:37:40 UTC (rev 
53537)
@@ -1264,6 +1264,7 @@
 System.Text/UnicodeEncoding.cs
 System.Text/UTF7Encoding.cs
 System.Text/UTF8Encoding.cs
+System.Text/UTF32Encoding.cs
 System.Threading/ApartmentState.cs
 System.Threading/AsyncFlowControl.cs
 System.Threading/AutoResetEvent.cs

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to