Use code in gettext 0.32.
authorChangwoo Ryu <cwryu@src.gnome.org>
Sun, 8 Feb 1998 17:44:13 +0000 (17:44 +0000)
committerChangwoo Ryu <cwryu@src.gnome.org>
Sun, 8 Feb 1998 17:44:13 +0000 (17:44 +0000)
svn path=/trunk/; revision=60

18 files changed:
intl/ChangeLog
intl/Makefile.in
intl/VERSION
intl/bindtextdom.c
intl/cat-compat.c
intl/dcgettext.c
intl/explodename.c [new file with mode: 0644]
intl/finddomain.c
intl/gettext.c
intl/gettext.h
intl/gettextP.h
intl/hash-string.h
intl/l10nflist.c [new file with mode: 0644]
intl/libgettext.h
intl/loadinfo.h [new file with mode: 0644]
intl/loadmsgcat.c
intl/localealias.c
intl/textdomain.c

index 6bda595..ecff6f6 100644 (file)
@@ -1,3 +1,334 @@
+1997-09-06 02:10  Ulrich Drepper  <drepper@cygnus.com>
+
+       * intlh.inst.in: Reformat copyright.
+
+1997-08-19 15:22  Ulrich Drepper  <drepper@cygnus.com>
+
+       * dcgettext.c (DCGETTEXT): Remove wrong comment.
+
+1997-08-16 00:13  Ulrich Drepper  <drepper@cygnus.com>
+
+       * Makefile.in (install-data): Don't change directory to install.
+
+1997-08-01 14:30  Ulrich Drepper  <drepper@cygnus.com>
+
+       * cat-compat.c: Fix copyright.
+
+       * localealias.c: Don't define strchr unless !HAVE_STRCHR.
+
+       * loadmsgcat.c: Update copyright.  Fix typos.
+
+       * l10nflist.c: Don't define strchr unless !HAVE_STRCHR.
+       (_nl_make_l10nflist): Handle sponsor and revision correctly.
+
+       * gettext.c: Update copyright.
+       * gettext.h: Likewise.
+       * hash-string.h: Likewise.
+
+       * finddomain.c: Remoave dead code.  Define strchr only if
+       !HAVE_STRCHR.
+
+       * explodename.c: Include <sys/types.h>.
+
+       * explodename.c: Reformat copyright text.
+       (_nl_explode_name): Fix typo.
+
+       * dcgettext.c: Define and use __set_errno.
+       (guess_category_value): Don't use setlocale if HAVE_LC_MESSAGES is
+       not defined.
+
+       * bindtextdom.c: Pretty printing.
+
+1997-05-01 02:25  Ulrich Drepper  <drepper@cygnus.com>
+
+       * dcgettext.c (guess_category_value): Don't depend on
+       HAVE_LC_MESSAGES.  We don't need the macro here.
+       Patch by Bruno Haible <haible@ilog.fr>.
+
+       * cat-compat.c (textdomain): DoN't refer to HAVE_SETLOCALE_NULL
+       macro.  Instead use HAVE_LOCALE_NULL and define it when using
+       glibc, as in dcgettext.c.
+       Patch by Bruno Haible <haible@ilog.fr>.
+
+       * Makefile.in (CPPFLAGS): New variable.  Reported by Franc,ois
+       Pinard.
+
+Mon Mar 10 06:51:17 1997  Ulrich Drepper  <drepper@cygnus.com>
+
+       * Makefile.in: Implement handling of libtool.
+
+       * gettextP.h: Change data structures for use of generic lowlevel
+       i18n file handling.
+
+Wed Dec  4 20:21:18 1996  Ulrich Drepper  <drepper@cygnus.com>
+
+       * textdomain.c: Put parentheses around arguments of memcpy macro
+       definition.
+       * localealias.c: Likewise.
+       * l10nflist.c: Likewise.
+       * finddomain.c: Likewise.
+       * bindtextdom.c: Likewise.
+       Reported by Thomas Esken.
+
+Mon Nov 25 22:57:51 1996  Ulrich Drepper  <drepper@cygnus.com>
+
+       * textdomain.c: Move definition of `memcpy` macro to right
+       position.
+
+Fri Nov 22 04:01:58 1996  Ulrich Drepper  <drepper@cygnus.com>
+
+       * finddomain.c [!HAVE_STRING_H && !_LIBC]: Define memcpy using
+       bcopy if not already defined.  Reported by Thomas Esken.
+       * bindtextdom.c: Likewise.
+       * l10nflist.c: Likewise.
+       * localealias.c: Likewise.
+       * textdomain.c: Likewise.
+
+Tue Oct 29 11:10:27 1996  Ulrich Drepper  <drepper@cygnus.com>
+
+       * Makefile.in (libdir): Change to use exec_prefix instead of
+       prefix.  Reported by Knut-HĂ„vardAksnes <etokna@eto.ericsson.se>.
+
+Sat Aug 31 03:07:09 1996  Ulrich Drepper  <drepper@cygnus.com>
+
+       * l10nflist.c (_nl_normalize_codeset): We convert to lower case,
+       so don't prepend uppercase `ISO' for only numeric arg.
+
+Fri Jul 19 00:15:46 1996  Ulrich Drepper  <drepper@cygnus.com>
+
+       * l10nflist.c: Move inclusion of argz.h, ctype.h, stdlib.h after
+       definition of _GNU_SOURCE.  Patch by Roland McGrath.
+
+       * Makefile.in (uninstall): Fix another bug with `for' loop and
+       empty arguments.  Patch by Jim Meyering.  Correct name os
+       uninstalled files: no intl- prefix anymore.
+
+       * Makefile.in (install-data): Again work around shells which
+       cannot handle mpty for list.  Reported by Jim Meyering.
+
+Sat Jul 13 18:11:35 1996  Ulrich Drepper  <drepper@cygnus.com>
+
+       * Makefile.in (install): Split goal.  Now depend on install-exec
+        and install-data.
+       (install-exec, install-data): New goals.  Created from former
+       install goal.
+       Reported by Karl Berry.
+
+Sat Jun 22 04:58:14 1996  Ulrich Drepper  <drepper@cygnus.com>
+
+       * Makefile.in (MKINSTALLDIRS): New variable.  Path to
+        mkinstalldirs script.
+       (install): use MKINSTALLDIRS variable or if the script is not present
+       try to find it in the $top_scrdir).
+
+Wed Jun 19 02:56:56 1996  Ulrich Drepper  <drepper@cygnus.com>
+
+       * l10nflist.c: Linux libc *partly* includes the argz_* functions.
+       Grr.  Work around by renaming the static version and use macros
+       for renaming.
+
+Tue Jun 18 20:11:17 1996  Ulrich Drepper  <drepper@cygnus.com>
+
+       * l10nflist.c: Correct presence test macros of __argz_* functions.
+
+       * l10nflist.c: Include <argz.h> based on test of it instead when
+       __argz_* functions are available.
+       Reported by Andreas Schwab.
+
+Thu Jun 13 15:17:44 1996  Ulrich Drepper  <drepper@cygnus.com>
+
+       * explodename.c, l10nflist.c: Define NULL for dumb systems.
+
+Tue Jun 11 17:05:13 1996  Ulrich Drepper  <drepper@cygnus.com>
+
+       * intlh.inst.in, libgettext.h (dcgettext): Rename local variable
+       result to __result to prevent name clash.
+
+       * l10nflist.c, localealias.c, dcgettext.c: Define _GNU_SOURCE to
+        get prototype for stpcpy and strcasecmp.
+
+       * intlh.inst.in, libgettext.h: Move declaration of
+       `_nl_msg_cat_cntr' outside __extension__ block to prevent warning
+       from gcc's -Wnested-extern option.
+
+Fri Jun  7 01:58:00 1996  Ulrich Drepper  <drepper@cygnus.com>
+
+       * Makefile.in (install): Remove comment.
+
+Thu Jun  6 17:28:17 1996  Ulrich Drepper  <drepper@cygnus.com>
+
+       * Makefile.in (install): Work around for another Buglix stupidity.
+       Always use an `else' close for `if's.  Reported by Nelson Beebe.
+
+       * Makefile.in (intlh.inst): Correct typo in phony rule.
+       Reported by Nelson Beebe.
+
+Thu Jun  6 01:49:52 1996  Ulrich Drepper  <drepper@cygnus.com>
+
+       * dcgettext.c (read_alias_file): Rename variable alloca_list to
+       block_list as the macro calls assume.
+       Patch by Eric Backus.
+
+       * localealias.c [!HAVE_ALLOCA]: Define alloca as macro using
+        malloc.
+       (read_alias_file): Rename varriabe alloca_list to block_list as the
+       macro calls assume.
+       Patch by Eric Backus.
+
+       * l10nflist.c: Correct conditional for <argz.h> inclusion.
+       Reported by Roland McGrath.
+
+       * Makefile.in (all): Depend on all-@USE_INCLUDED_LIBINTL@, not
+        all-@USE_NLS@.
+
+       * Makefile.in (install): intlh.inst comes from local dir, not
+        $(srcdir).
+
+       * Makefile.in (intlh.inst): Special handling of this goal.  If
+       used in gettext, this is really a rul to construct this file.  If
+       used in any other package it is defined as a .PHONY rule with
+       empty body.
+
+       * finddomain.c: Extract locale file information handling into
+       l10nfile.c.  Rename local stpcpy__ function to stpcpy.
+
+       * dcgettext.c (stpcpy): Add local definition.
+
+       * l10nflist.c: Solve some portability problems.  Patches partly by
+       Thomas Esken.  Add local definition of stpcpy.
+
+Tue Jun  4 02:47:49 1996  Ulrich Drepper  <drepper@cygnus.com>
+
+       * intlh.inst.in: Don't depend including <locale.h> on
+       HAVE_LOCALE_H.  Instead configure must rewrite this fiile
+       depending on the result of the configure run.
+
+       * Makefile.in (install): libintl.inst is now called intlh.inst.
+       Add rules for updating intlh.inst from intlh.inst.in.
+
+       * libintl.inst: Renamed to intlh.inst.in.
+
+       * localealias.c, dcgettext.c [__GNUC__]: Define HAVE_ALLOCA to 1
+        because gcc has __buitlin_alloca.
+       Reported by Roland McGrath.
+
+Mon Jun  3 00:32:16 1996  Ulrich Drepper  <drepper@cygnus.com>
+
+       * Makefile.in (installcheck): New goal to fulfill needs of
+        automake's distcheck.
+
+       * Makefile.in (install): Reorder commands so that VERSION is
+        found.
+
+       * Makefile.in (gettextsrcdir): Now use subdirectory intl/ in
+        @datadir@/gettext.
+       (COMSRCS): Add l10nfile.c.
+       (OBJECTS): Add l10nfile.o.
+       (DISTFILES): Rename to DISTFILE.normal.  Remove $(DISTFILES.common).
+       (DISTFILE.gettext): Remove $(DISTFILES.common).
+       (all-gettext): Remove goal.
+       (install): If $(PACKAGE) = gettext install, otherwose do nothing.  No
+       package but gettext itself should install libintl.h + headers.
+       (dist): Extend goal to work for gettext, too.
+       (dist-gettext): Remove goal.
+
+       * dcgettext.c [!HAVE_ALLOCA]: Define macro alloca by using malloc.
+
+Sun Jun  2 17:33:06 1996  Ulrich Drepper  <drepper@cygnus.com>
+
+       * loadmsgcat.c (_nl_load_domain): Parameter is now comes from
+        find_l10nfile.
+
+Sat Jun  1 02:23:03 1996  Ulrich Drepper  <drepper@cygnus.com>
+
+       * l10nflist.c (__argz_next): Add definition.
+
+       * dcgettext.c [!HAVE_ALLOCA]: Add code for handling missing alloca
+       code.  Use new l10nfile handling.
+
+       * localealias.c [!HAVE_ALLOCA]: Add code for handling missing
+        alloca code.
+
+       * l10nflist.c: Initial revision.
+
+Tue Apr  2 18:51:18 1996  Ulrich Drepper  <drepper@myware>
+
+       * Makefile.in (all-gettext): New goal.  Same as all-yes.
+
+Thu Mar 28 23:01:22 1996  Karl Eichwalder  <ke@ke.central.de>
+
+       * Makefile.in (gettextsrcdir): Define using @datadir@.
+
+Tue Mar 26 12:39:14 1996  Ulrich Drepper  <drepper@myware>
+
+       * finddomain.c: Include <ctype.h>.  Reported by Roland McGrath.
+
+Sat Mar 23 02:00:35 1996  Ulrich Drepper  <drepper@myware>
+
+       * finddomain.c (stpcpy): Rename to stpcpy__ to prevent clashing
+        with external declaration.
+
+Sat Mar  2 00:47:09 1996  Ulrich Drepper  <drepper@myware>
+
+       * Makefile.in (all-no): Rename from all_no.
+
+Sat Feb 17 00:25:59 1996  Ulrich Drepper  <drepper@myware>
+
+       * gettextP.h [loaded_domain]: Array `successor' must now contain up
+        to 63 elements (because of codeset name normalization).
+
+       * finddomain.c: Implement codeset name normalization.
+
+Thu Feb 15 04:39:09 1996  Ulrich Drepper  <drepper@myware>
+
+       * Makefile.in (all): Define to `all-@USE_NLS@'.
+       (all-yes, all_no): New goals.  `all-no' is noop, `all-yes'
+       is former all.
+
+Mon Jan 15 21:46:01 1996  Howard Gayle  <howard@hal.com>
+
+       * localealias.c (alias_compare): Increment string pointers in loop
+        of strcasecmp replacement.
+
+Fri Dec 29 21:16:34 1995  Ulrich Drepper  <drepper@myware>
+
+       * Makefile.in (install-src): Who commented this goal out ? :-)
+
+Fri Dec 29 15:08:16 1995  Ulrich Drepper  <drepper@myware>
+
+       * dcgettext.c (DCGETTEXT): Save `errno'.  Failing system calls
+       should not effect it because a missing catalog is no error.
+       Reported by Harald K<o:>nig <koenig@tat.physik.uni-tuebingen.de>.
+
+Tue Dec 19 22:09:13 1995  Ulrich Drepper  <drepper@myware>
+
+       * Makefile.in (Makefile): Explicitly use $(SHELL) for running
+        shell scripts.
+
+Fri Dec 15 17:34:59 1995  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
+
+       * Makefile.in (install-src): Only install library and header when
+       we use the own implementation.  Don't do it when using the
+       system's gettext or catgets functions.
+
+       * dcgettext.c (find_msg): Must not swap domain->hash_size here.
+
+Sat Dec  9 16:24:37 1995  Ulrich Drepper  <drepper@myware>
+
+       * localealias.c, libintl.inst, libgettext.h, hash-string.h,
+       gettextP.h, finddomain.c, dcgettext.c, cat-compat.c:
+       Use PARAMS instead of __P.  Suggested by Roland McGrath.
+
+Tue Dec  5 11:39:14 1995  Larry Schwimmer  <rosebud@cyclone.stanford.edu>
+
+       * libgettext.h: Use `#if !defined (_LIBINTL_H)' instead of `#if
+       !_LIBINTL_H' because Solaris defines _LIBINTL_H as empty.
+
+Mon Dec  4 15:42:07 1995  Ulrich Drepper  <drepper@myware>
+
+       * Makefile.in (install-src):
+       Install libintl.inst instead of libintl.h.install.
+
 Sat Dec  2 22:51:38 1995  Marcus Daniels  <marcus@sysc.pdx.edu>
 
        * cat-compat.c (textdomain):
 Sat Dec  2 22:51:38 1995  Marcus Daniels  <marcus@sysc.pdx.edu>
 
        * cat-compat.c (textdomain):
