about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog67
-rw-r--r--locale/lc-time.c130
-rw-r--r--locale/localeinfo.h17
3 files changed, 170 insertions, 44 deletions
diff --git a/ChangeLog b/ChangeLog
index b93cf59947..aff4631909 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+1999-12-02  Akira Yoshiyama  <yosshy@debian.or.jp>
+
+	* locale/lc-time.c (_nl_get_era_entry): Separate eras
+	initialization as _nl_init_era_entry().
+	* locale/lc-time.c (_nl_get_era_nf_entry): New function.
+	* locale/lc-time.c (_nl_get_era_year_offset): New function.
+	* locale/lc-time.c (_nl_get_era_year_start): New function.
+	* locale/localeinfo.h: Declare new functions.
+	Define ERA_NAME_FORMAT_MEMBERS, ERA_M_NAME, ERA_M_FORMAT, ERA_W_NAME,
+	and ERA_W_FORMAT.
+
 1999-12-02  Ulrich Drepper  <drepper@cygnus.com>
 
 	* posix/regex.c (SYNTAX): Make more portable.
@@ -5,38 +16,38 @@
 
 1999-11-18  Roland McGrath  <roland@baalperazim.frob.com>
 
-        * hurd/hurdsig.c (_hurdsig_init): If __hurd_threadvar_stack_mask is
-        nonzero, use cthread_fork to create the signal thread.
-        * hurd/msgportdemux.c (_hurd_msgport_receive): Initialize
-        _hurd_msgport_thread here (to self).
-        * sysdeps/mach/hurd/fork.c (__fork): When __hurd_sigthread_stack_end
-        is zero, instead compute child signal thread's starting SP from parent
-        signal thread's current SP and the threadvar_stack variables.
-        * hurd/Versions (GLIBC_2.1.3): Add cthread_fork, cthread_detach.
-        These are now referenced weakly by _hurdsig_init.
+	* hurd/hurdsig.c (_hurdsig_init): If __hurd_threadvar_stack_mask is
+	nonzero, use cthread_fork to create the signal thread.
+	* hurd/msgportdemux.c (_hurd_msgport_receive): Initialize
+	_hurd_msgport_thread here (to self).
+	* sysdeps/mach/hurd/fork.c (__fork): When __hurd_sigthread_stack_end
+	is zero, instead compute child signal thread's starting SP from parent
+	signal thread's current SP and the threadvar_stack variables.
+	* hurd/Versions (GLIBC_2.1.3): Add cthread_fork, cthread_detach.
+	These are now referenced weakly by _hurdsig_init.
 
-        * hurd/report-wait.c (_S_msg_report_wait): Fix typo:
-        &_hurd_itimer_thread not &_hurd_msgport_thread.
+	* hurd/report-wait.c (_S_msg_report_wait): Fix typo:
+	&_hurd_itimer_thread not &_hurd_msgport_thread.
 
 1999-10-01  Roland McGrath  <roland@baalperazim.frob.com>
 
-        * hurd/hurdfchdir.c (_hurd_change_directory_port_from_fd): Rewrite
-        without HURD_DPORT_USE to clean up warnings.
-        * hurd/dtable.c (get_dtable_port): Likewise.
-
-        * hurd/hurdioctl.c (rectty_dtable): Renamed to install_ctty.
-        (install_ctty): Do the changing of the cttyid port cell here, inside
-        the critical section while we holding the dtable lock.
-        (_hurd_setcttyid, tiocsctty, tiocnotty): Use that instead of changing
-        the port cell and calling rectty_dtable.
-        (_hurd_locked_install_cttyid): New function, split out of install_ctty.
-        (install_ctty): Use it inside a critical section, with the lock held.
-        * sysdeps/mach/hurd/setsid.c (__setsid): Use
-        _hurd_locked_install_cttyid to effect the cttyid and dtable changes
-        after proc_setsid, having held the dtable lock throughout.
-        * hurd/dtable.c (ctty_new_pgrp): With the dtable lock held, check the
-        cttyid port for null and bail out early if so.  The dtable lock
-        serializes us after any cttyid change and its associated dtable update.
+	* hurd/hurdfchdir.c (_hurd_change_directory_port_from_fd): Rewrite
+	without HURD_DPORT_USE to clean up warnings.
+	* hurd/dtable.c (get_dtable_port): Likewise.
+
+	* hurd/hurdioctl.c (rectty_dtable): Renamed to install_ctty.
+	(install_ctty): Do the changing of the cttyid port cell here, inside
+	the critical section while we holding the dtable lock.
+	(_hurd_setcttyid, tiocsctty, tiocnotty): Use that instead of changing
+	the port cell and calling rectty_dtable.
+	(_hurd_locked_install_cttyid): New function, split out of install_ctty.
+	(install_ctty): Use it inside a critical section, with the lock held.
+	* sysdeps/mach/hurd/setsid.c (__setsid): Use
+	_hurd_locked_install_cttyid to effect the cttyid and dtable changes
+	after proc_setsid, having held the dtable lock throughout.
+	* hurd/dtable.c (ctty_new_pgrp): With the dtable lock held, check the
+	cttyid port for null and bail out early if so.  The dtable lock
+	serializes us after any cttyid change and its associated dtable update.
 
 1999-11-14  Roland McGrath  <roland@baalperazim.frob.com>
 
diff --git a/locale/lc-time.c b/locale/lc-time.c
index 78789dce41..764aec8ef2 100644
--- a/locale/lc-time.c
+++ b/locale/lc-time.c
@@ -33,8 +33,11 @@ __libc_lock_define (extern, __libc_setlocale_lock)
 
 static int era_initialized;
 static struct era_entry **eras;
+static const void **eras_nf;
 static size_t num_eras;
 
+#define ERAS_NF(cnt, category) \
+  *(eras_nf + ERA_NAME_FORMAT_MEMBERS * (cnt) + (category))
 
 static int alt_digits_initialized;
 static const char **alt_digits;
@@ -54,31 +57,46 @@ _nl_postload_time (void)
 }
 
 
-struct era_entry *
-_nl_get_era_entry (const struct tm *tp)
+static void
+init_era_entry (void)
 {
-  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)
+      if (new_num_eras == 0)
 	{
-	  free (eras);
-	  eras = NULL;
+	  if (eras != NULL)
+	    {
+	      free (eras);
+	      eras = NULL;
+	    }
+	  if (eras_nf != NULL)
+	    {
+	      free (eras_nf);
+	      eras_nf = NULL;
+	    }
 	}
-      else if (new_num_eras != 0)
+      else
 	{
 	  if (num_eras != new_num_eras)
-	    eras = realloc (eras, new_num_eras * sizeof (struct era_entry *));
+	    {
+	      eras = realloc (eras,
+			      new_num_eras * sizeof (struct era_entry *));
+	      eras_nf = realloc (eras_nf,
+				 new_num_eras * sizeof (void *)
+				 * ERA_NAME_FORMAT_MEMBERS);
+	    }
 
-	  if (eras == NULL)
-	    num_eras = 0;
+	  if (eras == NULL || eras_nf == NULL)
+	    {
+	      num_eras = 0;
+	      eras = NULL;
+	      eras_nf = NULL;
+	    }
 	  else
 	    {
 	      const char *ptr = _NL_CURRENT (LC_TIME, _NL_TIME_ERA_ENTRIES);
@@ -90,16 +108,23 @@ _nl_get_era_entry (const struct tm *tp)
 
 		  /* Skip numeric values.  */
 		  ptr += sizeof (struct era_entry);
-		  /* Skip era name.  */
+
+		  /* Set and skip era name.  */
+		  ERAS_NF (cnt, ERA_M_NAME) = (void *) ptr;
 		  ptr = strchr (ptr, '\0') + 1;
-		  /* Skip era format.  */
+
+		  /* Set and skip era format.  */
+		  ERAS_NF (cnt, ERA_M_FORMAT) = (void *) ptr;
 		  ptr = strchr (ptr, '\0') + 1;
 
 		  ptr += 3 - (((ptr - (const char *) eras[cnt]) + 3) & 3);
 
-		  /* Skip wide era name.  */
+		  /* Set and skip wide era name.  */
+		  ERAS_NF (cnt, ERA_W_NAME) = (void *) ptr;
 		  ptr = (char *) (wcschr ((wchar_t *) ptr, '\0') + 1);
-		  /* Skip wide era format.  */
+
+		  /* Set and skip wide era format.  */
+		  ERAS_NF (cnt, ERA_W_FORMAT) = (void *) ptr;
 		  ptr = (char *) (wcschr ((wchar_t *) ptr, '\0') + 1);
 		}
 	    }
@@ -107,6 +132,18 @@ _nl_get_era_entry (const struct tm *tp)
 
       era_initialized = 1;
     }
+}
+
+
+struct era_entry *
+_nl_get_era_entry (const struct tm *tp)
+{
+  struct era_entry *result;
+  size_t cnt;
+
+  __libc_lock_lock (__libc_setlocale_lock);
+
+  init_era_entry ();
 
   /* Now compare date with the available eras.  */
   for (cnt = 0; cnt < num_eras; ++cnt)
@@ -130,6 +167,67 @@ _nl_get_era_entry (const struct tm *tp)
 }
 
 
+const void *
+_nl_get_era_nf_entry (int cnt, int category)
+{
+  const void *result;
+
+  __libc_lock_lock (__libc_setlocale_lock);
+
+  init_era_entry ();
+
+  if (eras_nf == NULL)
+    result = NULL;
+  else
+    result = ERAS_NF (cnt, category);
+
+  __libc_lock_unlock (__libc_setlocale_lock);
+
+  return result;
+}
+
+
+int
+_nl_get_era_year_offset (int cnt, int val)
+{
+  __libc_lock_lock (__libc_setlocale_lock);
+
+  init_era_entry ();
+
+  if (eras == NULL)
+    val = -1;
+  else
+    {
+      val -= eras[cnt]->offset;
+
+      if (val < 0 ||
+	  val > (eras[cnt]->stop_date[0] - eras[cnt]->start_date[0]))
+	val = -1;
+    }
+
+  __libc_lock_unlock (__libc_setlocale_lock);
+
+  return val;
+}
+
+
+int
+_nl_get_era_year_start (int cnt)
+{
+  int result;
+
+  __libc_lock_lock (__libc_setlocale_lock);
+
+  _nl_init_era_entry();
+
+  result = eras[cnt]->start_date[0];
+
+  __libc_lock_unlock (__libc_setlocale_lock);
+
+  return result;
+}
+
+
 const char *
 _nl_get_alt_digit (unsigned int number)
 {
diff --git a/locale/localeinfo.h b/locale/localeinfo.h
index 773143dd16..ee402dbf9f 100644
--- a/locale/localeinfo.h
+++ b/locale/localeinfo.h
@@ -92,6 +92,14 @@ enum value_type
 };
 
 
+/* Definitions for `era' information from LC_TIME.  */
+#define ERA_NAME_FORMAT_MEMBERS 4
+#define ERA_M_NAME   0
+#define ERA_M_FORMAT 1
+#define ERA_W_NAME   2
+#define ERA_W_FORMAT 3
+
+
 /* Structure to access `era' information from LC_TIME.  */
 struct era_entry
 {
@@ -155,6 +163,15 @@ extern void _nl_remove_locale (int locale, struct locale_data *data);
 /* Return `era' entry which corresponds to TP.  Used in strftime.  */
 extern struct era_entry *_nl_get_era_entry (const struct tm *tp);
 
+/* Return `era' string of the cnt'th `category' entry.  */
+extern const void *_nl_get_era_nf_entry (int cnt, int category);
+
+/* Return a offset of `era' year of the cnt'th entry.  */
+extern int _nl_get_era_year_offset (int cnt, int category);
+
+/* Return a start of `era' year of the cnt'th entry.  */
+extern int _nl_get_era_year_start (int cnt);
+
 /* Return `alt_digit' which corresponds to NUMBER.  Used in strftime.  */
 extern const char *_nl_get_alt_digit (unsigned int number);