mirror of
https://github.com/2003scape/deep-c-rsc.git
synced 2024-03-22 05:49:51 -04:00
1051 lines
32 KiB
Java
1051 lines
32 KiB
Java
![]() |
/*
|
||
|
* @(#) $(JCGO)/goclsp/vm/gnu/classpath/VMSystemProperties.java --
|
||
|
* VM specific methods for VM system properties initialization.
|
||
|
**
|
||
|
* Project: JCGO (http://www.ivmaisoft.com/jcgo/)
|
||
|
* Copyright (C) 2001-2013 Ivan Maidanski <ivmai@mail.ru>
|
||
|
* All rights reserved.
|
||
|
**
|
||
|
* Class specification origin: GNU Classpath v0.93 vm/reference
|
||
|
*/
|
||
|
|
||
|
/*
|
||
|
* This is free software; you can redistribute it and/or modify
|
||
|
* it under the terms of the GNU General Public License as published by
|
||
|
* the Free Software Foundation; either version 2, or (at your option)
|
||
|
* any later version.
|
||
|
**
|
||
|
* This software is distributed in the hope that it will be useful, but
|
||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||
|
* General Public License (GPL) for more details.
|
||
|
**
|
||
|
* Linking this library statically or dynamically with other modules is
|
||
|
* making a combined work based on this library. Thus, the terms and
|
||
|
* conditions of the GNU General Public License cover the whole
|
||
|
* combination.
|
||
|
**
|
||
|
* As a special exception, the copyright holders of this library give you
|
||
|
* permission to link this library with independent modules to produce an
|
||
|
* executable, regardless of the license terms of these independent
|
||
|
* modules, and to copy and distribute the resulting executable under
|
||
|
* terms of your choice, provided that you also meet, for each linked
|
||
|
* independent module, the terms and conditions of the license of that
|
||
|
* module. An independent module is a module which is not derived from
|
||
|
* or based on this library. If you modify this library, you may extend
|
||
|
* this exception to your version of the library, but you are not
|
||
|
* obligated to do so. If you do not wish to do so, delete this
|
||
|
* exception statement from your version.
|
||
|
*/
|
||
|
|
||
|
package gnu.classpath;
|
||
|
|
||
|
import java.io.IOException;
|
||
|
import java.io.OutputStream;
|
||
|
import java.io.OutputStreamWriter;
|
||
|
import java.io.UnsupportedEncodingException;
|
||
|
import java.io.VMAccessorJavaIo;
|
||
|
|
||
|
import java.util.Properties;
|
||
|
|
||
|
final class VMSystemProperties
|
||
|
{
|
||
|
|
||
|
private static final String[] LOCALE_INFO_TABLE =
|
||
|
{
|
||
|
"Abkhazian", "ab", "AB",
|
||
|
"Albanian", "sq", "AL",
|
||
|
"Arabic", "ar", "EG",
|
||
|
"Armenian", "hy", "AM",
|
||
|
"Azerbaijani", "az", "AZ",
|
||
|
"Bashkir", "ba", "RU",
|
||
|
"Basque", "eu", "ES",
|
||
|
"Belarusian", "be", "BY",
|
||
|
"Breton", "br", "FR",
|
||
|
"Bulgarian", "bg", "BG",
|
||
|
"Catalan", "ca", "ES",
|
||
|
"Chinese", "zh", "CN",
|
||
|
"Croatian", "hr", "HR",
|
||
|
"Czech", "cs", "CZ",
|
||
|
"Danish", "da", "DK",
|
||
|
"Dutch", "nl", "NL",
|
||
|
"English", "en", "US",
|
||
|
"Esperanto", "eo", "",
|
||
|
"Estonian", "et", "EE",
|
||
|
"Faroese", "fo", "FO",
|
||
|
"Fijian", "fj", "FJ",
|
||
|
"Finnish", "fi", "FI",
|
||
|
"French", "fr", "FR",
|
||
|
"Gallegan", "gl", "ES",
|
||
|
"Georgian", "ka", "GE",
|
||
|
"German", "de", "DE",
|
||
|
"Greek", "el", "GR",
|
||
|
"Hebrew", "he", "IL",
|
||
|
"Hindi", "hi", "IN",
|
||
|
"Hungarian", "hu", "HU",
|
||
|
"Icelandic", "is", "IS",
|
||
|
"Indonesian", "id", "ID",
|
||
|
"Interlingua", "ia", "",
|
||
|
"Interlingue", "ie", "",
|
||
|
"Irish", "ga", "IE",
|
||
|
"Italian", "it", "IT",
|
||
|
"Japanese", "ja", "JP",
|
||
|
"Kalaallisut", "kl", "GL",
|
||
|
"Kannada", "kn", "CA",
|
||
|
"Kashmiri", "ks", "IN",
|
||
|
"Kazakh", "kk", "KZ",
|
||
|
"Kirghiz", "ky", "KG",
|
||
|
"Korean", "ko", "KR",
|
||
|
"Kurdish", "ku", "TR",
|
||
|
"Latin", "la", "",
|
||
|
"Latvian", "lv", "LV",
|
||
|
"Lithuanian", "lt", "LT",
|
||
|
"Macedonian", "mk", "MK",
|
||
|
"Moldavian", "mo", "MD",
|
||
|
"Mongolian", "mn", "MN",
|
||
|
"Nepali", "ne", "NP",
|
||
|
"Norwegian", "no", "NO",
|
||
|
"Occitan", "oc", "RU",
|
||
|
"Pashto", "ps", "AF",
|
||
|
"Polish", "pl", "PL",
|
||
|
"Portuguese", "pt", "PT",
|
||
|
"Romanian", "ro", "RO",
|
||
|
"Russian", "ru", "RU",
|
||
|
"Samoan", "sm", "WS",
|
||
|
"Scottish", "gd", "GB",
|
||
|
"Serbian", "sr", "YU",
|
||
|
"Serbo", "sh", "YU",
|
||
|
"Slovak", "sk", "SK",
|
||
|
"Slovenian", "sl", "SI",
|
||
|
"Somali", "so", "SO",
|
||
|
"Spanish", "es", "ES",
|
||
|
"Sundanese", "su", "SD",
|
||
|
"Swedish", "sv", "SE",
|
||
|
"Tajik", "tg", "TJ",
|
||
|
"Tatar", "tt", "RU",
|
||
|
"Thai", "th", "TH",
|
||
|
"Tibetan", "bo", "CN",
|
||
|
"Turkish", "tr", "TR",
|
||
|
"Turkmen", "tk", "TM",
|
||
|
"Ukrainian", "uk", "UA",
|
||
|
"Uzbek", "uz", "UZ",
|
||
|
"Vietnamese", "vi", "VN",
|
||
|
"Welsh", "cy", "GB",
|
||
|
"Yiddish", "yi", "IL",
|
||
|
};
|
||
|
|
||
|
private static volatile String fileEncoding;
|
||
|
|
||
|
private static volatile String consoleEncoding;
|
||
|
|
||
|
private VMSystemProperties() {}
|
||
|
|
||
|
static void preInit(Properties properties)
|
||
|
{
|
||
|
preInitOsSpec(properties);
|
||
|
SystemProperties.setProperties(null);
|
||
|
preInitLocaleInfo(properties);
|
||
|
SystemProperties.setProperties(null);
|
||
|
preInitJavaInfo(properties);
|
||
|
preInitClassNames(properties);
|
||
|
preInitDirectories(properties);
|
||
|
}
|
||
|
|
||
|
static void postInit(Properties properties)
|
||
|
{
|
||
|
postInitSunSpec(properties);
|
||
|
CustomProperties.initCustomProps(properties);
|
||
|
postInitEnvCustom(properties);
|
||
|
}
|
||
|
|
||
|
static final String getFileEncoding()
|
||
|
{ /* used by VM classes only */
|
||
|
if (fileEncoding == null)
|
||
|
{
|
||
|
String encoding = getenvPlatform("CODEPAGE");
|
||
|
fileEncoding = mapEncodingValue(encoding == null &&
|
||
|
((encoding = getFileConsoleEncoding0(0)) == null ||
|
||
|
encoding.length() == 0) && (encoding =
|
||
|
getEncodingFromLocale(getCTypeLocale())).length() == 0 ?
|
||
|
mapCodePageToEncoding(getFileConsoleCodePage0(0)) :
|
||
|
encoding);
|
||
|
}
|
||
|
return fileEncoding;
|
||
|
}
|
||
|
|
||
|
static final String getConsoleEncoding(OutputStream out)
|
||
|
{ /* used by VM classes only */
|
||
|
if (consoleEncoding == null)
|
||
|
{
|
||
|
String encoding = getenvPlatform("CONSOLE_CODEPAGE");
|
||
|
if (encoding != null ? encoding.equals("0") :
|
||
|
((encoding = getFileConsoleEncoding0(1)) == null ||
|
||
|
encoding.length() == 0) && (encoding = mapCodePageToEncoding(
|
||
|
getFileConsoleCodePage0(1))).length() == 0)
|
||
|
consoleEncoding = getFileEncoding();
|
||
|
else
|
||
|
{
|
||
|
if (out != null)
|
||
|
{
|
||
|
try
|
||
|
{
|
||
|
new OutputStreamWriter(out, getFileEncoding());
|
||
|
}
|
||
|
catch (UnsupportedEncodingException e) {}
|
||
|
}
|
||
|
consoleEncoding = mapEncodingValue(encoding);
|
||
|
}
|
||
|
}
|
||
|
return consoleEncoding;
|
||
|
}
|
||
|
|
||
|
private static void preInitOsSpec(Properties properties)
|
||
|
{
|
||
|
properties.setProperty("gnu.cpu.endian",
|
||
|
isCpuUnicodeEndianLittle0(0) != 0 ? "little" : "big");
|
||
|
properties.setProperty("line.separator",
|
||
|
VMAccessorJavaIo.getLineSeparatorVMFile());
|
||
|
properties.setProperty("file.separator",
|
||
|
VMAccessorJavaIo.getFileSeparatorVMFile());
|
||
|
properties.setProperty("path.separator",
|
||
|
VMAccessorJavaIo.getPathSeparatorVMFile());
|
||
|
String osName = getOsNameVersion0(0);
|
||
|
properties.setProperty("os.name", osName);
|
||
|
int archDataModel = getArchDataModel0();
|
||
|
properties.setProperty("os.arch", getOsArch(osName, archDataModel));
|
||
|
properties.setProperty("os.version", getOsVersion());
|
||
|
properties.setProperty("sun.arch.data.model",
|
||
|
String.valueOf(archDataModel));
|
||
|
}
|
||
|
|
||
|
private static void preInitLocaleInfo(Properties properties)
|
||
|
{
|
||
|
properties.setProperty("user.name", getUserName());
|
||
|
String cLocale = getCTypeLocale();
|
||
|
String lang = getUserLanguage(cLocale);
|
||
|
String country = getUserCountry(cLocale, lang);
|
||
|
properties.setProperty("user.language", adjustUserLanguage(lang, country));
|
||
|
properties.setProperty("user.country", country);
|
||
|
properties.setProperty("user.region", country);
|
||
|
properties.setProperty("file.encoding", getFileEncoding());
|
||
|
properties.setProperty("user.variant", getUserVariant(cLocale));
|
||
|
properties.setProperty("user.timezone", getUserTimezone());
|
||
|
}
|
||
|
|
||
|
private static void preInitJavaInfo(Properties properties)
|
||
|
{
|
||
|
properties.setProperty("java.class.version",
|
||
|
VMVendorInfo.JAVA_CLASS_VERSION);
|
||
|
properties.setProperty("java.runtime.name", VMVendorInfo.JAVA_RUNTIME_NAME);
|
||
|
properties.setProperty("java.runtime.version",
|
||
|
VMVendorInfo.JAVA_RUNTIME_VERSION);
|
||
|
properties.setProperty("java.specification.name",
|
||
|
VMVendorInfo.JAVA_SPECIFICATION_NAME);
|
||
|
properties.setProperty("java.specification.vendor",
|
||
|
VMVendorInfo.JAVA_SPECIFICATION_VENDOR);
|
||
|
properties.setProperty("java.specification.version",
|
||
|
VMVendorInfo.JAVA_SPECIFICATION_VERSION);
|
||
|
properties.setProperty("java.vendor", VMVendorInfo.JAVA_VENDOR);
|
||
|
properties.setProperty("java.vendor.url", VMVendorInfo.JAVA_VENDOR_URL);
|
||
|
properties.setProperty("java.vendor.url.bug",
|
||
|
VMVendorInfo.JAVA_VENDOR_URL_BUG);
|
||
|
properties.setProperty("java.version", VMVendorInfo.JAVA_VERSION);
|
||
|
properties.setProperty("java.vm.info", VMVendorInfo.JAVA_VM_INFO);
|
||
|
properties.setProperty("java.vm.name", VMVendorInfo.JAVA_VM_NAME);
|
||
|
properties.setProperty("java.vm.specification.name",
|
||
|
VMVendorInfo.JAVA_VM_SPECIFICATION_NAME);
|
||
|
properties.setProperty("java.vm.specification.vendor",
|
||
|
VMVendorInfo.JAVA_VM_SPECIFICATION_VENDOR);
|
||
|
properties.setProperty("java.vm.specification.version",
|
||
|
VMVendorInfo.JAVA_VM_SPECIFICATION_VERSION);
|
||
|
properties.setProperty("java.vm.vendor", VMVendorInfo.JAVA_VM_VENDOR);
|
||
|
properties.setProperty("java.vm.vendor.url",
|
||
|
VMVendorInfo.JAVA_VM_VENDOR_URL);
|
||
|
properties.setProperty("java.vm.version",
|
||
|
VMAccessorJavaLang.getJavaVmVersionVMRuntime());
|
||
|
}
|
||
|
|
||
|
private static void preInitClassNames(Properties properties)
|
||
|
{
|
||
|
properties.setProperty("java.compiler", getJavaCompiler());
|
||
|
}
|
||
|
|
||
|
private static void preInitDirectories(Properties properties)
|
||
|
{
|
||
|
String fileSep = properties.getProperty("file.separator");
|
||
|
String pathSep = properties.getProperty("path.separator");
|
||
|
String userDir = getUserDir();
|
||
|
properties.setProperty("user.dir", userDir);
|
||
|
properties.setProperty("user.home", getUserHome(userDir, fileSep));
|
||
|
properties.setProperty("java.io.tmpdir", getJavaIoTmpdir(fileSep));
|
||
|
String progPathname = getProgramExePathname();
|
||
|
String progHome = getProgramHome(progPathname, fileSep);
|
||
|
String javaHome = getJavaHome(progHome);
|
||
|
properties.setProperty("java.home", javaHome);
|
||
|
properties.setProperty("java.boot.class.path",
|
||
|
getJavaBootClassPath(javaHome, progHome, fileSep, pathSep));
|
||
|
properties.setProperty("java.class.path",
|
||
|
getJavaClassPath(progHome, progPathname, userDir, fileSep, pathSep));
|
||
|
properties.setProperty("gnu.classpath.boot.library.path",
|
||
|
getGnuClasspathBootLibraryPath(javaHome, fileSep, pathSep));
|
||
|
properties.setProperty("java.library.path",
|
||
|
getJavaLibraryPath(javaHome, fileSep, pathSep));
|
||
|
properties.setProperty("java.ext.dirs", getJavaExtDirs(javaHome, fileSep));
|
||
|
String classpathHome = getGnuClasspathHome();
|
||
|
if (classpathHome != null)
|
||
|
properties.setProperty("gnu.classpath.home", classpathHome);
|
||
|
}
|
||
|
|
||
|
private static void postInitSunSpec(Properties properties)
|
||
|
{
|
||
|
properties.setProperty("sun.boot.class.path",
|
||
|
properties.getProperty("java.boot.class.path"));
|
||
|
properties.setProperty("sun.boot.library.path",
|
||
|
properties.getProperty("gnu.classpath.boot.library.path"));
|
||
|
String cpuEndian = properties.getProperty("gnu.cpu.endian");
|
||
|
properties.setProperty("sun.cpu.endian", cpuEndian);
|
||
|
properties.setProperty("sun.io.unicode.encoding",
|
||
|
isUnicodeEncodingLittle(properties.getProperty("os.name"), cpuEndian) ?
|
||
|
"UnicodeLittle" : "UnicodeBig");
|
||
|
}
|
||
|
|
||
|
private static boolean isUnicodeEncodingLittle(String osName,
|
||
|
String cpuEndian)
|
||
|
{
|
||
|
String encoding = getenvPlatform("UNICODE_ENCODING");
|
||
|
int isLittle;
|
||
|
return "UnicodeLittle".equals(encoding) || "little".equals(encoding) ||
|
||
|
(!"UnicodeBig".equals(encoding) && !"big".equals(encoding) &&
|
||
|
((isLittle = isCpuUnicodeEndianLittle0(1)) > 0 || (isLittle < 0 &&
|
||
|
(osName.startsWith("Windows") || (!osName.startsWith("SunOS") &&
|
||
|
!osName.startsWith("Solaris") && cpuEndian.equals("little"))))));
|
||
|
}
|
||
|
|
||
|
private static void postInitEnvCustom(Properties properties)
|
||
|
{
|
||
|
String propsLine = VMAccessorJavaLang.getCustomJavaPropsVMRuntime();
|
||
|
int len = propsLine.length();
|
||
|
if (len > 0)
|
||
|
{
|
||
|
int start = -2;
|
||
|
String name = null;
|
||
|
boolean quoted = false;
|
||
|
int pos = 0;
|
||
|
do
|
||
|
{
|
||
|
char ch = propsLine.charAt(pos);
|
||
|
if (ch == '"' || (ch == '\\' && pos + 1 < len &&
|
||
|
(propsLine.charAt(pos + 1) == '\\' ||
|
||
|
propsLine.charAt(pos + 1) == '"')))
|
||
|
{
|
||
|
if (start >= 0)
|
||
|
{
|
||
|
propsLine = propsLine.substring(start, pos) +
|
||
|
propsLine.substring(pos + 1);
|
||
|
pos -= start + 1;
|
||
|
len -= start + 1;
|
||
|
start = 0;
|
||
|
}
|
||
|
if (ch == '"')
|
||
|
{
|
||
|
quoted = !quoted;
|
||
|
continue;
|
||
|
}
|
||
|
ch = propsLine.charAt(++pos);
|
||
|
}
|
||
|
if (start == -1 && ((ch != ' ' && ch != '\t') || quoted))
|
||
|
start = pos;
|
||
|
if (start >= 0)
|
||
|
{
|
||
|
if (ch == ' ' || ch == '\t')
|
||
|
{
|
||
|
if (!quoted)
|
||
|
{
|
||
|
String value = propsLine.substring(start, pos);
|
||
|
if (name != null)
|
||
|
{
|
||
|
if (name.length() > 0)
|
||
|
properties.setProperty(name, value);
|
||
|
value = null;
|
||
|
}
|
||
|
start = -2;
|
||
|
name = value;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if ((ch == '=' || ch == ':') && name == null)
|
||
|
{
|
||
|
name = propsLine.substring(start, pos);
|
||
|
start = -1;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (start < -1)
|
||
|
{
|
||
|
if (ch != ' ' && ch != '\t')
|
||
|
{
|
||
|
if (name != null)
|
||
|
{
|
||
|
start = -1;
|
||
|
if (ch != '=' && ch != ':')
|
||
|
{
|
||
|
if (name.length() > 0)
|
||
|
properties.setProperty(name, "");
|
||
|
start--;
|
||
|
name = null;
|
||
|
}
|
||
|
}
|
||
|
if (start == -2)
|
||
|
{
|
||
|
start--;
|
||
|
if (ch == '-' && pos + 1 < len && propsLine.charAt(pos + 1) == 'D')
|
||
|
{
|
||
|
start = -1;
|
||
|
pos++;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (start < -2 && !quoted)
|
||
|
start++;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (name != null && pos + 1 < len && propsLine.charAt(pos + 1) == '-')
|
||
|
{
|
||
|
if (name.length() > 0)
|
||
|
properties.setProperty(name, "");
|
||
|
start--;
|
||
|
name = null;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
} while (++pos < len);
|
||
|
if (start >= 0 || name != null)
|
||
|
{
|
||
|
String value = "";
|
||
|
if (start >= 0)
|
||
|
{
|
||
|
value = propsLine.substring(start);
|
||
|
if (name == null)
|
||
|
{
|
||
|
name = value;
|
||
|
value = "";
|
||
|
}
|
||
|
}
|
||
|
if (name.length() > 0)
|
||
|
properties.setProperty(name, value);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private static String getOsArch(String osName, int archDataModel)
|
||
|
{
|
||
|
String arch = getenvPlatform("PROCESSOR_ARCHITECTURE");
|
||
|
if (arch == null)
|
||
|
{
|
||
|
String hostType = getenvPlatform("HOSTTYPE");
|
||
|
if ((arch = getenvPlatform("MACHTYPE")) != null)
|
||
|
{
|
||
|
if (hostType != null && (arch.startsWith(hostType) ||
|
||
|
arch.indexOf('-', 0) >= 0))
|
||
|
arch = hostType;
|
||
|
}
|
||
|
else if ((arch = hostType) == null || hostType.equals(osName))
|
||
|
arch = getOsArch0();
|
||
|
}
|
||
|
arch = toLowerCaseLatin(arch, false);
|
||
|
if (arch.equals("i386"))
|
||
|
arch = "x86";
|
||
|
else if (arch.equals("powerpc"))
|
||
|
arch = "ppc";
|
||
|
if (archDataModel >= 64)
|
||
|
{
|
||
|
if (arch.equals("x86") || arch.equals("x86_64"))
|
||
|
arch = "amd64";
|
||
|
else if (arch.equals("ppc"))
|
||
|
arch = "ppc64";
|
||
|
else if (arch.equals("sparc"))
|
||
|
arch = "sparcv9";
|
||
|
}
|
||
|
return arch;
|
||
|
}
|
||
|
|
||
|
private static String getOsVersion()
|
||
|
{
|
||
|
String version = getOsNameVersion0(1);
|
||
|
if (version == null || version.length() == 0)
|
||
|
{
|
||
|
int major = getOsVerMajorMinor0(0);
|
||
|
if (major >= 0)
|
||
|
{
|
||
|
version = String.valueOf(major);
|
||
|
int minor = getOsVerMajorMinor0(1);
|
||
|
if (minor >= 0)
|
||
|
version = version + "." + String.valueOf(minor);
|
||
|
}
|
||
|
else version = "unknown";
|
||
|
}
|
||
|
return version;
|
||
|
}
|
||
|
|
||
|
private static String getCTypeLocale()
|
||
|
{
|
||
|
String cLocale = getCTypeLocale0();
|
||
|
if (cLocale != null)
|
||
|
{
|
||
|
int i = cLocale.indexOf('=', 0);
|
||
|
if (i >= 0)
|
||
|
cLocale = cLocale.substring(i + 1);
|
||
|
if ((i = cLocale.indexOf('\r', 0)) >= 0)
|
||
|
cLocale = cLocale.substring(0, i);
|
||
|
if ((i = cLocale.indexOf('\n', 0)) >= 0)
|
||
|
cLocale = cLocale.substring(0, i);
|
||
|
if (cLocale.length() > 0 && !cLocale.equals("C") &&
|
||
|
!cLocale.equals("POSIX"))
|
||
|
return cLocale;
|
||
|
}
|
||
|
cLocale = getenvPlatform("LANG");
|
||
|
return cLocale != null && !cLocale.equals("C") &&
|
||
|
!cLocale.equals("POSIX") ? cLocale : "";
|
||
|
}
|
||
|
|
||
|
private static String getUserLanguage(String cLocale)
|
||
|
{
|
||
|
String lang = getenvPlatform("USERLANG");
|
||
|
if (lang == null || (lang = mapLanguageName(lang)).length() == 0)
|
||
|
{
|
||
|
lang = cLocale;
|
||
|
int i = cLocale.indexOf('_', 0);
|
||
|
if (i >= 0 || (i = cLocale.indexOf('.', 0)) >= 0 ||
|
||
|
(i = cLocale.indexOf('@', 0)) >= 0)
|
||
|
lang = cLocale.substring(0, i);
|
||
|
if ((lang = mapLanguageName(lang)).length() == 0 || lang.equals("en"))
|
||
|
{
|
||
|
String langAbbr = getUserLanguage0();
|
||
|
if (langAbbr != null &&
|
||
|
(langAbbr = mapLanguageName(langAbbr)).length() > 0)
|
||
|
lang = langAbbr;
|
||
|
}
|
||
|
}
|
||
|
return lang;
|
||
|
}
|
||
|
|
||
|
private static String mapLanguageName(String lang)
|
||
|
{
|
||
|
int len = lang.length();
|
||
|
String[] table = LOCALE_INFO_TABLE;
|
||
|
if (len != 2)
|
||
|
{
|
||
|
if (len == 3)
|
||
|
{
|
||
|
lang = toLowerCaseLatin(lang, false);
|
||
|
return lang.equals("eng") || lang.equals("usa") ? "en" : lang;
|
||
|
}
|
||
|
if (len > 2)
|
||
|
{
|
||
|
lang = toLowerCaseLatin(lang, true);
|
||
|
len = table.length;
|
||
|
for (int i = 0; i < len; i += 3)
|
||
|
if (lang.equals(table[i]))
|
||
|
return table[i + 1];
|
||
|
}
|
||
|
return "";
|
||
|
}
|
||
|
lang = toLowerCaseLatin(lang, false);
|
||
|
if (lang.equals("en"))
|
||
|
return "en";
|
||
|
if (lang.equals("cz"))
|
||
|
return "cs";
|
||
|
if (lang.equals("iw"))
|
||
|
return "he";
|
||
|
if (lang.equals("in"))
|
||
|
return "id";
|
||
|
if (lang.equals("ji"))
|
||
|
return "yi";
|
||
|
len = table.length;
|
||
|
for (int i = 1; i < len; i += 3)
|
||
|
{
|
||
|
String langAbbr = table[i];
|
||
|
if (lang.equals(langAbbr))
|
||
|
return langAbbr;
|
||
|
}
|
||
|
return lang;
|
||
|
}
|
||
|
|
||
|
private static String toLowerCaseLatin(String str, boolean firstUpper)
|
||
|
{
|
||
|
char[] chars = str.toCharArray();
|
||
|
int i = 0;
|
||
|
int len = chars.length;
|
||
|
boolean replaced = false;
|
||
|
char ch;
|
||
|
if (firstUpper && len != 0)
|
||
|
{
|
||
|
if ((ch = chars[0]) >= 'a' && ch <= 'z')
|
||
|
{
|
||
|
chars[0] = (char) (ch - ('a' - 'A'));
|
||
|
replaced = true;
|
||
|
}
|
||
|
i = 1;
|
||
|
}
|
||
|
while (i < len)
|
||
|
{
|
||
|
if ((ch = chars[i]) >= 'A' && ch <= 'Z')
|
||
|
{
|
||
|
chars[i] = (char) (ch + ('a' - 'A'));
|
||
|
replaced = true;
|
||
|
}
|
||
|
i++;
|
||
|
}
|
||
|
return replaced ? new String(chars) : str;
|
||
|
}
|
||
|
|
||
|
private static String getUserCountry(String cLocale, String lang)
|
||
|
{
|
||
|
String country = getenvPlatform("USERCTRY");
|
||
|
if (country == null || (country = mapCountryName(country)).length() == 0)
|
||
|
{
|
||
|
int i = cLocale.indexOf('_', 0);
|
||
|
if (i >= 0)
|
||
|
{
|
||
|
int j = cLocale.indexOf('.', i + 1);
|
||
|
if (j < 0 && (j = cLocale.indexOf('@', i + 1)) < 0)
|
||
|
j = cLocale.length();
|
||
|
country = mapCountryName(cLocale.substring(i + 1, j));
|
||
|
}
|
||
|
if (country == null || country.length() == 0 ?
|
||
|
((country = getUserCountry0()) == null ||
|
||
|
(country = mapCountryName(country)).length() == 0) &&
|
||
|
(lang.length() == 0 || lang.equals("en") ||
|
||
|
(country = mapLangToCountry(lang)).length() == 0) :
|
||
|
country.equals("US") && ((country = getUserCountry0()) == null ||
|
||
|
(country = mapCountryName(country)).length() == 0))
|
||
|
country = "US";
|
||
|
}
|
||
|
return country;
|
||
|
}
|
||
|
|
||
|
private static String mapCountryName(String country)
|
||
|
{
|
||
|
if (country.length() != 2)
|
||
|
return "";
|
||
|
country = VMAccessorJavaLang.toUpperCaseLatinVMSystem(country);
|
||
|
if (country.equals("US"))
|
||
|
return "US";
|
||
|
if (country.equals("UK"))
|
||
|
return "GB";
|
||
|
String[] table = LOCALE_INFO_TABLE;
|
||
|
int len = table.length;
|
||
|
for (int i = 2; i < len; i += 3)
|
||
|
{
|
||
|
String countryAbbr = table[i];
|
||
|
if (country.equals(countryAbbr))
|
||
|
return countryAbbr;
|
||
|
}
|
||
|
return country;
|
||
|
}
|
||
|
|
||
|
private static String mapLangToCountry(String lang)
|
||
|
{
|
||
|
String[] table = LOCALE_INFO_TABLE;
|
||
|
int len = table.length;
|
||
|
for (int i = 1; i < len; i += 3)
|
||
|
if (lang.equals(table[i]))
|
||
|
return table[i + 1];
|
||
|
return "";
|
||
|
}
|
||
|
|
||
|
private static String adjustUserLanguage(String lang, String country)
|
||
|
{
|
||
|
return lang.length() > 0 || (!country.equals("US") &&
|
||
|
(lang = mapCountryToLang(country)).length() > 0) ? lang : "en";
|
||
|
}
|
||
|
|
||
|
private static String mapCountryToLang(String country)
|
||
|
{
|
||
|
String lang = "";
|
||
|
String[] table = LOCALE_INFO_TABLE;
|
||
|
int len = table.length;
|
||
|
for (int i = 2; i < len; i += 3)
|
||
|
if (country.equals(table[i]))
|
||
|
{
|
||
|
if (country.equals(
|
||
|
VMAccessorJavaLang.toUpperCaseLatinVMSystem(table[i - 1])))
|
||
|
{
|
||
|
lang = table[i - 1];
|
||
|
break;
|
||
|
}
|
||
|
if (lang.length() == 0)
|
||
|
lang = table[i - 1];
|
||
|
}
|
||
|
return lang;
|
||
|
}
|
||
|
|
||
|
private static String getEncodingFromLocale(String cLocale)
|
||
|
{
|
||
|
int i = cLocale.indexOf('.', 0) + 1;
|
||
|
if (i <= 0)
|
||
|
return "";
|
||
|
int j = cLocale.indexOf('@', i);
|
||
|
String encoding = cLocale.substring(i, j >= 0 ? j : cLocale.length());
|
||
|
return encoding.startsWith("C-") ? encoding.substring(2) : encoding;
|
||
|
}
|
||
|
|
||
|
private static String mapCodePageToEncoding(int codePage)
|
||
|
{
|
||
|
return codePage < 10 ? "" : (codePage < 100 ? "Cp0" : "Cp") + codePage;
|
||
|
}
|
||
|
|
||
|
private static String mapEncodingValue(String encoding)
|
||
|
{
|
||
|
if (encoding.length() == 0 || encoding.equals("ISO8859_1") ||
|
||
|
encoding.equals("csISOLatin1") || encoding.equals("iso-ir-100") ||
|
||
|
encoding.equals("l1") || encoding.equals("latin1"))
|
||
|
return "ISO8859_1";
|
||
|
if (encoding.equals("ISO_646.irv:1991") || encoding.equals("ascii7") ||
|
||
|
encoding.equals("csASCII") || encoding.equals("iso-ir-6") ||
|
||
|
encoding.equals("iso_646.irv:1983") || encoding.equals("us"))
|
||
|
return "US-ASCII";
|
||
|
String upperEnc = VMAccessorJavaLang.toUpperCaseLatinVMSystem(encoding);
|
||
|
if (upperEnc.equals("ISO_8859-1:1987"))
|
||
|
return "ISO8859_1";
|
||
|
if (upperEnc.equals("US-ASCII") || upperEnc.equals("ANSI_X3.4-1968") ||
|
||
|
upperEnc.equals("ANSI_X3.4-1986") || upperEnc.equals("ASCII") ||
|
||
|
upperEnc.equals("ISO646-US"))
|
||
|
return "US-ASCII";
|
||
|
if (upperEnc.equals("UTF-8") || upperEnc.equals("UTF8"))
|
||
|
return "UTF-8";
|
||
|
if (upperEnc.equals("X-UTF-16BE") || upperEnc.equals("UTF-16BE") ||
|
||
|
upperEnc.equals("UTF16BE"))
|
||
|
return "UTF-16BE";
|
||
|
if (upperEnc.equals("X-UTF-16LE") || upperEnc.equals("UTF-16LE") ||
|
||
|
upperEnc.equals("UTF16LE"))
|
||
|
return "UTF-16LE";
|
||
|
if (upperEnc.startsWith("CP"))
|
||
|
upperEnc = upperEnc.substring(2);
|
||
|
else if (upperEnc.startsWith("IBM") || upperEnc.startsWith("ISO"))
|
||
|
upperEnc = upperEnc.substring(3);
|
||
|
else if (upperEnc.startsWith("WINDOWS"))
|
||
|
upperEnc = upperEnc.substring(7);
|
||
|
if (upperEnc.startsWith("-") || upperEnc.startsWith("_"))
|
||
|
upperEnc = upperEnc.substring(1);
|
||
|
return upperEnc.equals("819") || upperEnc.equals("8859-1") ||
|
||
|
upperEnc.equals("8859_1") ? "ISO8859_1" :
|
||
|
upperEnc.equals("367") || upperEnc.equals("646") ||
|
||
|
upperEnc.equals("20127") ? "US-ASCII" :
|
||
|
upperEnc.equals("1208") || upperEnc.equals("1209") ||
|
||
|
upperEnc.equals("5304") || upperEnc.equals("5305") ||
|
||
|
upperEnc.equals("65001") ? "UTF-8" :
|
||
|
upperEnc.equals("1201") || upperEnc.equals("5297") ||
|
||
|
upperEnc.equals("13488") || upperEnc.equals("17584") ? "UTF-16BE" :
|
||
|
upperEnc.equals("1202") || upperEnc.equals("13490") ||
|
||
|
upperEnc.equals("17586") ? "UTF-16LE" :
|
||
|
upperEnc.length() == 5 && upperEnc.startsWith("2859") &&
|
||
|
(char) (upperEnc.charAt(4) - '1') <= (char) ('9' - '1') ?
|
||
|
"ISO8859_" + upperEnc.charAt(4) :
|
||
|
(upperEnc.length() == 3 || upperEnc.length() == 4) &&
|
||
|
(char) (upperEnc.charAt(0) - '0') <= (char) ('9' - '0') &&
|
||
|
(char) (upperEnc.charAt(1) - '0') <= (char) ('9' - '0') &&
|
||
|
(char) (upperEnc.charAt(2) - '0') <= (char) ('9' - '0') ?
|
||
|
"Cp" + upperEnc : encoding;
|
||
|
}
|
||
|
|
||
|
private static String getUserVariant(String cLocale)
|
||
|
{
|
||
|
String variant = getUserVariant0();
|
||
|
if (variant == null || variant.length() == 0)
|
||
|
{
|
||
|
int i = cLocale.indexOf('@', 0);
|
||
|
if (i < 0 || (variant = cLocale.substring(i + 1)).length() == 0)
|
||
|
return "";
|
||
|
}
|
||
|
return mapLocaleVariant(variant);
|
||
|
}
|
||
|
|
||
|
private static String mapLocaleVariant(String variant)
|
||
|
{
|
||
|
String upperVariant = VMAccessorJavaLang.toUpperCaseLatinVMSystem(variant);
|
||
|
if (upperVariant.equals("ARAB"))
|
||
|
return "Arab";
|
||
|
if (upperVariant.equals("CYRL"))
|
||
|
return "Cyrl";
|
||
|
if (upperVariant.equals("EURO"))
|
||
|
return "EURO";
|
||
|
if (upperVariant.equals("HANS"))
|
||
|
return "Hans";
|
||
|
if (upperVariant.equals("HANT"))
|
||
|
return "Hant";
|
||
|
if (upperVariant.equals("LATN"))
|
||
|
return "Latn";
|
||
|
if (upperVariant.equals("NY"))
|
||
|
return "NY";
|
||
|
if (upperVariant.equals("POSIX"))
|
||
|
return "POSIX";
|
||
|
if (upperVariant.equals("REVISED"))
|
||
|
return "REVISED";
|
||
|
if (upperVariant.equals("SAAHO"))
|
||
|
return "SAAHO";
|
||
|
if (upperVariant.equals("UNIX"))
|
||
|
return "UNIX";
|
||
|
return variant;
|
||
|
}
|
||
|
|
||
|
private static String getUserTimezone()
|
||
|
{
|
||
|
/* dummy */
|
||
|
return "";
|
||
|
}
|
||
|
|
||
|
private static String getJavaCompiler()
|
||
|
{
|
||
|
/* dummy */
|
||
|
return "";
|
||
|
}
|
||
|
|
||
|
private static String getUserName()
|
||
|
{
|
||
|
String name = getenvPlatform("LOGNAME");
|
||
|
return name != null || (name = getenvPlatform("USERNAME")) != null ||
|
||
|
((name = getUserName0()) != null && name.length() > 0) ||
|
||
|
(name = getenvPlatform("USER")) != null ? name : "anonymous";
|
||
|
}
|
||
|
|
||
|
private static String getUserDir()
|
||
|
{
|
||
|
String path = VMAccessorJavaIo.makeAbsPathVMFile(".");
|
||
|
if (path == null)
|
||
|
return ".";
|
||
|
try
|
||
|
{
|
||
|
path = VMAccessorJavaIo.canonPathCaseVMFile(path);
|
||
|
}
|
||
|
catch (IOException e) {}
|
||
|
return path;
|
||
|
}
|
||
|
|
||
|
private static String getUserHome(String userDir, String fileSep)
|
||
|
{
|
||
|
String path = getenvPlatform("HOME");
|
||
|
if (path != null || ((path = getUserHome0()) != null && path.length() > 0))
|
||
|
return normPlatformPath(path);
|
||
|
if ((path = getenvPlatform("HOMEPATH")) != null)
|
||
|
{
|
||
|
if (path.length() <= 1 || path.charAt(1) != ':')
|
||
|
{
|
||
|
String drive = getenvPlatform("HOMEDRIVE");
|
||
|
if (drive != null && drive.length() > 1 &&
|
||
|
drive.charAt(drive.length() - 1) == ':')
|
||
|
path = drive + path;
|
||
|
}
|
||
|
return normPlatformPath(path);
|
||
|
}
|
||
|
if ((path = getenvPlatform("USERPROFILE")) != null)
|
||
|
return normPlatformPath(path);
|
||
|
if (userDir.equals("."))
|
||
|
return VMAccessorJavaIo.makeAbsPathVMFile(fileSep);
|
||
|
while ((path = VMAccessorJavaIo.pathParentOfVMFile(userDir)) != null)
|
||
|
userDir = path;
|
||
|
return userDir;
|
||
|
}
|
||
|
|
||
|
private static String getJavaIoTmpdir(String fileSep)
|
||
|
{
|
||
|
String path = getenvPlatform("TMP");
|
||
|
if (path == null && (path = getenvPlatform("TMPDIR")) == null &&
|
||
|
(path = getenvPlatform("TEMP")) == null)
|
||
|
{
|
||
|
path = getJavaIoTmpdir0();
|
||
|
if (path.length() == 0 ||
|
||
|
!VMAccessorJavaIo.isDirectoryVMFile(path = normPlatformPath(path)))
|
||
|
return "." + fileSep;
|
||
|
}
|
||
|
else path = normPlatformPath(path);
|
||
|
return path.endsWith(fileSep) ? path : path + fileSep;
|
||
|
}
|
||
|
|
||
|
private static String getProgramExePathname()
|
||
|
{
|
||
|
String path = VMAccessorJavaLang.getJavaExePathnameVMRuntime();
|
||
|
if (!path.equals("."))
|
||
|
{
|
||
|
if ((path = VMAccessorJavaIo.makeAbsPathVMFile(
|
||
|
normPlatformPath(path))) == null)
|
||
|
return ".";
|
||
|
path = VMAccessorJavaIo.collapsePathDotsVMFile(path);
|
||
|
try
|
||
|
{
|
||
|
path = VMAccessorJavaIo.canonPathCaseVMFile(path);
|
||
|
}
|
||
|
catch (IOException e) {}
|
||
|
}
|
||
|
return path;
|
||
|
}
|
||
|
|
||
|
private static String getProgramHome(String progPathname, String fileSep)
|
||
|
{
|
||
|
String path = VMAccessorJavaIo.pathParentOfVMFile(progPathname);
|
||
|
if (path == null)
|
||
|
return ".";
|
||
|
if (fileSep.length() == 1)
|
||
|
{
|
||
|
String name = toLowerCaseLatin(path.substring(
|
||
|
path.lastIndexOf(fileSep.charAt(0)) + 1), false);
|
||
|
char ch;
|
||
|
if (name.startsWith("bin") && (name.length() == 3 ||
|
||
|
(ch = name.charAt(3)) == '-' || ch == '_'))
|
||
|
{
|
||
|
if (path.charAt(0) != '\\')
|
||
|
path = path + fileSep + "..";
|
||
|
else if ((path = VMAccessorJavaIo.pathParentOfVMFile(path)) == null)
|
||
|
path = ".";
|
||
|
}
|
||
|
}
|
||
|
return path;
|
||
|
}
|
||
|
|
||
|
private static String getJavaHome(String progHome)
|
||
|
{
|
||
|
String path = getenvPlatform("PROG_JAVA_HOME");
|
||
|
return path != null ? normPlatformPath(path) : progHome;
|
||
|
}
|
||
|
|
||
|
private static String getJavaBootClassPath(String javaHome, String progHome,
|
||
|
String fileSep, String pathSep)
|
||
|
{
|
||
|
String javaHomeSep = javaHome.endsWith(fileSep) ? javaHome :
|
||
|
javaHome + fileSep;
|
||
|
String progHomeSep = progHome.endsWith(fileSep) ? progHome :
|
||
|
progHome + fileSep;
|
||
|
return progHomeSep + "lib" + fileSep + "tools.jar" + pathSep +
|
||
|
javaHomeSep + "lib" + fileSep + "rt.jar" + pathSep +
|
||
|
javaHomeSep + "share" + fileSep + "classpath" + fileSep +
|
||
|
"glibj.zip" + pathSep + progHomeSep + "classes";
|
||
|
}
|
||
|
|
||
|
private static String getJavaClassPath(String progHome, String progPathname,
|
||
|
String userDir, String fileSep, String pathSep)
|
||
|
{
|
||
|
progHome = VMAccessorJavaIo.collapsePathDotsVMFile(progHome);
|
||
|
String pathList = getenvPlatform("CLASSPATH");
|
||
|
if (pathList != null)
|
||
|
pathList = VMAccessorJavaIo.normPlatformListOfPathsVMFile(pathList);
|
||
|
String fileName;
|
||
|
if (!progPathname.equals(".") &&
|
||
|
(fileName = stripPathAndExeExt(progPathname, fileSep)).length() > 0)
|
||
|
pathList = (pathList != null ? pathList + pathSep : "") +
|
||
|
(progHome.equals(".") || (progHome.equals(userDir) &&
|
||
|
progHome.charAt(0) != '\\') ? "" : progHome.endsWith(fileSep) ?
|
||
|
progHome : progHome + fileSep) + fileName + ".jar";
|
||
|
else if (pathList == null)
|
||
|
pathList = progHome;
|
||
|
return pathList;
|
||
|
}
|
||
|
|
||
|
private static String stripPathAndExeExt(String path, String fileSep)
|
||
|
{
|
||
|
path = path.substring(path.lastIndexOf(fileSep.charAt(0)) + 1);
|
||
|
int pos = path.lastIndexOf('.');
|
||
|
if (pos < 0)
|
||
|
return path;
|
||
|
int i = path.length();
|
||
|
if (pos == 0)
|
||
|
return i > 1 ? path : "";
|
||
|
char ch;
|
||
|
while (--i > pos)
|
||
|
if (((ch = path.charAt(i)) < 'A' || ch > 'Z') && (ch < 'a' || ch > 'z'))
|
||
|
return path;
|
||
|
while (path.charAt(pos - 1) == '.')
|
||
|
if (--pos == 0)
|
||
|
break;
|
||
|
return path.substring(0, pos);
|
||
|
}
|
||
|
|
||
|
private static String getGnuClasspathHome()
|
||
|
{
|
||
|
String path = getenvPlatform("CLASSPATH_HOME");
|
||
|
return path != null ? normPlatformPath(path) : null;
|
||
|
}
|
||
|
|
||
|
private static String getGnuClasspathBootLibraryPath(String javaHome,
|
||
|
String fileSep, String pathSep)
|
||
|
{
|
||
|
String javaHomeSep = javaHome.endsWith(fileSep) ? javaHome :
|
||
|
javaHome + fileSep;
|
||
|
String sepDots = fileSep + "..";
|
||
|
return (javaHome.endsWith(sepDots) && javaHome.length() > sepDots.length() ?
|
||
|
javaHome.substring(0, javaHome.length() - sepDots.length()) :
|
||
|
javaHomeSep + "bin") + pathSep +
|
||
|
javaHomeSep + "lib" + fileSep + "classpath";
|
||
|
}
|
||
|
|
||
|
private static String getJavaLibraryPath(String javaHome, String fileSep,
|
||
|
String pathSep)
|
||
|
{
|
||
|
String pathList = getenvPlatform("LD_LIBRARY_PATH");
|
||
|
if (pathList != null && !pathList.equals("."))
|
||
|
return VMAccessorJavaIo.normPlatformListOfPathsVMFile(pathList);
|
||
|
if ((pathList = getenvPlatform("PATH")) != null)
|
||
|
pathList = VMAccessorJavaIo.normPlatformListOfPathsVMFile(pathList);
|
||
|
else pathList = ".";
|
||
|
String binPath;
|
||
|
if (!javaHome.endsWith(fileSep + "..") ||
|
||
|
(binPath = VMAccessorJavaIo.pathParentOfVMFile(javaHome)) == null)
|
||
|
binPath = javaHome;
|
||
|
String dotPathSep = "." + pathSep;
|
||
|
return (binPath.equals(".") ? "" : binPath + pathSep) +
|
||
|
(pathList.equals(".") || pathList.startsWith(dotPathSep) ||
|
||
|
pathList.endsWith(pathSep + ".") || pathList.indexOf(pathSep +
|
||
|
dotPathSep) >= 0 ? "" : dotPathSep) + pathList;
|
||
|
}
|
||
|
|
||
|
private static String getJavaExtDirs(String javaHome, String fileSep)
|
||
|
{
|
||
|
return (javaHome.endsWith(fileSep) ? javaHome : javaHome + fileSep) +
|
||
|
"lib" + fileSep + "ext";
|
||
|
}
|
||
|
|
||
|
private static String getenvPlatform(String name)
|
||
|
{
|
||
|
return VMAccessorJavaIo.getenvPlatformVMFile(name);
|
||
|
}
|
||
|
|
||
|
private static String normPlatformPath(String path)
|
||
|
{
|
||
|
return VMAccessorJavaIo.normPlatformPathVMFile(path);
|
||
|
}
|
||
|
|
||
|
private static native int isCpuUnicodeEndianLittle0(int isUnicode);
|
||
|
|
||
|
private static native int getArchDataModel0();
|
||
|
|
||
|
private static native String getOsArch0();
|
||
|
|
||
|
private static native String getOsNameVersion0(int isVersion);
|
||
|
|
||
|
private static native int getOsVerMajorMinor0(int isMinor);
|
||
|
|
||
|
private static native String getCTypeLocale0();
|
||
|
|
||
|
private static native String getUserLanguage0();
|
||
|
|
||
|
private static native String getUserCountry0();
|
||
|
|
||
|
private static native String getUserVariant0();
|
||
|
|
||
|
private static native String getFileConsoleEncoding0(int isConsole);
|
||
|
|
||
|
private static native int getFileConsoleCodePage0(int isConsole);
|
||
|
|
||
|
private static native String getUserName0();
|
||
|
|
||
|
private static native String getUserHome0();
|
||
|
|
||
|
private static native String getJavaIoTmpdir0();
|
||
|
}
|