@@ -689,5 +1020,3 @@ Sun Jul  2 02:06:50 1995  Ulrich Drepper  <drepper@myware>
        which allow to use the X/Open catgets function with an interface
        like the Uniforum gettext function.  For system which does not
        have neither of those a complete implementation is provided.
        which allow to use the X/Open catgets function with an interface
        like the Uniforum gettext function.  For system which does not
        have neither of those a complete implementation is provided.
-
-
index b223930..a41fb57 100644 (file)
@@ -1,5 +1,5 @@
 # Makefile for directory with message catalog handling in GNU NLS Utilities.
 # Makefile for directory with message catalog handling in GNU NLS Utilities.
-# Copyright (C) 1995 Free Software Foundation, Inc.
+# Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -22,98 +22,137 @@ SHELL = /bin/sh
 
 srcdir = @srcdir@
 top_srcdir = @top_srcdir@
 
 srcdir = @srcdir@
 top_srcdir = @top_srcdir@
+top_builddir = ..
 VPATH = @srcdir@
 
 prefix = @prefix@
 exec_prefix = @exec_prefix@
 transform = @program_transform_name@
 VPATH = @srcdir@
 
 prefix = @prefix@
 exec_prefix = @exec_prefix@
 transform = @program_transform_name@
-libdir = $(prefix)/lib
+libdir = $(exec_prefix)/lib
 includedir = $(prefix)/include
 datadir = $(prefix)/@DATADIRNAME@
 localedir = $(datadir)/locale
 gnulocaledir = $(prefix)/share/locale
 includedir = $(prefix)/include
 datadir = $(prefix)/@DATADIRNAME@
 localedir = $(datadir)/locale
 gnulocaledir = $(prefix)/share/locale
-gettextsrcdir = $(prefix)/share/gettext
+gettextsrcdir = @datadir@/gettext/intl
 aliaspath = $(localedir):.
 subdir = intl
 
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
 aliaspath = $(localedir):.
 subdir = intl
 
 INSTALL = @INSTALL@
 INSTALL_DATA = @INSTALL_DATA@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+
+l = @l@
 
 AR = ar
 CC = @CC@
 
 AR = ar
 CC = @CC@
+LIBTOOL = @LIBTOOL@
 RANLIB = @RANLIB@
 
 DEFS = -DLOCALEDIR=\"$(localedir)\" -DGNULOCALEDIR=\"$(gnulocaledir)\" \
 -DLOCALE_ALIAS_PATH=\"$(aliaspath)\" @DEFS@
 RANLIB = @RANLIB@
 
 DEFS = -DLOCALEDIR=\"$(localedir)\" -DGNULOCALEDIR=\"$(gnulocaledir)\" \
 -DLOCALE_ALIAS_PATH=\"$(aliaspath)\" @DEFS@
+CPPFLAGS = @CPPFLAGS@
 CFLAGS = @CFLAGS@
 CFLAGS = @CFLAGS@
+LDFLAGS = @LDFLAGS@
 
 COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS)
 
 
 COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS)
 
-HEADERS = $(COMHDRS) libgettext.h
+HEADERS = $(COMHDRS) libgettext.h loadinfo.h
 COMHDRS = gettext.h gettextP.h hash-string.h
 SOURCES = $(COMSRCS) intl-compat.c cat-compat.c
 COMSRCS = bindtextdom.c dcgettext.c dgettext.c gettext.c \
 COMHDRS = gettext.h gettextP.h hash-string.h
 SOURCES = $(COMSRCS) intl-compat.c cat-compat.c
 COMSRCS = bindtextdom.c dcgettext.c dgettext.c gettext.c \
-finddomain.c loadmsgcat.c localealias.c textdomain.c
-OBJECTS = @INTLOBJS@ bindtextdom.o dcgettext.o dgettext.o gettext.o \
-finddomain.o loadmsgcat.o localealias.o textdomain.o
-CATOBJS = cat-compat.o ../po/cat-id-tbl.o
-GETTOBJS = intl-compat.o
+finddomain.c loadmsgcat.c localealias.c textdomain.c l10nflist.c \
+explodename.c
+OBJECTS = @INTLOBJS@ bindtextdom.$lo dcgettext.$lo dgettext.$lo gettext.$lo \
+finddomain.$lo loadmsgcat.$lo localealias.$lo textdomain.$lo l10nflist.$lo \
+explodename.$lo
+CATOBJS = cat-compat.$lo ../po/cat-id-tbl.$lo
+GETTOBJS = intl-compat.$lo
 DISTFILES.common = ChangeLog Makefile.in linux-msg.sed po2tbl.sed.in \
 xopen-msg.sed $(HEADERS) $(SOURCES)
 DISTFILES.common = ChangeLog Makefile.in linux-msg.sed po2tbl.sed.in \
 xopen-msg.sed $(HEADERS) $(SOURCES)
-DISTFILES = $(DISTFILES.common) VERSION
-DISTFILES.gettext = $(DISTFILES.common) libintl.glibc libintl.inst
+DISTFILES.normal = VERSION
+DISTFILES.gettext = libintl.glibc intlh.inst.in
 
 .SUFFIXES:
 
 .SUFFIXES:
-.SUFFIXES: .c .o
+.SUFFIXES: .c .o .lo
 .c.o:
        $(COMPILE) $<
 .c.o:
        $(COMPILE) $<
+.c.lo:
+       $(LIBTOOL) --mode=compile $(COMPILE) $<
 
 INCLUDES = -I.. -I. -I$(top_srcdir)/intl -I$(top_srcdir)/lib
 
 
 INCLUDES = -I.. -I. -I$(top_srcdir)/intl -I$(top_srcdir)/lib
 
-all: libintl.a
+all: all-@USE_INCLUDED_LIBINTL@
 
 
+all-yes: libintl.$la intlh.inst
+all-no:
 
 libintl.a: $(OBJECTS)
        rm -f $@
        $(AR) cru $@ $(OBJECTS)
        $(RANLIB) $@
 
 
 libintl.a: $(OBJECTS)
        rm -f $@
        $(AR) cru $@ $(OBJECTS)
        $(RANLIB) $@
 
-../po/cat-id-tbl.o: ../po/cat-id-tbl.c $(top_srcdir)/po/$(PACKAGE).pot
-       cd ../po && $(MAKE) cat-id-tbl.o
+libintl.la: $(OBJECTS)
+       $(LIBTOOL) --mode=link $(CC) $(LDFLAGS) -o $@ $(OBJECTS) \
+                  -version-info 1:0 -rpath $(libdir)
+
+../po/cat-id-tbl.$lo: ../po/cat-id-tbl.c $(top_srcdir)/po/$(PACKAGE).pot
+       cd ../po && $(MAKE) cat-id-tbl.$lo
 
 
-check install: all
+check: all
 
 # This installation goal is only used in GNU gettext.  Packages which
 # only use the library should use install instead.
 
 # This installation goal is only used in GNU gettext.  Packages which
 # only use the library should use install instead.
-#
-# We must not install the libintl.h/libintl.a files if we are on a system
-# which has the gettext() function in its C library or in a separate
-# library.  A special case is where configure found a previously installed
-# GNU gettext library.  If you want to use the one which comes with this
-# version of the package, you have to use `configure --with-gnu-gettext'.
-install-src: install
-       $(top_srcdir)/mkinstalldirs $(libdir) $(includedir) $(gettextsrcdir)
-       if test -f libintl.h; then \
-         $(INSTALL_DATA) $(srcdir)/libintl.inst \
-           $(includedir)/libintl.h; \
+
+# We must not install the libintl.h/libintl.a files if we are on a
+# system which has the gettext() function in its C library or in a
+# separate library or use the catgets interface.  A special case is
+# where configure found a previously installed GNU gettext library.
+# If you want to use the one which comes with this version of the
+# package, you have to use `configure --with-included-gettext'.
+install: install-exec install-data
+install-exec: all
+       if test "$(PACKAGE)" = "gettext" \
+          && test '@INTLOBJS@' = '$(GETTOBJS)'; then \
+         if test -r $(MKINSTALLDIRS); then \
+           $(MKINSTALLDIRS) $(libdir) $(includedir); \
+         else \
+           $(top_srcdir)/mkinstalldirs $(libdir) $(includedir); \
+         fi; \
+         $(INSTALL_DATA) intlh.inst $(includedir)/libintl.h; \
          $(INSTALL_DATA) libintl.a $(libdir)/libintl.a; \
          $(INSTALL_DATA) libintl.a $(libdir)/libintl.a; \
+       else \
+         : ; \
+       fi
+install-data: all
+       if test "$(PACKAGE)" = "gettext"; then \
+         if test -r $(MKINSTALLDIRS); then \
+           $(MKINSTALLDIRS) $(gettextsrcdir); \
+         else \
+           $(top_srcdir)/mkinstalldirs $(gettextsrcdir); \
+         fi; \
+         $(INSTALL_DATA) VERSION $(gettextsrcdir)/VERSION; \
+         dists="$(DISTFILES.common)"; \
+         for file in $$dists; do \
+           $(INSTALL_DATA) $(srcdir)/$$file $(gettextsrcdir)/$$file; \
+         done; \
+       else \
+         : ; \
        fi
        fi
-       cd $(srcdir) && \
-       for file in $(DISTFILES.common); do \
-         $(INSTALL_DATA) $$file $(gettextsrcdir)/intl-$$file; \
-       done
-       $(INSTALL_DATA) VERSION $(gettextsrcdir)/intl-VERSION
+
+# Define this as empty until I found a useful application.
+installcheck:
 
 uninstall:
 
 uninstall:
-       for file in $(DISTFILES); do \
-         rm -f $(gettextsrcdir)/intl-$$file; \
+       dists="$(DISTFILES.common)"; \
+       for file in $$dists; do \
+         rm -f $(gettextsrcdir)/$$file; \
        done
 
 info dvi:
 
 $(OBJECTS): ../config.h libgettext.h
        done
 
 info dvi:
 
 $(OBJECTS): ../config.h libgettext.h
-bindtextdom.o finddomain.o loadmsgcat.o: gettextP.h gettext.h
-dcgettext.o: gettextP.h gettext.h hash-string.h
+bindtextdom.$lo finddomain.$lo loadmsgcat.$lo: gettextP.h gettext.h loadinfo.h
+dcgettext.$lo: gettextP.h gettext.h hash-string.h loadinfo.h
 
 tags: TAGS
 
 
 tags: TAGS
 
@@ -127,7 +166,7 @@ ID: $(HEADERS) $(SOURCES)
 
 
 mostlyclean:
 
 
 mostlyclean:
-       rm -f *.a *.o core core.*
+       rm -f *.a *.o *.lo core core.*
 
 clean: mostlyclean
 
 
 clean: mostlyclean
 
@@ -139,18 +178,16 @@ maintainer-clean: distclean
        @echo "it deletes files that may require special tools to rebuild."
 
 
        @echo "it deletes files that may require special tools to rebuild."
 
 
+# GNU gettext needs not contain the file `VERSION' but contains some
+# other files which should not be distributed in other packages.
 distdir = ../$(PACKAGE)-$(VERSION)/$(subdir)
 distdir = ../$(PACKAGE)-$(VERSION)/$(subdir)
-distdir dist: Makefile $(DISTFILES)
-       for file in $(DISTFILES); do \
-         ln $(srcdir)/$$file $(distdir) 2> /dev/null \
-           || cp -p $(srcdir)/$$file $(distdir); \
-       done
-
-# This dist goal is only used in GNU gettext.  GNU gettext needs not contain
-# the file `VERSION' but contains some other files which should not be
-# distributed in other packages.
-dist-gettext: Makefile $(DISTFILES.gettext)
-       for file in $(DISTFILES.gettext); do \
+dist distdir: Makefile $(DISTFILES)
+       if test "$(PACKAGE)" = gettext; then \
+         additional="$(DISTFILES.gettext)"; \
+       else \
+         additional="$(DISTFILES.normal)"; \
+       fi; \
+       for file in $(DISTFILES.common) $$additional; do \
          ln $(srcdir)/$$file $(distdir) 2> /dev/null \
            || cp -p $(srcdir)/$$file $(distdir); \
        done
          ln $(srcdir)/$$file $(distdir) 2> /dev/null \
            || cp -p $(srcdir)/$$file $(distdir); \
        done
@@ -159,7 +196,18 @@ dist-libc:
        tar zcvf intl-glibc.tar.gz $(COMSRCS) $(COMHDRS) libintl.h.glibc
 
 Makefile: Makefile.in ../config.status
        tar zcvf intl-glibc.tar.gz $(COMSRCS) $(COMHDRS) libintl.h.glibc
 
 Makefile: Makefile.in ../config.status
-       cd .. && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= ./config.status
+       cd .. \
+         && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+# The dependency for intlh.inst is different in gettext and all other
+# packages.  Because we cannot you GNU make features we have to solve
+# the problem while rewriting Makefile.in.
+@GT_YES@intlh.inst: intlh.inst.in ../config.status
+@GT_YES@       cd .. \
+@GT_YES@       && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= \
+@GT_YES@         $(SHELL) ./config.status
+@GT_NO@.PHONY: intlh.inst
+@GT_NO@intlh.inst:
 
 # Tell versions [3.59,3.63) of GNU make not to export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 
 # Tell versions [3.59,3.63) of GNU make not to export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
index cf0454e..d31950a 100644 (file)
@@ -1 +1 @@
-GNU gettext library from gettext-0.10
+GNU gettext library from gettext-0.10.32
index bd9f422..9fcb8d9 100644 (file)
@@ -1,19 +1,19 @@
-/* bindtextdom.c -- implementation of the bindtextdomain(3) function
-   Copyright (C) 1995 Free Software Foundation, Inc.
+/* Implementation of the bindtextdomain(3) function
+   Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
 
 
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
 
 
-This program 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 General Public License for more details.
+   This program 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 General Public License for more details.
 
 
-You should have received a copy of the GNU General Public License
-along with this program; 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 General Public License
+   along with this program; 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>
 
 #ifdef HAVE_CONFIG_H
 # include <config.h>
@@ -33,6 +33,9 @@ void free ();
 # include <string.h>
 #else
 # include <strings.h>
 # include <string.h>
 #else
 # include <strings.h>
+# ifndef memcpy
+#  define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num)
+# endif
 #endif
 
 #ifdef _LIBC
 #endif
 
 #ifdef _LIBC
@@ -58,6 +61,7 @@ extern struct binding *_nl_domain_bindings;
    prefix.  So we have to make a difference here.  */
 #ifdef _LIBC
 # define BINDTEXTDOMAIN __bindtextdomain
    prefix.  So we have to make a difference here.  */
 #ifdef _LIBC
 # define BINDTEXTDOMAIN __bindtextdomain
+# define strdup(str) __strdup (str)
 #else
 # define BINDTEXTDOMAIN bindtextdomain__
 #endif
 #else
 # define BINDTEXTDOMAIN bindtextdomain__
 #endif
@@ -95,25 +99,36 @@ BINDTEXTDOMAIN (domainname, dirname)
 
   if (binding != NULL)
     {
 
   if (binding != NULL)
     {
-      /* The domain is already bound.  Replace the old binding.  */
-      char *new_dirname;
-
-      if (strcmp (dirname, _nl_default_dirname) == 0)
-       new_dirname = (char *) _nl_default_dirname;
-      else
+      /* The domain is already bound.  If the new value and the old
+        one are equal we simply do nothing.  Otherwise replace the
+        old binding.  */
+      if (strcmp (dirname, binding->dirname) != 0)
        {
        {
-         size_t len = strlen (dirname) + 1;
-         new_dirname = (char *) malloc (len);
-         if (new_dirname == NULL)
-           return NULL;
+         char *new_dirname;
+
+         if (strcmp (dirname, _nl_default_dirname) == 0)
+           new_dirname = (char *) _nl_default_dirname;
+         else
+           {
+#if defined _LIBC || defined HAVE_STRDUP
+             new_dirname = strdup (dirname);
+             if (new_dirname == NULL)
+               return NULL;
+#else
+             size_t len = strlen (dirname) + 1;
+             new_dirname = (char *) malloc (len);
+             if (new_dirname == NULL)
+               return NULL;
 
 
-         memcpy (new_dirname, dirname, len);
-       }
+             memcpy (new_dirname, dirname, len);
+#endif
+           }
 
 
-      if (strcmp (binding->dirname, _nl_default_dirname) != 0)
-        free (binding->dirname);
+         if (binding->dirname != _nl_default_dirname)
+           free (binding->dirname);
 
 
-      binding->dirname = new_dirname;
+         binding->dirname = new_dirname;
+       }
     }
   else
     {
     }
   else
     {
@@ -125,21 +140,33 @@ BINDTEXTDOMAIN (domainname, dirname)
       if (new_binding == NULL)
        return NULL;
 
       if (new_binding == NULL)
        return NULL;
 
+#if defined _LIBC || defined HAVE_STRDUP
+      new_binding->domainname = strdup (domainname);
+      if (new_binding->domainname == NULL)
+       return NULL;
+#else
       len = strlen (domainname) + 1;
       new_binding->domainname = (char *) malloc (len);
       if (new_binding->domainname == NULL)
       len = strlen (domainname) + 1;
       new_binding->domainname = (char *) malloc (len);
       if (new_binding->domainname == NULL)
-         return NULL;
+       return NULL;
       memcpy (new_binding->domainname, domainname, len);
       memcpy (new_binding->domainname, domainname, len);
+#endif
 
       if (strcmp (dirname, _nl_default_dirname) == 0)
        new_binding->dirname = (char *) _nl_default_dirname;
       else
        {
 
       if (strcmp (dirname, _nl_default_dirname) == 0)
        new_binding->dirname = (char *) _nl_default_dirname;
       else
        {
+#if defined _LIBC || defined HAVE_STRDUP
+         new_binding->dirname = strdup (dirname);
+         if (new_binding->dirname == NULL)
+           return NULL;
+#else
          len = strlen (dirname) + 1;
          new_binding->dirname = (char *) malloc (len);
          if (new_binding->dirname == NULL)
            return NULL;
          memcpy (new_binding->dirname, dirname, len);
          len = strlen (dirname) + 1;
          new_binding->dirname = (char *) malloc (len);
          if (new_binding->dirname == NULL)
            return NULL;
          memcpy (new_binding->dirname, dirname, len);
+#endif
        }
 
       /* Now enqueue it.  */
        }
 
       /* Now enqueue it.  */
index 39fcfb4..867d901 100644 (file)
@@ -1,20 +1,19 @@
 /* Compatibility code for gettext-using-catgets interface.
 /* Compatibility code for gettext-using-catgets interface.
-   Copyright (C) 1995 Free Software Foundation, Inc.
+   Copyright (C) 1995, 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.
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, 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.
+   This program 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 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 General Public License
+   along with this program; 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>
 
 #ifdef HAVE_CONFIG_H
 # include <config.h>
@@ -40,6 +39,16 @@ char *getenv ();
 
 /* @@ end of prolog @@ */
 
 
 /* @@ end of prolog @@ */
 
+/* XPG3 defines the result of `setlocale (category, NULL)' as:
+   ``Directs `setlocale()' to query `category' and return the current
+     setting of `local'.''
+   However it does not specify the exact format.  And even worse: POSIX
+   defines this not at all.  So we can use this feature only on selected
+   system (e.g. those using GNU C Library).  */
+#ifdef _LIBC
+# define HAVE_LOCALE_NULL
+#endif
+
 /* The catalog descriptor.  */
 static nl_catd catalog = (nl_catd) -1;
 
 /* The catalog descriptor.  */
 static nl_catd catalog = (nl_catd) -1;
 
@@ -50,11 +59,11 @@ static const char default_catalog_name[] = "messages";
 static const char *catalog_name = default_catalog_name;
 
 /* Get ID for given string.  If not found return -1.  */
 static const char *catalog_name = default_catalog_name;
 
 /* Get ID for given string.  If not found return -1.  */
-static int msg_to_cat_id __P ((const char *msg));
+static int msg_to_cat_id PARAMS ((const char *msg));
 
 /* Substitution for systems lacking this function in their C library.  */
 #if !_LIBC && !HAVE_STPCPY
 
 /* Substitution for systems lacking this function in their C library.  */
 #if !_LIBC && !HAVE_STPCPY
-static char *stpcpy __P ((char *dest, const char *src));
+static char *stpcpy PARAMS ((char *dest, const char *src));
 #endif
 
 
 #endif
 
 
@@ -68,7 +77,8 @@ textdomain (domainname)
   size_t new_name_len;
   char *lang;
 
   size_t new_name_len;
   char *lang;
 
-#if HAVE_SETLOCALE && HAVE_LC_MESSAGES && HAVE_SETLOCALE_NULL
+#if defined HAVE_SETLOCALE && defined HAVE_LC_MESSAGES \
+    && defined HAVE_LOCALE_NULL
   lang = setlocale (LC_MESSAGES, NULL);
 #else
   lang = getenv ("LC_ALL");
   lang = setlocale (LC_MESSAGES, NULL);
 #else
   lang = getenv ("LC_ALL");
index 911bc5c..a316bfd 100644 (file)
@@ -1,19 +1,19 @@
-/* dcgettext.c -- implemenatation of the dcgettext(3) function
-   Copyright (C) 1995 Free Software Foundation, Inc.
+/* Implementation of the dcgettext(3) function
+   Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
 
 
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
 
 
-This program 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 General Public License for more details.
+   This program 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 General Public License for more details.
 
 
-You should have received a copy of the GNU General Public License
-along with this program; 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 General Public License
+   along with this program; 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>
 
 #ifdef HAVE_CONFIG_H
 # include <config.h>
@@ -23,6 +23,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 #ifdef __GNUC__
 # define alloca __builtin_alloca
 
 #ifdef __GNUC__
 # define alloca __builtin_alloca
+# define HAVE_ALLOCA 1
 #else
 # if defined HAVE_ALLOCA_H || defined _LIBC
 #  include <alloca.h>
 #else
 # if defined HAVE_ALLOCA_H || defined _LIBC
 #  include <alloca.h>
@@ -41,6 +42,9 @@ char *alloca ();
 #ifndef errno
 extern int errno;
 #endif
 #ifndef errno
 extern int errno;
 #endif
+#ifndef __set_errno
+# define __set_errno(val) errno = (val)
+#endif
 
 #if defined STDC_HEADERS || defined _LIBC
 # include <stdlib.h>
 
 #if defined STDC_HEADERS || defined _LIBC
 # include <stdlib.h>
@@ -54,6 +58,9 @@ void free ();
 #endif
 
 #if defined HAVE_STRING_H || defined _LIBC
 #endif
 
 #if defined HAVE_STRING_H || defined _LIBC
+# ifndef _GNU_SOURCE
+#  define _GNU_SOURCE  1
+# endif
 # include <string.h>
 #else
 # include <strings.h>
 # include <string.h>
 #else
 # include <strings.h>
@@ -85,13 +92,16 @@ void free ();
    file and the name space must not be polluted.  */
 # define getcwd __getcwd
 # define stpcpy __stpcpy
    file and the name space must not be polluted.  */
 # define getcwd __getcwd
 # define stpcpy __stpcpy
-#endif
-
-#if !defined HAVE_GETCWD && !defined _LIBC
-char *getwd ();
-# define getcwd(buf, max) getwd (buf)
 #else
 #else
+# if !defined HAVE_GETCWD
+char *getwd ();
+#  define getcwd(buf, max) getwd (buf)
+# else
 char *getcwd ();
 char *getcwd ();
+# endif
+# ifndef HAVE_STPCPY
+static char *stpcpy PARAMS ((char *dest, const char *src));
+# endif
 #endif
 
 /* Amount to increase buffer size by in each try.  */
 #endif
 
 /* Amount to increase buffer size by in each try.  */
@@ -151,10 +161,47 @@ const char _nl_default_dirname[] = GNULOCALEDIR;
 struct binding *_nl_domain_bindings;
 
 /* Prototypes for local functions.  */
 struct binding *_nl_domain_bindings;
 
 /* Prototypes for local functions.  */
-static char *find_msg __P ((struct loaded_domain *domain, const char *msgid));
-static const char *category_to_name __P((int category));
-static const char *guess_category_value __P((int category,
-                                            const char *categoryname));
+static char *find_msg PARAMS ((struct loaded_l10nfile *domain_file,
+                              const char *msgid));
+static const char *category_to_name PARAMS ((int category));
+static const char *guess_category_value PARAMS ((int category,
+                                                const char *categoryname));
+
+
+/* For those loosing systems which don't have `alloca' we have to add
+   some additional code emulating it.  */
+#ifdef HAVE_ALLOCA
+/* Nothing has to be done.  */
+# define ADD_BLOCK(list, address) /* nothing */
+# define FREE_BLOCKS(list) /* nothing */
+#else
+struct block_list
+{
+  void *address;
+  struct block_list *next;
+};
+# define ADD_BLOCK(list, addr)                                               \
+  do {                                                                       \
+    struct block_list *newp = (struct block_list *) malloc (sizeof (*newp));  \
+    /* If we cannot get a free block we cannot add the new element to        \
+       the list.  */                                                         \
+    if (newp != NULL) {                                                              \
+      newp->address = (addr);                                                \
+      newp->next = (list);                                                   \
+      (list) = newp;                                                         \
+    }                                                                        \
+  } while (0)
+# define FREE_BLOCKS(list)                                                   \
+  do {                                                                       \
+    while (list != NULL) {                                                   \
+      struct block_list *old = list;                                         \
+      list = list->next;                                                     \
+      free (old);                                                            \
+    }                                                                        \
+  } while (0)
+# undef alloca
+# define alloca(size) (malloc (size))
+#endif /* have alloca */
 
 
 /* Names for the libintl functions are a problem.  They must not clash
 
 
 /* Names for the libintl functions are a problem.  They must not clash
@@ -175,13 +222,17 @@ DCGETTEXT (domainname, msgid, category)
      const char *msgid;
      int category;
 {
      const char *msgid;
      int category;
 {
-  struct loaded_domain *domain;
+#ifndef HAVE_ALLOCA
+  struct block_list *block_list = NULL;
+#endif
+  struct loaded_l10nfile *domain;
   struct binding *binding;
   const char *categoryname;
   const char *categoryvalue;
   char *dirname, *xdomainname;
   char *single_locale;
   char *retval;
   struct binding *binding;
   const char *categoryname;
   const char *categoryvalue;
   char *dirname, *xdomainname;
   char *single_locale;
   char *retval;
+  int saved_errno = errno;
 
   /* If no real MSGID is given return NULL.  */
   if (msgid == NULL)
 
   /* If no real MSGID is given return NULL.  */
   if (msgid == NULL)
@@ -223,30 +274,27 @@ DCGETTEXT (domainname, msgid, category)
       path_max += 2;           /* The getcwd docs say to do this.  */
 
       dirname = (char *) alloca (path_max + dirname_len);
       path_max += 2;           /* The getcwd docs say to do this.  */
 
       dirname = (char *) alloca (path_max + dirname_len);
+      ADD_BLOCK (block_list, dirname);
 
 
-      errno = 0;
+      __set_errno (0);
       while ((ret = getcwd (dirname, path_max)) == NULL && errno == ERANGE)
        {
          path_max += PATH_INCR;
          dirname = (char *) alloca (path_max + dirname_len);
       while ((ret = getcwd (dirname, path_max)) == NULL && errno == ERANGE)
        {
          path_max += PATH_INCR;
          dirname = (char *) alloca (path_max + dirname_len);
-         errno = 0;
+         ADD_BLOCK (block_list, dirname);
+         __set_errno (0);
        }
 
       if (ret == NULL)
        }
 
       if (ret == NULL)
-       /* We cannot get the current working directory.  Don't signal an
-          error but simply return the default string.  */
-       return (char *) msgid;
-
-      /* We don't want libintl.a to depend on any other library.  So
-        we avoid the non-standard function stpcpy.  In GNU C Library
-        this function is available, though.  Also allow the symbol
-        HAVE_STPCPY to be defined.  */
-#if defined _LIBC || defined HAVE_STPCPY
+       {
+         /* We cannot get the current working directory.  Don't signal an
+            error but simply return the default string.  */
+         FREE_BLOCKS (block_list);
+         __set_errno (saved_errno);
+         return (char *) msgid;
+       }
+
       stpcpy (stpcpy (strchr (dirname, '\0'), "/"), binding->dirname);
       stpcpy (stpcpy (strchr (dirname, '\0'), "/"), binding->dirname);
-#else
-      strcat (dirname, "/");
-      strcat (dirname, binding->dirname);
-#endif
     }
 
   /* Now determine the symbolic name of CATEGORY and its value.  */
     }
 
   /* Now determine the symbolic name of CATEGORY and its value.  */
