update from main archive
authordrepper <drepper>
Fri, 27 Sep 1996 03:20:48 +0000 (03:20 +0000)
committerdrepper <drepper>
Fri, 27 Sep 1996 03:20:48 +0000 (03:20 +0000)
32 files changed:
inet/rcmd.c
intl/dcgettext.c
io/creat.c
io/fts.c
io/ftw.c
io/getwd.c
io/lockf.c
libio/Makefile
libio/fileops.c
libio/genops.c
libio/iofdopen.c
libio/iofgetpos.c
libio/iofsetpos.c
libio/ioftell.c
libio/iogetdelim.c
libio/libioP.h
locale/C-time.c
locale/categories.def
locale/langinfo.h
locale/lc-time.c
locale/loadlocale.c
locale/localeinfo.h
locale/nl_langinfo.c
locale/programs/ld-time.c
locale/programs/locale.c
locale/programs/localedef.c
locale/programs/locfile.c
locale/setlocale.c
login/getutid_r.c
login/getutline_r.c
login/login.c
login/pututline_r.c

index 00fa965..1c63e95 100644 (file)
@@ -111,7 +111,7 @@ rcmd(ahost, rport, locuser, remuser, cmd, fd2p)
 
                        (void)fprintf(stderr, _("connect to address %s: "),
                            inet_ntoa(sin.sin_addr));
-                       errno = oerrno;
+                       __set_errno (oerrno);
                        perror(0);
                        hp->h_addr_list++;
                        bcopy(hp->h_addr_list[0], &sin.sin_addr, hp->h_length);
@@ -146,7 +146,7 @@ rcmd(ahost, rport, locuser, remuser, cmd, fd2p)
                FD_ZERO(&reads);
                FD_SET(s, &reads);
                FD_SET(s2, &reads);
-               errno = 0;
+               __set_errno (0);
                if (select(1 + (s > s2 ? s : s2), &reads, 0, 0, 0) < 1 ||
                    !FD_ISSET(s2, &reads)) {
                        if (errno != 0)
@@ -227,7 +227,7 @@ rresvport(alport)
                (*alport)--;
                if (*alport == IPPORT_RESERVED/2) {
                        (void)close(s);
-                       errno = EAGAIN;         /* close */
+                       __set_errno (EAGAIN);           /* close */
                        return (-1);
                }
        }
index 7bbe170..592f724 100644 (file)
@@ -46,6 +46,9 @@ char *alloca ();
 #ifndef errno
 extern int errno;
 #endif
+#ifndef __set_errno
+# define __set_errno(val) errno = (val)
+#endif
 
 #if defined STDC_HEADERS || defined _LIBC
 # include <stdlib.h>
@@ -277,13 +280,13 @@ DCGETTEXT (domainname, msgid, category)
       dirname = (char *) alloca (path_max + dirname_len);
       ADD_BLOCK (block_list, dirname);
 
-      errno = 0;
+      __set_errno (0);
       while ((ret = getcwd (dirname, path_max)) == NULL && errno == ERANGE)
        {
          path_max += PATH_INCR;
          dirname = (char *) alloca (path_max + dirname_len);
          ADD_BLOCK (block_list, dirname);
-         errno = 0;
+         __set_errno (0);
        }
 
       if (ret == NULL)
@@ -291,7 +294,7 @@ DCGETTEXT (domainname, msgid, category)
          /* We cannot get the current working directory.  Don't signal an
             error but simply return the default string.  */
          FREE_BLOCKS (block_list);
-         errno = saved_errno;
+         __set_errno (saved_errno);
          return (char *) msgid;
        }
 
@@ -352,7 +355,7 @@ DCGETTEXT (domainname, msgid, category)
          || strcmp (single_locale, "POSIX") == 0)
        {
          FREE_BLOCKS (block_list);
-         errno = saved_errno;
+         __set_errno (saved_errno);
          return (char *) msgid;
        }
 
@@ -381,7 +384,7 @@ DCGETTEXT (domainname, msgid, category)
          if (retval != NULL)
            {
              FREE_BLOCKS (block_list);
-             errno = saved_errno;
+             __set_errno (saved_errno);
              return retval;
            }
        }
index ee935c8..1e1717b 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 1996 Free Software Foundation, Inc.
 This file is part of the GNU C Library.
 
 The GNU C Library is free software; you can redistribute it and/or
@@ -16,7 +16,6 @@ License along with the GNU C Library; see the file COPYING.LIB.  If
 not, write to the Free Software Foundation, Inc., 675 Mass Ave,
 Cambridge, MA 02139, USA.  */
 
-#include <ansidecl.h>
 #include <fcntl.h>
 #include <sys/types.h>
 
@@ -24,7 +23,9 @@ Cambridge, MA 02139, USA.  */
 
 /* Create FILE with protections MODE.  */
 int
-DEFUN(creat, (file, mode), CONST char *file AND mode_t mode)
+creat (file, mode)
+     const char *file;
+     mode_t mode;
 {
-  return __open(file, O_WRONLY|O_CREAT|O_TRUNC, mode);
+  return __open (file, O_WRONLY|O_CREAT|O_TRUNC, mode);
 }
index fe5750a..5e57eaf 100644 (file)
--- a/io/fts.c
+++ b/io/fts.c
@@ -100,7 +100,7 @@ fts_open(argv, options, compar)
 
        /* Options check. */
        if (options & ~FTS_OPTIONMASK) {
-               errno = EINVAL;
+               __set_errno (EINVAL);
                return (NULL);
        }
 
@@ -134,7 +134,7 @@ fts_open(argv, options, compar)
        for (root = NULL, nitems = 0; *argv; ++argv, ++nitems) {
                /* Don't allow zero-length paths. */
                if ((len = strlen(*argv)) == 0) {
-                       errno = ENOENT;
+                       __set_errno (ENOENT);
                        goto mem3;
                }
 
@@ -262,7 +262,7 @@ fts_close(sp)
 
        /* Set errno and return. */
        if (!ISSET(FTS_NOCHDIR) && saved_errno) {
-               errno = saved_errno;
+               __set_errno (saved_errno);
                return (-1);
        }
        return (0);
@@ -425,7 +425,7 @@ name:               t = sp->fts_path + NAPPEND(p->fts_parent);
                 * can distinguish between error and EOF.
                 */
                free(p);
-               errno = 0;
+               __set_errno (0);
                return (sp->fts_cur = NULL);
        }
 
@@ -446,7 +446,7 @@ name:               t = sp->fts_path + NAPPEND(p->fts_parent);
                if (FCHDIR(sp, p->fts_symfd)) {
                        saved_errno = errno;
                        (void)close(p->fts_symfd);
-                       errno = saved_errno;
+                       __set_errno (saved_errno);
                        SET(FTS_STOP);
                        return (NULL);
                }
