summary refs log tree commit diff
path: root/locale
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1997-02-15 04:31:36 +0000
committerUlrich Drepper <drepper@redhat.com>1997-02-15 04:31:36 +0000
commitc84142e8fe3cbcce43ae35ac957a74ac8216d11d (patch)
treeda310b5d0928e6dab9d1195606a4b56376ae747c /locale
parent7434ccadbb6897d366d2377f84efe1e2cd61b02b (diff)
downloadglibc-c84142e8fe3cbcce43ae35ac957a74ac8216d11d.tar.gz
glibc-c84142e8fe3cbcce43ae35ac957a74ac8216d11d.tar.xz
glibc-c84142e8fe3cbcce43ae35ac957a74ac8216d11d.zip
1997-02-15 02:41  Miles Bader  <miles@gnu.ai.mit.edu>

	* argp/argp-help.c: Gettextize sources.
	* argp/argp-parse.c: Likewise.

1997-02-13 22:32  Ulrich Drepper  <drepper@cygnus.com>

	* 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  <miles@gnu.ai.mit.edu>

	* 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  <drepper@cygnus.com>

	* stdio-common/_itoa.h: Update copyright.
Diffstat (limited to 'locale')
-rw-r--r--locale/C-collate.c5
-rw-r--r--locale/C-ctype.c7
-rw-r--r--locale/C-messages.c33
-rw-r--r--locale/C-monetary.c5
-rw-r--r--locale/C-numeric.c5
-rw-r--r--locale/C-time.c3
-rw-r--r--locale/Makefile7
-rw-r--r--locale/categories.def32
-rw-r--r--locale/codeset_name.c30
-rw-r--r--locale/duplocale.c55
-rw-r--r--locale/findlocale.c76
-rw-r--r--locale/freelocale.c50
-rw-r--r--locale/lc-collate.c34
-rw-r--r--locale/lc-ctype.c34
-rw-r--r--locale/lc-messages.c28
-rw-r--r--locale/lc-monetary.c28
-rw-r--r--locale/lc-numeric.c28
-rw-r--r--locale/lc-time.c34
-rw-r--r--locale/loadlocale.c34
-rw-r--r--locale/locale.h19
-rw-r--r--locale/localeconv.c34
-rw-r--r--locale/localeinfo.h29
-rw-r--r--locale/newlocale.c192
-rw-r--r--locale/nl_langinfo.c32
-rw-r--r--locale/programs/charmap-kw.gperf30
-rw-r--r--locale/programs/charmap-kw.h38
-rw-r--r--locale/programs/charmap.c6
-rw-r--r--locale/programs/charset.c36
-rw-r--r--locale/programs/charset.h7
-rw-r--r--locale/programs/ld-collate.c13
-rw-r--r--locale/programs/ld-ctype.c107
-rw-r--r--locale/programs/ld-messages.c38
-rw-r--r--locale/programs/ld-monetary.c45
-rw-r--r--locale/programs/ld-numeric.c10
-rw-r--r--locale/programs/ld-time.c60
-rw-r--r--locale/programs/linereader.h36
-rw-r--r--locale/programs/locale-spec.c36
-rw-r--r--locale/programs/localedef.c12
-rw-r--r--locale/programs/locales.h36
-rw-r--r--locale/programs/locfile-kw.gperf30
-rw-r--r--locale/programs/locfile-kw.h30
-rw-r--r--locale/programs/locfile-token.h37
-rw-r--r--locale/programs/locfile.c8
-rw-r--r--locale/programs/locfile.h6
-rw-r--r--locale/programs/simple-hash.h34
-rw-r--r--locale/programs/stringtrans.c36
-rw-r--r--locale/programs/stringtrans.h36
-rw-r--r--locale/setlocale.c73
-rw-r--r--locale/strlen-hash.h36
-rw-r--r--locale/weight.h47
-rw-r--r--locale/xlocale.h38
51 files changed, 1110 insertions, 645 deletions
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 <drepper@gnu.ai.mit.edu>, 1995.
 