@@ -255,23 +303,15 @@ DCGETTEXT (domainname, msgid, category)
 
   xdomainname = (char *) alloca (strlen (categoryname)
                                 + strlen (domainname) + 5);
 
   xdomainname = (char *) alloca (strlen (categoryname)
                                 + strlen (domainname) + 5);
-  /* We don't want libintl.a to depend on any other library.  So we
-     avoid the non-standard function stpcpy.  In GNU C Library this
-     function is available, though.  Also allow the symbol HAVE_STPCPY
-     to be defined.  */
-#if defined _LIBC || defined HAVE_STPCPY
+  ADD_BLOCK (block_list, xdomainname);
+
   stpcpy (stpcpy (stpcpy (stpcpy (xdomainname, categoryname), "/"),
                  domainname),
          ".mo");
   stpcpy (stpcpy (stpcpy (stpcpy (xdomainname, categoryname), "/"),
                  domainname),
          ".mo");
-#else
-  strcpy (xdomainname, categoryname);
-  strcat (xdomainname, "/");
-  strcat (xdomainname, domainname);
-  strcat (xdomainname, ".mo");
-#endif
 
   /* Creating working area.  */
   single_locale = (char *) alloca (strlen (categoryvalue) + 1);
 
   /* Creating working area.  */
   single_locale = (char *) alloca (strlen (categoryvalue) + 1);
+  ADD_BLOCK (block_list, single_locale);
 
 
   /* Search for the given string.  This is a loop because we perhaps
 
 
   /* Search for the given string.  This is a loop because we perhaps
@@ -285,7 +325,7 @@ DCGETTEXT (domainname, msgid, category)
        {
          /* The whole contents of CATEGORYVALUE has been searched but
             no valid entry has been found.  We solve this situation
        {
          /* The whole contents of CATEGORYVALUE has been searched but
             no valid entry has been found.  We solve this situation
-            by implicitely appending a "C" entry, i.e. no translation
+            by implicitly appending a "C" entry, i.e. no translation
             will take place.  */
          single_locale[0] = 'C';
          single_locale[1] = '\0';
             will take place.  */
          single_locale[0] = 'C';
          single_locale[1] = '\0';
@@ -302,7 +342,11 @@ DCGETTEXT (domainname, msgid, category)
         domain.  Return the MSGID.  */
       if (strcmp (single_locale, "C") == 0
          || strcmp (single_locale, "POSIX") == 0)
         domain.  Return the MSGID.  */
       if (strcmp (single_locale, "C") == 0
          || strcmp (single_locale, "POSIX") == 0)
-       return (char *) msgid;
+       {
+         FREE_BLOCKS (block_list);
+         __set_errno (saved_errno);
+         return (char *) msgid;
+       }
 
 
       /* Find structure describing the message catalog matching the
 
 
       /* Find structure describing the message catalog matching the
@@ -327,7 +371,11 @@ DCGETTEXT (domainname, msgid, category)
            }
 
          if (retval != NULL)
            }
 
          if (retval != NULL)
-           return retval;
+           {
+             FREE_BLOCKS (block_list);
+             __set_errno (saved_errno);
+             return retval;
+           }
        }
     }
   /* NOTREACHED */
        }
     }
   /* NOTREACHED */
@@ -340,18 +388,21 @@ weak_alias (__dcgettext, dcgettext);
 
 
 static char *
 
 
 static char *
