Commit 98e7ae29 by Tom Tromey Committed by Tom Tromey

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
parent aaaec114
1999-09-24 Tom Tromey <tromey@cygnus.com>
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.
1999-09-23 Tom Tromey <tromey@cygnus.com> 1999-09-23 Tom Tromey <tromey@cygnus.com>
* configure: Rebuilt. * configure: Rebuilt.
......
...@@ -802,7 +802,6 @@ java/net/natInetAddress.cc \ ...@@ -802,7 +802,6 @@ java/net/natInetAddress.cc \
java/net/natPlainDatagramSocketImpl.cc \ java/net/natPlainDatagramSocketImpl.cc \
java/net/natPlainSocketImpl.cc \ java/net/natPlainSocketImpl.cc \
java/text/natCollator.cc \ java/text/natCollator.cc \
java/util/natDate.cc \
java/util/natGregorianCalendar.cc \ java/util/natGregorianCalendar.cc \
java/util/zip/natDeflater.cc \ java/util/zip/natDeflater.cc \
java/util/zip/natInflater.cc java/util/zip/natInflater.cc
......
...@@ -616,7 +616,6 @@ java/net/natInetAddress.cc \ ...@@ -616,7 +616,6 @@ java/net/natInetAddress.cc \
java/net/natPlainDatagramSocketImpl.cc \ java/net/natPlainDatagramSocketImpl.cc \
java/net/natPlainSocketImpl.cc \ java/net/natPlainSocketImpl.cc \
java/text/natCollator.cc \ java/text/natCollator.cc \
java/util/natDate.cc \
java/util/natGregorianCalendar.cc \ java/util/natGregorianCalendar.cc \
java/util/zip/natDeflater.cc \ java/util/zip/natDeflater.cc \
java/util/zip/natInflater.cc java/util/zip/natInflater.cc
......
...@@ -46,9 +46,6 @@ ...@@ -46,9 +46,6 @@
/* Define if using POSIX threads on Linux. */ /* Define if using POSIX threads on Linux. */
#undef LINUX_THREADS #undef LINUX_THREADS
/* Define if you have the `ctime_r' function. */
#undef HAVE_CTIME_R
/* Define if you have the `gmtime_r' function. */ /* Define if you have the `gmtime_r' function. */
#undef HAVE_GMTIME_R #undef HAVE_GMTIME_R
......
...@@ -282,7 +282,6 @@ if test -n "${with_cross_host}"; then ...@@ -282,7 +282,6 @@ if test -n "${with_cross_host}"; then
AC_DEFINE(HAVE_MEMMOVE) AC_DEFINE(HAVE_MEMMOVE)
AC_DEFINE(HAVE_MEMCPY) AC_DEFINE(HAVE_MEMCPY)
AC_DEFINE(HAVE_STRERROR) AC_DEFINE(HAVE_STRERROR)
AC_DEFINE(HAVE_CTIME_R)
AC_DEFINE(HAVE_GMTIME_R) AC_DEFINE(HAVE_GMTIME_R)
AC_DEFINE(HAVE_LOCALTIME_R) AC_DEFINE(HAVE_LOCALTIME_R)
dnl This is only for POSIX threads. dnl This is only for POSIX threads.
...@@ -303,7 +302,6 @@ if test -n "${with_cross_host}"; then ...@@ -303,7 +302,6 @@ if test -n "${with_cross_host}"; then
fi fi
else else
AC_CHECK_FUNCS(strerror ioctl select fstat open fsync sleep) AC_CHECK_FUNCS(strerror ioctl select fstat open fsync sleep)
AC_CHECK_FUNCS(ctime_r ctime, break)
AC_CHECK_FUNCS(gmtime_r localtime_r readdir_r getpwuid_r) AC_CHECK_FUNCS(gmtime_r localtime_r readdir_r getpwuid_r)
AC_CHECK_FUNCS(access stat mkdir rename rmdir unlink realpath) AC_CHECK_FUNCS(access stat mkdir rename rmdir unlink realpath)
AC_CHECK_FUNCS(inet_aton inet_addr, break) AC_CHECK_FUNCS(inet_aton inet_addr, break)
......
...@@ -61,9 +61,6 @@ ...@@ -61,9 +61,6 @@
/* Define if using POSIX threads on Linux. */ /* Define if using POSIX threads on Linux. */
#undef LINUX_THREADS #undef LINUX_THREADS
/* Define if you have the `ctime_r' function. */
#undef HAVE_CTIME_R
/* Define if you have the `gmtime_r' function. */ /* Define if you have the `gmtime_r' function. */
#undef HAVE_GMTIME_R #undef HAVE_GMTIME_R
...@@ -131,12 +128,6 @@ ...@@ -131,12 +128,6 @@
/* Define if you have the access function. */ /* Define if you have the access function. */
#undef HAVE_ACCESS #undef HAVE_ACCESS
/* Define if you have the ctime function. */
#undef HAVE_CTIME
/* Define if you have the ctime_r function. */
#undef HAVE_CTIME_R
/* Define if you have the fstat function. */ /* Define if you have the fstat function. */
#undef HAVE_FSTAT #undef HAVE_FSTAT
......
...@@ -445,10 +445,33 @@ public class Date implements java.io.Serializable, Cloneable ...@@ -445,10 +445,33 @@ public class Date implements java.io.Serializable, Cloneable
+ cal.get(Calendar.DST_OFFSET)/(60*1000)); + 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 public String toGMTString ()
// TODO: 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, public static long UTC (int year, int month, int date,
int hours, int minutes, int seconds) int hours, int minutes, int seconds)
......
...@@ -68,21 +68,57 @@ public abstract class TimeZone implements java.io.Serializable, Cloneable ...@@ -68,21 +68,57 @@ public abstract class TimeZone implements java.io.Serializable, Cloneable
public abstract boolean inDaylightTime (Date date); 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() public static String[] getAvailableIDs()
{ // FIXME - only knows about GMT {
String[] zones = new String[1]; return (String[]) tzIDs.clone();
zones[0] = "GMT";
return zones;
} }
public static String[] getAvailableIDs(int rawOffset) 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() private static synchronized TimeZone setDefault()
...@@ -117,4 +153,31 @@ public abstract class TimeZone implements java.io.Serializable, Cloneable ...@@ -117,4 +153,31 @@ public abstract class TimeZone implements java.io.Serializable, Cloneable
} }
// public Object clone (); // 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];
} }
/* 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
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment