aboutsummaryrefslogtreecommitdiff
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 b93cf59..aff4631 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 78789dc..764aec8 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 773143d..ee402db 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);