-find_msg (domain, msgid)
-     struct loaded_domain *domain;
+find_msg (domain_file, msgid)
+     struct loaded_l10nfile *domain_file;
      const char *msgid;
 {
   size_t top, act, bottom;
      const char *msgid;
 {
   size_t top, act, bottom;
+  struct loaded_domain *domain;
 
 
-  if (domain->decided == 0)
-    _nl_load_domain (domain);
+  if (domain_file->decided == 0)
+    _nl_load_domain (domain_file);
 
 
-  if (domain->data == NULL)
+  if (domain_file->data == NULL)
     return NULL;
 
     return NULL;
 
+  domain = (struct loaded_domain *) domain_file->data;
+
   /* Locate the MSGID and its translation.  */
   if (domain->hash_size > 2 && domain->hash_tab != NULL)
     {
   /* Locate the MSGID and its translation.  */
   if (domain->hash_size > 2 && domain->hash_tab != NULL)
     {
@@ -375,8 +426,8 @@ find_msg (domain, msgid)
 
       while (1)
        {
 
       while (1)
        {
-         if (idx >= W (domain->must_swap, domain->hash_size) - incr)
-           idx -= W (domain->must_swap, domain->hash_size) - incr;
+         if (idx >= domain->hash_size - incr)
+           idx -= domain->hash_size - incr;
          else
            idx += incr;
 
          else
            idx += incr;
 
@@ -424,7 +475,8 @@ find_msg (domain, msgid)
 
 
 /* Return string representation of locale CATEGORY.  */
 
 
 /* Return string representation of locale CATEGORY.  */
-static const char *category_to_name (category)
+static const char *
+category_to_name (category)
      int category;
 {
   const char *retval;
      int category;
 {
   const char *retval;
@@ -482,7 +534,8 @@ static const char *category_to_name (category)
 }
 
 /* Guess value of current locale from value of the environment variables.  */
 }
 
 /* Guess value of current locale from value of the environment variables.  */
-static const char *guess_category_value (category, categoryname)
+static const char *
+guess_category_value (category, categoryname)
      int category;
      const char *categoryname;
 {
      int category;
      const char *categoryname;
 {
@@ -520,3 +573,21 @@ static const char *guess_category_value (category, categoryname)
   return "C";
 #endif
 }
   return "C";
 #endif
 }
+
+/* @@ begin of epilog @@ */
+
+/* We don't want libintl.a to depend on any other library.  So we
+   avoid the non-standard function stpcpy.  In GNU C Library this
+   function is available, though.  Also allow the symbol HAVE_STPCPY
+   to be defined.  */
+#if !_LIBC && !HAVE_STPCPY
+static char *
+stpcpy (dest, src)
+     char *dest;
+     const char *src;
+{
+  while ((*dest++ = *src++) != '\0')
+    /* Do nothing. */ ;
+  return dest - 1;
+}
+#endif
diff --git a/intl/explodename.c b/intl/explodename.c
new file mode 100644 (file)
index 0000000..37c46e9
--- /dev/null
@@ -0,0 +1,181 @@
+/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+   Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program 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 General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; 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>
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+
+#include "loadinfo.h"
+
+/* On some strange systems still no definition of NULL is found.  Sigh!  */
+#ifndef NULL
+# if defined __STDC__ && __STDC__
+#  define NULL ((void *) 0)
+# else
+#  define NULL 0
+# endif
+#endif
+
+/* @@ end of prolog @@ */
+
+int
+_nl_explode_name (name, language, modifier, territory, codeset,
+                 normalized_codeset, special, sponsor, revision)
+     char *name;
+     const char **language;
+     const char **modifier;
+     const char **territory;
+     const char **codeset;
+     const char **normalized_codeset;
+     const char **special;
+     const char **sponsor;
+     const char **revision;
+{
+  enum { undecided, xpg, cen } syntax;
+  char *cp;
+  int mask;
+
+  *modifier = NULL;
+  *territory = NULL;
+  *codeset = NULL;
+  *normalized_codeset = NULL;
+  *special = NULL;
+  *sponsor = NULL;
+  *revision = NULL;
+
+  /* Now we determine the single parts of the locale name.  First
+     look for the language.  Termination symbols are `_' and `@' if
+     we use XPG4 style, and `_', `+', and `,' if we use CEN syntax.  */
+  mask = 0;
+  syntax = undecided;
+  *language = cp = name;
+  while (cp[0] != '\0' && cp[0] != '_' && cp[0] != '@'
+        && cp[0] != '+' && cp[0] != ',')
+    ++cp;
+
+  if (*language == cp)
+    /* This does not make sense: language has to be specified.  Use
+       this entry as it is without exploding.  Perhaps it is an alias.  */
+    cp = strchr (*language, '\0');
+  else if (cp[0] == '_')
+    {
+      /* Next is the territory.  */
+      cp[0] = '\0';
+      *territory = ++cp;
+
+      while (cp[0] != '\0' && cp[0] != '.' && cp[0] != '@'
+            && cp[0] != '+' && cp[0] != ',' && cp[0] != '_')
+       ++cp;
+
+      mask |= TERRITORY;
+
+      if (cp[0] == '.')
+       {
+         /* Next is the codeset.  */
+         syntax = xpg;
+         cp[0] = '\0';
+         *codeset = ++cp;
+
+         while (cp[0] != '\0' && cp[0] != '@')
+           ++cp;
+
+         mask |= XPG_CODESET;
+
+         if (*codeset != cp && (*codeset)[0] != '\0')
+           {
+             *normalized_codeset = _nl_normalize_codeset (*codeset,
+                                                          cp - *codeset);
+             if (strcmp (*codeset, *normalized_codeset) == 0)
+               free ((char *) *normalized_codeset);
+             else
+               mask |= XPG_NORM_CODESET;
+           }
+       }
+    }
+
+  if (cp[0] == '@' || (syntax != xpg && cp[0] == '+'))
+    {
+      /* Next is the modifier.  */
+      syntax = cp[0] == '@' ? xpg : cen;
+      cp[0] = '\0';
+      *modifier = ++cp;
+
+      while (syntax == cen && cp[0] != '\0' && cp[0] != '+'
+            && cp[0] != ',' && cp[0] != '_')
+       ++cp;
+
+      mask |= XPG_MODIFIER | CEN_AUDIENCE;
+    }
+
+  if (syntax != xpg && (cp[0] == '+' || cp[0] == ',' || cp[0] == '_'))
+    {
+      syntax = cen;
+
+      if (cp[0] == '+')
+       {
+         /* Next is special application (CEN syntax).  */
+         cp[0] = '\0';
+         *special = ++cp;
+
+         while (cp[0] != '\0' && cp[0] != ',' && cp[0] != '_')
+           ++cp;
+
+         mask |= CEN_SPECIAL;
+       }
+
+      if (cp[0] == ',')
+       {
+         /* Next is sponsor (CEN syntax).  */
+         cp[0] = '\0';
+         *sponsor = ++cp;
+
+         while (cp[0] != '\0' && cp[0] != '_')
+           ++cp;
+
+         mask |= CEN_SPONSOR;
+       }
+
+      if (cp[0] == '_')
+       {
+         /* Next is revision (CEN syntax).  */
+         cp[0] = '\0';
+         *revision = ++cp;
+
+         mask |= CEN_REVISION;
+       }
+    }
+
+  /* For CEN syntax values it might be important to have the
+     separator character in the file name, not for XPG syntax.  */
+  if (syntax == xpg)
+    {
+      if (*territory != NULL && (*territory)[0] == '\0')
+       mask &= ~TERRITORY;
+
+      if (*codeset != NULL && (*codeset)[0] == '\0')
+       mask &= ~XPG_CODESET;
+
+      if (*modifier != NULL && (*modifier)[0] == '\0')
+       mask &= ~XPG_MODIFIER;
+    }
+
+  return mask;
+}
index 007a87e..ec85d4d 100644 (file)
@@ -1,25 +1,26 @@
-/* finddomain.c -- handle list of needed message catalogs
-   Copyright (C) 1995 Software Foundation, Inc.
+/* Handle list of needed message catalogs
+   Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
    Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
 
    Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
 
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
 
 
-This program 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 General Public License for more details.
+   This program 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 General Public License for more details.
 
 
-You should have received a copy of the GNU General Public License
-along with this program; 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 General Public License
+   along with this program; 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>
 #endif
 
 
 #ifdef HAVE_CONFIG_H
 # include <config.h>
 #endif
 
+#include <ctype.h>
 #include <errno.h>
 #include <stdio.h>
 #include <sys/types.h>
 #include <errno.h>
 #include <stdio.h>
 #include <sys/types.h>
@@ -38,6 +39,9 @@ void free ();
 # include <string.h>
 #else
 # include <strings.h>
 # include <string.h>
 #else
 # include <strings.h>
+# ifndef memcpy
+#  define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num)
+# endif
 #endif
 #if !HAVE_STRCHR && !defined _LIBC
 # ifndef strchr
 #endif
 #if !HAVE_STRCHR && !defined _LIBC
 # ifndef strchr
@@ -58,80 +62,38 @@ void free ();
 #endif
 
 /* @@ end of prolog @@ */
 #endif
 
 /* @@ end of prolog @@ */
-
-#ifdef _LIBC
-/* Rename the non ANSI C functions.  This is required by the standard
-   because some ANSI C functions will require linking with this object
-   file and the name space must not be polluted.  */
-# define stpcpy __stpcpy
-#endif
-
-/* Encoding of locale name parts.  */
-#define CEN_REVISION   1
-#define CEN_SPONSOR    2
-#define CEN_SPECIAL    4
-#define XPG_CODESET    8
-#define TERRITORY      16
-#define CEN_AUDIENCE   32
-#define XPG_MODIFIER   64
-
-#define CEN_SPECIFIC   (CEN_REVISION|CEN_SPONSOR|CEN_SPECIAL|CEN_AUDIENCE)
-#define XPG_SPECIFIC   (XPG_CODESET|XPG_MODIFIER)
-
-
 /* List of already loaded domains.  */
 /* List of already loaded domains.  */
-static struct loaded_domain *_nl_loaded_domains;
-
-/* Prototypes for local functions.  */
-static struct loaded_domain *make_entry_rec __P ((const char *dirname,
-                                                 int mask,
-                                                 const char *language,
-                                                 const char *territory,
-                                                 const char *codeset,
-                                                 const char *modifier,
-                                                 const char *special,
-                                                 const char *sponsor,
-                                                 const char *revision,
-                                                 const char *domainname,
-                                                 int do_allocate));
-
-/* Substitution for systems lacking this function in their C library.  */
-#if !_LIBC && !HAVE_STPCPY
-static char *stpcpy __P ((char *dest, const char *src));
-#endif
+static struct loaded_l10nfile *_nl_loaded_domains;
 
 
 /* Return a data structure describing the message catalog described by
    the DOMAINNAME and CATEGORY parameters with respect to the currently
    established bindings.  */
 
 
 /* Return a data structure describing the message catalog described by
    the DOMAINNAME and CATEGORY parameters with respect to the currently
    established bindings.  */
-struct loaded_domain *
+struct loaded_l10nfile *
 _nl_find_domain (dirname, locale, domainname)
      const char *dirname;
      char *locale;
      const char *domainname;
 {
 _nl_find_domain (dirname, locale, domainname)
      const char *dirname;
      char *locale;
      const char *domainname;
 {
-  enum { undecided, xpg, cen } syntax;
-  struct loaded_domain *retval;
+  struct loaded_l10nfile *retval;
   const char *language;
   const char *language;
-  const char *modifier = NULL;
-  const char *territory = NULL;
-  const char *codeset = NULL;
-  const char *special = NULL;
-  const char *sponsor = NULL;
-  const char *revision = NULL;
-  const char *alias_value = NULL;
-  char *cp;
+  const char *modifier;
+  const char *territory;
+  const char *codeset;
+  const char *normalized_codeset;
+  const char *special;
+  const char *sponsor;
+  const char *revision;
+  const char *alias_value;
   int mask;
 
   int mask;
 
-  /* CATEGORYVALUE now possibly contains a colon separated list of
-     locales.  Each single locale can consist of up to four recognized
-     parts for the XPG syntax:
+  /* LOCALE can consist of up to four recognized parts for the XPG syntax:
 
                language[_territory[.codeset]][@modifier]
 
      and six parts for the CEN syntax:
 
 
                language[_territory[.codeset]][@modifier]
 
      and six parts for the CEN syntax:
 
-       language[_territory][+audience][+special][,sponsor][_revision]
+       language[_territory][+audience][+special][,[sponsor][_revision]]
 
      Beside the first all of them are allowed to be missing.  If the
      full specified locale is not found, the less specific one are
 
      Beside the first all of them are allowed to be missing.  If the
      full specified locale is not found, the less specific one are
@@ -141,21 +103,23 @@ _nl_find_domain (dirname, locale, domainname)
                (2) sponsor
                (3) special
                (4) codeset
                (2) sponsor
                (3) special
                (4) codeset
-               (5) territory
-               (6) audience/modifier
+               (5) normalized codeset
+               (6) territory
+               (7) audience/modifier
    */
 
   /* If we have already tested for this locale entry there has to
      be one data set in the list of loaded domains.  */
    */
 
   /* If we have already tested for this locale entry there has to
      be one data set in the list of loaded domains.  */
-  retval = make_entry_rec (dirname, 0, locale, NULL, NULL, NULL,
-                          NULL, NULL, NULL, domainname, 0);
+  retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname,
+                              strlen (dirname) + 1, 0, locale, NULL, NULL,
+                              NULL, NULL, NULL, NULL, NULL, domainname, 0);
   if (retval != NULL)
     {
       /* We know something about this locale.  */
       int cnt;
 
       if (retval->decided == 0)
   if (retval != NULL)
     {
       /* We know something about this locale.  */
       int cnt;
 
       if (retval->decided == 0)
-       _nl_load_domain (retval); /* @@@ */
+       _nl_load_domain (retval);
 
       if (retval->data != NULL)
        return retval;
 
       if (retval->data != NULL)
        return retval;
@@ -168,8 +132,6 @@ _nl_find_domain (dirname, locale, domainname)
          if (retval->successor[cnt]->data != NULL)
            break;
        }
          if (retval->successor[cnt]->data != NULL)
            break;
        }
-
-      /* We really found some usable information.  */
       return cnt >= 0 ? retval : NULL;
       /* NOTREACHED */
     }
       return cnt >= 0 ? retval : NULL;
       /* NOTREACHED */
     }
@@ -191,114 +153,16 @@ _nl_find_domain (dirname, locale, domainname)
   /* Now we determine the single parts of the locale name.  First
      look for the language.  Termination symbols are `_' and `@' if
      we use XPG4 style, and `_', `+', and `,' if we use CEN syntax.  */
   /* Now we determine the single parts of the locale name.  First
      look for the language.  Termination symbols are `_' and `@' if
      we use XPG4 style, and `_', `+', and `,' if we use CEN syntax.  */
-  mask = 0;
-  syntax = undecided;
-  language = cp = locale;
-  while (cp[0] != '\0' && cp[0] != '_' && cp[0] != '@'
-        && cp[0] != '+' && cp[0] != ',')
-    ++cp;
-
-  if (language == cp)
-    /* This does not make sense: language has to be specified.  Use
-       this entry as it is without exploding.  Perhaps it is an alias.  */
-    cp = strchr (language, '\0');
-  else if (cp[0] == '_')
-    {
-      /* Next is the territory.  */
-      cp[0] = '\0';
-      territory = ++cp;
-
-      while (cp[0] != '\0' && cp[0] != '.' && cp[0] != '@'
-            && cp[0] != '+' && cp[0] != ',' && cp[0] != '_')
-       ++cp;
-
-      mask |= TERRITORY;
-
-      if (cp[0] == '.')
-       {
-         /* Next is the codeset.  */
-         syntax = xpg;
-         cp[0] = '\0';
-         codeset = ++cp;
-
-         while (cp[0] != '\0' && cp[0] != '@')
-           ++cp;
-
-         mask |= XPG_CODESET;
-       }
-    }
-
-  if (cp[0] == '@' || (syntax != xpg && cp[0] == '+'))
-    {
-      /* Next is the modifier.  */
-      syntax = cp[0] == '@' ? xpg : cen;
-      cp[0] = '\0';
-      modifier = ++cp;
-
-      while (syntax == cen && cp[0] != '\0' && cp[0] != '+'
-            && cp[0] != ',' && cp[0] != '_')
-       ++cp;
-
-      mask |= XPG_MODIFIER | CEN_AUDIENCE;
-    }
-
-  if (syntax != xpg && (cp[0] == '+' || cp[0] == ',' || cp[0] == '_'))
-    {
-      syntax = cen;
-
-      if (cp[0] == '+')
-       {
-         /* Next is special application (CEN syntax).  */
-         cp[0] = '\0';
-         special = ++cp;
-
-         while (cp[0] != '\0' && cp[0] != ',' && cp[0] != '_')
-           ++cp;
-
-         mask |= CEN_SPECIAL;
-       }
-
-      if (cp[0] == ',')
-       {
-         /* Next is sponsor (CEN syntax).  */
-         cp[0] = '\0';
-         sponsor = ++cp;
-
-         while (cp[0] != '\0' && cp[0] != '_')
-           ++cp;
-
-         mask |= CEN_SPONSOR;
-       }
-
-      if (cp[0] == '_')
-       {
-         /* Next is revision (CEN syntax).  */
-         cp[0] = '\0';
-         revision = ++cp;
-
-         mask |= CEN_REVISION;
-       }
-    }
-
-  /* For CEN sytnax values it might be important to have the
-     separator character in the file name, not for XPG syntax.  */
-  if (syntax == xpg)
-    {
-      if (territory != NULL && territory[0] == '\0')
-       mask &= ~TERRITORY;
-
-      if (codeset != NULL && codeset[0] == '\0')
-       mask &= ~XPG_CODESET;
-
-      if (modifier != NULL && modifier[0] == '\0')
-       mask &= ~XPG_MODIFIER;
-    }
+  mask = _nl_explode_name (locale, &language, &modifier, &territory,
+                          &codeset, &normalized_codeset, &special,
+                          &sponsor, &revision);
 
   /* Create all possible locale entries which might be interested in
 
   /* Create all possible locale entries which might be interested in
-     generalzation.  */
-  retval = make_entry_rec (dirname, mask, language, territory, codeset,
-                          modifier, special, sponsor, revision,
-                          domainname, 1);
+     generalization.  */
+  retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname,
+                              strlen (dirname) + 1, mask, language, territory,
+                              codeset, normalized_codeset, modifier, special,
+                              sponsor, revision, domainname, 1);
   if (retval == NULL)
     /* This means we are out of core.  */
     return NULL;
   if (retval == NULL)
     /* This means we are out of core.  */
     return NULL;
@@ -314,12 +178,7 @@ _nl_find_domain (dirname, locale, domainname)
            _nl_load_domain (retval->successor[cnt]);
          if (retval->successor[cnt]->data != NULL)
            break;
            _nl_load_domain (retval->successor[cnt]);
          if (retval->successor[cnt]->data != NULL)
            break;
-
-         /* Signal that locale is not available.  */
-         retval->successor[cnt] = NULL;
        }
        }
-      if (retval->successor[cnt] == NULL)
-       retval = NULL;
     }
 
   /* The room for an alias was dynamically allocated.  Free it now.  */
     }
 
   /* The room for an alias was dynamically allocated.  Free it now.  */
@@ -328,176 +187,3 @@ _nl_find_domain (dirname, locale, domainname)
 
   return retval;
 }
 
   return retval;
 }
-
-
-static struct loaded_domain *
-make_entry_rec (dirname, mask, language, territory, codeset, modifier,
-               special, sponsor, revision, domain, do_allocate)
-     const char *dirname;
-     int mask;
-     const char *language;
-     const char *territory;
-     const char *codeset;
-     const char *modifier;
-     const char *special;
-     const char *sponsor;
-     const char *revision;
-     const char *domain;
-     int do_allocate;
-{
-  char *filename = NULL;
-  struct loaded_domain *last = NULL;
-  struct loaded_domain *retval;
-  char *cp;
-  size_t entries;
-  int cnt;
-
-
-  /* Process the current entry described by the MASK only when it is
-     valid.  Because the mask can have in the first call bits from
-     both syntaces set this is necessary to prevent constructing
-     illegal local names.  */
-  /* FIXME: Rewrite because test is necessary only in first round.  */
-  if ((mask & CEN_SPECIFIC) == 0 || (mask & XPG_SPECIFIC) == 0)
-    {
-      /* Allocate room for the full file name.  */
-      filename = (char *) malloc (strlen (dirname) + 1
-                                 + strlen (language)
-                                 + ((mask & TERRITORY) != 0
-                                    ? strlen (territory) : 0)
-                                 + ((mask & XPG_CODESET) != 0
-                                    ? strlen (codeset) : 0)
-                                 + ((mask & XPG_MODIFIER) != 0 ?
-                                    strlen (modifier) : 0)
-                                 + ((mask & CEN_SPECIAL) != 0
-                                    ? strlen (special) : 0)
-                                 + ((mask & CEN_SPONSOR) != 0
-                                    ? strlen (sponsor) : 0)
-                                 + ((mask & CEN_REVISION) != 0
-                                    ? strlen (revision) : 0) + 1
-                                 + strlen (domain) + 1);
-
-      if (filename == NULL)
-       return NULL;
-
-      retval = NULL;
-      last = NULL;
-
-      /* Construct file name.  */
-      cp = stpcpy (filename, dirname);
-      *cp++ = '/';
-      cp = stpcpy (cp, language);
-
-      if ((mask & TERRITORY) != 0)
-       {
-         *cp++ = '_';
-         cp = stpcpy (cp, territory);
-       }
-      if ((mask & XPG_CODESET) != 0)
-       {
-         *cp++ = '.';
-      cp = stpcpy (cp, codeset);
-       }
-      if ((mask & (XPG_MODIFIER | CEN_AUDIENCE)) != 0)
-       {
-         /* This component can be part of both syntaces but has different
-            leading characters.  For CEN we use `+', else `@'.  */
-         *cp++ = (mask & CEN_AUDIENCE) != 0 ? '+' : '@';
-         cp = stpcpy (cp, modifier);
-       }
-      if ((mask & CEN_SPECIAL) != 0)
-       {
-         *cp++ = '+';
-         cp = stpcpy (cp, special);
-       }
-      if ((mask & CEN_SPONSOR) != 0)
-       {
-         *cp++ = ',';
-         cp = stpcpy (cp, sponsor);
-       }
-      if ((mask & CEN_REVISION) != 0)
-       {
-         *cp++ = '_';
-         cp = stpcpy (cp, revision);
-       }
-
-      *cp++ = '/';
-      stpcpy (cp, domain);
-
-      /* Look in list of already loaded domains whether it is already
-        available.  */
-      last = NULL;
-      for (retval = _nl_loaded_domains; retval != NULL; retval = retval->next)
-       if (retval->filename != NULL)
-         {
-           int compare = strcmp (retval->filename, filename);
-           if (compare == 0)
-             /* We found it!  */
-             break;
-           if (compare < 0)
-             {
-               /* It's not in the list.  */
-               retval = NULL;
-               break;
-             }
-
-           last = retval;
-         }
-
-      if (retval != NULL || do_allocate == 0)
-       {
-         free (filename);
-         return retval;
-       }
-    }
-
-  retval = (struct loaded_domain *) malloc (sizeof (*retval));
-  if (retval == NULL)
-    return NULL;
-
-  retval->filename = filename;
-  retval->decided = 0;
-
-  if (last == NULL)
-    {
-      retval->next = _nl_loaded_domains;
-      _nl_loaded_domains = retval;
-    }
-  else
-    {
-      retval->next = last->next;
-      last->next = retval;
-    }
-
-  entries = 0;
-  for (cnt = 126; cnt >= 0; --cnt)
-    if (cnt < mask && (cnt & ~mask) == 0
-       && ((cnt & CEN_SPECIFIC) == 0 || (cnt & XPG_SPECIFIC) == 0))
-      retval->successor[entries++] = make_entry_rec (dirname, cnt,
-                                                    language, territory,
-                                                    codeset, modifier,
-                                                    special, sponsor,
-                                                    revision, domain, 1);
-  retval->successor[entries] = NULL;
-
-  return retval;
-}
-
-
-/* @@ begin of epilog @@ */
-
-/* We don't want libintl.a to depend on any other library.  So we
-   avoid the non-standard function stpcpy.  In GNU C Library this
-   function is available, though.  Also allow the symbol HAVE_STPCPY
-   to be defined.  */
-#if !_LIBC && !HAVE_STPCPY
-static char *
-stpcpy (dest, src)
-     char *dest;
-     const char *src;
-{
-  while ((*dest++ = *src++) != '\0')
-    /* Do nothing. */ ;
-  return dest - 1;
-}
-#endif
index 7bed636..1336d21 100644 (file)
@@ -1,19 +1,19 @@
-/* gettext.c -- implementation of gettext(3) function
-   Copyright (C) 1995 Software Foundation, Inc.
+/* Implementation of gettext(3) function
+   Copyright (C) 1995, 1997 Free Software Foundation, Inc.
 
 
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
 
 
-This program 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 General Public License for more details.
+   This program 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 General Public License for more details.
 
 
-You should have received a copy of the GNU General Public License
-along with this program; 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 General Public License
+   along with this program; 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>
 
 #ifdef HAVE_CONFIG_H
 # include <config.h>
index 5190f09..6b4b9e3 100644 (file)
@@ -1,20 +1,20 @@
-/* gettext.h - internal header for GNU gettext internationalization functions
-   Copyright (C) 1995 Software Foundation, Inc.
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
-
-This program 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 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.  */
+/* Internal header for GNU gettext internationalization functions
+   Copyright (C) 1995, 1997 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program 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 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 _GETTEXT_H
 #define _GETTEXT_H 1
 
 #ifndef _GETTEXT_H
 #define _GETTEXT_H 1
index 6d53ac1..bb8d552 100644 (file)
@@ -1,30 +1,32 @@
-/* gettextP.h -- header describing internals of gettext library
-   Copyright (C) 1995 Free Software Foundation, Inc.
+/* Header describing internals of gettext library
+   Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
 
 
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
 
 
-This program 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 General Public License for more details.
+   This program 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 General Public License for more details.
 
 
-You should have received a copy of the GNU General Public License
-along with this program; 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 General Public License
+   along with this program; if not, write to the Free Software Foundation,
+   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 #ifndef _GETTEXTP_H
 #define _GETTEXTP_H
 
 
 #ifndef _GETTEXTP_H
 #define _GETTEXTP_H
 
+#include "loadinfo.h"
+
 /* @@ end of prolog @@ */
 
 /* @@ end of prolog @@ */
 