@@ -476,7 +476,7 @@ fts_set(sp, p, instr)
 {
        if (instr && instr != FTS_AGAIN && instr != FTS_FOLLOW &&
            instr != FTS_NOINSTR && instr != FTS_SKIP) {
-               errno = EINVAL;
+               __set_errno (EINVAL);
                return (1);
        }
        p->fts_instr = instr;
@@ -492,7 +492,7 @@ fts_children(sp, instr)
        int fd;
 
        if (instr && instr != FTS_NAMEONLY) {
-               errno = EINVAL;
+               __set_errno (EINVAL);
                return (NULL);
        }
 
@@ -503,7 +503,7 @@ fts_children(sp, instr)
         * Errno set to 0 so user can distinguish empty directory from
         * an error.
         */
-       errno = 0;
+       __set_errno (0);
 
        /* Fatal errors stop here. */
        if (ISSET(FTS_STOP))
@@ -681,7 +681,7 @@ mem1:                               saved_errno = errno;
                                        free(p);
                                fts_lfree(head);
                                (void)closedir(dirp);
-                               errno = saved_errno;
+                               __set_errno (saved_errno);
                                cur->fts_info = FTS_ERR;
                                SET(FTS_STOP);
                                return (NULL);
@@ -803,7 +803,7 @@ fts_stat(sp, p, follow)
                if (stat(p->fts_accpath, sbp)) {
                        saved_errno = errno;
                        if (!lstat(p->fts_accpath, sbp)) {
-                               errno = 0;
+                               __set_errno (0);
                                return (FTS_SLNONE);
                        }
                        p->fts_errno = saved_errno;
index ff2e2b1..b8d745b 100644 (file)
--- a/io/ftw.c
+++ b/io/ftw.c
@@ -47,7 +47,7 @@ DEFUN (ftw_dir, (dirs, level, descriptors, dir, len, func),
 
   got = 0;
 
-  errno = 0;
+  __set_errno (0);
 
   while ((entry = readdir (dirs[level])) != NULL)
     {
@@ -61,7 +61,7 @@ DEFUN (ftw_dir, (dirs, level, descriptors, dir, len, func),
          && (entry->d_name[1] == '\0' ||
              (entry->d_name[1] == '.' && entry->d_name[2] == '\0')))
        {
-         errno = 0;
+         __set_errno (0);
          continue;
        }
 
@@ -70,9 +70,9 @@ DEFUN (ftw_dir, (dirs, level, descriptors, dir, len, func),
       if (namlen + len + 1 > PATH_MAX)
        {
 #ifdef ENAMETOOLONG
-         errno = ENAMETOOLONG;
+         __set_errno (ENAMETOOLONG);
 #else
-         errno = ENOMEM;
+         __set_errno (ENOMEM);
 #endif
          return -1;
        }
@@ -120,7 +120,7 @@ DEFUN (ftw_dir, (dirs, level, descriptors, dir, len, func),
 
              save = errno;
              closedir (dirs[newlev]);
-             errno = save;
+             __set_errno (save);
              dirs[newlev] = NULL;
            }
        }
@@ -139,13 +139,13 @@ DEFUN (ftw_dir, (dirs, level, descriptors, dir, len, func),
          skip = got;
          while (skip-- != 0)
            {
-             errno = 0;
+             __set_errno (0);
              if (readdir (dirs[level]) == NULL)
                return errno == 0 ? 0 : -1;
            }
        }
 
-      errno = 0;
+      __set_errno (0);
     }
 
   return errno == 0 ? 0 : -1;
@@ -211,7 +211,7 @@ DEFUN(ftw, (dir, func, descriptors),
 
          save = errno;
          closedir (dirs[0]);
-         errno = save;
+         __set_errno (save);
        }
     }
 
index 8a8d01a..00825ee 100644 (file)
@@ -37,7 +37,7 @@ getwd (buf)
 
   if (buf == NULL)
     {
-      errno = EINVAL;
+      __set_errno (EINVAL);
       return NULL;
     }
 
index 9166419..c391243 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1994 Free Software Foundation, Inc.
+/* Copyright (C) 1994, 1996 Free Software Foundation, Inc.
 This file is part of the GNU C Library.
 
 The GNU C Library is free software; you can redistribute it and/or
@@ -37,7 +37,7 @@ lockf (int fd, int cmd, off_t len)
        return -1;
       if (fl.l_type == F_UNLCK || fl.l_pid == getpid ())
        return 0;
-      errno = EACCES;
+      __set_errno (EACCES);
       return -1;
 
     case F_ULOCK:
@@ -54,7 +54,7 @@ lockf (int fd, int cmd, off_t len)
       break;
 
     default:
-      errno = EINVAL;
+      __set_errno (EINVAL);
       return -1;
     }
 
index 902d63f..ba64fc7 100644 (file)
@@ -36,6 +36,8 @@ routines      :=                                                            \
                                                                              \
        libc_fatal
 
+all: # Make this the default target; it will be defined in Rules.
+
 include ../Makeconfig
 
 ifneq (,$(filter %REENTRANT, $(defines)))
index a3138af..b4bd5ce 100644 (file)
@@ -165,7 +165,7 @@ DEFUN(_IO_file_fopen, (fp, filename, mode),
     read_write = _IO_NO_READS|_IO_IS_APPENDING;
     break;
   default:
-    errno = EINVAL;
+    __set_errno (EINVAL);
     return NULL;
   }
   if (mode[0] == '+' || (mode[0] == 'b' && mode[1] == '+')) {
index 818e740..7c2dcba 100644 (file)
@@ -466,7 +466,7 @@ DEFUN(_IO_init, (fp, flags),
   fp->_markers = NULL;
   fp->_cur_column = 0;
 #ifdef _IO_MTSAFE_IO
-  __libc_lock_init (fp->_lock);
+  __libc_lock_init (*fp->_lock);
 #endif
 }
 
@@ -501,7 +501,7 @@ DEFUN(_IO_default_finish, (fp),
     }
 
 #ifdef _IO_MTSAFE_IO
-  __libc_lock_fini (fp->_lock);
+  __libc_lock_fini (*fp->_lock);
 #endif
 
   _IO_un_link(fp);
index 797192e..67c629c 100644 (file)
@@ -61,9 +61,7 @@ _IO_fdopen (fd, mode)
       read_write = _IO_NO_READS|_IO_IS_APPENDING;
       break;
     default:
-#ifdef EINVAL
-      errno = EINVAL;
-#endif
+      MAYBE_SET_EINVAL;
       return NULL;
   }
   if (mode[0] == '+' || (mode[0] == 'b' && mode[1] == '+'))
index c45cfac..4cec7a7 100644 (file)
@@ -41,7 +41,7 @@ _IO_fgetpos (fp, posp)
     {
 #ifdef EIO
       if (errno == 0)
-       errno = EIO;
+       __set_errno (EIO);
 #endif
       return EOF;
     }
index 96c3a7a..9013606 100644 (file)
@@ -39,7 +39,7 @@ _IO_fsetpos (fp, posp)
       /*ANSI explicily requires setting errno to a positive value on failure.*/
 #ifdef EIO
       if (errno == 0)
-       errno = EIO;
+       __set_errno (EIO);
 #endif
       result = EOF;
     }
index 12b90b3..ec3b1a2 100644 (file)
@@ -40,7 +40,7 @@ _IO_ftell (fp)
     {
 #ifdef EIO
       if (errno == 0)
-       errno = EIO;
+       __set_errno (EIO);
 #endif
       return -1L;
     }
index 0acd76e..da6efa4 100644 (file)
@@ -48,9 +48,7 @@ _IO_getdelim (lineptr, n, delimiter, fp)
 
   if (lineptr == NULL || n == NULL)
     {
-#ifdef EINVAL
-      errno = EINVAL;
-#endif
+      MAYBE_SET_EINVAL;
       return -1;
     }
   CHECK_FILE (fp, -1);
index f5e6dc5..d3c871f 100644 (file)
@@ -397,7 +397,7 @@ extern struct _IO_fake_stdiobuf _IO_stdin_buf, _IO_stdout_buf, _IO_stderr_buf;
 #endif
 
 #ifdef EINVAL
-#define MAYBE_SET_EINVAL errno = EINVAL
+#define MAYBE_SET_EINVAL __set_errno (EINVAL)
 #else
 #define MAYBE_SET_EINVAL /* nothing */
 #endif
index b03ff49..dbb51f3 100644 (file)
@@ -26,7 +26,7 @@ const struct locale_data _nl_C_LC_TIME =
 {
   _nl_C_name,
   NULL, 0, /* no file mapped */
-  45,
+  53,
   {
     { string: "Sun" },
     { string: "Mon" },
@@ -72,6 +72,14 @@ const struct locale_data _nl_C_LC_TIME =
     { string: "%m/%d/%y" },
     { string: "%H:%M:%S" },
     { string: "%I:%M:%S %p" },
-    { string: NULL }
+    { string: NULL },
+    { string: NULL },
+    { string: NULL },
+    { string: NULL },
+    { string: NULL },
+    { string: NULL },
+    { word: 0 },
+    { string: NULL },
+    { string: NULL },
   }
 };
index 5e72319..664fc90 100644 (file)
@@ -137,16 +137,17 @@ DEFINE_CATEGORY
   DEFINE_ELEMENT (D_FMT,       "d_fmt",       std, string)
   DEFINE_ELEMENT (T_FMT,       "t_fmt",       std, string)
   DEFINE_ELEMENT (T_FMT_AMPM,  "t_fmt_ampm",  std, string)
-  DEFINE_ELEMENT (ERA,         "era",         opt, stringarray,  0, 100)/*XXX*/
+  DEFINE_ELEMENT (ERA,         "era",         opt, stringarray)
   DEFINE_ELEMENT (ERA_YEAR,    "era_year",    opt, string)
   DEFINE_ELEMENT (ERA_D_FMT,   "era_d_fmt",   opt, string)
   DEFINE_ELEMENT (ALT_DIGITS,  "alt_digits",  opt, stringarray,  0, 100)
   DEFINE_ELEMENT (ERA_D_T_FMT, "era_d_t_fmt", opt, string)
   DEFINE_ELEMENT (ERA_T_FMT,   "era_t_fmt",   opt, string)
+  DEFINE_ELEMENT (_NL_TIME_NUM_ALT_DIGITS,  "time-num-alt-digits", opt, word)
   DEFINE_ELEMENT (_NL_TIME_ERA_NUM_ENTRIES, "time-era-num-entries", opt, word)
-  DEFINE_ELEMENT (_NL_TIME_ERA_ENTRIES_EB, "time-era-entries-eb", opt, string)
-  DEFINE_ELEMENT (_NL_TIME_ERA_ENTRIES_EL, "time-era-entries-el", opt, string)
-  ), NO_POSTLOAD, NULL, NULL, NULL)
+  DEFINE_ELEMENT (_NL_TIME_ERA_ENTRIES_EB,  "time-era-entries-eb", opt, string)
+  DEFINE_ELEMENT (_NL_TIME_ERA_ENTRIES_EL,  "time-era-entries-el", opt, string)
+  ), _nl_postload_time, NULL, NULL, NULL)
 
 
 DEFINE_CATEGORY
