From 816e6eb5a786594223586976c08e337bc08b6f4e Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Mon, 19 Oct 1998 13:33:29 +0000 Subject: [PATCH] Update. 1998-10-19 13:24 Ulrich Drepper * locale/programs/ld-collate.c (collate_startup): Clear bit for this category in copy_posix. (collate_finish): Don't warn about UNDEFINED not being defined. * locale/programs/ld-ctype.c (ctype_startup): Clear bit for this category in copy_posix. * locale/programs/ld-messages.c (messages_startup): Likewise. * locale/programs/ld-monetary.c (monetary_startup): Likewise. * locale/programs/ld-numeric.c (numeric_startup): Likewise. * locale/programs/ld-time.c (time_startup): Likewise. * locale/programs/localedef.c: Move copy_def_list_t definition into locales.h. Define copy_posix variable. (main): Before processing copy list add ©_posix to copy_list. * locale/programs/locales.h: Add definition of copy_def_list_t. * locale/programs/locfile.c: Clear bit for appropriate category in case of an copy instruction. --- ChangeLog | 18 +++++++++++++++++ iconv/gconv.c | 13 +++++++++++- iconv/gconv_db.c | 17 +++++++++++++++- locale/programs/ld-collate.c | 5 ++++- locale/programs/ld-ctype.c | 3 +++ locale/programs/ld-messages.c | 3 +++ locale/programs/ld-monetary.c | 15 ++++++++++---- locale/programs/ld-numeric.c | 5 ++++- locale/programs/ld-time.c | 3 +++ locale/programs/localedef.c | 37 +++++++++++++++++++---------------- locale/programs/locales.h | 22 ++++++++++++++++++++- locale/programs/locfile.c | 1 + localedata/ChangeLog | 4 ++++ localedata/locales/POSIX | 3 ++- manual/locale.texi | 2 +- 15 files changed, 123 insertions(+), 28 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9111b18e1b..726fee9ace 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,21 @@ +1998-10-19 13:24 Ulrich Drepper + + * locale/programs/ld-collate.c (collate_startup): Clear bit for this + category in copy_posix. + (collate_finish): Don't warn about UNDEFINED not being defined. + * locale/programs/ld-ctype.c (ctype_startup): Clear bit for this + category in copy_posix. + * locale/programs/ld-messages.c (messages_startup): Likewise. + * locale/programs/ld-monetary.c (monetary_startup): Likewise. + * locale/programs/ld-numeric.c (numeric_startup): Likewise. + * locale/programs/ld-time.c (time_startup): Likewise. + * locale/programs/localedef.c: Move copy_def_list_t definition into + locales.h. Define copy_posix variable. + (main): Before processing copy list add ©_posix to copy_list. + * locale/programs/locales.h: Add definition of copy_def_list_t. + * locale/programs/locfile.c: Clear bit for appropriate category in + case of an copy instruction. + 1998-10-19 Ulrich Drepper * sysdeps/unix/sysv/linux/i386/setresgid.c: Remove #include of diff --git a/iconv/gconv.c b/iconv/gconv.c index 9484fc8881..ceefffcc87 100644 --- a/iconv/gconv.c +++ b/iconv/gconv.c @@ -22,8 +22,10 @@ #include #include #include -#include +#ifndef STATIC_GCONV +# include +#endif int internal_function @@ -41,8 +43,12 @@ __gconv (gconv_t cd, const char **inbuf, const char *inbufend, char **outbuf, if (inbuf == NULL || *inbuf == NULL) /* We just flush. */ +#ifdef _CALL_DL_FCT result = _CALL_DL_FCT (cd->steps->fct, (cd->steps, cd->data, NULL, NULL, converted, 1)); +#else + result = cd->steps->fct (cd->steps, cd->data, NULL, NULL, converted, 1); +#endif else { const char *last_start; @@ -54,9 +60,14 @@ __gconv (gconv_t cd, const char **inbuf, const char *inbufend, char **outbuf, do { last_start = *inbuf; +#ifdef _CALL_DL_FCT result = _CALL_DL_FCT (cd->steps->fct, (cd->steps, cd->data, inbuf, inbufend, converted, 0)); +#else + result = cd->steps->fct (cd->steps, cd->data, inbuf, inbufend, + converted, 0); +#endif } while (result == GCONV_EMPTY_INPUT && last_start != *inbuf && *inbuf + cd->steps->min_needed_from <= inbufend); diff --git a/iconv/gconv_db.c b/iconv/gconv_db.c index d5d075df88..cbaaf18339 100644 --- a/iconv/gconv_db.c +++ b/iconv/gconv_db.c @@ -22,7 +22,10 @@ #include #include #include -#include + +#ifndef STATIC_GCONV +# include +#endif #include @@ -155,7 +158,11 @@ free_derivation (void *p) for (cnt = 0; cnt < deriv->nsteps; ++cnt) if (deriv->steps[cnt].end_fct) +#ifdef _CALL_DL_FCT _CALL_DL_FCT (deriv->steps[cnt].end_fct, (&deriv->steps[cnt])); +#else + deriv->steps[cnt].end_fct (&deriv->steps[cnt]); +#endif free ((struct gconv_step *) deriv->steps); free (deriv); @@ -221,7 +228,11 @@ gen_steps (struct derivation_step *best, const char *toset, /* Call the init function. */ if (result[step_cnt].init_fct != NULL) +#ifdef _CALL_DL_FCT _CALL_DL_FCT (result[step_cnt].init_fct, (&result[step_cnt])); +#else + result[step_cnt].init_fct (&result[step_cnt]); +#endif current = current->last; } @@ -232,7 +243,11 @@ gen_steps (struct derivation_step *best, const char *toset, while (++step_cnt < *nsteps) { if (result[step_cnt].end_fct != NULL) +#ifdef _CALL_DL_FCT _CALL_DL_FCT (result[step_cnt].end_fct, (&result[step_cnt])); +#else + result[step_cnt].end_fct (&result[step_cnt]); +#endif #ifndef STATIC_GCONV __gconv_release_shlib (result[step_cnt].shlib_handle); #endif diff --git a/locale/programs/ld-collate.c b/locale/programs/ld-collate.c index a92ff1154a..b9734c36dd 100644 --- a/locale/programs/ld-collate.c +++ b/locale/programs/ld-collate.c @@ -155,6 +155,9 @@ collate_startup (struct linereader *lr, struct localedef_t *locale, { struct locale_collate_t *collate; + /* We have a definition for LC_COLLATE. */ + copy_posix.mask &= ~(1 << LC_COLLATE); + /* It is important that we always use UCS4 encoding for strings now. */ encoding_method = ENC_UCS4; @@ -260,7 +263,7 @@ collate_finish (struct localedef_t *locale, struct charset_t *charset) \**************************************************************/ u_int32_t weight; - if (!be_quiet) + if (/* XXX Remove the 0 & */ 0 && !be_quiet) error (0, 0, _("no definition of `UNDEFINED'")); collate->undefined.ordering_len = collate->nrules; diff --git a/locale/programs/ld-ctype.c b/locale/programs/ld-ctype.c index 01d37e3fc4..a4dcd76807 100644 --- a/locale/programs/ld-ctype.c +++ b/locale/programs/ld-ctype.c @@ -135,6 +135,9 @@ ctype_startup (struct linereader *lr, struct localedef_t *locale, unsigned int cnt; struct locale_ctype_t *ctype; + /* We have a definition for LC_CTYPE. */ + copy_posix.mask &= ~(1 << LC_CTYPE); + /* It is important that we always use UCS1 encoding for strings now. */ encoding_method = ENC_UCS1; diff --git a/locale/programs/ld-messages.c b/locale/programs/ld-messages.c index 9353e1e49e..e52f5413e2 100644 --- a/locale/programs/ld-messages.c +++ b/locale/programs/ld-messages.c @@ -60,6 +60,9 @@ messages_startup (struct linereader *lr, struct localedef_t *locale, { struct locale_messages_t *messages; + /* We have a definition for LC_MESSAGES. */ + copy_posix.mask &= ~(1 << LC_MESSAGES); + /* It is important that we always use UCS1 encoding for strings now. */ encoding_method = ENC_UCS1; diff --git a/locale/programs/ld-monetary.c b/locale/programs/ld-monetary.c index d202d76399..4aede4691f 100644 --- a/locale/programs/ld-monetary.c +++ b/locale/programs/ld-monetary.c @@ -84,6 +84,9 @@ monetary_startup (struct linereader *lr, struct localedef_t *locale, { struct locale_monetary_t *monetary; + /* We have a definition for LC_MONETARY. */ + copy_posix.mask &= ~(1 << LC_MONETARY); + /* It is important that we always use UCS1 encoding for strings now. */ encoding_method = ENC_UCS1; @@ -129,15 +132,17 @@ monetary_finish (struct localedef_t *locale) /* The international currency symbol must come from ISO 4217. */ if (monetary->int_curr_symbol != NULL) { - if (strlen (monetary->int_curr_symbol) != 4) + if (strlen (monetary->int_curr_symbol) != 4 + && monetary->int_curr_symbol[0] != '\0') { if (!be_quiet) error (0, 0, _("\ value of field `int_curr_symbol' in category `LC_MONETARY' has wrong length")); } - else if (bsearch (monetary->int_curr_symbol, valid_int_curr, - NR_VALID_INT_CURR, sizeof (const char *), - (comparison_fn_t) curr_strcmp) == NULL + else if (monetary->int_curr_symbol[0] != '\0' + && bsearch (monetary->int_curr_symbol, valid_int_curr, + NR_VALID_INT_CURR, sizeof (const char *), + (comparison_fn_t) curr_strcmp) == NULL && !be_quiet) error (0, 0, _("\ value of field `int_curr_symbol' in category `LC_MONETARY' does \ @@ -336,6 +341,8 @@ field `%s' in category `%s' declared more than once"), \ lr_error (lr, _("\ field `%s' in category `%s' declared more than once"), \ #cat, "LC_MONETARY"); \ + else if (code->tok == tok_minus1) \ + monetary->cat = -1; \ else \ monetary->cat = code->val.num; \ break diff --git a/locale/programs/ld-numeric.c b/locale/programs/ld-numeric.c index 2454281a4d..bbc575852d 100644 --- a/locale/programs/ld-numeric.c +++ b/locale/programs/ld-numeric.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. +/* Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1995. @@ -54,6 +54,9 @@ numeric_startup (struct linereader *lr, struct localedef_t *locale, { struct locale_numeric_t *numeric; + /* We have a definition for LC_NUMERIC. */ + copy_posix.mask &= ~(1 << LC_NUMERIC); + /* It is important that we always use UCS1 encoding for strings now. */ encoding_method = ENC_UCS1; diff --git a/locale/programs/ld-time.c b/locale/programs/ld-time.c index e16a247430..aa401627f2 100644 --- a/locale/programs/ld-time.c +++ b/locale/programs/ld-time.c @@ -90,6 +90,9 @@ time_startup (struct linereader *lr, struct localedef_t *locale, { struct locale_time_t *time; + /* We have a definition for LC_TIME. */ + copy_posix.mask &= ~(1 << LC_TIME); + /* It is important that we always use UCS1 encoding for strings now. */ encoding_method = ENC_UCS1; diff --git a/locale/programs/localedef.c b/locale/programs/localedef.c index 94d6255378..f208d8b874 100644 --- a/locale/programs/localedef.c +++ b/locale/programs/localedef.c @@ -38,27 +38,21 @@ #include "error.h" #include "charset.h" #include "locfile.h" +#include "locales.h" /* Undefine the following line in the production version. */ /* #define NDEBUG 1 */ #include -/* List of locale definition files which are used in `copy' instructions. */ -struct copy_def_list_t +/* This is a special entry of the copylist. For all categories we don't + have a definition we use the data for the POSIX locale. */ +struct copy_def_list_t copy_posix = { - struct copy_def_list_t *next; - - const char *name; - int mask; - - struct localedef_t *locale; - - struct - { - void *data; - size_t len; - } binary[6]; + next: NULL, + name: "POSIX", + mask: (1 << LC_ALL) - 1, + locale: NULL }; @@ -153,7 +147,6 @@ main (int argc, char *argv[]) int remaining; /* Set initial values for global variables. */ - copy_list = NULL; posix_conformance = getenv ("POSIXLY_CORRECT") != NULL; error_print_progname = error_print; @@ -204,6 +197,10 @@ main (int argc, char *argv[]) if (localedef->failed != 0) error (4, errno, _("cannot open locale definition file `%s'"), input_file); + /* Make sure all categories are defined. */ + copy_posix.next = copy_list; + copy_list = ©_posix; + /* Perhaps we saw some `copy' instructions. Process the given list. We use a very simple algorithm: we look up the list from the beginning every time. */ @@ -229,8 +226,14 @@ main (int argc, char *argv[]) int avail = 0; if (act_add_locdef->locale == NULL) - act_add_locdef->locale = locfile_read (act_add_locdef->name, - charset); + { + /* Saving the mask is an ugly trick to prevent the reader + from modifying `copy_posix' if we currently process it. */ + int save_mask = act_add_locdef->mask; + act_add_locdef->locale = locfile_read (act_add_locdef->name, + charset); + act_add_locdef->mask = save_mask; + } if (! act_add_locdef->locale->failed) { diff --git a/locale/programs/locales.h b/locale/programs/locales.h index eab909e7c8..1cd3a3f92e 100644 --- a/locale/programs/locales.h +++ b/locale/programs/locales.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. +/* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1996. @@ -33,6 +33,26 @@ #include "localeinfo.h" +/* List of locale definition files which are used in `copy' instructions. */ +struct copy_def_list_t +{ + struct copy_def_list_t *next; + + const char *name; + int mask; + + struct localedef_t *locale; + + struct + { + void *data; + size_t len; + } binary[6]; +}; + +extern struct copy_def_list_t copy_posix; + + /* Header of the locale data files. */ struct locale_file { diff --git a/locale/programs/locfile.c b/locale/programs/locfile.c index 5a3fc25e3d..0485b61645 100644 --- a/locale/programs/locfile.c +++ b/locale/programs/locfile.c @@ -116,6 +116,7 @@ locfile_read (const char *filename, struct charset_t *charset) #define HANDLE_COPY(category, token, string) \ if (nowtok == tok_copy) \ { \ + copy_posix.mask &= ~(1 << category); \ copy_category = category; \ expected_tok = token; \ expected_str = string; \ diff --git a/localedata/ChangeLog b/localedata/ChangeLog index 30e1724fcb..c221f85d0d 100644 --- a/localedata/ChangeLog +++ b/localedata/ChangeLog @@ -1,3 +1,7 @@ +1998-10-19 13:31 Ulrich Drepper + + * locales/POSIX: Correct typo. Add UNDEFINED symbol. + 1998-10-14 Ulrich Drepper * locales/gr_GR: Renamed to... diff --git a/localedata/locales/POSIX b/localedata/locales/POSIX index a60ccd8927..7d65b351ff 100644 --- a/localedata/locales/POSIX +++ b/localedata/locales/POSIX @@ -21,7 +21,7 @@ # Distribution and use is free, also for # commercial purposes. -repertoire_map mnemonic.ds +repertoiremap mnemonic.ds LC_CTYPE # The following is the POSIX Locale LC_CTYPE. @@ -206,6 +206,7 @@ order_start forward + order_end # END LC_COLLATE diff --git a/manual/locale.texi b/manual/locale.texi index 6128df7740..6208710121 100644 --- a/manual/locale.texi +++ b/manual/locale.texi @@ -289,7 +289,7 @@ with_other_locale (char *new_locale, /* @r{Copy the name so it won't be clobbered by @code{setlocale}.} */ saved_locale = strdup (old_locale); - if (old_locale == NULL) + if (saved_locale == NULL) fatal ("Out of memory"); /* @r{Now change the locale and do some stuff with it.} */