-static MonoString*
-empty_string (MonoDomain *domain)
-{
- MonoVTable *vtable = mono_class_vtable (domain, mono_defaults.string_class);
- MonoObject *o;
- static MonoClassField *empty_field = NULL;
-
- if (!empty_field) {
- MonoClassField *field;
- gpointer iter;
-
- iter = NULL;
- while ((field = mono_class_get_fields (mono_defaults.string_class, &iter))) {
- if (!strcmp (field->name, "Empty"))
- break;
- }
-
- g_assert (field);
- empty_field = field;
- }
-
- mono_field_static_get_value (vtable, empty_field, &o);
- g_assert (o);
- return (MonoString*)o;
-}
-
-MonoString *
-ves_icall_System_String_ctor_charp (gpointer dummy, gunichar2 *value)
-{
- gint32 i, length;
- MonoDomain *domain;
-
- MONO_ARCH_SAVE_REGS;
-
- domain = mono_domain_get ();
-
- if (value == NULL)
- length = 0;
- else {
- for (i = 0; *(value + i) != '\0'; i++);
- length = i;
- }
-
- return mono_string_new_utf16 (domain, value, length);
-}
-
-MonoString *
-ves_icall_System_String_ctor_char_int (gpointer dummy, gunichar2 value, gint32 count)
-{
- MonoDomain *domain;
- MonoString *res;
- gunichar2 *chars;
- gint32 i;
-
- MONO_ARCH_SAVE_REGS;
-
- if (count < 0)
- mono_raise_exception (mono_get_exception_argument_out_of_range ("count"));
-
- domain = mono_domain_get ();
- res = mono_string_new_size (domain, count);
-
- chars = mono_string_chars (res);
- for (i = 0; i < count; i++)
- chars [i] = value;
-
- return res;
-}
-
-MonoString *
-ves_icall_System_String_ctor_charp_int_int (gpointer dummy, gunichar2 *value, gint32 sindex, gint32 length)
-{
- gunichar2 *begin;
- MonoDomain * domain;
-
- MONO_ARCH_SAVE_REGS;
-
- domain = mono_domain_get ();
-
- if ((value == NULL) && (length != 0))
- mono_raise_exception (mono_get_exception_argument_out_of_range ("Out of range"));
-
- if ((sindex < 0) || (length < 0))
- mono_raise_exception (mono_get_exception_argument_out_of_range ("Out of range"));
-
- if (length == 0)
- return empty_string (domain);
-
- begin = (gunichar2 *) (value + sindex);
-
- return mono_string_new_utf16 (domain, begin, length);
-}
-
-MonoString *
-ves_icall_System_String_ctor_sbytep (gpointer dummy, gint8 *value)
-{
- MonoDomain *domain;
-
- MONO_ARCH_SAVE_REGS;
-
- domain = mono_domain_get ();
-
- if (NULL == value)
- return empty_string (domain);
-
- return mono_string_new (domain, (const char *) value);
-}
-
-MonoString *
-ves_icall_System_String_ctor_sbytep_int_int (gpointer dummy, gint8 *value, gint32 sindex, gint32 length)
-{
- guchar *begin;
- MonoDomain *domain;
- MonoString *res;
- gunichar2 *chars;
- int i;
-
- MONO_ARCH_SAVE_REGS;
-
- domain = mono_domain_get ();
-
- if ((value == NULL) && (length != 0))
- mono_raise_exception (mono_get_exception_argument_out_of_range ("Out of range"));
-
- if ((sindex < 0) || (length < 0))
- mono_raise_exception (mono_get_exception_argument_out_of_range ("Out of range"));
-
- begin = (guchar *) (value + sindex);
- res = mono_string_new_size (domain, length);
- chars = mono_string_chars (res);
- for (i = 0; i < length; ++i)
- chars [i] = begin [i];
-
- return res;
-}
-
-MonoString *
-ves_icall_System_String_ctor_chara (gpointer dummy, MonoArray *value)
-{
- MonoDomain *domain;
-
- MONO_ARCH_SAVE_REGS;
-
- domain = mono_domain_get ();
-
- if (value == NULL)
- return mono_string_new_utf16 (domain, NULL, 0);
- else
- return mono_string_new_utf16 (domain, (gunichar2 *) mono_array_addr(value, gunichar2, 0), value->max_length);
-}
-
-MonoString *
-ves_icall_System_String_ctor_chara_int_int (gpointer dummy, MonoArray *value,
- gint32 sindex, gint32 length)
-{
- MonoDomain *domain;
-
- MONO_ARCH_SAVE_REGS;
-
- if (value == NULL)
- mono_raise_exception (mono_get_exception_argument_null ("value"));
- if (sindex < 0)
- mono_raise_exception (mono_get_exception_argument_out_of_range ("startIndex"));
- if (length < 0)
- mono_raise_exception (mono_get_exception_argument_out_of_range ("length"));
- if (sindex + length > mono_array_length (value))
- mono_raise_exception (mono_get_exception_argument_out_of_range ("Out of range"));
-
- domain = mono_domain_get ();
-
- return mono_string_new_utf16 (domain, (gunichar2 *) mono_array_addr(value, gunichar2, sindex), length);
-}
-
-MonoString *
-ves_icall_System_String_ctor_encoding (gpointer dummy, gint8 *value, gint32 sindex,
- gint32 length, MonoObject *enc)
-{
- MonoArray *arr;
- MonoString *s;
- MonoObject *exc;
- MonoDomain *domain = mono_domain_get ();
- MonoMethod *get_string;
- gpointer args [1];
- MonoClass *klass;
-
- MONO_ARCH_SAVE_REGS;
-
- if ((value == NULL) || (length == 0))
- return mono_string_new_size (mono_domain_get (), 0);
- if (enc == NULL)
- mono_raise_exception (mono_get_exception_argument_null ("enc"));
- if (sindex < 0)
- mono_raise_exception (mono_get_exception_argument_out_of_range ("startIndex"));
- if (length < 0)
- mono_raise_exception (mono_get_exception_argument_out_of_range ("length"));
-
- arr = mono_array_new (domain, mono_defaults.byte_class, length);
- memcpy (mono_array_addr (arr, guint8*, 0), value + sindex, length);
-
- /* Find the System.Text.Encoding class */
- for (klass = enc->vtable->klass; klass->parent->parent != NULL; klass = klass->parent)
- ;
-
- get_string = mono_class_get_method_from_name (klass, "GetString", 1);
- args [0] = arr;
- s = (MonoString*)mono_runtime_invoke (get_string, enc, args, &exc);
- if (!s || exc)
- mono_raise_exception (mono_get_exception_argument ("", "Unable to decode the array into a valid string."));
-
- return s;
-}
-
-MonoString *
-ves_icall_System_String_InternalJoin (MonoString *separator, MonoArray * value, gint32 sindex, gint32 count)
-{
- MonoString * ret;
- MonoString *current;
- gint32 length;
- gint32 pos;
- gint32 insertlen;
- gint32 destpos;
- gint32 srclen;
- gunichar2 *insert;
- gunichar2 *dest;
- gunichar2 *src;
-
- MONO_ARCH_SAVE_REGS;
-
- insert = mono_string_chars(separator);
- insertlen = mono_string_length(separator);
-
- length = 0;
- for (pos = sindex; pos != sindex + count; pos++) {
- current = mono_array_get (value, MonoString *, pos);
- if (current != NULL)
- length += mono_string_length (current);
-
- if (pos < sindex + count - 1)
- length += insertlen;
- }
-
- ret = mono_string_new_size( mono_domain_get (), length);
- dest = mono_string_chars(ret);
- destpos = 0;
-
- for (pos = sindex; pos != sindex + count; pos++) {
- current = mono_array_get (value, MonoString *, pos);
- if (current != NULL) {
- src = mono_string_chars (current);
- srclen = mono_string_length (current);
-
- memcpy (dest + destpos, src, srclen * sizeof(gunichar2));
- destpos += srclen;
- }
-
- if (pos < sindex + count - 1) {
- memcpy(dest + destpos, insert, insertlen * sizeof(gunichar2));
- destpos += insertlen;
- }
- }
-
- return ret;
-}
-
-MonoString *
-ves_icall_System_String_InternalInsert (MonoString *me, gint32 sindex, MonoString *value)
-{
- MonoString * ret;
- gunichar2 *src;
- gunichar2 *insertsrc;
- gunichar2 *dest;
- gint32 srclen;
- gint32 insertlen;
-
- MONO_ARCH_SAVE_REGS;
-
- src = mono_string_chars(me);
- srclen = mono_string_length(me);
-
- insertsrc = mono_string_chars(value);
- insertlen = mono_string_length(value);
-
- ret = mono_string_new_size( mono_domain_get (), srclen + insertlen);
- dest = mono_string_chars(ret);
-
- memcpy(dest, src, sindex * sizeof(gunichar2));
- memcpy(dest + sindex, insertsrc, insertlen * sizeof(gunichar2));
- memcpy(dest + sindex + insertlen, src + sindex, (srclen - sindex) * sizeof(gunichar2));
-
- return ret;
-}
-
-MonoString *
-ves_icall_System_String_InternalReplace_Char (MonoString *me, gunichar2 oldChar, gunichar2 newChar)
-{
- MonoString *ret;
- gunichar2 *src;
- gunichar2 *dest;
- gint32 i, srclen;
-
- MONO_ARCH_SAVE_REGS;
-
- src = mono_string_chars(me);
- srclen = mono_string_length(me);
-
- ret = mono_string_new_size( mono_domain_get (), srclen);
- dest = mono_string_chars(ret);
-
- for (i = 0; i != srclen; i++) {
- if (src[i] == oldChar)
- dest[i] = newChar;
- else
- dest[i] = src[i];
- }
-
- return ret;
-}
-
-MonoString *
-ves_icall_System_String_InternalRemove (MonoString *me, gint32 sindex, gint32 count)
-{
- MonoString * ret;
- gint32 srclen;
- gunichar2 *dest;
- gunichar2 *src;
-
- MONO_ARCH_SAVE_REGS;
-
- srclen = mono_string_length(me);
- ret = mono_string_new_size( mono_domain_get (), srclen - count);
-
- src = mono_string_chars(me);
- dest = mono_string_chars(ret);
-
- memcpy(dest, src, sindex * sizeof(gunichar2));
- memcpy(dest + sindex, src + sindex + count, (srclen - count - sindex) * sizeof(gunichar2));
-
- return ret;
-}
-