dotgnu-pnet-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Dotgnu-pnet-commits] CVS: pnetlib/runtime/System/Globalization StringI


From: Rhys Weatherley <address@hidden>
Subject: [Dotgnu-pnet-commits] CVS: pnetlib/runtime/System/Globalization StringInfo.cs,NONE,1.1 TextElementEnumerator.cs,NONE,1.1
Date: Mon, 21 Apr 2003 20:25:13 -0400

Update of /cvsroot/dotgnu-pnet/pnetlib/runtime/System/Globalization
In directory subversions:/tmp/cvs-serv9735/runtime/System/Globalization

Added Files:
        StringInfo.cs TextElementEnumerator.cs 
Log Message:


Add "StringInfo" and "TextElementEnumerator".


--- NEW FILE ---
/*
 * StringInfo.cs - Implementation of the
 *        "System.Globalization.StringInfo" class.
 *
 * Copyright (C) 2003  Southern Storm Software, Pty Ltd.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

namespace System.Globalization
{

#if !ECMA_COMPAT

using System;
using System.Collections;

[Serializable]
public class StringInfo
{
        // Constructor.
        public StringInfo() {}

        // Get the text element at a specific location within a string.
        public static String GetNextTextElement(String str)
                        {
                                return GetNextTextElement(str, 0);
                        }
        public static String GetNextTextElement(String str, int index)
                        {
                                if(str == null)
                                {
                                        throw new ArgumentNullException("str");
                                }
                                if(index < 0 || index >= str.Length)
                                {
                                        throw new ArgumentOutOfRangeException
                                                ("index", 
_("ArgRange_StringIndex"));
                                }
                                char ch = str[index];
                                UnicodeCategory category = 
Char.GetUnicodeCategory(ch);
                                if(category == UnicodeCategory.Surrogate &&
                                   ch >= 0xD800 && ch <= 0xDBFF)
                                {
                                        if((index + 1) < str.Length &&
                                           str[index + 1] >= 0xDC00 && 
str[index + 1] <= 0xDFFF)
                                        {
                                                // Surrogate character pair.
                                                return str.Substring(index, 2);
                                        }
                                        else
                                        {
                                                // High surrogate on its own.
                                                return new String(ch, 1);
                                        }
                                }
                                else if(category == 
UnicodeCategory.NonSpacingMark ||
                                                category == 
UnicodeCategory.SpacingCombiningMark ||
                                                category == 
UnicodeCategory.EnclosingMark)
                                {
                                        // A sequence of combining marks.
                                        int start = index;
                                        ++index;
                                        while(index < str.Length)
                                        {
                                                ch = str[index];
                                                if(category != 
UnicodeCategory.NonSpacingMark &&
                                                   category != 
UnicodeCategory.SpacingCombiningMark &&
                                                   category != 
UnicodeCategory.EnclosingMark)
                                                {
                                                        break;
                                                }
                                                ++index;
                                        }
                                        return str.Substring(start, index - 
start);
                                }
                                else
                                {
                                        // Ordinary base character.
                                        return new String(ch, 1);
                                }
                        }

        // Enumerate through the text elements in a string.
        public static TextElementEnumerator GetTextElementEnumerator(String str)
                        {
                                return GetTextElementEnumerator(str);
                        }
        public static TextElementEnumerator GetTextElementEnumerator
                                (String str, int index)
                        {
                                if(str == null)
                                {
                                        throw new ArgumentNullException("str");
                                }
                                if(index < 0 || index >= str.Length)
                                {
                                        throw new ArgumentOutOfRangeException
                                                ("index", 
_("ArgRange_StringIndex"));
                                }
                                return new TextElementEnumerator(str, index);
                        }

        // Parse the locations of combining characters in a string.
        public static int[] ParseCombiningCharacters(String str)
                        {
                                if(str == null)
                                {
                                        throw new ArgumentNullException("str");
                                }
                                else if(str == String.Empty)
                                {
                                        return null;
                                }
                                ArrayList list = new ArrayList(str.Length);
                                int index = 0;
                                char ch;
                                UnicodeCategory category;
                                while(index < str.Length)
                                {
                                        list.Add(index);
                                        ch = str[index];
                                        category = Char.GetUnicodeCategory(ch);
                                        if(category == 
UnicodeCategory.Surrogate &&
                                           ch >= 0xD800 && ch <= 0xDBFF)
                                        {
                                                if((index + 1) < str.Length &&
                                                   str[index + 1] >= 0xDC00 &&
                                                   str[index + 1] <= 0xDFFF)
                                                {
                                                        // Surrogate character 
pair.
                                                        index += 2;
                                                }
                                                else
                                                {
                                                        // High surrogate on 
its own.
                                                        ++index;
                                                }
                                        }
                                        else if(category == 
UnicodeCategory.NonSpacingMark ||
                                                        category == 
UnicodeCategory.SpacingCombiningMark ||
                                                        category == 
UnicodeCategory.EnclosingMark)
                                        {
                                                // A sequence of combining 
marks.
                                                ++index;
                                                while(index < str.Length)
                                                {
                                                        ch = str[index];
                                                        if(category != 
UnicodeCategory.NonSpacingMark &&
                                                           category !=
                                                                        
UnicodeCategory.SpacingCombiningMark &&
                                                           category != 
UnicodeCategory.EnclosingMark)
                                                        {
                                                                break;
                                                        }
                                                        ++index;
                                                }
                                        }
                                        else
                                        {
                                                // Ordinary base character.
                                                ++index;
                                        }
                                }
                                return (int[])(list.ToArray(typeof(int)));
                        }

}; // class StringInfo

#endif // !ECMA_COMPAT

}; // namespace System.Globalization

--- NEW FILE ---
/*
 * TextElementEnumerator.cs - Implementation of the
 *        "System.Globalization.TextElementEnumerator" class.
 *
 * Copyright (C) 2003  Southern Storm Software, Pty Ltd.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

namespace System.Globalization
{

#if !ECMA_COMPAT

using System;
using System.Collections;

[Serializable]
public class TextElementEnumerator : IEnumerator
{
        // Internal state.
        private String str;
        private int start;
        private int index;
        private int elementIndex;
        private String element;

        // Constructor.
        internal TextElementEnumerator(String str, int start)
                        {
                                this.str = str;
                                this.start = start;
                                this.index = start - 1;
                                this.element = null;
                        }

        // Implement the IEnumerator interface.
        public bool MoveNext()
                        {
                                if(++index < str.Length)
                                {
                                        elementIndex = index;
                                        element = 
StringInfo.GetNextTextElement(str, index);
                                        index += element.Length - 1;
                                        return true;
                                }
                                else
                                {
                                        element = null;
                                        return false;
                                }
                        }
        public void Reset()
                        {
                                index = start - 1;
                                element = null;
                        }
        public Object Current
                        {
                                get
                                {
                                        if(element == null)
                                        {
                                                throw new 
InvalidOperationException
                                                        
(_("Invalid_BadEnumeratorPosition"));
                                        }
                                        return element;
                                }
                        }

        // Get the index of the current text element.
        public int ElementIndex
                        {
                                get
                                {
                                        if(element == null)
                                        {
                                                throw new 
InvalidOperationException
                                                        
(_("Invalid_BadEnumeratorPosition"));
                                        }
                                        return elementIndex;
                                }
                        }

        // Get the current enumerator item as a string.
        public String GetTextElement()
                        {
                                if(element == null)
                                {
                                        throw new InvalidOperationException
                                                
(_("Invalid_BadEnumeratorPosition"));
                                }
                                return element;
                        }

}; // class TextElementEnumerator

#endif // !ECMA_COMPAT

}; // namespace System.Globalization





reply via email to

[Prev in Thread] Current Thread [Next in Thread]