[Top][All Lists]
[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
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Dotgnu-pnet-commits] CVS: pnetlib/runtime/System/Globalization StringInfo.cs,NONE,1.1 TextElementEnumerator.cs,NONE,1.1,
Rhys Weatherley <address@hidden> <=