index 82bd510..4df8df7 100644 (file)
@@ -101,6 +101,8 @@ typedef enum
   ERA_D_T_FMT,                 /* Date and time in alternate era format.  */
   ERA_T_FMT,                   /* Time in alternate era format.  */
 
+  _NL_TIME_NUM_ALT_DIGITS,     /* Number entries in the alt_digits arrays.  */
+
   _NL_TIME_ERA_NUM_ENTRIES,    /* Number entries in the era arrays.  */
   _NL_TIME_ERA_ENTRIES_EB,     /* Structure with era entries in usable form.*/
   _NL_TIME_ERA_ENTRIES_EL,
index 7b84f99..f4fe561 100644 (file)
@@ -1,5 +1,5 @@
 /* Define current locale data for LC_TIME category.
-Copyright (C) 1995 Free Software Foundation, Inc.
+Copyright (C) 1995, 1996 Free Software Foundation, Inc.
 This file is part of the GNU C Library.
 
 The GNU C Library is free software; you can redistribute it and/or
@@ -17,6 +17,160 @@ License along with the GNU C Library; see the file COPYING.LIB.  If
 not, write to the Free Software Foundation, Inc., 675 Mass Ave,
 Cambridge, MA 02139, USA.  */
 
+#include <libc-lock.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
 #include "localeinfo.h"
 
 _NL_CURRENT_DEFINE (LC_TIME);
