diff options
Diffstat (limited to 'locale')
51 files changed, 1110 insertions, 645 deletions
diff --git a/locale/C-collate.c b/locale/C-collate.c index 5388237..5c049e1 100644 --- a/locale/C-collate.c +++ b/locale/C-collate.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995, 1996 Free Software Foundation, Inc. +/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. @@ -146,7 +146,8 @@ const u_int32_t _nl_C_LC_COLLATE_symbol_classes[256] = const struct locale_data _nl_C_LC_COLLATE = { _nl_C_name, - NULL, 0, /* no file mapped */ + NULL, 0, 0, /* no file mapped */ + MAX_USAGE_COUNT, 21, { { word: 0 }, diff --git a/locale/C-ctype.c b/locale/C-ctype.c index d45c32c..6a1c3fc 100644 --- a/locale/C-ctype.c +++ b/locale/C-ctype.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995, 1996 Free Software Foundation, Inc. +/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. @@ -341,7 +341,8 @@ const char _nl_C_LC_CTYPE_width[256] = const struct locale_data _nl_C_LC_CTYPE = { _nl_C_name, - NULL, 0, /* no file mapped */ + NULL, 0, 0, /* no file mapped */ + MAX_USAGE_COUNT, 15, { { string: _nl_C_LC_CTYPE_class }, @@ -367,6 +368,6 @@ const struct locale_data _nl_C_LC_CTYPE = { string: "tolower\0" "toupper\0" }, { string: _nl_C_LC_CTYPE_width }, { word: 2 }, - { string: "ISO_646.IRV:1983" } + { string: "ISO_646.IRV" } } }; diff --git a/locale/C-messages.c b/locale/C-messages.c index 566fedc..70eeb8c 100644 --- a/locale/C-messages.c +++ b/locale/C-messages.c @@ -1,21 +1,21 @@ -/* Copyright (C) 1995, 1996 Free Software Foundation, Inc. -This file is part of the GNU C Library. -Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. +/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. -The GNU C Library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #include "localeinfo.h" @@ -27,7 +27,8 @@ Boston, MA 02111-1307, USA. */ const struct locale_data _nl_C_LC_MESSAGES = { _nl_C_name, - NULL, 0, /* no file mapped */ + NULL, 0, 0, /* no file mapped */ + MAX_USAGE_COUNT, 4, { { string: "^[yY]" }, diff --git a/locale/C-monetary.c b/locale/C-monetary.c index bc10f00..8dd361a 100644 --- a/locale/C-monetary.c +++ b/locale/C-monetary.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995, 1996 Free Software Foundation, Inc. +/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. @@ -30,7 +30,8 @@ static const char not_available[] = "\177"; const struct locale_data _nl_C_LC_MONETARY = { _nl_C_name, - NULL, 0, /* no file mapped */ + NULL, 0, 0, /* no file mapped */ + MAX_USAGE_COUNT, 15, { { string: "" }, diff --git a/locale/C-numeric.c b/locale/C-numeric.c index d3fbd91..a456214 100644 --- a/locale/C-numeric.c +++ b/locale/C-numeric.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995, 1996 Free Software Foundation, Inc. +/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. @@ -30,7 +30,8 @@ static const char not_available[] = "\177"; const struct locale_data _nl_C_LC_NUMERIC = { _nl_C_name, - NULL, 0, /* no file mapped */ + NULL, 0, 0, /* no file mapped */ + MAX_USAGE_COUNT, 3, { { string: "." }, diff --git a/locale/C-time.c b/locale/C-time.c index a71ea93..70ee89a 100644 --- a/locale/C-time.c +++ b/locale/C-time.c @@ -25,7 +25,8 @@ const struct locale_data _nl_C_LC_TIME = { _nl_C_name, - NULL, 0, /* no file mapped */ + NULL, 0, 0, /* no file mapped */ + MAX_USAGE_COUNT, 53, { { string: "Sun" }, diff --git a/locale/Makefile b/locale/Makefile index b5eccf3..dcf469f 100644 --- a/locale/Makefile +++ b/locale/Makefile @@ -1,4 +1,4 @@ -# Copyright (C) 1991, 1992, 1995, 1996 Free Software Foundation, Inc. +# Copyright (C) 1991, 1992, 1995, 1996, 1997 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 @@ -21,7 +21,7 @@ # subdir := locale -headers = locale.h langinfo.h +headers = locale.h langinfo.h xlocale.h distribute = localeinfo.h categories.def iso-4217.def weight.h \ strlen-hash.h \ $(addprefix programs/, \ @@ -32,7 +32,8 @@ distribute = localeinfo.h categories.def iso-4217.def weight.h \ locfile-kw.gperf locfile-kw.h linereader.h \ locales.h locfile.h stringtrans.h charset.h) routines = setlocale findlocale loadlocale localeconv nl_langinfo \ - mb_cur_max codeset_name + mb_cur_max codeset_name \ + newlocale duplocale freelocale categories = ctype messages monetary numeric time collate aux = $(categories:%=lc-%) $(categories:%=C-%) SYS_libc C_name others = localedef locale diff --git a/locale/categories.def b/locale/categories.def index 664fc90..b04ca20 100644 --- a/locale/categories.def +++ b/locale/categories.def @@ -1,20 +1,20 @@ /* Definition of all available locale categories and their items. -*- C -*- -Copyright (C) 1995, 1996 Free Software Foundation, Inc. - -The GNU C Library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. - -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -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. */ + Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ /* These definitions are used by the locale-related files in the C library and the programs `localedef' and `locale'. diff --git a/locale/codeset_name.c b/locale/codeset_name.c index c7fd818..3b327b7 100644 --- a/locale/codeset_name.c +++ b/locale/codeset_name.c @@ -1,22 +1,22 @@ /* Internal function to return the name of the current codeset. -Copyright (C) 1996 Free Software Foundation, Inc. -This file is part of the GNU C Library. -Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. + Copyright (C) 1996, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. -The GNU C Library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #include <langinfo.h> #include <locale.h> diff --git a/locale/duplocale.c b/locale/duplocale.c new file mode 100644 index 0000000..494c2ec --- /dev/null +++ b/locale/duplocale.c @@ -0,0 +1,55 @@ +/* Duplicate handle for selection of locales. + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include <locale.h> +#include <libc-lock.h> +#include <stdlib.h> + +#include <localeinfo.h> + + +/* Lock for protecting global data. */ +__libc_lock_define (extern , __libc_setlocale_lock) + + +__locale_t +__duplocale (__locale_t dataset) +{ + __locale_t result; + + /* We modify global data. */ + __libc_lock_lock (__libc_setlocale_lock); + + /* Get memory. */ + result = (__locale_t) malloc (sizeof (struct __locale_t)); + if (result != NULL) + { + int cnt; + for (cnt = 0; cnt < LC_ALL; ++cnt) + { + result->__locales[cnt] = dataset->__locales[cnt]; + if (result->__locales[cnt]->usage_count != MAX_USAGE_COUNT) + ++result->__locales[cnt]->usage_count; + } + } + + /* It's done. */ + __libc_lock_unlock (__libc_setlocale_lock); +} diff --git a/locale/findlocale.c b/locale/findlocale.c index d73ba4a..308aa2b 100644 --- a/locale/findlocale.c +++ b/locale/findlocale.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1996 Free Software Foundation, Inc. +/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996. @@ -20,23 +20,13 @@ #include <locale.h> #include <stdlib.h> #include <string.h> +#include <sys/mman.h> #include "localeinfo.h" /* Constant data defined in setlocale.c. */ -extern const struct locale_data *const _nl_C[]; - - -static inline char * -copy (const char *string) -{ - size_t len; - char *new; - len = strlen (string) + 1; - new = (char *) malloc (len); - return new != NULL ? memcpy (new, string, len) : NULL; -} +extern struct locale_data *const _nl_C[]; /* For each category we keep a list of records for the locale files @@ -44,9 +34,9 @@ copy (const char *string) static struct loaded_l10nfile *locale_file_list[LC_ALL]; -const struct locale_data * +struct locale_data * _nl_find_locale (const char *locale_path, size_t locale_path_len, - int category, char **name) + int category, const char **name) { int mask; /* Name of the locale for this category. */ @@ -88,10 +78,10 @@ _nl_find_locale (const char *locale_path, size_t locale_path_len, loc_name = (char *) _nl_expand_alias (*name); if (loc_name == NULL) /* It is no alias. */ - loc_name = *name; + loc_name = (char *) *name; /* Make a writable copy of the locale name. */ - loc_name = copy (loc_name); + loc_name = __strdup (loc_name); /* LOCALE can consist of up to four recognized parts for the XPG syntax: @@ -141,9 +131,9 @@ _nl_find_locale (const char *locale_path, size_t locale_path_len, return NULL; } else - /* If the addressed locale is already available it should be freed. - If we would not do this switching back and force between two - locales would slowly eat up all memory.*/ + /* If the addressed locale is already available it should be + freed. If we would not do this switching back and force + between two locales would slowly eat up all memory. */ free ((void *) loc_name); if (locale_file->decided == 0) @@ -184,5 +174,51 @@ _nl_find_locale (const char *locale_path, size_t locale_path_len, } *name = (char *) ((struct locale_data *) locale_file->data)->name; + /* Increment the usage count. */ + if (((struct locale_data *) locale_file->data)->usage_count + != MAX_USAGE_COUNT) + ++((struct locale_data *) locale_file->data)->usage_count; + return (struct locale_data *) locale_file->data; } + + +/* Calling this function assumes the lock for handling global locale data + is acquired. */ +void +_nl_remove_locale (int locale, struct locale_data *data) +{ + if (--data->usage_count == 0) + { + /* First search the entry in the list of loaded files. */ + struct loaded_l10nfile *ptr = locale_file_list[locale]; + + /* Search for the entry. It must be in the list. Otherwise it + is a bug and we crash badly. */ + while ((struct locale_data *) ptr->data != data) + ptr = ptr->next; + + /* Mark the data as not available anymore. So when the data has + to be used again it is reloaded. */ + ptr->decided = 0; + ptr->data = NULL; + + /* Really delete the data. First delete the real data. */ + if (data->mmaped) + { + /* Try to unmap the area. If this fails we mark the area as + permanent. */ + if (__munmap ((caddr_t) data->filedata, data->filesize) != 0) + { + data->usage_count = MAX_USAGE_COUNT; + return; + } + } + else + /* The memory was malloced. */ + free ((void *) data->filedata); + + /* Now free the structure itself. */ + free (data); + } +} diff --git a/locale/freelocale.c b/locale/freelocale.c new file mode 100644 index 0000000..26860aa --- /dev/null +++ b/locale/freelocale.c @@ -0,0 +1,50 @@ +/* Free data allocated by a call to setlocale_r + Copyright (C) 1996, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include <locale.h> +#include <stdlib.h> +#include <libc-lock.h> + +#include "localeinfo.h" + + +/* Lock for protecting global data. */ +__libc_lock_define (extern , __libc_setlocale_lock) + + +void +__freelocale (__locale_t dataset) +{ + int cnt; + + /* We modify global data. */ + __libc_lock_lock (__libc_setlocale_lock); + + for (cnt = 0; cnt < LC_ALL; ++cnt) + if (dataset->__locales[cnt]->usage_count != MAX_USAGE_COUNT) + /* We can remove the data. */ + _nl_remove_locale (cnt, dataset->__locales[cnt]); + + /* Free the locale_t handle itself. */ + free (dataset); + + /* It's done. */ + __libc_lock_unlock (__libc_setlocale_lock); +} diff --git a/locale/lc-collate.c b/locale/lc-collate.c index aefdaa8..7052db3 100644 --- a/locale/lc-collate.c +++ b/locale/lc-collate.c @@ -1,21 +1,21 @@ /* Define current locale data for LC_COLLATE category. -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 -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. - -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ + Copyright (C) 1995, 1996, 1997 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 + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #include "localeinfo.h" #include <endian.h> diff --git a/locale/lc-ctype.c b/locale/lc-ctype.c index 2eeedf8..d2139ae 100644 --- a/locale/lc-ctype.c +++ b/locale/lc-ctype.c @@ -1,21 +1,21 @@ /* Define current locale data for LC_CTYPE category. -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 -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. - -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -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. */ + Copyright (C) 1995, 1996, 1997 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 + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #include "localeinfo.h" #include <ctype.h> diff --git a/locale/lc-messages.c b/locale/lc-messages.c index b7e9bbf..e78f9bf 100644 --- a/locale/lc-messages.c +++ b/locale/lc-messages.c @@ -1,21 +1,21 @@ /* Define current locale data for LC_MESSAGES category. -Copyright (C) 1995 Free Software Foundation, Inc. -This file is part of the GNU C Library. + Copyright (C) 1995, 1997 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 -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. -You should have received a copy of the GNU Library General Public -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. */ + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #include "localeinfo.h" diff --git a/locale/lc-monetary.c b/locale/lc-monetary.c index f29f29a..b041006 100644 --- a/locale/lc-monetary.c +++ b/locale/lc-monetary.c @@ -1,21 +1,21 @@ /* Define current locale data for LC_MONETARY category. -Copyright (C) 1995 Free Software Foundation, Inc. -This file is part of the GNU C Library. + Copyright (C) 1995, 1997 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 -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. -You should have received a copy of the GNU Library General Public -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. */ + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #include "localeinfo.h" diff --git a/locale/lc-numeric.c b/locale/lc-numeric.c index 19e9d96..4184558 100644 --- a/locale/lc-numeric.c +++ b/locale/lc-numeric.c @@ -1,21 +1,21 @@ /* Define current locale data for LC_NUMERIC category. -Copyright (C) 1995 Free Software Foundation, Inc. -This file is part of the GNU C Library. + Copyright (C) 1995, 1997 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 -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. -You should have received a copy of the GNU Library General Public -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. */ + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #include "localeinfo.h" diff --git a/locale/lc-time.c b/locale/lc-time.c index f4fe561..7bed6ae 100644 --- a/locale/lc-time.c +++ b/locale/lc-time.c @@ -1,21 +1,21 @@ /* Define current locale data for LC_TIME category. -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 -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. - -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -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. */ + Copyright (C) 1995, 1996, 1997 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 + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #include <libc-lock.h> #include <stdlib.h> diff --git a/locale/loadlocale.c b/locale/loadlocale.c index 474a73c..544c09a 100644 --- a/locale/loadlocale.c +++ b/locale/loadlocale.c @@ -1,22 +1,22 @@ /* Functions to read locale data files. -Copyright (C) 1996 Free Software Foundation, Inc. -This file is part of the GNU C Library. -Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996. + Copyright (C) 1996, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996. -The GNU C Library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #include <errno.h> #include <fcntl.h> @@ -70,6 +70,7 @@ _nl_load_locale (struct loaded_l10nfile *file, int category) struct locale_data *newdata; int save_err; int swap = 0; + int mmaped = 1; size_t cnt; inline unsigned int SWAP (const unsigned int *inw) { @@ -131,6 +132,7 @@ _nl_load_locale (struct loaded_l10nfile *file, int category) if (errno == ENOSYS) { /* No mmap; allocate a buffer and read from the file. */ + mmaped = 0; filedata = malloc (st.st_size); if (filedata != NULL) { @@ -197,6 +199,8 @@ _nl_load_locale (struct loaded_l10nfile *file, int category) newdata->name = NULL; /* This will be filled if necessary in findlocale.c. */ newdata->filedata = (void *) filedata; newdata->filesize = st.st_size; + newdata->mmaped = mmaped; + newdata->usage_count = 0; newdata->nstrings = _nl_category_num_items[category]; for (cnt = 0; cnt < newdata->nstrings; ++cnt) { diff --git a/locale/locale.h b/locale/locale.h index 37f5434..c16d83b 100644 --- a/locale/locale.h +++ b/locale/locale.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1991, 1992, 1995, 1996 Free Software Foundation, Inc. +/* Copyright (C) 1991, 1992, 1995, 1996, 1997 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 @@ -105,9 +105,8 @@ extern struct lconv *localeconv __P ((void)); Attention: all these functions are *not* standardized in any form. This is a proof-of-concept implementation. */ -/* Structure for reentrant locale using functions. This is an opaque - type for the user level programs. */ -typedef struct locale_data *locale_t[LC_ALL]; +/* Get locale datatype definition. */ +# include <xlocale.h> /* Return a reference to a data structure representing a set of locale datasets. Unlike for the CATEGORY parameter for `setlocale' the @@ -115,13 +114,17 @@ typedef struct locale_data *locale_t[LC_ALL]; I.e., 1 << LC_CTYPE means to load data for this category. If BASE is non-null the appropriate category information in the BASE record is replaced. */ -extern __const locale_t *__newlocale __P ((int __category_mask, - __const char *__locale, - __const locale_t *__base)); +extern __locale_t __newlocale __P ((int __category_mask, + __const char *__locale, + __locale_t __base)); + +/* Return a duplicate of the set of locale in DATASET. All usage + counters are increased if necessary. */ +extern __locale_t __duplocale __P ((__locale_t __dataset)); /* Free the data associated with a locale dataset previously returned by a call to `setlocale_r'. */ -extern void __freelocale __P ((__const locale_t *__dataset)); +extern void __freelocale __P ((__locale_t __dataset)); #endif __END_DECLS diff --git a/locale/localeconv.c b/locale/localeconv.c index d846210..06f12db 100644 --- a/locale/localeconv.c +++ b/locale/localeconv.c @@ -1,20 +1,20 @@ -/* Copyright (C) 1991, 1992, 1995 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 -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. - -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -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. */ +/* Copyright (C) 1991, 1992, 1995, 1997 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 + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #include <locale.h> #include "localeinfo.h" diff --git a/locale/localeinfo.h b/locale/localeinfo.h index 018220f..c029f63 100644 --- a/locale/localeinfo.h +++ b/locale/localeinfo.h @@ -22,6 +22,7 @@ #include <stddef.h> #include <langinfo.h> +#include <limits.h> #include <time.h> #include <sys/types.h> @@ -35,12 +36,19 @@ #define ELLIPSIS_CHAR ((wchar_t) 0xfffffffe) #define IGNORE_CHAR ((wchar_t) 0xffffffff) +/* We use a special value for the usage counter in `locale_data' to + signal that this data must never be removed anymore. */ +#define MAX_USAGE_COUNT UINT_MAX + /* Structure describing locale data in core for a category. */ struct locale_data { const char *name; const char *filedata; /* Region mapping the file data. */ off_t filesize; /* Size of the file (and the region). */ + int mmaped; /* If nonzero the data is mmaped. */ + + unsigned int usage_count; /* Counter for users. */ unsigned int nstrings; /* Number of strings below. */ union locale_data_value @@ -90,13 +98,13 @@ struct era_entry /* 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; +extern struct locale_data *_nl_current_##category; #include "categories.def" #undef DEFINE_CATEGORY extern const char *const _nl_category_names[LC_ALL + 1]; extern const size_t _nl_category_name_sizes[LC_ALL + 1]; -extern const struct locale_data * *const _nl_current[LC_ALL]; +extern struct locale_data * *const _nl_current[LC_ALL]; /* Name of the standard locale. */ extern const char _nl_C_name[]; @@ -111,26 +119,29 @@ extern const char _nl_C_name[]; /* This is used in lc-CATEGORY.c to define _nl_current_CATEGORY. */ #define _NL_CURRENT_DEFINE(category) \ - extern const struct locale_data _nl_C_##category; \ - const struct locale_data *_nl_current_##category = &_nl_C_##category + extern struct locale_data _nl_C_##category; \ + struct locale_data *_nl_current_##category = &_nl_C_##category /* Load the locale data for CATEGORY from the file specified by *NAME. If *NAME is "", use environment variables as specified by POSIX, and fill in *NAME with the actual name used. The directories listed in LOCALE_PATH are searched for the locale files. */ -extern const struct locale_data *_nl_find_locale (const char *locale_path, - size_t locale_path_len, - int category, char **name); +extern struct locale_data *_nl_find_locale (const char *locale_path, + size_t locale_path_len, + int category, const char **name); /* Try to load the file described by FILE. */ extern void _nl_load_locale (struct loaded_l10nfile *file, int category); +/* Free the locale and give back all memory if the usage count is one. */ +extern void _nl_remove_locale (int locale, struct locale_data *data); + /* Return `era' entry which corresponds to TP. Used in strftime. */ -struct era_entry *_nl_get_era_entry (const struct tm *tp); +extern 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); +extern const char *_nl_get_alt_digit (unsigned int number); /* Global variables for LC_COLLATE category data. */ diff --git a/locale/newlocale.c b/locale/newlocale.c new file mode 100644 index 0000000..d4e184b --- /dev/null +++ b/locale/newlocale.c @@ -0,0 +1,192 @@ +/* Return a reference to locale information record. + Copyright (C) 1996, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include <argz.h> +#include <errno.h> +#include <locale.h> +#include <stdlib.h> + +#include "localeinfo.h" + + +/* Constant data defined in setlocale.c. */ +extern struct locale_data *const _nl_C[]; + +/* Use this when we come along an error. */ +#define ERROR_RETURN \ + do { \ + __set_errno (EINVAL); \ + return NULL; \ + } while (0) + + +__locale_t +__newlocale (int category_mask, const char *locale, __locale_t base) +{ + /* Intermediate memory for result. */ + const char *newnames[LC_ALL]; + struct __locale_t result; + __locale_t result_ptr; + char *locale_path; + size_t locale_path_len; + const char *locpath_var; + int cnt; + + /* We treat LC_ALL in the same way as if all bits were set. */ + if (category_mask == LC_ALL) + category_mask = (1 << LC_ALL) - 1; + + /* Sanity check for CATEGORY argument. */ + if ((category_mask & ~(1 << LC_ALL) - 1) != 0) + ERROR_RETURN; + + /* `newlocale' does not support asking for the locale name. */ + if (locale == NULL) + ERROR_RETURN; + + /* Allocate memory for the result. */ + if (base != NULL) + { + if (base != NULL) + return base; + + result = *base; + } + else + { + /* Fill with pointers to C locale data to . */ + for (cnt = 0; cnt < LC_ALL; ++cnt) + result.__locales[cnt] = _nl_C[cnt]; + + /* If no category is to be set we return BASE if available or a + dataset using the C locale data. */ + if (category_mask == 0) + { + result_ptr = (__locale_t) malloc (sizeof (struct __locale_t)); + *result_ptr = result; + + goto update; + } + } + + /* We perhaps really have to load some data. So we determine the + path in which to look for the data now. The environment variable + `LOCPATH' must only be used when the binary has no SUID or SGID + bit set. */ + locale_path = NULL; + locale_path_len = 0; + + locpath_var = __secure_getenv ("LOCPATH"); + if (locpath_var != NULL && locpath_var[0] != '\0') + if (__argz_create_sep (locpath_var, ':', + &locale_path, &locale_path_len) != 0) + return NULL; + + if (__argz_append (&locale_path, &locale_path_len, + LOCALE_PATH, sizeof (LOCALE_PATH)) != 0) + return NULL; + + /* Get the names for the locales we are interested in. We either + allow a composite name or a single name. */ + for (cnt = 0; cnt < LC_ALL; ++cnt) + newnames[cnt] = locale; + if (strchr (locale, ';') != NULL) + { + /* This is a composite name. Make a copy and split it up. */ + char *np = strdupa (locale); + char *cp; + + while ((cp = strchr (np, '=')) != NULL) + { + for (cnt = 0; cnt < LC_ALL; ++cnt) + if ((size_t) (cp - np) == _nl_category_name_sizes[cnt] + && memcmp (np, _nl_category_names[cnt], cp - np) == 0) + break; + + if (cnt == LC_ALL) + /* Bogus category name. */ + ERROR_RETURN; + + /* Found the category this clause sets. */ + newnames[cnt] = ++cp; + cp = strchr (cp, ';'); + if (cp != NULL) + { + /* Examine the next clause. */ + *cp = '\0'; + np = cp + 1; + } + else + /* This was the last clause. We are done. */ + break; + } + + for (cnt = 0; cnt < LC_ALL; ++cnt) + if ((category_mask & 1 << cnt) != 0 && newnames[cnt] == locale) + /* The composite name did not specify the category we need. */ + ERROR_RETURN; + } + + /* Now process all categories we are interested in. */ + for (cnt = 0; cnt < LC_ALL; ++cnt) + if ((category_mask & 1 << cnt) != 0) + { + result.__locales[cnt] = _nl_find_locale (locale_path, locale_path_len, + cnt, &newnames[cnt]); + if (result.__locales[cnt] == NULL) + return NULL; + } + + /* We successfully loaded all required data. */ + if (base == NULL) + { + /* Allocate new structure. */ + result_ptr = (__locale_t) malloc (sizeof (struct __locale_t)); + if (result_ptr == NULL) + return NULL; + + *result_ptr = result; + } + else + *(result_ptr = base) = result; + + /* Update the special members. */ + update: + { + union locale_data_value *ctypes = result_ptr->__locales[LC_CTYPE]->values; + result_ptr->__ctype_b = (const unsigned short int *) + (ctypes[_NL_ITEM_INDEX (_NL_CTYPE_CLASS)] .string); +#if BYTE_ORDER == BIG_ENDIAN + result_ptr->__ctype_tolower = (const int *) + (ctypes[_NL_ITEM_INDEX (_NL_CTYPE_TOLOWER_EB)].string); + result_ptr->__ctype_toupper = (const int *) + (ctypes[_NL_ITEM_INDEX (_NL_CTYPE_TOUPPER_EB)].string); +#elif BYTE_ORDER == LITTLE_ENDIAN + result_ptr->__ctype_tolower = (const int *) + (ctypes[_NL_ITEM_INDEX (_NL_CTYPE_TOLOWER_EL)].string); + result_ptr->__ctype_toupper = (const int *) + (ctypes[_NL_ITEM_INDEX (_NL_CTYPE_TOUPPER_EL)].string); +#else +#error bizarre byte order +#endif + } + + return result_ptr; +} diff --git a/locale/nl_langinfo.c b/locale/nl_langinfo.c index 1c42e14..df2b3e9 100644 --- a/locale/nl_langinfo.c +++ b/locale/nl_langinfo.c @@ -1,21 +1,21 @@ -/* nl_langinfo -- User interface for extracting locale-dependent parameters. -Copyright (C) 1995, 1996 Free Software Foundation, Inc. -This file is part of the GNU C Library. +/* User interface for extracting locale-dependent parameters. + Copyright (C) 1995, 1996, 1997 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 -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. -You should have received a copy of the GNU Library General Public -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. */ + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #include <langinfo.h> #include <errno.h> @@ -26,7 +26,7 @@ Cambridge, MA 02139, USA. */ the references here are not weak references, this guarantees that the data for all the categories will be linked in. */ -static const struct locale_data * *const nldata[] = +static struct locale_data * *const nldata[] = { #define DEFINE_CATEGORY(category, category_name, items, a, b, c, d) \ [category] = &_nl_current_##category, diff --git a/locale/programs/charmap-kw.gperf b/locale/programs/charmap-kw.gperf index 8e00103..1fb9c38 100644 --- a/locale/programs/charmap-kw.gperf +++ b/locale/programs/charmap-kw.gperf @@ -1,22 +1,22 @@ %{ -/* Copyright (C) 1995, 1996 Free Software Foundation, Inc. -This file is part of the GNU C Library. -Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>. +/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>. -The GNU C Library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #include <string.h> diff --git a/locale/programs/charmap-kw.h b/locale/programs/charmap-kw.h index 93326d0..3bfcd14 100644 --- a/locale/programs/charmap-kw.h +++ b/locale/programs/charmap-kw.h @@ -1,23 +1,23 @@ /* C code produced by gperf version 2.5 (GNU C++ version) */ /* Command-line: gperf -acCgopt -k1,2,5,$ -N charmap_hash programs/charmap-kw.gperf */ -/* Copyright (C) 1995, 1996 Free Software Foundation, Inc. -This file is part of the GNU C Library. -Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>. +/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>. -The GNU C Library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #include <string.h> @@ -59,16 +59,16 @@ hash (register const char *str, register int len) { default: case 5: - hval += asso_values[(int) str[4]]; + hval += asso_values[str[4]]; case 4: case 3: case 2: - hval += asso_values[(int) str[1]]; + hval += asso_values[str[1]]; case 1: - hval += asso_values[(int) str[0]]; + hval += asso_values[str[0]]; break; } - return hval + asso_values[(int) str[len - 1]]; + return hval + asso_values[str[len - 1]]; } #ifdef __GNUC__ diff --git a/locale/programs/charmap.c b/locale/programs/charmap.c index 6b4ebb4..37b6cde 100644 --- a/locale/programs/charmap.c +++ b/locale/programs/charmap.c @@ -72,7 +72,7 @@ charmap_read (const char *filename) result = parse_charmap (pathnfile); - if (result == NULL) + if (result == NULL && !be_quiet) error (0, errno, _("character map file `%s' not found"), filename); } @@ -171,7 +171,7 @@ parse_charmap (const char *filename) result->mb_cur_max = 1; if (result->mb_cur_min == 0) result->mb_cur_min = result->mb_cur_max; - if (result->mb_cur_min > result->mb_cur_max) + if (result->mb_cur_min > result->mb_cur_max && !be_quiet) { error (0, 0, _("\ %s: <mb_cur_max> must be greater than <mb_cur_min>\n"), @@ -596,7 +596,7 @@ only WIDTH definitions are allowed to follow the CHARMAP definition")); break; } - if (state != 91) + if (state != 91 && !be_quiet) error (0, 0, _("%s: premature end of file"), cmfile->fname); lr_close (cmfile); diff --git a/locale/programs/charset.c b/locale/programs/charset.c index a7f988d..00233ab 100644 --- a/locale/programs/charset.c +++ b/locale/programs/charset.c @@ -1,21 +1,21 @@ -/* Copyright (C) 1996 Free Software Foundation, Inc. -This file is part of the GNU C Library. -Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>. - -The GNU C Library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. - -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ +/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H # include <config.h> diff --git a/locale/programs/charset.h b/locale/programs/charset.h index eccce91..82c4ef0 100644 --- a/locale/programs/charset.h +++ b/locale/programs/charset.h @@ -1,6 +1,6 @@ -/* Copyright (C) 1996 Free Software Foundation, Inc. +/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. This file is part of the GNU C Library. - Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as @@ -56,6 +56,9 @@ struct charset_t #define ILLEGAL_CHAR_VALUE ((wchar_t) 0xffffffffu) +/* Declared in localedef.c. */ +extern int be_quiet; + /* Prototypes for charmap handling functions. */ struct charset_t *charmap_read (const char *filename); diff --git a/locale/programs/ld-collate.c b/locale/programs/ld-collate.c index d4b0f2b..3a8c17a 100644 --- a/locale/programs/ld-collate.c +++ b/locale/programs/ld-collate.c @@ -239,7 +239,7 @@ collate_finish (struct localedef_t *locale, struct charset_t *charset) else value = 0; - if (value == 0) + if (value == 0 && !be_quiet) error_at_line (0, 0, patch->fname, patch->lineno, _("no weight defined for symbol `%s'"), patch->token); else @@ -256,7 +256,8 @@ collate_finish (struct localedef_t *locale, struct charset_t *charset) \**************************************************************/ u_int32_t weight; - error (0, 0, _("no definition of `UNDEFINED'")); + if (!be_quiet) + error (0, 0, _("no definition of `UNDEFINED'")); collate->undefined.ordering_len = collate->nrules; weight = ++collate->order_cnt; @@ -324,9 +325,10 @@ collate_output (struct localedef_t *locale, struct charset_t *charset, level_best = 0xffff; /* Compute table size. */ - fputs (_("\ + if (!be_quiet) + fputs (_("\ Computing table size for collation information might take a while..."), - stderr); + stderr); for (table_size = 256; table_size < sum_best; ++table_size) { size_t hits[table_size]; @@ -357,7 +359,8 @@ Computing table size for collation information might take a while..."), } } assert (table_best != 0xffff || level_best != 0xffff); - fputs (_(" done\n"), stderr); + if (!be_quiet) + fputs (_(" done\n"), stderr); obstack_init (&non_simple); obstack_init (&string_pool); diff --git a/locale/programs/ld-ctype.c b/locale/programs/ld-ctype.c index fb352e5..5f1bc48 100644 --- a/locale/programs/ld-ctype.c +++ b/locale/programs/ld-ctype.c @@ -1,21 +1,21 @@ -/* Copyright (C) 1995, 1996 Free Software Foundation, Inc. -This file is part of the GNU C Library. -Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>. +/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. -The GNU C Library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H # include <config.h> @@ -262,10 +262,11 @@ ctype_finish (struct localedef_t *locale, struct charset_t *charset) cp += sprintf (cp, "\\%o", (value >> 8) & 0xff); sprintf (cp, "\\%o", value & 0xff); - error (0, 0, _("\ + if (!be_quiet) + error (0, 0, _("\ character %s'%s' in class `%s' must be in class `%s'"), value > 256 ? "L" : "", - cp, valid_table[cls1].name, - valid_table[cls2].name); + cp, valid_table[cls1].name, + valid_table[cls2].name); } break; @@ -286,10 +287,12 @@ character %s'%s' in class `%s' must be in class `%s'"), value > 256 ? "L" : "", cp += sprintf (cp, "\\%o", (value >> 8) & 0xff); sprintf (cp, "\\%o", value & 0xff); - error (0, 0, _("\ + if (!be_quiet) + error (0, 0, _("\ character %s'%s' in class `%s' must not be in class `%s'"), - value > 256 ? "L" : "", cp, - valid_table[cls1].name, valid_table[cls2].name); + value > 256 ? "L" : "", cp, + valid_table[cls1].name, + valid_table[cls2].name); } break; @@ -306,23 +309,25 @@ character %s'%s' in class `%s' must not be in class `%s'"), /* ... and now test <SP> as a special case. */ space_value = charset_find_value (charset, "SP", 2); - if ((wchar_t) space_value == ILLEGAL_CHAR_VALUE) + if ((wchar_t) space_value == ILLEGAL_CHAR_VALUE && !be_quiet) error (0, 0, _("character <SP> not defined in character map")); - else if ((cnt = BITPOS (tok_space), - (ELEM (ctype, class_collection, , space_value) - & BIT (tok_space)) == 0) - || (cnt = BITPOS (tok_blank), - (ELEM (ctype, class_collection, , space_value) - & BIT (tok_blank)) == 0)) + else if (((cnt = BITPOS (tok_space), + (ELEM (ctype, class_collection, , space_value) + & BIT (tok_space)) == 0) + || (cnt = BITPOS (tok_blank), + (ELEM (ctype, class_collection, , space_value) + & BIT (tok_blank)) == 0)) + && !be_quiet) error (0, 0, _("<SP> character not in class `%s'"), valid_table[cnt].name); - else if ((cnt = BITPOS (tok_punct), - (ELEM (ctype, class_collection, , space_value) - & BIT (tok_punct)) != 0) - || (cnt = BITPOS (tok_graph), - (ELEM (ctype, class_collection, , space_value) - & BIT (tok_graph)) - != 0)) + else if (((cnt = BITPOS (tok_punct), + (ELEM (ctype, class_collection, , space_value) + & BIT (tok_punct)) != 0) + || (cnt = BITPOS (tok_graph), + (ELEM (ctype, class_collection, , space_value) + & BIT (tok_graph)) + != 0)) + && !be_quiet) error (0, 0, _("<SP> character must not be in class `%s'"), valid_table[cnt].name); else @@ -934,7 +939,7 @@ set_class_defaults (struct locale_ctype_t *ctype, struct charset_t *charset) tmp[0] = ch; value = charset_find_value (charset, tmp, 1); - if ((wchar_t) value == ILLEGAL_CHAR_VALUE) + if ((wchar_t) value == ILLEGAL_CHAR_VALUE && !be_quiet) { error (0, 0, _("\ character `%s' not defined while needed as default value"), @@ -998,7 +1003,7 @@ character `%s' not defined while needed as default value"), unsigned int value; value = charset_find_value (charset, "space", 5); - if ((wchar_t) value == ILLEGAL_CHAR_VALUE) + if ((wchar_t) value == ILLEGAL_CHAR_VALUE && !be_quiet) error (0, 0, _("\ character `%s' not defined while needed as default value"), "<space>"); @@ -1006,7 +1011,7 @@ character `%s' not defined while needed as default value"), ELEM (ctype, class_collection, , value) |= BIT (tok_space); value = charset_find_value (charset, "form-feed", 9); - if ((wchar_t) value == ILLEGAL_CHAR_VALUE) + if ((wchar_t) value == ILLEGAL_CHAR_VALUE && !be_quiet) error (0, 0, _("\ character `%s' not defined while needed as default value"), "<form-feed>"); @@ -1014,7 +1019,7 @@ character `%s' not defined while needed as default value"), ELEM (ctype, class_collection, , value) |= BIT (tok_space); value = charset_find_value (charset, "newline", 7); - if ((wchar_t) value == ILLEGAL_CHAR_VALUE) + if ((wchar_t) value == ILLEGAL_CHAR_VALUE && !be_quiet) error (0, 0, _("\ character `%s' not defined while needed as default value"), "<newline>"); @@ -1022,7 +1027,7 @@ character `%s' not defined while needed as default value"), ELEM (ctype, class_collection, , value) |= BIT (tok_space); value = charset_find_value (charset, "carriage-return", 15); - if ((wchar_t) value == ILLEGAL_CHAR_VALUE) + if ((wchar_t) value == ILLEGAL_CHAR_VALUE && !be_quiet) error (0, 0, _("\ character `%s' not defined while needed as default value"), "<carriage-return>"); @@ -1030,7 +1035,7 @@ character `%s' not defined while needed as default value"), ELEM (ctype, class_collection, , value) |= BIT (tok_space); value = charset_find_value (charset, "tab", 3); - if ((wchar_t) value == ILLEGAL_CHAR_VALUE) + if ((wchar_t) value == ILLEGAL_CHAR_VALUE && !be_quiet) error (0, 0, _("\ character `%s' not defined while needed as default value"), "<tab>"); @@ -1038,7 +1043,7 @@ character `%s' not defined while needed as default value"), ELEM (ctype, class_collection, , value) |= BIT (tok_space); value = charset_find_value (charset, "vertical-tab", 12); - if ((wchar_t) value == ILLEGAL_CHAR_VALUE) + if ((wchar_t) value == ILLEGAL_CHAR_VALUE && !be_quiet) error (0, 0, _("\ character `%s' not defined while needed as default value"), "<vertical-tab>"); @@ -1064,7 +1069,7 @@ character `%s' not defined while needed as default value"), unsigned int value; value = charset_find_value (charset, "space", 5); - if ((wchar_t) value == ILLEGAL_CHAR_VALUE) + if ((wchar_t) value == ILLEGAL_CHAR_VALUE && !be_quiet) error (0, 0, _("\ character `%s' not defined while needed as default value"), "<space>"); @@ -1072,7 +1077,7 @@ character `%s' not defined while needed as default value"), ELEM (ctype, class_collection, , value) |= BIT (tok_blank); value = charset_find_value (charset, "tab", 3); - if ((wchar_t) value == ILLEGAL_CHAR_VALUE) + if ((wchar_t) value == ILLEGAL_CHAR_VALUE && !be_quiet) error (0, 0, _("\ character `%s' not defined while needed as default value"), "<tab>"); @@ -1110,7 +1115,7 @@ character `%s' not defined while needed as default value"), ctype->class_collection[cnt] |= BIT (tok_print); space = charset_find_value (charset, "space", 5); - if (space == ILLEGAL_CHAR_VALUE) + if (space == ILLEGAL_CHAR_VALUE && !be_quiet) error (0, 0, _("\ character `%s' not defined while needed as default value"), "<space>"); @@ -1136,7 +1141,7 @@ character `%s' not defined while needed as default value"), tmp[1] = (char) ch; value_from = charset_find_value (charset, &tmp[1], 1); - if ((wchar_t) value_from == ILLEGAL_CHAR_VALUE) + if ((wchar_t) value_from == ILLEGAL_CHAR_VALUE && !be_quiet) { error (0, 0, _("\ character `%s' not defined while needed as default value"), @@ -1147,7 +1152,7 @@ character `%s' not defined while needed as default value"), /* This conversion is implementation defined. */ tmp[1] = (char) (ch + ('A' - 'a')); value_to = charset_find_value (charset, &tmp[1], 1); - if ((wchar_t) value_to == ILLEGAL_CHAR_VALUE) + if ((wchar_t) value_to == ILLEGAL_CHAR_VALUE && !be_quiet) { error (0, 0, _("\ character `%s' not defined while needed as default value"), @@ -1195,9 +1200,10 @@ allocate_arrays (struct locale_ctype_t *ctype, struct charset_t *charset) size_t min_total = UINT_MAX; size_t act_size = 256; - fputs (_("\ + if (!be_quiet) + fputs (_("\ Computing table size for character classes might take a while..."), - stderr); + stderr); while (act_size < min_total) { @@ -1232,7 +1238,8 @@ Computing table size for character classes might take a while..."), ++act_size; } - fprintf (stderr, _(" done\n")); + if (!be_quiet) + fputs (_(" done\n"), stderr); #if __BYTE_ORDER == __LITTLE_ENDIAN diff --git a/locale/programs/ld-messages.c b/locale/programs/ld-messages.c index ede6167..31edb47 100644 --- a/locale/programs/ld-messages.c +++ b/locale/programs/ld-messages.c @@ -1,21 +1,21 @@ -/* Copyright (C) 1995, 1996 Free Software Foundation, Inc. -This file is part of the GNU C Library. -Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>. +/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. -The GNU C Library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H # include <config.h> @@ -77,7 +77,7 @@ messages_finish (struct localedef_t *locale) = locale->categories[LC_MESSAGES].messages; /* The fields YESSTR and NOSTR are optional. */ - if (messages->yesexpr == NULL) + if (messages->yesexpr == NULL && !be_quiet) error (0, 0, _("field `%s' in category `%s' undefined"), "yesexpr", "LC_MESSAGES"); else @@ -87,7 +87,7 @@ messages_finish (struct localedef_t *locale) /* Test whether it are correct regular expressions. */ result = regcomp (&re, messages->yesexpr, REG_EXTENDED); - if (result != 0) + if (result != 0 && !be_quiet) { char errbuf[BUFSIZ]; @@ -98,7 +98,7 @@ no correct regular expression for field `%s' in category `%s': %s"), } } - if (messages->noexpr == NULL) + if (messages->noexpr == NULL && !be_quiet) error (0, 0, _("field `%s' in category `%s' undefined"), "noexpr", "LC_MESSAGES"); else @@ -108,7 +108,7 @@ no correct regular expression for field `%s' in category `%s': %s"), /* Test whether it are correct regular expressions. */ result = regcomp (&re, messages->noexpr, REG_EXTENDED); - if (result != 0) + if (result != 0 && !be_quiet) { char errbuf[BUFSIZ]; diff --git a/locale/programs/ld-monetary.c b/locale/programs/ld-monetary.c index 5efa969..ce83b18 100644 --- a/locale/programs/ld-monetary.c +++ b/locale/programs/ld-monetary.c @@ -1,21 +1,21 @@ -/* Copyright (C) 1995, 1996 Free Software Foundation, Inc. -This file is part of the GNU C Library. -Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>. +/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. -The GNU C Library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H # include <config.h> @@ -115,7 +115,7 @@ monetary_finish (struct localedef_t *locale) = locale->categories[LC_MONETARY].monetary; #define TEST_ELEM(cat) \ - if (monetary->cat == NULL) \ + if (monetary->cat == NULL && !be_quiet) \ error (0, 0, _("field `%s' in category `%s' not defined"), \ #cat, "LC_MONETARY") @@ -129,12 +129,13 @@ 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 && !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) + (comparison_fn_t) curr_strcmp) == NULL + && !be_quiet) error (0, 0, _("\ value of field `int_curr_symbol' in category `LC_MONETARY' does \ not correspond to a valid name in ISO 4217")); @@ -143,23 +144,23 @@ not correspond to a valid name in ISO 4217")); /* The decimal point must not be empty. This is not said explicitly in POSIX but ANSI C (ISO/IEC 9899) says in 4.4.2.1 it has to be != "". */ - if (monetary->mon_decimal_point[0] == '\0') + if (monetary->mon_decimal_point[0] == '\0' && !be_quiet) { error (0, 0, _("\ value for field `%s' in category `%s' must not be the empty string"), "mon_decimal_point", "LC_MONETARY"); } - if (monetary->mon_grouping_act == 0) + if (monetary->mon_grouping_act == 0 && !be_quiet) error (0, 0, _("field `%s' in category `%s' not defined"), "mon_grouping", "LC_MONETARY"); #undef TEST_ELEM #define TEST_ELEM(cat, min, max) \ - if (monetary->cat == -2) \ + if (monetary->cat == -2 && !be_quiet) \ error (0, 0, _("field `%s' in category `%s' not defined"), \ #cat, "LC_MONETARY"); \ - else if (monetary->cat < min || monetary->cat > max) \ + else if ((monetary->cat < min || monetary->cat > max) && !be_quiet) \ error (0, 0, _("\ value for field `%s' in category `%s' must be in range %d...%d"), \ #cat, "LC_MONETARY", min, max) diff --git a/locale/programs/ld-numeric.c b/locale/programs/ld-numeric.c index 69ea7e0..375635a 100644 --- a/locale/programs/ld-numeric.c +++ b/locale/programs/ld-numeric.c @@ -1,6 +1,6 @@ -/* Copyright (C) 1995, 1996 Free Software Foundation, Inc. +/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. This file is part of the GNU C Library. - Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as @@ -74,7 +74,7 @@ numeric_finish (struct localedef_t *locale) struct locale_numeric_t *numeric = locale->categories[LC_NUMERIC].numeric; #define TEST_ELEM(cat) \ - if (numeric->cat == NULL) \ + if (numeric->cat == NULL && !be_quiet) \ error (0, 0, _("field `%s' in category `%s' not defined"), \ #cat, "LC_NUMERIC") @@ -84,14 +84,14 @@ numeric_finish (struct localedef_t *locale) /* The decimal point must not be empty. This is not said explicitly in POSIX but ANSI C (ISO/IEC 9899) says in 4.4.2.1 it has to be != "". */ - if (numeric->decimal_point[0] == '\0') + if (numeric->decimal_point[0] == '\0' && !be_quiet) { error (0, 0, _("\ value for field `%s' in category `%s' must not be the empty string"), "decimal_point", "LC_NUMERIC"); } - if (numeric->grouping_act == 0) + if (numeric->grouping_act == 0 && !be_quiet) error (0, 0, _("field `%s' in category `%s' not defined"), "grouping", "LC_NUMERIC"); } diff --git a/locale/programs/ld-time.c b/locale/programs/ld-time.c index cc571b8..b977763 100644 --- a/locale/programs/ld-time.c +++ b/locale/programs/ld-time.c @@ -106,10 +106,10 @@ time_finish (struct localedef_t *locale) struct locale_time_t *time = locale->categories[LC_TIME].time; #define TESTARR_ELEM(cat, max) \ - if (time->cur_num_##cat == 0) \ + if (time->cur_num_##cat == 0 && !be_quiet) \ error (0, 0, _("field `%s' in category `%s' not defined"), \ #cat, "LC_TIME"); \ - else if (time->cur_num_##cat != max) \ + else if (time->cur_num_##cat != max && !be_quiet) \ error (0, 0, _("field `%s' in category `%s' has not enough values"), \ #cat, "LC_TIME") @@ -120,7 +120,7 @@ time_finish (struct localedef_t *locale) TESTARR_ELEM (am_pm, 2); #define TEST_ELEM(cat) \ - if (time->cat == NULL) \ + if (time->cat == NULL && !be_quiet) \ error (0, 0, _("field `%s' in category `%s' not defined"), \ #cat, "LC_TIME") @@ -149,7 +149,7 @@ time_finish (struct localedef_t *locale) memcpy (str, time->era[idx], era_len + 1); /* First character must be + or - for the direction. */ - if (*str != '+' && *str != '-') + if (*str != '+' && *str != '-' && !be_quiet) { error (0, 0, _("direction flag in string %d in `era' field" " in category `%s' is not '+' nor '-'"), @@ -159,7 +159,7 @@ time_finish (struct localedef_t *locale) } else time->era_entries[idx].direction = *str; - if (*++str != ':') + if (*++str != ':' && !be_quiet) { error (0, 0, _("direction flag in string %d in `era' field" " in category `%s' is not a single character"), @@ -171,14 +171,14 @@ time_finish (struct localedef_t *locale) /* Now the offset year. */ time->era_entries[idx].offset = strtol (str, &endp, 10); - if (endp == str) + if (endp == str && !be_quiet) { 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 != ':') + else if (*endp != ':' && !be_quiet) { error (0, 0, _("garbage at end of offset value in string %d in" " `era' field in category `%s'"), @@ -224,7 +224,7 @@ time_finish (struct localedef_t *locale) time->era_entries[idx].start_date[1] -= 1; time->era_entries[idx].start_date[2] = strtol (str, &endp, 10); - if (endp == str) + if (endp == str && !be_quiet) { invalid_start_date: error (0, 0, _("illegal starting date in string %d in" @@ -232,7 +232,7 @@ time_finish (struct localedef_t *locale) idx + 1, "LC_TIME"); (void) strsep (&str, ":"); } - else if (*endp != ':') + else if (*endp != ':' && !be_quiet) { garbage_start_date: error (0, 0, _("garbage at end of starting date in string %d" @@ -245,14 +245,15 @@ time_finish (struct localedef_t *locale) 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]))) + 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]))) + && !be_quiet) error (0, 0, _("starting date is illegal in" " string %d in `era' field in" " category `%s'"), @@ -296,7 +297,7 @@ time_finish (struct localedef_t *locale) time->era_entries[idx].stop_date[1] -= 1; time->era_entries[idx].stop_date[2] = strtol (str, &endp, 10); - if (endp == str) + if (endp == str && !be_quiet) { invalid_stop_date: error (0, 0, _("illegal stopping date in string %d in" @@ -304,7 +305,7 @@ time_finish (struct localedef_t *locale) idx + 1, "LC_TIME"); (void) strsep (&str, ":"); } - else if (*endp != ':') + else if (*endp != ':' && !be_quiet) { garbage_stop_date: error (0, 0, _("garbage at end of stopping date in string %d" @@ -317,14 +318,15 @@ time_finish (struct localedef_t *locale) 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]))) + 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]))) + && !be_quiet) error (0, 0, _("stopping date is illegal in" " string %d in `era' field in" " category `%s'"), @@ -332,7 +334,7 @@ time_finish (struct localedef_t *locale) } } - if (str == NULL || *str == '\0') + if ((str == NULL || *str == '\0') && !be_quiet) { error (0, 0, _("missing era name in string %d in `era' field" " in category `%s'"), idx + 1, "LC_TIME"); @@ -343,7 +345,7 @@ time_finish (struct localedef_t *locale) { time->era_entries[idx].name = strsep (&str, ":"); - if (str == NULL || *str == '\0') + if ((str == NULL || *str == '\0') && !be_quiet) { error (0, 0, _("missing era format in string %d in `era'" " field in category `%s'"), diff --git a/locale/programs/linereader.h b/locale/programs/linereader.h index bf5f1bc..6f81b81 100644 --- a/locale/programs/linereader.h +++ b/locale/programs/linereader.h @@ -1,21 +1,21 @@ -/* Copyright (C) 1996 Free Software Foundation, Inc. -This file is part of the GNU C Library. -Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>. - -The GNU C Library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. - -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ +/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #ifndef _LINEREADER_H #define _LINEREADER_H 1 diff --git a/locale/programs/locale-spec.c b/locale/programs/locale-spec.c index c595524..9c432e3 100644 --- a/locale/programs/locale-spec.c +++ b/locale/programs/locale-spec.c @@ -1,22 +1,22 @@ /* Handle special requests. -Copyright (C) 1996 Free Software Foundation, Inc. -This file is part of the GNU C Library. -Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996. - -The GNU C Library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. - -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ + Copyright (C) 1996, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H # include <config.h> diff --git a/locale/programs/localedef.c b/locale/programs/localedef.c index 580816b..da01d4c 100644 --- a/locale/programs/localedef.c +++ b/locale/programs/localedef.c @@ -70,6 +70,8 @@ int posix_conformance; /* If not zero give a lot more messages. */ int verbose; +/* If not zero suppress warnings and information messages. */ +int be_quiet; /* Long options. */ @@ -81,6 +83,7 @@ static const struct option long_options[] = { "force", no_argument, NULL, 'c' }, { "inputfile", required_argument, NULL, 'i' }, { "posix", no_argument, &posix_conformance, 1 }, + { "quiet", no_argument, NULL, 'q' }, { "verbose", no_argument, &verbose, 1}, { "version", no_argument, NULL, 'V' }, { NULL, 0, NULL, 0 } @@ -149,12 +152,18 @@ main (int argc, char *argv[]) input_file = optarg; break; + case 'q': + be_quiet = 1; + verbose = 0; + break; + case 'u': ucs_csn = optarg; break; - case 'v': + case 'v': verbose = 1; + be_quiet = 0; break; case 'V': @@ -397,6 +406,7 @@ Mandatory arguments to long options are mandatory for short options too.\n\ -h, --help display this help and exit\n\ -f, --charmap=FILE symbolic character names defined in FILE\n\ -i, --inputfile=FILE source definitions are found in FILE\n\ + --quiet Suppress warnings and information messages\n\ -u, --code-set-name=NAME specify code set for mapping ISO 10646 elements\n\ -v, --verbose print more messages\n\ -V, --version output version information and exit\n\ diff --git a/locale/programs/locales.h b/locale/programs/locales.h index 95e166e..eab909e 100644 --- a/locale/programs/locales.h +++ b/locale/programs/locales.h @@ -1,21 +1,21 @@ -/* Copyright (C) 1996 Free Software Foundation, Inc. -This file is part of the GNU C Library. -Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>. - -The GNU C Library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. - -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ +/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #ifndef _LOCALES_H #define _LOCALES_H diff --git a/locale/programs/locfile-kw.gperf b/locale/programs/locfile-kw.gperf index 8af9771..38150ad 100644 --- a/locale/programs/locfile-kw.gperf +++ b/locale/programs/locfile-kw.gperf @@ -1,22 +1,22 @@ %{ -/* Copyright (C) 1996 Free Software Foundation, Inc. -This file is part of the GNU C Library. -Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>. +/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996. -The GNU C Library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #include <string.h> diff --git a/locale/programs/locfile-kw.h b/locale/programs/locfile-kw.h index fd3c834..0fb0b5c 100644 --- a/locale/programs/locfile-kw.h +++ b/locale/programs/locfile-kw.h @@ -1,23 +1,23 @@ /* C code produced by gperf version 2.5 (GNU C++ version) */ /* Command-line: gperf -acCgopt -k1,2,5,$ -N locfile_hash programs/locfile-kw.gperf */ -/* Copyright (C) 1996 Free Software Foundation, Inc. -This file is part of the GNU C Library. -Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>. +/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996. -The GNU C Library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #include <string.h> diff --git a/locale/programs/locfile-token.h b/locale/programs/locfile-token.h index b07356a..6d1543c 100644 --- a/locale/programs/locfile-token.h +++ b/locale/programs/locfile-token.h @@ -1,22 +1,21 @@ - -/* Copyright (C) 1996 Free Software Foundation, Inc. -This file is part of the GNU C Library. -Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>. - -The GNU C Library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. - -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ +/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #ifndef _TOKEN_H #define _TOKEN_H diff --git a/locale/programs/locfile.c b/locale/programs/locfile.c index 4717fe2..4ab0425 100644 --- a/locale/programs/locfile.c +++ b/locale/programs/locfile.c @@ -1,6 +1,6 @@ -/* Copyright (C) 1996 Free Software Foundation, Inc. +/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. This file is part of the GNU C Library. - Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as @@ -981,7 +981,7 @@ write_locale_data (const char *output_path, const char *category, save_err = errno; } - if (fd == -1) + if (fd == -1 && !be_quiet) { error (0, save_err, _("\ cannot open output file `%s' for category `%s'"), @@ -1005,7 +1005,7 @@ cannot open output file `%s' for category `%s'"), if (maxiov > 0) step = MIN (maxiov, step); - if (writev (fd, &vec[cnt], step) < 0) + if (writev (fd, &vec[cnt], step) < 0 && !be_quiet) { error (0, errno, _("failure while writing data for category `%s'"), category); diff --git a/locale/programs/locfile.h b/locale/programs/locfile.h index 003082c..604e726 100644 --- a/locale/programs/locfile.h +++ b/locale/programs/locfile.h @@ -1,6 +1,6 @@ -/* Copyright (C) 1996 Free Software Foundation, Inc. +/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. This file is part of the GNU C Library. - Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as @@ -53,6 +53,8 @@ struct localedef_t size_t len[6]; }; +/* Declared in localedef.c. */ +extern int be_quiet; /* Found in localedef.c. */ void def_to_process (const char *name, int category); diff --git a/locale/programs/simple-hash.h b/locale/programs/simple-hash.h index 3409c57..f26790b 100644 --- a/locale/programs/simple-hash.h +++ b/locale/programs/simple-hash.h @@ -1,19 +1,21 @@ -/* Copyright (C) 1995, 1996 Free Software Foundation, Inc. - -The GNU C Library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. - -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ +/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #ifndef _SIMPLE_HASH_H #define _SIMPLE_HASH_H diff --git a/locale/programs/stringtrans.c b/locale/programs/stringtrans.c index 4351eea..34b107e 100644 --- a/locale/programs/stringtrans.c +++ b/locale/programs/stringtrans.c @@ -1,21 +1,21 @@ -/* Copyright (C) 1996 Free Software Foundation, Inc. -This file is part of the GNU C Library. -Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996. - -The GNU C Library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. - -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ +/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H # include <config.h> diff --git a/locale/programs/stringtrans.h b/locale/programs/stringtrans.h index 3576ce4..2237032 100644 --- a/locale/programs/stringtrans.h +++ b/locale/programs/stringtrans.h @@ -1,21 +1,21 @@ -/* Copyright (C) 1996 Free Software Foundation, Inc. -This file is part of the GNU C Library. -Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>. - -The GNU C Library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. - -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ +/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #ifndef _TRANSLATE_H #define _TRANSLATE_H 1 diff --git a/locale/setlocale.c b/locale/setlocale.c index 0946642..368027f 100644 --- a/locale/setlocale.c +++ b/locale/setlocale.c @@ -1,20 +1,20 @@ -/* Copyright (C) 1991, 1992, 1995, 1996 Free Software Foundation, Inc. -This file is part of the GNU C Library. +/* Copyright (C) 1991, 1992, 1995, 1996, 1997 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 -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #include <alloca.h> #include <argz.h> @@ -35,15 +35,15 @@ Boston, MA 02111-1307, USA. */ Both are weak references; if &_nl_current_CATEGORY is zero, then nothing is using the locale data. */ #define DEFINE_CATEGORY(category, category_name, items, a, b, c, d) \ -extern const struct locale_data *_nl_current_##category; \ -extern const struct locale_data _nl_C_##category; \ +extern struct locale_data *_nl_current_##category; \ +extern struct locale_data _nl_C_##category; \ weak_extern (_nl_current_##category) weak_extern (_nl_C_##category) #include "categories.def" #undef DEFINE_CATEGORY /* Array indexed by category of pointers to _nl_current_CATEGORY slots. Elements are zero for categories whose data is never used. */ -static const struct locale_data * *const _nl_current[] = +static struct locale_data * *const _nl_current[] = { #define DEFINE_CATEGORY(category, category_name, items, a, b, c, d) \ [category] = &_nl_current_##category, @@ -53,7 +53,7 @@ static const struct locale_data * *const _nl_current[] = /* Array indexed by category of pointers to _nl_C_CATEGORY slots. Elements are zero for categories whose data is never used. */ -const struct locale_data *const _nl_C[] = +struct locale_data *const _nl_C[] = { #define DEFINE_CATEGORY(category, category_name, items, a, b, c, d) \ [category] = &_nl_C_##category, @@ -147,7 +147,7 @@ clever_copy (const char *string) /* Construct a new composite name. */ static inline char * -new_composite_name (int category, char *newnames[LC_ALL]) +new_composite_name (int category, const char *newnames[LC_ALL]) { size_t last_len; size_t cumlen = 0; @@ -157,9 +157,9 @@ new_composite_name (int category, char *newnames[LC_ALL]) for (i = 0; i < LC_ALL; ++i) { - char *name = (category == LC_ALL ? newnames[i] : - category == i ? newnames[0] : - (char *) _nl_current_names[i]); + const char *name = (category == LC_ALL ? newnames[i] : + category == i ? newnames[0] : + _nl_current_names[i]); last_len = strlen (name); cumlen += _nl_category_name_sizes[i] + 1 + last_len + 1; if (i > 0 && same && strcmp (name, newnames[0]) != 0) @@ -184,9 +184,9 @@ new_composite_name (int category, char *newnames[LC_ALL]) for (i = 0; i < LC_ALL; ++i) { /* Add "CATEGORY=NAME;" to the string. */ - char *name = (category == LC_ALL ? newnames[i] : - category == i ? newnames[0] : - (char *) _nl_current_names[i]); + const char *name = (category == LC_ALL ? newnames[i] : + category == i ? newnames[0] : + _nl_current_names[i]); p = __stpcpy (p, _nl_category_names[i]); *p++ = '='; p = __stpcpy (p, name); @@ -211,7 +211,7 @@ setname (int category, const char *name) /* Put DATA in *_nl_current[CATEGORY]. */ static inline void -setdata (int category, const struct locale_data *data) +setdata (int category, struct locale_data *data) { if (_nl_current[category] != NULL) { @@ -264,8 +264,8 @@ setlocale (int category, const char *locale) for the individual categories can be selected by using a composite locale name. This is a semi-colon separated list of entries of the form `CATEGORY=VALUE'. */ - char *newnames[LC_ALL]; - const struct locale_data *newdata[LC_ALL]; + const char *newnames[LC_ALL]; + struct locale_data *newdata[LC_ALL]; /* Set all name pointers to the argument name. */ for (category = 0; category < LC_ALL; ++category) @@ -323,6 +323,11 @@ setlocale (int category, const char *locale) if (newdata[category] == NULL) break; + + /* We must not simply free a global locale since we have + no control over the usage. So we mark it as + un-deletable. */ + newdata[category]->usage_count = MAX_USAGE_COUNT; } else { @@ -356,8 +361,8 @@ setlocale (int category, const char *locale) } else { - const struct locale_data *newdata = NULL; - char *newname = (char *) locale; + struct locale_data *newdata = NULL; + const char *newname = locale; /* Protect global data. */ __libc_lock_lock (__libc_setlocale_lock); @@ -366,9 +371,13 @@ setlocale (int category, const char *locale) { /* Only actually load the data if anything will use it. */ newdata = _nl_find_locale (locale_path, locale_path_len, category, - (char **) &newname); + &newname); if (newdata == NULL) goto abort_single; + + /* We must not simply free a global locale since we have no + control over the usage. So we mark it as un-deletable. */ + newdata->usage_count = MAX_USAGE_COUNT; } /* Create new composite name. */ @@ -391,6 +400,6 @@ setlocale (int category, const char *locale) /* Critical section left. */ __libc_lock_unlock (__libc_setlocale_lock); - return newname; + return (char *) newname; } } diff --git a/locale/strlen-hash.h b/locale/strlen-hash.h index dba56df..2daeb03 100644 --- a/locale/strlen-hash.h +++ b/locale/strlen-hash.h @@ -1,21 +1,21 @@ -/* strlen-hash - Implements hashing function for string with known length. -Copyright (C) 1996 Free Software Foundation, Inc. -Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. - -The GNU C Library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. - -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ +/* Implements hashing function for string with known length. + Copyright (C) 1996, 1997 Free Software Foundation, Inc. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #include <sys/types.h> diff --git a/locale/weight.h b/locale/weight.h index 424e493..76e6537 100644 --- a/locale/weight.h +++ b/locale/weight.h @@ -43,21 +43,42 @@ typedef struct weight_t /* The following five macros grant access to the values in the collate locale file that do not depend on byte order. */ -#define collate_nrules \ +#ifndef USE_IN_EXTENDED_LOCALE_MODEL +# define collate_nrules \ (_NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES)) -#define collate_hash_size \ +# define collate_hash_size \ (_NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_HASH_SIZE)) -#define collate_hash_layers \ +# define collate_hash_layers \ (_NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_HASH_LAYERS)) -#define collate_undefined \ +# define collate_undefined \ (_NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_UNDEFINED)) -#define collate_rules \ +# define collate_rules \ ((u_int32_t *) _NL_CURRENT (LC_COLLATE, _NL_COLLATE_RULES)) - static __inline int get_weight (const STRING_TYPE **str, weight_t *result); static __inline int get_weight (const STRING_TYPE **str, weight_t *result) +#else +# define collate_nrules \ + current->values[_NL_ITEM_INDEX (_NL_COLLATE_NRULES)].word +# define collate_hash_size \ + current->values[_NL_ITEM_INDEX (_NL_COLLATE_HASH_SIZE)].word +# define collate_hash_layers \ + current->values[_NL_ITEM_INDEX (_NL_COLLATE_HASH_LAYERS)].word +# define collate_undefined \ + current->values[_NL_ITEM_INDEX (_NL_COLLATE_UNDEFINED)].word +# define collate_rules \ + ((u_int32_t *) current->values[_NL_ITEM_INDEX (_NL_COLLATE_RULES)].string) + +static __inline int get_weight (const STRING_TYPE **str, weight_t *result, + struct locale_data *current, + const u_int32_t *__collate_table, + const u_int32_t *__collate_extra); +static __inline int +get_weight (const STRING_TYPE **str, weight_t *result, + struct locale_data *current, const u_int32_t *__collate_table, + const u_int32_t *__collate_extra) +#endif { unsigned int ch = *((USTRING_TYPE *) (*str))++; size_t slot; @@ -150,7 +171,17 @@ get_weight (const STRING_TYPE **str, weight_t *result) the string at once. The following macro constructs a double linked list of this information. It is a macro because we use `alloca' and we use a double linked list because of the backward collation - order. */ + order. + + We have this strange extra macro since the functions which use the + given locale (not the global one) canot use the global tables. */ +#ifndef USE_IN_EXTENDED_LOCALE_MODEL +# define call_get_weight(strp, newp) get_weight ((strp), (newp)) +#else +# define call_get_weight(strp, newp) \ + get_weight ((strp), (newp), current, collate_table, collate_extra) +#endif + #define get_string(str, forw, backw) \ do \ { \ @@ -169,6 +200,6 @@ get_weight (const STRING_TYPE **str, weight_t *result) newp->next = NULL; \ backw = newp; \ } \ - while (get_weight (&str, newp) == 0); \ + while (call_get_weight (&str, newp) == 0); \ } \ while (0) diff --git a/locale/xlocale.h b/locale/xlocale.h new file mode 100644 index 0000000..62b1595 --- /dev/null +++ b/locale/xlocale.h @@ -0,0 +1,38 @@ +/* Definition of locale datatype. + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _XLOCALE_H +#define _XLOCALE_H 1 + +/* Structure for reentrant locale using functions. This is an + (almost) opaque type for the user level programs. The file and + this data structure is not standardized. Don't rely on it. It can + go away without warning. */ +typedef struct __locale_t +{ + struct locale_data *__locales[6]; /* XXX LC_ALL should be used here */ + + /* To increase the speed of this solution we add some special members. */ + const unsigned short int *__ctype_b; + const int *__ctype_tolower; + const int *__ctype_toupper; +} *__locale_t; + +#endif /* xlocale.h */ |