-#ifndef __P
+#ifndef PARAMS
 # if __STDC__
 # if __STDC__
-#  define __P(args) args
+#  define PARAMS(args) args
 # else
 # else
-#  define __P(args) ()
+#  define PARAMS(args) ()
 # endif
 #endif
 
 # endif
 #endif
 
@@ -33,7 +35,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 #endif
 
 
 #endif
 
 
-static nls_uint32 SWAP __P ((nls_uint32 i));
+static nls_uint32 SWAP PARAMS ((nls_uint32 i));
 
 static inline nls_uint32
 SWAP (i)
 
 static inline nls_uint32
 SWAP (i)
@@ -45,12 +47,6 @@ SWAP (i)
 
 struct loaded_domain
 {
 
 struct loaded_domain
 {
-  struct loaded_domain *next;
-  struct loaded_domain *successor[31];
-
-  const char *filename;
-  int decided;
-
   const char *data;
   int must_swap;
   nls_uint32 nstrings;
   const char *data;
   int must_swap;
   nls_uint32 nstrings;
@@ -67,12 +63,10 @@ struct binding
   char *dirname;
 };
 
   char *dirname;
 };
 
-struct loaded_domain *_nl_find_domain __P ((const char *__dirname,
-                                           char *__locale,
-                                           const char *__domainname));
-void _nl_load_domain __P ((struct loaded_domain *__domain));
-
-const char *_nl_expand_alias __P ((const char *__name));
+struct loaded_l10nfile *_nl_find_domain PARAMS ((const char *__dirname,
+                                                char *__locale,
+                                                const char *__domainname));
+void _nl_load_domain PARAMS ((struct loaded_l10nfile *__domain));
 
 /* @@ begin of epilog @@ */
 
 
 /* @@ begin of epilog @@ */
 
index 3b38bd1..e66e841 100644 (file)
@@ -1,19 +1,20 @@
-/* hash-string - Implements a string hashing function.
-   Copyright (C) 1995 Free Software Foundation, Inc.
+/* Implements a string hashing function.
+   Copyright (C) 1995, 1997 Free Software Foundation, Inc.
 
 
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
 
 
-This program 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 General Public License for more details.
+   This program 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 General Public License for more details.
 
 
-You should have received a copy of the GNU General Public License
-along with this program; 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_VALUES_H
 # include <values.h>
 
 #ifdef HAVE_VALUES_H
 # include <values.h>
@@ -21,11 +22,11 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 /* @@ end of prolog @@ */
 
 
 /* @@ end of prolog @@ */
 
-#ifndef __P
+#ifndef PARAMS
 # if __STDC__
 # if __STDC__
-#  define __P(Args) Args
+#  define PARAMS(Args) Args
 # else
 # else
-#  define __P(Args) ()
+#  define PARAMS(Args) ()
 # endif
 #endif
 
 # endif
 #endif
 
@@ -36,7 +37,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 /* Defines the so called `hashpjw' function by P.J. Weinberger
    [see Aho/Sethi/Ullman, COMPILERS: Principles, Techniques and Tools,
    1986, 1987 Bell Telephone Laboratories, Inc.]  */
 /* Defines the so called `hashpjw' function by P.J. Weinberger
    [see Aho/Sethi/Ullman, COMPILERS: Principles, Techniques and Tools,
    1986, 1987 Bell Telephone Laboratories, Inc.]  */
-static unsigned long hash_string __P ((const char *__str_param));
+static unsigned long hash_string PARAMS ((const char *__str_param));
 
 static inline unsigned long
 hash_string (str_param)
 
 static inline unsigned long
 hash_string (str_param)
diff --git a/intl/l10nflist.c b/intl/l10nflist.c
new file mode 100644 (file)
index 0000000..4e2bc13
--- /dev/null
@@ -0,0 +1,409 @@
+/* Handle list of needed message catalogs
+   Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+   Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program 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 General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; 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>
+#endif
+
+
+#if defined HAVE_STRING_H || defined _LIBC
+# ifndef _GNU_SOURCE
+#  define _GNU_SOURCE  1
+# endif
+# include <string.h>
+#else
+# include <strings.h>
+# ifndef memcpy
+#  define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num)
+# endif
+#endif
+#if !HAVE_STRCHR && !defined _LIBC
+# ifndef strchr
+#  define strchr index
+# endif
+#endif
+
+#if defined _LIBC || defined HAVE_ARGZ_H
+# include <argz.h>
+#endif
+#include <ctype.h>
+#include <sys/types.h>
+
+#if defined STDC_HEADERS || defined _LIBC
+# include <stdlib.h>
+#endif
+
+#include "loadinfo.h"
+
+/* On some strange systems still no definition of NULL is found.  Sigh!  */
+#ifndef NULL
+# if defined __STDC__ && __STDC__
+#  define NULL ((void *) 0)
+# else
+#  define NULL 0
+# endif
+#endif
+
+/* @@ end of prolog @@ */
+
+#ifdef _LIBC
+/* Rename the non ANSI C functions.  This is required by the standard
+   because some ANSI C functions will require linking with this object
+   file and the name space must not be polluted.  */
+# define stpcpy(dest, src) __stpcpy(dest, src)
+#else
+# ifndef HAVE_STPCPY
+static char *stpcpy PARAMS ((char *dest, const char *src));
+# endif
+#endif
+
+/* Define function which are usually not available.  */
+
+#if !defined _LIBC && !defined HAVE___ARGZ_COUNT
+/* Returns the number of strings in ARGZ.  */
+static size_t argz_count__ PARAMS ((const char *argz, size_t len));
+
+static size_t
+argz_count__ (argz, len)
+     const char *argz;
+     size_t len;
+{
+  size_t count = 0;
+  while (len > 0)
+    {
+      size_t part_len = strlen (argz);
+      argz += part_len + 1;
+      len -= part_len + 1;
+      count++;
+    }
+  return count;
+}
+# undef __argz_count
+# define __argz_count(argz, len) argz_count__ (argz, len)
+#endif /* !_LIBC && !HAVE___ARGZ_COUNT */
+
+#if !defined _LIBC && !defined HAVE___ARGZ_STRINGIFY
+/* Make '\0' separated arg vector ARGZ printable by converting all the '\0's
+   except the last into the character SEP.  */
+static void argz_stringify__ PARAMS ((char *argz, size_t len, int sep));
+
+static void
+argz_stringify__ (argz, len, sep)
+     char *argz;
+     size_t len;
+     int sep;
+{
+  while (len > 0)
+    {
+      size_t part_len = strlen (argz);
+      argz += part_len;
+      len -= part_len + 1;
+      if (len > 0)
+       *argz++ = sep;
+    }
+}
+# undef __argz_stringify
+# define __argz_stringify(argz, len, sep) argz_stringify__ (argz, len, sep)
+#endif /* !_LIBC && !HAVE___ARGZ_STRINGIFY */
+
+#if !defined _LIBC && !defined HAVE___ARGZ_NEXT
+static char *argz_next__ PARAMS ((char *argz, size_t argz_len,
+                                 const char *entry));
+
+static char *
+argz_next__ (argz, argz_len, entry)
+     char *argz;
+     size_t argz_len;
+     const char *entry;
+{
+  if (entry)
+    {
+      if (entry < argz + argz_len)
+        entry = strchr (entry, '\0') + 1;
+
+      return entry >= argz + argz_len ? NULL : (char *) entry;
+    }
+  else
+    if (argz_len > 0)
+      return argz;
+    else
+      return 0;
+}
+# undef __argz_next
+# define __argz_next(argz, len, entry) argz_next__ (argz, len, entry)
+#endif /* !_LIBC && !HAVE___ARGZ_NEXT */
+
+
+/* Return number of bits set in X.  */
+static int pop PARAMS ((int x));
+
+static inline int
+pop (x)
+     int x;
+{
+  /* We assume that no more than 16 bits are used.  */
+  x = ((x & ~0x5555) >> 1) + (x & 0x5555);
+  x = ((x & ~0x3333) >> 2) + (x & 0x3333);
+  x = ((x >> 4) + x) & 0x0f0f;
+  x = ((x >> 8) + x) & 0xff;
+
+  return x;
+}
+
+\f
+struct loaded_l10nfile *
+_nl_make_l10nflist (l10nfile_list, dirlist, dirlist_len, mask, language,
+                   territory, codeset, normalized_codeset, modifier, special,
+                   sponsor, revision, filename, do_allocate)
+     struct loaded_l10nfile **l10nfile_list;
+     const char *dirlist;
+     size_t dirlist_len;
+     int mask;
+     const char *language;
+     const char *territory;
+     const char *codeset;
+     const char *normalized_codeset;
+     const char *modifier;
+     const char *special;
+     const char *sponsor;
+     const char *revision;
+     const char *filename;
+     int do_allocate;
+{
+  char *abs_filename;
+  struct loaded_l10nfile *last = NULL;
+  struct loaded_l10nfile *retval;
+  char *cp;
+  size_t entries;
+  int cnt;
+
+  /* Allocate room for the full file name.  */
+  abs_filename = (char *) malloc (dirlist_len
+                                 + strlen (language)
+                                 + ((mask & TERRITORY) != 0
+                                    ? strlen (territory) + 1 : 0)
+                                 + ((mask & XPG_CODESET) != 0
+                                    ? strlen (codeset) + 1 : 0)
+                                 + ((mask & XPG_NORM_CODESET) != 0
+                                    ? strlen (normalized_codeset) + 1 : 0)
+                                 + (((mask & XPG_MODIFIER) != 0
+                                     || (mask & CEN_AUDIENCE) != 0)
+                                    ? strlen (modifier) + 1 : 0)
+                                 + ((mask & CEN_SPECIAL) != 0
+                                    ? strlen (special) + 1 : 0)
+                                 + (((mask & CEN_SPONSOR) != 0
+                                     || (mask & CEN_REVISION) != 0)
+                                    ? (1 + ((mask & CEN_SPONSOR) != 0
+                                            ? strlen (sponsor) + 1 : 0)
+                                       + ((mask & CEN_REVISION) != 0
+                                          ? strlen (revision) + 1 : 0)) : 0)
+                                 + 1 + strlen (filename) + 1);
+
+  if (abs_filename == NULL)
+    return NULL;
+
+  retval = NULL;
+  last = NULL;
+
+  /* Construct file name.  */
+  memcpy (abs_filename, dirlist, dirlist_len);
+  __argz_stringify (abs_filename, dirlist_len, ':');
+  cp = abs_filename + (dirlist_len - 1);
+  *cp++ = '/';
+  cp = stpcpy (cp, language);
+
+  if ((mask & TERRITORY) != 0)
+    {
+      *cp++ = '_';
+      cp = stpcpy (cp, territory);
+    }
+  if ((mask & XPG_CODESET) != 0)
+    {
+      *cp++ = '.';
+      cp = stpcpy (cp, codeset);
+    }
+  if ((mask & XPG_NORM_CODESET) != 0)
+    {
+      *cp++ = '.';
+      cp = stpcpy (cp, normalized_codeset);
+    }
+  if ((mask & (XPG_MODIFIER | CEN_AUDIENCE)) != 0)
+    {
+      /* This component can be part of both syntaces but has different
+        leading characters.  For CEN we use `+', else `@'.  */
+      *cp++ = (mask & CEN_AUDIENCE) != 0 ? '+' : '@';
+      cp = stpcpy (cp, modifier);
+    }
+  if ((mask & CEN_SPECIAL) != 0)
+    {
+      *cp++ = '+';
+      cp = stpcpy (cp, special);
+    }
+  if ((mask & (CEN_SPONSOR | CEN_REVISION)) != 0)
+    {
+      *cp++ = ',';
+      if ((mask & CEN_SPONSOR) != 0)
+       cp = stpcpy (cp, sponsor);
+      if ((mask & CEN_REVISION) != 0)
+       {
+         *cp++ = '_';
+         cp = stpcpy (cp, revision);
+       }
+    }
+
+  *cp++ = '/';
+  stpcpy (cp, filename);
+
+  /* Look in list of already loaded domains whether it is already
+     available.  */
+  last = NULL;
+  for (retval = *l10nfile_list; retval != NULL; retval = retval->next)
+    if (retval->filename != NULL)
+      {
+       int compare = strcmp (retval->filename, abs_filename);
+       if (compare == 0)
+         /* We found it!  */
+         break;
+       if (compare < 0)
+         {
+           /* It's not in the list.  */
+           retval = NULL;
+           break;
+         }
+
+       last = retval;
+      }
+
+  if (retval != NULL || do_allocate == 0)
+    {
+      free (abs_filename);
+      return retval;
+    }
+
+  retval = (struct loaded_l10nfile *)
+    malloc (sizeof (*retval) + (__argz_count (dirlist, dirlist_len)
+                               * (1 << pop (mask))
+                               * sizeof (struct loaded_l10nfile *)));
+  if (retval == NULL)
+    return NULL;
+
+  retval->filename = abs_filename;
+  retval->decided = (__argz_count (dirlist, dirlist_len) != 1
+                    || ((mask & XPG_CODESET) != 0
+                        && (mask & XPG_NORM_CODESET) != 0));
+  retval->data = NULL;
+
+  if (last == NULL)
+    {
+      retval->next = *l10nfile_list;
+      *l10nfile_list = retval;
+    }
+  else
+    {
+      retval->next = last->next;
+      last->next = retval;
+    }
+
+  entries = 0;
+  /* If the DIRLIST is a real list the RETVAL entry corresponds not to
+     a real file.  So we have to use the DIRLIST separation mechanism
+     of the inner loop.  */
+  cnt = __argz_count (dirlist, dirlist_len) == 1 ? mask - 1 : mask;
+  for (; cnt >= 0; --cnt)
+    if ((cnt & ~mask) == 0
+       && ((cnt & CEN_SPECIFIC) == 0 || (cnt & XPG_SPECIFIC) == 0)
+       && ((cnt & XPG_CODESET) == 0 || (cnt & XPG_NORM_CODESET) == 0))
+      {
+       /* Iterate over all elements of the DIRLIST.  */
+       char *dir = NULL;
+
+       while ((dir = __argz_next ((char *) dirlist, dirlist_len, dir))
+              != NULL)
+         retval->successor[entries++]
+           = _nl_make_l10nflist (l10nfile_list, dir, strlen (dir) + 1, cnt,
+                                 language, territory, codeset,
+                                 normalized_codeset, modifier, special,
+                                 sponsor, revision, filename, 1);
+      }
+  retval->successor[entries] = NULL;
+
+  return retval;
+}
+\f
+/* Normalize codeset name.  There is no standard for the codeset
+   names.  Normalization allows the user to use any of the common
+   names.  */
+const char *
+_nl_normalize_codeset (codeset, name_len)
+     const char *codeset;
+     size_t name_len;
+{
+  int len = 0;
+  int only_digit = 1;
+  char *retval;
+  char *wp;
+  size_t cnt;
+
+  for (cnt = 0; cnt < name_len; ++cnt)
+    if (isalnum (codeset[cnt]))
+      {
+       ++len;
+
+       if (isalpha (codeset[cnt]))
+         only_digit = 0;
+      }
+
+  retval = (char *) malloc ((only_digit ? 3 : 0) + len + 1);
+
+  if (retval != NULL)
+    {
+      if (only_digit)
+       wp = stpcpy (retval, "iso");
+      else
+       wp = retval;
+
+      for (cnt = 0; cnt < name_len; ++cnt)
+       if (isalpha (codeset[cnt]))
+         *wp++ = tolower (codeset[cnt]);
+       else if (isdigit (codeset[cnt]))
+         *wp++ = codeset[cnt];
+
+      *wp = '\0';
+    }
+
+  return (const char *) retval;
+}
+
+
+/* @@ begin of epilog @@ */
+
+/* We don't want libintl.a to depend on any other library.  So we
+   avoid the non-standard function stpcpy.  In GNU C Library this
+   function is available, though.  Also allow the symbol HAVE_STPCPY
+   to be defined.  */
+#if !_LIBC && !HAVE_STPCPY
+static char *
+stpcpy (dest, src)
+     char *dest;
+     const char *src;
+{
+  while ((*dest++ = *src++) != '\0')
+    /* Do nothing. */ ;
+  return dest - 1;
+}
+#endif
index 4570cdf..0d4de4d 100644 (file)
@@ -1,19 +1,19 @@
-/* libgettext.h -- Message catalogs for internationalization.
-   Copyright (C) 1995 Free Software Foundation, Inc.
+/* Message catalogs for internationalization.
+   Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
 
 
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
 
 
-This program 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 General Public License for more details.
+   This program 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 General Public License for more details.
 
 
-You should have received a copy of the GNU General Public License
-along with this program; 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 General Public License
+   along with this program; if not, write to the Free Software Foundation,
+   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 /* Because on some systems (e.g. Solaris) we sometimes have to include
    the systems libintl.h as well as this file we have more complex
 
 /* Because on some systems (e.g. Solaris) we sometimes have to include
    the systems libintl.h as well as this file we have more complex
@@ -21,7 +21,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
    define _LIBINTL_H and therefore we have to protect the definition here.  */
 
 #if !defined (_LIBINTL_H) || !defined (_LIBGETTEXT_H)
    define _LIBINTL_H and therefore we have to protect the definition here.  */
 
 #if !defined (_LIBINTL_H) || !defined (_LIBGETTEXT_H)
