Update.
authorUlrich Drepper <drepper@redhat.com>
Fri, 8 Oct 1999 17:16:17 +0000 (17:16 +0000)
committerUlrich Drepper <drepper@redhat.com>
Fri, 8 Oct 1999 17:16:17 +0000 (17:16 +0000)
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.

13 files changed:
ChangeLog
debug/xtrace.sh
linuxthreads/sysdeps/pthread/Subdirs [moved from linuxthreads/Implies with 100% similarity]
linuxthreads_db/ChangeLog
linuxthreads_db/shlib-versions [new file with mode: 0644]
linuxthreads_db/td_ta_get_nthreads.c
linuxthreads_db/td_ta_new.c
linuxthreads_db/thread_db.h
malloc/memprof.sh
math/Makefile
math/basic-test.c [new file with mode: 0644]
nis/nss_nisplus/nisplus-parser.c
timezone/europe

index 551ddacbb1ceaaddc9be604b2682e4faa1d582f1..4950a18d91b0c372cc4d867f0ec47736a1ba5979 100644 (file)
--- 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.
index c688391ff1740545e17114b2b46dcb2464005265..241ebe8954d470804ba3defd93da82800d74e7a7 100755 (executable)
@@ -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
index 1ee1a7e66a6c3f9deb95afc18ed0cf5aa7ed9e2c..86261473f2f9ffa08b9fd7fb408d27e5ca6805f3 100644 (file)
@@ -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 (file)
index 0000000..592f7fa
--- /dev/null
@@ -0,0 +1,2 @@
+# The thread debug library
+.*-.*-linux.*          libthread_db=1
index 955555b2e53a11782e24f84a3cceb089f2fd5cfa..13d50329c150d9d1300c98deee8544a0eec51196 100644 (file)
@@ -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?  */
 
index d018ac6807dc551aed82c906d372cda71d858f42..15f445a877d45daef825bc5b63ecb6aaec996f00 100644 (file)
@@ -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
index f65363ebc67c7a7b89a91cc8aa44b1cdf917aef2..310e2ae75ab4fe6b62cee80ecc348223873320f9 100644 (file)
@@ -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);
 
index d7d875070440ffa2225f0ba3ae18c5c702a78baf..5fc011b7d9011ea08d305ca1d29d67ed94e1776f 100755 (executable)
@@ -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
index 34136b91c980a0652b3f89fa33b78601c3d6cf1b..670faaf8540c5fcdf922a5f7196dd5ad0c76bad9 100644 (file)
@@ -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 (file)
index 0000000..4706519
--- /dev/null
@@ -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;
+}
index e8d107922bffed5baf3dda4c6cdd85015dadb5e7..7a9199276403551c3d6f91852daf4ce2916e6f0d 100644 (file)
@@ -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;
index 4b4290ec65d224836149758e7003cd27faacc5cf..ea38d124ac97baa1101b6bbd7d0007b50caac1da 100644 (file)
@@ -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
 # 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.