@@ -146,7 +146,8 @@ const u_int32_t _nl_C_LC_COLLATE_symbol_classes[256] =
 const struct locale_data _nl_C_LC_COLLATE =
 {
   _nl_C_name,
-  NULL, 0, /* no file mapped */
+  NULL, 0, 0, /* no file mapped */
+  MAX_USAGE_COUNT,
   21,
   {
     { word: 0 },
diff --git a/locale/C-ctype.c b/locale/C-ctype.c
index 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 <drepper@gnu.ai.mit.edu>, 1995.
 
@@ -341,7 +341,8 @@ const char _nl_C_LC_CTYPE_width[256] =
 const struct locale_data _nl_C_LC_CTYPE =
 {
   _nl_C_name,
-  NULL, 0, /* no file mapped */
+  NULL, 0, 0, /* no file mapped */
+  MAX_USAGE_COUNT,
   15,
   {
     { string: _nl_C_LC_CTYPE_class },
@@ -367,6 +368,6 @@ const struct locale_data _nl_C_LC_CTYPE =
     { string: "tolower\0" "toupper\0" },
     { string: _nl_C_LC_CTYPE_width },
     { word: 2 },
-    { string: "ISO_646.IRV:1983" }
+    { string: "ISO_646.IRV" }
   }
 };
diff --git a/locale/C-messages.c b/locale/C-messages.c
index 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 <drepper@gnu.ai.mit.edu>, 1995.
+/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
 
-The GNU C Library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
 
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-Library General Public License for more details.
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
 
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
 
 #include "localeinfo.h"
 
@@ -27,7 +27,8 @@ Boston, MA 02111-1307, USA.  */
 const struct locale_data _nl_C_LC_MESSAGES =
 {
   _nl_C_name,
-  NULL, 0, /* no file mapped */
+  NULL, 0, 0, /* no file mapped */
+  MAX_USAGE_COUNT,
   4,
   {
     { string: "^[yY]" },
diff --git a/locale/C-monetary.c b/locale/C-monetary.c
index 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 <drepper@gnu.ai.mit.edu>, 1995.
 
@@ -30,7 +30,8 @@ static const char not_available[] = "\177";
 const struct locale_data _nl_C_LC_MONETARY =
 {
   _nl_C_name,
-  NULL, 0, /* no file mapped */
+  NULL, 0, 0, /* no file mapped */
+  MAX_USAGE_COUNT,
   15,
   {
     { string: "" },
diff --git a/locale/C-numeric.c b/locale/C-numeric.c
index 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 <drepper@gnu.ai.mit.edu>, 1995.
 
@@ -30,7 +30,8 @@ static const char not_available[] = "\177";
 const struct locale_data _nl_C_LC_NUMERIC =
 {
   _nl_C_name,
-  NULL, 0, /* no file mapped */
+  NULL, 0, 0, /* no file mapped */
+  MAX_USAGE_COUNT,
   3,
   {
     { string: "." },
diff --git a/locale/C-time.c b/locale/C-time.c
index 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 <drepper@cygnus.com>, 1996.
+   Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
 
-The GNU C Library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
 
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-Library General Public License for more details.
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
 
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
 
 #include <langinfo.h>
 #include <locale.h>
diff --git a/locale/duplocale.c b/locale/duplocale.c
new file mode 100644
index 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 <drepper@cygnus.com>, 1997.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <locale.h>
+#include <libc-lock.h>
+#include <stdlib.h>
+
+#include <localeinfo.h>
+
+
+/* Lock for protecting global data.  */
+__libc_lock_define (extern , __libc_setlocale_lock)
+
+
+__locale_t
+__duplocale (__locale_t dataset)
+{
+  __locale_t result;
+
+  /* We modify global data.  */
+  __libc_lock_lock (__libc_setlocale_lock);
+
+  /* Get memory.  */
+  result = (__locale_t) malloc (sizeof (struct __locale_t));
+  if (result != NULL)
+    {
+      int cnt;
+      for (cnt = 0; cnt < LC_ALL; ++cnt)
+	{
+	  result->__locales[cnt] = dataset->__locales[cnt];
+	  if (result->__locales[cnt]->usage_count != MAX_USAGE_COUNT)
+	    ++result->__locales[cnt]->usage_count;
+	}
+    }
+
+  /* It's done.  */
+  __libc_lock_unlock (__libc_setlocale_lock);
+}
diff --git a/locale/findlocale.c b/locale/findlocale.c
index 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 <drepper@gnu.ai.mit.edu>, 1996.
 
@@ -20,23 +20,13 @@
 #include <locale.h>
 #include <stdlib.h>
 #include <string.h>
+#include <sys/mman.h>
 
 #include "localeinfo.h"
 
 
 /* Constant data defined in setlocale.c.  */
-extern const struct locale_data *const _nl_C[];
-
-
-static inline char *
-copy (const char *string)
-{
-  size_t len;
-  char *new;
-  len = strlen (string) + 1;
-  new = (char *) malloc (len);
-  return new != NULL ? memcpy (new, string, len) : NULL;
-}
+extern struct locale_data *const _nl_C[];
 
 
 /* For each category we keep a list of records for the locale files
@@ -44,9 +34,9 @@ copy (const char *string)
 static struct loaded_l10nfile *locale_file_list[LC_ALL];
 
 
-const struct locale_data *
+struct locale_data *
 _nl_find_locale (const char *locale_path, size_t locale_path_len,
-		 int category, char **name)
+		 int category, const char **name)
 {
   int mask;
   /* Name of the locale for this category.  */
@@ -88,10 +78,10 @@ _nl_find_locale (const char *locale_path, size_t locale_path_len,
   loc_name = (char *) _nl_expand_alias (*name);
   if (loc_name == NULL)
     /* It is no alias.  */
-    loc_name = *name;
+    loc_name = (char *) *name;
 
   /* Make a writable copy of the locale name.  */
-  loc_name = copy (loc_name);
+  loc_name = __strdup (loc_name);
 
   /* LOCALE can consist of up to four recognized parts for the XPG syntax:
 
@@ -141,9 +131,9 @@ _nl_find_locale (const char *locale_path, size_t locale_path_len,
 	return NULL;
     }
   else
-    /* If the addressed locale is already available it should be freed.
-       If we would not do this switching back and force between two
-       locales would slowly eat up all memory.*/
+    /* If the addressed locale is already available it should be
+       freed.  If we would not do this switching back and force
+       between two locales would slowly eat up all memory.  */
     free ((void *) loc_name);
 
   if (locale_file->decided == 0)
@@ -184,5 +174,51 @@ _nl_find_locale (const char *locale_path, size_t locale_path_len,
     }
   *name = (char *) ((struct locale_data *) locale_file->data)->name;
 
+  /* Increment the usage count.  */
+  if (((struct locale_data *) locale_file->data)->usage_count
+      != MAX_USAGE_COUNT)
+    ++((struct locale_data *) locale_file->data)->usage_count;
+
   return (struct locale_data *) locale_file->data;
 }
+
+
+/* Calling this function assumes the lock for handling global locale data
+   is acquired.  */
+void
+_nl_remove_locale (int locale, struct locale_data *data)
+{
+  if (--data->usage_count == 0)
+    {
+      /* First search the entry in the list of loaded files.  */
+      struct loaded_l10nfile *ptr = locale_file_list[locale];
+
+      /* Search for the entry.  It must be in the list.  Otherwise it
+	 is a bug and we crash badly.  */
+      while ((struct locale_data *) ptr->data != data)
+	ptr = ptr->next;
+
+      /* Mark the data as not available anymore.  So when the data has
+	 to be used again it is reloaded.  */
+      ptr->decided = 0;
+      ptr->data = NULL;
+
+      /* Really delete the data.  First delete the real data.  */
+      if (data->mmaped)
+	{
+	  /* Try to unmap the area.  If this fails we mark the area as
+	     permanent.  */
+	  if (__munmap ((caddr_t) data->filedata, data->filesize) != 0)
+	    {
+	      data->usage_count = MAX_USAGE_COUNT;
+	      return;
+	    }
+	}
+      else
+	/* The memory was malloced.  */
+	free ((void *) data->filedata);
+
+      /* Now free the structure itself.  */
+      free (data);
+    }
+}
diff --git a/locale/freelocale.c b/locale/freelocale.c
new file mode 100644
index 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 <drepper@cygnus.com>, 1996.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <locale.h>
+#include <stdlib.h>
+#include <libc-lock.h>
+
+#include "localeinfo.h"
+
+
+/* Lock for protecting global data.  */
+__libc_lock_define (extern , __libc_setlocale_lock)
+
+
+void
+__freelocale (__locale_t dataset)
+{
+  int cnt;
+
+  /* We modify global data.  */
+  __libc_lock_lock (__libc_setlocale_lock);
+
+  for (cnt = 0; cnt < LC_ALL; ++cnt)
+    if (dataset->__locales[cnt]->usage_count != MAX_USAGE_COUNT)
+      /* We can remove the data.  */
+      _nl_remove_locale (cnt, dataset->__locales[cnt]);
+
+  /* Free the locale_t handle itself.  */
+  free (dataset);
+
+  /* It's done.  */
+  __libc_lock_unlock (__libc_setlocale_lock);
+}
diff --git a/locale/lc-collate.c b/locale/lc-collate.c
index 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 <endian.h>
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 <ctype.h>
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 <libc-lock.h>
 #include <stdlib.h>
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 <drepper@gnu.ai.mit.edu>, 1996.
+   Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996.
 
-The GNU C Library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
 
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-Library General Public License for more details.
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
 
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
 
 #include <errno.h>
 #include <fcntl.h>
@@ -70,6 +70,7 @@ _nl_load_locale (struct loaded_l10nfile *file, int category)
   struct locale_data *newdata;
   int save_err;
   int swap = 0;
+  int mmaped = 1;
   size_t cnt;
   inline unsigned int SWAP (const unsigned int *inw)
     {
@@ -131,6 +132,7 @@ _nl_load_locale (struct loaded_l10nfile *file, int category)
       if (errno == ENOSYS)
 	{
 	  /* No mmap; allocate a buffer and read from the file.  */
+	  mmaped = 0;
 	  filedata = malloc (st.st_size);
 	  if (filedata != NULL)
 	    {
@@ -197,6 +199,8 @@ _nl_load_locale (struct loaded_l10nfile *file, int category)
   newdata->name = NULL;	/* This will be filled if necessary in findlocale.c. */
   newdata->filedata = (void *) filedata;
   newdata->filesize = st.st_size;
+  newdata->mmaped = mmaped;
+  newdata->usage_count = 0;
   newdata->nstrings = _nl_category_num_items[category];
   for (cnt = 0; cnt < newdata->nstrings; ++cnt)
     {
diff --git a/locale/locale.h b/locale/locale.h
index 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 <xlocale.h>
 
 /* Return a reference to a data structure representing a set of locale
    datasets.  Unlike for the CATEGORY parameter for `setlocale' the
@@ -115,13 +114,17 @@ typedef struct locale_data *locale_t[LC_ALL];
    I.e., 1 << LC_CTYPE means to load data for this category.  If
    BASE is non-null the appropriate category information in the BASE
    record is replaced.  */
-extern __const locale_t *__newlocale __P ((int __category_mask,
-					   __const char *__locale,
-					   __const locale_t *__base));
+extern __locale_t __newlocale __P ((int __category_mask,
+				     __const char *__locale,
+				     __locale_t __base));
+
+/* Return a duplicate of the set of locale in DATASET.  All usage
+   counters are increased if necessary.  */
+extern __locale_t __duplocale __P ((__locale_t __dataset));
 
 /* Free the data associated with a locale dataset previously returned
    by a call to `setlocale_r'.  */
-extern void __freelocale __P ((__const locale_t *__dataset));
+extern void __freelocale __P ((__locale_t __dataset));
 #endif
 
 __END_DECLS
diff --git a/locale/localeconv.c b/locale/localeconv.c
index 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 <locale.h>
 #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 <stddef.h>
 #include <langinfo.h>
+#include <limits.h>
 #include <time.h>
 #include <sys/types.h>
 
@@ -35,12 +36,19 @@
 #define ELLIPSIS_CHAR ((wchar_t) 0xfffffffe)
 #define IGNORE_CHAR ((wchar_t) 0xffffffff)
 
+/* We use a special value for the usage counter in `locale_data' to
+   signal that this data must never be removed anymore.  */
+#define MAX_USAGE_COUNT UINT_MAX
+
 /* Structure describing locale data in core for a category.  */
 struct locale_data
 {
   const char *name;
   const char *filedata;		/* Region mapping the file data.  */
   off_t filesize;		/* Size of the file (and the region).  */
+  int mmaped;			/* If nonzero the data is mmaped.  */
+
+  unsigned int usage_count;	/* Counter for users.  */
 
   unsigned int nstrings;	/* Number of strings below.  */
   union locale_data_value
@@ -90,13 +98,13 @@ struct era_entry
 
 /* For each category declare the variable for the current locale data.  */
 #define DEFINE_CATEGORY(category, category_name, items, a, b, c, d) \
-extern const struct locale_data *_nl_current_##category;
+extern struct locale_data *_nl_current_##category;
 #include "categories.def"
 #undef	DEFINE_CATEGORY
 
 extern const char *const _nl_category_names[LC_ALL + 1];
 extern const size_t _nl_category_name_sizes[LC_ALL + 1];
-extern const struct locale_data * *const _nl_current[LC_ALL];
+extern struct locale_data * *const _nl_current[LC_ALL];
 
 /* Name of the standard locale.  */
 extern const char _nl_C_name[];
@@ -111,26 +119,29 @@ extern const char _nl_C_name[];
 
 /* This is used in lc-CATEGORY.c to define _nl_current_CATEGORY.  */
 #define _NL_CURRENT_DEFINE(category) \
-  extern const struct locale_data _nl_C_##category; \
-  const struct locale_data *_nl_current_##category = &_nl_C_##category
+  extern struct locale_data _nl_C_##category; \
+  struct locale_data *_nl_current_##category = &_nl_C_##category
 
 /* Load the locale data for CATEGORY from the file specified by *NAME.
    If *NAME is "", use environment variables as specified by POSIX,
    and fill in *NAME with the actual name used.  The directories
    listed in LOCALE_PATH are searched for the locale files.  */
-extern const struct locale_data *_nl_find_locale (const char *locale_path,
-						  size_t locale_path_len,
-						  int category, char **name);
+extern struct locale_data *_nl_find_locale (const char *locale_path,
+					    size_t locale_path_len,
+					    int category, const char **name);
 
 /* Try to load the file described by FILE.  */
 extern void _nl_load_locale (struct loaded_l10nfile *file, int category);
 
+/* Free the locale and give back all memory if the usage count is one.  */
+extern void _nl_remove_locale (int locale, struct locale_data *data);
+
 
 /* Return `era' entry which corresponds to TP.  Used in strftime.  */
-struct era_entry *_nl_get_era_entry (const struct tm *tp);
+extern struct era_entry *_nl_get_era_entry (const struct tm *tp);
 
 /* Return `alt_digit' which corresponds to NUMBER.  Used in strftime.  */
-const char *_nl_get_alt_digit (unsigned int number);
+extern const char *_nl_get_alt_digit (unsigned int number);
 
 
 /* Global variables for LC_COLLATE category data.  */
diff --git a/locale/newlocale.c b/locale/newlocale.c
new file mode 100644
index 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 <drepper@cygnus.com>, 1996.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <argz.h>
+#include <errno.h>
+#include <locale.h>
+#include <stdlib.h>
+
+#include "localeinfo.h"
+
+
+/* Constant data defined in setlocale.c.  */
+extern struct locale_data *const _nl_C[];
+
+/* Use this when we come along an error.  */
+#define ERROR_RETURN							      \
+  do {									      \
+    __set_errno (EINVAL);						      \
+    return NULL;							      \
+  } while (0)
+
+
+__locale_t
+__newlocale (int category_mask, const char *locale, __locale_t base)
+{
+  /* Intermediate memory for result.  */
+  const char *newnames[LC_ALL];
+  struct __locale_t result;
+  __locale_t result_ptr;
+  char *locale_path;
+  size_t locale_path_len;
+  const char *locpath_var;
+  int cnt;
+
+  /* We treat LC_ALL in the same way as if all bits were set.  */
+  if (category_mask == LC_ALL)
+    category_mask = (1 << LC_ALL) - 1;
+
+  /* Sanity check for CATEGORY argument.  */
+  if ((category_mask & ~(1 << LC_ALL) - 1) != 0)
+    ERROR_RETURN;
+
+  /* `newlocale' does not support asking for the locale name. */
+  if (locale == NULL)
+    ERROR_RETURN;
+
+  /* Allocate memory for the result.  */
+  if (base != NULL)
+    {
+      if (base != NULL)
+	return base;
+
+      result = *base;
+    }
+  else
+    {
+      /* Fill with pointers to C locale data to .  */
+      for (cnt = 0; cnt < LC_ALL; ++cnt)
+	result.__locales[cnt] = _nl_C[cnt];
+
+      /* If no category is to be set we return BASE if available or a
+	 dataset using the C locale data.  */
+      if (category_mask == 0)
+	{
+	  result_ptr = (__locale_t) malloc (sizeof (struct __locale_t));
+	  *result_ptr = result;
+
+	  goto update;
+	}
+    }
+
+  /* We perhaps really have to load some data.  So we determine the
+     path in which to look for the data now.  The environment variable
+     `LOCPATH' must only be used when the binary has no SUID or SGID
+     bit set.  */
+  locale_path = NULL;
+  locale_path_len = 0;
+
+  locpath_var = __secure_getenv ("LOCPATH");
+  if (locpath_var != NULL && locpath_var[0] != '\0')
+    if (__argz_create_sep (locpath_var, ':',
+			   &locale_path, &locale_path_len) != 0)
+      return NULL;
+
+  if (__argz_append (&locale_path, &locale_path_len,
+		     LOCALE_PATH, sizeof (LOCALE_PATH)) != 0)
+    return NULL;
+
+  /* Get the names for the locales we are interested in.  We either
+     allow a composite name or a single name.  */
+  for (cnt = 0; cnt < LC_ALL; ++cnt)
+    newnames[cnt] = locale;
+  if (strchr (locale, ';') != NULL)
+    {
+      /* This is a composite name.  Make a copy and split it up.  */
+      char *np = strdupa (locale);
+      char *cp;
+
+      while ((cp = strchr (np, '=')) != NULL)
+	{
+	  for (cnt = 0; cnt < LC_ALL; ++cnt)
+	    if ((size_t) (cp - np) == _nl_category_name_sizes[cnt]
+		&& memcmp (np, _nl_category_names[cnt], cp - np) == 0)
+	      break;
+
+	  if (cnt == LC_ALL)
+	    /* Bogus category name.  */
+	    ERROR_RETURN;
+
+	  /* Found the category this clause sets.  */
+	  newnames[cnt] = ++cp;
+	  cp = strchr (cp, ';');
+	  if (cp != NULL)
+	    {
+	      /* Examine the next clause.  */
+	      *cp = '\0';
+	      np = cp + 1;
+	    }
+	  else
+	    /* This was the last clause.  We are done.  */
+	    break;
+	}
+
+      for (cnt = 0; cnt < LC_ALL; ++cnt)
+	if ((category_mask & 1 << cnt) != 0 && newnames[cnt] == locale)
+	  /* The composite name did not specify the category we need.  */
+	  ERROR_RETURN;
+    }
+
+  /* Now process all categories we are interested in.  */
+  for (cnt = 0; cnt < LC_ALL; ++cnt)
+    if ((category_mask & 1 << cnt) != 0)
+      {
+	result.__locales[cnt] = _nl_find_locale (locale_path, locale_path_len,
+						 cnt, &newnames[cnt]);
+	if (result.__locales[cnt] == NULL)
+	  return NULL;
+      }
+
+  /* We successfully loaded all required data.  */
+  if (base == NULL)
+    {
+      /* Allocate new structure.  */
+      result_ptr = (__locale_t) malloc (sizeof (struct __locale_t));
+      if (result_ptr == NULL)
+	return NULL;
+
+      *result_ptr = result;
+    }
+  else
+    *(result_ptr = base) = result;
+
+  /* Update the special members.  */
+ update:
+  {
+    union locale_data_value *ctypes = result_ptr->__locales[LC_CTYPE]->values;
+  result_ptr->__ctype_b = (const unsigned short int *)
+    (ctypes[_NL_ITEM_INDEX (_NL_CTYPE_CLASS)] .string);
+#if BYTE_ORDER == BIG_ENDIAN
+  result_ptr->__ctype_tolower = (const int *)
+    (ctypes[_NL_ITEM_INDEX (_NL_CTYPE_TOLOWER_EB)].string);
+  result_ptr->__ctype_toupper = (const int *)
+    (ctypes[_NL_ITEM_INDEX (_NL_CTYPE_TOUPPER_EB)].string);
+#elif BYTE_ORDER == LITTLE_ENDIAN
+  result_ptr->__ctype_tolower = (const int *)
+    (ctypes[_NL_ITEM_INDEX (_NL_CTYPE_TOLOWER_EL)].string);
+  result_ptr->__ctype_toupper = (const int *)
+    (ctypes[_NL_ITEM_INDEX (_NL_CTYPE_TOUPPER_EL)].string);
+#else
+#error bizarre byte order
+#endif
+  }
+
+  return result_ptr;
+}
diff --git a/locale/nl_langinfo.c b/locale/nl_langinfo.c
index 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 <langinfo.h>
 #include <errno.h>
@@ -26,7 +26,7 @@ Cambridge, MA 02139, USA.  */
    the references here are not weak references, this guarantees that the
    data for all the categories will be linked in.  */
 
-static const struct locale_data * *const nldata[] =
+static struct locale_data * *const nldata[] =
 {
 #define DEFINE_CATEGORY(category, category_name, items, a, b, c, d) \
   [category] = &_nl_current_##category,
diff --git a/locale/programs/charmap-kw.gperf b/locale/programs/charmap-kw.gperf
index 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, <drepper@gnu.ai.mit.edu>.
+/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>.
 
-The GNU C Library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
 
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-Library General Public License for more details.
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
 
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
 
 #include <string.h>
 
diff --git a/locale/programs/charmap-kw.h b/locale/programs/charmap-kw.h
index 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, <drepper@gnu.ai.mit.edu>.
+/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>.
 
-The GNU C Library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
 
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-Library General Public License for more details.
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
 
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
 
 #include <string.h>
 
@@ -59,16 +59,16 @@ hash (register const char *str, register int len)
     {
       default:
       case 5:
-        hval += asso_values[(int) str[4]];
+        hval += asso_values[str[4]];
       case 4:
       case 3:
       case 2:
-        hval += asso_values[(int) str[1]];
+        hval += asso_values[str[1]];
       case 1:
-        hval += asso_values[(int) str[0]];
+        hval += asso_values[str[0]];
         break;
     }
-  return hval + asso_values[(int) str[len - 1]];
+  return hval + asso_values[str[len - 1]];
 }
 
 #ifdef __GNUC__
diff --git a/locale/programs/charmap.c b/locale/programs/charmap.c
index 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: <mb_cur_max> must be greater than <mb_cur_min>\n"),
@@ -596,7 +596,7 @@ only WIDTH definitions are allowed to follow the CHARMAP definition"));
       break;
     }
 
-  if (state != 91)
+  if (state != 91 && !be_quiet)
     error (0, 0, _("%s: premature end of file"), cmfile->fname);
 
   lr_close (cmfile);
diff --git a/locale/programs/charset.c b/locale/programs/charset.c
index 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, <drepper@gnu.ai.mit.edu>.
-
-The GNU C Library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
-
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
+/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
 
 #ifdef HAVE_CONFIG_H
 # include <config.h>
diff --git a/locale/programs/charset.h b/locale/programs/charset.h
index 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, <drepper@gnu.ai.mit.edu>.
+   Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996.
 
    The GNU C Library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Library General Public License as
@@ -56,6 +56,9 @@ struct charset_t
 #define ILLEGAL_CHAR_VALUE ((wchar_t) 0xffffffffu)
 
 
+/* Declared in localedef.c.  */
+extern int be_quiet;
+
 /* Prototypes for charmap handling functions.  */
 struct charset_t *charmap_read (const char *filename);
 
diff --git a/locale/programs/ld-collate.c b/locale/programs/ld-collate.c
index 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, <drepper@gnu.ai.mit.edu>.
+/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
 
-The GNU C Library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
 
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-Library General Public License for more details.
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
 
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
 
 #ifdef HAVE_CONFIG_H
 # include <config.h>
@@ -262,10 +262,11 @@ ctype_finish (struct localedef_t *locale, struct charset_t *charset)
 			  cp += sprintf (cp, "\\%o", (value >> 8) & 0xff);
 			sprintf (cp, "\\%o", value & 0xff);
 
-			error (0, 0, _("\
+			if (!be_quiet)
+			  error (0, 0, _("\
 character %s'%s' in class `%s' must be in class `%s'"), value > 256 ? "L" : "",
-			       cp, valid_table[cls1].name,
-			       valid_table[cls2].name);
+				 cp, valid_table[cls1].name,
+				 valid_table[cls2].name);
 		      }
 		    break;
 
@@ -286,10 +287,12 @@ character %s'%s' in class `%s' must be in class `%s'"), value > 256 ? "L" : "",
 			  cp += sprintf (cp, "\\%o", (value >> 8) & 0xff);
 			sprintf (cp, "\\%o", value & 0xff);
 
-			error (0, 0, _("\
+			if (!be_quiet)
+			  error (0, 0, _("\
 character %s'%s' in class `%s' must not be in class `%s'"),
-			       value > 256 ? "L" : "", cp,
-			       valid_table[cls1].name, valid_table[cls2].name);
+				 value > 256 ? "L" : "", cp,
+				 valid_table[cls1].name,
+				 valid_table[cls2].name);
 		      }
 		    break;
 
@@ -306,23 +309,25 @@ character %s'%s' in class `%s' must not be in class `%s'"),
 
   /* ... and now test <SP> as a special case.  */
   space_value = charset_find_value (charset, "SP", 2);
-  if ((wchar_t) space_value == ILLEGAL_CHAR_VALUE)
+  if ((wchar_t) space_value == ILLEGAL_CHAR_VALUE && !be_quiet)
     error (0, 0, _("character <SP> not defined in character map"));
-  else if ((cnt = BITPOS (tok_space),
-            (ELEM (ctype, class_collection, , space_value)
-	     & BIT (tok_space)) == 0)
-           || (cnt = BITPOS (tok_blank),
-               (ELEM (ctype, class_collection, , space_value)
-		& BIT (tok_blank)) == 0))
+  else if (((cnt = BITPOS (tok_space),
+	     (ELEM (ctype, class_collection, , space_value)
+	      & BIT (tok_space)) == 0)
+	    || (cnt = BITPOS (tok_blank),
+		(ELEM (ctype, class_collection, , space_value)
+		 & BIT (tok_blank)) == 0))
+	   && !be_quiet)
     error (0, 0, _("<SP> character not in class `%s'"),
            valid_table[cnt].name);
-  else if ((cnt = BITPOS (tok_punct),
-            (ELEM (ctype, class_collection, , space_value)
-	     & BIT (tok_punct)) != 0)
-           || (cnt = BITPOS (tok_graph),
-               (ELEM (ctype, class_collection, , space_value)
-		& BIT (tok_graph))
-	       != 0))
+  else if (((cnt = BITPOS (tok_punct),
+	     (ELEM (ctype, class_collection, , space_value)
+	      & BIT (tok_punct)) != 0)
+	    || (cnt = BITPOS (tok_graph),
+		(ELEM (ctype, class_collection, , space_value)
+		 & BIT (tok_graph))
+		!= 0))
+	   && !be_quiet)
     error (0, 0, _("<SP> character must not be in class `%s'"),
            valid_table[cnt].name);
   else
@@ -934,7 +939,7 @@ set_class_defaults (struct locale_ctype_t *ctype, struct charset_t *charset)
 	  tmp[0] = ch;
 
 	  value = charset_find_value (charset, tmp, 1);
-	  if ((wchar_t) value == ILLEGAL_CHAR_VALUE)
+	  if ((wchar_t) value == ILLEGAL_CHAR_VALUE && !be_quiet)
 	    {
 	      error (0, 0, _("\
 character `%s' not defined while needed as default value"),
@@ -998,7 +1003,7 @@ character `%s' not defined while needed as default value"),
       unsigned int value;
 
       value = charset_find_value (charset, "space", 5);
-      if ((wchar_t) value == ILLEGAL_CHAR_VALUE)
+      if ((wchar_t) value == ILLEGAL_CHAR_VALUE && !be_quiet)
 	error (0, 0, _("\
 character `%s' not defined while needed as default value"),
 	       "<space>");
@@ -1006,7 +1011,7 @@ character `%s' not defined while needed as default value"),
 	ELEM (ctype, class_collection, , value) |= BIT (tok_space);
 
       value = charset_find_value (charset, "form-feed", 9);
-      if ((wchar_t) value == ILLEGAL_CHAR_VALUE)
+      if ((wchar_t) value == ILLEGAL_CHAR_VALUE && !be_quiet)
 	error (0, 0, _("\
 character `%s' not defined while needed as default value"),
 	       "<form-feed>");
@@ -1014,7 +1019,7 @@ character `%s' not defined while needed as default value"),
 	ELEM (ctype, class_collection, , value) |= BIT (tok_space);
 
       value = charset_find_value (charset, "newline", 7);
-      if ((wchar_t) value == ILLEGAL_CHAR_VALUE)
+      if ((wchar_t) value == ILLEGAL_CHAR_VALUE && !be_quiet)
 	error (0, 0, _("\
 character `%s' not defined while needed as default value"),
 	       "<newline>");
@@ -1022,7 +1027,7 @@ character `%s' not defined while needed as default value"),
 	ELEM (ctype, class_collection, , value) |= BIT (tok_space);
 
       value = charset_find_value (charset, "carriage-return", 15);
-      if ((wchar_t) value == ILLEGAL_CHAR_VALUE)
+      if ((wchar_t) value == ILLEGAL_CHAR_VALUE && !be_quiet)
 	error (0, 0, _("\
 character `%s' not defined while needed as default value"),
 	       "<carriage-return>");
@@ -1030,7 +1035,7 @@ character `%s' not defined while needed as default value"),
 	ELEM (ctype, class_collection, , value) |= BIT (tok_space);
 
       value = charset_find_value (charset, "tab", 3);
-      if ((wchar_t) value == ILLEGAL_CHAR_VALUE)
+      if ((wchar_t) value == ILLEGAL_CHAR_VALUE && !be_quiet)
 	error (0, 0, _("\
 character `%s' not defined while needed as default value"),
 	       "<tab>");
@@ -1038,7 +1043,7 @@ character `%s' not defined while needed as default value"),
 	ELEM (ctype, class_collection, , value) |= BIT (tok_space);
 
       value = charset_find_value (charset, "vertical-tab", 12);
-      if ((wchar_t) value == ILLEGAL_CHAR_VALUE)
+      if ((wchar_t) value == ILLEGAL_CHAR_VALUE && !be_quiet)
 	error (0, 0, _("\
 character `%s' not defined while needed as default value"),
 	       "<vertical-tab>");
@@ -1064,7 +1069,7 @@ character `%s' not defined while needed as default value"),
       unsigned int value;
 
       value = charset_find_value (charset, "space", 5);
-      if ((wchar_t) value == ILLEGAL_CHAR_VALUE)
+      if ((wchar_t) value == ILLEGAL_CHAR_VALUE && !be_quiet)
 	error (0, 0, _("\
 character `%s' not defined while needed as default value"),
 	       "<space>");
@@ -1072,7 +1077,7 @@ character `%s' not defined while needed as default value"),
 	ELEM (ctype, class_collection, , value) |= BIT (tok_blank);
 
       value = charset_find_value (charset, "tab", 3);
-      if ((wchar_t) value == ILLEGAL_CHAR_VALUE)
+      if ((wchar_t) value == ILLEGAL_CHAR_VALUE && !be_quiet)
 	error (0, 0, _("\
 character `%s' not defined while needed as default value"),
 	       "<tab>");
@@ -1110,7 +1115,7 @@ character `%s' not defined while needed as default value"),
 	  ctype->class_collection[cnt] |= BIT (tok_print);
 
       space = charset_find_value (charset, "space", 5);
-      if (space == ILLEGAL_CHAR_VALUE)
+      if (space == ILLEGAL_CHAR_VALUE && !be_quiet)
 	error (0, 0, _("\
 character `%s' not defined while needed as default value"),
 	       "<space>");
@@ -1136,7 +1141,7 @@ character `%s' not defined while needed as default value"),
 	  tmp[1] = (char) ch;
 
 	  value_from = charset_find_value (charset, &tmp[1], 1);
-	  if ((wchar_t) value_from == ILLEGAL_CHAR_VALUE)
+	  if ((wchar_t) value_from == ILLEGAL_CHAR_VALUE && !be_quiet)
 	    {
 	      error (0, 0, _("\
 character `%s' not defined while needed as default value"),
@@ -1147,7 +1152,7 @@ character `%s' not defined while needed as default value"),
 	  /* This conversion is implementation defined.  */
 	  tmp[1] = (char) (ch + ('A' - 'a'));
 	  value_to = charset_find_value (charset, &tmp[1], 1);
-	  if ((wchar_t) value_to == ILLEGAL_CHAR_VALUE)
+	  if ((wchar_t) value_to == ILLEGAL_CHAR_VALUE && !be_quiet)
 	    {
 	      error (0, 0, _("\
 character `%s' not defined while needed as default value"),
@@ -1195,9 +1200,10 @@ allocate_arrays (struct locale_ctype_t *ctype, struct charset_t *charset)
   size_t min_total = UINT_MAX;
   size_t act_size = 256;
 
-  fputs (_("\
+  if (!be_quiet)
+    fputs (_("\
 Computing table size for character classes might take a while..."),
-	 stderr);
+	   stderr);
 
   while (act_size < min_total)
     {
@@ -1232,7 +1238,8 @@ Computing table size for character classes might take a while..."),
       ++act_size;
     }
 
-  fprintf (stderr, _(" done\n"));
+  if (!be_quiet)
+    fputs (_(" done\n"), stderr);
 
 
 #if __BYTE_ORDER == __LITTLE_ENDIAN
diff --git a/locale/programs/ld-messages.c b/locale/programs/ld-messages.c
index 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, <drepper@gnu.ai.mit.edu>.
+/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
 
-The GNU C Library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
 
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-Library General Public License for more details.
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
 
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
 
 #ifdef HAVE_CONFIG_H
 # include <config.h>
@@ -77,7 +77,7 @@ messages_finish (struct localedef_t *locale)
     = locale->categories[LC_MESSAGES].messages;
 
   /* The fields YESSTR and NOSTR are optional.  */
-  if (messages->yesexpr == NULL)
+  if (messages->yesexpr == NULL && !be_quiet)
     error (0, 0, _("field `%s' in category `%s' undefined"),
 	   "yesexpr", "LC_MESSAGES");
   else
@@ -87,7 +87,7 @@ messages_finish (struct localedef_t *locale)
 
       /* Test whether it are correct regular expressions.  */
       result = regcomp (&re, messages->yesexpr, REG_EXTENDED);
-      if (result != 0)
+      if (result != 0 && !be_quiet)
 	{
 	  char errbuf[BUFSIZ];
 
@@ -98,7 +98,7 @@ no correct regular expression for field `%s' in category `%s': %s"),
 	}
     }
 
-  if (messages->noexpr == NULL)
+  if (messages->noexpr == NULL && !be_quiet)
     error (0, 0, _("field `%s' in category `%s' undefined"),
 	   "noexpr", "LC_MESSAGES");
   else
@@ -108,7 +108,7 @@ no correct regular expression for field `%s' in category `%s': %s"),
 
       /* Test whether it are correct regular expressions.  */
       result = regcomp (&re, messages->noexpr, REG_EXTENDED);
-      if (result != 0)
+      if (result != 0 && !be_quiet)
 	{
 	  char errbuf[BUFSIZ];
 
diff --git a/locale/programs/ld-monetary.c b/locale/programs/ld-monetary.c
index 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, <drepper@gnu.ai.mit.edu>.
+/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
 
-The GNU C Library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
 
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-Library General Public License for more details.
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
 
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
 
 #ifdef HAVE_CONFIG_H
 # include <config.h>
@@ -115,7 +115,7 @@ monetary_finish (struct localedef_t *locale)
     = locale->categories[LC_MONETARY].monetary;
 
 #define TEST_ELEM(cat)							      \
-  if (monetary->cat == NULL)						      \
+  if (monetary->cat == NULL && !be_quiet)				      \
     error (0, 0, _("field `%s' in category `%s' not defined"),		      \
 	   #cat, "LC_MONETARY")
 
@@ -129,12 +129,13 @@ monetary_finish (struct localedef_t *locale)
   /* The international currency symbol must come from ISO 4217.  */
   if (monetary->int_curr_symbol != NULL)
     {
-      if (strlen (monetary->int_curr_symbol) != 4)
+      if (strlen (monetary->int_curr_symbol) != 4 && !be_quiet)
 	error (0, 0, _("\
 value of field `int_curr_symbol' in category `LC_MONETARY' has wrong length"));
       else if (bsearch (monetary->int_curr_symbol, valid_int_curr,
 			NR_VALID_INT_CURR, sizeof (const char *),
-			(comparison_fn_t) curr_strcmp) == NULL)
+			(comparison_fn_t) curr_strcmp) == NULL
+	       && !be_quiet)
 	error (0, 0, _("\
 value of field `int_curr_symbol' in category `LC_MONETARY' does \
 not correspond to a valid name in ISO 4217"));
@@ -143,23 +144,23 @@ not correspond to a valid name in ISO 4217"));
   /* The decimal point must not be empty.  This is not said explicitly
      in POSIX but ANSI C (ISO/IEC 9899) says in 4.4.2.1 it has to be
      != "".  */
-  if (monetary->mon_decimal_point[0] == '\0')
+  if (monetary->mon_decimal_point[0] == '\0' && !be_quiet)
     {
       error (0, 0, _("\
 value for field `%s' in category `%s' must not be the empty string"),
 	     "mon_decimal_point", "LC_MONETARY");
     }
 
-  if (monetary->mon_grouping_act == 0)
+  if (monetary->mon_grouping_act == 0 && !be_quiet)
     error (0, 0, _("field `%s' in category `%s' not defined"),
 	   "mon_grouping", "LC_MONETARY");
 
 #undef TEST_ELEM
 #define TEST_ELEM(cat, min, max)					      \
-  if (monetary->cat == -2)						      \
+  if (monetary->cat == -2 && !be_quiet)					      \
     error (0, 0, _("field `%s' in category `%s' not defined"),		      \
 	   #cat, "LC_MONETARY");					      \
-  else if (monetary->cat < min || monetary->cat > max)			      \
+  else if ((monetary->cat < min || monetary->cat > max) && !be_quiet)	      \
     error (0, 0, _("\
 value for field `%s' in category `%s' must be in range %d...%d"),	      \
 	   #cat, "LC_MONETARY", min, max)
diff --git a/locale/programs/ld-numeric.c b/locale/programs/ld-numeric.c
index 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, <drepper@gnu.ai.mit.edu>.
+   Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
 
    The GNU C Library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Library General Public License as
@@ -74,7 +74,7 @@ numeric_finish (struct localedef_t *locale)
   struct locale_numeric_t *numeric = locale->categories[LC_NUMERIC].numeric;
 
 #define TEST_ELEM(cat)							      \
-  if (numeric->cat == NULL)						      \
+  if (numeric->cat == NULL && !be_quiet)				      \
     error (0, 0, _("field `%s' in category `%s' not defined"),		      \
 	   #cat, "LC_NUMERIC")
 
@@ -84,14 +84,14 @@ numeric_finish (struct localedef_t *locale)
   /* The decimal point must not be empty.  This is not said explicitly
      in POSIX but ANSI C (ISO/IEC 9899) says in 4.4.2.1 it has to be
      != "".  */
-  if (numeric->decimal_point[0] == '\0')
+  if (numeric->decimal_point[0] == '\0' && !be_quiet)
     {
       error (0, 0, _("\
 value for field `%s' in category `%s' must not be the empty string"),
 	     "decimal_point", "LC_NUMERIC");
     }
 
-  if (numeric->grouping_act == 0)
+  if (numeric->grouping_act == 0 && !be_quiet)
     error (0, 0, _("field `%s' in category `%s' not defined"),
 	   "grouping", "LC_NUMERIC");
 }
diff --git a/locale/programs/ld-time.c b/locale/programs/ld-time.c
index 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, <drepper@gnu.ai.mit.edu>.
-
-The GNU C Library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
-
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
+/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
 
 #ifndef _LINEREADER_H
 #define _LINEREADER_H 1
diff --git a/locale/programs/locale-spec.c b/locale/programs/locale-spec.c
index 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 <drepper@gnu.ai.mit.edu>, 1996.
-
-The GNU C Library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
-
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
+   Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
 
 #ifdef HAVE_CONFIG_H
 # include <config.h>
diff --git a/locale/programs/localedef.c b/locale/programs/localedef.c
index 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, <drepper@gnu.ai.mit.edu>.
-
-The GNU C Library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
-
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
+/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
 
 #ifndef _LOCALES_H
 #define _LOCALES_H
diff --git a/locale/programs/locfile-kw.gperf b/locale/programs/locfile-kw.gperf
index 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, <drepper@gnu.ai.mit.edu>.
+/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996.
 
-The GNU C Library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
 
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-Library General Public License for more details.
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
 
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
 
 #include <string.h>
 
diff --git a/locale/programs/locfile-kw.h b/locale/programs/locfile-kw.h
index 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, <drepper@gnu.ai.mit.edu>.
+/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996.
 
-The GNU C Library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
 
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-Library General Public License for more details.
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
 
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
 
 #include <string.h>
 
diff --git a/locale/programs/locfile-token.h b/locale/programs/locfile-token.h
index 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, <drepper@gnu.ai.mit.edu>.
-
-The GNU C Library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
-
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
+/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
 
 #ifndef _TOKEN_H
 #define _TOKEN_H
diff --git a/locale/programs/locfile.c b/locale/programs/locfile.c
index 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, <drepper@gnu.ai.mit.edu>.
+   Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996.
 
    The GNU C Library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Library General Public License as
@@ -981,7 +981,7 @@ write_locale_data (const char *output_path, const char *category,
 	    save_err = errno;
 	}
 
-      if (fd == -1)
+      if (fd == -1 && !be_quiet)
 	{
 	  error (0, save_err, _("\
 cannot open output file `%s' for category `%s'"),
@@ -1005,7 +1005,7 @@ cannot open output file `%s' for category `%s'"),
       if (maxiov > 0)
 	step = MIN (maxiov, step);
 
-      if (writev (fd, &vec[cnt], step) < 0)
+      if (writev (fd, &vec[cnt], step) < 0 && !be_quiet)
 	{
 	  error (0, errno, _("failure while writing data for category `%s'"),
 		 category);
diff --git a/locale/programs/locfile.h b/locale/programs/locfile.h
index 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, <drepper@gnu.ai.mit.edu>.
+   Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996.
 
    The GNU C Library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Library General Public License as
@@ -53,6 +53,8 @@ struct localedef_t
   size_t len[6];
 };
 
+/* Declared in localedef.c.  */
+extern int be_quiet;
 
 /* Found in localedef.c.  */
 void def_to_process (const char *name, int category);
diff --git a/locale/programs/simple-hash.h b/locale/programs/simple-hash.h
index 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 <drepper@gnu.ai.mit.edu>, 1995.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
 
 #ifndef _SIMPLE_HASH_H
 #define _SIMPLE_HASH_H
diff --git a/locale/programs/stringtrans.c b/locale/programs/stringtrans.c
index 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 <drepper@gnu.ai.mit.edu>, 1996.
-
-The GNU C Library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
-
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
+/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
 
 #ifdef HAVE_CONFIG_H
 # include <config.h>
diff --git a/locale/programs/stringtrans.h b/locale/programs/stringtrans.h
index 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, <drepper@gnu.ai.mit.edu>.
-
-The GNU C Library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
-
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
+/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1996.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
 
 #ifndef _TRANSLATE_H
 #define _TRANSLATE_H 1
diff --git a/locale/setlocale.c b/locale/setlocale.c
index 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 <alloca.h>
 #include <argz.h>
@@ -35,15 +35,15 @@ Boston, MA 02111-1307, USA.  */
    Both are weak references; if &_nl_current_CATEGORY is zero,
    then nothing is using the locale data.  */
 #define DEFINE_CATEGORY(category, category_name, items, a, b, c, d) \
-extern const struct locale_data *_nl_current_##category;		      \
-extern const struct locale_data _nl_C_##category;			      \
+extern struct locale_data *_nl_current_##category;			      \
+extern struct locale_data _nl_C_##category;				      \
 weak_extern (_nl_current_##category) weak_extern (_nl_C_##category)
 #include "categories.def"
 #undef	DEFINE_CATEGORY
 
 /* Array indexed by category of pointers to _nl_current_CATEGORY slots.
    Elements are zero for categories whose data is never used.  */
-static const struct locale_data * *const _nl_current[] =
+static struct locale_data * *const _nl_current[] =
   {
 #define DEFINE_CATEGORY(category, category_name, items, a, b, c, d) \
     [category] = &_nl_current_##category,
@@ -53,7 +53,7 @@ static const struct locale_data * *const _nl_current[] =
 
 /* Array indexed by category of pointers to _nl_C_CATEGORY slots.
    Elements are zero for categories whose data is never used.  */
-const struct locale_data *const _nl_C[] =
+struct locale_data *const _nl_C[] =
   {
 #define DEFINE_CATEGORY(category, category_name, items, a, b, c, d) \
     [category] = &_nl_C_##category,
@@ -147,7 +147,7 @@ clever_copy (const char *string)
 
 /* Construct a new composite name.  */
 static inline char *
-new_composite_name (int category, char *newnames[LC_ALL])
+new_composite_name (int category, const char *newnames[LC_ALL])
 {
   size_t last_len;
   size_t cumlen = 0;
@@ -157,9 +157,9 @@ new_composite_name (int category, char *newnames[LC_ALL])
 
   for (i = 0; i < LC_ALL; ++i)
     {
-      char *name = (category == LC_ALL ? newnames[i] :
-		    category == i ? newnames[0] :
-		    (char *) _nl_current_names[i]);
+      const char *name = (category == LC_ALL ? newnames[i] :
+			  category == i ? newnames[0] :
+			  _nl_current_names[i]);
       last_len = strlen (name);
       cumlen += _nl_category_name_sizes[i] + 1 + last_len + 1;
       if (i > 0 && same && strcmp (name, newnames[0]) != 0)
@@ -184,9 +184,9 @@ new_composite_name (int category, char *newnames[LC_ALL])
   for (i = 0; i < LC_ALL; ++i)
     {
       /* Add "CATEGORY=NAME;" to the string.  */
-      char *name = (category == LC_ALL ? newnames[i] :
-		    category == i ? newnames[0] :
-		    (char *) _nl_current_names[i]);
+      const char *name = (category == LC_ALL ? newnames[i] :
+			  category == i ? newnames[0] :
+			  _nl_current_names[i]);
       p = __stpcpy (p, _nl_category_names[i]);
       *p++ = '=';
       p = __stpcpy (p, name);
@@ -211,7 +211,7 @@ setname (int category, const char *name)
 
 /* Put DATA in *_nl_current[CATEGORY].  */
 static inline void
-setdata (int category, const struct locale_data *data)
+setdata (int category, struct locale_data *data)
 {
   if (_nl_current[category] != NULL)
     {
@@ -264,8 +264,8 @@ setlocale (int category, const char *locale)
 	 for the individual categories can be selected by using a
 	 composite locale name.  This is a semi-colon separated list
 	 of entries of the form `CATEGORY=VALUE'.  */
-      char *newnames[LC_ALL];
-      const struct locale_data *newdata[LC_ALL];
+      const char *newnames[LC_ALL];
+      struct locale_data *newdata[LC_ALL];
 
       /* Set all name pointers to the argument name.  */
       for (category = 0; category < LC_ALL; ++category)
@@ -323,6 +323,11 @@ setlocale (int category, const char *locale)
 
 	    if (newdata[category] == NULL)
 	      break;
+
+	    /* We must not simply free a global locale since we have
+	       no control over the usage.  So we mark it as
+	       un-deletable.  */
+	    newdata[category]->usage_count = MAX_USAGE_COUNT;
 	  }
 	else
 	  {
@@ -356,8 +361,8 @@ setlocale (int category, const char *locale)
     }
   else
     {
-      const struct locale_data *newdata = NULL;
-      char *newname = (char *) locale;
+      struct locale_data *newdata = NULL;
+      const char *newname = locale;
 
       /* Protect global data.  */
       __libc_lock_lock (__libc_setlocale_lock);
@@ -366,9 +371,13 @@ setlocale (int category, const char *locale)
 	{
 	  /* Only actually load the data if anything will use it.  */
 	  newdata = _nl_find_locale (locale_path, locale_path_len, category,
-				     (char **) &newname);
+				     &newname);
 	  if (newdata == NULL)
 	    goto abort_single;
+
+	  /* We must not simply free a global locale since we have no
+	     control over the usage.  So we mark it as un-deletable.  */
+	  newdata->usage_count = MAX_USAGE_COUNT;
 	}
 
       /* Create new composite name.  */
@@ -391,6 +400,6 @@ setlocale (int category, const char *locale)
       /* Critical section left.  */
       __libc_lock_unlock (__libc_setlocale_lock);
 
-      return newname;
+      return (char *) newname;
     }
 }
diff --git a/locale/strlen-hash.h b/locale/strlen-hash.h
index 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 <drepper@cygnus.com>, 1996.
-
-The GNU C Library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
-
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
+/* Implements hashing function for string with known length.
+   Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
 
 #include <sys/types.h>
 
diff --git a/locale/weight.h b/locale/weight.h
index 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 <drepper@cygnus.com>, 1997.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#ifndef _XLOCALE_H
+#define _XLOCALE_H	1
+
+/* Structure for reentrant locale using functions.  This is an
+   (almost) opaque type for the user level programs.  The file and
+   this data structure is not standardized.  Don't rely on it.  It can
+   go away without warning.  */
+typedef struct __locale_t
+{
+  struct locale_data *__locales[6];	/* XXX LC_ALL should be used here */
+
+  /* To increase the speed of this solution we add some special members.  */
+  const unsigned short int *__ctype_b;
+  const int *__ctype_tolower;
+  const int *__ctype_toupper;
+} *__locale_t;
+
+#endif /* xlocale.h */