-#if !_LIBINTL_H
+#if !defined (_LIBINTL_H)
 # define _LIBINTL_H    1
 #endif
 #define _LIBGETTEXT_H  1
 # define _LIBINTL_H    1
 #endif
 #define _LIBGETTEXT_H  1
@@ -43,11 +43,11 @@ extern "C" {
 
 /* @@ end of prolog @@ */
 
 
 /* @@ end of prolog @@ */
 
-#ifndef __P
+#ifndef PARAMS
 # if __STDC__
 # if __STDC__
-#  define __P(args) args
+#  define PARAMS(args) args
 # else
 # else
-#  define __P(args) ()
+#  define PARAMS(args) ()
 # endif
 #endif
 
 # endif
 #endif
 
@@ -91,33 +91,34 @@ extern int _msg_tbl_length;
 /* Look up MSGID in the current default message catalog for the current
    LC_MESSAGES locale.  If not found, returns MSGID itself (the default
    text).  */
 /* Look up MSGID in the current default message catalog for the current
    LC_MESSAGES locale.  If not found, returns MSGID itself (the default
    text).  */
-extern char *gettext __P ((const char *__msgid));
-extern char *gettext__ __P ((const char *__msgid));
+extern char *gettext PARAMS ((const char *__msgid));
+extern char *gettext__ PARAMS ((const char *__msgid));
 
 /* Look up MSGID in the DOMAINNAME message catalog for the current
    LC_MESSAGES locale.  */
 
 /* Look up MSGID in the DOMAINNAME message catalog for the current
    LC_MESSAGES locale.  */
-extern char *dgettext __P ((const char *__domainname, const char *__msgid));
-extern char *dgettext__ __P ((const char *__domainname, const char *__msgid));
+extern char *dgettext PARAMS ((const char *__domainname, const char *__msgid));
+extern char *dgettext__ PARAMS ((const char *__domainname,
+                                const char *__msgid));
 
 /* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY
    locale.  */
 
 /* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY
    locale.  */
-extern char *dcgettext __P ((const char *__domainname, const char *__msgid,
-                            int __category));
-extern char *dcgettext__ __P ((const char *__domainname, const char *__msgid,
-                              int __category));
+extern char *dcgettext PARAMS ((const char *__domainname, const char *__msgid,
+                               int __category));
+extern char *dcgettext__ PARAMS ((const char *__domainname,
+                                 const char *__msgid, int __category));
 
 
 /* Set the current default message catalog to DOMAINNAME.
    If DOMAINNAME is null, return the current default.
    If DOMAINNAME is "", reset to the default of "messages".  */
 
 
 /* Set the current default message catalog to DOMAINNAME.
    If DOMAINNAME is null, return the current default.
    If DOMAINNAME is "", reset to the default of "messages".  */
-extern char *textdomain __P ((const char *__domainname));
-extern char *textdomain__ __P ((const char *__domainname));
+extern char *textdomain PARAMS ((const char *__domainname));
+extern char *textdomain__ PARAMS ((const char *__domainname));
 
 /* Specify that the DOMAINNAME message catalog will be found
    in DIRNAME rather than in the system locale data base.  */
 
 /* Specify that the DOMAINNAME message catalog will be found
    in DIRNAME rather than in the system locale data base.  */
-extern char *bindtextdomain __P ((const char *__domainname,
+extern char *bindtextdomain PARAMS ((const char *__domainname,
                                  const char *__dirname));
                                  const char *__dirname));
-extern char *bindtextdomain__ __P ((const char *__domainname,
+extern char *bindtextdomain__ PARAMS ((const char *__domainname,
                                    const char *__dirname));
 
 #if ENABLE_NLS
                                    const char *__dirname));
 
 #if ENABLE_NLS
@@ -127,33 +128,37 @@ extern char *bindtextdomain__ __P ((const char *__domainname,
    has dcgettext.  */
 # if !HAVE_CATGETS && (!HAVE_GETTEXT || HAVE_DCGETTEXT)
 
    has dcgettext.  */
 # if !HAVE_CATGETS && (!HAVE_GETTEXT || HAVE_DCGETTEXT)
 
-#  define gettext(Msgid) \
+#  define gettext(Msgid)                                                     \
      dgettext (NULL, Msgid)
 
      dgettext (NULL, Msgid)
 
-#  define dgettext(Domainname, Msgid) \
+#  define dgettext(Domainname, Msgid)                                        \
      dcgettext (Domainname, Msgid, LC_MESSAGES)
 
 #  if defined __GNUC__ && __GNUC__ == 2 && __GNUC_MINOR__ >= 7
      dcgettext (Domainname, Msgid, LC_MESSAGES)
 
 #  if defined __GNUC__ && __GNUC__ == 2 && __GNUC_MINOR__ >= 7
-#   define dcgettext(Domainname, Msgid, Category) \
+/* This global variable is defined in loadmsgcat.c.  We need a sign,
+   whether a new catalog was loaded, which can be associated with all
+   translations.  */
+extern int _nl_msg_cat_cntr;
+
+#   define dcgettext(Domainname, Msgid, Category)                            \
   (__extension__                                                             \
    ({                                                                        \
   (__extension__                                                             \
    ({                                                                        \
-     char *result;                                                           \
+     char *__result;                                                         \
      if (__builtin_constant_p (Msgid))                                       \
        {                                                                     \
      if (__builtin_constant_p (Msgid))                                       \
        {                                                                     \
-        extern int _nl_msg_cat_cntr;                                         \
         static char *__translation__;                                        \
         static int __catalog_counter__;                                      \
         if (! __translation__ || __catalog_counter__ != _nl_msg_cat_cntr)    \
           {                                                                  \
             __translation__ =                                                \
         static char *__translation__;                                        \
         static int __catalog_counter__;                                      \
         if (! __translation__ || __catalog_counter__ != _nl_msg_cat_cntr)    \
           {                                                                  \
             __translation__ =                                                \
-              dcgettext__ ((Domainname), (Msgid), (Category));               \
+              dcgettext__ (Domainname, Msgid, Category);                     \
             __catalog_counter__ = _nl_msg_cat_cntr;                          \
           }                                                                  \
             __catalog_counter__ = _nl_msg_cat_cntr;                          \
           }                                                                  \
-        result = __translation__;                                            \
+        __result = __translation__;                                          \
        }                                                                     \
      else                                                                    \
        }                                                                     \
      else                                                                    \
-       result = dcgettext__ ((Domainname), (Msgid), (Category));             \
-     result;                                                                 \
+       __result = dcgettext__ (Domainname, Msgid, Category);                 \
+     __result;                                                               \
     }))
 #  endif
 # endif
     }))
 #  endif
 # endif
diff --git a/intl/loadinfo.h b/intl/loadinfo.h
new file mode 100644 (file)
index 0000000..c67c2eb
--- /dev/null
@@ -0,0 +1,58 @@
+#ifndef PARAMS
+# if __STDC__
+#  define PARAMS(args) args
+# else
+#  define PARAMS(args) ()
+# endif
+#endif
+
+/* Encoding of locale name parts.  */
+#define CEN_REVISION           1
+#define CEN_SPONSOR            2
+#define CEN_SPECIAL            4
+#define XPG_NORM_CODESET       8
+#define XPG_CODESET            16
+#define TERRITORY              32
+#define CEN_AUDIENCE           64
+#define XPG_MODIFIER           128
+
+#define CEN_SPECIFIC   (CEN_REVISION|CEN_SPONSOR|CEN_SPECIAL|CEN_AUDIENCE)
+#define XPG_SPECIFIC   (XPG_CODESET|XPG_NORM_CODESET|XPG_MODIFIER)
+
+
+struct loaded_l10nfile
+{
+  const char *filename;
+  int decided;
+
+  const void *data;
+
+  struct loaded_l10nfile *next;
+  struct loaded_l10nfile *successor[1];
+};
+
+
+extern const char *_nl_normalize_codeset PARAMS ((const char *codeset,
+                                                 size_t name_len));
+
+extern struct loaded_l10nfile *
+_nl_make_l10nflist PARAMS ((struct loaded_l10nfile **l10nfile_list,
+                           const char *dirlist, size_t dirlist_len, int mask,
+                           const char *language, const char *territory,
+                           const char *codeset,
+                           const char *normalized_codeset,
+                           const char *modifier, const char *special,
+                           const char *sponsor, const char *revision,
+                           const char *filename, int do_allocate));
+
+
+extern const char *_nl_expand_alias PARAMS ((const char *name));
+
+extern int _nl_explode_name PARAMS ((char *name, const char **language,
+                                    const char **modifier,
+                                    const char **territory,
+                                    const char **codeset,
+                                    const char **normalized_codeset,
+                                    const char **special,
+                                    const char **sponsor,
+                                    const char **revision));
index d98f365..73e90a9 100644 (file)
@@ -1,19 +1,19 @@
-/* loadmsgcat.c -- load needed message catalogs
-   Copyright (C) 1995 Software Foundation, Inc.
+/* Load needed message catalogs
+   Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
 
 
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
 
 
-This program 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 General Public License for more details.
+   This program 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 General Public License for more details.
 
 
-You should have received a copy of the GNU General Public License
-along with this program; 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 General Public License
+   along with this program; 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>
 
 #ifdef HAVE_CONFIG_H
 # include <config.h>
@@ -41,8 +41,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 /* @@ end of prolog @@ */
 
 #ifdef _LIBC
 /* @@ end of prolog @@ */
 
 #ifdef _LIBC
-/* Rename the non ANSI C functions.  This is required by the standard
-   because some ANSI C functions will require linking with this object
+/* Rename the non ISO C functions.  This is required by the standard
+   because some ISO C functions will require linking with this object
    file and the name space must not be polluted.  */
 # define fstat  __fstat
 # define open   __open
    file and the name space must not be polluted.  */
 # define fstat  __fstat
 # define open   __open
@@ -55,14 +55,14 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 /* We need a sign, whether a new catalog was loaded, which can be associated
    with all translations.  This is important if the translations are
    cached by one of GCC's features.  */
 /* We need a sign, whether a new catalog was loaded, which can be associated
    with all translations.  This is important if the translations are
    cached by one of GCC's features.  */
-int _nl_msg_cat_cntr;
+int _nl_msg_cat_cntr = 0;
 
 
 /* Load the message catalogs specified by FILENAME.  If it is no valid
    message catalog do nothing.  */
 void
 
 
 /* Load the message catalogs specified by FILENAME.  If it is no valid
    message catalog do nothing.  */
 void
-_nl_load_domain (domain)
-     struct loaded_domain *domain;
+_nl_load_domain (domain_file)
+     struct loaded_l10nfile *domain_file;
 {
   int fd;
   struct stat st;
 {
   int fd;
   struct stat st;
@@ -71,19 +71,20 @@ _nl_load_domain (domain)
     || defined _LIBC
   int use_mmap = 0;
 #endif
     || defined _LIBC
   int use_mmap = 0;
 #endif
+  struct loaded_domain *domain;
 
 
-  domain->decided = 1;
-  domain->data = NULL;
+  domain_file->decided = 1;
+  domain_file->data = NULL;
 
   /* If the record does not represent a valid locale the FILENAME
      might be NULL.  This can happen when according to the given
      specification the locale file name is different for XPG and CEN
      syntax.  */
 
   /* If the record does not represent a valid locale the FILENAME
      might be NULL.  This can happen when according to the given
      specification the locale file name is different for XPG and CEN
      syntax.  */
-  if (domain->filename == NULL)
+  if (domain_file->filename == NULL)
     return;
 
   /* Try to open the addressed file.  */
     return;
 
   /* Try to open the addressed file.  */
-  fd = open (domain->filename, O_RDONLY);
+  fd = open (domain_file->filename, O_RDONLY);
   if (fd == -1)
     return;
 
   if (fd == -1)
     return;
 
@@ -156,6 +157,12 @@ _nl_load_domain (domain)
       return;
     }
 
       return;
     }
 
+  domain_file->data
+    = (struct loaded_domain *) malloc (sizeof (struct loaded_domain));
+  if (domain_file->data == NULL)
+    return;
+
+  domain = (struct loaded_domain *) domain_file->data;
   domain->data = (char *) data;
   domain->must_swap = data->magic != _MAGIC;
 
   domain->data = (char *) data;
   domain->must_swap = data->magic != _MAGIC;
 
@@ -181,11 +188,12 @@ _nl_load_domain (domain)
       else
 #endif
        free (data);
       else
 #endif
        free (data);
-      domain->data = NULL;
+      free (domain);
+      domain_file->data = NULL;
       return;
     }
 
   /* Show that one domain is changed.  This might make some cached
       return;
     }
 
   /* Show that one domain is changed.  This might make some cached
-     translation invalid.  */
+     translations invalid.  */
   ++_nl_msg_cat_cntr;
 }
   ++_nl_msg_cat_cntr;
 }