+
+/* Some of the functions here must not be used while setlocale is called.  */
+__libc_lock_define (extern, __libc_setlocale_lock)
+
+
+static int era_initialized;
+static struct era_entry **eras;
+static size_t num_eras;
+
+
+static int alt_digits_initialized;
+static const char **alt_digits;
+static size_t num_alt_digits;
+
+
+void
+_nl_postload_time (void)
+{
+  /* Prepare lazy initialization of `era' and `alt_digits' array.  */
+  era_initialized = 0;
+  alt_digits_initialized = 0;
+}
+
+
+struct era_entry *
+_nl_get_era_entry (const struct tm *tp)
+{
+  struct era_entry *result;
+  size_t cnt;
+
+  __libc_lock_lock (__libc_setlocale_lock);
+
+  if (era_initialized == 0)
+    {
+      size_t new_num_eras = _NL_CURRENT_WORD (LC_TIME,
+                                             _NL_TIME_ERA_NUM_ENTRIES);
+
+      if (eras != NULL && new_num_eras == 0)
+       {
+         free (eras);
+         eras = NULL;
+       }
+      else if (new_num_eras != 0)
+       {
+         if (num_eras != new_num_eras)
+           eras = realloc (eras, new_num_eras * sizeof (struct era_entry *));
+
+         if (eras == NULL)
+           num_eras = 0;
+         else
+           {
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+             const char *ptr = _NL_CURRENT (LC_TIME, _NL_TIME_ERA_ENTRIES_EL);
+#else
+             const char *ptr = _NL_CURRENT (LC_TIME, _NL_TIME_ERA_ENTRIES_EB);
+#endif
+             num_eras = new_num_eras;
+
+             for (cnt = 0; cnt < num_eras; ++cnt)
+               {
+                 eras[cnt] = (struct era_entry *) ptr;
+
+                 /* Skip numeric values.  */
+                 ptr += sizeof (struct era_entry);
+                 /* Skip era name. */
+                 ptr = strchr (ptr, '\0') + 1;
+                 /* Skip era format. */
+                 ptr = strchr (ptr, '\0') + 1;
+
+                 ptr += 3 - (((ptr - (const char *) eras[cnt]) + 3) & 3);
+               }
+           }
+       }
+
+      era_initialized = 1;
+    }
+
+  /* Now compare date with the available eras.  */
+  for (cnt = 0; cnt < num_eras; ++cnt)
+    if ((eras[cnt]->start_date[0] < tp->tm_year
+        || (eras[cnt]->start_date[0] == tp->tm_year
+            && (eras[cnt]->start_date[1] < tp->tm_mon
+                || (eras[cnt]->start_date[1] == tp->tm_mon
+                    && eras[cnt]->start_date[2] <= tp->tm_mday))))
+       && (eras[cnt]->stop_date[0] > tp->tm_year
+           || (eras[cnt]->stop_date[0] == tp->tm_year
+               && (eras[cnt]->stop_date[1] > tp->tm_mon
+                   || (eras[cnt]->stop_date[1] == tp->tm_mon
+                       && eras[cnt]->stop_date[2] >= tp->tm_mday)))))
+      break;
+
+  result = cnt < num_eras ? eras[cnt] : NULL;
+
+  __libc_lock_unlock (__libc_setlocale_lock);
+
+  return result;
+}
+
+
+const char *
+_nl_get_alt_digit (unsigned int number)
+{
+  const char *result;
+
+  __libc_lock_lock (__libc_setlocale_lock);
+
+  if (alt_digits_initialized == 0)
+    {
+      size_t new_num_alt_digits = _NL_CURRENT_WORD (LC_TIME,
+                                                   _NL_TIME_NUM_ALT_DIGITS);
+
+      if (alt_digits != NULL && new_num_alt_digits == 0)
+       {
+         free (alt_digits);
+         alt_digits = NULL;
+       }
+      else if (new_num_alt_digits != 0)
+       {
+         if (num_alt_digits != new_num_alt_digits)
+           alt_digits = realloc (alt_digits, (new_num_alt_digits
+                                              * sizeof (const char *)));
+
+         if (alt_digits == NULL)
+           num_alt_digits = 0;
+         else
+           {
+             const char *ptr = _NL_CURRENT (LC_TIME, ALT_DIGITS);
+             size_t cnt;
+
+             num_alt_digits = new_num_alt_digits;
+
+             for (cnt = 0; cnt < num_alt_digits; ++cnt)
+               {
+                 alt_digits[cnt] = ptr;
+
+                 /* Skip digit format. */
+                 ptr = strchr (ptr, '\0') + 1;
+               }
+           }
+       }
+
+      alt_digits_initialized = 1;
+    }
+
+  result = number < num_alt_digits ? alt_digits[number] : NULL;
+
+  __libc_lock_unlock (__libc_setlocale_lock);
+
+  return result;
+}
index 5894b07..474a73c 100644 (file)
@@ -144,7 +144,7 @@ _nl_load_locale (struct loaded_l10nfile *file, int category)
                    {
                      free (filedata);
                      if (nread == 0)
-                       errno = EINVAL; /* Bizarreness going on.  */
+                       __set_errno (EINVAL); /* Bizarreness going on.  */
                      goto puntfd;
                    }
                  p += nread;
@@ -153,7 +153,7 @@ _nl_load_locale (struct loaded_l10nfile *file, int category)
            }
          else
            goto puntfd;
-         errno = save_err;
+         __set_errno (save_err);
        }
       else
        goto puntfd;
@@ -184,7 +184,7 @@ _nl_load_locale (struct loaded_l10nfile *file, int category)
        >= (size_t) st.st_size))
     {
       /* Insufficient data.  */
-      errno = EINVAL;
+      __set_errno (EINVAL);
       goto puntmap;
     }
 
@@ -204,7 +204,7 @@ _nl_load_locale (struct loaded_l10nfile *file, int category)
       if (idx >= newdata->filesize)
        {
          free (newdata);
-         errno = EINVAL;
+         __set_errno (EINVAL);
          goto puntmap;
        }
       if (_nl_value_types[category][cnt] == word)
index 0646f0e..335e866 100644 (file)
@@ -22,6 +22,7 @@ Cambridge, MA 02139, USA.  */
 
 #include <stddef.h>
 #include <langinfo.h>
+#include <time.h>
 #include <sys/types.h>
 
 #include "../intl/loadinfo.h"  /* For loaded_l10nfile definition.  */
@@ -76,6 +77,17 @@ enum value_type
 };
 
 
+/* Structure to access `era' information from LC_TIME.  */
+struct era_entry
+{
+  u_int32_t direction;         /* Contains '+' or '-'.  */
+  int32_t offset;
+  int32_t start_date[3];
+  int32_t stop_date[3];
+  const char name_fmt[0];
+};
+
+
 /* For each category declare the variable for the current locale data.  */
 #define DEFINE_CATEGORY(category, category_name, items, a, b, c, d) \
 extern const struct locale_data *_nl_current_##category;
