summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog29
-rwxr-xr-xdebug/xtrace.sh17
-rw-r--r--linuxthreads/sysdeps/pthread/Subdirs (renamed from linuxthreads/Implies)0
-rw-r--r--linuxthreads_db/ChangeLog4
-rw-r--r--linuxthreads_db/shlib-versions2
-rw-r--r--linuxthreads_db/td_ta_get_nthreads.c4
-rw-r--r--linuxthreads_db/td_ta_new.c15
-rw-r--r--linuxthreads_db/thread_db.h6
-rwxr-xr-xmalloc/memprof.sh20
-rw-r--r--math/Makefile2
-rw-r--r--math/basic-test.c123
-rw-r--r--nis/nss_nisplus/nisplus-parser.c38
-rw-r--r--timezone/europe59
13 files changed, 268 insertions, 51 deletions
diff --git a/ChangeLog b/ChangeLog
index 551ddacbb1..4950a18d91 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,32 @@
+1999-10-08  Ulrich Drepper  <drepper@cygnus.com>
+
+	* nis/nss_nisplus/nisplus-parser.c (_nss_nisplus_parse_spent): Fix
+	handling of empty entries.
+	Patch by Thorsten Kukuk <kukuk@suse.de>.
+
+1999-10-08  Andreas Schwab  <schwab@suse.de>
+
+	* debug/xtrace.sh: Fix quoting bugs.  Implement --help and --version.
+
+1999-10-08  Andreas Schwab  <schwab@suse.de>
+
+	* debug/pcprofiledump.c: Fix typos.
+
+1999-10-07  Andreas Jaeger  <aj@suse.de>
+
+	* math/Makefile (tests): Added basic-tests.
+
+	* math/basic-test.c: New file.  Contains function basic_tests from
+	libm-test.
+
+1999-10-07  Andreas Schwab  <schwab@suse.de>
+
+	* malloc/memprof.sh: Fix quoting bugs.
+
+1999-10-08  Ulrich Drepper  <drepper@cygnus.com>
+
+	* timezone/europe: Update from tzdata1999h.
+
 1999-10-07  Ulrich Drepper  <drepper@cygnus.com>
 
 	* elf/elf.h: Update from last gABI draft.
diff --git a/debug/xtrace.sh b/debug/xtrace.sh
index c688391ff1..241ebe8954 100755
--- a/debug/xtrace.sh
+++ b/debug/xtrace.sh
@@ -81,6 +81,9 @@ COLUMNS=${COLUMNS:-80}
 # If `TERM' is not set, set it to `xterm'.
 TERM=${TERM:-xterm}
 
+# The data file to process, if any.
+data=
+
 # Process arguments.  But stop as soon as the program name is found.
 while test $# -gt 0; do
   case "$1" in
@@ -94,6 +97,12 @@ while test $# -gt 0; do
   --d=* | --da=* | --dat=* | --data=*)
     data=${1##*=}
     ;;
+  -? | --h | --he | --hel | --help)
+    do_help
+    ;;
+  --v | --ve | --ver | --vers | --versi | --versio | --version)
+    do_version
+    ;;
   --)
     # Stop processing arguments.
     shift
@@ -133,9 +142,9 @@ fi
 printf "%-20s  %-*s  %6s\n" Function $(expr $COLUMNS - 30) File Line
 for i in $(seq 1 $COLUMNS); do echo -n -; done; echo
 if test -n "$data"; then
-  eval $pcprofiledump $data |
+  $pcprofiledump "$data" |
   sed 's/this = \([^,]*\).*/\1/' |
-  addr2line -fC -e $program |
+  addr2line -fC -e "$program" |
   while read fct; do
     read file
     if test "$fct" != '??' -a "$file" != '??:0'; then
@@ -146,9 +155,9 @@ else
   fifo=$(mktemp -u ${TMPDIR:-/tmp}/xprof.XXXXXX)
   mkfifo -m 0600 $fifo || exit 1
   # Now start the program and let it write to the FIFO.