index b432e91..00d9194 100644 (file)
@@ -1,19 +1,20 @@
-/* localealias.c -- handle aliases for locale names
-   Copyright (C) 1995 Free Software Foundation, Inc.
+/* Handle aliases for locale names
+   Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+   Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
 
 
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
 
 
-This program 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 General Public License for more details.
+   This program 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 General Public License for more details.
 
 
-You should have received a copy of the GNU General Public License
-along with this program; 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 General Public License
+   along with this program; 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>
 
 #ifdef HAVE_CONFIG_H
 # include <config.h>
@@ -25,6 +26,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 #ifdef __GNUC__
 # define alloca __builtin_alloca
 
 #ifdef __GNUC__
 # define alloca __builtin_alloca
+# define HAVE_ALLOCA 1
 #else
 # if defined HAVE_ALLOCA_H || defined _LIBC
 #  include <alloca.h>
 #else
 # if defined HAVE_ALLOCA_H || defined _LIBC
 #  include <alloca.h>
@@ -51,9 +53,15 @@ void free ();
 #endif
 
 #if defined HAVE_STRING_H || defined _LIBC
 #endif
 
 #if defined HAVE_STRING_H || defined _LIBC
+# ifndef _GNU_SOURCE
+#  define _GNU_SOURCE  1
+# endif
 # include <string.h>
 #else
 # include <strings.h>
 # include <string.h>
 #else
 # include <strings.h>
+# ifndef memcpy
+#  define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num)
+# endif
 #endif
 #if !HAVE_STRCHR && !defined _LIBC
 # ifndef strchr
 #endif
 #if !HAVE_STRCHR && !defined _LIBC
 # ifndef strchr
@@ -73,6 +81,43 @@ void free ();
 # define strcasecmp __strcasecmp
 #endif
 
 # define strcasecmp __strcasecmp
 #endif
 
+
+/* For those loosing systems which don't have `alloca' we have to add
+   some additional code emulating it.  */
+#ifdef HAVE_ALLOCA
+/* Nothing has to be done.  */
+# define ADD_BLOCK(list, address) /* nothing */
+# define FREE_BLOCKS(list) /* nothing */
+#else
+struct block_list
+{
+  void *address;
+  struct block_list *next;
+};
+# define ADD_BLOCK(list, addr)                                               \
+  do {                                                                       \
+    struct block_list *newp = (struct block_list *) malloc (sizeof (*newp));  \
+    /* If we cannot get a free block we cannot add the new element to        \
+       the list.  */                                                         \
+    if (newp != NULL) {                                                              \
+      newp->address = (addr);                                                \
+      newp->next = (list);                                                   \
+      (list) = newp;                                                         \
+    }                                                                        \
+  } while (0)
+# define FREE_BLOCKS(list)                                                   \
+  do {                                                                       \
+    while (list != NULL) {                                                   \
+      struct block_list *old = list;                                         \
+      list = list->next;                                                     \
+      free (old);                                                            \
+    }                                                                        \
+  } while (0)
+# undef alloca
+# define alloca(size) (malloc (size))
+#endif /* have alloca */
+
+
 struct alias_map
 {
   const char *alias;
 struct alias_map
 {
   const char *alias;
@@ -86,10 +131,10 @@ static size_t maxmap = 0;
 
 
 /* Prototypes for local functions.  */
 
 
 /* Prototypes for local functions.  */
-static size_t read_alias_file __P ((const char *fname, int fname_len));
-static void extend_alias_table __P ((void));
-static int alias_compare __P ((const struct alias_map *map1,
-                              const struct alias_map *map2));
+static size_t read_alias_file PARAMS ((const char *fname, int fname_len));
+static void extend_alias_table PARAMS ((void));
+static int alias_compare PARAMS ((const struct alias_map *map1,
+                                 const struct alias_map *map2));
 
 
 const char *
 
 
 const char *
@@ -109,9 +154,9 @@ _nl_expand_alias (name)
       if (nmap > 0)
        retval = (struct alias_map *) bsearch (&item, map, nmap,
                                               sizeof (struct alias_map),
       if (nmap > 0)
        retval = (struct alias_map *) bsearch (&item, map, nmap,
                                               sizeof (struct alias_map),
-                                              (int (*) __P ((const void *,
-                                                             const void *)))
-                                                alias_compare);
+                                              (int (*) PARAMS ((const void *,
+                                                                const void *))
+                                               ) alias_compare);
       else
        retval = NULL;
 
       else
        retval = NULL;
 
@@ -147,18 +192,25 @@ read_alias_file (fname, fname_len)
      const char *fname;
      int fname_len;
 {
      const char *fname;
      int fname_len;
 {
+#ifndef HAVE_ALLOCA
+  struct block_list *block_list = NULL;
+#endif
   FILE *fp;
   char *full_fname;
   size_t added;
   static const char aliasfile[] = "/locale.alias";
 
   full_fname = (char *) alloca (fname_len + sizeof aliasfile);
   FILE *fp;
   char *full_fname;
   size_t added;
   static const char aliasfile[] = "/locale.alias";
 
   full_fname = (char *) alloca (fname_len + sizeof aliasfile);
+  ADD_BLOCK (block_list, full_fname);
   memcpy (full_fname, fname, fname_len);
   memcpy (&full_fname[fname_len], aliasfile, sizeof aliasfile);
 
   fp = fopen (full_fname, "r");
   if (fp == NULL)
   memcpy (full_fname, fname, fname_len);
   memcpy (&full_fname[fname_len], aliasfile, sizeof aliasfile);
 
   fp = fopen (full_fname, "r");
   if (fp == NULL)
-    return 0;
+    {
+      FREE_BLOCKS (block_list);
+      return 0;
+    }
 
   added = 0;
   while (!feof (fp))
 
   added = 0;
   while (!feof (fp))
@@ -223,14 +275,20 @@ read_alias_file (fname, fname_len)
              len = strlen (alias) + 1;
              tp = (char *) malloc (len);
              if (tp == NULL)
              len = strlen (alias) + 1;
              tp = (char *) malloc (len);
              if (tp == NULL)
-               return added;
+               {
+                 FREE_BLOCKS (block_list);
+                 return added;
+               }
              memcpy (tp, alias, len);
              map[nmap].alias = tp;
 
              len = strlen (value) + 1;
              tp = (char *) malloc (len);
              if (tp == NULL)
              memcpy (tp, alias, len);
              map[nmap].alias = tp;
 
              len = strlen (value) + 1;
              tp = (char *) malloc (len);
              if (tp == NULL)
-               return added;
+               {
+                 FREE_BLOCKS (block_list);
+                 return added;
+               }
              memcpy (tp, value, len);
              map[nmap].value = tp;
 
              memcpy (tp, value, len);
              map[nmap].value = tp;
 
@@ -239,7 +297,7 @@ read_alias_file (fname, fname_len)
            }
        }
 
            }
        }
 
-      /* Possibily not the whole line fitted into the buffer.  Ignore
+      /* Possibly not the whole line fits into the buffer.  Ignore
         the rest of the line.  */
       while (strchr (cp, '\n') == NULL)
        {
         the rest of the line.  */
       while (strchr (cp, '\n') == NULL)
        {
@@ -257,8 +315,9 @@ read_alias_file (fname, fname_len)
 
   if (added > 0)
     qsort (map, nmap, sizeof (struct alias_map),
 
   if (added > 0)
     qsort (map, nmap, sizeof (struct alias_map),
-          (int (*) __P ((const void *, const void *))) alias_compare);
+          (int (*) PARAMS ((const void *, const void *))) alias_compare);
 
 
+  FREE_BLOCKS (block_list);
   return added;
 }
 
   return added;
 }
 
@@ -309,6 +368,8 @@ alias_compare (map1, map2)
       c2 = isupper (*p2) ? tolower (*p2) : *p2;
       if (c1 == '\0')
        break;
       c2 = isupper (*p2) ? tolower (*p2) : *p2;
       if (c1 == '\0')
        break;
+      ++p1;
+      ++p2;
     }
   while (c1 == c2);
 
     }
   while (c1 == c2);
 
index c06642b..55d9340 100644 (file)
@@ -1,19 +1,20 @@
-/* textdomain.c -- implementation of the textdomain(3) function
-   Copyright (C) 1995 Software Foundation, Inc.
+/* Implementation of the textdomain(3) function
+   Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+   Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
 
 
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
 
 
-This program 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 General Public License for more details.
+   This program 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 General Public License for more details.
 
 
-You should have received a copy of the GNU General Public License
-along with this program; 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 General Public License
+   along with this program; 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>
 
 #ifdef HAVE_CONFIG_H
 # include <config.h>
@@ -27,6 +28,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 # include <string.h>
 #else
 # include <strings.h>
 # include <string.h>
 #else
 # include <strings.h>
+# ifndef memcpy
+#  define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num)
+# endif
 #endif
 
 #ifdef _LIBC
 #endif
 
 #ifdef _LIBC
@@ -50,6 +54,7 @@ extern const char *_nl_current_default_domain;
    prefix.  So we have to make a difference here.  */
 #ifdef _LIBC
 # define TEXTDOMAIN __textdomain
    prefix.  So we have to make a difference here.  */
 #ifdef _LIBC
 # define TEXTDOMAIN __textdomain
+# define strdup(str) __strdup (str)
 #else
 # define TEXTDOMAIN textdomain__
 #endif
 #else
 # define TEXTDOMAIN textdomain__
 #endif
@@ -78,11 +83,15 @@ TEXTDOMAIN (domainname)
       /* If the following malloc fails `_nl_current_default_domain'
         will be NULL.  This value will be returned and so signals we
         are out of core.  */
       /* If the following malloc fails `_nl_current_default_domain'
         will be NULL.  This value will be returned and so signals we
         are out of core.  */
+#if defined _LIBC || defined HAVE_STRDUP
+      _nl_current_default_domain = strdup (domainname);
+#else
       size_t len = strlen (domainname) + 1;
       char *cp = (char *) malloc (len);
       if (cp != NULL)
        memcpy (cp, domainname, len);
       _nl_current_default_domain = cp;
       size_t len = strlen (domainname) + 1;
       char *cp = (char *) malloc (len);
       if (cp != NULL)
        memcpy (cp, domainname, len);
       _nl_current_default_domain = cp;
+#endif
     }
 
   if (old != _nl_default_default_domain)
     }
 
   if (old != _nl_default_default_domain)