@@ -114,6 +126,13 @@ extern const struct locale_data *_nl_find_locale (const char *locale_path,
 extern void _nl_load_locale (struct loaded_l10nfile *file, int category);
 
 
+/* Return `era' entry which corresponds to TP.  Used in strftime.  */
+struct era_entry *_nl_get_era_entry (const struct tm *tp);
+
+/* Return `alt_digit' which corresponds to NUMBER.  Used in strftime.  */
+const char *_nl_get_alt_digit (unsigned int number);
+
+
 /* Global variables for LC_COLLATE category data.  */
 extern const u_int32_t *__collate_table;
 extern const u_int32_t *__collate_extra;
index a9fa423..1c42e14 100644 (file)
@@ -48,7 +48,7 @@ nl_langinfo (item)
   if (category < 0 || category >= LC_ALL)
     {
       /* Bogus category: bogus item.  */
-      errno = EINVAL;
+      __set_errno (EINVAL);
       return NULL;
     }
 
@@ -57,7 +57,7 @@ nl_langinfo (item)
   if (index >= data->nstrings)
     {
       /* Bogus index for this category: bogus item.  */
-      errno = EINVAL;
+      __set_errno (EINVAL);
       return NULL;
     }
 
index 75f6021..1b118ae 100644 (file)
@@ -27,16 +27,32 @@ Boston, MA 02111-1307, USA.  */
 /* Undefine following line in production version.  */
 /* #define NDEBUG 1 */
 #include <assert.h>
+#include <stdlib.h>
 
 #include "locales.h"
 #include "localeinfo.h"
 #include "stringtrans.h"
 
+#define SWAPU32(w) \
+  (((w) << 24) | (((w) & 0xff00) << 8) | (((w) >> 8) & 0xff00) | ((w) >> 24))
+
 
 void *xmalloc (size_t __n);
 void *xrealloc (void *__p, size_t __n);
 
 
+/* Entry describing an entry of the era specification.  */
+struct era_data
+{
+  int32_t direction;
+  int32_t offset;
+  int32_t start_date[3];
+  int32_t stop_date[3];
+  const char *name;
+  const char *format;
+};
+
+
 /* The real definition of the struct for the LC_TIME locale.  */
 struct locale_time_t
 {
@@ -55,13 +71,16 @@ struct locale_time_t
   const char *t_fmt;
   const char *t_fmt_ampm;
   const char **era;
-  size_t era_num;
+  u_int32_t cur_num_era;
   const char *era_year;
   const char *era_d_t_fmt;
   const char *era_t_fmt;
   const char *era_d_fmt;
   const char *alt_digits[100];
-  size_t cur_num_alt_digits;
+  u_int32_t cur_num_alt_digits;
+
+  struct era_data *era_entries;
+  struct era_data *era_entries_ob;
 };
 
 
@@ -109,6 +128,263 @@ time_finish (struct localedef_t *locale)
   TEST_ELEM (d_fmt);
   TEST_ELEM (t_fmt);
   TEST_ELEM (t_fmt_ampm);
+
+  /* Now process the era entries.  */
+  if (time->cur_num_era != 0)
+    {
+      const int days_per_month[12] = { 31, 29, 31, 30, 31, 30,
+                                      31, 31, 30, 31 ,30, 31 };
+      size_t idx;
+
+      time->era_entries =
+       (struct era_data *) xmalloc (time->cur_num_era
+                                    * sizeof (struct era_data));
+
+      for (idx = 0; idx < time->cur_num_era; ++idx)
+       {
+         size_t era_len = strlen (time->era[idx]);
+         char *str = xmalloc ((era_len + 1 + 3) & ~3);
+         char *endp;
+
+         memcpy (str, time->era[idx], era_len + 1);
+
+         /* First character must be + or - for the direction.  */
+         if (*str != '+' && *str != '-')
+           {
+             error (0, 0, _("direction flag in string %d in `era' field"
+                            " in category `%s' is not '+' nor '-'"),
+                    idx + 1, "LC_TIME");
+             /* Default arbitrarily to '+'.  */
+             time->era_entries[idx].direction = '+';
+           }
+         else
+           time->era_entries[idx].direction = *str;
+         if (*++str != ':')
+           {
+             error (0, 0, _("direction flag in string %d in `era' field"
+                            " in category `%s' is not a single character"),
+                    idx + 1, "LC_TIME");
+             (void) strsep (&str, ":");
+           }
+         else
+           ++str;
+
+         /* Now the offset year.  */
+         time->era_entries[idx].offset = strtol (str, &endp, 10);
+         if (endp == str)
+           {
+             error (0, 0, _("illegal number for offset in string %d in"
+                            " `era' field in category `%s'"),
+                    idx + 1, "LC_TIME");
+             (void) strsep (&str, ":");
+           }
+         else if (*endp != ':')
+           {
+             error (0, 0, _("garbage at end of offset value in string %d in"
+                            " `era' field in category `%s'"),
+                    idx + 1, "LC_TIME");
+             (void) strsep (&str, ":");
+           }
+         else
+           str = endp + 1;
+
+         /* Next is the starting date in ISO format.  */
+         if (strncmp (str, "-*", 2) == 0)
+           {
+             time->era_entries[idx].start_date[0] =
+               time->era_entries[idx].start_date[1] =
+               time->era_entries[idx].start_date[2] = 0x80000000;
+             if (str[2] != ':')
+               goto garbage_start_date;
+             str += 3;
+           }
+         else if (strncmp (str, "+*", 2) == 0)
+           {
+             time->era_entries[idx].start_date[0] =
+               time->era_entries[idx].start_date[1] =
+               time->era_entries[idx].start_date[2] = 0x7fffffff;
+             if (str[2] != ':')
+               goto garbage_start_date;
+             str += 3;
+           }
+         else
+           {
+             time->era_entries[idx].start_date[0] = strtol (str, &endp, 10);
+             if (endp == str || *endp != '/')
+               goto invalid_start_date;
+             else
+               str = endp + 1;
+             time->era_entries[idx].start_date[0] -= 1900;
+
+             time->era_entries[idx].start_date[1] = strtol (str, &endp, 10);
+             if (endp == str || *endp != '/')
+               goto invalid_start_date;
+             else
+               str = endp + 1;
+             time->era_entries[idx].start_date[1] -= 1;
+
+             time->era_entries[idx].start_date[2] = strtol (str, &endp, 10);
+             if (endp == str)
+               {
+               invalid_start_date:
+                 error (0, 0, _("illegal starting date in string %d in"
+                                " `era' field in category `%s'"),
+                        idx + 1, "LC_TIME");
+                 (void) strsep (&str, ":");
+               }
+             else if (*endp != ':')
+               {
+               garbage_start_date:
+                 error (0, 0, _("garbage at end of starting date in string %d"
+                                " in `era' field in category `%s'"),
+                        idx + 1, "LC_TIME");
+                 (void) strsep (&str, ":");
+               }
+             else
+               {
+                 str = endp + 1;
+
+                 /* Check for valid value.  */
+                 if (time->era_entries[idx].start_date[1] < 0
+                     || time->era_entries[idx].start_date[1] >= 12
+                     || time->era_entries[idx].start_date[2] < 0
+                     || (time->era_entries[idx].start_date[2]
+                         > days_per_month[time->era_entries[idx].start_date[1]])
+                     || (time->era_entries[idx].start_date[1] == 2
+                         && time->era_entries[idx].start_date[2] == 29
+                         && !__isleap (time->era_entries[idx].start_date[0])))
+                         error (0, 0, _("starting date is illegal in"
+                                        " string %d in `era' field in"
+                                        " category `%s'"),
+                                idx + 1, "LC_TIME");
+               }
+           }
+
+         /* Next is the stoping date in ISO format.  */
+         if (strncmp (str, "-*", 2) == 0)
+           {
+             time->era_entries[idx].stop_date[0] =
+               time->era_entries[idx].stop_date[1] =
+               time->era_entries[idx].stop_date[2] = 0x80000000;
+             if (str[2] != ':')
+               goto garbage_stop_date;
+             str += 3;
+           }
+         else if (strncmp (str, "+*", 2) == 0)
+           {
+             time->era_entries[idx].stop_date[0] =
+               time->era_entries[idx].stop_date[1] =
+               time->era_entries[idx].stop_date[2] = 0x7fffffff;
+             if (str[2] != ':')
+               goto garbage_stop_date;
+             str += 3;
+           }
+         else
+           {
+             time->era_entries[idx].stop_date[0] = strtol (str, &endp, 10);
+             if (endp == str || *endp != '/')
+               goto invalid_stop_date;
+             else
+               str = endp + 1;
+             time->era_entries[idx].stop_date[0] -= 1900;
+
+             time->era_entries[idx].stop_date[1] = strtol (str, &endp, 10);
+             if (endp == str || *endp != '/')
+               goto invalid_stop_date;
+             else
+               str = endp + 1;
+             time->era_entries[idx].stop_date[1] -= 1;
+
+             time->era_entries[idx].stop_date[2] = strtol (str, &endp, 10);
+             if (endp == str)
+               {
+               invalid_stop_date:
+                 error (0, 0, _("illegal stopping date in string %d in"
+                                " `era' field in category `%s'"),
+                        idx + 1, "LC_TIME");
+                 (void) strsep (&str, ":");
+               }
+             else if (*endp != ':')
+               {
+               garbage_stop_date:
+                 error (0, 0, _("garbage at end of stopping date in string %d"
+                                " in `era' field in category `%s'"),
+                        idx + 1, "LC_TIME");
+                 (void) strsep (&str, ":");
+               }
+             else
+               {
+                 str = endp + 1;
+
+                 /* Check for valid value.  */
+                 if (time->era_entries[idx].stop_date[1] < 0
+                     || time->era_entries[idx].stop_date[1] >= 12
+                     || time->era_entries[idx].stop_date[2] < 0
+                     || (time->era_entries[idx].stop_date[2]
+                         > days_per_month[time->era_entries[idx].stop_date[1]])
+                     || (time->era_entries[idx].stop_date[1] == 2
+                         && time->era_entries[idx].stop_date[2] == 29
+                         && !__isleap (time->era_entries[idx].stop_date[0])))
+                         error (0, 0, _("stopping date is illegal in"
+                                        " string %d in `era' field in"
+                                        " category `%s'"),
+                                idx + 1, "LC_TIME");
+               }
+           }
+
+         if (str == NULL || *str == '\0')
+           {
+             error (0, 0, _("missing era name in string %d in `era' field"
+                            "in category `%s'"), idx + 1, "LC_TIME");
+             time->era_entries[idx].name =
+               time->era_entries[idx].format = "";
+           }
+         else
+           {
+             time->era_entries[idx].name = strsep (&str, ":");
+
+             if (str == NULL || *str == '\0')
+               {
+                 error (0, 0, _("missing era format in string %d in `era'"
+                                " field in category `%s'"),
+                        idx + 1, "LC_TIME");
+                 time->era_entries[idx].name =
+                   time->era_entries[idx].format = "";
+               }
+             else
+               time->era_entries[idx].format = str;
+           }
+       }
+
+      /* Construct the array for the other byte order.  */
+      time->era_entries_ob =
+       (struct era_data *) xmalloc (time->cur_num_era
+                                     * sizeof (struct era_data));
+
+      for (idx = 0; idx < time->cur_num_era; ++idx)
+       {
+         time->era_entries_ob[idx].direction =
+           SWAPU32 (time->era_entries[idx].direction);
+         time->era_entries_ob[idx].offset =
+           SWAPU32 (time->era_entries[idx].offset);
+         time->era_entries_ob[idx].start_date[0] =
+           SWAPU32 (time->era_entries[idx].start_date[0]);
+         time->era_entries_ob[idx].start_date[1] =
+           SWAPU32 (time->era_entries[idx].start_date[1]);
+         time->era_entries_ob[idx].start_date[2] =
+           SWAPU32 (time->era_entries[idx].stop_date[2]);
+         time->era_entries_ob[idx].stop_date[0] =
+           SWAPU32 (time->era_entries[idx].stop_date[0]);
+         time->era_entries_ob[idx].stop_date[1] =
+           SWAPU32 (time->era_entries[idx].stop_date[1]);
+         time->era_entries_ob[idx].stop_date[2] =
+           SWAPU32 (time->era_entries[idx].stop_date[2]);
+         time->era_entries_ob[idx].name =
+           time->era_entries[idx].name;
+         time->era_entries_ob[idx].format =
+           time->era_entries[idx].format;
+       }
+    }
 }
 
 
