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;
20 public sealed class String : IConvertible, IComparable, ICloneable, IEnumerable {
24 private const int COMPARE_CASE = 0;
25 private const int COMPARE_INCASE = 1;
26 private const int COMPARE_ORDINAL = 2;
28 public static readonly String Empty = "";
30 public static bool Equals(String str1, String str2) {
31 if ((str1 as object) == (str2 as object))
34 if (null == str1 || null == str2)
37 int len = str1.length;
39 if (len != str2.length)
42 for (int i = 0; i < len; i++)
43 if (str1 [i] != str2 [i])
49 public static bool operator == (String str1, String str2) {
50 return Equals(str1, str2);
53 public static bool operator != (String str1, String str2) {
54 return !Equals(str1, str2);
57 public override bool Equals(Object obj) {
58 return Equals (this, obj as String);
61 public bool Equals(String value) {
62 return Equals (this, value);
65 [IndexerName("Chars")]
66 public extern char this[int index] {
67 [MethodImplAttribute(MethodImplOptions.InternalCall)]
71 public Object Clone() {
75 public TypeCode GetTypeCode () {
76 return TypeCode.String;
79 public void CopyTo(int sindex, char[] dest, int dindex, int count) {
80 // LAMESPEC: should I null-terminate?
83 throw new ArgumentNullException();
85 if (sindex < 0 || dindex < 0 || count < 0)
86 throw new ArgumentOutOfRangeException ();
88 if (sindex + count > Length)
89 throw new ArgumentOutOfRangeException ();
91 if (dindex + count > dest.Length)
92 throw new ArgumentOutOfRangeException ();
94 InternalCopyTo(sindex, dest, dindex, count);
97 public char[] ToCharArray() {
98 return ToCharArray(0, length);
101 public char[] ToCharArray(int sindex, int length) {
102 if (sindex < 0 || length < 0 || sindex + length > this.length)
103 throw new ArgumentOutOfRangeException ();
105 char [] tmp = new char[length];
107 InternalCopyTo(sindex, tmp, 0, length);
112 public String [] Split(params char [] separator) {
113 return Split(separator, Int32.MaxValue);
116 public String[] Split(char[] separator, int count) {
117 if (null == separator || separator.Length == 0) {
118 separator = WhiteChars;
122 throw new ArgumentOutOfRangeException ();
125 return new String[0];
128 return new String[1] { ToString() };
130 return InternalSplit(separator, count);
133 public String Substring (int sindex) {
134 if (sindex < 0 || sindex > this.length) {
135 throw new ArgumentOutOfRangeException();
138 string tmp = InternalAllocateStr(this.length - sindex);
139 InternalStrcpy(tmp, 0, this, sindex, length - sindex);
144 public String Substring (int sindex, int length) {
145 if (length < 0 || sindex < 0 || sindex + length > this.length) {
146 throw new ArgumentOutOfRangeException();
152 string tmp = InternalAllocateStr(length);
153 InternalStrcpy(tmp, 0, this, sindex, length);
158 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,
159 (char) 0x2006, (char) 0x2007, (char) 0x2008, (char) 0x2009, (char) 0x200A, (char) 0x200B, (char) 0x3000, (char) 0xFEFF };
161 public String Trim(params char[] chars) {
162 if (null == chars || chars.Length == 0)
165 return InternalTrim(chars, 0);
168 public String TrimStart(params char[] chars) {
169 if (null == chars || chars.Length == 0)
172 return InternalTrim(chars, 1);
175 public String TrimEnd(params char[] chars) {
176 if (null == chars || chars.Length == 0)
179 return InternalTrim(chars, 2);
182 public static int Compare(String s1, String s2) {
183 return Compare(s1, s2, false);
186 public static int Compare(String s1, String s2, bool inCase) {
192 } else if (null == s2)
195 return InternalCompare(s1, 0, s2, 0, Math.Max(s1.length, s2.length), (inCase == true) ? COMPARE_INCASE : COMPARE_CASE);
199 public static int Compare(String s1, String s2, bool inCase, CultureInfo culture) {
200 return Compare(s1, s2, inCase);
203 public static int Compare(String s1, int i1, String s2, int i2, int length) {
204 return Compare(s1, i1, s2, i2, length, false);
207 public static int Compare(String s1, int i1, String s2, int i2, int length, bool inCase) {
213 } else if (null == s2)
216 if (length < 0 || i1 < 0 || i2 < 0)
217 throw new ArgumentOutOfRangeException ();
219 if (i1 > s1.length || i2 > s2.length)
220 throw new ArgumentOutOfRangeException ();
225 return InternalCompare(s1, i1, s2, i2, length, (inCase == true) ? COMPARE_INCASE : COMPARE_CASE);
229 public static int Compare(String s1, int i1, String s2, int i2, int length, bool inCase, CultureInfo culture) {
230 return Compare(s1, i1, s2, i2, length, inCase);
233 public int CompareTo(Object value) {
237 if (!(value is String))
238 throw new ArgumentException();
240 return String.Compare(this, (String) value, false);
243 public int CompareTo(String str) {
247 return Compare(this, str, false);
250 public static int CompareOrdinal(String s1, String s2) {
251 if (null == s1 || null == s2) {
252 if ((Object)s1 == (Object) s2) {
256 return (s1 == null) ? -1 : 1;
259 return InternalCompare(s1, 0, s2, 0, Math.Max(s1.length, s2.length), COMPARE_ORDINAL);
262 public static int CompareOrdinal(String s1, int i1, String s2, int i2, int length) {
263 if (null == s1 || null == s2) {
264 if ((Object)s1 == (Object) s2) {
268 return (s1 == null) ? -1 : 1;
271 if (i1 < 0 || i2 < 0 || length < 0)
272 throw new ArgumentOutOfRangeException ();
274 if (i1 > s1.length || i2 > s2.length)
275 throw new ArgumentOutOfRangeException ();
277 return InternalCompare(s1, i1, s2, i2, length, COMPARE_ORDINAL);
280 public bool EndsWith(String value) {
282 throw new ArgumentNullException();
284 if (value.length > this.length) {
288 return (0 == Compare(this, length - value.length, value, 0, value.length));
291 public int IndexOfAny(char [] arr) {
293 throw new ArgumentNullException();
295 return InternalIndexOfAny(arr, 0, this.length);
298 public int IndexOfAny(char [] arr, int sindex) {
300 throw new ArgumentNullException();
301 if (sindex < 0 || sindex >= this.length)
302 throw new ArgumentOutOfRangeException();
304 return InternalIndexOfAny(arr, sindex, this.length - sindex);
307 public int IndexOfAny(char [] arr, int sindex, int count) {
309 throw new ArgumentNullException();
310 if (sindex < 0 || count < 0 || sindex + count > this.length)
311 throw new ArgumentOutOfRangeException ();
313 return InternalIndexOfAny(arr, sindex, count);
316 public int IndexOf(char value) {
317 return InternalIndexOf(value, 0, this.length);
320 public int IndexOf(String value) {
321 return IndexOf(value, 0, this.length);
324 public int IndexOf(char value, int sindex) {
325 if (sindex < 0 || sindex > this.length) {
326 throw new ArgumentOutOfRangeException();
329 if (sindex == this.length)
332 return InternalIndexOf(value, sindex, this.length - sindex);
335 public int IndexOf(String value, int sindex) {
336 if (sindex == this.length)
339 return IndexOf(value, sindex, this.length - sindex);
342 public int IndexOf(char value, int sindex, int count) {
343 if (sindex < 0 || count < 0 || sindex + count > this.length)
344 throw new ArgumentOutOfRangeException ();
346 if (sindex == 0 && this.length == 0)
349 return InternalIndexOf(value, sindex, count);
352 public int IndexOf(String value, int sindex, int count) {
354 throw new ArgumentNullException();
356 if (sindex < 0 || count < 0 || sindex + count > this.length)
357 throw new ArgumentOutOfRangeException ();
359 if (value.length == 0)
362 if (sindex == 0 && this.length == 0)
365 return InternalIndexOf(value, sindex, count);
368 public int LastIndexOfAny(char [] arr) {
370 throw new ArgumentNullException();
372 return InternalLastIndexOfAny(arr, this.length - 1, this.length);
375 public int LastIndexOfAny(char [] arr, int sindex) {
377 throw new ArgumentNullException();
379 if (sindex < 0 || sindex > this.length)
380 throw new ArgumentOutOfRangeException();
382 if (this.length == 0)
385 return InternalLastIndexOfAny(arr, sindex, sindex + 1);
388 public int LastIndexOfAny(char [] arr, int sindex, int count) {
390 throw new ArgumentNullException();
392 if (sindex < 0 || count < 0 || sindex > this.length || sindex - count < -1)
393 throw new ArgumentOutOfRangeException();
395 if (this.length == 0)
398 return InternalLastIndexOfAny(arr, sindex, count);
401 public int LastIndexOf(char value) {
402 return InternalLastIndexOf(value, this.length - 1, this.length);
405 public int LastIndexOf(String value) {
407 throw new ArgumentNullException();
409 if (value.length == 0)
412 if (this.length == 0)
415 return InternalLastIndexOf(value, this.length - 1, this.length);
418 public int LastIndexOf(char value, int sindex){
419 return LastIndexOf(value, sindex, sindex + 1);
422 public int LastIndexOf(String value, int sindex) {
423 return LastIndexOf(value, sindex, sindex + 1);
426 public int LastIndexOf(char value, int sindex, int count) {
427 if (sindex < 0 || count < 0)
428 throw new ArgumentOutOfRangeException ();
430 if (sindex >= this.length || sindex - count + 1 < 0)
431 throw new ArgumentOutOfRangeException ();
433 if (sindex == 0 && this.length == 0)
436 return InternalLastIndexOf(value, sindex, count);
439 public int LastIndexOf(String value, int sindex, int count) {
441 throw new ArgumentNullException();
443 // This check is needed to match undocumented MS behaviour
444 if (this.length == 0 && value.length > 0)
447 if (sindex < 0 || sindex > this.length)
448 throw new ArgumentOutOfRangeException ();
450 if (count < 0 || sindex - count + 1 < 0)
451 throw new ArgumentOutOfRangeException ();
453 if (value.length > sindex)
456 if (value == String.Empty)
459 if (sindex == 0 && this.length == 0)
462 return InternalLastIndexOf(value, sindex, count);
465 public String PadLeft(int width) {
466 return PadLeft(width, ' ');
469 public String PadLeft(int width, char chr) {
471 throw new ArgumentException();
473 if (width < this.length)
474 return String.Copy(this);
476 return InternalPad(width, chr, false);
479 public String PadRight(int width) {
480 return PadRight(width, ' ');
483 public String PadRight(int width, char chr) {
485 throw new ArgumentException();
487 if (width < this.length)
488 return String.Copy(this);
490 return InternalPad(width, chr, true);
493 public bool StartsWith(String value) {
495 throw new ArgumentNullException();
497 if (this.length < value.length)
500 return (0 == Compare(this, 0, value, 0 , value.length));
504 public String Replace (char oldChar, char newChar) {
505 return InternalReplace(oldChar, newChar);
508 public String Replace(String oldValue, String newValue) {
509 if (null == oldValue)
510 throw new ArgumentNullException();
512 return InternalReplace(oldValue, newValue);
515 public String Remove(int sindex, int count) {
516 if (sindex < 0 || count < 0 || sindex + count > this.length)
517 throw new ArgumentOutOfRangeException ();
519 return InternalRemove(sindex, count);
522 public String ToLower() {
523 return InternalToLower();
526 [MonoTODO("By now, don't use culture info")]
527 public String ToLower(CultureInfo culture) {
528 return InternalToLower();
531 public String ToUpper() {
532 return InternalToUpper();
535 [MonoTODO("By now, don't use culture info")]
536 public String ToUpper(CultureInfo culture) {
537 return InternalToUpper();
540 public override String ToString() {
544 public String ToString(IFormatProvider provider) {
548 public String Trim() {
552 public static String Format(String format, Object arg0) {
553 return Format(null, format, new Object[] {arg0});
556 public static String Format(String format, Object arg0, Object arg1) {
557 return Format(null, format, new Object[] {arg0, arg1});
560 public static String Format(String format, Object arg0, Object arg1, Object arg2) {
561 return Format(null, format, new Object[] {arg0, arg1, arg2});
564 public static string Format (string format, params object[] args) {
565 return Format (null, format, args);
568 public static string Format (IFormatProvider provider, string format, params object[] args) {
569 StringBuilder b = new StringBuilder ();
570 FormatHelper (b, provider, format, args);
571 return b.ToString ();
574 internal static void FormatHelper (StringBuilder result, IFormatProvider provider, string format, params object[] args) {
575 if (format == null || args == null)
576 throw new ArgumentNullException ();
580 while (ptr < format.length) {
581 char c = format[ptr ++];
584 result.Append (format, start, ptr - start - 1);
586 // check for escaped open bracket
588 if (format[ptr] == '{') {
599 ParseFormatSpecifier (format, ref ptr, out n, out width, out left_align, out arg_format);
600 if (n >= args.Length)
601 throw new FormatException ("Index (zero based) must be greater than or equal to zero and less than the size of the argument list.");
605 object arg = args[n];
610 else if (arg is IFormattable)
611 str = ((IFormattable)arg).ToString (arg_format, provider);
613 str = arg.ToString ();
615 // pad formatted string and append to result
617 if (width > str.length) {
618 string pad = new String (' ', width - str.length);
634 else if (c == '}' && ptr < format.length && format[ptr] == '}') {
635 result.Append (format, start, ptr - start - 1);
639 throw new FormatException ("Input string was not in a correct format.");
643 if (start < format.length)
644 result.Append (format.Substring (start));
647 public static String Copy (String str) {
649 throw new ArgumentNullException ();
651 int length = str.length;
653 String tmp = InternalAllocateStr(length);
654 InternalStrcpy(tmp, 0, str);
658 public static String Concat(Object obj) {
662 return obj.ToString();
665 public static String Concat(Object obj1, Object obj2)
673 return obj2.ToString ();
674 } else if (obj2 == null)
675 return obj1.ToString ();
677 s1 = obj1.ToString ();
678 s2 = obj2.ToString ();
679 String tmp = InternalAllocateStr (s1.Length + s2.Length);
680 InternalStrcpy (tmp, 0, s1);
681 InternalStrcpy (tmp, s1.length, s2);
686 public static String Concat(Object obj1, Object obj2, Object obj3)
692 s1 = obj1.ToString ();
697 s2 = obj2.ToString ();
702 s3 = obj3.ToString ();
704 return Concat (s1, s2, s3);
707 public static String Concat (Object obj1, Object obj2, Object obj3, Object obj4)
709 string s1, s2, s3, s4;
714 s1 = obj1.ToString ();
719 s2 = obj2.ToString ();
724 s3 = obj3.ToString ();
729 s4 = obj4.ToString ();
731 return Concat (s1, s2, s3, s4);
735 public static String Concat(String s1, String s2)
746 String tmp = InternalAllocateStr(s1.length + s2.length);
748 InternalStrcpy(tmp, 0, s1);
749 InternalStrcpy(tmp, s1.length, s2);
754 public static String Concat(String s1, String s2, String s3)
778 String tmp = InternalAllocateStr(s1.length + s2.length + s3.length);
780 InternalStrcpy(tmp, 0, s1);
781 InternalStrcpy(tmp, s1.length, s2);
782 InternalStrcpy(tmp, s1.length + s2.length, s3);
787 public static String Concat(String s1, String s2, String s3, String s4) {
788 if (null == s1 && null == s2 && null == s3 && null == s4) {
792 if (null == s1) { s1 = String.Empty; }
793 if (null == s2) { s2 = String.Empty; }
794 if (null == s3) { s3 = String.Empty; }
795 if (null == s4) { s4 = String.Empty; }
797 String tmp = InternalAllocateStr(s1.length + s2.length + s3.length + s4.length);
799 InternalStrcpy(tmp, 0, s1);
800 InternalStrcpy(tmp, s1.length, s2);
801 InternalStrcpy(tmp, s1.length + s2.length, s3);
802 InternalStrcpy(tmp, s1.length + s2.length + s3.length, s4);
807 public static String Concat(params Object[] args) {
809 int len, i, currentpos;
812 throw new ArgumentNullException ();
814 strings = new string [args.Length];
817 foreach (object arg in args) {
818 /* use Empty for each null argument */
820 strings[i] = String.Empty;
822 strings[i] = arg.ToString ();
823 len += strings[i].length;
832 String tmp = InternalAllocateStr(len);
833 for (i = 0; i < strings.Length; i++) {
834 InternalStrcpy(tmp, currentpos, strings[i]);
835 currentpos += strings[i].length;
841 public static String Concat(params String[] values) {
842 int len, i, currentpos;
845 throw new ArgumentNullException ();
848 foreach (string value in values)
849 len += value != null ? value.length : 0;
856 String tmp = InternalAllocateStr(len);
857 for (i = 0; i < values.Length; i++) {
858 if (values[i] == null)
861 InternalStrcpy(tmp, currentpos, values[i]);
862 currentpos += values[i].length;
868 public String Insert(int sindex, String value) {
870 throw new ArgumentNullException();
872 if (sindex < 0 || sindex > this.length)
873 throw new ArgumentOutOfRangeException();
875 return InternalInsert(sindex, value);
879 public static string Intern (string str) {
881 throw new ArgumentNullException ();
883 return InternalIntern(str);
886 public static string IsInterned (string str) {
888 throw new ArgumentNullException();
890 return InternalIsInterned(str);
893 public static string Join (string separator, string [] value) {
895 throw new ArgumentNullException ();
897 return Join(separator, value, 0, value.Length);
900 public static string Join(string separator, string[] value, int sindex, int count) {
902 throw new ArgumentNullException ();
904 if (sindex + count > value.Length)
905 throw new ArgumentOutOfRangeException ();
907 if (sindex == value.Length)
910 return InternalJoin(separator, value, sindex, count);
913 bool IConvertible.ToBoolean (IFormatProvider provider) {
914 return Convert.ToBoolean (this);
917 byte IConvertible.ToByte (IFormatProvider provider) {
918 return Convert.ToByte (this);
921 char IConvertible.ToChar (IFormatProvider provider) {
922 return Convert.ToChar (this);
925 DateTime IConvertible.ToDateTime (IFormatProvider provider) {
926 return Convert.ToDateTime (this);
929 decimal IConvertible.ToDecimal (IFormatProvider provider) {
930 return Convert.ToDecimal (this);
933 double IConvertible.ToDouble (IFormatProvider provider) {
934 return Convert.ToDouble (this);
937 short IConvertible.ToInt16 (IFormatProvider provider) {
938 return Convert.ToInt16 (this);
941 int IConvertible.ToInt32 (IFormatProvider provider) {
942 return Convert.ToInt32 (this);
945 long IConvertible.ToInt64 (IFormatProvider provider) {
946 return Convert.ToInt64 (this);
949 [CLSCompliant(false)]
950 sbyte IConvertible.ToSByte (IFormatProvider provider) {
951 return Convert.ToSByte (this);
954 float IConvertible.ToSingle (IFormatProvider provider) {
955 return Convert.ToSingle (this);
957 string IConvertible.ToString (IFormatProvider format) {
961 object IConvertible.ToType (Type conversionType, IFormatProvider provider) {
962 return Convert.ToType (this, conversionType, provider);
965 [CLSCompliant(false)]
966 ushort IConvertible.ToUInt16 (IFormatProvider provider) {
967 return Convert.ToUInt16 (this);
970 [CLSCompliant(false)]
971 uint IConvertible.ToUInt32 (IFormatProvider provider) {
972 return Convert.ToUInt32 (this);
975 [CLSCompliant(false)]
976 ulong IConvertible.ToUInt64 (IFormatProvider provider) {
977 return Convert.ToUInt64 (this);
980 TypeCode IConvertible.GetTypeCode () {
981 return TypeCode.String;
990 public CharEnumerator GetEnumerator () {
991 return new CharEnumerator (this);
994 IEnumerator IEnumerable.GetEnumerator () {
995 return new CharEnumerator (this);
998 private static void ParseFormatSpecifier (string str, ref int ptr, out int n, out int width, out bool left_align, out string format) {
999 // parses format specifier of form:
1005 // N = argument number (non-negative integer)
1007 n = ParseDecimal (str, ref ptr);
1009 throw new FormatException ("Input string was not in a correct format.");
1011 // M = width (non-negative integer)
1013 if (str[ptr] == ',') {
1014 // White space between ',' and number or sign.
1016 while (Char.IsWhiteSpace (str [ptr]))
1019 format = str.Substring (start, ptr - start);
1021 left_align = (str [ptr] == '-');
1025 width = ParseDecimal (str, ref ptr);
1027 throw new FormatException ("Input string was not in a correct format.");
1035 // F = argument format (string)
1037 if (str[ptr] == ':') {
1039 while (str[ptr] != '}')
1042 format += str.Substring (start, ptr - start);
1047 if (str[ptr ++] != '}')
1048 throw new FormatException ("Input string was not in a correct format.");
1050 catch (IndexOutOfRangeException) {
1051 throw new FormatException ("Input string was not in a correct format.");
1055 private static int ParseDecimal (string str, ref int ptr) {
1060 if (c < '0' || '9' < c)
1063 n = n * 10 + c - '0';
1074 [CLSCompliant(false), MethodImplAttribute(MethodImplOptions.InternalCall)]
1075 unsafe public extern String(char *value);
1077 [CLSCompliant(false), MethodImplAttribute(MethodImplOptions.InternalCall)]
1078 unsafe public extern String(char *value, int sindex, int length);
1080 [CLSCompliant(false), MethodImplAttribute(MethodImplOptions.InternalCall)]
1081 unsafe public extern String(sbyte *value);
1083 [CLSCompliant(false), MethodImplAttribute(MethodImplOptions.InternalCall)]
1084 unsafe public extern String(sbyte *value, int sindex, int length);
1086 [CLSCompliant(false), MethodImplAttribute(MethodImplOptions.InternalCall)]
1087 unsafe public extern String(sbyte *value, int sindex, int length, Encoding enc);
1089 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1090 public extern String(char [] val, int sindex, int length);
1092 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1093 public extern String(char [] val);
1095 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1096 public extern String(char c, int count);
1098 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1099 public extern override int GetHashCode();
1101 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1102 private extern static string InternalJoin(string separator, string[] value, int sindex, int count);
1104 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1105 private extern String InternalInsert(int sindex, String value);
1107 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1108 private extern String InternalReplace(char oldChar, char newChar);
1110 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1111 private extern String InternalReplace(String oldValue, String newValue);
1113 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1114 private extern String InternalRemove(int sindex, int count);
1116 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1117 private extern void InternalCopyTo(int sindex, char[] dest, int dindex, int count);
1119 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1120 private extern String[] InternalSplit(char[] separator, int count);
1122 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1123 private extern String InternalTrim(char[] chars, int typ);
1125 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1126 private extern int InternalIndexOf(char value, int sindex, int count);
1128 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1129 private extern int InternalIndexOf(string value, int sindex, int count);
1131 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1132 private extern int InternalIndexOfAny(char [] arr, int sindex, int count);
1134 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1135 private extern int InternalLastIndexOf(char value, int sindex, int count);
1137 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1138 private extern int InternalLastIndexOf(String value, int sindex, int count);
1140 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1141 private extern int InternalLastIndexOfAny(char [] anyOf, int sindex, int count);
1143 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1144 private extern String InternalPad(int width, char chr, bool right);
1146 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1147 private extern String InternalToLower();
1149 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1150 private extern String InternalToUpper();
1152 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1153 private extern static String InternalAllocateStr(int length);
1155 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1156 private extern static void InternalStrcpy(String dest, int destPos, String src);
1158 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1159 private extern static void InternalStrcpy(String dest, int destPos, String src, int startPos, int count);
1161 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1162 private extern static string InternalIntern(string str);
1164 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1165 private extern static string InternalIsInterned(string str);
1167 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1168 private extern static int InternalCompare(String s1, int i1, String s2, int i2, int length, int mode);
1170 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1171 private extern static bool InternalEquals(String s1, String s2);