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)
172 if (str1.length != str2.length)
175 return Compare(str1, 0, str2, 0, str1.length, false) == 0;
178 public static bool operator == (String str1, String str2) {
179 return Equals(str1, str2);
182 public static bool operator != (String str1, String str2) {
183 return !Equals(str1, str2);
186 public override bool Equals(Object obj) {
190 if (!(obj is String))
193 return Compare (this, (String)obj, false) == 0;
196 public bool Equals(String value) {
200 if (length != value.length)
202 return Compare (this, 0, value, 0, length, false) == 0;
205 [IndexerName("Chars")]
206 public extern char this[int index] {
207 [MethodImplAttribute(MethodImplOptions.InternalCall)]
211 public Object Clone() {
215 public TypeCode GetTypeCode () {
216 return TypeCode.String;
219 public void CopyTo(int sindex, char[] dest, int dindex, int count) {
220 // LAMESPEC: should I null-terminate?
223 throw new ArgumentNullException();
225 if (sindex < 0 || dindex < 0 || count < 0)
226 throw new ArgumentOutOfRangeException ();
228 if (sindex + count > Length)
229 throw new ArgumentOutOfRangeException ();
231 if (dindex + count > dest.Length)
232 throw new ArgumentOutOfRangeException ();
234 InternalCopyTo(sindex, dest, dindex, count);
237 public char[] ToCharArray() {
238 return ToCharArray(0, length);
241 public char[] ToCharArray(int sindex, int length) {
242 if (sindex < 0 || length < 0 || sindex + length > this.length)
243 throw new ArgumentOutOfRangeException ();
245 char [] tmp = new char[length];
247 InternalCopyTo(sindex, tmp, 0, length);
252 public String [] Split(params char [] separator) {
253 return Split(separator, Int32.MaxValue);
256 public String[] Split(char[] separator, int count) {
257 if (null == separator) {
258 separator = WhiteChars;
262 throw new ArgumentOutOfRangeException ();
265 return new String[1] { ToString() };
267 return InternalSplit(separator, count);
270 public String Substring (int sindex) {
271 if (sindex < 0 || sindex > this.length) {
272 Console.WriteLine("Substring({0}) = {2}\n", sindex, this.length, this);
273 throw new ArgumentOutOfRangeException();
276 string tmp = InternalAllocateStr(this.length - sindex);
277 InternalStrcpy(tmp, 0, this, sindex, length - sindex);
282 public String Substring (int sindex, int length) {
283 if (length < 0 || sindex < 0 || sindex + length > this.length) {
284 Console.WriteLine("Substring({0}, {1}) = {2}\n", sindex, length, this.ToString());
285 throw new ArgumentOutOfRangeException();
291 string tmp = InternalAllocateStr(length);
292 InternalStrcpy(tmp, 0, this, sindex, length);
297 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,
298 (char) 0x2006, (char) 0x2007, (char) 0x2008, (char) 0x2009, (char) 0x200A, (char) 0x200B, (char) 0x3000, (char) 0xFEFF };
300 public String Trim(params char[] chars) {
301 if (null == chars || chars.Length == 0)
304 return InternalTrim(chars, 0);
307 public String TrimStart(params char[] chars) {
308 if (null == chars || chars.Length == 0)
311 return InternalTrim(chars, 1);
314 public String TrimEnd(params char[] chars) {
315 if (null == chars || chars.Length == 0)
318 return InternalTrim(chars, 2);
321 public static int Compare(String s1, String s2) {
322 return Compare(s1, s2, false);
325 public static int Compare(String s1, String s2, bool inCase) {
331 } else if (null == s2)
334 return InternalCompare(s1, 0, s2, 0, Math.Max(s1.length, s2.length), inCase);
338 public static int Compare(String s1, String s2, bool inCase, CultureInfo culture) {
339 return Compare(s1, s2, inCase);
342 public static int Compare(String s1, int i1, String s2, int i2, int length) {
343 return Compare(s1, i1, s2, i2, length, false);
346 public static int Compare(String s1, int i1, String s2, int i2, int length, bool inCase) {
352 } else if (null == s2)
355 if (length < 0 || i1 < 0 || i2 < 0)
356 throw new ArgumentOutOfRangeException ();
358 if (i1 > s1.length || i2 > s2.length)
359 throw new ArgumentOutOfRangeException ();
364 return InternalCompare(s1, i1, s2, i2, length, inCase);
368 public static int Compare(String s1, int i1, String s2, int i2, int length, bool inCase, CultureInfo culture) {
369 return Compare(s1, i1, s2, i2, length, inCase);
372 public int CompareTo(Object value) {
376 if (!(value is String))
377 throw new ArgumentException();
379 return String.Compare(this, (String) value, false);
382 public int CompareTo(String str) {
386 return Compare(this, str, false);
389 public static int CompareOrdinal(String s1, String s2) {
390 if (null == s1 || null == s2) {
391 if ((Object)s1 == (Object) s2) {
395 return (s1 == null) ? -1 : 1;
398 return InternalCompare(s1, 0, s2, 0, Math.Max(s1.length, s2.length), false);
401 public static int CompareOrdinal(String s1, int i1, String s2, int i2, int length) {
402 if (null == s1 || null == s2) {
403 if ((Object)s1 == (Object) s2) {
407 return (s1 == null) ? -1 : 1;
410 if (i1 < 0 || i2 < 0 || length < 0)
411 throw new ArgumentOutOfRangeException ();
413 if (i1 > s1.length || i2 > s2.length)
414 throw new ArgumentOutOfRangeException ();
416 return InternalCompare(s1, i1, s2, i2, length, false);
419 public bool EndsWith(String value) {
420 if (value.length > this.length) {
424 return (0 == Compare(this, length - value.length, value, 0, value.length));
427 public int IndexOfAny(char [] arr) {
429 throw new ArgumentNullException();
431 return InternalIndexOfAny(arr, 0, this.length);
434 public int IndexOfAny(char [] arr, int sindex) {
435 return InternalIndexOfAny(arr, sindex, this.length - sindex);
438 public int IndexOfAny(char [] arr, int sindex, int count) {
439 return InternalIndexOfAny(arr, sindex, count);
442 public int IndexOf(char value) {
443 return InternalIndexOf(value, 0, this.length);
446 public int IndexOf(String value) {
447 return IndexOf(value, 0, this.length);
450 public int IndexOf(char value, int sindex) {
451 if (sindex < 0 || sindex >= this.length) {
452 Console.WriteLine("value={0} sindex={0}\n", value, sindex);
453 throw new ArgumentOutOfRangeException();
456 return InternalIndexOf(value, sindex, this.length - sindex);
459 public int IndexOf(String value, int sindex) {
460 return IndexOf(value, sindex, value.length - sindex);
463 public int IndexOf(char value, int sindex, int count) {
464 if (sindex < 0 || count < 0 || sindex + count > this.length)
465 throw new ArgumentOutOfRangeException ();
467 if (sindex == 0 && this.length == 0)
470 return InternalIndexOf(value, sindex, count);
473 public int IndexOf(String value, int sindex, int count) {
475 throw new ArgumentNullException();
477 if (sindex < 0 || count < 0 || sindex + count > this.length)
478 throw new ArgumentOutOfRangeException ();
480 if (sindex == 0 && this.length == 0)
483 return InternalIndexOf(value, sindex, count);
486 public int LastIndexOfAny(char [] arr) {
488 throw new ArgumentNullException();
490 return InternalLastIndexOfAny(arr, this.length - 1, this.length);
493 public int LastIndexOfAny(char [] arr, int sindex) {
495 throw new ArgumentNullException();
497 if (sindex < 0 || sindex > this.length)
498 throw new ArgumentOutOfRangeException();
500 if (this.length == 0)
503 return InternalLastIndexOfAny(arr, sindex, sindex + 1);
506 public int LastIndexOfAny(char [] arr, int sindex, int count) {
508 throw new ArgumentNullException();
510 if (sindex < 0 || count < 0 || sindex > this.length || sindex - count < -1)
511 throw new ArgumentOutOfRangeException();
513 if (this.length == 0)
516 return InternalLastIndexOfAny(arr, sindex, count);
519 public int LastIndexOf(char value) {
520 return InternalLastIndexOf(value, this.length - 1, this.length);
523 public int LastIndexOf(String value) {
525 throw new ArgumentNullException();
527 return InternalLastIndexOf(value, this.length - 1, this.length);
530 public int LastIndexOf(char value, int sindex){
531 return LastIndexOf(value, sindex, sindex + 1);
534 public int LastIndexOf(String value, int sindex) {
535 return LastIndexOf(value, sindex, sindex + 1);
538 public int LastIndexOf(char value, int sindex, int count) {
539 if (count < 0 || sindex < 0)
540 throw new ArgumentOutOfRangeException ();
542 if (count > this.length || sindex > this.length)
543 throw new ArgumentOutOfRangeException ();
545 if (sindex == 0 && this.length == 0)
548 return InternalLastIndexOf(value, sindex, count);
551 public int LastIndexOf(String value, int sindex, int count) {
553 throw new ArgumentNullException();
555 if (sindex < 0 || sindex > this.length)
556 throw new ArgumentOutOfRangeException ();
558 if (count < 0 || count - sindex <= 0)
559 throw new ArgumentOutOfRangeException ();
561 if (sindex == 0 && this.length == 0)
564 return InternalLastIndexOf(value, sindex, count);
567 public String PadLeft(int width) {
568 return PadLeft(width, ' ');
571 public String PadLeft(int width, char chr) {
573 throw new ArgumentException();
575 if (width < this.length)
576 return String.Copy(this);
578 return InternalPad(width, chr, false);
581 public String PadRight(int width) {
582 return PadRight(width, ' ');
585 public String PadRight(int width, char chr) {
587 throw new ArgumentException();
589 if (width < this.length)
590 return String.Copy(this);
592 return InternalPad(width, chr, true);
595 public bool StartsWith(String value) {
596 if (this.length < value.length)
599 return (0 == Compare(this, 0, value, 0 , value.length));
603 public String Replace (char oldChar, char newChar) {
604 return InternalReplace(oldChar, newChar);
607 public String Replace(String oldValue, String newValue) {
608 if (null == oldValue)
609 throw new ArgumentNullException();
611 return InternalReplace(oldValue, newValue);
614 public String Remove(int sindex, int count) {
615 if (sindex < 0 || count < 0 || sindex + count > this.length)
616 throw new ArgumentOutOfRangeException ();
618 return InternalRemove(sindex, count);
621 public String ToLower() {
622 return InternalToLower();
625 public String ToLower(CultureInfo culture) {
626 throw new NotImplementedException();
629 public String ToUpper() {
630 return InternalToUpper();
633 public String ToUpper(CultureInfo culture) {
634 throw new NotImplementedException();
637 public override String ToString() {
641 public String ToString(IFormatProvider provider) {
645 public String Trim() {
649 public static String Format(String format, Object arg0) {
650 return Format(null, format, new Object[] {arg0});
653 public static String Format(String format, Object arg0, Object arg1) {
654 return Format(null, format, new Object[] {arg0, arg1});
657 public static String Format(String format, Object arg0, Object arg1, Object arg2) {
658 return Format(null, format, new Object[] {arg0, arg1, arg2});
661 public static string Format (string format, params object[] args) {
662 return Format (null, format, args);
665 public static string Format (IFormatProvider provider, string format, params object[] args) {
666 if (format == null || args == null)
667 throw new ArgumentNullException ();
669 StringBuilder result = new StringBuilder ();
673 while (ptr < format.length) {
674 char c = format[ptr ++];
677 result.Append (format, start, ptr - start - 1);
679 // check for escaped open bracket
681 if (format[ptr] == '{') {
692 ParseFormatSpecifier (format, ref ptr, out n, out width, out left_align, out arg_format);
693 if (n >= args.Length)
694 throw new FormatException ("Index (zero based) must be greater than or equal to zero and less than the size of the argument list.");
698 object arg = args[n];
703 else if (arg is IFormattable)
704 str = ((IFormattable)arg).ToString (arg_format, provider);
706 str = arg.ToString ();
708 // pad formatted string and append to result
710 if (width > str.length) {
711 string pad = new String (' ', width - str.length);
727 else if (c == '}' && format[ptr] == '}') {
728 result.Append (format, start, ptr - start - 1);
733 if (start < format.length)
734 result.Append (format.Substring (start));
736 return result.ToString ();
739 public static String Copy (String str) {
741 throw new ArgumentNullException ();
743 int length = str.length;
745 String tmp = InternalAllocateStr(length);
746 InternalStrcpy(tmp, 0, str);
750 public static String Concat(Object obj) {
754 return obj.ToString();
757 public static String Concat(Object obj1, Object obj2) {
764 return Concat(obj1.ToString(), obj2.ToString());
767 public static String Concat(Object obj1, Object obj2, Object obj3) {
777 return Concat(obj1.ToString(), obj2.ToString(), obj3.ToString());
780 [CLSCompliant(false)]
781 public static String Concat(Object arg0, Object arg1, Object arg2, Object arg3, __arglist) {
782 throw new NotImplementedException();
785 public static String Concat(String s1, String s2) {
787 if (null == s2) { return String.Empty; }
791 if (null == s2) { return s1; }
793 String tmp = InternalAllocateStr(s1.length + s2.length);
795 InternalStrcpy(tmp, 0, s1);
796 InternalStrcpy(tmp, s1.length, s2);
801 public static String Concat(String s1, String s2, String s3) {
802 if (null == s1 && null == s2 && null == s3) {
806 if (null == s1) { s1 = String.Empty; }
807 if (null == s2) { s2 = String.Empty; }
808 if (null == s3) { s3 = String.Empty; }
810 String tmp = InternalAllocateStr(s1.length + s2.length + s3.length);
812 InternalStrcpy(tmp, 0, s1);
813 InternalStrcpy(tmp, s1.length, s2);
814 InternalStrcpy(tmp, s1.length + s2.length, s3);
819 public static String Concat(String s1, String s2, String s3, String s4) {
820 if (null == s1 && null == s2 && null == s3 && null == s4) {
824 if (null == s1) { s1 = String.Empty; }
825 if (null == s2) { s2 = String.Empty; }
826 if (null == s3) { s3 = String.Empty; }
827 if (null == s4) { s4 = String.Empty; }
829 String tmp = InternalAllocateStr(s1.length + s2.length + s3.length + s4.length);
831 InternalStrcpy(tmp, 0, s1);
832 InternalStrcpy(tmp, s1.length, s2);
833 InternalStrcpy(tmp, s1.length + s2.length, s3);
834 InternalStrcpy(tmp, s1.length + s2.length + s3.length, s4);
839 public static String Concat(params Object[] args) {
841 int len, i, currentpos;
844 throw new ArgumentNullException ();
846 strings = new string [args.Length];
849 foreach (object arg in args) {
850 /* use Empty for each null argument */
852 strings[i] = String.Empty;
854 strings[i] = arg.ToString ();
855 len += strings[i].length;
864 String tmp = InternalAllocateStr(len);
865 for (i = 0; i < strings.Length; i++) {
866 InternalStrcpy(tmp, currentpos, strings[i]);
867 currentpos += strings[i].length;
873 public static String Concat(params String[] values) {
874 int len, i, currentpos;
877 throw new ArgumentNullException ();
880 foreach (string value in values)
881 len += value != null ? value.length : 0;
888 String tmp = InternalAllocateStr(len);
889 for (i = 0; i < values.Length; i++) {
890 if (values[i] == null)
893 InternalStrcpy(tmp, currentpos, values[i]);
894 currentpos += values[i].length;
900 public String Insert(int sindex, String value) {
902 throw new ArgumentNullException();
904 if (sindex < 0 || sindex > this.length)
905 throw new ArgumentOutOfRangeException();
907 return InternalInsert(sindex, value);
911 public static string Intern (string str) {
913 throw new ArgumentNullException ();
915 return InternalIntern(str);
918 public static string IsInterned (string str) {
920 throw new ArgumentNullException();
922 return InternalIsInterned(str);
925 public static string Join (string separator, string [] value) {
926 return Join(separator, value, 0, value.Length);
929 public static string Join(string separator, string[] value, int sindex, int count) {
931 throw new ArgumentNullException ();
933 if (sindex + count > value.Length)
934 throw new ArgumentOutOfRangeException ();
936 if (sindex == value.Length)
939 return InternalJoin(separator, value, sindex, count);
942 bool IConvertible.ToBoolean (IFormatProvider provider) {
943 return Convert.ToBoolean (this);
946 byte IConvertible.ToByte (IFormatProvider provider) {
947 return Convert.ToByte (this);
950 char IConvertible.ToChar (IFormatProvider provider) {
951 return Convert.ToChar (this);
954 DateTime IConvertible.ToDateTime (IFormatProvider provider) {
955 return Convert.ToDateTime (this);
958 decimal IConvertible.ToDecimal (IFormatProvider provider) {
959 return Convert.ToDecimal (this);
962 double IConvertible.ToDouble (IFormatProvider provider) {
963 return Convert.ToDouble (this);
966 short IConvertible.ToInt16 (IFormatProvider provider) {
967 return Convert.ToInt16 (this);
970 int IConvertible.ToInt32 (IFormatProvider provider) {
971 return Convert.ToInt32 (this);
974 long IConvertible.ToInt64 (IFormatProvider provider) {
975 return Convert.ToInt64 (this);
978 [CLSCompliant(false)]
979 sbyte IConvertible.ToSByte (IFormatProvider provider) {
980 return Convert.ToSByte (this);
983 float IConvertible.ToSingle (IFormatProvider provider) {
984 return Convert.ToSingle (this);
986 string IConvertible.ToString (IFormatProvider format) {
990 object IConvertible.ToType (Type conversionType, IFormatProvider provider) {
991 return Convert.ToType (this, conversionType, provider);
994 [CLSCompliant(false)]
995 ushort IConvertible.ToUInt16 (IFormatProvider provider) {
996 return Convert.ToUInt16 (this);
999 [CLSCompliant(false)]
1000 uint IConvertible.ToUInt32 (IFormatProvider provider) {
1001 return Convert.ToUInt32 (this);
1004 [CLSCompliant(false)]
1005 ulong IConvertible.ToUInt64 (IFormatProvider provider) {
1006 return Convert.ToUInt64 (this);
1009 TypeCode IConvertible.GetTypeCode () {
1010 return TypeCode.String;
1019 public CharEnumerator GetEnumerator () {
1020 return new CharEnumerator (this);
1023 IEnumerator IEnumerable.GetEnumerator () {
1024 return new CharEnumerator (this);
1027 private static void ParseFormatSpecifier (string str, ref int ptr, out int n, out int width, out bool left_align, out string format) {
1028 // parses format specifier of form:
1034 // N = argument number (non-negative integer)
1036 n = ParseDecimal (str, ref ptr);
1038 throw new FormatException ("Input string was not in correct format.");
1040 // M = width (non-negative integer)
1042 if (str[ptr] == ',') {
1043 left_align = (str[++ ptr] == '-');
1047 width = ParseDecimal (str, ref ptr);
1049 throw new FormatException ("Input string was not in correct format.");
1056 // F = argument format (string)
1058 if (str[ptr] == ':') {
1060 while (str[ptr] != '}')
1063 format = str.Substring (start, ptr - start);
1068 if (str[ptr ++] != '}')
1069 throw new FormatException ("Input string was not in correct format.");
1071 catch (IndexOutOfRangeException) {
1072 throw new FormatException ("Input string was not in correct format.");
1076 private static int ParseDecimal (string str, ref int ptr) {
1081 if (c < '0' || '9' < c)
1084 n = n * 10 + c - '0';
1095 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1096 private extern static string InternalJoin(string separator, string[] value, int sindex, int count);
1098 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1099 private extern String InternalInsert(int sindex, String value);
1101 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1102 private extern String InternalReplace(char oldChar, char newChar);
1104 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1105 private extern String InternalReplace(String oldValue, String newValue);
1107 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1108 private extern String InternalRemove(int sindex, int count);
1110 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1111 private extern void InternalCopyTo(int sindex, char[] dest, int dindex, int count);
1113 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1114 private extern String[] InternalSplit(char[] separator, int count);
1116 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1117 private extern String InternalTrim(char[] chars, int typ);
1119 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1120 private extern int InternalIndexOf(char value, int sindex, int count);
1122 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1123 private extern int InternalIndexOf(string value, int sindex, int count);
1125 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1126 private extern int InternalIndexOfAny(char [] arr, int sindex, int count);
1128 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1129 private extern int InternalLastIndexOf(char value, int sindex, int count);
1131 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1132 private extern int InternalLastIndexOf(String value, int sindex, int count);
1134 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1135 private extern int InternalLastIndexOfAny(char [] anyOf, int sindex, int count);
1137 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1138 private extern String InternalPad(int width, char chr, bool right);
1140 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1141 private extern String InternalToLower();
1143 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1144 private extern String InternalToUpper();
1146 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1147 private extern static String InternalAllocateStr(int length);
1149 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1150 private extern static void InternalStrcpy(String dest, int destPos, String src);
1152 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1153 private extern static void InternalStrcpy(String dest, int destPos, String src, int startPos, int count);
1155 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1156 private extern static string InternalIntern(string str);
1158 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1159 private extern static string InternalIsInterned(string str);
1161 [MethodImplAttribute(MethodImplOptions.InternalCall)]
1162 private extern static int InternalCompare(String s1, int i1, String s2, int i2, int length, bool inCase);