@@ -117,8 +393,9 @@ time_output (struct localedef_t *locale, const char *output_path)
 {
   struct locale_time_t *time = locale->categories[LC_TIME].time;
   struct iovec iov[2 + _NL_ITEM_INDEX (_NL_NUM_LC_TIME)
-                 + (time->era_num > 0 ? time->era_num - 1 : 0)
-                 + time->cur_num_alt_digits];
+                 + time->cur_num_era - 1
+                 + time->cur_num_alt_digits - 1
+                 + 1 + (time->cur_num_era * 9 - 1) * 2];
   struct locale_file data;
   u_int32_t idx[_NL_ITEM_INDEX (_NL_NUM_LC_TIME)];
   size_t cnt, last_idx, num;
@@ -209,10 +486,11 @@ time_output (struct localedef_t *locale, const char *output_path)
   last_idx = ++cnt;
 
   idx[1 + last_idx] = idx[last_idx];
-  for (num = 0; num < time->era_num; ++num, ++cnt)
+  for (num = 0; num < time->cur_num_era; ++num, ++cnt)
     {
       iov[2 + cnt].iov_base = (void *) time->era[num];
       iov[2 + cnt].iov_len = strlen (iov[2 + cnt].iov_base) + 1;
+      idx[1 + last_idx] += iov[2 + cnt].iov_len;
     }
   ++last_idx;
 
@@ -241,13 +519,128 @@ time_output (struct localedef_t *locale, const char *output_path)
   iov[2 + cnt].iov_len = strlen (iov[2 + cnt].iov_base) + 1;
   idx[1 + last_idx] = idx[last_idx] + iov[2 + cnt].iov_len;
   ++cnt;
+  ++last_idx;
 
-  iov[2 + cnt].iov_base = (void *) (time->era_d_fmt ?: "");
+  iov[2 + cnt].iov_base = (void *) (time->era_t_fmt ?: "");
   iov[2 + cnt].iov_len = strlen (iov[2 + cnt].iov_base) + 1;
+  idx[1 + last_idx] = idx[last_idx] + iov[2 + cnt].iov_len;
   ++cnt;
