+// -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-\r
//\r
// System.Text.StringBuilder\r
//\r
//\r
\r
namespace System.Text {\r
- public sealed class StringBuilder {\r
-\r
- const int defaultCapacity = 16;\r
-\r
- private int sCapacity;\r
- private int sLength;\r
- private char[] sString;\r
-\r
- public StringBuilder() {\r
-\r
- // The MS Implementation uses the default\r
- // capacity for a StringBuilder. The spec\r
- // says it's up to the implementer, but \r
- // we'll do it the MS way just in case.\r
- \r
- sString = new char[ defaultCapacity ];\r
- sCapacity = defaultCapacity;\r
- sLength = 0;\r
- }\r
-\r
- public StringBuilder( int capacity ) {\r
- if( capacity < defaultCapacity ) {\r
- // The spec says that the capacity\r
- // has to be at least the default capacity\r
- capacity = defaultCapacity;\r
- }\r
-\r
- sString = new char[capacity];\r
- sCapacity = capacity;\r
- sLength = 0;\r
- }\r
-\r
- public StringBuilder( string str ) {\r
- \r
- if( str.Length < defaultCapacity ) { \r
- char[] tString = str.ToCharArray();\r
- sString = new char[ defaultCapacity ];\r
- Array.Copy( tString, sString, str.Length );\r
- sLength = str.Length;\r
- sCapacity = defaultCapacity;\r
- } else {\r
- sString = str.ToCharArray();\r
- sCapacity = sString.Length;\r
- sLength = sString.Length;\r
- }\r
- }\r
- \r
- public int Capacity {\r
- get {\r
- return sCapacity;\r
- }\r
-\r
- set {\r
- if( value < sLength ) {\r
- throw new ArgumentException( "Capacity must be > length" );\r
- } else {\r
- char[] tString = new char[value]; \r
- Array.Copy( sString, tString, sLength );\r
- sString = tString;\r
- sCapacity = sString.Length;\r
- }\r
- }\r
- }\r
-\r
-\r
- public int Length {\r
- get {\r
- return sLength;\r
- }\r
-\r
- set {\r
- if( value < 0 || value > Int32.MaxValue) {\r
- throw new ArgumentOutOfRangeException();\r
- } else {\r
- if( value < sLength ) {\r
- // Truncate current string at value\r
-\r
- // LAMESPEC: The spec is unclear as to what to do\r
- // with the capacity when truncating the string.\r
- //\r
- // Don't change the capacity, as this is what\r
- // the MS implementation does.\r
-\r
- sLength = value;\r
- } else {\r
- // Expand the capacity to the new length and\r
- // pad the string with spaces.\r
- \r
- // LAMESPEC: The spec says to put the spaces on the\r
- // left of the string however the MS implementation\r
- // puts them on the right. We'll do that for \r
- // compatibility (!)\r
-\r
- char[] tString = new char[ value ];\r
- int padLength = value - sLength;\r
- \r
- string padding = new String( ' ', padLength );\r
- Array.Copy( sString, tString, sLength );\r
- Array.Copy( padding.ToCharArray(), 0, tString, sLength, padLength );\r
- sString = tString;\r
- sLength = sString.Length;\r
- sCapacity = value;\r
- }\r
- }\r
- }\r
- }\r
-\r
- public char this[ int index ] {\r
- get {\r
-\r
- if( index >= sLength || index < 0 ) {\r
- throw new IndexOutOfRangeException();\r
- }\r
- return sString[ index ];\r
- } \r
-\r
- set {\r
- if( index >= sLength || index < 0 ) {\r
- throw new IndexOutOfRangeException();\r
- }\r
- sString[ index ] = value;\r
- }\r
- }\r
-\r
- public override string ToString() {\r
- return ToString(0, sLength);\r
- }\r
-\r
- public string ToString( int startIndex, int length ) {\r
- if( startIndex < 0 || length < 0 || startIndex + length > sLength ) {\r
- throw new ArgumentOutOfRangeException();\r
- }\r
- \r
- return new String( sString, startIndex, length );\r
- }\r
-\r
- public int EnsureCapacity( int capacity ) {\r
- if( capacity < 0 ) {\r
- throw new ArgumentOutOfRangeException( \r
+ public sealed class StringBuilder {\r
+\r
+ const int defaultCapacity = 16;\r
+\r
+ private int sCapacity;\r
+ private int sLength;\r
+ private char[] sString;\r
+\r
+ public StringBuilder() {\r
+\r
+ // The MS Implementation uses the default\r
+ // capacity for a StringBuilder. The spec\r
+ // says it's up to the implementer, but \r
+ // we'll do it the MS way just in case.\r
+ \r
+ sString = new char[ defaultCapacity ];\r
+ sCapacity = defaultCapacity;\r
+ sLength = 0;\r
+ }\r
+\r
+ public StringBuilder( int capacity ) {\r
+ if( capacity < defaultCapacity ) {\r
+ // The spec says that the capacity\r
+ // has to be at least the default capacity\r
+ capacity = defaultCapacity;\r
+ }\r
+\r
+ sString = new char[capacity];\r
+ sCapacity = capacity;\r
+ sLength = 0;\r
+ }\r
+\r
+ public StringBuilder( string str ) {\r
+ \r
+ if( str.Length < defaultCapacity ) { \r
+ char[] tString = str.ToCharArray();\r
+ sString = new char[ defaultCapacity ];\r
+ Array.Copy( tString, sString, str.Length );\r
+ sLength = str.Length;\r
+ sCapacity = defaultCapacity;\r
+ } else {\r
+ sString = str.ToCharArray();\r
+ sCapacity = sString.Length;\r
+ sLength = sString.Length;\r
+ }\r
+ }\r
+ \r
+ public int Capacity {\r
+ get {\r
+ return sCapacity;\r
+ }\r
+\r
+ set {\r
+ if( value < sLength ) {\r
+ throw new ArgumentException( "Capacity must be > length" );\r
+ } else {\r
+ char[] tString = new char[value]; \r
+ Array.Copy( sString, tString, sLength );\r
+ sString = tString;\r
+ sCapacity = sString.Length;\r
+ }\r
+ }\r
+ }\r
+\r
+\r
+ public int Length {\r
+ get {\r
+ return sLength;\r
+ }\r
+\r
+ set {\r
+ if( value < 0 || value > Int32.MaxValue) {\r
+ throw new ArgumentOutOfRangeException();\r
+ } else {\r
+ if( value < sLength ) {\r
+ // Truncate current string at value\r
+\r
+ // LAMESPEC: The spec is unclear as to what to do\r
+ // with the capacity when truncating the string.\r
+ //\r
+ // Don't change the capacity, as this is what\r
+ // the MS implementation does.\r
+\r
+ sLength = value;\r
+ } else {\r
+ // Expand the capacity to the new length and\r
+ // pad the string with spaces.\r
+ \r
+ // LAMESPEC: The spec says to put the spaces on the\r
+ // left of the string however the MS implementation\r
+ // puts them on the right. We'll do that for \r
+ // compatibility (!)\r
+\r
+ char[] tString = new char[ value ];\r
+ int padLength = value - sLength;\r
+ \r
+ string padding = new String( ' ', padLength );\r
+ Array.Copy( sString, tString, sLength );\r
+ Array.Copy( padding.ToCharArray(), 0, tString, sLength, padLength );\r
+ sString = tString;\r
+ sLength = sString.Length;\r
+ sCapacity = value;\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ public char this[ int index ] {\r
+ get {\r
+\r
+ if( index >= sLength || index < 0 ) {\r
+ throw new IndexOutOfRangeException();\r
+ }\r
+ return sString[ index ];\r
+ } \r
+\r
+ set {\r
+ if( index >= sLength || index < 0 ) {\r
+ throw new IndexOutOfRangeException();\r
+ }\r
+ sString[ index ] = value;\r
+ }\r
+ }\r
+\r
+ public override string ToString() {\r
+ return ToString(0, sLength);\r
+ }\r
+\r
+ public string ToString( int startIndex, int length ) {\r
+ if( startIndex < 0 || length < 0 || startIndex + length > sLength ) {\r
+ throw new ArgumentOutOfRangeException();\r
+ }\r
+ \r
+ return new String( sString, startIndex, length );\r
+ }\r
+\r
+ public int EnsureCapacity( int capacity ) {\r
+ if( capacity < 0 ) {\r
+ throw new ArgumentOutOfRangeException( \r
"Capacity must be greater than 0." );\r
- }\r
-\r
- if( capacity <= sCapacity ) {\r
- return sCapacity;\r
- } else {\r
- Capacity = capacity;\r
- return sCapacity;\r
- }\r
- }\r
-\r
- public bool Equals( StringBuilder sb ) {\r
- if( this.ToString() == sb.ToString() ) {\r
- return true;\r
- } else {\r
- return false;\r
- }\r
- }\r
-\r
- public StringBuilder Remove( int startIndex, int length ) {\r
- if( startIndex < 0 || length < 0 || startIndex + length > sLength ) {\r
- throw new ArgumentOutOfRangeException();\r
- }\r
-\r
- // Copy everything after the 'removed' part to the start \r
+ }\r
+\r
+ if( capacity <= sCapacity ) {\r
+ return sCapacity;\r
+ } else {\r
+ Capacity = capacity;\r
+ return sCapacity;\r
+ }\r
+ }\r
+\r
+ public bool Equals( StringBuilder sb ) {\r
+ if( this.ToString() == sb.ToString() ) {\r
+ return true;\r
+ } else {\r
+ return false;\r
+ }\r
+ }\r
+\r
+ public StringBuilder Remove( int startIndex, int length ) {\r
+ if( startIndex < 0 || length < 0 || startIndex + length > sLength ) {\r
+ throw new ArgumentOutOfRangeException();\r
+ }\r
+\r
+ // Copy everything after the 'removed' part to the start \r
// of the removed part and truncate the sLength\r
\r
- Array.Copy( sString, startIndex + length, sString, \r
+ Array.Copy( sString, startIndex + length, sString, \r
startIndex, length );\r
\r
- sLength -= length;\r
- return this;\r
- } \r
+ sLength -= length;\r
+ return this;\r
+ } \r
\r
- public StringBuilder Replace( char oldChar, char newChar ) {\r
- \r
- return Replace( oldChar, newChar, 0, sLength);\r
- }\r
+ public StringBuilder Replace( char oldChar, char newChar ) {\r
+ \r
+ return Replace( oldChar, newChar, 0, sLength);\r
+ }\r
\r
- public StringBuilder Replace( char oldChar, char newChar, int startIndex, int count ) {\r
- if( startIndex + count > sLength || startIndex < 0 || count < 0 ) {\r
- throw new ArgumentOutOfRangeException();\r
- }\r
+ public StringBuilder Replace( char oldChar, char newChar, int startIndex, int count ) {\r
+ if( startIndex + count > sLength || startIndex < 0 || count < 0 ) {\r
+ throw new ArgumentOutOfRangeException();\r
+ }\r
\r
- for( int replaceIterate = startIndex; replaceIterate < startIndex + count; replaceIterate++ ) {\r
- if( this[replaceIterate] == oldChar ) {\r
- this[replaceIterate] = newChar;\r
- }\r
- }\r
+ for( int replaceIterate = startIndex; replaceIterate < startIndex + count; replaceIterate++ ) {\r
+ if( this[replaceIterate] == oldChar ) {\r
+ this[replaceIterate] = newChar;\r
+ }\r
+ }\r
\r
- return this;\r
- }\r
+ return this;\r
+ }\r
\r
- public StringBuilder Replace( string oldValue, string newValue ) {\r
- return Replace( oldValue, newValue, 0, sLength );\r
- }\r
+ public StringBuilder Replace( string oldValue, string newValue ) {\r
+ return Replace( oldValue, newValue, 0, sLength );\r
+ }\r
\r
- public StringBuilder Replace( string oldValue, string newValue, int startIndex, int count ) {\r
- string startString = this.ToString();\r
- StringBuilder newStringB = new StringBuilder();\r
- string newString;\r
+ public StringBuilder Replace( string oldValue, string newValue, int startIndex, int count ) {\r
+ string startString = this.ToString();\r
+ StringBuilder newStringB = new StringBuilder();\r
+ string newString;\r
\r
- if( oldValue == null ) { \r
- throw new ArgumentNullException(\r
+ if( oldValue == null ) { \r
+ throw new ArgumentNullException(\r
"The old value cannot be null.");\r
- }\r
+ }\r
\r
- if( startIndex < 0 || count < 0 || startIndex + count > sLength ) {\r
- throw new ArgumentOutOfRangeException();\r
- }\r
+ if( startIndex < 0 || count < 0 || startIndex + count > sLength ) {\r
+ throw new ArgumentOutOfRangeException();\r
+ }\r
\r
- if( oldValue.Length == 0 ) {\r
- throw new ArgumentException(\r
+ if( oldValue.Length == 0 ) {\r
+ throw new ArgumentException(\r
"The old value cannot be zero length.");\r
- }\r
+ }\r
\r
- int nextIndex = startIndex; // Where to start the next search\r
- int lastIndex = nextIndex; // Where the last search finished\r
+ int nextIndex = startIndex; // Where to start the next search\r
+ int lastIndex = nextIndex; // Where the last search finished\r
\r
- while( nextIndex != -1 ) {\r
- nextIndex = startString.IndexOf( oldValue, lastIndex); \r
- if( nextIndex != -1 ) {\r
- // The MS implementation won't replace a substring \r
+ while( nextIndex != -1 ) {\r
+ nextIndex = startString.IndexOf( oldValue, lastIndex); \r
+ if( nextIndex != -1 ) {\r
+ // The MS implementation won't replace a substring \r
// if that substring goes over the "count"\r
// boundary, so we'll make sure the behaviour \r
// here is the same.\r
\r
- if( nextIndex + oldValue.Length < startIndex + count ) {\r
+ if( nextIndex + oldValue.Length < startIndex + count ) {\r
\r
- // Add everything to the left of the old \r
+ // Add everything to the left of the old \r
// string\r
- newStringB.Append( startString.Substring( lastIndex, nextIndex - lastIndex ) );\r
- \r
- // Add the replacement string\r
- newStringB.Append( newValue );\r
- \r
- // Set the next start point to the \r
+ newStringB.Append( startString.Substring( lastIndex, nextIndex - lastIndex ) );\r
+ \r
+ // Add the replacement string\r
+ newStringB.Append( newValue );\r
+ \r
+ // Set the next start point to the \r
// end of the last match\r
- lastIndex = nextIndex + oldValue.Length;\r
- } else {\r
- // We're past the "count" we're supposed to replace within\r
- nextIndex = -1;\r
- newStringB.Append( \r
+ lastIndex = nextIndex + oldValue.Length;\r
+ } else {\r
+ // We're past the "count" we're supposed to replace within\r
+ nextIndex = -1;\r
+ newStringB.Append( \r
startString.Substring( lastIndex ) );\r
- }\r
-\r
- } else {\r
- // Append everything left over\r
- newStringB.Append( startString.Substring( lastIndex ) );\r
- }\r
- } \r
-\r
- newString = newStringB.ToString();\r
-\r
- EnsureCapacity( newString.Length );\r
- sString = newString.ToCharArray();\r
- sLength = newString.Length;\r
- return this;\r
- }\r
-\r
- \r
- /* The Append Methods */\r
-\r
- // TODO: Currently most of these methods convert the \r
- // parameter to a CharArray (via a String) and then pass\r
- // it to Append( char[] ). There might be a faster way\r
- // of doing this, but it's probably adequate and anything else\r
- // would make it too messy.\r
- //\r
- // As an example, a sample test run of appending a 100 character\r
- // string to the StringBuilder, and loooping this 50,000 times\r
- // results in an elapsed time of 2.4s using the MS StringBuilder\r
- // and 2.7s using this StringBuilder. Note that this results\r
- // in a 5 million character string. I believe MS uses a lot\r
- // of "native" DLLs for the "meat" of the base classes.\r
-\r
-\r
- public StringBuilder Append( char[] value ) {\r
- if( sLength + value.Length > sCapacity ) {\r
- // Need more capacity, double the capacity StringBuilder \r
- // and make sure we have at least enough for the value \r
- // if that's going to go over double. \r
- \r
- Capacity = value.Length + ( sCapacity + sCapacity);\r
- }\r
-\r
- Array.Copy( value, 0, sString, sLength, value.Length );\r
- sLength += value.Length;\r
-\r
- return this;\r
- } \r
- \r
- public StringBuilder Append( string value ) {\r
- if( value != null ) {\r
- return Append( value.ToCharArray() );\r
- } else {\r
- return null;\r
- }\r
- }\r
-\r
- public StringBuilder Append( bool value ) {\r
- return Append( value.ToString().ToCharArray() );\r
- }\r
- \r
- public StringBuilder Append( byte value ) {\r
- return Append( value.ToString().ToCharArray() );\r
- }\r
-\r
- public StringBuilder Append( int index, char value) {\r
- char[] appendChar = new char[1];\r
- \r
- appendChar[0] = value;\r
- return Append( appendChar );\r
- }\r
-\r
-\r
- public StringBuilder Append( decimal value ) {\r
- return Append( value.ToString().ToCharArray() );\r
- }\r
-\r
- public StringBuilder Append( double value ) {\r
- return Append( value.ToString().ToCharArray() );\r
- }\r
-\r
- public StringBuilder Append( short value ) {\r
- return Append( value.ToString().ToCharArray() );\r
- }\r
-\r
- public StringBuilder Append( int value ) {\r
- return Append( value.ToString().ToCharArray() );\r
- }\r
-\r
- public StringBuilder Append( long value ) {\r
- return Append( value.ToString().ToCharArray() );\r
- }\r
-\r
- public StringBuilder Append( object value ) {\r
- return Append( value.ToString().ToCharArray() );\r
- }\r
-\r
- public StringBuilder Append( sbyte value ) {\r
- return Append( value.ToString().ToCharArray() );\r
- }\r
-\r
- public StringBuilder Append( float value ) {\r
- return Append( value.ToString().ToCharArray() );\r
- }\r
-\r
- public StringBuilder Append( ushort value ) {\r
- return Append( value.ToString().ToCharArray() );\r
- } \r
- \r
- public StringBuilder Append( uint value ) {\r
- return Append( value.ToString().ToCharArray() );\r
- }\r
-\r
- public StringBuilder Append( ulong value ) {\r
- return Append( value.ToString().ToCharArray() );\r
- }\r
-\r
- public StringBuilder Append( char value, int repeatCount ) {\r
- if( repeatCount < 0 ) {\r
- throw new ArgumentOutOfRangeException();\r
- }\r
-\r
- return Append( new String( value, repeatCount) );\r
- }\r
-\r
- public StringBuilder Append( char[] value, int startIndex, int charCount ) {\r
-\r
- if( (charCount < 0 || startIndex < 0) || \r
- ( charCount + startIndex > value.Length ) ) {\r
- throw new ArgumentOutOfRangeException();\r
- }\r
- \r
- if( value == null ) {\r
- if( !(startIndex == 0 && charCount == 0) ) {\r
- throw new ArgumentNullException();\r
- } else {\r
- return this;\r
- }\r
- } else {\r
- char[] appendChars = new char[ charCount ];\r
- \r
- Array.Copy( value, startIndex, appendChars, 0, charCount );\r
- return Append( appendChars );\r
- }\r
- }\r
-\r
- public StringBuilder Append( string value, int startIndex, int count ) {\r
- if( (count < 0 || startIndex < 0) || \r
+ }\r
+\r
+ } else {\r
+ // Append everything left over\r
+ newStringB.Append( startString.Substring( lastIndex ) );\r
+ }\r
+ } \r
+\r
+ newString = newStringB.ToString();\r
+\r
+ EnsureCapacity( newString.Length );\r
+ sString = newString.ToCharArray();\r
+ sLength = newString.Length;\r
+ return this;\r
+ }\r
+\r
+ \r
+ /* The Append Methods */\r
+\r
+ // TODO: Currently most of these methods convert the \r
+ // parameter to a CharArray (via a String) and then pass\r
+ // it to Append( char[] ). There might be a faster way\r
+ // of doing this, but it's probably adequate and anything else\r
+ // would make it too messy.\r
+ //\r
+ // As an example, a sample test run of appending a 100 character\r
+ // string to the StringBuilder, and loooping this 50,000 times\r
+ // results in an elapsed time of 2.4s using the MS StringBuilder\r
+ // and 2.7s using this StringBuilder. Note that this results\r
+ // in a 5 million character string. I believe MS uses a lot\r
+ // of "native" DLLs for the "meat" of the base classes.\r
+\r
+\r
+ public StringBuilder Append( char[] value ) {\r
+ if( sLength + value.Length > sCapacity ) {\r
+ // Need more capacity, double the capacity StringBuilder \r
+ // and make sure we have at least enough for the value \r
+ // if that's going to go over double. \r
+ \r
+ Capacity = value.Length + ( sCapacity + sCapacity);\r
+ }\r
+\r
+ Array.Copy( value, 0, sString, sLength, value.Length );\r
+ sLength += value.Length;\r
+\r
+ return this;\r
+ } \r
+ \r
+ public StringBuilder Append( string value ) {\r
+ if( value != null ) {\r
+ return Append( value.ToCharArray() );\r
+ } else {\r
+ return null;\r
+ }\r
+ }\r
+\r
+ public StringBuilder Append( bool value ) {\r
+ return Append( value.ToString().ToCharArray() );\r
+ }\r
+ \r
+ public StringBuilder Append( byte value ) {\r
+ return Append( value.ToString().ToCharArray() );\r
+ }\r
+\r
+ public StringBuilder Append( int index, char value) {\r
+ char[] appendChar = new char[1];\r
+ \r
+ appendChar[0] = value;\r
+ return Append( appendChar );\r
+ }\r
+\r
+\r
+ public StringBuilder Append( decimal value ) {\r
+ return Append( value.ToString().ToCharArray() );\r
+ }\r
+\r
+ public StringBuilder Append( double value ) {\r
+ return Append( value.ToString().ToCharArray() );\r
+ }\r
+\r
+ public StringBuilder Append( short value ) {\r
+ return Append( value.ToString().ToCharArray() );\r
+ }\r
+\r
+ public StringBuilder Append( int value ) {\r
+ return Append( value.ToString().ToCharArray() );\r
+ }\r
+\r
+ public StringBuilder Append( long value ) {\r
+ return Append( value.ToString().ToCharArray() );\r
+ }\r
+\r
+ public StringBuilder Append( object value ) {\r
+ return Append( value.ToString().ToCharArray() );\r
+ }\r
+\r
+ public StringBuilder Append( sbyte value ) {\r
+ return Append( value.ToString().ToCharArray() );\r
+ }\r
+\r
+ public StringBuilder Append( float value ) {\r
+ return Append( value.ToString().ToCharArray() );\r
+ }\r
+\r
+ public StringBuilder Append( ushort value ) {\r
+ return Append( value.ToString().ToCharArray() );\r
+ } \r
+ \r
+ public StringBuilder Append( uint value ) {\r
+ return Append( value.ToString().ToCharArray() );\r
+ }\r
+\r
+ public StringBuilder Append( ulong value ) {\r
+ return Append( value.ToString().ToCharArray() );\r
+ }\r
+\r
+ public StringBuilder Append( char value, int repeatCount ) {\r
+ if( repeatCount < 0 ) {\r
+ throw new ArgumentOutOfRangeException();\r
+ }\r
+\r
+ return Append( new String( value, repeatCount) );\r
+ }\r
+\r
+ public StringBuilder Append( char[] value, int startIndex, int charCount ) {\r
+\r
+ if( (charCount < 0 || startIndex < 0) || \r
+ ( charCount + startIndex > value.Length ) ) {\r
+ throw new ArgumentOutOfRangeException();\r
+ }\r
+ \r
+ if( value == null ) {\r
+ if( !(startIndex == 0 && charCount == 0) ) {\r
+ throw new ArgumentNullException();\r
+ } else {\r
+ return this;\r
+ }\r
+ } else {\r
+ char[] appendChars = new char[ charCount ];\r
+ \r
+ Array.Copy( value, startIndex, appendChars, 0, charCount );\r
+ return Append( appendChars );\r
+ }\r
+ }\r
+\r
+ public StringBuilder Append( string value, int startIndex, int count ) {\r
+ if( (count < 0 || startIndex < 0) || \r
( startIndex + count > value.Length ) ) { \r
- throw new ArgumentOutOfRangeException();\r
- }\r
-\r
- return Append( value.Substring( startIndex, count ).ToCharArray() );\r
- }\r
-\r
- public StringBuilder AppendFormat( string format, object arg0 ) {\r
- // TODO: Implement\r
- return this;\r
- }\r
-\r
- public StringBuilder AppendFormat( string format, params object[] args ) {\r
- // TODO: Implement\r
- return this;\r
- }\r
-\r
- public StringBuilder AppendFormat( IFormatProvider provider, string format,\r
- params object[] args ) {\r
- // TODO: Implement\r
- return this;\r
- }\r
-\r
- public StringBuilder AppendFormat( string format, object arg0, object arg1 ) {\r
- // TODO: Implement;\r
- return this;\r
- }\r
-\r
- public StringBuilder AppendFormat( string format, object arg0, object arg1, object arg2 ) {\r
- // TODO Implement\r
- return this;\r
- }\r
-\r
- /* The Insert Functions */\r
- \r
- // Similarly to the Append functions, get everything down to a CharArray \r
- // and insert that.\r
- \r
- public StringBuilder Insert( int index, char[] value ) {\r
- if( index > sLength || index < 0) {\r
- throw new ArgumentOutOfRangeException();\r
- }\r
-\r
- if( value == null || value.Length == 0 ) {\r
- return this;\r
- } else {\r
- // Check we have the capacity to insert this array\r
- if( sCapacity < sLength + value.Length ) {\r
- Capacity = value.Length + ( sCapacity + sCapacity );\r
- }\r
-\r
- // Move everything to the right of the insert point across\r
- Array.Copy( sString, index, sString, index + value.Length, sLength - index);\r
- \r
- // Copy in stuff from the insert buffer\r
- Array.Copy( value, 0, sString, index, value.Length );\r
- \r
- sLength += value.Length;\r
- return this;\r
- }\r
- }\r
- \r
- public StringBuilder Insert( int index, string value ) {\r
- return Insert( index, value.ToCharArray() );\r
- }\r
-\r
- public StringBuilder Insert( int index, bool value ) {\r
- return Insert( index, value.ToString().ToCharArray() );\r
- }\r
- \r
- public StringBuilder Insert( int index, byte value ) {\r
- return Insert( index, value.ToString().ToCharArray() );\r
- }\r
-\r
- public StringBuilder Insert( int index, char value) {\r
- char[] insertChar = new char[1];\r
- \r
- insertChar[0] = value;\r
- return Insert( index, insertChar );\r
- }\r
-\r
- public StringBuilder Insert( int index, decimal value ) {\r
- return Insert( index, value.ToString().ToCharArray() );\r
- }\r
-\r
- public StringBuilder Insert( int index, double value ) {\r
- return Insert( index, value.ToString().ToCharArray() );\r
- }\r
- \r
- public StringBuilder Insert( int index, short value ) {\r
- return Insert( index, value.ToString().ToCharArray() );\r
- }\r
-\r
- public StringBuilder Insert( int index, int value ) {\r
- return Insert( index, value.ToString().ToCharArray() );\r
- }\r
-\r
- public StringBuilder Insert( int index, long value ) {\r
- return Insert( index, value.ToString().ToCharArray() );\r
- }\r
- \r
- public StringBuilder Insert( int index, object value ) {\r
- return Insert( index, value.ToString().ToCharArray() );\r
- }\r
-\r
- public StringBuilder Insert( int index, sbyte value ) {\r
- return Insert( index, value.ToString().ToCharArray() );\r
- }\r
-\r
- public StringBuilder Insert( int index, float value ) {\r
- return Insert( index, value.ToString().ToCharArray() );\r
- }\r
-\r
- public StringBuilder Insert( int index, ushort value ) {\r
- return Insert( index, value.ToString().ToCharArray() );\r
- }\r
-\r
- public StringBuilder Insert( int index, uint value ) {\r
- return Insert( index, value.ToString().ToCharArray() );\r
- }\r
-\r
- public StringBuilder Insert( int index, ulong value ) {\r
- return Insert( index, value.ToString().ToCharArray() );\r
- }\r
-\r
- public StringBuilder Insert( int index, string value, int count ) {\r
- if ( count < 0 ) {\r
- throw new ArgumentOutOfRangeException();\r
- }\r
-\r
- if( value != null ) {\r
- if( value != "" ) {\r
- for( int insertCount = 0; insertCount < count; \r
+ throw new ArgumentOutOfRangeException();\r
+ }\r
+\r
+ return Append( value.Substring( startIndex, count ).ToCharArray() );\r
+ }\r
+\r
+ public StringBuilder AppendFormat( string format, object arg0 ) {\r
+ // TODO: Implement\r
+ return this;\r
+ }\r
+\r
+ public StringBuilder AppendFormat( string format, params object[] args ) {\r
+ // TODO: Implement\r
+ return this;\r
+ }\r
+\r
+ public StringBuilder AppendFormat( IFormatProvider provider, string format,\r
+ params object[] args ) {\r
+ // TODO: Implement\r
+ return this;\r
+ }\r
+\r
+ public StringBuilder AppendFormat( string format, object arg0, object arg1 ) {\r
+ // TODO: Implement;\r
+ return this;\r
+ }\r
+\r
+ public StringBuilder AppendFormat( string format, object arg0, object arg1, object arg2 ) {\r
+ // TODO Implement\r
+ return this;\r
+ }\r
+\r
+ /* The Insert Functions */\r
+ \r
+ // Similarly to the Append functions, get everything down to a CharArray \r
+ // and insert that.\r
+ \r
+ public StringBuilder Insert( int index, char[] value ) {\r
+ if( index > sLength || index < 0) {\r
+ throw new ArgumentOutOfRangeException();\r
+ }\r
+\r
+ if( value == null || value.Length == 0 ) {\r
+ return this;\r
+ } else {\r
+ // Check we have the capacity to insert this array\r
+ if( sCapacity < sLength + value.Length ) {\r
+ Capacity = value.Length + ( sCapacity + sCapacity );\r
+ }\r
+\r
+ // Move everything to the right of the insert point across\r
+ Array.Copy( sString, index, sString, index + value.Length, sLength - index);\r
+ \r
+ // Copy in stuff from the insert buffer\r
+ Array.Copy( value, 0, sString, index, value.Length );\r
+ \r
+ sLength += value.Length;\r
+ return this;\r
+ }\r
+ }\r
+ \r
+ public StringBuilder Insert( int index, string value ) {\r
+ return Insert( index, value.ToCharArray() );\r
+ }\r
+\r
+ public StringBuilder Insert( int index, bool value ) {\r
+ return Insert( index, value.ToString().ToCharArray() );\r
+ }\r
+ \r
+ public StringBuilder Insert( int index, byte value ) {\r
+ return Insert( index, value.ToString().ToCharArray() );\r
+ }\r
+\r
+ public StringBuilder Insert( int index, char value) {\r
+ char[] insertChar = new char[1];\r
+ \r
+ insertChar[0] = value;\r
+ return Insert( index, insertChar );\r
+ }\r
+\r
+ public StringBuilder Insert( int index, decimal value ) {\r
+ return Insert( index, value.ToString().ToCharArray() );\r
+ }\r
+\r
+ public StringBuilder Insert( int index, double value ) {\r
+ return Insert( index, value.ToString().ToCharArray() );\r
+ }\r
+ \r
+ public StringBuilder Insert( int index, short value ) {\r
+ return Insert( index, value.ToString().ToCharArray() );\r
+ }\r
+\r
+ public StringBuilder Insert( int index, int value ) {\r
+ return Insert( index, value.ToString().ToCharArray() );\r
+ }\r
+\r
+ public StringBuilder Insert( int index, long value ) {\r
+ return Insert( index, value.ToString().ToCharArray() );\r
+ }\r
+ \r
+ public StringBuilder Insert( int index, object value ) {\r
+ return Insert( index, value.ToString().ToCharArray() );\r
+ }\r
+\r
+ public StringBuilder Insert( int index, sbyte value ) {\r
+ return Insert( index, value.ToString().ToCharArray() );\r
+ }\r
+\r
+ public StringBuilder Insert( int index, float value ) {\r
+ return Insert( index, value.ToString().ToCharArray() );\r
+ }\r
+\r
+ public StringBuilder Insert( int index, ushort value ) {\r
+ return Insert( index, value.ToString().ToCharArray() );\r
+ }\r
+\r
+ public StringBuilder Insert( int index, uint value ) {\r
+ return Insert( index, value.ToString().ToCharArray() );\r
+ }\r
+\r
+ public StringBuilder Insert( int index, ulong value ) {\r
+ return Insert( index, value.ToString().ToCharArray() );\r
+ }\r
+\r
+ public StringBuilder Insert( int index, string value, int count ) {\r
+ if ( count < 0 ) {\r
+ throw new ArgumentOutOfRangeException();\r
+ }\r
+\r
+ if( value != null ) {\r
+ if( value != "" ) {\r
+ for( int insertCount = 0; insertCount < count; \r
insertCount++ ) {\r
- Insert( index, value.ToCharArray() ); \r
- }\r
- }\r
- }\r
- return this;\r
- }\r
-\r
- public StringBuilder Insert( int index, char[] value, int startIndex, \r
+ Insert( index, value.ToCharArray() ); \r
+ }\r
+ }\r
+ }\r
+ return this;\r
+ }\r
+\r
+ public StringBuilder Insert( int index, char[] value, int startIndex, \r
int charCount ) {\r
\r
- if( value != null ) {\r
- if( charCount < 0 || startIndex < 0 || startIndex + charCount > value.Length ) {\r
- throw new ArgumentOutOfRangeException();\r
- }\r
- \r
- char[] insertChars = new char[ charCount ];\r
- Array.Copy( value, startIndex, insertChars, 0, charCount );\r
- return Insert( index, insertChars );\r
- } else {\r
- return this;\r
- }\r
- }\r
- }\r
+ if( value != null ) {\r
+ if( charCount < 0 || startIndex < 0 || startIndex + charCount > value.Length ) {\r
+ throw new ArgumentOutOfRangeException();\r
+ }\r
+ \r
+ char[] insertChars = new char[ charCount ];\r
+ Array.Copy( value, startIndex, insertChars, 0, charCount );\r
+ return Insert( index, insertChars );\r
+ } else {\r
+ return this;\r
+ }\r
+ }\r
+ }\r
} \r
int i;
// FIXME: value.Length includes the terminating null char?
- this.length = value ? strlen (value): 0;
+ this.length = value != null ? strlen (value): 0;
this.c_str = new char [this.length + 1];
for (i = 0; i < this.length; i++)
this.c_str[i] = value[i];
this.c_str = new char [this.length + 1];
for (i = 0; i < this.length; i++)
- this.c_str[i] = *(value + i);
+ this.c_str[i] = (char) *(value + i);
this.c_str[i] = '\0';
}
this.length = length;
this.c_str = new char [length + 1];
for (i = 0; i < length; i++)
- this.c_str[i] = *(value + startIndex + i);
+ this.c_str[i] = (char) *(value + startIndex + i);
this.c_str[i] = '\0';
}
~String ()
{
// FIXME: is there anything we need to do here?
- base.Finalize ();
+ /*base.Finalize ();*/
}
protected override string MemberwiseClone ()
}
// FIXME: is this correct syntax??
- public char Chars (int index) {
+ public char Chars [int index] {
get {
if (index > this.length)
throw new ArgumentOutOfRangeException ();
}
// Private helper methods
- private int strlen (char[] str)
+ private static int strlen (char[] str)
{
// FIXME: if str.Length includes terminating null char, then return (str.Length - 1)
return str.Length;
}
- private char tolower (char c)
+ private static char tolower (char c)
{
// FIXME: make me unicode aware
- return c >= 'A' && c <= 'Z' ? c + 33 : c;
+ return c >= 'A' && c <= 'Z' ? c + (char) 33 : c;
}
- private char toupper (char c)
+ private static char toupper (char c)
{
// FIXME: make me unicode aware
- return c >= 'a' && c <= 'z' ? c - 33 : c;
+ return c >= 'a' && c <= 'z' ? c - (char) 33 : c;
}
- private char tolowerordinal (char c)
+ private static char tolowerordinal (char c)
{
// FIXME: implement me
return c;
}
- private bool is_lwsp (char c)
+ private static bool is_lwsp (char c)
{
/* this comes from the msdn docs for String.Trim() */
if ((c >= '\x9' && c <= '\xD') || c == '\x20' || c == '\xA0' ||
return false;
}
- private int BoyerMoore (char[] haystack, char[] needle, int startIndex, int count)
+ private static int BoyerMoore (char[] haystack, char[] needle, int startIndex, int count)
{
/* (hopefully) Unicode-safe Boyer-Moore implementation */
char skiptable[65536]; /* our unicode-safe skip-table */
public int CompareTo (object obj)
{
- return Compare (this, obj == null ? null : obj.ToString);
+ return Compare (this, obj == null ? null : obj.ToString ());
}
public int CompareTo (string str)
public static string Concat (object arg)
{
- return Concat (this, arg ? arg.ToString () : this.Empty);
+ return Concat (this, arg ? arg.ToString () : String.Empty);
}
public static string Concat (params object[] args)
{
- string strings[], str;
+ string[] strings;
+ string str;
int len, i;
if (args == null)
foreach (object arg in args) {
/* use Empty for each null argument */
if (arg == null)
- strings[i] = this.Empty;
+ strings[i] = String.Empty;
else
strings[i] = arg.ToString ();
len += strings[i].Length;
}
if (len == 0)
- return this.Empty;
+ return String.Empty;
str = new string [len + 1];
i = 0;
len += value ? value.Length : 0;
if (len == 0)
- return this.Empty;
+ return String.Empty;
str = new string [len + 1];
i = 0;
public static string Concat (object arg0, object arg1)
{
- string str0 = arg0 ? arg0.ToString () : this.Empty;
- string str1 = arg1 ? arg1.ToString () : this.Empty;
+ string str0 = arg0 ? arg0.ToString () : String.Empty;
+ string str1 = arg1 ? arg1.ToString () : String.Empty;
return Concat (str0, str1);
}
int i, j, len;
if (str0 == null)
- str0 = this.Empty;
+ str0 = String.Empty;
if (str1 == null)
- str1 == this.Empty;
+ str1 == String.Empty;
len = str0.Length + str1.Length;
if (len == 0)
- return this.Empty;
+ return String.Empty;
concat = new string [len + 1];
for (i = 0; i < str0.Length; i++)
public static string Concat (object arg0, object arg1, object arg2)
{
- string str0 = arg0 ? arg0.ToString () : this.Empty;
- string str1 = arg1 ? arg1.ToString () : this.Empty;
- string str2 = arg2 ? arg2.ToString () : this.Empty;
+ string str0 = arg0 ? arg0.ToString () : String.Empty;
+ string str1 = arg1 ? arg1.ToString () : String.Empty;
+ string str2 = arg2 ? arg2.ToString () : String.Empty;
return Concat (str0, str1, str2);
}
int i, j, k, len;
if (str0 == null)
- str0 = this.Empty;
+ str0 = String.Empty;
if (str1 == null)
- str1 = this.Empty;
+ str1 = String.Empty;
if (str2 == null)
- str2 = this.Empty;
+ str2 = String.Empty;
len = str0.Length + str1.Length + str2.Length;
if (len == 0)
- return this.Empty;
+ return String.Empty;
concat = new string [len + 1];
for (i = 0; i < str0.Length; i++)
int i, j, k, l, len;
if (str0 == null)
- str0 = this.Empty;
+ str0 = String.Empty;
if (str1 == null)
- str1 = this.Empty;
+ str1 = String.Empty;
if (str2 == null)
- str2 = this.Empty;
+ str2 = String.Empty;
if (str3 == null)
- str3 = this.Empty;
+ str3 = String.Empty;
len = str0.Length + str1.Length + str2.Length + str3.Length;
if (len == 0)
- return this.Empty;
+ return String.Empty;
concat = new string [len + 1];
for (i = 0; i < str0.Length; i++)
public void CopyTo (int sourceIndex, char[] destination, int destinationIndex, int count)
{
// LAMESPEC: should I null-terminate?
- int i, len;
+ int i;
if (destination == null)
throw new ArgumentNullException ();
return this == (String) obj;
}
- public new bool Equals (string value)
+ public bool Equals (string value)
{
return this == value;
}
- public static new bool Equals (string a, string b)
+ public static bool Equals (string a, string b)
{
return a == b;
}
return 0;
}
- public Type GetType ()
+ public new Type GetType ()
{
// FIXME: implement me
return null;
if (startIndex < 0 || count < 0 || startIndex + count > this.length)
throw new ArgumentOutOfRangeException ();
- for (int i = startIndex; i < startIndex + count, i++) {
+ for (int i = startIndex; i < startIndex + count; i++) {
for (int j = 0; j < strlen (values); j++) {
if (this.c_str[i] == values[j])
return i;
// We have no elements to join?
if (i == startIndex)
- return this.Empty;
+ return String.Empty;
str = new string [len + 1];
for (i = 0; i < value[startIndex].Length; i++)
if (count < 0 || startIndex - count < 0)
throw new ArgumentOutOfRangeException ();
- if (value == this.Empty)
+ if (value == String.Empty)
return startIndex;
if (startIndex + value.Length > this.length) {
len = this.length - count;
if (len == 0)
- return this.Empty;
+ return String.Empty;
str = new string [len + 1];
for (i = 0; i < startIndex; i++)
len = this.length - oldValue.Length + newValue.Length;
if (len == 0)
- return this.Empty;
+ return String.Empty;
str = new string [len + 1];
for (i = 0; i < index; i++)
private int splitme (char[] separators, int startIndex)
{
/* this is basically a customized IndexOfAny() for the Split() methods */
- for (int i = startIndex; i < this.length, i++) {
+ for (int i = startIndex; i < this.length; i++) {
if (separators != null) {
foreach (char sep in separators) {
if (this.c_str[i] == sep)
* adjacent.
**/
// FIXME: would using a Queue be better?
- string strings[];
+ string[] strings;
ArrayList list;
int index, len;
len = splitme (separator, index);
len = len > -1 ? len : this.length - index;
if (len == 0) {
- list.Add (this.Empty);
+ list.Add (String.Empty);
} else {
string str;
int i;
strings[0] = this;
} else {
for (index = 0; index < list.Count; index++)
- strings[index] = list[index];
+ strings[index] = (string) list[index];
}
return strings;
{
// FIXME: what to do if maxCount <= 0?
// FIXME: would using Queue be better than ArrayList?
- string strings[];
+ string[] strings;
ArrayList list;
int index, len, used;
len = splitme (separator, index);
len = len > -1 ? len : this.length - index;
if (len == 0) {
- list.Add (this.Empty);
+ list.Add (String.Empty);
} else {
string str;
int i;
strings[0] = this;
} else {
for (index = 0; index < list.Count; index++)
- strings[index] = list[index];
+ strings[index] = (string) list[index];
}
return strings;
len = this.length - startIndex;
if (len == 0)
- return this.Empty;
+ return String.Empty;
str = new string [len + 1];
for (i = startIndex; i < this.length; i++)
throw new ArgumentOutOfRangeException ();
if (length == 0)
- return this.Empty;
+ return String.Empty;
str = new string [length + 1];
for (i = startIndex; i < startIndex + length; i++)
return str;
}
- public override bool ToBoolean (IFormatProvider provider)
+ public bool ToBoolean (IFormatProvider provider)
{
// FIXME: implement me
return false;
}
- public override byte ToByte (IFormatProvider provider)
+ public byte ToByte (IFormatProvider provider)
{
// FIXME: implement me
return '\0';
}
- public override char ToChar (IFormatProvider provider)
+ public char ToChar (IFormatProvider provider)
{
// FIXME: implement me
return '\0';
return chars;
}
- public override DateTime ToDateTime (IFormatProvider provider)
+ public DateTime ToDateTime (IFormatProvider provider)
{
// FIXME: implement me
return null;
}
- public override decimal ToDecimal (IFormatProvider provider)
+ public decimal ToDecimal (IFormatProvider provider)
{
// FIXME: implement me
- return 0.0;
+ return 0.0D;
}
- public override double ToDouble (IFormatProvider provider)
+ public double ToDouble (IFormatProvider provider)
{
// FIXME: implement me
return 0.0;
}
- public override short ToInt16 (IFormatProvider)
+ public short ToInt16 (IFormatProvider provider)
{
// FIXME: implement me
return 0;
}
- public override int ToInt32 (IFormatProvider)
+ public int ToInt32 (IFormatProvider provider)
{
// FIXME: implement me
return 0;
}
- public override long ToInt64 (IFormatProvider)
+ public long ToInt64 (IFormatProvider provider)
{
// FIXME: implement me
return 0;
return null;
}
- public override sbyte ToSByte (IFormatProvider)
+ public sbyte ToSByte (IFormatProvider provider)
{
// FIXME: implement me
return 0;
}
- public override float ToSingle (IFormatProvider)
+ public float ToSingle (IFormatProvider provider)
{
// FIXME: implement me
- return 0.0;
+ return 0.0F;
}
public override string ToString ()
return null;
}
- public override object ToType (Type conversionType, IFormatProvider provider)
+ public object ToType (Type conversionType, IFormatProvider provider)
{
// FIXME: implement me
return null;
}
- public override ushort ToUInt16 (IFormatProvider provider)
+ public ushort ToUInt16 (IFormatProvider provider)
{
// FIXME: implement me
return 0;
}
- public override uint ToUInt32 (IFormatProvider provider)
+ public uint ToUInt32 (IFormatProvider provider)
{
// FIXME: implement me
return 0;
}
- public override ulong ToUInt64 (IFormatProvider provider)
+ public ulong ToUInt64 (IFormatProvider provider)
{
// FIXME: implement me
return 0;
}
if (begin == end)
- return this.Empty;
+ return String.Empty;
return Substring (begin, end - begin);
}
}
if (end == 0)
- return this.Empty;
+ return String.Empty;
return Substring (0, end);
}
}
if (begin == this.length)
- return this.Empty;
+ return String.Empty;
return Substring (begin, this.length - begin);
}