#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)
{
srclen = mono_string_length(me);
if (oldstrlen != newstrlen) {
- for (i = 0; i != srclen - oldstrlen + 1; i++)
+ for (i = 0; i <= srclen - oldstrlen; i++)
if (0 == memcmp(src + i, oldstr, oldstrlen * sizeof(gunichar2)))
occurr++;
return retarr;
}
-gboolean
+static gboolean
string_icall_is_in_array (MonoArray *chars, gint32 arraylength, gunichar2 chr)
{
gunichar2 cmpchar;
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;
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;
1 = StringCompareModeCaseInsensitive
2 = StringCompareModeOrdinal
*/
-gint32
+static gint32
string_icall_cmp_char (gunichar2 c1, gunichar2 c2, gint16 mode)
{
gint32 result;