+  ++last_idx;
+
+
+  /* We must align the following data.  */
+  iov[2 + cnt].iov_base = (void *) "\0\0";
+  iov[2 + cnt].iov_len = ((idx[last_idx] + 3) & ~3) - idx[last_idx];
+  idx[last_idx] = (idx[last_idx] + 3) & ~3;
+  ++cnt;
+
+  iov[2 + cnt].iov_base = (void *) &time->cur_num_alt_digits;
+  iov[2 + cnt].iov_len = sizeof (u_int32_t);
+  idx[1 + last_idx] = idx[last_idx] + iov[2 + cnt].iov_len;
+  ++cnt;
+  ++last_idx;
+
+  /* The `era' data in usable form.  */
+  iov[2 + cnt].iov_base = (void *) &time->cur_num_era;
+  iov[2 + cnt].iov_len = sizeof (u_int32_t);
+  idx[1 + last_idx] = idx[last_idx] + iov[2 + cnt].iov_len;
+  ++cnt;
+  ++last_idx;
+
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+# define ERA_B1 time->era_entries
+# define ERA_B2 time->era_entries_ob
+#else
+# define ERA_B1 time->era_entries_ob
+# define ERA_B2 time->era_entries
+#endif
+  idx[1 + last_idx] = idx[last_idx];
+  for (num = 0; num < time->cur_num_era; ++num)
+    {
+      size_t l;
+
+      iov[2 + cnt].iov_base = (void *) &ERA_B1[num].direction;
+      iov[2 + cnt].iov_len = sizeof (int32_t);
+      ++cnt;
+      iov[2 + cnt].iov_base = (void *) &ERA_B1[num].offset;
+      iov[2 + cnt].iov_len = sizeof (int32_t);
+      ++cnt;
+      iov[2 + cnt].iov_base = (void *) &ERA_B1[num].start_date[0];
+      iov[2 + cnt].iov_len = sizeof (int32_t);
+      ++cnt;
+      iov[2 + cnt].iov_base = (void *) &ERA_B1[num].start_date[1];
+      iov[2 + cnt].iov_len = sizeof (int32_t);
+      ++cnt;
+      iov[2 + cnt].iov_base = (void *) &ERA_B1[num].start_date[2];
+      iov[2 + cnt].iov_len = sizeof (int32_t);
+      ++cnt;
+      iov[2 + cnt].iov_base = (void *) &ERA_B1[num].stop_date[0];
+      iov[2 + cnt].iov_len = sizeof (int32_t);
+      ++cnt;
+      iov[2 + cnt].iov_base = (void *) &ERA_B1[num].stop_date[1];
+      iov[2 + cnt].iov_len = sizeof (int32_t);
+      ++cnt;
+      iov[2 + cnt].iov_base = (void *) &ERA_B1[num].stop_date[2];
+      iov[2 + cnt].iov_len = sizeof (int32_t);
+      ++cnt;
+
+      l = (strchr (ERA_B1[num].format, '\0') - ERA_B1[num].name) + 1;
+      l = (l + 3) & ~3;
+      iov[2 + cnt].iov_base = (void *) ERA_B1[num].name;
+      iov[2 + cnt].iov_len = l;
+      ++cnt;
+
+      idx[1 + last_idx] += 8 * sizeof (int32_t) + l;
+
+      assert (idx[1 + last_idx] % 4 == 0);
+    }
+  ++last_idx;
+
+  /* idx[1 + last_idx] = idx[last_idx]; */
+  for (num = 0; num < time->cur_num_era; ++num)
+    {
+      size_t l;
+
+      iov[2 + cnt].iov_base = (void *) &ERA_B2[num].direction;
+      iov[2 + cnt].iov_len = sizeof (int32_t);
+      ++cnt;
+      iov[2 + cnt].iov_base = (void *) &ERA_B2[num].offset;
+      iov[2 + cnt].iov_len = sizeof (int32_t);
+      ++cnt;
+      iov[2 + cnt].iov_base = (void *) &ERA_B2[num].start_date[0];
+      iov[2 + cnt].iov_len = sizeof (int32_t);
+      ++cnt;
+      iov[2 + cnt].iov_base = (void *) &ERA_B2[num].start_date[1];
+      iov[2 + cnt].iov_len = sizeof (int32_t);
+      ++cnt;
+      iov[2 + cnt].iov_base = (void *) &ERA_B2[num].start_date[2];
+      iov[2 + cnt].iov_len = sizeof (int32_t);
+      ++cnt;
+      iov[2 + cnt].iov_base = (void *) &ERA_B2[num].stop_date[0];
+      iov[2 + cnt].iov_len = sizeof (int32_t);
+      ++cnt;
+      iov[2 + cnt].iov_base = (void *) &ERA_B2[num].stop_date[1];
+      iov[2 + cnt].iov_len = sizeof (int32_t);
+      ++cnt;
+      iov[2 + cnt].iov_base = (void *) &ERA_B2[num].stop_date[2];
+      iov[2 + cnt].iov_len = sizeof (int32_t);
+      ++cnt;
+
+      l = (strchr (ERA_B2[num].format, '\0') - ERA_B2[num].name) + 1;
+      l = (l + 3) & ~3;
+      iov[2 + cnt].iov_base = (void *) ERA_B2[num].name;
+      iov[2 + cnt].iov_len = l;
+      ++cnt;
+
+      /* idx[1 + last_idx] += 8 * sizeof (int32_t) + l; */
+    }
+
 
-  assert (cnt == (_NL_ITEM_INDEX (_NL_NUM_LC_TIME) - 1
-                 + time->cur_num_alt_digits));
+  assert (cnt == (_NL_ITEM_INDEX (_NL_NUM_LC_TIME)
+                 + time->cur_num_era - 1
+                 + time->cur_num_alt_digits - 1
+                 + 1 + (time->cur_num_era * 9 - 1) * 2)
+         && last_idx + 1 == _NL_ITEM_INDEX (_NL_NUM_LC_TIME));
 
   write_locale_data (output_path, "LC_TIME", 2 + cnt, iov);
 }
@@ -291,9 +684,10 @@ too many values for field `%s' in category `LC_TIME'"),                          \
                  "era", "LC_TIME");
       else
        {
-         ++time->era_num;
-         time->era = xrealloc (time->era, time->era_num * sizeof (char *));
-         time->era[time->era_num - 1] = code->val.str.start;
+         ++time->cur_num_era;
+         time->era = xrealloc (time->era,
+                               time->cur_num_era * sizeof (char *));
+         time->era[time->cur_num_era - 1] = code->val.str.start;
        }
       break;
 
index ea15c87..667afbd 100644 (file)
@@ -183,14 +183,14 @@ main (int argc, char *argv[])
   /* Version information is requested.  */
   if (do_version)
     {
-      fprintf (stderr, "locale - GNU %s %s\n", PACKAGE, VERSION);
+      fprintf (stderr, "locale (GNU %s) %s\n", PACKAGE, VERSION);
       fprintf (stderr, _("\
 Copyright (C) %s Free Software Foundation, Inc.\n\
 This is free software; see the source for copying conditions.  There is NO\n\
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
 "), "1995, 1996");
-      fprintf (stderr, _("Written by %s\n"),
-              "Ulrich Drepper <drepper@cygnus.com>");
+      fprintf (stderr, _("Written by %s.\n"),
+              "Ulrich Drepper");
 
       exit (EXIT_SUCCESS);
     }
@@ -255,7 +255,8 @@ Mandatory arguments to long options are mandatory for short options too.\n\
   -c, --category-name   write names of selected categories\n\
   -k, --keyword-name    write names of selected keywords\n"),
              __progname);
-      printf (gettext ("Report bugs to <bug-glibc@prep.ai.mit.edu>.\n"));
+      fputs (gettext ("Report bugs to <bug-glibc@prep.ai.mit.edu>.\n"),
+            stdout);
     }
 
   exit (status);
