* Dick Porter (dick@ximian.com)
* Mohammad DAMT (mdamt@cdl2000.com)
*
- * (C) 2003 Ximian, Inc.
+ * Copyright 2003 Ximian, Inc (http://www.ximian.com)
+ * Copyright 2004-2009 Novell, Inc (http://www.novell.com)
* (C) 2003 PT Cakram Datalingga Duaribu http://www.cdl2000.com
*/
#include <mono/metadata/culture-info.h>
#include <mono/metadata/culture-info-tables.h>
+#ifndef DISABLE_NORMALIZATION
+#include <mono/metadata/normalization-tables.h>
+#endif
#include <locale.h>
+#if defined(__APPLE__)
+#include <CoreFoundation/CoreFoundation.h>
+#endif
#undef DEBUG
len++;
}
- ret = mono_array_new (mono_domain_get (),
+ ret = mono_array_new_cached (mono_domain_get (),
mono_get_int32_class (), len);
for(i = 0; i < len; i++)
len++;
}
- ret = mono_array_new (mono_domain_get (), mono_get_string_class (), len);
+ ret = mono_array_new_cached (mono_domain_get (), mono_get_string_class (), len);
for(i = 0; i < len; i++)
- mono_array_set (ret, MonoString *, i, mono_string_new (domain, idx2string (names [i])));
+ mono_array_setref (ret, i, mono_string_new (domain, idx2string (names [i])));
return ret;
}
domain = mono_domain_get ();
- datetime->AbbreviatedDayNames = create_names_array_idx (dfe->abbreviated_day_names,
- NUM_DAYS);
- datetime->AbbreviatedMonthNames = create_names_array_idx (dfe->abbreviated_month_names,
- NUM_MONTHS);
- datetime->AMDesignator = mono_string_new (domain, idx2string (dfe->am_designator));
+ datetime->readOnly = this->is_read_only;
+ MONO_OBJECT_SETREF (datetime, AbbreviatedDayNames, create_names_array_idx (dfe->abbreviated_day_names,
+ NUM_DAYS));
+ MONO_OBJECT_SETREF (datetime, AbbreviatedMonthNames, create_names_array_idx (dfe->abbreviated_month_names,
+ NUM_MONTHS));
+ MONO_OBJECT_SETREF (datetime, AMDesignator, mono_string_new (domain, idx2string (dfe->am_designator)));
datetime->CalendarWeekRule = dfe->calendar_week_rule;
- datetime->DateSeparator = mono_string_new (domain, idx2string (dfe->date_separator));
- datetime->DayNames = create_names_array_idx (dfe->day_names, NUM_DAYS);
+ MONO_OBJECT_SETREF (datetime, DateSeparator, mono_string_new (domain, idx2string (dfe->date_separator)));
+ MONO_OBJECT_SETREF (datetime, DayNames, create_names_array_idx (dfe->day_names, NUM_DAYS));
datetime->FirstDayOfWeek = dfe->first_day_of_week;
- datetime->FullDateTimePattern = mono_string_new (domain, idx2string (dfe->full_date_time_pattern));
- datetime->LongDatePattern = mono_string_new (domain, idx2string (dfe->long_date_pattern));
- datetime->LongTimePattern = mono_string_new (domain, idx2string (dfe->long_time_pattern));
- datetime->MonthDayPattern = mono_string_new (domain, idx2string (dfe->month_day_pattern));
- datetime->MonthNames = create_names_array_idx (dfe->month_names, NUM_MONTHS);
- datetime->PMDesignator = mono_string_new (domain, idx2string (dfe->pm_designator));
- datetime->ShortDatePattern = mono_string_new (domain, idx2string (dfe->short_date_pattern));
- datetime->ShortTimePattern = mono_string_new (domain, idx2string (dfe->short_time_pattern));
- datetime->TimeSeparator = mono_string_new (domain, idx2string (dfe->time_separator));
- datetime->YearMonthPattern = mono_string_new (domain, idx2string (dfe->year_month_pattern));
- datetime->ShortDatePatterns = create_names_array_idx (dfe->short_date_patterns,
- NUM_SHORT_DATE_PATTERNS);
- datetime->LongDatePatterns = create_names_array_idx (dfe->long_date_patterns,
- NUM_LONG_DATE_PATTERNS);
- datetime->ShortTimePatterns = create_names_array_idx (dfe->short_time_patterns,
- NUM_SHORT_TIME_PATTERNS);
- datetime->LongTimePatterns = create_names_array_idx (dfe->long_time_patterns,
- NUM_LONG_TIME_PATTERNS);
+ MONO_OBJECT_SETREF (datetime, FullDateTimePattern, mono_string_new (domain, idx2string (dfe->full_date_time_pattern)));
+ MONO_OBJECT_SETREF (datetime, LongDatePattern, mono_string_new (domain, idx2string (dfe->long_date_pattern)));
+ MONO_OBJECT_SETREF (datetime, LongTimePattern, mono_string_new (domain, idx2string (dfe->long_time_pattern)));
+ MONO_OBJECT_SETREF (datetime, MonthDayPattern, mono_string_new (domain, idx2string (dfe->month_day_pattern)));
+ MONO_OBJECT_SETREF (datetime, MonthNames, create_names_array_idx (dfe->month_names, NUM_MONTHS));
+ MONO_OBJECT_SETREF (datetime, PMDesignator, mono_string_new (domain, idx2string (dfe->pm_designator)));
+ MONO_OBJECT_SETREF (datetime, ShortDatePattern, mono_string_new (domain, idx2string (dfe->short_date_pattern)));
+ MONO_OBJECT_SETREF (datetime, ShortTimePattern, mono_string_new (domain, idx2string (dfe->short_time_pattern)));
+ MONO_OBJECT_SETREF (datetime, TimeSeparator, mono_string_new (domain, idx2string (dfe->time_separator)));
+ MONO_OBJECT_SETREF (datetime, YearMonthPattern, mono_string_new (domain, idx2string (dfe->year_month_pattern)));
+ MONO_OBJECT_SETREF (datetime, ShortDatePatterns, create_names_array_idx (dfe->short_date_patterns,
+ NUM_SHORT_DATE_PATTERNS));
+ MONO_OBJECT_SETREF (datetime, LongDatePatterns, create_names_array_idx (dfe->long_date_patterns,
+ NUM_LONG_DATE_PATTERNS));
+ MONO_OBJECT_SETREF (datetime, ShortTimePatterns, create_names_array_idx (dfe->short_time_patterns,
+ NUM_SHORT_TIME_PATTERNS));
+ MONO_OBJECT_SETREF (datetime, LongTimePatterns, create_names_array_idx (dfe->long_time_patterns,
+ NUM_LONG_TIME_PATTERNS));
}
MONO_ARCH_SAVE_REGS;
g_assert (this->number_format != 0);
+ if (this->number_index < 0)
+ return;
number = this->number_format;
nfe = &number_format_entries [this->number_index];
domain = mono_domain_get ();
+ number->readOnly = this->is_read_only;
number->currencyDecimalDigits = nfe->currency_decimal_digits;
- number->currencyDecimalSeparator = mono_string_new (domain,
- idx2string (nfe->currency_decimal_separator));
- number->currencyGroupSeparator = mono_string_new (domain,
- idx2string (nfe->currency_group_separator));
- number->currencyGroupSizes = create_group_sizes_array (nfe->currency_group_sizes,
- GROUP_SIZE);
+ MONO_OBJECT_SETREF (number, currencyDecimalSeparator, mono_string_new (domain,
+ idx2string (nfe->currency_decimal_separator)));
+ MONO_OBJECT_SETREF (number, currencyGroupSeparator, mono_string_new (domain,
+ idx2string (nfe->currency_group_separator)));
+ MONO_OBJECT_SETREF (number, currencyGroupSizes, create_group_sizes_array (nfe->currency_group_sizes,
+ GROUP_SIZE));
number->currencyNegativePattern = nfe->currency_negative_pattern;
number->currencyPositivePattern = nfe->currency_positive_pattern;
- number->currencySymbol = mono_string_new (domain, idx2string (nfe->currency_symbol));
- number->naNSymbol = mono_string_new (domain, idx2string (nfe->nan_symbol));
- number->negativeInfinitySymbol = mono_string_new (domain,
- idx2string (nfe->negative_infinity_symbol));
- number->negativeSign = mono_string_new (domain, idx2string (nfe->negative_sign));
+ MONO_OBJECT_SETREF (number, currencySymbol, mono_string_new (domain, idx2string (nfe->currency_symbol)));
+ MONO_OBJECT_SETREF (number, naNSymbol, mono_string_new (domain, idx2string (nfe->nan_symbol)));
+ MONO_OBJECT_SETREF (number, negativeInfinitySymbol, mono_string_new (domain,
+ idx2string (nfe->negative_infinity_symbol)));
+ MONO_OBJECT_SETREF (number, negativeSign, mono_string_new (domain, idx2string (nfe->negative_sign)));
number->numberDecimalDigits = nfe->number_decimal_digits;
- number->numberDecimalSeparator = mono_string_new (domain,
- idx2string (nfe->number_decimal_separator));
- number->numberGroupSeparator = mono_string_new (domain, idx2string (nfe->number_group_separator));
- number->numberGroupSizes = create_group_sizes_array (nfe->number_group_sizes,
- GROUP_SIZE);
+ MONO_OBJECT_SETREF (number, numberDecimalSeparator, mono_string_new (domain,
+ idx2string (nfe->number_decimal_separator)));
+ MONO_OBJECT_SETREF (number, numberGroupSeparator, mono_string_new (domain, idx2string (nfe->number_group_separator)));
+ MONO_OBJECT_SETREF (number, numberGroupSizes, create_group_sizes_array (nfe->number_group_sizes,
+ GROUP_SIZE));
number->numberNegativePattern = nfe->number_negative_pattern;
number->percentDecimalDigits = nfe->percent_decimal_digits;
- number->percentDecimalSeparator = mono_string_new (domain,
- idx2string (nfe->percent_decimal_separator));
- number->percentGroupSeparator = mono_string_new (domain,
- idx2string (nfe->percent_group_separator));
- number->percentGroupSizes = create_group_sizes_array (nfe->percent_group_sizes,
- GROUP_SIZE);
+ MONO_OBJECT_SETREF (number, percentDecimalSeparator, mono_string_new (domain,
+ idx2string (nfe->percent_decimal_separator)));
+ MONO_OBJECT_SETREF (number, percentGroupSeparator, mono_string_new (domain,
+ idx2string (nfe->percent_group_separator)));
+ MONO_OBJECT_SETREF (number, percentGroupSizes, create_group_sizes_array (nfe->percent_group_sizes,
+ GROUP_SIZE));
number->percentNegativePattern = nfe->percent_negative_pattern;
number->percentPositivePattern = nfe->percent_positive_pattern;
- number->percentSymbol = mono_string_new (domain, idx2string (nfe->percent_symbol));
- number->perMilleSymbol = mono_string_new (domain, idx2string (nfe->per_mille_symbol));
- number->positiveInfinitySymbol = mono_string_new (domain,
- idx2string (nfe->positive_infinity_symbol));
- number->positiveSign = mono_string_new (domain, idx2string (nfe->positive_sign));
+ MONO_OBJECT_SETREF (number, percentSymbol, mono_string_new (domain, idx2string (nfe->percent_symbol)));
+ MONO_OBJECT_SETREF (number, perMilleSymbol, mono_string_new (domain, idx2string (nfe->per_mille_symbol)));
+ MONO_OBJECT_SETREF (number, positiveInfinitySymbol, mono_string_new (domain,
+ idx2string (nfe->positive_infinity_symbol)));
+ MONO_OBJECT_SETREF (number, positiveSign, mono_string_new (domain, idx2string (nfe->positive_sign)));
}
static MonoBoolean
MonoDomain *domain = mono_domain_get ();
this->lcid = ci->lcid;
- this->name = mono_string_new (domain, idx2string (ci->name));
- this->icu_name = mono_string_new (domain, idx2string (ci->icu_name));
- this->displayname = mono_string_new (domain, idx2string (ci->displayname));
- this->englishname = mono_string_new (domain, idx2string (ci->englishname));
- this->nativename = mono_string_new (domain, idx2string (ci->nativename));
- this->win3lang = mono_string_new (domain, idx2string (ci->win3lang));
- this->iso3lang = mono_string_new (domain, idx2string (ci->iso3lang));
- this->iso2lang = mono_string_new (domain, idx2string (ci->iso2lang));
+ MONO_OBJECT_SETREF (this, name, mono_string_new (domain, idx2string (ci->name)));
+ MONO_OBJECT_SETREF (this, icu_name, mono_string_new (domain, idx2string (ci->icu_name)));
+ MONO_OBJECT_SETREF (this, displayname, mono_string_new (domain, idx2string (ci->displayname)));
+ MONO_OBJECT_SETREF (this, englishname, mono_string_new (domain, idx2string (ci->englishname)));
+ MONO_OBJECT_SETREF (this, nativename, mono_string_new (domain, idx2string (ci->nativename)));
+ MONO_OBJECT_SETREF (this, win3lang, mono_string_new (domain, idx2string (ci->win3lang)));
+ MONO_OBJECT_SETREF (this, iso3lang, mono_string_new (domain, idx2string (ci->iso3lang)));
+ MONO_OBJECT_SETREF (this, iso2lang, mono_string_new (domain, idx2string (ci->iso2lang)));
+ MONO_OBJECT_SETREF (this, territory, mono_string_new (domain, idx2string (ci->territory)));
this->parent_lcid = ci->parent_lcid;
this->specific_lcid = ci->specific_lcid;
this->datetime_index = ci->datetime_format_index;
MonoDomain *domain = mono_domain_get ();
this->region_id = ri->region_id;
- this->iso2name = mono_string_new (domain, idx2string (ri->iso2name));
- this->iso3name = mono_string_new (domain, idx2string (ri->iso3name));
- this->win3name = mono_string_new (domain, idx2string (ri->win3name));
- this->english_name = mono_string_new (domain, idx2string (ri->english_name));
- this->currency_symbol = mono_string_new (domain, idx2string (ri->currency_symbol));
- this->iso_currency_symbol = mono_string_new (domain, idx2string (ri->iso_currency_symbol));
- this->currency_english_name = mono_string_new (domain, idx2string (ri->currency_english_name));
+ MONO_OBJECT_SETREF (this, iso2name, mono_string_new (domain, idx2string (ri->iso2name)));
+ MONO_OBJECT_SETREF (this, iso3name, mono_string_new (domain, idx2string (ri->iso3name)));
+ MONO_OBJECT_SETREF (this, win3name, mono_string_new (domain, idx2string (ri->win3name)));
+ MONO_OBJECT_SETREF (this, english_name, mono_string_new (domain, idx2string (ri->english_name)));
+ MONO_OBJECT_SETREF (this, currency_symbol, mono_string_new (domain, idx2string (ri->currency_symbol)));
+ MONO_OBJECT_SETREF (this, iso_currency_symbol, mono_string_new (domain, idx2string (ri->iso_currency_symbol)));
+ MONO_OBJECT_SETREF (this, currency_english_name, mono_string_new (domain, idx2string (ri->currency_english_name)));
return TRUE;
}
if (entry->lcid != entry->specific_lcid)
entry = culture_info_entry_from_lcid (entry->specific_lcid);
- return construct_culture (ci, entry);
-}
-
-static gboolean
-construct_region_from_specific_name (MonoRegionInfo *ri, gchar *name)
-{
- const RegionInfoEntry *entry;
- const RegionInfoNameEntry *ne;
-
- MONO_ARCH_SAVE_REGS;
-
- ne = bsearch (name, region_name_entries, NUM_REGION_ENTRIES,
- sizeof (RegionInfoNameEntry), region_name_locator);
-
- if (ne == NULL)
+ if (entry)
+ return construct_culture (ci, entry);
+ else
return FALSE;
-
- entry = ®ion_entries [ne->region_entry_index];
-
- return construct_region (ri, entry);
}
static const CultureInfoEntry*
return g_strdup (posix_locale);
}
+#if defined (__APPLE__)
+static gchar*
+get_darwin_locale (void)
+{
+ static gchar *darwin_locale = NULL;
+ CFLocaleRef locale = NULL;
+ CFStringRef locale_cfstr = NULL;
+ CFIndex len;
+ int i;
+
+ if (darwin_locale != NULL)
+ return g_strdup (darwin_locale);
+
+ locale = CFLocaleCopyCurrent ();
+
+ if (locale) {
+ locale_cfstr = CFLocaleGetIdentifier (locale);
+
+ if (locale_cfstr) {
+ len = CFStringGetMaximumSizeForEncoding (CFStringGetLength (locale_cfstr), kCFStringEncodingMacRoman) + 1;
+ darwin_locale = (char *) malloc (len);
+ if (!CFStringGetCString (locale_cfstr, darwin_locale, len, kCFStringEncodingMacRoman)) {
+ free (darwin_locale);
+ CFRelease (locale);
+ darwin_locale = NULL;
+ return NULL;
+ }
+
+ for (i = 0; i < strlen (darwin_locale); i++)
+ if (darwin_locale [i] == '_')
+ darwin_locale [i] = '-';
+ }
+
+ CFRelease (locale);
+ }
+
+ return g_strdup (darwin_locale);
+}
+#endif
+
static gchar*
get_current_locale_name (void)
{
gchar *locale;
gchar *corrected = NULL;
const gchar *p;
- gchar *c;
+ gchar *c;
-#ifdef PLATFORM_WIN32
+#ifdef HOST_WIN32
locale = g_win32_getlocale ();
-#else
+#elif defined (__APPLE__)
+ locale = get_darwin_locale ();
+ if (!locale)
+ locale = get_posix_locale ();
+#else
locale = get_posix_locale ();
#endif
if ((p = strchr (locale, '.')) != NULL) {
/* assume new locale can't be larger than old one? */
- corrected = malloc (strlen (locale));
+ corrected = g_malloc (strlen (locale));
strncpy (corrected, locale, p - locale);
corrected [p - locale] = 0;
*/
if (corrected == NULL) {
- corrected = malloc (strlen (locale));
+ corrected = g_malloc (strlen (locale));
strncpy (corrected, locale, p - locale);
corrected [p - locale] = 0;
}
if ((c = strchr (corrected, '_')) != NULL)
*c = '-';
- g_strdown (corrected);
+ c = corrected;
+ corrected = g_ascii_strdown (c, -1);
+ g_free (c);
return corrected;
}
ret = construct_culture_from_specific_name (ci, locale);
g_free (locale);
+ ci->is_read_only = TRUE;
+ ci->use_user_override = TRUE;
return ret;
}
len = 0;
if (neutral)
- mono_array_set (ret, MonoCultureInfo *, len++, NULL);
+ mono_array_setref (ret, len++, NULL);
for (i = 0; i < NUM_CULTURE_ENTRIES; i++) {
ci = &culture_entries [i];
culture = (MonoCultureInfo *) mono_object_new (domain, class);
mono_runtime_object_init ((MonoObject *) culture);
construct_culture (culture, ci);
- mono_array_set (ret, MonoCultureInfo *, len++, culture);
+ culture->use_user_override = TRUE;
+ mono_array_setref (ret, len++, culture);
}
}
return TRUE;
}
-void ves_icall_System_Globalization_CultureInfo_construct_internal_locale (MonoCultureInfo *this, MonoString *locale)
-{
- MONO_ARCH_SAVE_REGS;
-
- /* Always claim "unknown locale" if we don't have ICU (only
- * called for non-invariant locales)
- */
- mono_raise_exception((MonoException *)mono_exception_from_name(mono_get_corlib (), "System", "ArgumentException"));
-}
-
void ves_icall_System_Globalization_CompareInfo_construct_compareinfo (MonoCompareInfo *comp, MonoString *locale)
{
/* Nothing to do here */
mono_array_set (arr, guint8, i, mono_string_chars (source)[i]);
}
- key->key=arr;
+ MONO_OBJECT_SETREF (key, key, arr);
}
int ves_icall_System_Globalization_CompareInfo_internal_index (MonoCompareInfo *this, MonoString *source, gint32 sindex, gint32 count, MonoString *value, gint32 options, MonoBoolean first)
gint32 options)
{
gint32 result;
- GUnicodeType c1type, c2type;
/* Ordinal can not be mixed with other options, and must return the difference, not only -1, 0, 1 */
if (options & CompareOptions_Ordinal)
return (gint32) c1 - c2;
- c1type = g_unichar_type (c1);
- c2type = g_unichar_type (c2);
-
if (options & CompareOptions_IgnoreCase) {
+ GUnicodeType c1type, c2type;
+
+ c1type = g_unichar_type (c1);
+ c2type = g_unichar_type (c2);
+
result = (gint32) (c1type != G_UNICODE_LOWERCASE_LETTER ? g_unichar_tolower(c1) : c1) -
(c2type != G_UNICODE_LOWERCASE_LETTER ? g_unichar_tolower(c2) : c2);
} else {
}
}
+void load_normalization_resource (guint8 **argProps,
+ guint8 **argMappedChars,
+ guint8 **argCharMapIndex,
+ guint8 **argHelperIndex,
+ guint8 **argMapIdxToComposite,
+ guint8 **argCombiningClass)
+{
+#ifdef DISABLE_NORMALIZATION
+ mono_raise_exception (mono_get_exception_not_supported ("This runtime has been compiled without string normalization support."));
+#else
+ *argProps = (guint8*)props;
+ *argMappedChars = (guint8*) mappedChars;
+ *argCharMapIndex = (guint8*) charMapIndex;
+ *argHelperIndex = (guint8*) helperIndex;
+ *argMapIdxToComposite = (guint8*) mapIdxToComposite;
+ *argCombiningClass = (guint8*)combiningClass;
+#endif
+}
+
+