* list :
[mono.git] / mono / metadata / string-icalls.c
index 1d931e8120b6268f4774c1de9d54d590ebdae506..4b8f9f9a420935159260cfae571496299df1b3be 100644 (file)
 #include <mono/metadata/unicode.h>
 #include <mono/metadata/exception.h>
 
+/* Internal helper methods */
+
+static gboolean
+string_icall_is_in_array (MonoArray *chars, gint32 arraylength, gunichar2 chr);
+
+static gint32
+string_icall_cmp_char (gunichar2 c1, gunichar2 c2, gint16 mode);
+
 MonoString *
 ves_icall_System_String_ctor_charp (gpointer dummy, gunichar2 *value)
 {
@@ -288,7 +296,7 @@ ves_icall_System_String_InternalReplace_Str (MonoString *me, MonoString *oldValu
        srclen = mono_string_length(me);
 
        if (oldstrlen != newstrlen) {
-               for (i = 0; i < srclen - oldstrlen; i++)
+               for (i = 0; i <= srclen - oldstrlen; i++)
                        if (0 == memcmp(src + i, oldstr, oldstrlen * sizeof(gunichar2)))
                                occurr++;
 
@@ -419,7 +427,7 @@ ves_icall_System_String_InternalSplit (MonoString *me, MonoArray *separator, gin
        return retarr;
 }
 
-gboolean
+static gboolean
 string_icall_is_in_array (MonoArray *chars, gint32 arraylength, gunichar2 chr)
 {
        gunichar2 cmpchar;
@@ -496,7 +504,7 @@ gint32
 ves_icall_System_String_InternalIndexOf_Str (MonoString *me, MonoString *value, gint32 sindex, gint32 count)
 {
        gint32 lencmpstr;
-       gint32 pos;
+       gint32 pos, i;
        gunichar2 *src;
        gunichar2 *cmpstr;
 
@@ -505,12 +513,12 @@ ves_icall_System_String_InternalIndexOf_Str (MonoString *me, MonoString *value,
        src = mono_string_chars(me);
        cmpstr = mono_string_chars(value);
 
-       for (pos = sindex; pos != count + sindex; pos++) {
-               if (pos + lencmpstr > count + sindex)
-                       return -1;
-
-               if (0 == memcmp(src + pos, cmpstr, lencmpstr * sizeof(gunichar2)))
-                       return pos;
+       count -= lencmpstr;
+       for (pos = sindex; pos <= sindex + count; pos++) {
+               for (i = 0; src [pos + i] == cmpstr [i];) {
+                       if (++i == lencmpstr)
+                               return pos;
+               }
        }
 
        return -1;
@@ -780,7 +788,7 @@ ves_icall_System_String_get_Chars (MonoString *me, gint32 idx)
                        1 = StringCompareModeCaseInsensitive
                        2 = StringCompareModeOrdinal
 */
-gint32 
+static gint32 
 string_icall_cmp_char (gunichar2 c1, gunichar2 c2, gint16 mode)
 {
        gint32 result;