index 1eae6e7..ff9248e 100644 (file)
@@ -173,14 +173,14 @@ main (int argc, char *argv[])
   /* Version information is requested.  */
   if (do_version)
     {
-      fprintf (stderr, "localedef - GNU %s %s\n", PACKAGE, VERSION);
+      fprintf (stderr, "localedef (GNU %s) %s\n", PACKAGE, VERSION);
       fprintf (stderr, _("\
 Copyright (C) %s Free Software Foundation, Inc.\n\
 This is free software; see the source for copying conditions.  There is NO\n\
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
 "), "1995, 1996");
-      fprintf (stderr, _("Written by %s\n"),
-              "Ulrich Drepper <drepper@cygnus.com>");
+      fprintf (stderr, _("Written by %s.\n"),
+              "Ulrich Drepper");
 
       exit (0);
     }
@@ -406,7 +406,8 @@ Mandatory arguments to long options are mandatory for short options too.\n\
 System's directory for character maps: %s\n\
                        locale files  : %s\n"),
              program_invocation_name, CHARMAP_PATH, LOCALE_PATH);
-      printf (gettext ("Report bugs to <bug-glibc@prep.ai.mit.edu>.\n"));
+      fputs (gettext ("Report bugs to <bug-glibc@prep.ai.mit.edu>.\n"),
+            stdout);
     }
 
   exit (status);
@@ -429,7 +430,7 @@ error_print ()
 static const char *
 construct_output_path (char *path)
 {
-  char *normal = NULL;
+  const char *normal = NULL;
   char *result;
 
   if (strchr (path, '/') == NULL)
@@ -455,6 +456,9 @@ construct_output_path (char *path)
          if (endp > startp)
            normal = _nl_normalize_codeset (startp, endp - startp);
        }
+      else
+       /* This is to keep gcc quiet.  */
+       endp = NULL;
 
       /* We put an additional '\0' at the end of the string because at
         the end of the function we need another byte for the trailing
index 63ebc4b..97629e5 100644 (file)
@@ -829,6 +829,7 @@ syntax error in collating order definition"));
            case tok_mon:
            case tok_am_pm:
            case tok_alt_digits:
+           case tok_era:
              READ_STRING_LIST (time_add, bad_time);
              continue;
 
@@ -836,7 +837,6 @@ syntax error in collating order definition"));
            case tok_d_fmt:
            case tok_t_fmt:
            case tok_t_fmt_ampm:
-           case tok_era:
            case tok_era_year:
            case tok_era_d_t_fmt:
            case tok_era_d_fmt:
@@ -935,7 +935,7 @@ write_locale_data (const char *output_path, const char *category,
   int fd;
   char *fname;
 
-  fname = malloc (strlen (output_path) + strlen (category) + 6);
+  fname = malloc (strlen (output_path) + 2 * strlen (category) + 6);
   if (fname == NULL)
     error (5, errno, _("memory exhausted"));
 
index d0d9223..76320f8 100644 (file)
@@ -116,13 +116,13 @@ static const char *_nl_current_names[] =
 
 
 /* Lock for protecting global data.  */
-__libc_lock_define_initialized (static, lock)
+__libc_lock_define_initialized (, __libc_setlocale_lock)
 
 
 /* Use this when we come along an error.  */
 #define ERROR_RETURN                                                         \
   do {                                                                       \
-    errno = EINVAL;                                                          \
+    __set_errno (EINVAL);                                                    \
     return NULL;                                                             \
   } while (0)
 
@@ -314,7 +314,7 @@ setlocale (int category, const char *locale)
        }
 
       /* Protect global data.  */
-      __libc_lock_lock (lock);
+      __libc_lock_lock (__libc_setlocale_lock);
 
       /* Load the new data for each category.  */
       while (category-- > 0)
@@ -354,7 +354,7 @@ setlocale (int category, const char *locale)
        }
 
       /* Critical section left.  */
-      __libc_lock_unlock (lock);
+      __libc_lock_unlock (__libc_setlocale_lock);
 
       return composite;
     }
@@ -364,7 +364,7 @@ setlocale (int category, const char *locale)
       char *newname = (char *) locale;
 
       /* Protect global data.  */
-      __libc_lock_lock (lock);
+      __libc_lock_lock (__libc_setlocale_lock);
 
       if (_nl_current[category] != NULL)
        {
@@ -393,7 +393,7 @@ setlocale (int category, const char *locale)
        }
 
       /* Critical section left.  */
-      __libc_lock_unlock (lock);
+      __libc_lock_unlock (__libc_setlocale_lock);
 
       return newname;
     }
index 00dbec4..8107015 100644 (file)
@@ -37,7 +37,7 @@ __getutid_r (const struct utmp *id, struct utmp **utmp,
       && id->ut_type != USER_PROCESS && id->ut_type != DEAD_PROCESS)
     /* No, using '<' and '>' for the test is not possible.  */
     {
-      errno = EINVAL;
+      __set_errno (EINVAL);
       return -1;
     }
 
@@ -66,7 +66,7 @@ __getutid_r (const struct utmp *id, struct utmp **utmp,
              != sizeof (struct utmp))
            {
              utmp_data->loc_utmp = 0; /* Mark loc_utmp invalid. */
-             errno = ESRCH;
+             __set_errno (ESRCH);
              return -1;
            }
 
@@ -89,7 +89,7 @@ __getutid_r (const struct utmp *id, struct utmp **utmp,
              != sizeof (struct utmp))
            {
              utmp_data->loc_utmp = 0; /* Mark loc_utmp invalid. */
-             errno = ESRCH;
+             __set_errno (ESRCH);
              return -1;
            }
 
@@ -110,7 +110,7 @@ __getutid_r (const struct utmp *id, struct utmp **utmp,
 
   return 0;
 #else  /* !_HAVE_UT_ID && !_HAVE_UT_TYPE */
-  errno = ENOSYS;
+  __set_errno (ENOSYS);
   return -1;
 #endif
 }
index e5c4196..e88267d 100644 (file)
@@ -48,7 +48,7 @@ __getutline_r (const struct utmp *line, struct utmp **utmp,
          != sizeof (struct utmp))
        {
          utmp_data->loc_utmp = 0; /* Mark UTMP_DATA->ubuf invalid.  */
-         errno = ESRCH;
+         __set_errno (ESRCH);
          return -1;
        }
 
index a53613f..00b176a 100644 (file)
@@ -62,7 +62,7 @@ tty_name (int fd, char **tty, size_t buf_len)
       if (! new_buf)
        {
          rv = -1;
-         errno = ENOMEM;
+         __set_errno (ENOMEM);
          break;
        }
     }
index 55436bf..42ea3cd 100644 (file)
@@ -45,7 +45,7 @@ __pututline_r (const struct utmp *id, struct utmp_data *utmp_data)
       && id->ut_type != USER_PROCESS && id->ut_type != DEAD_PROCESS)
     /* No, using '<' and '>' for the test is not possible.  */
     {
-      errno = EINVAL;
+      __set_errno (EINVAL);
       return -1;
     }
 #endif