5 // Patrik Torstensson (patrik.torstensson@labs2.com)
6 // Jeffrey Stedfast (fejj@ximian.com)
7 // Dan Lewis (dihlewis@yahoo.co.uk)
9 // (C) 2001 Ximian, Inc. http://www.ximian.com
14 using System.Collections;
15 using System.Globalization;
16 using System.Runtime.CompilerServices;
19 public sealed class String : IConvertible, IComparable, ICloneable, IEnumerable {
23 public static readonly String Empty = "";
25 // New constructors (to use when we change the internal structure of a string
27 [CLSCompliant(false), MethodImplAttribute(MethodImplOptions.InternalCall)]
28 unsafe public extern String(char *value);
30 [CLSCompliant(false), MethodImplAttribute(MethodImplOptions.InternalCall)]
31 unsafe public extern String(char *value, int sindex, int length);
33 [CLSCompliant(false), MethodImplAttribute(MethodImplOptions.InternalCall)]
34 unsafe public extern String(sbyte *value);
36 [CLSCompliant(false), MethodImplAttribute(MethodImplOptions.InternalCall)]
37 unsafe public extern String(sbyte *value, int sindex, int length);
39 [CLSCompliant(false), MethodImplAttribute(MethodImplOptions.InternalCall)]
40 unsafe public extern String(sbyte *value, int sindex, int length, Encoding enc);
42 [MethodImplAttribute(MethodImplOptions.InternalCall)]
43 public extern String(char [] val, int sindex, int length);
45 [MethodImplAttribute(MethodImplOptions.InternalCall)]
46 public extern String(char [] val);
48 [MethodImplAttribute(MethodImplOptions.InternalCall)]
49 public extern String(char c, int count);
53 // Constructors (old one's from the old String.cs)
54 internal String (int storage) {
56 throw new ArgumentOutOfRangeException ();
58 c_str = new char [storage];
62 unsafe public String (char *value) {
65 // FIXME: can I do value.Length here?
69 for (i = 0; *(value + i) != '\0'; i++);
73 this.c_str = new char [this.length + 1];
74 for (i = 0; i < this.length; i++)
75 this.c_str[i] = *(value + i);
78 public String (char[] value) {
81 // FIXME: value.Length includes the terminating null char?
82 this.length = value != null ? value.Length : 0;
83 this.c_str = new char [this.length + 1];
84 for (i = 0; i < this.length; i++)
85 this.c_str[i] = value[i];
89 unsafe public String (sbyte *value) {
90 // FIXME: consider unicode?
93 // FIXME: can I do value.Length here? */
97 for (i = 0; *(value + i) != '\0'; i++);
101 this.c_str = new char [this.length + 1];
102 for (i = 0; i < this.length; i++)
103 this.c_str[i] = (char) *(value + i);
106 public String (char c, int count) {
110 this.c_str = new char [count + 1];
111 for (i = 0; i < count; i++)
115 [CLSCompliant(false)]
116 unsafe public String (char *value, int startIndex, int length) {
119 if (value == null && startIndex != 0 && length != 0)
120 throw new ArgumentNullException ();
122 if (startIndex < 0 || length < 0)
123 throw new ArgumentOutOfRangeException ();
125 this.length = length;
126 this.c_str = new char [length + 1];
127 for (i = 0; i < length; i++)
128 this.c_str[i] = *(value + startIndex + i);
131 public String (char[] value, int startIndex, int length) {
134 if (value == null && startIndex != 0 && length != 0)
135 throw new ArgumentNullException ();
137 if (startIndex < 0 || length < 0)
138 throw new ArgumentOutOfRangeException ();
140 this.length = length;
141 this.c_str = new char [length + 1];
142 for (i = 0; i < length; i++)
143 this.c_str[i] = value[startIndex + i];
146 [CLSCompliant(false)]
147 unsafe public String (sbyte *value, int startIndex, int length) {
148 // FIXME: consider unicode?
151 if (value == null && startIndex != 0 && length != 0)
152 throw new ArgumentNullException ();
154 if (startIndex < 0 || length < 0)
155 throw new ArgumentOutOfRangeException ();
157 this.length = length;
158 this.c_str = new char [length + 1];
159 for (i = 0; i < length; i++)
160 this.c_str[i] = (char) *(value + startIndex + i);
163 [MethodImplAttribute(MethodImplOptions.InternalCall)]
164 public extern override int GetHashCode();
166 public static bool Equals(String str1, String str2) {
167 if ((Object) str1 == (Object) str2)
170 if (null == (Object) str1 || null == (Object) str2)
173 return (bool) (str1.CompareTo(str2) == 0);
176 public static bool operator == (String str1, String str2) {
177 return Equals(str1, str2);
180 public static bool operator != (String str1, String str2) {
181 return !Equals(str1, str2);
184 public override bool Equals(Object obj) {
188 if (!(obj is String))
191 return (bool) (0 == CompareTo((String) obj));
194 public bool Equals(String value) {
198 return (bool) (0 == CompareTo(value));
201 [IndexerName("Chars")]
202 public extern char this[int index] {
203 [MethodImplAttribute(MethodImplOptions.InternalCall)]
207 public Object Clone() {
211 public void CopyTo(int sindex, char[] dest, int dindex, int count) {
212 // LAMESPEC: should I null-terminate?
215 throw new ArgumentNullException();
217 if (sindex < 0 || dindex < 0 || count < 0)
218 throw new ArgumentOutOfRangeException ();
220 if (sindex + count > Length)
221 throw new ArgumentOutOfRangeException ();
223 if (dindex + count > dest.Length)
224 throw new ArgumentOutOfRangeException ();
226 InternalCopyTo(sindex, dest, dindex, count);
229 public char[] ToCharArray() {
230 return ToCharArray(0, length);
233 public char[] ToCharArray(int sindex, int length) {
234 if (sindex < 0 || length < 0 || sindex + length > this.length)
235 throw new ArgumentOutOfRangeException ();
237 char [] tmp = new char[length];
239 InternalCopyTo(sindex, tmp, 0, length);
244 public String [] Split(params char [] separator) {
245 return Split(separator, Int32.MaxValue);
248 public String[] Split(char[] separator, int count) {
249 if (null == separator) {
250 separator = WhiteChars;
254 throw new ArgumentOutOfRangeException ();
257 return new String[1] { ToString() };
259 return InternalSplit(separator, count);
262 public String Substring (int sindex) {
263 if (sindex < 0 || sindex > this.length) {
264 Console.WriteLine("Substring({0}) = {2}\n", sindex, this.length, this);
265 throw new ArgumentOutOfRangeException();
268 string tmp = InternalAllocateStr(this.length - sindex);
269 InternalStrcpy(tmp, 0, this, sindex, length - sindex);
274 public String Substring (int sindex, int length) {
275 if (length < 0 || sindex < 0 || sindex + length > this.length) {
276 Console.WriteLine("Substring({0}, {1}) = {2}\n", sindex, length, this.ToString());
277 throw new ArgumentOutOfRangeException();
283 string tmp = InternalAllocateStr(length);
284 InternalStrcpy(tmp, 0, this, sindex, length);
289 private static readonly char[] WhiteChars = { (char) 0x9, (char) 0xA, (char) 0xB, (char) 0xC, (char) 0xD, (char) 0x20, (char) 0xA0, (char) 0x2000, (char) 0x2001, (char) 0x2002, (char) 0x2003, (char) 0x2004, (char) 0x2005,
290 (char) 0x2006, (char) 0x2007, (char) 0x2008, (char) 0x2009, (char) 0x200A, (char) 0x200B, (char) 0x3000, (char) 0xFEFF };
292 public String Trim(params char[] chars) {
293 if (null == chars || chars.Length == 0)
296 return InternalTrim(chars, 0);
299 public String TrimStart(params char[] chars) {
300 if (null == chars || chars.Length == 0)
303 return InternalTrim(chars, 1);
306 public String TrimEnd(params char[] chars) {
307 if (null == chars || chars.Length == 0)
310 return InternalTrim(chars, 2);
313 public static int Compare(String s1, String s2) {
314 return Compare(s1, s2, false);
317 public static int Compare(String s1, String s2, bool inCase) {
323 } else if (null == s2)
326 return InternalCompare(s1, 0, s2, 0, Math.Max(s1.Length, s2.Length), inCase);
330 public static int Compare(String s1, String s2, bool inCase, CultureInfo culture) {
331 return Compare(s1, s2, inCase);
334 public static int Compare(String s1, int i1, String s2, int i2, int length) {
335 return Compare(s1, i1, s2, i2, length, false);
338 public static int Compare(String s1, int i1, String s2, int i2, int length, bool inCase) {
344 } else if (null == s2)
347 if (length < 0 || i1 < 0 || i2 < 0)
348 throw new ArgumentOutOfRangeException ();
350 if (i1 > s1.Length || i2 > s2.Length)
351 throw new ArgumentOutOfRangeException ();
356 return InternalCompare(s1, i1, s2, i2, length, inCase);
360 public static int Compare(String s1, int i1, String s2, int i2, int length, bool inCase, CultureInfo culture) {
361 return Compare(s1, i1, s2, i2, length, inCase);
364 public int CompareTo(Object value) {
368 if (!(value is String))
369 throw new ArgumentException();
371 return String.Compare(this, (String) value);
374 public int CompareTo(String str) {
378 return Compare(this, str);
381 public static int CompareOrdinal(String s1, String s2) {
382 if (null == s1 || null == s2) {
383 if ((Object)s1 == (Object) s2) {
387 return (s1 == null) ? -1 : 1;
390 return InternalCompare(s1, 0, s2, 0, Math.Max(s1.Length, s2.Length), false);
393 public static int CompareOrdinal(String s1, int i1, String s2, int i2, int length) {
394 if (null == s1 || null == s2) {
395 if ((Object)s1 == (Object) s2) {
399 return (s1 == null) ? -1 : 1;
402 if (i1 < 0 || i2 < 0 || length < 0)
403 throw new ArgumentOutOfRangeException ();
405 if (i1 > s1.Length || i2 > s2.Length)
406 throw new ArgumentOutOfRangeException ();
408 return InternalCompare(s1, i1, s2, i2, length, false);
411 public bool EndsWith(String value) {
412 if (value.Length > this.length) {
416 return (0 == Compare(this, Length - value.Length, value, 0, value.Length));
419 public int IndexOfAny(char [] arr) {
421 throw new ArgumentNullException();
423 return InternalIndexOfAny(arr, 0, this.length);
426 public int IndexOfAny(char [] arr, int sindex) {
427 return InternalIndexOfAny(arr, sindex, this.length - sindex);
430 public int IndexOf(char value) {
431 return InternalIndexOf(value, 0, this.length);
434 public int IndexOf(String value) {
435 return IndexOf(value, 0, this.length);
438 public int IndexOf(char value, int sindex) {
439 if (sindex < 0 || sindex >= this.length) {
440 Console.WriteLine("value={0} sindex={0}\n", value, sindex);
441 throw new ArgumentOutOfRangeException();
444 return InternalIndexOf(value, sindex, this.length - sindex);
447 public int IndexOf(String value, int sindex) {
448 return IndexOf(value, sindex, value.Length - sindex);
451 public int IndexOf(char value, int sindex, int count) {
452 if (sindex < 0 || count < 0 || sindex + count > this.length)
453 throw new ArgumentOutOfRangeException ();
455 if (sindex == 0 && this.length == 0)
458 return InternalIndexOf(value, sindex, count);
461 public int IndexOf(String value, int sindex, int count) {
463 throw new ArgumentNullException();
465 if (sindex < 0 || count < 0 || sindex + count > this.length)
466 throw new ArgumentOutOfRangeException ();
468 if (sindex == 0 && this.length == 0)
471 return InternalIndexOf(value, sindex, count);
474 public int LastIndexOfAny(char [] arr) {
476 throw new ArgumentNullException();
478 return InternalLastIndexOfAny(arr, this.length - 1, this.length);
481 public int LastIndexOfAny(char [] arr, int sindex) {
483 throw new ArgumentNullException();
485 if (sindex < 0 || sindex > this.length)
486 throw new ArgumentOutOfRangeException();
488 if (sindex == 0 && this.length == 0)
491 return InternalLastIndexOfAny(arr, sindex, sindex + 1);
494 public int LastIndexOf(char value) {
495 return InternalLastIndexOf(value, this.length - 1, this.length);
498 public int LastIndexOf(String value) {
500 throw new ArgumentNullException();
502 return InternalLastIndexOf(value, this.length - 1, this.Length);
505 public int LastIndexOf(char value, int sindex){
506 return LastIndexOf(value, sindex, sindex + 1);
509 public int LastIndexOf(String value, int sindex) {
510 return LastIndexOf(value, sindex, sindex + 1);
513 public int LastIndexOf(char value, int sindex, int count) {
514 if (count < 0 || sindex < 0)
515 throw new ArgumentOutOfRangeException ();
517 if (count > this.length || sindex > this.Length)
518 throw new ArgumentOutOfRangeException ();
520 if (sindex == 0 && this.length == 0)
523 return InternalLastIndexOf(value, sindex, count);
526 public int LastIndexOf(String value, int sindex, int count) {
528 throw new ArgumentNullException();
530 if (sindex < 0 || sindex > this.length)
531 throw new ArgumentOutOfRangeException ();
533 if (count < 0 || count - sindex <= 0)
534 throw new ArgumentOutOfRangeException ();
536 if (sindex == 0 && this.length == 0)
539 return InternalLastIndexOf(value, sindex, count);
542 public String PadLeft(int width) {
543 return PadLeft(width, ' ');
546 public String PadLeft(int width, char chr) {
548 throw new ArgumentException();
550 if (width < this.length)
551 return String.Copy(this);
553 return InternalPad(width, chr, false);
556 public String PadRight(int width) {
557 return PadRight(width, ' ');
560 public String PadRight(int width, char chr) {
562 throw new ArgumentException();
564 if (width < this.length)
565 return String.Copy(this);
567 return InternalPad(width, chr, true);
570 public bool StartsWith(String value) {
571 if (this.length < value.Length)
574 return (0 == Compare(this, 0, value, 0 , value.Length));
578 public String Replace (char oldChar, char newChar) {
579 return InternalReplace(oldChar, newChar);
582 public String Replace(String oldValue, String newValue) {
583 if (null == oldValue)
584 throw new ArgumentNullException();
586 return InternalReplace(oldValue, newValue);
589 public String Remove(int sindex, int count) {
590 if (sindex < 0 || count < 0 || sindex + count > this.length)
591 throw new ArgumentOutOfRangeException ();
593 return InternalRemove(sindex, count);
596 public String ToLower() {
597 return InternalToLower();
600 public String ToLower(CultureInfo culture) {
601 throw new NotImplementedException();
604 public String ToUpper() {
605 return InternalToUpper();
608 public String ToUpper(CultureInfo culture) {
609 throw new NotImplementedException();
612 public override String ToString() {
616 public String ToString(IFormatProvider provider) {
620 public String Trim() {
624 public static String Format(String format, Object arg0) {
625 return Format(null, format, new Object[] {arg0});
628 public static String Format(String format, Object arg0, Object arg1) {
629 return Format(null, format, new Object[] {arg0, arg1});
632 public static String Format(String format, Object arg0, Object arg1, Object arg2) {
633 return Format(null, format, new Object[] {arg0, arg1, arg2});
636 public static string Format (string format, params object[] args) {
637 return Format (null, format, args);
640 public static string Format (IFormatProvider provider, string format, params object[] args) {
641 if (format == null || args == null)
642 throw new ArgumentNullException ();
644 StringBuilder result = new StringBuilder ();
648 while (ptr < format.Length) {
649 char c = format[ptr ++];
652 result.Append (format, start, ptr - start - 1);
654 // check for escaped open bracket
656 if (format[ptr] == '{') {
667 ParseFormatSpecifier (format, ref ptr, out n, out width, out left_align, out arg_format);
668 if (n >= args.Length)
669 throw new FormatException ("Index (zero based) must be greater than or equal to zero and less than the size of the argument list.");
673 object arg = args[n];
678 else if (arg is IFormattable)
679 str = ((IFormattable)arg).ToString (arg_format, provider);
681 str = arg.ToString ();
683 // pad formatted string and append to result
685 if (width > str.Length) {
686 string pad = new String (' ', width - str.Length);
702 else if (c == '}' && format[ptr] == '}') {
703 result.Append (format, start, ptr - start - 1);
708 if (start < format.Length)
709 result.Append (format.Substring (start));
711 return result.ToString ();
714 public static String Copy (String str) {
716 throw new ArgumentNullException ();
718 int length = str.Length;
720 String tmp = InternalAllocateStr(length);
721 InternalStrcpy(tmp, 0, str);
725 public static String Concat(Object obj) {
729 return obj.ToString();
732 public static String Concat(Object obj1, Object obj2) {
739 return Concat(obj1.ToString(), obj2.ToString());
742 public static String Concat(Object obj1, Object obj2, Object obj3) {
752 return Concat(obj1.ToString(), obj2.ToString(), obj3.ToString());
755 [CLSCompliant(false)]
756 public static String Concat(Object arg0, Object arg1, Object arg2, Object arg3, __arglist) {
757 throw new NotImplementedException();
760 public static String Concat(String s1, String s2) {
762 if (null == s2) { return String.Empty; }
766 if (null == s2) { return s1; }
768 String tmp = InternalAllocateStr(s1.Length + s2.Length);
770 InternalStrcpy(tmp, 0, s1);
771 InternalStrcpy(tmp, s1.Length, s2);
776 public static String Concat(String s1, String s2, String s3) {
777 if (null == s1 && null == s2 && null == s3) {
781 if (null == s1) { s1 = String.Empty; }
782 if (null == s2) { s2 = String.Empty; }
783 if (null == s3) { s3 = String.Empty; }
785 String tmp = InternalAllocateStr(s1.Length + s2.Length + s3.Length);
787 InternalStrcpy(tmp, 0, s1);
788 InternalStrcpy(tmp, s1.Length, s2);
789 InternalStrcpy(tmp, s1.Length + s2.Length, s3);
794 public static String Concat(String s1, String s2, String s3, String s4) {
795 if (null == s1 && null == s2 && null == s3 && null == s4) {
799 if (null == s1) { s1 = String.Empty; }
800 if (null == s2) { s2 = String.Empty; }
801 if (null == s3) { s3 = String.Empty; }
802 if (null == s4) { s4 = String.Empty; }
804 String tmp = InternalAllocateStr(s1.Length + s2.Length + s3.Length + s4.Length);
806 InternalStrcpy(tmp, 0, s1);
807 InternalStrcpy(tmp, s1.Length, s2);
808 InternalStrcpy(tmp, s1.Length + s2.Length, s3);
809 InternalStrcpy(tmp, s1.Length + s2.Length + s3.Length, s4);
814 public static String Concat(params Object[] args) {
816 int len, i, currentpos;
819 throw new ArgumentNullException ();
821 strings = new string [args.Length];
824 foreach (object arg in args) {
825 /* use Empty for each null argument */
827 strings[i] = String.Empty;
829 strings[i] = arg.ToString ();
830 len += strings[i].length;
839 String tmp = InternalAllocateStr(len);
840 for (i = 0; i < strings.Length; i++) {
841 InternalStrcpy(tmp, currentpos, strings[i]);
842 currentpos += strings[i].Length;
848 public static String Concat(params String[] values) {
849 int len, i, currentpos;
852 throw new ArgumentNullException ();
855 foreach (string value in values)
856 len += value != null ? value.Length : 0;
863 String tmp = InternalAllocateStr(len);
864 for (i = 0; i < values.Length; i++) {
865 if (values[i] == null)
868 InternalStrcpy(tmp, currentpos, values[i]);
869 currentpos += values[i].Length;
875 public String Insert(int sindex, String value) {
877 throw new ArgumentNullException();
879 if (sindex < 0 || sindex > this.length)
880 throw new ArgumentOutOfRangeException();
882 return InternalInsert(sindex, value);
886 public static string Intern (string str) {
888 throw new ArgumentNullException ();
890 return InternalIntern(str);
893 public static string IsInterned (string str) {
895 throw new ArgumentNullException();
897 return InternalIsInterned(str);
900 public static string Join (string separator, string [] value) {
901 return Join(separator, value, 0, value.Length);
904 public static string Join(string separator, string[] value, int sindex, int count) {
906 throw new ArgumentNullException ();
908 if (sindex + count > value.Length)
909 throw new ArgumentOutOfRangeException ();
911 if (sindex == value.Length)
914 return InternalJoin(separator, value, sindex, count);
917 bool IConvertible.ToBoolean (IFormatProvider provider) {
918 return Convert.ToBoolean (this);
921 byte IConvertible.ToByte (IFormatProvider provider) {
922 return Convert.ToByte (this);
925 char IConvertible.ToChar (IFormatProvider provider) {
926 return Convert.ToChar (this);
929 DateTime IConvertible.ToDateTime (IFormatProvider provider) {
930 return Convert.ToDateTime (this);
933 decimal IConvertible.ToDecimal (IFormatProvider provider) {
934 return Convert.ToDecimal (this);
937 double IConvertible.ToDouble (IFormatProvider provider) {
938 return Convert.ToDouble (this);
941 short IConvertible.ToInt16 (IFormatProvider provider) {
942 return Convert.ToInt16 (this);
945 int IConvertible.ToInt32 (IFormatProvider provider) {
946 return Convert.ToInt32 (this);
949 long IConvertible.ToInt64 (IFormatProvider provider) {
950 return Convert.ToInt64 (this);
953 [CLSCompliant(false)]
954 sbyte IConvertible.ToSByte (IFormatProvider provider) {
955 return Convert.ToSByte (this);
958 float IConvertible.ToSingle (IFormatProvider provider) {
959 return Convert.ToSingle (this);
961 string IConvertible.ToString (IFormatProvider format) {
965 object IConvertible.ToType (Type conversionType, IFormatProvider provider) {
966 return Convert.ToType (this, conversionType, provider);
969 [CLSCompliant(false)]
970 ushort IConvertible.ToUInt16 (IFormatProvider provider) {
971 return Convert.ToUInt16 (this);
974 [CLSCompliant(false)]
975 uint IConvertible.ToUInt32 (IFormatProvider provider) {
976 return Convert.ToUInt32 (this);
979 [CLSCompliant(false)]
980 ulong IConvertible.ToUInt64 (IFormatProvider provider) {
981 return Convert.ToUInt64 (this);
984 TypeCode IConvertible.GetTypeCode () {
985 return TypeCode.String;
994 public CharEnumerator GetEnumerator () {
995 return new CharEnumerator (this);
998 IEnumerator IEnumerable.GetEnumerator () {
999 return new CharEnumerator (this);
1002 private static void ParseFormatSpecifier (string str, ref int ptr, out int n, out int width, out bool left_align, out string format) {
1003 // parses format specifier of form:
1009 // N = argument number (non-negative integer)
1011 n = ParseDecimal (str, ref ptr);
1013 throw new FormatException ("Input string was not in correct format.");
1015 // M = width (non-negative integer)
1017 if (str[ptr] == ',') {
1018 left_align = (str[++ ptr] == '-');
1022 width = ParseDecimal (str, ref ptr);
1024 throw new FormatException ("Input string was not in correct format.");
1031 // F = argument format (string)
1033 if (str[ptr] == ':') {
1035 while (str[ptr] != '}')
1038 format = str.Substring (start, ptr - start);
1043 if (str[ptr ++] != '}')
1044 throw new FormatException ("Input string was not in correct format.");
1046 catch (IndexOutOfRangeException) {
1047 throw new FormatException ("Input string was not in correct format.");
1051 private static int ParseDecimal (string str, ref int ptr) {
1056 if (c < '0' || '9' < c)
1059 n = n * 10 + c - '0';
1070 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1071 private extern static string InternalJoin(string separator, string[] value, int sindex, int count);
1073 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1074 private extern String InternalInsert(int sindex, String value);
1076 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1077 private extern String InternalReplace(char oldChar, char newChar);
1079 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1080 private extern String InternalReplace(String oldValue, String newValue);
1082 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1083 private extern String InternalRemove(int sindex, int count);
1085 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1086 private extern void InternalCopyTo(int sindex, char[] dest, int dindex, int count);
1088 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1089 private extern String[] InternalSplit(char[] separator, int count);
1091 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1092 private extern String InternalTrim(char[] chars, int typ);
1094 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1095 private extern int InternalIndexOf(char value, int sindex, int count);
1097 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1098 private extern int InternalIndexOf(string value, int sindex, int count);
1100 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1101 private extern int InternalIndexOfAny(char [] arr, int sindex, int count);
1103 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1104 private extern int InternalLastIndexOf(char value, int sindex, int count);
1106 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1107 private extern int InternalLastIndexOf(String value, int sindex, int count);
1109 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1110 private extern int InternalLastIndexOfAny(char [] anyOf, int sindex, int count);
1112 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1113 private extern String InternalPad(int width, char chr, bool right);
1115 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1116 private extern String InternalToLower();
1118 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1119 private extern String InternalToUpper();
1121 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1122 private extern static String InternalAllocateStr(int length);
1124 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1125 private extern static void InternalStrcpy(String dest, int destPos, String src);
1127 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1128 private extern static void InternalStrcpy(String dest, int destPos, String src, int startPos, int count);
1130 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1131 private extern static string InternalIntern(string str);
1133 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1134 private extern static string InternalIsInterned(string str);
1136 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1137 private extern static int InternalCompare(String s1, int i1, String s2, int i2, int length, bool inCase);