diff options
author | Tom Tromey <tromey@cygnus.com> | 1999-09-24 19:12:23 +0000 |
---|---|---|
committer | Tom Tromey <tromey@gcc.gnu.org> | 1999-09-24 19:12:23 +0000 |
commit | 98e7ae2962ad70fed5e3d776bf6992a2a154d629 (patch) | |
tree | 1ae1fb27538f4637b0c7cebaa4d290138da435a5 /libjava/java | |
parent | aaaec1142d3e7b9174ecd74fd21c6c39d696d56d (diff) | |
download | gcc-98e7ae2962ad70fed5e3d776bf6992a2a154d629.zip gcc-98e7ae2962ad70fed5e3d776bf6992a2a154d629.tar.gz gcc-98e7ae2962ad70fed5e3d776bf6992a2a154d629.tar.bz2 |
re GNATS java.util/47 (Date.toString() returns embedded newline)
Fix for PR java.util/47:
* configure, include/config.h: Rebuilt.
* configure.in: Don't look for ctime or ctime_r.
* Makefile.in: Rebuilt.
* Makefile.am (nat_source_files): Don't mention natDate.cc.
* java/util/natDate.cc: Removed.
* java/util/TimeZone.java (tzIDs, rawOffsets, timeZones): New
static fields.
(getAvailableIDs): Rewrote.
(getTimeZone): Rewrote.
* java/util/Date.java (toGMTString): New method.
(toLocaleString): New method.
(toString): Rewrote.
From-SVN: r29656
Diffstat (limited to 'libjava/java')
-rw-r--r-- | libjava/java/util/Date.java | 29 | ||||
-rw-r--r-- | libjava/java/util/TimeZone.java | 77 | ||||
-rw-r--r-- | libjava/java/util/natDate.cc | 67 |
3 files changed, 96 insertions, 77 deletions
diff --git a/libjava/java/util/Date.java b/libjava/java/util/Date.java index 3d23780..a5258a0 100644 --- a/libjava/java/util/Date.java +++ b/libjava/java/util/Date.java @@ -445,10 +445,33 @@ public class Date implements java.io.Serializable, Cloneable + cal.get(Calendar.DST_OFFSET)/(60*1000)); } - public native String toString (); + public String toString () + { + // This is slow, but does it matter? There is no particularly + // fast way to do it, because we need the timezone offset, which + // we don't store. Unix ctime() doesn't provide this information. + SimpleDateFormat fmt = new SimpleDateFormat ("E MMM dd HH:mm:ss z yyyy", + Locale.US); + fmt.setTimeZone(TimeZone.getDefault()); + return fmt.format(this); + } - // TODO: toLocaleString - // TODO: toGMTString + public String toGMTString () + { + // This method is deprecated. We don't care if it is very slow. + SimpleDateFormat fmt = new SimpleDateFormat ("d MMM yyyy HH:mm:ss 'GMT'", + Locale.US); + fmt.setTimeZone(TimeZone.zoneGMT); + return fmt.format(this); + } + + public String toLocaleString () + { + // This method is deprecated. We don't care if it is very slow. + DateFormat fmt = DateFormat.getDateTimeInstance(); + fmt.setTimeZone(TimeZone.getDefault()); + return fmt.format(this); + } public static long UTC (int year, int month, int date, int hours, int minutes, int seconds) diff --git a/libjava/java/util/TimeZone.java b/libjava/java/util/TimeZone.java index ad2dd62..9e8142f 100644 --- a/libjava/java/util/TimeZone.java +++ b/libjava/java/util/TimeZone.java @@ -68,21 +68,57 @@ public abstract class TimeZone implements java.io.Serializable, Cloneable public abstract boolean inDaylightTime (Date date); - public static TimeZone getTimeZone (String ID) + public static synchronized TimeZone getTimeZone (String ID) { - return zoneGMT; // FIXME + int i; + for (i = 0; i < tzIDs.length; ++i) + { + if (ID.equals(tzIDs[i])) + break; + } + if (i == tzIDs.length) + return null; + + if (timeZones[i] == null) + { + if (ID.equals("GMT")) + timeZones[i] = zoneGMT; + else + timeZones[i] = new SimpleTimeZone (rawOffsets[i], tzIDs[i]); + } + + return timeZones[i]; } public static String[] getAvailableIDs() - { // FIXME - only knows about GMT - String[] zones = new String[1]; - zones[0] = "GMT"; - return zones; + { + return (String[]) tzIDs.clone(); } public static String[] getAvailableIDs(int rawOffset) { - return rawOffset == 0 ? getAvailableIDs() : new String[0]; // FIXME + int first, last; + + for (first = 0; first < rawOffsets.length; ++first) + { + if (rawOffset == rawOffsets[first]) + break; + } + if (first == rawOffsets.length) + return new String[0]; + for (last = first + 1; last < rawOffsets.length; ++last) + { + if (rawOffset != rawOffsets[last]) + break; + } + + String[] r = new String[last - first]; + for (int i = first; i < last; ++i) + { + r[i - first] = tzIDs[i]; + } + + return r; } private static synchronized TimeZone setDefault() @@ -117,4 +153,31 @@ public abstract class TimeZone implements java.io.Serializable, Cloneable } // public Object clone (); + + // Names of timezones. This array is kept in parallel with + // rawOffsets. This list comes from the JCL 1.1 book. + private static final String[] tzIDs = + { + "MIT", "HST", "AST", "PST", "PNT", + "MST", "CST", "EST", "IET", "PRT", + "CNT", "AGT", "BET", "CAT", "GMT", + "ECT", "EET", "ART", "EAT", "MET", + "NET", "PLT", "IST", "BST", "VST", + "CTT", "JST", "ACT", "AET", "SST", + "NST" + }; + // This holds raw offsets in milliseconds. + // 3600000 == 60 * 60 * 1000 + private static final int[] rawOffsets = + { + -11 * 3600000, -10 * 3600000, -9 * 3600000, -8 * 3600000, -7 * 3600000, + -7 * 3600000, -6 * 3600000, -5 * 3600000, -5 * 3600000, -4 * 3600000, + -35 * 360000, -3 * 3600000, -3 * 3600000, -1 * 3600000, 0, + 1 * 3600000, 1 * 3600000, 2 * 3600000, 3 * 3600000, 35 * 360000, + 4 * 3600000, 5 * 3600000, 55 * 360000, 6 * 3600000, 7 * 3600000, + 8 * 3600000, 9 * 3600000, 95 * 360000, 10 * 3600000, 11 * 3600000, + 12 * 3600000 + }; + // This caches all the corresponding zone objects. + private static TimeZone[] timeZones = new TimeZone[tzIDs.length]; } diff --git a/libjava/java/util/natDate.cc b/libjava/java/util/natDate.cc deleted file mode 100644 index 8fd4ef1..0000000 --- a/libjava/java/util/natDate.cc +++ /dev/null @@ -1,67 +0,0 @@ -/* Copyright (C) 1998, 1999 Cygnus Solutions - - This file is part of libgcj. - -This software is copyrighted work licensed under the terms of the -Libgcj License. Please consult the file "LIBGCJ_LICENSE" for -details. */ - -#include <config.h> - -// We want to make sure to pick up the POSIX ctime_r. Some systems, -// such as Solaris 2.6, have their own version as well. -#ifdef HAVE_CTIME_R -#define _POSIX_PTHREAD_SEMANTICS -#endif - -#include <gcj/cni.h> -#include <java/util/Date.h> -#include <java/lang/String.h> - -#include <time.h> - -#ifdef HAVE_SYS_TYPES_H -#include <sys/types.h> -#endif - -#ifdef HAVE_SYS_TIME_H -#include <sys/time.h> -#endif - -#if HAVE_CTIME_R -/* Use overload resolution to find out the signature of ctime_r. */ - - /* This is Posix ctime_r(). */ -template <typename T_clock, typename T_buf, size_t buflen> -static inline char * -ctime_adaptor (char* (*ctime_r)(T_clock *clock, T_buf *buf), - time_t *clock, char (&buf)[buflen]) -{ - return ctime_r (clock, buf); -} - -/* This is an old-style ctime_r, used on IRIX 5.2. */ -template <typename T_clock, typename T_buf, typename T_buflen, size_t buflen> -static inline char * -ctime_adaptor (char* (*ctime_r)(T_clock *clock, T_buf *buf, T_buflen len), - time_t *clock, char (&buf)[buflen]) -{ - return ctime_r (clock, buf, buflen); -} -#endif - -jstring -java::util::Date::toString() -{ -#ifdef HAVE_CTIME_R - time_t t = millis / 1000; - char buf[30]; - return JvNewStringLatin1 (ctime_adaptor (ctime_r, &t, buf)); -#elif defined (HAVE_CTIME) - // FIXME: this isn't thread-safe. - time_t t = millis / 1000; - return JvNewStringLatin1 (ctime (&t)); -#else - return NULL; -#endif -} |