-  eval $TERM -T "'xtrace - $program $*'" -e /bin/sh -c "'LD_PRELOAD=$pcprofileso PCPROFILE_OUTPUT=$fifo $program $*; read $fifo'" &
+  $TERM -T "xtrace - $program $*" -e /bin/sh -c "LD_PRELOAD=$pcprofileso PCPROFILE_OUTPUT=$fifo $program $*; read $fifo" &
   termpid=$!
-  eval $pcprofiledump $fifo |
+  $pcprofiledump $fifo |
   sed 's/this = \([^,]*\).*/\1/' |
   addr2line -fC -e $program |
   while read fct; do
diff --git a/linuxthreads/Implies b/linuxthreads/sysdeps/pthread/Subdirs
index 2c56497842..2c56497842 100644
--- a/linuxthreads/Implies
+++ b/linuxthreads/sysdeps/pthread/Subdirs
diff --git a/linuxthreads_db/ChangeLog b/linuxthreads_db/ChangeLog
index 1ee1a7e66a..86261473f2 100644
--- a/linuxthreads_db/ChangeLog
+++ b/linuxthreads_db/ChangeLog
@@ -1,3 +1,7 @@
+1999-10-08  Ulrich Drepper  <drepper@cygnus.com>
+
+	* shlib-versions: New file.
+
 1999-10-07  Ulrich Drepper  <drepper@cygnus.com>
 
 	* Makefile: New file.
diff --git a/linuxthreads_db/shlib-versions b/linuxthreads_db/shlib-versions
new file mode 100644
index 0000000000..592f7fa284
--- /dev/null
+++ b/linuxthreads_db/shlib-versions
@@ -0,0 +1,2 @@
+# The thread debug library
+.*-.*-linux.*		libthread_db=1
diff --git a/linuxthreads_db/td_ta_get_nthreads.c b/linuxthreads_db/td_ta_get_nthreads.c
index 955555b2e5..13d50329c1 100644
--- a/linuxthreads_db/td_ta_get_nthreads.c
+++ b/linuxthreads_db/td_ta_get_nthreads.c
@@ -19,7 +19,7 @@
    Boston, MA 02111-1307, USA.  */
 
 #include "thread_dbP.h"
-
+#include <gnu/lib-names.h>
 
 td_err_e
 td_ta_get_nthreads (const td_thragent_t *ta, int *np)
@@ -29,7 +29,7 @@ td_ta_get_nthreads (const td_thragent_t *ta, int *np)
   LOG (__FUNCTION__);
 
   /* Access the variable `__pthread_handles_num'.  */
