diff options
-rw-r--r-- | ChangeLog | 67 | ||||
-rw-r--r-- | locale/lc-time.c | 130 | ||||
-rw-r--r-- | locale/localeinfo.h | 17 |
3 files changed, 170 insertions, 44 deletions
@@ -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); |