From c84142e8fe3cbcce43ae35ac957a74ac8216d11d Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Sat, 15 Feb 1997 04:31:36 +0000 Subject: Update to 2.1.x development version 1997-02-15 02:41 Miles Bader * argp/argp-help.c: Gettextize sources. * argp/argp-parse.c: Likewise. 1997-02-13 22:32 Ulrich Drepper * features.h (__GLIBC_MINOR__): Bump to 1. * xlocale.h: New file. Wrapper around locale/xlocale.h. * Makefile (distribute): Add xlocale.h. * locale/Makefile (routines): Add ctype_l. * locale/ctype-extn.c: Update copyright. De-ANSI-declfy. Add __isblank_l, __toascii_l and __isascii_l. * ctype/ctype.h: Add definitions and declarations for *_l functions. * locale/Makefile (headers): Add xlocale.h. (routines): Add newlocale, duplocale, and freelocale. * locale/localeinfo.h (MAX_USAGE_COUNT): New macro. (struct locale_data): Add new fields mmaped and usage_count. Correct various declarations. * locale/C-collate.c: Define value for new fields mmaped and usage_count. * locale/C-ctype.c: Likewise. * locale/C-messages.c: Likewise. * locale/C-monetary.c: Likewise. * locale/C-numeric.c: Likewise. * locale/C-time.c: Likewise. * locale/loadlocale.c (_nl_load_locale): Initialize mmaped and usage_count fields. * locale/locale.h: Don't define locale_t here (moved to xlocale.h). Correct prototypes for __newlocale and __freelocale. Add prototype for __duplocale. * locale/findlocale.c (copy): Remove function. Use __strdup instead. (_nl_remove_locale): New function. * locale/nl_langinfo.c: Don't declare locale_data objects as const. * locale/setlocale.c: Likewise. * locale/weight.h: Change for use with locale objects. * locale/xlocale.h: New file. Define __locale_t type. * locale/newlocale.c: New file. Create new locale object. * locale/freelocale.c: New file. Destroy locale object. * locale/duplocale.c: New file. Create copy of locale object. * stdlib/Makefile (routines): Add strfmon_l. * stdlib/monetary.h [__USE_GNU]: Declare __strfmon_l. * stdlib/strfmon.c: Add support for use in extended locale model. * stdlib/strfmon_l.c: New file. * string/Makefile (routines): Add strcoll_l and strxfrm_l. * string/strcoll.c: Change for use in extended locale model. * string/strxfrm.c: Likewise. * string/strcoll_l.c: New file. Implement __strcoll_l function. * string/strxfrm_l.c: New file. Implement __strxfrm_l function. * wcsmbs/Makefile (routines): Add wcscoll_l and wcsxfrm_l. * wcsmbs/wchar.h [__USE_GNU]: Declare wcscoll_l and wcsxfrm_l. * wcsmbs/wcscoll.c: Change for use in extended locale model. * wcsmbs/wcscoll_l.c: New file. Implement __wcscoll_l function. * wcsmbs/wcsxfrm_l.c: New file. Implement __wcsxfrm_l function. * wctype/Makefile (routines): Add wcextra, wcfuncs_l, iswctype_l, and towctrans_l. * wctype/cname-lookup.h: Prepare for use in extended locale model. * wctype/iswctype_l.c: New file. Implement character classification functions for use with locale objects. * wctype/wctype.h: Declare functions for use with locale objects. * wctype/towctrans_l.c: New file. Implement __towctrans_l function for use with locale objects. * wctype/wcfuncs_l.c: New file. Implement wide character classification functions for use with locale objects. * wctype/wcextra.c: New file. Implement real functions for non-standard classification functions. * elf/ldd.bash.in: Don't use --data-relocs and --function-relocs parameters to ld.so. Use environment variables. * elf/ldd.sh.in: Likewise. * elf/rtld.c: Remove handling of --data-relocs and --function-relocs options. Instead read environment variables. * elf/link.h (receiver_fct): Add new argument to take error code. * elf/dl-error.c (_dl_signal_error): Call receiver function with another argument. * elf/dl-object.c (_dl_new_object): Create new object with list of names in l_libname member. * elf/dl-load.c (_dl_map_object_from_fd): Add name which was used to find to object to the list in the link_map variable. (_dl_map_object): Use _dl_does_name_match_p to compare with all available names of the object. Optimize handling of LD_LIBRARY_PATH a bit. * elf/rtld.c: Initialize l_libname member of _dl_rtld_map. * elf/dl-lookup.c (_dl_elf_hash): Optimize function. * elf/Makefile (routines): Add dl-version. * elf/link.h (hash_name_pair): New type. Group pointer to string and its hash value. (struct link_map): Change l_libname member to be a list of names, not a single pointer to a name. Add new members l_nversions and l_versions. (_dl_does_name_match_p): New function to test for all names of an object. Add prototypes for new lookup and versioning functions. * elf/dl-lookup.c (do_lookup): Add new argument and handle case when versioned symbol is requested. (_dl_lookup_symbol): Call do_lookup with another argument. (_dl_lookup_symbol_skip): Likewise. (_dl_lookup_versioned_symbol): New function. Handle lookup of versioned symbol. (_dl_lookup_versioned_symbol_skip): Likewise, similar to _dl_lookup_symbol_skip. * elf/dl-reloc.c (RESOLVE): Call _dl_lookup_versioned_symbol or _dl_lookup_symbol depending on availability of version information. * elf/dl-runtime.c (RESOLVE): Likewise. (fixup): Call elf_machine_relplt with additional argument to point to versioning information if available. * elf/do-rel.h (elf_dynamic_do_rel): Likewise. * elf/dl-open.c (_dl_open): Call _dl_check_map_versions to check for correct versions. * elf/dl-version.c: New file. Check library versions and extract version information for easier access. * elf/dlfcn.h [__USE_GNU]: Add prototype for dlvsym. * elf/dlvsym.c: New file. Implementation of function similar to dlsym, but looks for versioned symbol. * elf/elf.h: Add types and macros for versioning. * elf/rtld.c (dl_main): Check availability of needed versions. * sysdeps/alpha/dl-machine.h (elf_machine_rela): Add additional argument for version information. Call RESOLVE with additional argument. * sysdeps/i386/dl-machine.h: Likewise. * sysdeps/m68k/dl-machine.h: Likewise. * sysdeps/mips/dl-machine.h: Likewise. * elf/dlerror.c: Change comment to align with guidelines. * elf/dlopen.c: Likewise. * elf/dlsym.c: Likewise. * locale/programs/localedef.c: Implement --quiet option. * locale/programs/charset.h: Declare be_quiet variable. * locale/programs/locfile.h: Likewise. * locale/programs/charmap.c: Don't print warnings if quiet option was given. * locale/programs/ld-collate.c: Likewise. * locale/programs/ld-ctype.c: Likewise. * locale/programs/ld-messages.c: Likewise. * locale/programs/ld-monetary.c: Likewise. * locale/programs/ld-numeric.c: Likewise. * locale/programs/ld-time.c: Likewise. * locale/programs/locfile.c: Likewise. * Makefile (subdirs): Add argp. * catgets/catgets.c (catopen): Little code improvement. * posix/execl.c: Remove restriction to 1024 arguments. * posix/execle.c: Likewise. * posix/execlp.c: Likewise. * posix/getopt.c [_LIBC]: Define global objects with __ prefix and make regular names weak aliases. * posix/getopt1.c: Likewise. * posix/getopt.h [_LIBC]: Provide prototypes and declarations for __ protected forms. * posix/unistd.h: Add prototype for __sleep. * sysdeps/mach/sleep.c: Make sleep weak alias of __sleep. * sysdeps/posix/sleep.c: Likewise. * sysdeps/stub/sleep.c: Likewise. * sysdeps/unix/sysv/linux/sleep.c: Likewise. * ctype/ctype-info.c: Update copyright. * ctype/ctype.c: Likewise. * ctype/test_ctype.c: Likewise. * dirent/alphasort.c: Likewise. * dirent/list.c: Likewise. * gmon/bb_exit_func.c: Likewise. * grp/fgetgrent.c: Likewise. * grp/getgrent.c: Likewise. * grp/getgrent_r.c: Likewise. * grp/getgrgid.c: Likewise. * grp/getgrgid_r.c: Likewise. * grp/getgrnam.c: Likewise. * grp/getgrnam_r.c: Likewise. * hurd/alloc-fd.c: Likewise. * hurd/catch-exc.c: Likewise. * hurd/ctty-input.c: Likewise. * hurd/ctty-output.c: Likewise. * hurd/dtable.c: Likewise. * hurd/fchroot.c: Likewise. * hurd/fd-close.c: Likewise. * hurd/fd-read.c: Likewise. * hurd/fd-write.c: Likewise. * hurd/fopenport.c: Likewise. * hurd/get-host.c: Likewise. * hurd/getdport.c: Likewise. * hurd/getuids.c: Likewise. * hurd/getumask.c: Likewise. * hurd/hurd-raise.c: Likewise. * hurd/hurd.h: Likewise. * hurd/hurdauth.c: Likewise. * hurd/hurdexec.c: Likewise. * hurd/hurdhost.h: Likewise. * hurd/hurdid.c: Likewise. * hurd/hurdinit.c: Likewise. * hurd/hurdioctl.c: Likewise. * hurd/hurdkill.c: Likewise. * hurd/hurdlookup.c: Likewise. * hurd/hurdmsg.c: Likewise. * hurd/hurdpid.c: Likewise. * hurd/hurdports.c: Likewise. * hurd/hurdprio.c: Likewise. * hurd/hurdrlimit.c: Likewise. * hurd/hurdsock.c: Likewise. * hurd/hurdstartup.c: Likewise. * hurd/hurdstartup.h: Likewise. * hurd/intern-fd.c: Likewise. * hurd/intr-msg.c: Likewise. * hurd/intr-rpc.defs: Likewise. * hurd/intr-rpc.h: Likewise. * hurd/msgportdemux.c: Likewise. * hurd/new-fd.c: Likewise. * hurd/openport.c: Likewise. * hurd/pid2task.c: Likewise. * hurd/port-cleanup.c: Likewise. * hurd/port2fd.c: Likewise. * hurd/ports-get.c: Likewise. * hurd/ports-set.c: Likewise. * hurd/privports.c: Likewise. * hurd/report-wait.c: Likewise. * hurd/set-host.c: Likewise. * hurd/setauth.c: Likewise. * hurd/setuids.c: Likewise. * hurd/siginfo.c: Likewise. * hurd/sigunwind.c: Likewise. * hurd/task2pid.c: Likewise. * hurd/thread-cancel.c: Likewise. * hurd/thread-self.c: Likewise. * hurd/vpprintf.c: Likewise. * hurd/hurd/fd.h: Likewise. * hurd/hurd/id.h: Likewise. * hurd/hurd/ioctl.h: Likewise. * hurd/hurd/lookup.h: Likewise. * hurd/hurd/port.h: Likewise. * hurd/hurd/resource.h: Likewise. * hurd/hurd/threadvar.h: Likewise. * hurd/hurd/userlink.h: Likewise. * inet/ether_aton.c: Likewise. * inet/ether_aton_r.c: Likewise. * inet/ether_ntoa.c: Likewise. * inet/ether_ntoa_r.c: Likewise. * inet/gethstbyad.c: Likewise. * inet/gethstbyad_r.c: Likewise. * inet/gethstent.c: Likewise. * inet/getnetbyad.c: Likewise. * inet/getnetbyad_r.c: Likewise. * inet/getnetbynm.c: Likewise. * inet/getnetbynm_r.c: Likewise. * inet/getnetent.c: Likewise. * inet/getnetent_r.c: Likewise. * inet/getproto.c: Likewise. * inet/getproto_r.c: Likewise. * inet/getprtent.c: Likewise. * inet/getprtent_r.c: Likewise. * inet/getprtname.c: Likewise. * inet/getrpcbyname.c: Likewise. * inet/getrpcbyname_r.c: Likewise. * inet/getrpcbynumber.c: Likewise. * inet/getrpcbynumber_r.c: Likewise. * inet/getrpcent.c: Likewise. * inet/getrpcent_r.c: Likewise. * inet/getservent.c: Likewise. * inet/getservent_r.c: Likewise. * inet/getsrvbynm.c: Likewise. * inet/getsrvbynm_r.c: Likewise. * inet/getsrvbypt.c: Likewise. * inet/getsrvbypt_r.c: Likewise. * inet/herrno.c: Likewise. * inet/netgroup.h: Likewise. * ient/netinet/ether.h: Likewise. * intl/bindtextdom.c: Likewise. * intl/dcgettext.c: Likewise. * intl/dgettext.c: Likewise. * intl/gettext.c: Likewise. * intl/gettext.h: Likewise. * intl/gettextP.h: Likewise. * intl/hash-string.h: Likewise. * intl/loadmsgcat.c: Likewise. * intl/localealias.c: Likewise. * intl/textdomain.c: Likewise. * io/creat.c: Likewise. * io/getdirname.c: Likewise. * io/lockf.c: Likewise. * io/pwd.c: Likewise. * io/test-utime.c: Likewise. * locale/categories.def: Likewise. * locale/codeset_name.c: Likewise. * locale/lc-collate.c: Likewise. * locale/lc-ctype.c: Likewise. * locale/lc-messages.c: Likewise. * locale/lc-monetary.c: Likewise. * locale/lc-numeric.c: Likewise. * locale/lc-time.c: Likewise. * locale/loadlocale.c: Likewise. * locale/localeconv.c: Likewise. * locale/nl_langinfo.c: Likewise. * locale/setlocale.c: Likewise. * locale/strlen-hash.h: Likewise. * locale/programs/charmap-kw.gperf: Likewise. * locale/programs/charmap-kw.h: Likewise. * locale/programs/charset.c: Likewise. * locale/programs/ld-ctype.c: Likewise. * locale/programs/ld-messages.c: Likewise. * locale/programs/ld-monetary.c: Likewise. * locale/programs/linereader.h: Likewise. * locale/programs/locale-spec.c: Likewise. * locale/programs/locales.h: Likewise. * locale/programs/locfile-kw.gperf: Likewise. * locale/programs/locfile-kw.h: Likewise. * locale/programs/locfile-token.h: Likewise. * locale/programs/simple-hash.h: Likewise. * locale/programs/stringtrans.c: Likewise. * locale/programs/stringtrans.h: Likewise. * login/logout.c: Likewise. * mach/bootprivport.c: Likewise. * mach/devstream.c: Likewise. * mach/hello.c: Likewise. * mach/mach.h: Likewise. * mach/mach_init.c: Likewise. * mach/mach_init.h: Likewise. * mach/mig-alloc.c: Likewise. * mach/mig-dealloc.c: Likewise. * mach/mutex-init.c: Likewise. * mach/mutex-solid.c: Likewise. * mach/setup-thread.c: Likewise. * mach/spin-lock.h: Likewise. * mach/spin-solid.c: Likewise. * mach/mach/mig_support.h: Likewise. * md5-crypt/md5-crypt.c: Likewise. * misc/nlist.h: Likewise. * nss/nss_files/files-ether.c: Likewise. * posix/confstr.c: Likewise. * posix/execl.c: Likewise. * posix/execle.c: Likewise. * posix/execlp.c: Likewise. * posix/execv.c: Likewise. * posix/execvp.c: Likewise. * posix/fnmatch.c: Likewise. * posix/getopt.c: Likewise. * posix/getopt.h: Likewise. * posix/getopt1.c: Likewise. * posix/id.c: Likewise. * posix/regex.c: Likewise. * posix/setpgrp.c: Likewise. * posix/unistd.h: Likewise. * posix/wordexp.c: Likewise. * pwd/fgetpwent.c: Likewise. * pwd/getpwent.c: Likewise. * pwd/getpwent_r.c: Likewise. * pwd/getpwnam.c: Likewise. * pwd/getpwnam_r.c: Likewise. * pwd/getpwuid.c: Likewise. * pwd/getpwuid_r.c: Likewise. * pwd/putpwent.c: Likewise. * resolv/gethnamaddr.c: Likewise. * resolv/res_hconf.c: Likewise. * resolv/res_hconf.h: Likewise. * setjmp/longjmp.c: Likewise. * setjmp/sigjmp.c: Likewise. * setjmp/tst-setjmp.c: Likewise. * stdio/clearerr.c: Likewise. * stdio/ferror.c: Likewise. * stdio/fgetc.c: Likewise. * stdio/fgetpos.c: Likewise. * stdio/fgets.c: Likewise. * stdio/fileno.c: Likewise. * stdio/fmemopen.c: Likewise. * stdio/fopen.c: Likewise. * stdio/fopncook.c: Likewise. * stdio/fputc.c: Likewise. * stdio/fputs.c: Likewise. * stdio/fread.c: Likewise. * stdio/freopen.c: Likewise. * stdio/fseek.c: Likewise. * stdio/fsetpos.c: Likewise. * stdio/ftell.c: Likewise. * stdio/fwrite.c: Likewise. * stdio/getchar.c: Likewise. * stdio/getdelim.c: Likewise. * stdio/gets.c: Likewise. * stdio/glue.c: Likewise. * stdio/internals.c: Likewise. * stdio/linewrap.c: Likewise. * stdio/linewrap.h: Likewise. * stdio/memstream.c: Likewise. * stdio/newstream.c: Likewise. * stdio/putchar.c: Likewise. * stdio/puts.c: Likewise. * stdio/rewind.c: Likewise. * stdio/setbuf.c: Likewise. * stdio/setbuffer.c: Likewise. * stdio/setlinebuf.c: Likewise. * stdio/setvbuf.c: Likewise. * stdio/ungetc.c: Likewise. * stdio/vasprintf.c: Likewise. * stdio/vscanf.c: Likewise. * stdio/vsnprintf.c: Likewise. * stdio/vsprintf.c: Likewise. * stdio/vsscanf.c: Likewise. * stdio-common/asprintf.c: Likewise. * stdio-common/dprintf.c: Likewise. * stdio-common/errnobug.c: Likewise. * stdio-common/fprintf.c: Likewise. * stdio-common/getline.c: Likewise. * stdio-common/getw.c: Likewise. * stdio-common/perror.c: Likewise. * stdio-common/psignal.c: Likewise. * stdio-common/putw.c: Likewise. * stdio-common/reg-printf.c: Likewise. * stdio-common/scanf.c: Likewise. * stdio-common/snprintf.c: Likewise. * stdio-common/sprintf.c: Likewise. * stdio-common/tempnam.c: Likewise. * stdio-common/test_rdwr.c: Likewise. * stdio-common/tst-fileno.c: Likewise. * stdio-common/tst-printf.c: Likewise. * stdio-common/tstgetln.c: Likewise. * stdio-common/vprintf.c: Likewise. * stdlib/drand48.c: Likewise. * stdlib/drand48_r.c: Likewise. * stdlib/erand48.c: Likewise. * stdlib/erand48_r.c: Likewise. * stdlib/exit.h: Likewise. * stdlib/strtoq.c: Likewise. * stdlib/strtoul.c: Likewise. * stdlib/strtouq.c: Likewise. * stdlib/test-canon.c: Likewise. * stdlib/testdiv.c: Likewise. * stdlib/testrand.c: Likewise. * string/argz-append.c: Likewise. * string/argz-count.c: Likewise. * string/argz-create.c: Likewise. * string/argz-ctsep.c: Likewise. * string/argz-delete.c: Likewise. * string/argz-extract.c: Likewise. * string/argz-insert.c: Likewise. * string/argz-next.c: Likewise. * string/argz-stringify.c: Likewise. * string/basename.c: Likewise. * string/envz.c: Likewise. * string/memfrob.c: Likewise. * string/strcoll.c: Likewise. * string/strdup.c: Likewise. * string/string.h: Likewise. * string/strndup.c: Likewise. * string/strnlen.c: Likewise. * string/strsignal.c: Likewise. * string/strxfrm.c: Likewise. * string/test-ffs.c: Likewise. * string/testcopy.c: Likewise. * sysdeps/generic/enbl-secure.c: Likewise. * sysdeps/generic/memcopy.h: Likewise. * sysdeps/generic/stpncpy.c: Likewise. * sysdeps/generic/strcasecmp.c: Likewise. * sysdeps/generic/strcat.c: Likewise. * sysdeps/generic/strchr.c: Likewise. * sysdeps/generic/strcpy.c: Likewise. * sysdeps/generic/strcspn.c: Likewise. * sysdeps/generic/strlen.c: Likewise. * sysdeps/generic/strncase.c: Likewise. * sysdeps/generic/strncat.c: Likewise. * sysdeps/generic/strncpy.c: Likewise. * sysdeps/generic/strpbrk.c: Likewise. * sysdeps/generic/strsep.c: Likewise. * sysdeps/generic/strspn.c: Likewise. * sysdeps/generic/strstr.c: Likewise. * sysdeps/generic/strtok.c: Likewise. * sysdeps/generic/strtok_r.c: Likewise. * sysdeps/mach/sleep.c: Likewise. * sysdeps/posix/sleep.c: Likewise. * sysdeps/stub/sleep.c: Likewise. * time/date.c: Likewise. * time/test_time.c: Likewise. * wcsmbs/wmemcpy.c: Likewise. * wctye/test_wctype.c: Likewise. * wctye/towctrans.c: Likewise. * wctye/wcfuncs.c: Likewise. * wctye/wctrans.c: Likewise. 1997-02-13 22:15 Miles Bader * argp/Makefile: New file. * argp/argp.h: Likewise. * argp/argp-ba.c: Likewise. * argp/argp-fmtstream.c: Likewise. * argp/argp-fmtstream.h: Likewise. * argp/argp-fs-xinl.c: Likewise. * argp/argp-help.c: Likewise. * argp/argp-namefrob.h: Likewise. * argp/argp-parse.c: Likewise. * argp/argp-pv.c: Likewise. * argp/argp-pvh.c: Likewise. * argp/argp-test.c: Likewise. * argp/argp-xinl.c: Likewise. * libio/_G_config.h: Make sure wint_t is also defined for old gcc 1997-02-09 04:35 Ulrich Drepper * stdio-common/_itoa.h: Update copyright. --- locale/C-collate.c | 5 +- locale/C-ctype.c | 7 +- locale/C-messages.c | 33 +++---- locale/C-monetary.c | 5 +- locale/C-numeric.c | 5 +- locale/C-time.c | 3 +- locale/Makefile | 7 +- locale/categories.def | 32 +++---- locale/codeset_name.c | 30 +++--- locale/duplocale.c | 55 +++++++++++ locale/findlocale.c | 76 ++++++++++++---- locale/freelocale.c | 50 ++++++++++ locale/lc-collate.c | 34 +++---- locale/lc-ctype.c | 34 +++---- locale/lc-messages.c | 28 +++--- locale/lc-monetary.c | 28 +++--- locale/lc-numeric.c | 28 +++--- locale/lc-time.c | 34 +++---- locale/loadlocale.c | 34 ++++--- locale/locale.h | 19 ++-- locale/localeconv.c | 34 +++---- locale/localeinfo.h | 29 ++++-- locale/newlocale.c | 192 +++++++++++++++++++++++++++++++++++++++ locale/nl_langinfo.c | 32 +++---- locale/programs/charmap-kw.gperf | 30 +++--- locale/programs/charmap-kw.h | 38 ++++---- locale/programs/charmap.c | 6 +- locale/programs/charset.c | 36 ++++---- locale/programs/charset.h | 7 +- locale/programs/ld-collate.c | 13 ++- locale/programs/ld-ctype.c | 107 ++++++++++++---------- locale/programs/ld-messages.c | 38 ++++---- locale/programs/ld-monetary.c | 45 ++++----- locale/programs/ld-numeric.c | 10 +- locale/programs/ld-time.c | 60 ++++++------ locale/programs/linereader.h | 36 ++++---- locale/programs/locale-spec.c | 36 ++++---- locale/programs/localedef.c | 12 ++- locale/programs/locales.h | 36 ++++---- locale/programs/locfile-kw.gperf | 30 +++--- locale/programs/locfile-kw.h | 30 +++--- locale/programs/locfile-token.h | 37 ++++---- locale/programs/locfile.c | 8 +- locale/programs/locfile.h | 6 +- locale/programs/simple-hash.h | 34 +++---- locale/programs/stringtrans.c | 36 ++++---- locale/programs/stringtrans.h | 36 ++++---- locale/setlocale.c | 73 ++++++++------- locale/strlen-hash.h | 36 ++++---- locale/weight.h | 47 ++++++++-- locale/xlocale.h | 38 ++++++++ 51 files changed, 1110 insertions(+), 645 deletions(-) create mode 100644 locale/duplocale.c create mode 100644 locale/freelocale.c create mode 100644 locale/newlocale.c create mode 100644 locale/xlocale.h (limited to 'locale') diff --git a/locale/C-collate.c b/locale/C-collate.c index 5388237045..5c049e1f59 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 , 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 d45c32c34b..6a1c3fc7be 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 , 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 566fedce91..70eeb8cc80 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 , 1995. +/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 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 bc10f00095..8dd361a2e0 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 , 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 d3fbd91917..a456214213 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 , 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 a71ea93517..70ee89a192 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 b5eccf35c1..dcf469f689 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 664fc901c4..b04ca20cc2 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 c7fd818e70..3b327b7157 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 , 1996. + Copyright (C) 1996, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 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 #include diff --git a/locale/duplocale.c b/locale/duplocale.c new file mode 100644 index 0000000000..494c2ec829 --- /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 , 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 +#include +#include + +#include + + +/* 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 d73ba4a395..308aa2b60f 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 , 1996. @@ -20,23 +20,13 @@ #include #include #include +#include #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 0000000000..26860aa15a --- /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 , 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 +#include +#include + +#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 aefdaa8b0e..7052db3062 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 diff --git a/locale/lc-ctype.c b/locale/lc-ctype.c index 2eeedf8466..d2139aeb31 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 diff --git a/locale/lc-messages.c b/locale/lc-messages.c index b7e9bbfd3a..e78f9bf235 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 f29f29a4b6..b041006259 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 19e9d966bc..41845589b8 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 f4fe561cb9..7bed6aea13 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 #include diff --git a/locale/loadlocale.c b/locale/loadlocale.c index 474a73cf6e..544c09ad88 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 , 1996. + Copyright (C) 1996, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 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 #include @@ -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 37f5434de1..c16d83bb7b 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 /* 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 d846210b7b..06f12dbfaf 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 #include "localeinfo.h" diff --git a/locale/localeinfo.h b/locale/localeinfo.h index 018220f6df..c029f63480 100644 --- a/locale/localeinfo.h +++ b/locale/localeinfo.h @@ -22,6 +22,7 @@ #include #include +#include #include #include @@ -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 0000000000..d4e184b921 --- /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 , 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 +#include +#include +#include + +#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 1c42e14a4a..df2b3e9fb9 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 #include @@ -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 8e00103882..1fb9c38b04 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, . +/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper, . -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 diff --git a/locale/programs/charmap-kw.h b/locale/programs/charmap-kw.h index 93326d0382..3bfcd14612 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, . +/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper, . -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 @@ -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 6b4ebb4a60..37b6cdef96 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: must be greater than \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 a7f988d3a5..00233abf8f 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, . - -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 , 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 diff --git a/locale/programs/charset.h b/locale/programs/charset.h index eccce9102f..82c4ef0c57 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, . + Contributed by Ulrich Drepper , 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 d4b0f2b903..3a8c17a303 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 fb352e53ed..5f1bc48f89 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, . +/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 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 @@ -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 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 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, _(" 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, _(" 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"), ""); @@ -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"), ""); @@ -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"), ""); @@ -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"), ""); @@ -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"), ""); @@ -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"), ""); @@ -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"), ""); @@ -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"), ""); @@ -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"), ""); @@ -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 ede616768d..31edb47a60 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, . +/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 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 @@ -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 5efa969baa..ce83b18dba 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, . +/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 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 @@ -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 69ea7e0b3e..375635aafc 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, . + Contributed by Ulrich Drepper , 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 cc571b8a04..b977763433 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 bf5f1bccc9..6f81b81597 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, . - -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, . + + 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 c595524bbb..9c432e3ead 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 , 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 , 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 diff --git a/locale/programs/localedef.c b/locale/programs/localedef.c index 580816b37e..da01d4c974 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 95e166e3ef..eab909e7c8 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, . - -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 , 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 8af977116e..38150ad46b 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, . +/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 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 diff --git a/locale/programs/locfile-kw.h b/locale/programs/locfile-kw.h index fd3c834845..0fb0b5ca5f 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, . +/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 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 diff --git a/locale/programs/locfile-token.h b/locale/programs/locfile-token.h index b07356aebd..6d1543c320 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, . - -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 , 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 4717fe22bd..4ab04253b9 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, . + Contributed by Ulrich Drepper , 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 003082ca61..604e726e20 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, . + Contributed by Ulrich Drepper , 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 3409c57cec..f26790b21b 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 , 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 4351eea397..34b107e295 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 , 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 , 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 diff --git a/locale/programs/stringtrans.h b/locale/programs/stringtrans.h index 3576ce445c..2237032f89 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, . - -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 , 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 094664216e..368027f743 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 #include @@ -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 dba56dff21..2daeb03547 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 , 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 , 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 diff --git a/locale/weight.h b/locale/weight.h index 424e493209..76e6537762 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 0000000000..62b15953a6 --- /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 , 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 */ -- cgit v1.2.3