-  if (ps_pglobal_lookup (ta->ph, "libpthread.so.0", "__pthread_handles_num",
+  if (ps_pglobal_lookup (ta->ph, LIBPTHREAD_SO, "__pthread_handles_num",
 		         &addr) != PS_OK)
      return TD_ERR;	/* XXX Other error value?  */
 
diff --git a/linuxthreads_db/td_ta_new.c b/linuxthreads_db/td_ta_new.c
index d018ac6807..15f445a877 100644
--- a/linuxthreads_db/td_ta_new.c
+++ b/linuxthreads_db/td_ta_new.c
@@ -21,6 +21,7 @@
 
 #include <stddef.h>
 #include <stdlib.h>
+#include <gnu/lib-names.h>
 
 #include "thread_dbP.h"
 
@@ -33,7 +34,7 @@ td_ta_new (struct ps_prochandle *ps, td_thragent_t **ta)
   LOG (__FUNCTION__);
 
   /* See whether the library contains the necessary symbols.  */
-  if (ps_pglobal_lookup (ps, "libpthread.so.0", "__pthread_threads_debug",
+  if (ps_pglobal_lookup (ps, LIBPTHREAD_SO, "__pthread_threads_debug",
 		         &addr) != PS_OK)
     return TD_LIBTHREAD;
 
@@ -47,7 +48,7 @@ td_ta_new (struct ps_prochandle *ps, td_thragent_t **ta)
   (*ta)->ph = ps;
 
   /* See whether the library contains the necessary symbols.  */
-  if (ps_pglobal_lookup (ps, "libpthread.so.0", "__pthread_handles",
+  if (ps_pglobal_lookup (ps, LIBPTHREAD_SO, "__pthread_handles",
 		         &addr) != PS_OK)
     {
     free_return:
@@ -58,7 +59,7 @@ td_ta_new (struct ps_prochandle *ps, td_thragent_t **ta)
   (*ta)->handles = (struct pthread_handle_struct *) addr;
 
 
-  if (ps_pglobal_lookup (ps, "libpthread.so.0", "pthread_keys",
+  if (ps_pglobal_lookup (ps, LIBPTHREAD_SO, "pthread_keys",
 		         &addr) != PS_OK)
     goto free_return;
 
@@ -68,7 +69,7 @@ td_ta_new (struct ps_prochandle *ps, td_thragent_t **ta)
   /* Find out about the maximum number of threads.  Old implementations
      don't provide this information.  In this case we assume that the
      debug  library is compiled with the same values.  */
-  if (ps_pglobal_lookup (ps, "libpthread.so.0",
+  if (ps_pglobal_lookup (ps, LIBPTHREAD_SO,
 			 "__linuxthreads_pthread_threads_max", &addr) != PS_OK)
     (*ta)->pthread_threads_max = PTHREAD_THREADS_MAX;
   else
@@ -79,7 +80,7 @@ td_ta_new (struct ps_prochandle *ps, td_thragent_t **ta)
     }
 
   /* Similar for the maximum number of thread local data keys.  */
-  if (ps_pglobal_lookup (ps, "libpthread.so.0",
+  if (ps_pglobal_lookup (ps, LIBPTHREAD_SO,
 			 "__linuxthreads_pthread_keys_max", &addr) != PS_OK)
     (*ta)->pthread_keys_max = PTHREAD_KEYS_MAX;
   else
@@ -90,7 +91,7 @@ td_ta_new (struct ps_prochandle *ps, td_thragent_t **ta)
     }
 
   /* And for the size of the second level arrays for the keys.  */
-  if (ps_pglobal_lookup (ps, "libpthread.so.0",
+  if (ps_pglobal_lookup (ps, LIBPTHREAD_SO,
 			 "__linuxthreads_pthread_sizeof_descr", &addr)
       != PS_OK)
     (*ta)->sizeof_descr = offsetof (struct _pthread_descr_struct, p_startfct);
@@ -101,7 +102,7 @@ td_ta_new (struct ps_prochandle *ps, td_thragent_t **ta)
     }
 
   /* Similar for the maximum number of thread local data keys.  */
-  if (ps_pglobal_lookup (ps, "libpthread.so.0",
+  if (ps_pglobal_lookup (ps, LIBPTHREAD_SO,
 			 "__linuxthreads_pthread_keys_max", &addr) != PS_OK)
     (*ta)->pthread_keys_max = PTHREAD_KEYS_MAX;
   else
diff --git a/linuxthreads_db/thread_db.h b/linuxthreads_db/thread_db.h
index f65363ebc6..310e2ae75a 100644
--- a/linuxthreads_db/thread_db.h
+++ b/linuxthreads_db/thread_db.h
@@ -291,7 +291,7 @@ extern td_err_e td_init (void);
 /* Historical relict.  Should not be used anymore.  */
 extern td_err_e td_log (void);
 
-/* Generate new thread debu librarz handle for process PS.  */
+/* Generate new thread debug library handle for process PS.  */
 extern td_err_e td_ta_new (struct ps_prochandle *__ps, td_thragent_t **__ta);
 
 /* Free resources allocated for TA.  */
@@ -316,7 +316,7 @@ extern td_err_e td_ta_map_lwp2thr (const td_thragent_t *__ta, lwpid_t __lwpid,
 				   td_thrhandle_t *__th);
 
 
-/* Call for each thread is process associated with TA the callback function
+/* Call for each thread in a process associated with TA the callback function
    CALLBACK.  */
 extern td_err_e td_ta_thr_iter (const td_thragent_t *__ta,
 				td_thr_iter_f *__callback, void *__cbdata_p,
@@ -344,7 +344,7 @@ extern td_err_e td_ta_enable_stats (const td_thragent_t *__ta, int __enable);
 /* Reset statistics.  */
 extern td_err_e td_ta_reset_stats (const td_thragent_t *__ta);
 
-/* Retrieve statitics from process associated with TA.  */
+/* Retrieve statistics from process associated with TA.  */
 extern td_err_e td_ta_get_stats (const td_thragent_t *__ta,
 				 td_ta_stats_t *__statsp);
 
diff --git a/malloc/memprof.sh b/malloc/memprof.sh
index d7d8750704..5fc011b7d9 100755
--- a/malloc/memprof.sh
+++ b/malloc/memprof.sh
@@ -201,6 +201,7 @@ fi
 add_env="LD_PRELOAD=$memprofso"
 
 # Generate data file name.
+datafile=
 if test -n "$data"; then
   datafile="$data"
 elif test -n "$png"; then
@@ -229,21 +230,22 @@ if test -n "$notimer"; then
 fi
 
 # Execute the program itself.
-eval $add_env $*
+eval $add_env '"$@"'
 result=$?
 
-# Generate the PNG data file is wanted and there is something to generate
+# Generate the PNG data file if wanted and there is something to generate
 # it from.
-if test -n "$png" -a -s "$datafile"; then
+if test -n "$png" -a -n "$datafile" -a -s "$datafile"; then
   # Append extension .png if it isn't already there.
-  if test $png = ${png%*.png}; then
-    png="$png.png"
-  fi
-  eval $memprofstat $memprofstat_args $datafile $png
+  case $png in
+  *.png) ;;
+  *) png="$png.png" ;;
+  esac
+  $memprofstat $memprofstat_args "$datafile" "$png"
 fi
 
-if test -z "$data" -a -n $datafile; then
-  rm -f $datafile
+if test -z "$data" -a -n "$datafile"; then
+  rm -f "$datafile"
 fi
 
 exit $result
diff --git a/math/Makefile b/math/Makefile
index 34136b91c9..670faaf854 100644
--- a/math/Makefile
+++ b/math/Makefile
@@ -77,7 +77,7 @@ distribute += $(long-c-yes:=.c)
 # Rules for the test suite.
 tests = test-float test-double $(test-longdouble-$(long-double-fcts)) \
 	test-ifloat test-idouble test-matherr test-fenv \
-	atest-exp atest-sincos atest-exp2
+	atest-exp atest-sincos atest-exp2 basic-test
 # We do the `long double' tests only if this data type is available and
 # distinct from `double'.
 test-longdouble-yes = test-ldouble test-ildoubl
diff --git a/math/basic-test.c b/math/basic-test.c
new file mode 100644
index 0000000000..470651968b
--- /dev/null
+++ b/math/basic-test.c
@@ -0,0 +1,123 @@
+/* Copyright (C) 1999 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Andreas Jaeger <aj@suse.de>, 1999.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <math.h>
+#include <float.h>
+#include <stdio.h>
+
+static int errors = 0;
+
+
+static void
+check (const char *testname, int result)
+{
+  if (!result) {
+    printf ("Failure: %s\n", testname);
+    errors++;
+  }
+}
+
+#define TEST_FUNC(NAME, FLOAT, NANFUNC, EPSILON, HUGEVAL) \
+static void								      \
+NAME (void)								      \
+{									      \
+  /* Variables are declared volatile to forbid some compiler		      \
+     optimizations.  */							      \
+  volatile FLOAT Inf_var, NaN_var, zero_var, one_var;			      \
+  FLOAT x1, x2;								      \
+									      \
+  zero_var = 0.0;							      \
+  one_var = 1.0;							      \
+  NaN_var = zero_var/zero_var;						      \
+  Inf_var = one_var / zero_var;						      \
+									      \
+  (void) &zero_var;							      \
+  (void) &one_var;							      \
+  (void) &NaN_var;							      \
+  (void) &Inf_var;							      \
+									      \
+									      \
+  check (#FLOAT " isinf (inf) == 1", isinf (Inf_var) == 1);		      \
+  check (#FLOAT " isinf (-inf) == -1", isinf (-Inf_var) == -1);		      \
+  check (#FLOAT " !isinf (1)", !(isinf (one_var)));			      \
+  check (#FLOAT " !isinf (NaN)", !(isinf (NaN_var)));			      \
+									      \
+  check (#FLOAT " isnan (NaN)", isnan (NaN_var));			      \
+  check (#FLOAT " isnan (-NaN)", isnan (-NaN_var));			      \
+  check (#FLOAT " !isnan (1)", !(isnan (one_var)));			      \
+  check (#FLOAT " !isnan (inf)", !(isnan (Inf_var)));			      \
+									      \
+  check (#FLOAT " inf == inf", Inf_var == Inf_var);			      \
+  check (#FLOAT " -inf == -inf", -Inf_var == -Inf_var);			      \
+  check (#FLOAT " inf != -inf", Inf_var != -Inf_var);			      \
+  check (#FLOAT " NaN != NaN", NaN_var != NaN_var);			      \
+									      \
+  /*									      \
+     the same tests but this time with NAN from <bits/nan.h>		      \
+     NAN is a double const						      \
+   */									      \
+  check (#FLOAT " isnan (NAN)", isnan (NAN));				      \
+  check (#FLOAT " isnan (-NAN)", isnan (-NAN));				      \
+  check (#FLOAT " !isinf (NAN)", !(isinf (NAN)));			      \
+  check (#FLOAT " !isinf (-NAN)", !(isinf (-NAN)));			      \
+  check (#FLOAT " NAN != NAN", NAN != NAN);				      \
+									      \
+  /*									      \
+     And again with the value returned by the `nan' function.		      \
+   */									      \
+  check (#FLOAT " isnan (NAN)", isnan (NANFUNC ("")));			      \
+  check (#FLOAT " isnan (-NAN)", isnan (-NANFUNC ("")));		      \
+  check (#FLOAT " !isinf (NAN)", !(isinf (NANFUNC (""))));		      \
+  check (#FLOAT " !isinf (-NAN)", !(isinf (-NANFUNC (""))));		      \
+  check (#FLOAT " NAN != NAN", NANFUNC ("") != NANFUNC (""));		      \
+									      \
+  /* test if EPSILON is ok */						      \
+  x1 = 1.0;								      \
+  x2 = x1 + EPSILON;							      \
+  check (#FLOAT " 1 != 1+EPSILON", x1 != x2);				      \
+									      \
+  x1 = 1.0;								      \
+  x2 = x1 - EPSILON;							      \
+  check (#FLOAT " 1 != 1-EPSILON", x1 != x2);				      \
+									      \
+  /* test if HUGE_VALx is ok */						      \
+  x1 = HUGEVAL;								      \
+  check (#FLOAT " isinf (HUGE_VALx) == +1", isinf (x1) == +1);		      \
+  x1 = - HUGEVAL;							      \
+  check (#FLOAT " isinf (-HUGE_VALx) == -1", isinf (x1) == -1);		      \
+}
+
+TEST_FUNC (float_test, float, nanf, FLT_EPSILON, HUGE_VALF)
+TEST_FUNC (double_test, double, nan, DBL_EPSILON, HUGE_VAL)
+#ifndef NO_LONG_DOUBLE
+TEST_FUNC (ldouble_test, long double, nan, LDBL_EPSILON, HUGE_VALL)
+#endif
+
+int
+main (void)
+{
+  float_test ();
+  double_test ();
+
+#ifndef NO_LONG_DOUBLE
+  ldouble_test ();
+#endif
+
+  return errors != 0;
+}
diff --git a/nis/nss_nisplus/nisplus-parser.c b/nis/nss_nisplus/nisplus-parser.c
index e8d107922b..7a91992764 100644
--- a/nis/nss_nisplus/nisplus-parser.c
+++ b/nis/nss_nisplus/nisplus-parser.c
@@ -307,7 +307,8 @@ _nss_nisplus_parse_spent (nis_result *result, struct spwd *sp,
   first_unused += (len + 1);
 
   sp->sp_lstchg = sp->sp_min = sp->sp_max = sp->sp_warn = sp->sp_inact =
-    sp->sp_expire = sp->sp_flag = -1;
+    sp->sp_expire = -1;
+  sp->sp_flag = ~0ul;
 
   if (NISENTRYLEN (0, 7, result) > 0)
     {
@@ -316,49 +317,56 @@ _nss_nisplus_parse_spent (nis_result *result, struct spwd *sp,
       line = NISENTRYVAL (0, 7, result);
       cp = strchr (line, ':');
       if (cp == NULL)
-	return 0;
+	return 1;
       *cp++ = '\0';
-      sp->sp_lstchg = atol (line);
+      if (*line)
+	sp->sp_lstchg = atol (line);
 
       line = cp;
       cp = strchr (line, ':');
       if (cp == NULL)
-	return 0;
+	return 1;
       *cp++ = '\0';
-      sp->sp_min = atol (line);
+      if (*line)
+	sp->sp_min = atol (line);
 
       line = cp;
       cp = strchr (line, ':');
       if (cp == NULL)
-	return 0;
+	return 1;
       *cp++ = '\0';
-      sp->sp_max = atol (line);
+      if (*line)
+	sp->sp_max = atol (line);
 
       line = cp;
       cp = strchr (line, ':');
       if (cp == NULL)
-	return 0;
+	return 1;
       *cp++ = '\0';
-      sp->sp_warn = atol (line);
+      if (*line)
+	sp->sp_warn = atol (line);
 
       line = cp;
       cp = strchr (line, ':');
       if (cp == NULL)
-	return 0;
+	return 1;
       *cp++ = '\0';
-      sp->sp_inact = atol (line);
+      if (*line)
+	sp->sp_inact = atol (line);
 
       line = cp;
       cp = strchr (line, ':');
       if (cp == NULL)
-	return 0;
+	return 1;
       *cp++ = '\0';
-      sp->sp_expire = atol (line);
+      if (*line)
+	sp->sp_expire = atol (line);
 
       line = cp;
       if (line == NULL)
-	return 0;
-      sp->sp_flag = atol (line);
+	return 1;
+      if (*line)
+	sp->sp_flag = atol (line);
     }
 
   return 1;
diff --git a/timezone/europe b/timezone/europe
index 4b4290ec65..ea38d124ac 100644
--- a/timezone/europe
+++ b/timezone/europe
@@ -1,4 +1,4 @@
-# @(#)europe	7.64
+# @(#)europe	7.65
 
 # This data is by no means authoritative; if you think you know better,
 # go ahead and edit the file (and please send any changes to
@@ -723,6 +723,23 @@
 # clear whether the islands were using GMT or local time then.  The
 # changes in Alderney and Guernsey were at the same 2am GMT time as
 # for Great Britain; the order for Jersey is more interesting.
+#
+# From Paul Eggert (1999-10-06):
+# Mark Brader kindly translated the 1916 Jersey order from the French.
+# It says that the 1916 transitions were 05-20 and 09-30 at midnight.
+# Presumably this was 24:00, two hours earlier than Great Britain.
+# It also says that after 1916 they'll sync with Great Britain.
+
+# From Joseph S. Myers (1999-09-28):
+# I have the 1918 orders for Guernsey, Alderney (both changing on same
+# dates as UK, 2am GMT) and Sark (same dates; start and end at 2am,
+# start "temps de Greenwich" (not specified as "temps moyen de
+# Greenwich" which was used in the other orders) and end in an
+# unspecified zone).  For Jersey the same file (Public Record Office: HO
+# 45/10892/357138) includes letters to the effect that in 1918 and 1919
+# the States of Jersey agreed the same start and end dates as the UK
+# (times unspecified, and it was the 1916 Jersey order that specified
+# change at midnight of an unspecified zone).
 
 # From Joseph S. Myers <jsm28@hermes.cam.ac.uk> (1998-01-06):
 #
@@ -1304,6 +1321,15 @@ Zone America/Thule	-4:35:08 -	LMT	1916 Jul 28 # Pituffik
 # for their standard and summer times. He says no, they use "suveaeg"
 # (summer time) and "talveaeg" (winter time).
 
+# From <a href="http://www.baltictimes.com/">The Baltic Times</a> (1999-09-09)
+# via Steffen Thorsen:
+# This year will mark the last time Estonia shifts to summer time,
+# a council of the ruling coalition announced Sept. 6....
+# But what this could mean for Estonia's chances of joining the European
+# Union are still unclear.  In 1994, the EU declared summer time compulsory
+# for all member states until 2001.  Brussels has yet to decide what to do
+# after that. 
+
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Europe/Tallinn	1:39:00	-	LMT	1880
 			1:39:00	-	TMT	1918 Feb # Tallinn Mean Time
@@ -1315,7 +1341,8 @@ Zone	Europe/Tallinn	1:39:00	-	LMT	1880
 			3:00	Russia	MSK/MSD	1989 Mar 26 2:00s
 			2:00	1:00	EEST	1989 Sep 24 2:00s
 			2:00	C-Eur	EE%sT	1998 Sep 22
-			2:00	EU	EE%sT
+			2:00	EU	EE%sT	2000
+			2:00	-	EET
 
 # Finland
 #
@@ -1715,6 +1742,24 @@ Zone	Europe/Vaduz	0:38:04 -	LMT	1894 Jun
 			1:00	EU	CE%sT
 
 # Lithuania
+
+# From Paul Eggert (1996-11-22):
+# IATA SSIM (1992/1996) says Lithuania uses W-Eur rules, but since it is
+# known to be wrong about Estonia and Latvia, assume it's wrong here too.
+
+# From Marius Gedminas <mgedmin@pub.osf.lt> (1998-08-07):
+# I would like to inform that in this year Lithuanian time zone
+# (Europe/Vilnius) was changed.
+
+# From <a href="http://www.elta.lt/">ELTA</a> No. 972 (2582) (1999-09-29),
+# via Steffen Thorsen:
+# Lithuania has shifted back to the second time zone (GMT plus two hours)
+# to be valid here starting from October 31,
+# as decided by the national government on Wednesday....
+# The Lithuanian government also announced plans to consider a
+# motion to give up shifting to summer time in spring, as it was
+# already done by Estonia. 
+
 # Zone	NAME		GMTOFF	RULES	FORMAT	[UNTIL]
 Zone	Europe/Vilnius	1:41:16	-	LMT	1880
 			1:24:00	-	WMT	1917	    # Warsaw Mean Time
@@ -1728,14 +1773,8 @@ Zone	Europe/Vilnius	1:41:16	-	LMT	1880
 			2:00	1:00	EEST	1991 Sep 29 2:00s
 			2:00	C-Eur	EE%sT	1998
 			2:00	-	EET	1998 Mar 29 1:00u
-			1:00	EU	CE%sT
-# From Paul Eggert (1996-11-22):
-# IATA SSIM (1992/1996) says Lithuania uses W-Eur rules, but since it is
-# known to be wrong about Estonia and Latvia, assume it's wrong here too.
-
-# From Marius Gedminas <mgedmin@pub.osf.lt> (1998-08-07):
-# I would like to inform that in this year Lithuanian time zone
-# (Europe/Vilnius) was changed.
+			1:00	EU	CE%sT	1999 Oct 31 1:00u
+			2:00	EU	EE%sT
 
 # Luxembourg
 # Whitman disagrees with most of these dates in minor ways; go with Shanks.