X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmetadata%2Flocales.c;h=e188ee4ae49a480b08034d7652af0868f61e2c5f;hb=cd9ca0b1289d6fa6155a744f4c22336ad321b913;hp=dd781e8fa9a58ea7aa6a8d76a2fd9efe0739d2de;hpb=4eb352bcb3ef7a71dc9ab62c5cd2d5e7598619f7;p=mono.git diff --git a/mono/metadata/locales.c b/mono/metadata/locales.c index dd781e8fa9a..e188ee4ae49 100644 --- a/mono/metadata/locales.c +++ b/mono/metadata/locales.c @@ -5,7 +5,8 @@ * 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 */ @@ -21,10 +22,15 @@ #include #include #include -#include +#ifndef DISABLE_NORMALIZATION +#include +#endif #include +#if defined(__APPLE__) +#include +#endif #undef DEBUG @@ -102,7 +108,7 @@ create_group_sizes_array (const gint *gs, gint ml) 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++) @@ -129,7 +135,7 @@ create_names_array_idx (const guint16 *names, int ml) 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_setref (ret, i, mono_string_new (domain, idx2string (names [i]))); @@ -153,6 +159,7 @@ ves_icall_System_Globalization_CultureInfo_construct_datetime_format (MonoCultur domain = mono_domain_get (); + 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, @@ -193,12 +200,15 @@ ves_icall_System_Globalization_CultureInfo_construct_number_format (MonoCultureI 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; MONO_OBJECT_SETREF (number, currencyDecimalSeparator, mono_string_new (domain, idx2string (nfe->currency_decimal_separator))); @@ -250,6 +260,7 @@ construct_culture (MonoCultureInfo *this, const CultureInfoEntry *ci) 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; @@ -297,26 +308,10 @@ construct_culture_from_specific_name (MonoCultureInfo *ci, gchar *name) 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* @@ -384,17 +379,61 @@ get_posix_locale (void) 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 @@ -403,7 +442,7 @@ get_current_locale_name (void) 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; @@ -422,7 +461,7 @@ get_current_locale_name (void) */ if (corrected == NULL) { - corrected = malloc (strlen (locale)); + corrected = g_malloc (strlen (locale)); strncpy (corrected, locale, p - locale); corrected [p - locale] = 0; } @@ -436,7 +475,9 @@ get_current_locale_name (void) if ((c = strchr (corrected, '_')) != NULL) *c = '-'; - g_strdown (corrected); + c = corrected; + corrected = g_ascii_strdown (c, -1); + g_free (c); return corrected; } @@ -455,6 +496,8 @@ ves_icall_System_Globalization_CultureInfo_construct_internal_locale_from_curren ret = construct_culture_from_specific_name (ci, locale); g_free (locale); + ci->is_read_only = TRUE; + ci->use_user_override = TRUE; return ret; } @@ -599,6 +642,7 @@ ves_icall_System_Globalization_CultureInfo_internal_get_cultures (MonoBoolean ne culture = (MonoCultureInfo *) mono_object_new (domain, class); mono_runtime_object_init ((MonoObject *) culture); construct_culture (culture, ci); + culture->use_user_override = TRUE; mono_array_setref (ret, len++, culture); } } @@ -704,16 +748,17 @@ static gint32 string_invariant_compare_char (gunichar2 c1, gunichar2 c2, 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 { @@ -936,12 +981,16 @@ void load_normalization_resource (guint8 **argProps, guint8 **argMapIdxToComposite, guint8 **argCombiningClass) { - *argProps = props; +#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 = combiningClass; + *argCombiningClass = (guint8*)combiningClass; +#endif }