2
0
Эх сурвалжийг харах

[mono] Move some culture-dependent source files to a separate directory (#19912)

* [mono] Move culture-info-tables.h to a separate directory

We'd like to remove culture-info-tables.h from the dotnet/runtime copy of mono since we use ICU
there for globalization like the rest of .NET 5.

The plan is:
1. We move the file (and some others) to a separate directory (this PR)
2. We tell the sync bot to skip `culture/` in the future
3. We delete the files (or make them empty) in dotnet/runtime
* Also move locale.c and culture-info.h

* Also move mono_w32process_ver_language_name

* [msvc] don't compile locales.c if it doesn't exist

   It exists for now, but won't after we stop syncing culture/ to dotnet/runtime
Aleksey Kliger (λgeek) 5 жил өмнө
parent
commit
ba14e69474

+ 1 - 0
m4/mono-output.m4

@@ -16,6 +16,7 @@ AC_DEFUN([AC_MONO_OUTPUT], [
 		llvm/Makefile
 		mono/Makefile
 		mono/btls/Makefile
+		mono/culture/Makefile
 		mono/native/Makefile
 		mono/utils/Makefile
 		mono/metadata/Makefile

+ 6 - 4
mono/Makefile.am

@@ -16,9 +16,11 @@ if ENABLE_NETCORE
 btls_dirs =
 managed_unit_test_dirs =
 native_unit_test_dirs =
+culture_dirs =
 else
 managed_unit_test_dirs = tests
 native_unit_test_dirs = unit-tests
+culture_dirs = culture
 endif
 
 if ENABLE_PERFTRACING
@@ -30,14 +32,14 @@ SUBDIRS = eglib arch utils sgen zlib $(eventpipe_dirs) metadata mini profiler $(
 else
 
 if CROSS_COMPILING
-SUBDIRS = $(btls_dirs) eglib arch utils cil zlib $(sgen_dirs) metadata mini dis profiler $(native_dirs)
+SUBDIRS = $(btls_dirs) $(culture_dirs) eglib arch utils cil zlib $(sgen_dirs) metadata mini dis profiler $(native_dirs)
 else
 if INSTALL_MONOTOUCH
-SUBDIRS = $(btls_dirs) eglib arch utils zlib $(sgen_dirs) metadata mini profiler $(native_dirs)
+SUBDIRS = $(btls_dirs) $(culture_dirs) eglib arch utils zlib $(sgen_dirs) metadata mini profiler $(native_dirs)
 else
-SUBDIRS = $(btls_dirs) eglib arch utils cil zlib $(sgen_dirs) metadata mini dis $(managed_unit_test_dirs) $(native_unit_test_dirs) benchmark profiler $(native_dirs)
+SUBDIRS = $(btls_dirs) $(culture_dirs) eglib arch utils cil zlib $(sgen_dirs) metadata mini dis $(managed_unit_test_dirs) $(native_unit_test_dirs) benchmark profiler $(native_dirs)
 endif
 endif
 endif
 
-DIST_SUBDIRS = btls native eglib arch utils cil zlib $(sgen_dirs) metadata mini dis $(managed_unit_test_dirs) $(native_unit_test_dirs) benchmark profiler
+DIST_SUBDIRS = btls $(culture_dirs) native eglib arch utils cil zlib $(sgen_dirs) metadata mini dis $(managed_unit_test_dirs) $(native_unit_test_dirs) benchmark profiler

+ 12 - 0
mono/culture/.gitignore

@@ -0,0 +1,12 @@
+/Makefile
+/Makefile.in
+/.libs
+/.deps
+/*.lo
+/*.la
+/*.o
+/*.a
+/semantic.cache
+/.project
+/.cproject
+/TAGS

+ 24 - 0
mono/culture/Makefile.am

@@ -0,0 +1,24 @@
+MAKEFLAGS := $(MAKEFLAGS) --no-builtin-rules
+
+AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/mono $(GLIB_CFLAGS) $(SHARED_CFLAGS)
+
+CFLAGS := $(filter-out @CXX_REMOVE_CFLAGS@, @CFLAGS@)
+
+if !ENABLE_MSVC_ONLY
+
+noinst_LTLIBRARIES = libmono-culture.la
+
+if !HOST_WIN32
+unix_sources = w32process-unix-language.c
+
+platform_sources = $(unix_sources)
+endif
+
+libmono_culture_la_SOURCES = \
+	$(platform_sources)	\
+	culture-info.h	\
+	culture-info-tables.h	\
+	locales.c
+libmono_culture_la_CPPFLAGS = $(AM_CPPFLAGS) @CXX_ADD_CFLAGS@
+
+endif # ENABLE_MSVC_ONLY

+ 0 - 0
mono/metadata/culture-info-tables.h → mono/culture/culture-info-tables.h


+ 0 - 0
mono/metadata/culture-info.h → mono/culture/culture-info.h


+ 3 - 3
mono/metadata/locales.c → mono/culture/locales.c

@@ -28,8 +28,8 @@
 #include <mono/metadata/exception.h>
 #include <mono/metadata/monitor.h>
 #include <mono/metadata/locales.h>
-#include <mono/metadata/culture-info.h>
-#include <mono/metadata/culture-info-tables.h>
+#include <mono/culture/culture-info.h>
+#include <mono/culture/culture-info-tables.h>
 #include <mono/utils/bsearch.h>
 
 #ifndef DISABLE_NORMALIZATION
@@ -40,7 +40,7 @@
 #if defined(__APPLE__)
 #include <CoreFoundation/CoreFoundation.h>
 #endif
-#include "icall-decl.h"
+#include <mono/metadata/icall-decl.h>
 
 #undef DEBUG
 

+ 796 - 0
mono/culture/w32process-unix-language.c

@@ -0,0 +1,796 @@
+/**
+ * \file
+ * System.Diagnostics.Process support, mono_w32process_ver_language_name
+ */
+#include <config.h>
+#include <glib.h>
+#include <mono/utils/mono-compiler.h>
+#include <mono/utils/mono-publib.h>
+#include <mono/metadata/w32process-internals.h>
+
+#if !defined(ENABLE_NETCORE) && !defined(DISABLE_PROCESSES)
+
+static guint32
+copy_lang (gunichar2 *lang_out, guint32 lang_len, const gchar *text)
+{
+	gunichar2 *unitext;
+	int chars = strlen (text);
+	int ret;
+
+	unitext = g_utf8_to_utf16 (text, -1, NULL, NULL, NULL);
+	g_assert (unitext != NULL);
+
+	if (chars < (lang_len - 1)) {
+		memcpy (lang_out, (gpointer)unitext, chars * 2);
+		lang_out[chars] = '\0';
+		ret = chars;
+	} else {
+		memcpy (lang_out, (gpointer)unitext, (lang_len - 1) * 2);
+		lang_out[lang_len] = '\0';
+		ret = lang_len;
+	}
+
+	g_free (unitext);
+
+	return(ret);
+}
+
+guint32
+mono_w32process_ver_language_name (guint32 lang, gunichar2 *lang_out, guint32 lang_len)
+{
+	int primary, secondary;
+	const char *name = NULL;
+
+	primary = lang & 0x3FF;
+	secondary = (lang >> 10) & 0x3F;
+
+	switch(primary) {
+	case 0x00:
+		switch (secondary) {
+		case 0x01: name = "Process Default Language"; break;
+		}
+		break;
+	case 0x01:
+		switch (secondary) {
+		case 0x00:
+		case 0x01: name = "Arabic (Saudi Arabia)"; break;
+		case 0x02: name = "Arabic (Iraq)"; break;
+		case 0x03: name = "Arabic (Egypt)"; break;
+		case 0x04: name = "Arabic (Libya)"; break;
+		case 0x05: name = "Arabic (Algeria)"; break;
+		case 0x06: name = "Arabic (Morocco)"; break;
+		case 0x07: name = "Arabic (Tunisia)"; break;
+		case 0x08: name = "Arabic (Oman)"; break;
+		case 0x09: name = "Arabic (Yemen)"; break;
+		case 0x0a: name = "Arabic (Syria)"; break;
+		case 0x0b: name = "Arabic (Jordan)"; break;
+		case 0x0c: name = "Arabic (Lebanon)"; break;
+		case 0x0d: name = "Arabic (Kuwait)"; break;
+		case 0x0e: name = "Arabic (U.A.E.)"; break;
+		case 0x0f: name = "Arabic (Bahrain)"; break;
+		case 0x10: name = "Arabic (Qatar)"; break;
+		}
+		break;
+	case 0x02:
+		switch (secondary) {
+		case 0x00: name = "Bulgarian (Bulgaria)"; break;
+		case 0x01: name = "Bulgarian"; break;
+		}
+		break;
+	case 0x03:
+		switch (secondary) {
+		case 0x00: name = "Catalan (Spain)"; break;
+		case 0x01: name = "Catalan"; break;
+		}
+		break;
+	case 0x04:
+		switch (secondary) {
+		case 0x00:
+		case 0x01: name = "Chinese (Taiwan)"; break;
+		case 0x02: name = "Chinese (PRC)"; break;
+		case 0x03: name = "Chinese (Hong Kong S.A.R.)"; break;
+		case 0x04: name = "Chinese (Singapore)"; break;
+		case 0x05: name = "Chinese (Macau S.A.R.)"; break;
+		}
+		break;
+	case 0x05:
+		switch (secondary) {
+		case 0x00: name = "Czech (Czech Republic)"; break;
+		case 0x01: name = "Czech"; break;
+		}
+		break;
+	case 0x06:
+		switch (secondary) {
+		case 0x00: name = "Danish (Denmark)"; break;
+		case 0x01: name = "Danish"; break;
+		}
+		break;
+	case 0x07:
+		switch (secondary) {
+		case 0x00:
+		case 0x01: name = "German (Germany)"; break;
+		case 0x02: name = "German (Switzerland)"; break;
+		case 0x03: name = "German (Austria)"; break;
+		case 0x04: name = "German (Luxembourg)"; break;
+		case 0x05: name = "German (Liechtenstein)"; break;
+		}
+		break;
+	case 0x08:
+		switch (secondary) {
+		case 0x00: name = "Greek (Greece)"; break;
+		case 0x01: name = "Greek"; break;
+		}
+		break;
+	case 0x09:
+		switch (secondary) {
+		case 0x00:
+		case 0x01: name = "English (United States)"; break;
+		case 0x02: name = "English (United Kingdom)"; break;
+		case 0x03: name = "English (Australia)"; break;
+		case 0x04: name = "English (Canada)"; break;
+		case 0x05: name = "English (New Zealand)"; break;
+		case 0x06: name = "English (Ireland)"; break;
+		case 0x07: name = "English (South Africa)"; break;
+		case 0x08: name = "English (Jamaica)"; break;
+		case 0x09: name = "English (Caribbean)"; break;
+		case 0x0a: name = "English (Belize)"; break;
+		case 0x0b: name = "English (Trinidad and Tobago)"; break;
+		case 0x0c: name = "English (Zimbabwe)"; break;
+		case 0x0d: name = "English (Philippines)"; break;
+		case 0x10: name = "English (India)"; break;
+		case 0x11: name = "English (Malaysia)"; break;
+		case 0x12: name = "English (Singapore)"; break;
+		}
+		break;
+	case 0x0a:
+		switch (secondary) {
+		case 0x00: name = "Spanish (Spain)"; break;
+		case 0x01: name = "Spanish (Traditional Sort)"; break;
+		case 0x02: name = "Spanish (Mexico)"; break;
+		case 0x03: name = "Spanish (International Sort)"; break;
+		case 0x04: name = "Spanish (Guatemala)"; break;
+		case 0x05: name = "Spanish (Costa Rica)"; break;
+		case 0x06: name = "Spanish (Panama)"; break;
+		case 0x07: name = "Spanish (Dominican Republic)"; break;
+		case 0x08: name = "Spanish (Venezuela)"; break;
+		case 0x09: name = "Spanish (Colombia)"; break;
+		case 0x0a: name = "Spanish (Peru)"; break;
+		case 0x0b: name = "Spanish (Argentina)"; break;
+		case 0x0c: name = "Spanish (Ecuador)"; break;
+		case 0x0d: name = "Spanish (Chile)"; break;
+		case 0x0e: name = "Spanish (Uruguay)"; break;
+		case 0x0f: name = "Spanish (Paraguay)"; break;
+		case 0x10: name = "Spanish (Bolivia)"; break;
+		case 0x11: name = "Spanish (El Salvador)"; break;
+		case 0x12: name = "Spanish (Honduras)"; break;
+		case 0x13: name = "Spanish (Nicaragua)"; break;
+		case 0x14: name = "Spanish (Puerto Rico)"; break;
+		case 0x15: name = "Spanish (United States)"; break;
+		}
+		break;
+	case 0x0b:
+		switch (secondary) {
+		case 0x00: name = "Finnish (Finland)"; break;
+		case 0x01: name = "Finnish"; break;
+		}
+		break;
+	case 0x0c:
+		switch (secondary) {
+		case 0x00:
+		case 0x01: name = "French (France)"; break;
+		case 0x02: name = "French (Belgium)"; break;
+		case 0x03: name = "French (Canada)"; break;
+		case 0x04: name = "French (Switzerland)"; break;
+		case 0x05: name = "French (Luxembourg)"; break;
+		case 0x06: name = "French (Monaco)"; break;
+		}
+		break;
+	case 0x0d:
+		switch (secondary) {
+		case 0x00: name = "Hebrew (Israel)"; break;
+		case 0x01: name = "Hebrew"; break;
+		}
+		break;
+	case 0x0e:
+		switch (secondary) {
+		case 0x00: name = "Hungarian (Hungary)"; break;
+		case 0x01: name = "Hungarian"; break;
+		}
+		break;
+	case 0x0f:
+		switch (secondary) {
+		case 0x00: name = "Icelandic (Iceland)"; break;
+		case 0x01: name = "Icelandic"; break;
+		}
+		break;
+	case 0x10:
+		switch (secondary) {
+		case 0x00:
+		case 0x01: name = "Italian (Italy)"; break;
+		case 0x02: name = "Italian (Switzerland)"; break;
+		}
+		break;
+	case 0x11:
+		switch (secondary) {
+		case 0x00: name = "Japanese (Japan)"; break;
+		case 0x01: name = "Japanese"; break;
+		}
+		break;
+	case 0x12:
+		switch (secondary) {
+		case 0x00: name = "Korean (Korea)"; break;
+		case 0x01: name = "Korean"; break;
+		}
+		break;
+	case 0x13:
+		switch (secondary) {
+		case 0x00:
+		case 0x01: name = "Dutch (Netherlands)"; break;
+		case 0x02: name = "Dutch (Belgium)"; break;
+		}
+		break;
+	case 0x14:
+		switch (secondary) {
+		case 0x00:
+		case 0x01: name = "Norwegian (Bokmal)"; break;
+		case 0x02: name = "Norwegian (Nynorsk)"; break;
+		}
+		break;
+	case 0x15:
+		switch (secondary) {
+		case 0x00: name = "Polish (Poland)"; break;
+		case 0x01: name = "Polish"; break;
+		}
+		break;
+	case 0x16:
+		switch (secondary) {
+		case 0x00:
+		case 0x01: name = "Portuguese (Brazil)"; break;
+		case 0x02: name = "Portuguese (Portugal)"; break;
+		}
+		break;
+	case 0x17:
+		switch (secondary) {
+		case 0x01: name = "Romansh (Switzerland)"; break;
+		}
+		break;
+	case 0x18:
+		switch (secondary) {
+		case 0x00: name = "Romanian (Romania)"; break;
+		case 0x01: name = "Romanian"; break;
+		}
+		break;
+	case 0x19:
+		switch (secondary) {
+		case 0x00: name = "Russian (Russia)"; break;
+		case 0x01: name = "Russian"; break;
+		}
+		break;
+	case 0x1a:
+		switch (secondary) {
+		case 0x00: name = "Croatian (Croatia)"; break;
+		case 0x01: name = "Croatian"; break;
+		case 0x02: name = "Serbian (Latin)"; break;
+		case 0x03: name = "Serbian (Cyrillic)"; break;
+		case 0x04: name = "Croatian (Bosnia and Herzegovina)"; break;
+		case 0x05: name = "Bosnian (Latin, Bosnia and Herzegovina)"; break;
+		case 0x06: name = "Serbian (Latin, Bosnia and Herzegovina)"; break;
+		case 0x07: name = "Serbian (Cyrillic, Bosnia and Herzegovina)"; break;
+		case 0x08: name = "Bosnian (Cyrillic, Bosnia and Herzegovina)"; break;
+		}
+		break;
+	case 0x1b:
+		switch (secondary) {
+		case 0x00: name = "Slovak (Slovakia)"; break;
+		case 0x01: name = "Slovak"; break;
+		}
+		break;
+	case 0x1c:
+		switch (secondary) {
+		case 0x00: name = "Albanian (Albania)"; break;
+		case 0x01: name = "Albanian"; break;
+		}
+		break;
+	case 0x1d:
+		switch (secondary) {
+		case 0x00: name = "Swedish (Sweden)"; break;
+		case 0x01: name = "Swedish"; break;
+		case 0x02: name = "Swedish (Finland)"; break;
+		}
+		break;
+	case 0x1e:
+		switch (secondary) {
+		case 0x00: name = "Thai (Thailand)"; break;
+		case 0x01: name = "Thai"; break;
+		}
+		break;
+	case 0x1f:
+		switch (secondary) {
+		case 0x00: name = "Turkish (Turkey)"; break;
+		case 0x01: name = "Turkish"; break;
+		}
+		break;
+	case 0x20:
+		switch (secondary) {
+		case 0x00: name = "Urdu (Islamic Republic of Pakistan)"; break;
+		case 0x01: name = "Urdu"; break;
+		}
+		break;
+	case 0x21:
+		switch (secondary) {
+		case 0x00: name = "Indonesian (Indonesia)"; break;
+		case 0x01: name = "Indonesian"; break;
+		}
+		break;
+	case 0x22:
+		switch (secondary) {
+		case 0x00: name = "Ukrainian (Ukraine)"; break;
+		case 0x01: name = "Ukrainian"; break;
+		}
+		break;
+	case 0x23:
+		switch (secondary) {
+		case 0x00: name = "Belarusian (Belarus)"; break;
+		case 0x01: name = "Belarusian"; break;
+		}
+		break;
+	case 0x24:
+		switch (secondary) {
+		case 0x00: name = "Slovenian (Slovenia)"; break;
+		case 0x01: name = "Slovenian"; break;
+		}
+		break;
+	case 0x25:
+		switch (secondary) {
+		case 0x00: name = "Estonian (Estonia)"; break;
+		case 0x01: name = "Estonian"; break;
+		}
+		break;
+	case 0x26:
+		switch (secondary) {
+		case 0x00: name = "Latvian (Latvia)"; break;
+		case 0x01: name = "Latvian"; break;
+		}
+		break;
+	case 0x27:
+		switch (secondary) {
+		case 0x00: name = "Lithuanian (Lithuania)"; break;
+		case 0x01: name = "Lithuanian"; break;
+		}
+		break;
+	case 0x28:
+		switch (secondary) {
+		case 0x01: name = "Tajik (Tajikistan)"; break;
+		}
+		break;
+	case 0x29:
+		switch (secondary) {
+		case 0x00: name = "Farsi (Iran)"; break;
+		case 0x01: name = "Farsi"; break;
+		}
+		break;
+	case 0x2a:
+		switch (secondary) {
+		case 0x00: name = "Vietnamese (Viet Nam)"; break;
+		case 0x01: name = "Vietnamese"; break;
+		}
+		break;
+	case 0x2b:
+		switch (secondary) {
+		case 0x00: name = "Armenian (Armenia)"; break;
+		case 0x01: name = "Armenian"; break;
+		}
+		break;
+	case 0x2c:
+		switch (secondary) {
+		case 0x00: name = "Azeri (Latin) (Azerbaijan)"; break;
+		case 0x01: name = "Azeri (Latin)"; break;
+		case 0x02: name = "Azeri (Cyrillic)"; break;
+		}
+		break;
+	case 0x2d:
+		switch (secondary) {
+		case 0x00: name = "Basque (Spain)"; break;
+		case 0x01: name = "Basque"; break;
+		}
+		break;
+	case 0x2e:
+		switch (secondary) {
+		case 0x01: name = "Upper Sorbian (Germany)"; break;
+		case 0x02: name = "Lower Sorbian (Germany)"; break;
+		}
+		break;
+	case 0x2f:
+		switch (secondary) {
+		case 0x00: name = "FYRO Macedonian (Former Yugoslav Republic of Macedonia)"; break;
+		case 0x01: name = "FYRO Macedonian"; break;
+		}
+		break;
+	case 0x32:
+		switch (secondary) {
+		case 0x00: name = "Tswana (South Africa)"; break;
+		case 0x01: name = "Tswana"; break;
+		}
+		break;
+	case 0x34:
+		switch (secondary) {
+		case 0x00: name = "Xhosa (South Africa)"; break;
+		case 0x01: name = "Xhosa"; break;
+		}
+		break;
+	case 0x35:
+		switch (secondary) {
+		case 0x00: name = "Zulu (South Africa)"; break;
+		case 0x01: name = "Zulu"; break;
+		}
+		break;
+	case 0x36:
+		switch (secondary) {
+		case 0x00: name = "Afrikaans (South Africa)"; break;
+		case 0x01: name = "Afrikaans"; break;
+		}
+		break;
+	case 0x37:
+		switch (secondary) {
+		case 0x00: name = "Georgian (Georgia)"; break;
+		case 0x01: name = "Georgian"; break;
+		}
+		break;
+	case 0x38:
+		switch (secondary) {
+		case 0x00: name = "Faroese (Faroe Islands)"; break;
+		case 0x01: name = "Faroese"; break;
+		}
+		break;
+	case 0x39:
+		switch (secondary) {
+		case 0x00: name = "Hindi (India)"; break;
+		case 0x01: name = "Hindi"; break;
+		}
+		break;
+	case 0x3a:
+		switch (secondary) {
+		case 0x00: name = "Maltese (Malta)"; break;
+		case 0x01: name = "Maltese"; break;
+		}
+		break;
+	case 0x3b:
+		switch (secondary) {
+		case 0x00: name = "Sami (Northern) (Norway)"; break;
+		case 0x01: name = "Sami, Northern (Norway)"; break;
+		case 0x02: name = "Sami, Northern (Sweden)"; break;
+		case 0x03: name = "Sami, Northern (Finland)"; break;
+		case 0x04: name = "Sami, Lule (Norway)"; break;
+		case 0x05: name = "Sami, Lule (Sweden)"; break;
+		case 0x06: name = "Sami, Southern (Norway)"; break;
+		case 0x07: name = "Sami, Southern (Sweden)"; break;
+		case 0x08: name = "Sami, Skolt (Finland)"; break;
+		case 0x09: name = "Sami, Inari (Finland)"; break;
+		}
+		break;
+	case 0x3c:
+		switch (secondary) {
+		case 0x02: name = "Irish (Ireland)"; break;
+		}
+		break;
+	case 0x3e:
+		switch (secondary) {
+		case 0x00:
+		case 0x01: name = "Malay (Malaysia)"; break;
+		case 0x02: name = "Malay (Brunei Darussalam)"; break;
+		}
+		break;
+	case 0x3f:
+		switch (secondary) {
+		case 0x00: name = "Kazakh (Kazakhstan)"; break;
+		case 0x01: name = "Kazakh"; break;
+		}
+		break;
+	case 0x40:
+		switch (secondary) {
+		case 0x00: name = "Kyrgyz (Kyrgyzstan)"; break;
+		case 0x01: name = "Kyrgyz (Cyrillic)"; break;
+		}
+		break;
+	case 0x41:
+		switch (secondary) {
+		case 0x00: name = "Swahili (Kenya)"; break;
+		case 0x01: name = "Swahili"; break;
+		}
+		break;
+	case 0x42:
+		switch (secondary) {
+		case 0x01: name = "Turkmen (Turkmenistan)"; break;
+		}
+		break;
+	case 0x43:
+		switch (secondary) {
+		case 0x00: name = "Uzbek (Latin) (Uzbekistan)"; break;
+		case 0x01: name = "Uzbek (Latin)"; break;
+		case 0x02: name = "Uzbek (Cyrillic)"; break;
+		}
+		break;
+	case 0x44:
+		switch (secondary) {
+		case 0x00: name = "Tatar (Russia)"; break;
+		case 0x01: name = "Tatar"; break;
+		}
+		break;
+	case 0x45:
+		switch (secondary) {
+		case 0x00:
+		case 0x01: name = "Bengali (India)"; break;
+		}
+		break;
+	case 0x46:
+		switch (secondary) {
+		case 0x00: name = "Punjabi (India)"; break;
+		case 0x01: name = "Punjabi"; break;
+		}
+		break;
+	case 0x47:
+		switch (secondary) {
+		case 0x00: name = "Gujarati (India)"; break;
+		case 0x01: name = "Gujarati"; break;
+		}
+		break;
+	case 0x49:
+		switch (secondary) {
+		case 0x00: name = "Tamil (India)"; break;
+		case 0x01: name = "Tamil"; break;
+		}
+		break;
+	case 0x4a:
+		switch (secondary) {
+		case 0x00: name = "Telugu (India)"; break;
+		case 0x01: name = "Telugu"; break;
+		}
+		break;
+	case 0x4b:
+		switch (secondary) {
+		case 0x00: name = "Kannada (India)"; break;
+		case 0x01: name = "Kannada"; break;
+		}
+		break;
+	case 0x4c:
+		switch (secondary) {
+		case 0x00:
+		case 0x01: name = "Malayalam (India)"; break;
+		}
+		break;
+	case 0x4d:
+		switch (secondary) {
+		case 0x01: name = "Assamese (India)"; break;
+		}
+		break;
+	case 0x4e:
+		switch (secondary) {
+		case 0x00: name = "Marathi (India)"; break;
+		case 0x01: name = "Marathi"; break;
+		}
+		break;
+	case 0x4f:
+		switch (secondary) {
+		case 0x00: name = "Sanskrit (India)"; break;
+		case 0x01: name = "Sanskrit"; break;
+		}
+		break;
+	case 0x50:
+		switch (secondary) {
+		case 0x00: name = "Mongolian (Mongolia)"; break;
+		case 0x01: name = "Mongolian (Cyrillic)"; break;
+		case 0x02: name = "Mongolian (PRC)"; break;
+		}
+		break;
+	case 0x51:
+		switch (secondary) {
+		case 0x01: name = "Tibetan (PRC)"; break;
+		case 0x02: name = "Tibetan (Bhutan)"; break;
+		}
+		break;
+	case 0x52:
+		switch (secondary) {
+		case 0x00: name = "Welsh (United Kingdom)"; break;
+		case 0x01: name = "Welsh"; break;
+		}
+		break;
+	case 0x53:
+		switch (secondary) {
+		case 0x01: name = "Khmer (Cambodia)"; break;
+		}
+		break;
+	case 0x54:
+		switch (secondary) {
+		case 0x01: name = "Lao (Lao PDR)"; break;
+		}
+		break;
+	case 0x56:
+		switch (secondary) {
+		case 0x00: name = "Galician (Spain)"; break;
+		case 0x01: name = "Galician"; break;
+		}
+		break;
+	case 0x57:
+		switch (secondary) {
+		case 0x00: name = "Konkani (India)"; break;
+		case 0x01: name = "Konkani"; break;
+		}
+		break;
+	case 0x5a:
+		switch (secondary) {
+		case 0x00: name = "Syriac (Syria)"; break;
+		case 0x01: name = "Syriac"; break;
+		}
+		break;
+	case 0x5b:
+		switch (secondary) {
+		case 0x01: name = "Sinhala (Sri Lanka)"; break;
+		}
+		break;
+	case 0x5d:
+		switch (secondary) {
+		case 0x01: name = "Inuktitut (Syllabics, Canada)"; break;
+		case 0x02: name = "Inuktitut (Latin, Canada)"; break;
+		}
+		break;
+	case 0x5e:
+		switch (secondary) {
+		case 0x01: name = "Amharic (Ethiopia)"; break;
+		}
+		break;
+	case 0x5f:
+		switch (secondary) {
+		case 0x02: name = "Tamazight (Algeria, Latin)"; break;
+		}
+		break;
+	case 0x61:
+		switch (secondary) {
+		case 0x01: name = "Nepali (Nepal)"; break;
+		}
+		break;
+	case 0x62:
+		switch (secondary) {
+		case 0x01: name = "Frisian (Netherlands)"; break;
+		}
+		break;
+	case 0x63:
+		switch (secondary) {
+		case 0x01: name = "Pashto (Afghanistan)"; break;
+		}
+		break;
+	case 0x64:
+		switch (secondary) {
+		case 0x01: name = "Filipino (Philippines)"; break;
+		}
+		break;
+	case 0x65:
+		switch (secondary) {
+		case 0x00: name = "Divehi (Maldives)"; break;
+		case 0x01: name = "Divehi"; break;
+		}
+		break;
+	case 0x68:
+		switch (secondary) {
+		case 0x01: name = "Hausa (Nigeria, Latin)"; break;
+		}
+		break;
+	case 0x6a:
+		switch (secondary) {
+		case 0x01: name = "Yoruba (Nigeria)"; break;
+		}
+		break;
+	case 0x6b:
+		switch (secondary) {
+		case 0x00:
+		case 0x01: name = "Quechua (Bolivia)"; break;
+		case 0x02: name = "Quechua (Ecuador)"; break;
+		case 0x03: name = "Quechua (Peru)"; break;
+		}
+		break;
+	case 0x6c:
+		switch (secondary) {
+		case 0x00: name = "Northern Sotho (South Africa)"; break;
+		case 0x01: name = "Northern Sotho"; break;
+		}
+		break;
+	case 0x6d:
+		switch (secondary) {
+		case 0x01: name = "Bashkir (Russia)"; break;
+		}
+		break;
+	case 0x6e:
+		switch (secondary) {
+		case 0x01: name = "Luxembourgish (Luxembourg)"; break;
+		}
+		break;
+	case 0x6f:
+		switch (secondary) {
+		case 0x01: name = "Greenlandic (Greenland)"; break;
+		}
+		break;
+	case 0x78:
+		switch (secondary) {
+		case 0x01: name = "Yi (PRC)"; break;
+		}
+		break;
+	case 0x7a:
+		switch (secondary) {
+		case 0x01: name = "Mapudungun (Chile)"; break;
+		}
+		break;
+	case 0x7c:
+		switch (secondary) {
+		case 0x01: name = "Mohawk (Mohawk)"; break;
+		}
+		break;
+	case 0x7e:
+		switch (secondary) {
+		case 0x01: name = "Breton (France)"; break;
+		}
+		break;
+	case 0x7f:
+		switch (secondary) {
+		case 0x00: name = "Invariant Language (Invariant Country)"; break;
+		}
+		break;
+	case 0x80:
+		switch (secondary) {
+		case 0x01: name = "Uighur (PRC)"; break;
+		}
+		break;
+	case 0x81:
+		switch (secondary) {
+		case 0x00: name = "Maori (New Zealand)"; break;
+		case 0x01: name = "Maori"; break;
+		}
+		break;
+	case 0x83:
+		switch (secondary) {
+		case 0x01: name = "Corsican (France)"; break;
+		}
+		break;
+	case 0x84:
+		switch (secondary) {
+		case 0x01: name = "Alsatian (France)"; break;
+		}
+		break;
+	case 0x85:
+		switch (secondary) {
+		case 0x01: name = "Yakut (Russia)"; break;
+		}
+		break;
+	case 0x86:
+		switch (secondary) {
+		case 0x01: name = "K'iche (Guatemala)"; break;
+		}
+		break;
+	case 0x87:
+		switch (secondary) {
+		case 0x01: name = "Kinyarwanda (Rwanda)"; break;
+		}
+		break;
+	case 0x88:
+		switch (secondary) {
+		case 0x01: name = "Wolof (Senegal)"; break;
+		}
+		break;
+	case 0x8c:
+		switch (secondary) {
+		case 0x01: name = "Dari (Afghanistan)"; break;
+		}
+		break;
+
+	default:
+		name = "Language Neutral";
+
+	}
+
+	if (!name)
+		name = "Language Neutral";
+
+	return copy_lang (lang_out, lang_len, name);
+}
+
+#endif /* ENABLE_NETCORE && DISABLE_PROCESSES */
+
+MONO_EMPTY_SOURCE_FILE (culture_w32_process_unix_language);

+ 6 - 5
mono/metadata/Makefile.am

@@ -160,6 +160,10 @@ libmonoruntime_shimglobalization_la_CFLAGS = @ICU_CFLAGS@ -I$(top_srcdir)/../lib
 endif
 endif
 
+if !ENABLE_NETCORE
+culture_libraries = ../culture/libmono-culture.la
+endif
+
 #
 # This library contains the icall tables if the runtime was configured with --disable-icall-tables
 #
@@ -254,8 +258,6 @@ common_sources = \
 	coree.c 		\
 	coree.h 		\
 	coree-internals.h \
-	culture-info.h  	\
-	culture-info-tables.h	\
 	debug-helpers.c		\
 	debug-mono-symfile.h	\
 	debug-mono-symfile.c	\
@@ -292,7 +294,6 @@ common_sources = \
 	loaded-images.c		\
 	loaded-images-global.c	\
 	loaded-images-netcore.c	\
-	locales.c		\
 	locales.h		\
 	lock-tracer.c		\
 	lock-tracer.h		\
@@ -449,12 +450,12 @@ if !ENABLE_MSVC_ONLY
 libmonoruntime_la_SOURCES = $(common_sources) $(icall_tables_sources) $(ilgen_sources) $(gc_dependent_sources) $(null_gc_sources) $(boehm_sources)
 # Add CXX_ADD_CFLAGS per-library until/unless https://github.com/dotnet/corefx/pull/31342.
 libmonoruntime_la_CFLAGS = $(BOEHM_DEFINES) @CXX_ADD_CFLAGS@
-libmonoruntime_la_LIBADD = libmonoruntime-config.la $(support_libraries) $(shim_libraries)
+libmonoruntime_la_LIBADD = libmonoruntime-config.la $(culture_libraries) $(support_libraries) $(shim_libraries)
 
 libmonoruntimesgen_la_SOURCES = $(common_sources) $(icall_tables_sources) $(ilgen_sources) $(gc_dependent_sources) $(sgen_sources)
 # Add CXX_ADD_CFLAGS per-library until/unless https://github.com/dotnet/corefx/pull/31342.
 libmonoruntimesgen_la_CFLAGS = $(SGEN_DEFINES) @CXX_ADD_CFLAGS@
-libmonoruntimesgen_la_LIBADD = libmonoruntime-config.la $(support_libraries) $(shim_libraries)
+libmonoruntimesgen_la_LIBADD = libmonoruntime-config.la $(culture_libraries) $(support_libraries) $(shim_libraries)
 
 endif # !ENABLE_MSVC_ONLY
 

+ 0 - 781
mono/metadata/w32process-unix.c

@@ -3486,787 +3486,6 @@ mono_w32process_ver_query_value (gconstpointer datablock, const gunichar2 *subbl
 	return(ret);
 }
 
-static guint32
-copy_lang (gunichar2 *lang_out, guint32 lang_len, const gchar *text)
-{
-	gunichar2 *unitext;
-	int chars = strlen (text);
-	int ret;
-
-	unitext = g_utf8_to_utf16 (text, -1, NULL, NULL, NULL);
-	g_assert (unitext != NULL);
-
-	if (chars < (lang_len - 1)) {
-		memcpy (lang_out, (gpointer)unitext, chars * 2);
-		lang_out[chars] = '\0';
-		ret = chars;
-	} else {
-		memcpy (lang_out, (gpointer)unitext, (lang_len - 1) * 2);
-		lang_out[lang_len] = '\0';
-		ret = lang_len;
-	}
-
-	g_free (unitext);
-
-	return(ret);
-}
-
-guint32
-mono_w32process_ver_language_name (guint32 lang, gunichar2 *lang_out, guint32 lang_len)
-{
-	int primary, secondary;
-	const char *name = NULL;
-
-	primary = lang & 0x3FF;
-	secondary = (lang >> 10) & 0x3F;
-
-	switch(primary) {
-	case 0x00:
-		switch (secondary) {
-		case 0x01: name = "Process Default Language"; break;
-		}
-		break;
-	case 0x01:
-		switch (secondary) {
-		case 0x00:
-		case 0x01: name = "Arabic (Saudi Arabia)"; break;
-		case 0x02: name = "Arabic (Iraq)"; break;
-		case 0x03: name = "Arabic (Egypt)"; break;
-		case 0x04: name = "Arabic (Libya)"; break;
-		case 0x05: name = "Arabic (Algeria)"; break;
-		case 0x06: name = "Arabic (Morocco)"; break;
-		case 0x07: name = "Arabic (Tunisia)"; break;
-		case 0x08: name = "Arabic (Oman)"; break;
-		case 0x09: name = "Arabic (Yemen)"; break;
-		case 0x0a: name = "Arabic (Syria)"; break;
-		case 0x0b: name = "Arabic (Jordan)"; break;
-		case 0x0c: name = "Arabic (Lebanon)"; break;
-		case 0x0d: name = "Arabic (Kuwait)"; break;
-		case 0x0e: name = "Arabic (U.A.E.)"; break;
-		case 0x0f: name = "Arabic (Bahrain)"; break;
-		case 0x10: name = "Arabic (Qatar)"; break;
-		}
-		break;
-	case 0x02:
-		switch (secondary) {
-		case 0x00: name = "Bulgarian (Bulgaria)"; break;
-		case 0x01: name = "Bulgarian"; break;
-		}
-		break;
-	case 0x03:
-		switch (secondary) {
-		case 0x00: name = "Catalan (Spain)"; break;
-		case 0x01: name = "Catalan"; break;
-		}
-		break;
-	case 0x04:
-		switch (secondary) {
-		case 0x00:
-		case 0x01: name = "Chinese (Taiwan)"; break;
-		case 0x02: name = "Chinese (PRC)"; break;
-		case 0x03: name = "Chinese (Hong Kong S.A.R.)"; break;
-		case 0x04: name = "Chinese (Singapore)"; break;
-		case 0x05: name = "Chinese (Macau S.A.R.)"; break;
-		}
-		break;
-	case 0x05:
-		switch (secondary) {
-		case 0x00: name = "Czech (Czech Republic)"; break;
-		case 0x01: name = "Czech"; break;
-		}
-		break;
-	case 0x06:
-		switch (secondary) {
-		case 0x00: name = "Danish (Denmark)"; break;
-		case 0x01: name = "Danish"; break;
-		}
-		break;
-	case 0x07:
-		switch (secondary) {
-		case 0x00:
-		case 0x01: name = "German (Germany)"; break;
-		case 0x02: name = "German (Switzerland)"; break;
-		case 0x03: name = "German (Austria)"; break;
-		case 0x04: name = "German (Luxembourg)"; break;
-		case 0x05: name = "German (Liechtenstein)"; break;
-		}
-		break;
-	case 0x08:
-		switch (secondary) {
-		case 0x00: name = "Greek (Greece)"; break;
-		case 0x01: name = "Greek"; break;
-		}
-		break;
-	case 0x09:
-		switch (secondary) {
-		case 0x00:
-		case 0x01: name = "English (United States)"; break;
-		case 0x02: name = "English (United Kingdom)"; break;
-		case 0x03: name = "English (Australia)"; break;
-		case 0x04: name = "English (Canada)"; break;
-		case 0x05: name = "English (New Zealand)"; break;
-		case 0x06: name = "English (Ireland)"; break;
-		case 0x07: name = "English (South Africa)"; break;
-		case 0x08: name = "English (Jamaica)"; break;
-		case 0x09: name = "English (Caribbean)"; break;
-		case 0x0a: name = "English (Belize)"; break;
-		case 0x0b: name = "English (Trinidad and Tobago)"; break;
-		case 0x0c: name = "English (Zimbabwe)"; break;
-		case 0x0d: name = "English (Philippines)"; break;
-		case 0x10: name = "English (India)"; break;
-		case 0x11: name = "English (Malaysia)"; break;
-		case 0x12: name = "English (Singapore)"; break;
-		}
-		break;
-	case 0x0a:
-		switch (secondary) {
-		case 0x00: name = "Spanish (Spain)"; break;
-		case 0x01: name = "Spanish (Traditional Sort)"; break;
-		case 0x02: name = "Spanish (Mexico)"; break;
-		case 0x03: name = "Spanish (International Sort)"; break;
-		case 0x04: name = "Spanish (Guatemala)"; break;
-		case 0x05: name = "Spanish (Costa Rica)"; break;
-		case 0x06: name = "Spanish (Panama)"; break;
-		case 0x07: name = "Spanish (Dominican Republic)"; break;
-		case 0x08: name = "Spanish (Venezuela)"; break;
-		case 0x09: name = "Spanish (Colombia)"; break;
-		case 0x0a: name = "Spanish (Peru)"; break;
-		case 0x0b: name = "Spanish (Argentina)"; break;
-		case 0x0c: name = "Spanish (Ecuador)"; break;
-		case 0x0d: name = "Spanish (Chile)"; break;
-		case 0x0e: name = "Spanish (Uruguay)"; break;
-		case 0x0f: name = "Spanish (Paraguay)"; break;
-		case 0x10: name = "Spanish (Bolivia)"; break;
-		case 0x11: name = "Spanish (El Salvador)"; break;
-		case 0x12: name = "Spanish (Honduras)"; break;
-		case 0x13: name = "Spanish (Nicaragua)"; break;
-		case 0x14: name = "Spanish (Puerto Rico)"; break;
-		case 0x15: name = "Spanish (United States)"; break;
-		}
-		break;
-	case 0x0b:
-		switch (secondary) {
-		case 0x00: name = "Finnish (Finland)"; break;
-		case 0x01: name = "Finnish"; break;
-		}
-		break;
-	case 0x0c:
-		switch (secondary) {
-		case 0x00:
-		case 0x01: name = "French (France)"; break;
-		case 0x02: name = "French (Belgium)"; break;
-		case 0x03: name = "French (Canada)"; break;
-		case 0x04: name = "French (Switzerland)"; break;
-		case 0x05: name = "French (Luxembourg)"; break;
-		case 0x06: name = "French (Monaco)"; break;
-		}
-		break;
-	case 0x0d:
-		switch (secondary) {
-		case 0x00: name = "Hebrew (Israel)"; break;
-		case 0x01: name = "Hebrew"; break;
-		}
-		break;
-	case 0x0e:
-		switch (secondary) {
-		case 0x00: name = "Hungarian (Hungary)"; break;
-		case 0x01: name = "Hungarian"; break;
-		}
-		break;
-	case 0x0f:
-		switch (secondary) {
-		case 0x00: name = "Icelandic (Iceland)"; break;
-		case 0x01: name = "Icelandic"; break;
-		}
-		break;
-	case 0x10:
-		switch (secondary) {
-		case 0x00:
-		case 0x01: name = "Italian (Italy)"; break;
-		case 0x02: name = "Italian (Switzerland)"; break;
-		}
-		break;
-	case 0x11:
-		switch (secondary) {
-		case 0x00: name = "Japanese (Japan)"; break;
-		case 0x01: name = "Japanese"; break;
-		}
-		break;
-	case 0x12:
-		switch (secondary) {
-		case 0x00: name = "Korean (Korea)"; break;
-		case 0x01: name = "Korean"; break;
-		}
-		break;
-	case 0x13:
-		switch (secondary) {
-		case 0x00:
-		case 0x01: name = "Dutch (Netherlands)"; break;
-		case 0x02: name = "Dutch (Belgium)"; break;
-		}
-		break;
-	case 0x14:
-		switch (secondary) {
-		case 0x00:
-		case 0x01: name = "Norwegian (Bokmal)"; break;
-		case 0x02: name = "Norwegian (Nynorsk)"; break;
-		}
-		break;
-	case 0x15:
-		switch (secondary) {
-		case 0x00: name = "Polish (Poland)"; break;
-		case 0x01: name = "Polish"; break;
-		}
-		break;
-	case 0x16:
-		switch (secondary) {
-		case 0x00:
-		case 0x01: name = "Portuguese (Brazil)"; break;
-		case 0x02: name = "Portuguese (Portugal)"; break;
-		}
-		break;
-	case 0x17:
-		switch (secondary) {
-		case 0x01: name = "Romansh (Switzerland)"; break;
-		}
-		break;
-	case 0x18:
-		switch (secondary) {
-		case 0x00: name = "Romanian (Romania)"; break;
-		case 0x01: name = "Romanian"; break;
-		}
-		break;
-	case 0x19:
-		switch (secondary) {
-		case 0x00: name = "Russian (Russia)"; break;
-		case 0x01: name = "Russian"; break;
-		}
-		break;
-	case 0x1a:
-		switch (secondary) {
-		case 0x00: name = "Croatian (Croatia)"; break;
-		case 0x01: name = "Croatian"; break;
-		case 0x02: name = "Serbian (Latin)"; break;
-		case 0x03: name = "Serbian (Cyrillic)"; break;
-		case 0x04: name = "Croatian (Bosnia and Herzegovina)"; break;
-		case 0x05: name = "Bosnian (Latin, Bosnia and Herzegovina)"; break;
-		case 0x06: name = "Serbian (Latin, Bosnia and Herzegovina)"; break;
-		case 0x07: name = "Serbian (Cyrillic, Bosnia and Herzegovina)"; break;
-		case 0x08: name = "Bosnian (Cyrillic, Bosnia and Herzegovina)"; break;
-		}
-		break;
-	case 0x1b:
-		switch (secondary) {
-		case 0x00: name = "Slovak (Slovakia)"; break;
-		case 0x01: name = "Slovak"; break;
-		}
-		break;
-	case 0x1c:
-		switch (secondary) {
-		case 0x00: name = "Albanian (Albania)"; break;
-		case 0x01: name = "Albanian"; break;
-		}
-		break;
-	case 0x1d:
-		switch (secondary) {
-		case 0x00: name = "Swedish (Sweden)"; break;
-		case 0x01: name = "Swedish"; break;
-		case 0x02: name = "Swedish (Finland)"; break;
-		}
-		break;
-	case 0x1e:
-		switch (secondary) {
-		case 0x00: name = "Thai (Thailand)"; break;
-		case 0x01: name = "Thai"; break;
-		}
-		break;
-	case 0x1f:
-		switch (secondary) {
-		case 0x00: name = "Turkish (Turkey)"; break;
-		case 0x01: name = "Turkish"; break;
-		}
-		break;
-	case 0x20:
-		switch (secondary) {
-		case 0x00: name = "Urdu (Islamic Republic of Pakistan)"; break;
-		case 0x01: name = "Urdu"; break;
-		}
-		break;
-	case 0x21:
-		switch (secondary) {
-		case 0x00: name = "Indonesian (Indonesia)"; break;
-		case 0x01: name = "Indonesian"; break;
-		}
-		break;
-	case 0x22:
-		switch (secondary) {
-		case 0x00: name = "Ukrainian (Ukraine)"; break;
-		case 0x01: name = "Ukrainian"; break;
-		}
-		break;
-	case 0x23:
-		switch (secondary) {
-		case 0x00: name = "Belarusian (Belarus)"; break;
-		case 0x01: name = "Belarusian"; break;
-		}
-		break;
-	case 0x24:
-		switch (secondary) {
-		case 0x00: name = "Slovenian (Slovenia)"; break;
-		case 0x01: name = "Slovenian"; break;
-		}
-		break;
-	case 0x25:
-		switch (secondary) {
-		case 0x00: name = "Estonian (Estonia)"; break;
-		case 0x01: name = "Estonian"; break;
-		}
-		break;
-	case 0x26:
-		switch (secondary) {
-		case 0x00: name = "Latvian (Latvia)"; break;
-		case 0x01: name = "Latvian"; break;
-		}
-		break;
-	case 0x27:
-		switch (secondary) {
-		case 0x00: name = "Lithuanian (Lithuania)"; break;
-		case 0x01: name = "Lithuanian"; break;
-		}
-		break;
-	case 0x28:
-		switch (secondary) {
-		case 0x01: name = "Tajik (Tajikistan)"; break;
-		}
-		break;
-	case 0x29:
-		switch (secondary) {
-		case 0x00: name = "Farsi (Iran)"; break;
-		case 0x01: name = "Farsi"; break;
-		}
-		break;
-	case 0x2a:
-		switch (secondary) {
-		case 0x00: name = "Vietnamese (Viet Nam)"; break;
-		case 0x01: name = "Vietnamese"; break;
-		}
-		break;
-	case 0x2b:
-		switch (secondary) {
-		case 0x00: name = "Armenian (Armenia)"; break;
-		case 0x01: name = "Armenian"; break;
-		}
-		break;
-	case 0x2c:
-		switch (secondary) {
-		case 0x00: name = "Azeri (Latin) (Azerbaijan)"; break;
-		case 0x01: name = "Azeri (Latin)"; break;
-		case 0x02: name = "Azeri (Cyrillic)"; break;
-		}
-		break;
-	case 0x2d:
-		switch (secondary) {
-		case 0x00: name = "Basque (Spain)"; break;
-		case 0x01: name = "Basque"; break;
-		}
-		break;
-	case 0x2e:
-		switch (secondary) {
-		case 0x01: name = "Upper Sorbian (Germany)"; break;
-		case 0x02: name = "Lower Sorbian (Germany)"; break;
-		}
-		break;
-	case 0x2f:
-		switch (secondary) {
-		case 0x00: name = "FYRO Macedonian (Former Yugoslav Republic of Macedonia)"; break;
-		case 0x01: name = "FYRO Macedonian"; break;
-		}
-		break;
-	case 0x32:
-		switch (secondary) {
-		case 0x00: name = "Tswana (South Africa)"; break;
-		case 0x01: name = "Tswana"; break;
-		}
-		break;
-	case 0x34:
-		switch (secondary) {
-		case 0x00: name = "Xhosa (South Africa)"; break;
-		case 0x01: name = "Xhosa"; break;
-		}
-		break;
-	case 0x35:
-		switch (secondary) {
-		case 0x00: name = "Zulu (South Africa)"; break;
-		case 0x01: name = "Zulu"; break;
-		}
-		break;
-	case 0x36:
-		switch (secondary) {
-		case 0x00: name = "Afrikaans (South Africa)"; break;
-		case 0x01: name = "Afrikaans"; break;
-		}
-		break;
-	case 0x37:
-		switch (secondary) {
-		case 0x00: name = "Georgian (Georgia)"; break;
-		case 0x01: name = "Georgian"; break;
-		}
-		break;
-	case 0x38:
-		switch (secondary) {
-		case 0x00: name = "Faroese (Faroe Islands)"; break;
-		case 0x01: name = "Faroese"; break;
-		}
-		break;
-	case 0x39:
-		switch (secondary) {
-		case 0x00: name = "Hindi (India)"; break;
-		case 0x01: name = "Hindi"; break;
-		}
-		break;
-	case 0x3a:
-		switch (secondary) {
-		case 0x00: name = "Maltese (Malta)"; break;
-		case 0x01: name = "Maltese"; break;
-		}
-		break;
-	case 0x3b:
-		switch (secondary) {
-		case 0x00: name = "Sami (Northern) (Norway)"; break;
-		case 0x01: name = "Sami, Northern (Norway)"; break;
-		case 0x02: name = "Sami, Northern (Sweden)"; break;
-		case 0x03: name = "Sami, Northern (Finland)"; break;
-		case 0x04: name = "Sami, Lule (Norway)"; break;
-		case 0x05: name = "Sami, Lule (Sweden)"; break;
-		case 0x06: name = "Sami, Southern (Norway)"; break;
-		case 0x07: name = "Sami, Southern (Sweden)"; break;
-		case 0x08: name = "Sami, Skolt (Finland)"; break;
-		case 0x09: name = "Sami, Inari (Finland)"; break;
-		}
-		break;
-	case 0x3c:
-		switch (secondary) {
-		case 0x02: name = "Irish (Ireland)"; break;
-		}
-		break;
-	case 0x3e:
-		switch (secondary) {
-		case 0x00:
-		case 0x01: name = "Malay (Malaysia)"; break;
-		case 0x02: name = "Malay (Brunei Darussalam)"; break;
-		}
-		break;
-	case 0x3f:
-		switch (secondary) {
-		case 0x00: name = "Kazakh (Kazakhstan)"; break;
-		case 0x01: name = "Kazakh"; break;
-		}
-		break;
-	case 0x40:
-		switch (secondary) {
-		case 0x00: name = "Kyrgyz (Kyrgyzstan)"; break;
-		case 0x01: name = "Kyrgyz (Cyrillic)"; break;
-		}
-		break;
-	case 0x41:
-		switch (secondary) {
-		case 0x00: name = "Swahili (Kenya)"; break;
-		case 0x01: name = "Swahili"; break;
-		}
-		break;
-	case 0x42:
-		switch (secondary) {
-		case 0x01: name = "Turkmen (Turkmenistan)"; break;
-		}
-		break;
-	case 0x43:
-		switch (secondary) {
-		case 0x00: name = "Uzbek (Latin) (Uzbekistan)"; break;
-		case 0x01: name = "Uzbek (Latin)"; break;
-		case 0x02: name = "Uzbek (Cyrillic)"; break;
-		}
-		break;
-	case 0x44:
-		switch (secondary) {
-		case 0x00: name = "Tatar (Russia)"; break;
-		case 0x01: name = "Tatar"; break;
-		}
-		break;
-	case 0x45:
-		switch (secondary) {
-		case 0x00:
-		case 0x01: name = "Bengali (India)"; break;
-		}
-		break;
-	case 0x46:
-		switch (secondary) {
-		case 0x00: name = "Punjabi (India)"; break;
-		case 0x01: name = "Punjabi"; break;
-		}
-		break;
-	case 0x47:
-		switch (secondary) {
-		case 0x00: name = "Gujarati (India)"; break;
-		case 0x01: name = "Gujarati"; break;
-		}
-		break;
-	case 0x49:
-		switch (secondary) {
-		case 0x00: name = "Tamil (India)"; break;
-		case 0x01: name = "Tamil"; break;
-		}
-		break;
-	case 0x4a:
-		switch (secondary) {
-		case 0x00: name = "Telugu (India)"; break;
-		case 0x01: name = "Telugu"; break;
-		}
-		break;
-	case 0x4b:
-		switch (secondary) {
-		case 0x00: name = "Kannada (India)"; break;
-		case 0x01: name = "Kannada"; break;
-		}
-		break;
-	case 0x4c:
-		switch (secondary) {
-		case 0x00:
-		case 0x01: name = "Malayalam (India)"; break;
-		}
-		break;
-	case 0x4d:
-		switch (secondary) {
-		case 0x01: name = "Assamese (India)"; break;
-		}
-		break;
-	case 0x4e:
-		switch (secondary) {
-		case 0x00: name = "Marathi (India)"; break;
-		case 0x01: name = "Marathi"; break;
-		}
-		break;
-	case 0x4f:
-		switch (secondary) {
-		case 0x00: name = "Sanskrit (India)"; break;
-		case 0x01: name = "Sanskrit"; break;
-		}
-		break;
-	case 0x50:
-		switch (secondary) {
-		case 0x00: name = "Mongolian (Mongolia)"; break;
-		case 0x01: name = "Mongolian (Cyrillic)"; break;
-		case 0x02: name = "Mongolian (PRC)"; break;
-		}
-		break;
-	case 0x51:
-		switch (secondary) {
-		case 0x01: name = "Tibetan (PRC)"; break;
-		case 0x02: name = "Tibetan (Bhutan)"; break;
-		}
-		break;
-	case 0x52:
-		switch (secondary) {
-		case 0x00: name = "Welsh (United Kingdom)"; break;
-		case 0x01: name = "Welsh"; break;
-		}
-		break;
-	case 0x53:
-		switch (secondary) {
-		case 0x01: name = "Khmer (Cambodia)"; break;
-		}
-		break;
-	case 0x54:
-		switch (secondary) {
-		case 0x01: name = "Lao (Lao PDR)"; break;
-		}
-		break;
-	case 0x56:
-		switch (secondary) {
-		case 0x00: name = "Galician (Spain)"; break;
-		case 0x01: name = "Galician"; break;
-		}
-		break;
-	case 0x57:
-		switch (secondary) {
-		case 0x00: name = "Konkani (India)"; break;
-		case 0x01: name = "Konkani"; break;
-		}
-		break;
-	case 0x5a:
-		switch (secondary) {
-		case 0x00: name = "Syriac (Syria)"; break;
-		case 0x01: name = "Syriac"; break;
-		}
-		break;
-	case 0x5b:
-		switch (secondary) {
-		case 0x01: name = "Sinhala (Sri Lanka)"; break;
-		}
-		break;
-	case 0x5d:
-		switch (secondary) {
-		case 0x01: name = "Inuktitut (Syllabics, Canada)"; break;
-		case 0x02: name = "Inuktitut (Latin, Canada)"; break;
-		}
-		break;
-	case 0x5e:
-		switch (secondary) {
-		case 0x01: name = "Amharic (Ethiopia)"; break;
-		}
-		break;
-	case 0x5f:
-		switch (secondary) {
-		case 0x02: name = "Tamazight (Algeria, Latin)"; break;
-		}
-		break;
-	case 0x61:
-		switch (secondary) {
-		case 0x01: name = "Nepali (Nepal)"; break;
-		}
-		break;
-	case 0x62:
-		switch (secondary) {
-		case 0x01: name = "Frisian (Netherlands)"; break;
-		}
-		break;
-	case 0x63:
-		switch (secondary) {
-		case 0x01: name = "Pashto (Afghanistan)"; break;
-		}
-		break;
-	case 0x64:
-		switch (secondary) {
-		case 0x01: name = "Filipino (Philippines)"; break;
-		}
-		break;
-	case 0x65:
-		switch (secondary) {
-		case 0x00: name = "Divehi (Maldives)"; break;
-		case 0x01: name = "Divehi"; break;
-		}
-		break;
-	case 0x68:
-		switch (secondary) {
-		case 0x01: name = "Hausa (Nigeria, Latin)"; break;
-		}
-		break;
-	case 0x6a:
-		switch (secondary) {
-		case 0x01: name = "Yoruba (Nigeria)"; break;
-		}
-		break;
-	case 0x6b:
-		switch (secondary) {
-		case 0x00:
-		case 0x01: name = "Quechua (Bolivia)"; break;
-		case 0x02: name = "Quechua (Ecuador)"; break;
-		case 0x03: name = "Quechua (Peru)"; break;
-		}
-		break;
-	case 0x6c:
-		switch (secondary) {
-		case 0x00: name = "Northern Sotho (South Africa)"; break;
-		case 0x01: name = "Northern Sotho"; break;
-		}
-		break;
-	case 0x6d:
-		switch (secondary) {
-		case 0x01: name = "Bashkir (Russia)"; break;
-		}
-		break;
-	case 0x6e:
-		switch (secondary) {
-		case 0x01: name = "Luxembourgish (Luxembourg)"; break;
-		}
-		break;
-	case 0x6f:
-		switch (secondary) {
-		case 0x01: name = "Greenlandic (Greenland)"; break;
-		}
-		break;
-	case 0x78:
-		switch (secondary) {
-		case 0x01: name = "Yi (PRC)"; break;
-		}
-		break;
-	case 0x7a:
-		switch (secondary) {
-		case 0x01: name = "Mapudungun (Chile)"; break;
-		}
-		break;
-	case 0x7c:
-		switch (secondary) {
-		case 0x01: name = "Mohawk (Mohawk)"; break;
-		}
-		break;
-	case 0x7e:
-		switch (secondary) {
-		case 0x01: name = "Breton (France)"; break;
-		}
-		break;
-	case 0x7f:
-		switch (secondary) {
-		case 0x00: name = "Invariant Language (Invariant Country)"; break;
-		}
-		break;
-	case 0x80:
-		switch (secondary) {
-		case 0x01: name = "Uighur (PRC)"; break;
-		}
-		break;
-	case 0x81:
-		switch (secondary) {
-		case 0x00: name = "Maori (New Zealand)"; break;
-		case 0x01: name = "Maori"; break;
-		}
-		break;
-	case 0x83:
-		switch (secondary) {
-		case 0x01: name = "Corsican (France)"; break;
-		}
-		break;
-	case 0x84:
-		switch (secondary) {
-		case 0x01: name = "Alsatian (France)"; break;
-		}
-		break;
-	case 0x85:
-		switch (secondary) {
-		case 0x01: name = "Yakut (Russia)"; break;
-		}
-		break;
-	case 0x86:
-		switch (secondary) {
-		case 0x01: name = "K'iche (Guatemala)"; break;
-		}
-		break;
-	case 0x87:
-		switch (secondary) {
-		case 0x01: name = "Kinyarwanda (Rwanda)"; break;
-		}
-		break;
-	case 0x88:
-		switch (secondary) {
-		case 0x01: name = "Wolof (Senegal)"; break;
-		}
-		break;
-	case 0x8c:
-		switch (secondary) {
-		case 0x01: name = "Dari (Afghanistan)"; break;
-		}
-		break;
-
-	default:
-		name = "Language Neutral";
-
-	}
-
-	if (!name)
-		name = "Language Neutral";
-
-	return copy_lang (lang_out, lang_len, name);
-}
-
 #else /* ENABLE_NETCORE && DISABLE_PROCESSES */
 
 void

+ 3 - 3
msvc/libmonoruntime-common.targets

@@ -28,8 +28,8 @@
     <ClCompile Include="$(MonoSourceLocation)\mono\metadata\coree.c" />
     <ClInclude Include="$(MonoSourceLocation)\mono\metadata\coree.h" />
     <ClInclude Include="$(MonoSourceLocation)\mono\metadata\coree-internals.h" />
-    <ClInclude Include="$(MonoSourceLocation)\mono\metadata\culture-info.h" />
-    <ClInclude Include="$(MonoSourceLocation)\mono\metadata\culture-info-tables.h" />
+    <ClInclude Include="$(MonoSourceLocation)\mono\culture\culture-info.h" />
+    <ClInclude Include="$(MonoSourceLocation)\mono\culture\culture-info-tables.h" />
     <ClCompile Include="$(MonoSourceLocation)\mono\metadata\debug-helpers.c" />
     <ClCompile Include="$(MonoSourceLocation)\mono\metadata\debug-mono-symfile.c" />
     <ClInclude Include="$(MonoSourceLocation)\mono\metadata\debug-mono-ppdb.h" />
@@ -62,7 +62,7 @@
     <ClCompile Include="$(MonoSourceLocation)\mono\metadata\loaded-images-netcore.c" />
     <ClCompile Include="$(MonoSourceLocation)\mono\metadata\loader.c" />
     <ClInclude Include="$(MonoSourceLocation)\mono\metadata\loader-internals.h" />
-    <ClCompile Include="$(MonoSourceLocation)\mono\metadata\locales.c" />
+    <ClCompile Include="$(MonoSourceLocation)\mono\culture\locales.c" Condition="Exists('$(MonoSourceLocation)\mono\culture\locales.c')" />
     <ClInclude Include="$(MonoSourceLocation)\mono\metadata\locales.h" />
     <ClCompile Include="$(MonoSourceLocation)\mono\metadata\lock-tracer.c" />
     <ClInclude Include="$(MonoSourceLocation)\mono\metadata\lock-tracer.h" />

+ 3 - 3
msvc/libmonoruntime-common.targets.filters

@@ -73,10 +73,10 @@
     <ClInclude Include="$(MonoSourceLocation)\mono\metadata\coree-internals.h">
       <Filter>Header Files$(MonoRuntimeFilterSubFolder)\common</Filter>
     </ClInclude>
-    <ClInclude Include="$(MonoSourceLocation)\mono\metadata\culture-info.h">
+    <ClInclude Include="$(MonoSourceLocation)\mono\culture\culture-info.h">
       <Filter>Header Files$(MonoRuntimeFilterSubFolder)\common</Filter>
     </ClInclude>
-    <ClInclude Include="$(MonoSourceLocation)\mono\metadata\culture-info-tables.h">
+    <ClInclude Include="$(MonoSourceLocation)\mono\culture\culture-info-tables.h">
       <Filter>Header Files$(MonoRuntimeFilterSubFolder)\common</Filter>
     </ClInclude>
     <ClCompile Include="$(MonoSourceLocation)\mono\metadata\debug-helpers.c">
@@ -175,7 +175,7 @@
     <ClInclude Include="$(MonoSourceLocation)\mono\metadata\loader-internals.h">
       <Filter>Header Files$(MonoRuntimeFilterSubFolder)\common</Filter>
     </ClInclude>
-    <ClCompile Include="$(MonoSourceLocation)\mono\metadata\locales.c">
+    <ClCompile Include="$(MonoSourceLocation)\mono\culture\locales.c">
       <Filter>Source Files$(MonoRuntimeFilterSubFolder)\common</Filter>
     </ClCompile>
     <ClInclude Include="$(MonoSourceLocation)\mono\metadata\locales.h">