diff options
author | Warren Levy <warrenl@redhat.com> | 2001-01-09 07:07:51 +0000 |
---|---|---|
committer | Warren Levy <warrenl@gcc.gnu.org> | 2001-01-09 07:07:51 +0000 |
commit | 3824a4860080dbc3b140e1eb7fa2b4efed115b81 (patch) | |
tree | 59c853c9c93930e645e808160cee16a1368a3fc2 /libjava/java/lang | |
parent | 61db460830bf37e7803f95472cead5cc3ba87da3 (diff) | |
download | gcc-3824a4860080dbc3b140e1eb7fa2b4efed115b81.zip gcc-3824a4860080dbc3b140e1eb7fa2b4efed115b81.tar.gz gcc-3824a4860080dbc3b140e1eb7fa2b4efed115b81.tar.bz2 |
re PR libgcj/1411 (natTimeZone.cc should be removed)
Fix for PR libgcj/1411:
* Makefile.am: Removed java/util/natTimeZone.cc.
* Makefile.in: Rebuilt.
* gnu/gcj/text/LocaleData_en_US.java (zoneStringsDefault): Added
missing localized timezone names.
* java/lang/System.java (getDefaultTimeZoneId): New private method.
* java/lang/natSystem.cc (getSystemTimeZone): New private method.
(init_properties): Set user.timezone property.
* java/text/DateFormatSymbols.java (zoneStringsDefault): Added
default timezone names; removed non-standard ones. Use standard
ID names per JCL.
* java/util/Date.java (toGMTString): Removed zoneGMT variable.
(UTC): Ditto.
* java/util/TimeZone.java: Add standard ID names per JCL; removed
non-standard ones.
(getDefaultTimeZoneId): Removed.
(zoneGMT): Removed.
(getDefaultTimeZoneId): Removed.
* java/util/natTimeZone.cc: Removed.
From-SVN: r38816
Diffstat (limited to 'libjava/java/lang')
-rw-r--r-- | libjava/java/lang/System.java | 80 | ||||
-rw-r--r-- | libjava/java/lang/natSystem.cc | 64 |
2 files changed, 142 insertions, 2 deletions
diff --git a/libjava/java/lang/System.java b/libjava/java/lang/System.java index ab1ca99..162bc1f 100644 --- a/libjava/java/lang/System.java +++ b/libjava/java/lang/System.java @@ -1,6 +1,6 @@ // System.java - System-specific info. -/* Copyright (C) 1998, 1999, 2000 Free Software Foundation +/* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation This file is part of libgcj. @@ -20,6 +20,7 @@ import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.util.Properties; import java.util.PropertyPermission; +import java.util.TimeZone; /** * @author Tom Tromey <tromey@cygnus.com> @@ -41,6 +42,83 @@ public final class System public static native long currentTimeMillis (); + // FIXME: When merging with Classpath, remember to remove the call to + // getDefaultTimeZoneId from java.util.Timezone. + private static native String getSystemTimeZone (); + + // Get the System Timezone as reported by the OS. It should be in + // the form PST8PDT so we'll need to parse it and check that it's valid. + // The result is used to set the user.timezone property in init_properties. + // FIXME: Using the code from Classpath for generating the System + // Timezone IMO is suboptimal because it ignores whether the rules for + // DST match up. + private static String getDefaultTimeZoneId () + { + String sysTimeZoneId = getSystemTimeZone (); + + // Check if this is a valid timezone. Make sure the IDs match + // since getTimeZone returns GMT if no match is found. + TimeZone tz = TimeZone.getTimeZone (sysTimeZoneId); + if (tz.getID ().equals (sysTimeZoneId)) + return sysTimeZoneId; + + // Check if the base part of sysTimeZoneId is a valid timezone that + // matches with daylight usage and rawOffset. Make sure the IDs match + // since getTimeZone returns GMT if no match is found. + // First find start of GMT offset info and any Daylight zone name. + int startGMToffset = 0; + int sysTimeZoneIdLength = sysTimeZoneId.length(); + for (int i = 0; i < sysTimeZoneIdLength && startGMToffset == 0; i++) + { + if (Character.isDigit (sysTimeZoneId.charAt (i))) + startGMToffset = i; + } + + int startDaylightZoneName = 0; + boolean usesDaylight = false; + for (int i = sysTimeZoneIdLength - 1; + i >= 0 && !Character.isDigit (sysTimeZoneId.charAt (i)); --i) + { + startDaylightZoneName = i; + } + if (startDaylightZoneName > 0) + usesDaylight = true; + + int GMToffset = Integer.parseInt (startDaylightZoneName == 0 ? + sysTimeZoneId.substring (startGMToffset) : + sysTimeZoneId.substring (startGMToffset, startDaylightZoneName)); + + // Offset could be in hours or seconds. Convert to millis. + if (GMToffset < 24) + GMToffset *= 60 * 60; + GMToffset *= -1000; + + String tzBasename = sysTimeZoneId.substring (0, startGMToffset); + tz = TimeZone.getTimeZone (tzBasename); + if (tz.getID ().equals (tzBasename) && tz.getRawOffset () == GMToffset) + { + boolean tzUsesDaylight = tz.useDaylightTime (); + if (usesDaylight && tzUsesDaylight || !usesDaylight && !tzUsesDaylight) + return tzBasename; + } + + // If no match, see if a valid timezone has the same attributes as this + // and then use it instead. + String[] IDs = TimeZone.getAvailableIDs (GMToffset); + for (int i = 0; i < IDs.length; ++i) + { + // FIXME: The daylight savings rules may not match the rules + // for the desired zone. + boolean IDusesDaylight = + TimeZone.getTimeZone (IDs[i]).useDaylightTime (); + if (usesDaylight && IDusesDaylight || !usesDaylight && !IDusesDaylight) + return IDs[i]; + } + + // If all else fails, return null. + return null; + } + public static void exit (int status) { Runtime.getRuntime().exit(status); diff --git a/libjava/java/lang/natSystem.cc b/libjava/java/lang/natSystem.cc index a987e8d..2fccf92 100644 --- a/libjava/java/lang/natSystem.cc +++ b/libjava/java/lang/natSystem.cc @@ -1,6 +1,6 @@ // natSystem.cc - Native code implementing System class. -/* Copyright (C) 1998, 1999, 2000 Free Software Foundation +/* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation This file is part of libgcj. @@ -10,6 +10,7 @@ details. */ #include <config.h> +#include <stdio.h> #include <string.h> #include <stdlib.h> @@ -28,6 +29,17 @@ details. */ #include <langinfo.h> #endif +#if TIME_WITH_SYS_TIME +# include <sys/time.h> +# include <time.h> +#else +# if HAVE_SYS_TIME_H +# include <sys/time.h> +# else +# include <time.h> +# endif +#endif + #include <gcj/cni.h> #include <jvm.h> #include <java-props.h> @@ -38,6 +50,7 @@ details. */ #include <java/lang/NullPointerException.h> #include <java/lang/StringBuffer.h> #include <java/util/Properties.h> +#include <java/util/TimeZone.h> #include <java/io/PrintStream.h> #include <java/io/InputStream.h> @@ -214,6 +227,50 @@ getpwuid_adaptor(T_passwd * (*getpwuid_r)(T_uid user_id, T_passwd *pwd_r, } #endif +/* + * This method returns a time zone string that is used by init_properties + * to set the default timezone property 'user.timezone'. That value is + * used by default as a key into the timezone table used by the + * java::util::TimeZone class. + */ +jstring +java::lang::System::getSystemTimeZone (void) +{ + time_t current_time; + char **tzinfo, *tzid; + long tzoffset; + + current_time = time(0); + + mktime(localtime(¤t_time)); + tzinfo = tzname; + tzoffset = timezone; + + if ((tzoffset % 3600) == 0) + tzoffset = tzoffset / 3600; + + if (!strcmp(tzinfo[0], tzinfo[1])) + { + tzid = (char*) _Jv_Malloc (strlen(tzinfo[0]) + 6); + if (!tzid) + return NULL; + + sprintf(tzid, "%s%ld", tzinfo[0], tzoffset); + } + else + { + tzid = (char*) _Jv_Malloc (strlen(tzinfo[0]) + strlen(tzinfo[1]) + 6); + if (!tzid) + return NULL; + + sprintf(tzid, "%s%ld%s", tzinfo[0], tzoffset, tzinfo[1]); + } + + jstring retval = JvNewStringUTF (tzid); + _Jv_Free (tzid); + return retval; +} + void java::lang::System::init_properties (void) { @@ -364,6 +421,11 @@ java::lang::System::init_properties (void) SET ("user.language", "en"); } + // Set the "user.timezone" property. + jstring timezone = getDefaultTimeZoneId (); + if (timezone != NULL) + newprops->put (JvNewStringLatin1 ("user.timezone"), timezone); + // Set some properties according to whatever was compiled in with // `-D'. for (int i = 0; _Jv_Compiler_Properties[i]; ++i) |