tRequired files for proper i18n added (seems they were missed out the first tim… | |
git clone git://src.adamsgaard.dk/vaccinewars | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 4cbe6cbbdce73df996f9ecff4202108bcfda340b | |
parent 82139d452a41754d464e588341c9c987066d4a6a | |
Author: Ben Webb <[email protected]> | |
Date: Sun, 10 Sep 2000 21:55:17 +0000 | |
Required files for proper i18n added (seems they were missed out the first | |
ttime around) | |
Diffstat: | |
A intl/ChangeLog | 1086 +++++++++++++++++++++++++++++… | |
A intl/Makefile | 214 +++++++++++++++++++++++++++++… | |
A intl/Makefile.in | 214 +++++++++++++++++++++++++++++… | |
A intl/VERSION | 1 + | |
A intl/bindtextdom.c | 203 +++++++++++++++++++++++++++++… | |
A intl/cat-compat.c | 262 +++++++++++++++++++++++++++++… | |
A intl/dcgettext.c | 624 +++++++++++++++++++++++++++++… | |
A intl/dgettext.c | 59 +++++++++++++++++++++++++++++… | |
A intl/explodename.c | 188 +++++++++++++++++++++++++++++… | |
A intl/finddomain.c | 216 +++++++++++++++++++++++++++++… | |
A intl/gettext.c | 70 +++++++++++++++++++++++++++++… | |
A intl/gettext.h | 105 +++++++++++++++++++++++++++++… | |
A intl/gettextP.h | 89 +++++++++++++++++++++++++++++… | |
A intl/hash-string.h | 59 +++++++++++++++++++++++++++++… | |
A intl/intl-compat.c | 76 +++++++++++++++++++++++++++++… | |
A intl/l10nflist.c | 411 ++++++++++++++++++++++++++++++ | |
A intl/libgettext.h | 182 +++++++++++++++++++++++++++++… | |
A intl/linux-msg.sed | 100 +++++++++++++++++++++++++++++… | |
A intl/loadinfo.h | 76 +++++++++++++++++++++++++++++… | |
A intl/loadmsgcat.c | 222 ++++++++++++++++++++++++++++++ | |
A intl/localealias.c | 424 ++++++++++++++++++++++++++++++ | |
A intl/po2tbl.sed | 60 +++++++++++++++++++++++++++++… | |
A intl/po2tbl.sed.in | 102 +++++++++++++++++++++++++++++… | |
A intl/textdomain.c | 108 +++++++++++++++++++++++++++++… | |
A intl/xopen-msg.sed | 104 +++++++++++++++++++++++++++++… | |
A po/Makefile.in.in | 248 +++++++++++++++++++++++++++++… | |
M po/dopewars.pot | 200 ++++++++++++++++-------------… | |
27 files changed, 5603 insertions(+), 100 deletions(-) | |
--- | |
diff --git a/intl/ChangeLog b/intl/ChangeLog | |
t@@ -0,0 +1,1086 @@ | |
+1998-04-29 Ulrich Drepper <[email protected]> | |
+ | |
+ * intl/localealias.c (read_alias_file): Use unsigned char for | |
+ local variables. Remove unused variable tp. | |
+ * intl/l10nflist.c (_nl_normalize_codeset): Use unsigned char * | |
+ for type of codeset. For loosing Solaris systems. | |
+ * intl/loadinfo.h: Adapt prototype of _nl_normalize_codeset. | |
+ * intl/bindtextdom.c (BINDTEXTDOMAIN): Don't define local variable | |
+ len if not needed. | |
+ Patches by Jim Meyering. | |
+ | |
+1998-04-28 Ulrich Drepper <[email protected]> | |
+ | |
+ * loadmsgcat.c (_nl_load_domain): Don't assign the element use_mmap if | |
+ mmap is not supported. | |
+ | |
+ * hash-string.h: Don't include <values.h>. | |
+ | |
+1998-04-27 Ulrich Drepper <[email protected]> | |
+ | |
+ * textdomain.c: Use strdup is available. | |
+ | |
+ * localealias.c: Define HAVE_MEMPCPY so that we can use this | |
+ function. Define and use semapahores to protect modfication of | |
+ global objects when compiling for glibc. Add code to allow | |
+ freeing alias table. | |
+ | |
+ * l10nflist.c: Don't assume stpcpy not being a macro. | |
+ | |
+ * gettextP.h: Define internal_function macri if not already done. | |
+ Use glibc byte-swap macros instead of defining SWAP when compiled | |
+ for glibc. | |
+ (struct loaded_domain): Add elements to allow unloading. | |
+ | |
+ * Makefile.in (distclean): Don't remove libintl.h here. | |
+ | |
+ * bindtextdomain.c: Carry over changes from glibc. Use strdup if | |
+ available. | |
+ | |
+ * dcgettext.c: Don't assume stpcpy not being a macro. Mark internal | |
+ functions. Add memory freeing code for glibc. | |
+ | |
+ * dgettext.c: Update copyright. | |
+ | |
+ * explodename.c: Include stdlib.h and string.h only if they exist. | |
+ Use strings.h eventually. | |
+ | |
+ * finddomain.c: Mark internal functions. Use strdup if available. | |
+ Add memory freeing code for glibc. | |
+ | |
+1997-10-10 20:00 Ulrich Drepper <[email protected]> | |
+ | |
+ * libgettext.h: Fix dummy textdomain and bindtextdomain macros. | |
+ They should return reasonable values. | |
+ Reported by Tom Tromey <[email protected]>. | |
+ | |
+1997-09-16 03:33 Ulrich Drepper <[email protected]> | |
+ | |
+ * libgettext.h: Define PARAMS also to `args' if __cplusplus is defined. | |
+ * intlh.inst.in: Likewise. | |
+ Reported by Jean-Marc Lasgouttes <[email protected]>. | |
+ | |
+ * libintl.glibc: Update from current glibc version. | |
+ | |
+1997-09-06 02:10 Ulrich Drepper <[email protected]> | |
+ | |
+ * intlh.inst.in: Reformat copyright. | |
+ | |
+1997-08-19 15:22 Ulrich Drepper <[email protected]> | |
+ | |
+ * dcgettext.c (DCGETTEXT): Remove wrong comment. | |
+ | |
+1997-08-16 00:13 Ulrich Drepper <[email protected]> | |
+ | |
+ * Makefile.in (install-data): Don't change directory to install. | |
+ | |
+1997-08-01 14:30 Ulrich Drepper <[email protected]> | |
+ | |
+ * 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 <[email protected]> | |
+ | |
+ * dcgettext.c (guess_category_value): Don't depend on | |
+ HAVE_LC_MESSAGES. We don't need the macro here. | |
+ Patch by Bruno Haible <[email protected]>. | |
+ | |
+ * 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 <[email protected]>. | |
+ | |
+ * Makefile.in (CPPFLAGS): New variable. Reported by Franc,ois | |
+ Pinard. | |
+ | |
+Mon Mar 10 06:51:17 1997 Ulrich Drepper <[email protected]> | |
+ | |
+ * 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 <[email protected]> | |
+ | |
+ * 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 <[email protected]> | |
+ | |
+ * textdomain.c: Move definition of `memcpy` macro to right | |
+ position. | |
+ | |
+Fri Nov 22 04:01:58 1996 Ulrich Drepper <[email protected]> | |
+ | |
+ * 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 <[email protected]> | |
+ | |
+ * Makefile.in (libdir): Change to use exec_prefix instead of | |
+ prefix. Reported by Knut-H�vardAksnes <[email protected]>. | |
+ | |
+Sat Aug 31 03:07:09 1996 Ulrich Drepper <[email protected]> | |
+ | |
+ * 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 <[email protected]> | |
+ | |
+ * 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 <[email protected]> | |
+ | |
+ * 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 <[email protected]> | |
+ | |
+ * 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 <[email protected]> | |
+ | |
+ * 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 <[email protected]> | |
+ | |
+ * 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 <[email protected]> | |
+ | |
+ * explodename.c, l10nflist.c: Define NULL for dumb systems. | |
+ | |
+Tue Jun 11 17:05:13 1996 Ulrich Drepper <[email protected]> | |
+ | |
+ * 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 <[email protected]> | |
+ | |
+ * Makefile.in (install): Remove comment. | |
+ | |
+Thu Jun 6 17:28:17 1996 Ulrich Drepper <[email protected]> | |
+ | |
+ * 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 <[email protected]> | |
+ | |
+ * 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 <[email protected]> | |
+ | |
+ * 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 <[email protected]> | |
+ | |
+ * 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 <[email protected]> | |
+ | |
+ * loadmsgcat.c (_nl_load_domain): Parameter is now comes from | |
+ find_l10nfile. | |
+ | |
+Sat Jun 1 02:23:03 1996 Ulrich Drepper <[email protected]> | |
+ | |
+ * 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 <[email protected]> | |
+ | |
+ * 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 <[email protected]> | |
+ | |
+ * 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 <[email protected]>. | |
+ | |
+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 <[email protected]… | |
+ | |
+ * 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 <[email protected]> | |
+ | |
+ * 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 <[email protected]> | |
+ | |
+ * cat-compat.c (textdomain): | |
+ Reverse order in which files are tried you load. First | |
+ try local file, when this failed absolute path. | |
+ | |
+Wed Nov 29 02:03:53 1995 Nelson H. F. Beebe <[email protected]> | |
+ | |
+ * cat-compat.c (bindtextdomain): Add missing { }. | |
+ | |
+Sun Nov 26 18:21:41 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * libintl.inst: Add missing __P definition. Reported by Nelson Beebe. | |
+ | |
+ * Makefile.in: | |
+ Add dummy `all' and `dvi' goals. Reported by Tom Tromey. | |
+ | |
+Sat Nov 25 16:12:01 1995 Franc,ois Pinard <[email protected]> | |
+ | |
+ * hash-string.h: Capitalize arguments of macros. | |
+ | |
+Sat Nov 25 12:01:36 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * Makefile.in (DISTFILES): Prevent files names longer than 13 | |
+ characters. libintl.h.glibc->libintl.glibc, | |
+ libintl.h.install->libintl.inst. Reported by Joshua R. Poulson. | |
+ | |
+Sat Nov 25 11:31:12 1995 Eric Backus <[email protected]> | |
+ | |
+ * dcgettext.c: Fix bug in preprocessor conditionals. | |
+ | |
+Sat Nov 25 02:35:27 1995 Nelson H. F. Beebe <[email protected]> | |
+ | |
+ * libgettext.h: Solaris cc does not understand | |
+ #if !SYMBOL1 && !SYMBOL2. Sad but true. | |
+ | |
+Thu Nov 23 16:22:14 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * hash-string.h (hash_string): | |
+ Fix for machine with >32 bit `unsigned long's. | |
+ | |
+ * dcgettext.c (DCGETTEXT): | |
+ Fix horrible bug in loop for alternative translation. | |
+ | |
+Thu Nov 23 01:45:29 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * po2tbl.sed.in, linux-msg.sed, xopen-msg.sed: | |
+ Some further simplifications in message number generation. | |
+ | |
+Mon Nov 20 21:08:43 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * libintl.h.glibc: Use __const instead of const in prototypes. | |
+ | |
+ * Makefile.in (install-src): | |
+ Install libintl.h.install instead of libintl.h. This | |
+ is a stripped-down version. Suggested by Peter Miller. | |
+ | |
+ * libintl.h.install, libintl.h.glibc: Initial revision. | |
+ | |
+ * localealias.c (_nl_expand_alias, read_alias_file): | |
+ Protect prototypes in type casts by __P. | |
+ | |
+Tue Nov 14 16:43:58 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * hash-string.h: Correct prototype for hash_string. | |
+ | |
+Sun Nov 12 12:42:30 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * hash-string.h (hash_string): Add prototype. | |
+ | |
+ * gettextP.h: Fix copyright. | |
+ (SWAP): Add prototype. | |
+ | |
+Wed Nov 8 22:56:33 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * localealias.c (read_alias_file): Forgot sizeof. | |
+ Avoid calling *printf function. This introduces a big overhead. | |
+ Patch by Roland McGrath. | |
+ | |
+Tue Nov 7 14:21:08 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * finddomain.c, cat-compat.c: Wrong indentation in #if for stpcpy. | |
+ | |
+ * finddomain.c (stpcpy): | |
+ Define substitution function local. The macro was to flaky. | |
+ | |
+ * cat-compat.c: Fix typo. | |
+ | |
+ * xopen-msg.sed, linux-msg.sed: | |
+ While bringing message number to right place only accept digits. | |
+ | |
+ * linux-msg.sed, xopen-msg.sed: Now that the counter does not have | |
+ leading 0s we don't need to remove them. Reported by Marcus | |
+ Daniels. | |
+ | |
+ * Makefile.in (../po/cat-id-tbl.o): Use $(top_srdir) in | |
+ dependency. Reported by Marcus Daniels. | |
+ | |
+ * cat-compat.c: (stpcpy) [!_LIBC && !HAVE_STPCPY]: Define replacement. | |
+ Generally cleanup using #if instead of #ifndef. | |
+ | |
+ * Makefile.in: Correct typos in comment. By Franc,ois Pinard. | |
+ | |
+Mon Nov 6 00:27:02 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * Makefile.in (install-src): Don't install libintl.h and libintl.a | |
+ if we use an available gettext implementation. | |
+ | |
+Sun Nov 5 22:02:08 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * libgettext.h: Fix typo: HAVE_CATGETTS -> HAVE_CATGETS. Reported | |
+ by Franc,ois Pinard. | |
+ | |
+ * libgettext.h: Use #if instead of #ifdef/#ifndef. | |
+ | |
+ * finddomain.c: | |
+ Comments describing what has to be done should start with FIXME. | |
+ | |
+Sun Nov 5 19:38:01 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * Makefile.in (DISTFILES): Split. Use DISTFILES with normal meaning. | |
+ DISTFILES.common names the files common to both dist goals. | |
+ DISTFILES.gettext are the files only distributed in GNU gettext. | |
+ | |
+Sun Nov 5 17:32:54 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * dcgettext.c (DCGETTEXT): Correct searching in derived locales. | |
+ This was necessary since a change in _nl_find_msg several weeks | |
+ ago. I really don't know this is still not fixed. | |
+ | |
+Sun Nov 5 12:43:12 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * loadmsgcat.c (_nl_load_domain): Test for FILENAME == NULL. This | |
+ might mark a special condition. | |
+ | |
+ * finddomain.c (make_entry_rec): Don't make illegal entry as decided. | |
+ | |
+ * Makefile.in (dist): Suppress error message when ln failed. | |
+ Get files from $(srcdir) explicitly. | |
+ | |
+ * libgettext.h (gettext_const): Rename to gettext_noop. | |
+ | |
+Fri Nov 3 07:36:50 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * finddomain.c (make_entry_rec): | |
+ Protect against wrong locale names by testing mask. | |
+ | |
+ * libgettext.h (gettext_const): Add macro definition. | |
+ Capitalize macro arguments. | |
+ | |
+Thu Nov 2 23:15:51 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * finddomain.c (_nl_find_domain): | |
+ Test for pointer != NULL before accessing value. | |
+ Reported by Tom Tromey. | |
+ | |
+ * gettext.c (NULL): | |
+ Define as (void*)0 instad of 0. Reported by Franc,ois Pinard. | |
+ | |
+Mon Oct 30 21:28:52 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * po2tbl.sed.in: Serious typo bug fixed by Jim Meyering. | |
+ | |
+Sat Oct 28 23:20:47 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * libgettext.h: Disable dcgettext optimization for Solaris 2.3. | |
+ | |
+ * localealias.c (alias_compare): | |
+ Peter Miller reported that tolower in some systems is | |
+ even dumber than I thought. Protect call by `isupper'. | |
+ | |
+Fri Oct 27 22:22:51 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * Makefile.in (libdir, includedir): New variables. | |
+ (install-src): Install libintl.a and libintl.h in correct dirs. | |
+ | |
+Fri Oct 27 22:07:29 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * Makefile.in (SOURCES): Fix typo: intrl.compat.c -> intl-compat.c. | |
+ | |
+ * po2tbl.sed.in: Patch for buggy SEDs by Christian von Roques. | |
+ | |
+ * localealias.c: | |
+ Fix typo and superflous test. Reported by Christian von Roques. | |
+ | |
+Fri Oct 6 11:52:05 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * finddomain.c (_nl_find_domain): | |
+ Correct some remainder from the pre-CEN syntax. Now | |
+ we don't have a constant number of successors anymore. | |
+ | |
+Wed Sep 27 21:41:13 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * Makefile.in (DISTFILES): Add libintl.h.glibc. | |
+ | |
+ * Makefile.in (dist-libc): Add goal for packing sources for glibc. | |
+ (COMSRCS, COMHDRS): Splitted to separate sources shared with glibc. | |
+ | |
+ * loadmsgcat.c: Forget to continue #if line. | |
+ | |
+ * localealias.c: | |
+ [_LIBC]: Rename strcasecmp to __strcasecmp to keep ANSI C name | |
+ space clean. | |
+ | |
+ * dcgettext.c, finddomain.c: Better comment to last change. | |
+ | |
+ * loadmsgcat.c: | |
+ [_LIBC]: Rename fstat, open, close, read, mmap, and munmap to | |
+ __fstat, __open, __close, __read, __mmap, and __munmap resp | |
+ to keep ANSI C name space clean. | |
+ | |
+ * finddomain.c: | |
+ [_LIBC]: Rename stpcpy to __stpcpy to keep ANSI C name space clean. | |
+ | |
+ * dcgettext.c: | |
+ [_LIBC]: Rename getced and stpcpy to __getcwd and __stpcpy resp to | |
+ keep ANSI C name space clean. | |
+ | |
+ * libgettext.h: | |
+ Include sys/types.h for those old SysV systems out there. | |
+ Reported by Francesco Potorti`. | |
+ | |
+ * loadmsgcat.c (use_mmap): Define if compiled for glibc. | |
+ | |
+ * bindtextdom.c: Include all those standard headers | |
+ unconditionally if _LIBC is defined. | |
+ | |
+ * finddomain.c: Fix 2 times defiend -> defined. | |
+ | |
+ * textdomain.c: Include libintl.h instead of libgettext.h when | |
+ compiling for glibc. Include all those standard headers | |
+ unconditionally if _LIBC is defined. | |
+ | |
+ * localealias.c, loadmsgcat.c: Prepare to be compiled in glibc. | |
+ | |
+ * gettext.c: | |
+ Include libintl.h instead of libgettext.h when compiling for glibc. | |
+ Get NULL from stddef.h if we compile for glibc. | |
+ | |
+ * finddomain.c: Include libintl.h instead of libgettext.h when | |
+ compiling for glibc. Include all those standard headers | |
+ unconditionally if _LIBC is defined. | |
+ | |
+ * dcgettext.c: Include all those standard headers unconditionally | |
+ if _LIBC is defined. | |
+ | |
+ * dgettext.c: If compiled in glibc include libintl.h instead of | |
+ libgettext.h. | |
+ (locale.h): Don't rely on HAVE_LOCALE_H when compiling for glibc. | |
+ | |
+ * dcgettext.c: If compiled in glibc include libintl.h instead of | |
+ libgettext.h. | |
+ (getcwd): Don't rely on HAVE_GETCWD when compiling for glibc. | |
+ | |
+ * bindtextdom.c: | |
+ If compiled in glibc include libintl.h instead of libgettext.h. | |
+ | |
+Mon Sep 25 22:23:06 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * localealias.c (_nl_expand_alias): Don't call bsearch if NMAP <= 0. | |
+ Reported by Marcus Daniels. | |
+ | |
+ * cat-compat.c (bindtextdomain): | |
+ String used in putenv must not be recycled. | |
+ Reported by Marcus Daniels. | |
+ | |
+ * libgettext.h (__USE_GNU_GETTEXT): | |
+ Additional symbol to signal that we use GNU gettext | |
+ library. | |
+ | |
+ * cat-compat.c (bindtextdomain): | |
+ Fix bug with the strange stpcpy replacement. | |
+ Reported by Nelson Beebe. | |
+ | |
+Sat Sep 23 08:23:51 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * cat-compat.c: Include <string.h> for stpcpy prototype. | |
+ | |
+ * localealias.c (read_alias_file): | |
+ While expand strdup code temporary variable `cp' hided | |
+ higher level variable with same name. Rename to `tp'. | |
+ | |
+ * textdomain.c (textdomain): | |
+ Avoid warning by using temporary variable in strdup code. | |
+ | |
+ * finddomain.c (_nl_find_domain): Remove unused variable `application'. | |
+ | |
+Thu Sep 21 15:51:44 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * localealias.c (alias_compare): | |
+ Use strcasecmp() only if available. Else use | |
+ implementation in place. | |
+ | |
+ * intl-compat.c: | |
+ Wrapper functions now call *__ functions instead of __*. | |
+ | |
+ * libgettext.h: Declare prototypes for *__ functions instead for __*. | |
+ | |
+ * cat-compat.c, loadmsgcat.c: | |
+ Don't use xmalloc, xstrdup, and stpcpy. These functions are not part | |
+ of the standard libc and so prevent libintl.a from being used | |
+ standalone. | |
+ | |
+ * bindtextdom.c: | |
+ Don't use xmalloc, xstrdup, and stpcpy. These functions are not part | |
+ of the standard libc and so prevent libintl.a from being used | |
+ standalone. | |
+ Rename to bindtextdomain__ if not used in GNU C Library. | |
+ | |
+ * dgettext.c: | |
+ Rename function to dgettext__ if not used in GNU C Library. | |
+ | |
+ * gettext.c: | |
+ Don't use xmalloc, xstrdup, and stpcpy. These functions are not part | |
+ of the standard libc and so prevent libintl.a from being used | |
+ standalone. | |
+ Functions now called gettext__ if not used in GNU C Library. | |
+ | |
+ * dcgettext.c, localealias.c, textdomain.c, finddomain.c: | |
+ Don't use xmalloc, xstrdup, and stpcpy. These functions are not part | |
+ of the standard libc and so prevent libintl.a from being used | |
+ standalone. | |
+ | |
+Sun Sep 17 23:14:49 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * finddomain.c: Correct some bugs in handling of CEN standard | |
+ locale definitions. | |
+ | |
+Thu Sep 7 01:49:28 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * finddomain.c: Implement CEN syntax. | |
+ | |
+ * gettextP.h (loaded_domain): Extend number of successors to 31. | |
+ | |
+Sat Aug 19 19:25:29 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * Makefile.in (aliaspath): Remove path to X11 locale dir. | |
+ | |
+ * Makefile.in: Make install-src depend on install. This helps | |
+ gettext to install the sources and other packages can use the | |
+ install goal. | |
+ | |
+Sat Aug 19 15:19:33 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * Makefile.in (uninstall): Remove stuff installed by install-src. | |
+ | |
+Tue Aug 15 13:13:53 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * VERSION.in: Initial revision. | |
+ | |
+ * Makefile.in (DISTFILES): | |
+ Add VERSION file. This is not necessary for gettext, but | |
+ for other packages using this library. | |
+ | |
+Tue Aug 15 06:16:44 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * gettextP.h (_nl_find_domain): | |
+ New prototype after changing search strategy. | |
+ | |
+ * finddomain.c (_nl_find_domain): | |
+ We now try only to find a specified catalog. Fall back to other | |
+ catalogs listed in the locale list is now done in __dcgettext. | |
+ | |
+ * dcgettext.c (__dcgettext): | |
+ Now we provide message fall back even to different languages. | |
+ I.e. if a message is not available in one language all the other | |
+ in the locale list a tried. Formerly fall back was only possible | |
+ within one language. Implemented by moving one loop from | |
+ _nl_find_domain to here. | |
+ | |
+Mon Aug 14 23:45:50 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * Makefile.in (gettextsrcdir): | |
+ Directory where source of GNU gettext library are made | |
+ available. | |
+ (INSTALL, INSTALL_DATA): Programs used for installing sources. | |
+ (gettext-src): New. Rule to install GNU gettext sources for use in | |
+ gettextize shell script. | |
+ | |
+Sun Aug 13 14:40:48 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * loadmsgcat.c (_nl_load_domain): | |
+ Use mmap for loading only when munmap function is | |
+ also available. | |
+ | |
+ * Makefile.in (install): Depend on `all' goal. | |
+ | |
+Wed Aug 9 11:04:33 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * localealias.c (read_alias_file): | |
+ Do not overwrite '\n' when terminating alias value string. | |
+ | |
+ * localealias.c (read_alias_file): | |
+ Handle long lines. Ignore the rest not fitting in | |
+ the buffer after the initial `fgets' call. | |
+ | |
+Wed Aug 9 00:54:29 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * gettextP.h (_nl_load_domain): | |
+ Add prototype, replacing prototype for _nl_load_msg_cat. | |
+ | |
+ * finddomain.c (_nl_find_domain): | |
+ Remove unneeded variable filename and filename_len. | |
+ (expand_alias): Remove prototype because functions does not | |
+ exist anymore. | |
+ | |
+ * localealias.c (read_alias_file): | |
+ Change type of fname_len parameter to int. | |
+ (xmalloc): Add prototype. | |
+ | |
+ * loadmsgcat.c: Better prototypes for xmalloc. | |
+ | |
+Tue Aug 8 22:30:39 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * finddomain.c (_nl_find_domain): | |
+ Allow alias name to be constructed from the four components. | |
+ | |
+ * Makefile.in (aliaspath): New variable. Set to preliminary value. | |
+ (SOURCES): Add localealias.c. | |
+ (OBJECTS): Add localealias.o. | |
+ | |
+ * gettextP.h: Add prototype for _nl_expand_alias. | |
+ | |
+ * finddomain.c: Aliasing handled in intl/localealias.c. | |
+ | |
+ * localealias.c: Aliasing for locale names. | |
+ | |
+ * bindtextdom.c: Better prototypes for xmalloc and xstrdup. | |
+ | |
+Mon Aug 7 23:47:42 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * Makefile.in (DISTFILES): gettext.perl is now found in misc/. | |
+ | |
+ * cat-compat.c (bindtextdomain): | |
+ Correct implementation. dirname parameter was not used. | |
+ Reported by Marcus Daniels. | |
+ | |
+ * gettextP.h (loaded_domain): | |
+ New fields `successor' and `decided' for oo, lazy | |
+ message handling implementation. | |
+ | |
+ * dcgettext.c: | |
+ Adopt for oo, lazy message handliing. | |
+ Now we can inherit translations from less specific locales. | |
+ (find_msg): New function. | |
+ | |
+ * loadmsgcat.c, finddomain.c: | |
+ Complete rewrite. Implement oo, lazy message handling :-). | |
+ We now have an additional environment variable `LANGUAGE' with | |
+ a higher priority than LC_ALL for the LC_MESSAGE locale. | |
+ Here we can set a colon separated list of specifications each | |
+ of the form `language[_territory[.codeset]][@modifier]'. | |
+ | |
+Sat Aug 5 09:55:42 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * finddomain.c (unistd.h): | |
+ Include to get _PC_PATH_MAX defined on system having it. | |
+ | |
+Fri Aug 4 22:42:00 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * finddomain.c (stpcpy): Include prototype. | |
+ | |
+ * Makefile.in (dist): Remove `copying instead' message. | |
+ | |
+Wed Aug 2 18:52:03 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * Makefile.in (ID, TAGS): Do not use $^. | |
+ | |
+Tue Aug 1 20:07:11 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * Makefile.in (TAGS, ID): Use $^ as command argument. | |
+ (TAGS): Give etags -o option t write to current directory, | |
+ not $(srcdir). | |
+ (ID): Use $(srcdir) instead os $(top_srcdir)/src. | |
+ (distclean): Remove ID. | |
+ | |
+Sun Jul 30 11:51:46 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * Makefile.in (gnulocaledir): | |
+ New variable, always using share/ for data directory. | |
+ (DEFS): Add GNULOCALEDIR, used in finddomain.c. | |
+ | |
+ * finddomain.c (_nl_default_dirname): | |
+ Set to GNULOCALEDIR, because it always has to point | |
+ to the directory where GNU gettext Library writes it to. | |
+ | |
+ * intl-compat.c (textdomain, bindtextdomain): | |
+ Undefine macros before function definition. | |
+ | |
+Sat Jul 22 01:10:02 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * libgettext.h (_LIBINTL_H): | |
+ Protect definition in case where this file is included as | |
+ libgettext.h on Solaris machines. Add comment about this. | |
+ | |
+Wed Jul 19 02:36:42 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * intl-compat.c (textdomain): Correct typo. | |
+ | |
+Wed Jul 19 01:51:35 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * dcgettext.c (dcgettext): Function now called __dcgettext. | |
+ | |
+ * dgettext.c (dgettext): Now called __dgettext and calls | |
+ __dcgettext. | |
+ | |
+ * gettext.c (gettext): | |
+ Function now called __gettext and calls __dgettext. | |
+ | |
+ * textdomain.c (textdomain): Function now called __textdomain. | |
+ | |
+ * bindtextdom.c (bindtextdomain): Function now called | |
+ __bindtextdomain. | |
+ | |
+ * intl-compat.c: Initial revision. | |
+ | |
+ * Makefile.in (SOURCES): Add intl-compat.c. | |
+ (OBJECTS): We always compile the GNU gettext library functions. | |
+ OBJECTS contains all objects but cat-compat.o, ../po/cat-if-tbl.o, | |
+ and intl-compat.o. | |
+ (GETTOBJS): Contains now only intl-compat.o. | |
+ | |
+ * libgettext.h: | |
+ Re-include protection matches dualistic character of libgettext.h. | |
+ For all functions in GNU gettext library define __ counter part. | |
+ | |
+ * finddomain.c (strchr): Define as index if not found in C library. | |
+ (_nl_find_domain): For relative paths paste / in between. | |
+ | |
+Tue Jul 18 16:37:45 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * loadmsgcat.c, finddomain.c: Add inclusion of sys/types.h. | |
+ | |
+ * xopen-msg.sed: Fix bug with `msgstr ""' lines. | |
+ A little bit better comments. | |
+ | |
+Tue Jul 18 01:18:27 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * Makefile.in: | |
+ po-mode.el, makelinks, combine-sh are now found in ../misc. | |
+ | |
+ * po-mode.el, makelinks, combine-sh, elisp-comp: | |
+ Moved to ../misc/. | |
+ | |
+ * libgettext.h, gettextP.h, gettext.h: Uniform test for __STDC__. | |
+ | |
+Sun Jul 16 22:33:02 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * Makefile.in (INSTALL, INSTALL_DATA): New variables. | |
+ (install-data, uninstall): Install/uninstall .elc file. | |
+ | |
+ * po-mode.el (Installation comment): | |
+ Add .pox as possible extension of .po files. | |
+ | |
+Sun Jul 16 13:23:27 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * elisp-comp: Complete new version by Franc,ois: This does not | |
+ fail when not compiling in the source directory. | |
+ | |
+Sun Jul 16 00:12:17 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * Makefile.in (../po/cat-id-tbl.o): | |
+ Use $(MAKE) instead of make for recursive make. | |
+ | |
+ * Makefile.in (.el.elc): Use $(SHELL) instead of /bin/sh. | |
+ (install-exec): Add missing dummy goal. | |
+ (install-data, uninstall): @ in multi-line shell command at | |
+ beginning, not in front of echo. Reported by Eric Backus. | |
+ | |
+Sat Jul 15 00:21:28 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * Makefile.in (DISTFILES): | |
+ Rename libgettext.perl to gettext.perl to fit in 14 chars | |
+ file systems. | |
+ | |
+ * gettext.perl: | |
+ Rename to gettext.perl to fit in 14 chars file systems. | |
+ | |
+Thu Jul 13 23:17:20 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * cat-compat.c: If !STDC_HEADERS try to include malloc.h. | |
+ | |
+Thu Jul 13 20:55:02 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * po2tbl.sed.in: Pretty printing. | |
+ | |
+ * linux-msg.sed, xopen-msg.sed: | |
+ Correct bugs with handling substitute flags in branches. | |
+ | |
+ * hash-string.h (hash_string): | |
+ Old K&R compilers don't under stand `unsigned char'. | |
+ | |
+ * gettext.h (nls_uint32): | |
+ Some old K&R compilers (eg HP) don't understand `unsigned int'. | |
+ | |
+ * cat-compat.c (msg_to_cat_id): De-ANSI-fy prototypes. | |
+ | |
+Thu Jul 13 01:34:33 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * Makefile.in (ELCFILES): New variable. | |
+ (DISTFILES): Add elisp-comp. | |
+ Add implicit rule for .el -> .elc compilation. | |
+ (install-data): install $ELCFILES | |
+ (clean): renamed po-to-tbl and po-to-msg to po2tbl and po2msg resp. | |
+ | |
+ * elisp-comp: Initial revision | |
+ | |
+Wed Jul 12 16:14:52 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * Makefile.in: | |
+ cat-id-tbl.c is now found in po/. This enables us to use an identical | |
+ intl/ directory in all packages. | |
+ | |
+ * dcgettext.c (dcgettext): hashing does not work for table size <= 2. | |
+ | |
+ * textdomain.c: fix typo (#if def -> #if defined) | |
+ | |
+Tue Jul 11 18:44:43 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * Makefile.in (stamp-cat-id): use top_srcdir to address source files | |
+ (DISTFILES,distclean): move tupdate.perl to src/ | |
+ | |
+ * po-to-tbl.sed.in: | |
+ add additional jump to clear change flag to recognize multiline strings | |
+ | |
+Tue Jul 11 01:32:50 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * textdomain.c: Protect inclusion of stdlib.h and string.h. | |
+ | |
+ * loadmsgcat.c: Protect inclusion of stdlib.h. | |
+ | |
+ * libgettext.h: Protect inclusion of locale.h. | |
+ Allow use in C++ programs. | |
+ Define NULL is not happened already. | |
+ | |
+ * Makefile.in (DISTFILES): ship po-to-tbl.sed.in instead of | |
+ po-to-tbl.sed. | |
+ (distclean): remove po-to-tbl.sed and tupdate.perl. | |
+ | |
+ * tupdate.perl.in: Substitute Perl path even in exec line. | |
+ Don't include entries without translation from old .po file. | |
+ | |
+Tue Jul 4 00:41:51 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * tupdate.perl.in: use "Updated: " in msgid "". | |
+ | |
+ * cat-compat.c: Fix typo (LOCALDIR -> LOCALEDIR). | |
+ Define getenv if !__STDC__. | |
+ | |
+ * bindtextdom.c: Protect stdlib.h and string.h inclusion. | |
+ Define free if !__STDC__. | |
+ | |
+ * finddomain.c: Change DEF_MSG_DOM_DIR to LOCALEDIR. | |
+ Define free if !__STDC__. | |
+ | |
+ * cat-compat.c: Change DEF_MSG_DOM_DIR to LOCALEDIR. | |
+ | |
+Mon Jul 3 23:56:30 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * Makefile.in: Use LOCALEDIR instead of DEF_MSG_DOM_DIR. | |
+ Remove unneeded $(srcdir) from Makefile.in dependency. | |
+ | |
+ * makelinks: Add copyright and short description. | |
+ | |
+ * po-mode.el: Last version for 0.7. | |
+ | |
+ * tupdate.perl.in: Fix die message. | |
+ | |
+ * dcgettext.c: Protect include of string.h. | |
+ | |
+ * gettext.c: Protect include of stdlib.h and further tries to get NULL. | |
+ | |
+ * finddomain.c: Some corrections in includes. | |
+ | |
+ * Makefile.in (INCLUDES): Prune list correct path to Makefile.in. | |
+ | |
+ * po-to-tbl.sed: Adopt for new .po file format. | |
+ | |
+ * linux-msg.sed, xopen-msg.sed: Adopt for new .po file format. | |
+ | |
+Sun Jul 2 23:55:03 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * tupdate.perl.in: Complete rewrite for new .po file format. | |
+ | |
+Sun Jul 2 02:06:50 1995 Ulrich Drepper <drepper@myware> | |
+ | |
+ * First official release. This directory contains all the code | |
+ needed to internationalize own packages. It provides functions | |
+ 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. | |
diff --git a/intl/Makefile b/intl/Makefile | |
t@@ -0,0 +1,214 @@ | |
+# Generated automatically from Makefile.in by configure. | |
+# Makefile for directory with message catalog handling in GNU NLS Utilities. | |
+# 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 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. | |
+ | |
+PACKAGE = dopewars | |
+VERSION = 1.4.8-devel | |
+ | |
+SHELL = /bin/sh | |
+ | |
+srcdir = . | |
+top_srcdir = .. | |
+top_builddir = .. | |
+ | |
+prefix = /usr/local | |
+exec_prefix = ${prefix} | |
+transform = s,x,x, | |
+libdir = $(exec_prefix)/lib | |
+includedir = $(prefix)/include | |
+datadir = $(prefix)/share | |
+localedir = $(datadir)/locale | |
+gnulocaledir = $(prefix)/share/locale | |
+gettextsrcdir = ${prefix}/share/gettext/intl | |
+aliaspath = $(localedir):. | |
+subdir = intl | |
+ | |
+INSTALL = /usr/bin/install -c | |
+INSTALL_DATA = ${INSTALL} -m 644 | |
+MKINSTALLDIRS = ./mkinstalldirs | |
+ | |
+l = | |
+ | |
+AR = ar | |
+CC = gcc | |
+LIBTOOL = @LIBTOOL@ | |
+RANLIB = ranlib | |
+ | |
+DEFS = -DLOCALEDIR=\"$(localedir)\" -DGNULOCALEDIR=\"$(gnulocaledir)\" \ | |
+-DLOCALE_ALIAS_PATH=\"$(aliaspath)\" -DHAVE_CONFIG_H | |
+CPPFLAGS = | |
+CFLAGS = -g -O2 -I/usr/lib/glib/include -Wall -DDATADIR=\"${prefix}/share\" | |
+LDFLAGS = -L/usr/lib -lglib | |
+ | |
+COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS) | |
+ | |
+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 \ | |
+finddomain.c loadmsgcat.c localealias.c textdomain.c l10nflist.c \ | |
+explodename.c | |
+OBJECTS = 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.normal = VERSION | |
+DISTFILES.gettext = libintl.glibc intlh.inst.in | |
+ | |
+.SUFFIXES: | |
+.SUFFIXES: .c .o .lo | |
+.c.o: | |
+ $(COMPILE) $< | |
+.c.lo: | |
+ $(LIBTOOL) --mode=compile $(COMPILE) $< | |
+ | |
+INCLUDES = -I.. -I. -I$(top_srcdir)/intl -I$(top_srcdir)/lib | |
+ | |
+all: all-no | |
+ | |
+all-yes: libintl.$la intlh.inst | |
+all-no: | |
+ | |
+libintl.a: $(OBJECTS) | |
+ rm -f $@ | |
+ $(AR) cru $@ $(OBJECTS) | |
+ $(RANLIB) $@ | |
+ | |
+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: all | |
+ | |
+# 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 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 '' = '$(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; \ | |
+ 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 | |
+ | |
+# Define this as empty until I found a useful application. | |
+installcheck: | |
+ | |
+uninstall: | |
+ dists="$(DISTFILES.common)"; \ | |
+ for file in $$dists; do \ | |
+ rm -f $(gettextsrcdir)/$$file; \ | |
+ done | |
+ | |
+info dvi: | |
+ | |
+$(OBJECTS): ../config.h libgettext.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: $(HEADERS) $(SOURCES) | |
+ here=`pwd`; cd $(srcdir) && etags -o $$here/TAGS $(HEADERS) $(SOURCES) | |
+ | |
+id: ID | |
+ | |
+ID: $(HEADERS) $(SOURCES) | |
+ here=`pwd`; cd $(srcdir) && mkid -f$$here/ID $(HEADERS) $(SOURCES) | |
+ | |
+ | |
+mostlyclean: | |
+ rm -f *.a *.o *.lo core core.* | |
+ | |
+clean: mostlyclean | |
+ | |
+distclean: clean | |
+ rm -f Makefile ID TAGS po2msg.sed po2tbl.sed | |
+ | |
+maintainer-clean: distclean | |
+ @echo "This command is intended for maintainers to use;" | |
+ @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) | |
+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 | |
+ | |
+dist-libc: | |
+ tar zcvf intl-glibc.tar.gz $(COMSRCS) $(COMHDRS) libintl.h.glibc | |
+ | |
+Makefile: Makefile.in ../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. | |
+#YES#intlh.inst: intlh.inst.in ../config.status | |
+#YES# cd .. \ | |
+#YES# && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= \ | |
+#YES# $(SHELL) ./config.status | |
+.PHONY: intlh.inst | |
+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. | |
+.NOEXPORT: | |
diff --git a/intl/Makefile.in b/intl/Makefile.in | |
t@@ -0,0 +1,214 @@ | |
+# Makefile for directory with message catalog handling in GNU NLS Utilities. | |
+# 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 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. | |
+ | |
+PACKAGE = @PACKAGE@ | |
+VERSION = @VERSION@ | |
+ | |
+SHELL = /bin/sh | |
+ | |
+srcdir = @srcdir@ | |
+top_srcdir = @top_srcdir@ | |
+top_builddir = .. | |
+VPATH = @srcdir@ | |
+ | |
+prefix = @prefix@ | |
+exec_prefix = @exec_prefix@ | |
+transform = @program_transform_name@ | |
+libdir = $(exec_prefix)/lib | |
+includedir = $(prefix)/include | |
+datadir = $(prefix)/@DATADIRNAME@ | |
+localedir = $(datadir)/locale | |
+gnulocaledir = $(prefix)/share/locale | |
+gettextsrcdir = @datadir@/gettext/intl | |
+aliaspath = $(localedir):. | |
+subdir = intl | |
+ | |
+INSTALL = @INSTALL@ | |
+INSTALL_DATA = @INSTALL_DATA@ | |
+MKINSTALLDIRS = @MKINSTALLDIRS@ | |
+ | |
+l = @l@ | |
+ | |
+AR = ar | |
+CC = @CC@ | |
+LIBTOOL = @LIBTOOL@ | |
+RANLIB = @RANLIB@ | |
+ | |
+DEFS = -DLOCALEDIR=\"$(localedir)\" -DGNULOCALEDIR=\"$(gnulocaledir)\" \ | |
+-DLOCALE_ALIAS_PATH=\"$(aliaspath)\" @DEFS@ | |
+CPPFLAGS = @CPPFLAGS@ | |
+CFLAGS = @CFLAGS@ | |
+LDFLAGS = @LDFLAGS@ | |
+ | |
+COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS) | |
+ | |
+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 \ | |
+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.normal = VERSION | |
+DISTFILES.gettext = libintl.glibc intlh.inst.in | |
+ | |
+.SUFFIXES: | |
+.SUFFIXES: .c .o .lo | |
+.c.o: | |
+ $(COMPILE) $< | |
+.c.lo: | |
+ $(LIBTOOL) --mode=compile $(COMPILE) $< | |
+ | |
+INCLUDES = -I.. -I. -I$(top_srcdir)/intl -I$(top_srcdir)/lib | |
+ | |
+all: all-@USE_INCLUDED_LIBINTL@ | |
+ | |
+all-yes: libintl.$la intlh.inst | |
+all-no: | |
+ | |
+libintl.a: $(OBJECTS) | |
+ rm -f $@ | |
+ $(AR) cru $@ $(OBJECTS) | |
+ $(RANLIB) $@ | |
+ | |
+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: all | |
+ | |
+# 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 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; \ | |
+ 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 | |
+ | |
+# Define this as empty until I found a useful application. | |
+installcheck: | |
+ | |
+uninstall: | |
+ dists="$(DISTFILES.common)"; \ | |
+ for file in $$dists; do \ | |
+ rm -f $(gettextsrcdir)/$$file; \ | |
+ done | |
+ | |
+info dvi: | |
+ | |
+$(OBJECTS): ../config.h libgettext.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: $(HEADERS) $(SOURCES) | |
+ here=`pwd`; cd $(srcdir) && etags -o $$here/TAGS $(HEADERS) $(SOURCES) | |
+ | |
+id: ID | |
+ | |
+ID: $(HEADERS) $(SOURCES) | |
+ here=`pwd`; cd $(srcdir) && mkid -f$$here/ID $(HEADERS) $(SOURCES) | |
+ | |
+ | |
+mostlyclean: | |
+ rm -f *.a *.o *.lo core core.* | |
+ | |
+clean: mostlyclean | |
+ | |
+distclean: clean | |
+ rm -f Makefile ID TAGS po2msg.sed po2tbl.sed | |
+ | |
+maintainer-clean: distclean | |
+ @echo "This command is intended for maintainers to use;" | |
+ @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) | |
+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 | |
+ | |
+dist-libc: | |
+ tar zcvf intl-glibc.tar.gz $(COMSRCS) $(COMHDRS) libintl.h.glibc | |
+ | |
+Makefile: Makefile.in ../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. | |
+@[email protected]: intlh.inst.in ../config.status | |
+@GT_YES@ cd .. \ | |
+@GT_YES@ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= \ | |
+@GT_YES@ $(SHELL) ./config.status | |
+@[email protected]: intlh.inst | |
+@[email protected]: | |
+ | |
+# 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. | |
+.NOEXPORT: | |
diff --git a/intl/VERSION b/intl/VERSION | |
t@@ -0,0 +1 @@ | |
+GNU gettext library from gettext-0.10.35 | |
diff --git a/intl/bindtextdom.c b/intl/bindtextdom.c | |
t@@ -0,0 +1,203 @@ | |
+/* Implementation of the bindtextdomain(3) function | |
+ Copyright (C) 1995, 1996, 1997, 1998 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 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 STDC_HEADERS || defined _LIBC | |
+# include <stdlib.h> | |
+#else | |
+# ifdef HAVE_MALLOC_H | |
+# include <malloc.h> | |
+# else | |
+void free (); | |
+# endif | |
+#endif | |
+ | |
+#if defined HAVE_STRING_H || defined _LIBC | |
+# include <string.h> | |
+#else | |
+# include <strings.h> | |
+# ifndef memcpy | |
+# define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num) | |
+# endif | |
+#endif | |
+ | |
+#ifdef _LIBC | |
+# include <libintl.h> | |
+#else | |
+# include "libgettext.h" | |
+#endif | |
+#include "gettext.h" | |
+#include "gettextP.h" | |
+ | |
+/* @@ end of prolog @@ */ | |
+ | |
+/* Contains the default location of the message catalogs. */ | |
+extern const char _nl_default_dirname[]; | |
+ | |
+/* List with bindings of specific domains. */ | |
+extern struct binding *_nl_domain_bindings; | |
+ | |
+ | |
+/* Names for the libintl functions are a problem. They must not clash | |
+ with existing names and they should follow ANSI C. But this source | |
+ code is also used in GNU C Library where the names have a __ | |
+ prefix. So we have to make a difference here. */ | |
+#ifdef _LIBC | |
+# define BINDTEXTDOMAIN __bindtextdomain | |
+# ifndef strdup | |
+# define strdup(str) __strdup (str) | |
+# endif | |
+#else | |
+# define BINDTEXTDOMAIN bindtextdomain__ | |
+#endif | |
+ | |
+/* Specify that the DOMAINNAME message catalog will be found | |
+ in DIRNAME rather than in the system locale data base. */ | |
+char * | |
+BINDTEXTDOMAIN (domainname, dirname) | |
+ const char *domainname; | |
+ const char *dirname; | |
+{ | |
+ struct binding *binding; | |
+ | |
+ /* Some sanity checks. */ | |
+ if (domainname == NULL || domainname[0] == '\0') | |
+ return NULL; | |
+ | |
+ for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next) | |
+ { | |
+ int compare = strcmp (domainname, binding->domainname); | |
+ if (compare == 0) | |
+ /* We found it! */ | |
+ break; | |
+ if (compare < 0) | |
+ { | |
+ /* It is not in the list. */ | |
+ binding = NULL; | |
+ break; | |
+ } | |
+ } | |
+ | |
+ if (dirname == NULL) | |
+ /* The current binding has be to returned. */ | |
+ return binding == NULL ? (char *) _nl_default_dirname : binding->dirname; | |
+ | |
+ if (binding != NULL) | |
+ { | |
+ /* 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) | |
+ { | |
+ 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); | |
+#endif | |
+ } | |
+ | |
+ if (binding->dirname != _nl_default_dirname) | |
+ free (binding->dirname); | |
+ | |
+ binding->dirname = new_dirname; | |
+ } | |
+ } | |
+ else | |
+ { | |
+ /* We have to create a new binding. */ | |
+#if !defined _LIBC && !defined HAVE_STRDUP | |
+ size_t len; | |
+#endif | |
+ struct binding *new_binding = | |
+ (struct binding *) malloc (sizeof (*new_binding)); | |
+ | |
+ 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) | |
+ return NULL; | |
+ memcpy (new_binding->domainname, domainname, len); | |
+#endif | |
+ | |
+ 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); | |
+#endif | |
+ } | |
+ | |
+ /* Now enqueue it. */ | |
+ if (_nl_domain_bindings == NULL | |
+ || strcmp (domainname, _nl_domain_bindings->domainname) < 0) | |
+ { | |
+ new_binding->next = _nl_domain_bindings; | |
+ _nl_domain_bindings = new_binding; | |
+ } | |
+ else | |
+ { | |
+ binding = _nl_domain_bindings; | |
+ while (binding->next != NULL | |
+ && strcmp (domainname, binding->next->domainname) > 0) | |
+ binding = binding->next; | |
+ | |
+ new_binding->next = binding->next; | |
+ binding->next = new_binding; | |
+ } | |
+ | |
+ binding = new_binding; | |
+ } | |
+ | |
+ return binding->dirname; | |
+} | |
+ | |
+#ifdef _LIBC | |
+/* Alias for function name in GNU C Library. */ | |
+weak_alias (__bindtextdomain, bindtextdomain); | |
+#endif | |
diff --git a/intl/cat-compat.c b/intl/cat-compat.c | |
t@@ -0,0 +1,262 @@ | |
+/* Compatibility code for gettext-using-catgets interface. | |
+ 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 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 <stdio.h> | |
+ | |
+#ifdef STDC_HEADERS | |
+# include <stdlib.h> | |
+# include <string.h> | |
+#else | |
+char *getenv (); | |
+# ifdef HAVE_MALLOC_H | |
+# include <malloc.h> | |
+# endif | |
+#endif | |
+ | |
+#ifdef HAVE_NL_TYPES_H | |
+# include <nl_types.h> | |
+#endif | |
+ | |
+#include "libgettext.h" | |
+ | |
+/* @@ 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; | |
+ | |
+/* Name of the default catalog. */ | |
+static const char default_catalog_name[] = "messages"; | |
+ | |
+/* Name of currently used catalog. */ | |
+static const char *catalog_name = default_catalog_name; | |
+ | |
+/* Get ID for given string. If not found return -1. */ | |
+static int msg_to_cat_id PARAMS ((const char *msg)); | |
+ | |
+/* Substitution for systems lacking this function in their C library. */ | |
+#if !_LIBC && !HAVE_STPCPY | |
+static char *stpcpy PARAMS ((char *dest, const char *src)); | |
+#endif | |
+ | |
+ | |
+/* Set currently used domain/catalog. */ | |
+char * | |
+textdomain (domainname) | |
+ const char *domainname; | |
+{ | |
+ nl_catd new_catalog; | |
+ char *new_name; | |
+ size_t new_name_len; | |
+ char *lang; | |
+ | |
+#if defined HAVE_SETLOCALE && defined HAVE_LC_MESSAGES \ | |
+ && defined HAVE_LOCALE_NULL | |
+ lang = setlocale (LC_MESSAGES, NULL); | |
+#else | |
+ lang = getenv ("LC_ALL"); | |
+ if (lang == NULL || lang[0] == '\0') | |
+ { | |
+ lang = getenv ("LC_MESSAGES"); | |
+ if (lang == NULL || lang[0] == '\0') | |
+ lang = getenv ("LANG"); | |
+ } | |
+#endif | |
+ if (lang == NULL || lang[0] == '\0') | |
+ lang = "C"; | |
+ | |
+ /* See whether name of currently used domain is asked. */ | |
+ if (domainname == NULL) | |
+ return (char *) catalog_name; | |
+ | |
+ if (domainname[0] == '\0') | |
+ domainname = default_catalog_name; | |
+ | |
+ /* Compute length of added path element. */ | |
+ new_name_len = sizeof (LOCALEDIR) - 1 + 1 + strlen (lang) | |
+ + sizeof ("/LC_MESSAGES/") - 1 + sizeof (PACKAGE) - 1 | |
+ + sizeof (".cat"); | |
+ | |
+ new_name = (char *) malloc (new_name_len); | |
+ if (new_name == NULL) | |
+ return NULL; | |
+ | |
+ strcpy (new_name, PACKAGE); | |
+ new_catalog = catopen (new_name, 0); | |
+ | |
+ if (new_catalog == (nl_catd) -1) | |
+ { | |
+ /* NLSPATH search didn't work, try absolute path */ | |
+ sprintf (new_name, "%s/%s/LC_MESSAGES/%s.cat", LOCALEDIR, lang, | |
+ PACKAGE); | |
+ new_catalog = catopen (new_name, 0); | |
+ | |
+ if (new_catalog == (nl_catd) -1) | |
+ { | |
+ free (new_name); | |
+ return (char *) catalog_name; | |
+ } | |
+ } | |
+ | |
+ /* Close old catalog. */ | |
+ if (catalog != (nl_catd) -1) | |
+ catclose (catalog); | |
+ if (catalog_name != default_catalog_name) | |
+ free ((char *) catalog_name); | |
+ | |
+ catalog = new_catalog; | |
+ catalog_name = new_name; | |
+ | |
+ return (char *) catalog_name; | |
+} | |
+ | |
+char * | |
+bindtextdomain (domainname, dirname) | |
+ const char *domainname; | |
+ const char *dirname; | |
+{ | |
+#if HAVE_SETENV || HAVE_PUTENV | |
+ char *old_val, *new_val, *cp; | |
+ size_t new_val_len; | |
+ | |
+ /* This does not make much sense here but to be compatible do it. */ | |
+ if (domainname == NULL) | |
+ return NULL; | |
+ | |
+ /* Compute length of added path element. If we use setenv we don't need | |
+ the first byts for NLSPATH=, but why complicate the code for this | |
+ peanuts. */ | |
+ new_val_len = sizeof ("NLSPATH=") - 1 + strlen (dirname) | |
+ + sizeof ("/%L/LC_MESSAGES/%N.cat"); | |
+ | |
+ old_val = getenv ("NLSPATH"); | |
+ if (old_val == NULL || old_val[0] == '\0') | |
+ { | |
+ old_val = NULL; | |
+ new_val_len += 1 + sizeof (LOCALEDIR) - 1 | |
+ + sizeof ("/%L/LC_MESSAGES/%N.cat"); | |
+ } | |
+ else | |
+ new_val_len += strlen (old_val); | |
+ | |
+ new_val = (char *) malloc (new_val_len); | |
+ if (new_val == NULL) | |
+ return NULL; | |
+ | |
+# if HAVE_SETENV | |
+ cp = new_val; | |
+# else | |
+ cp = stpcpy (new_val, "NLSPATH="); | |
+# endif | |
+ | |
+ cp = stpcpy (cp, dirname); | |
+ cp = stpcpy (cp, "/%L/LC_MESSAGES/%N.cat:"); | |
+ | |
+ if (old_val == NULL) | |
+ { | |
+# if __STDC__ | |
+ stpcpy (cp, LOCALEDIR "/%L/LC_MESSAGES/%N.cat"); | |
+# else | |
+ | |
+ cp = stpcpy (cp, LOCALEDIR); | |
+ stpcpy (cp, "/%L/LC_MESSAGES/%N.cat"); | |
+# endif | |
+ } | |
+ else | |
+ stpcpy (cp, old_val); | |
+ | |
+# if HAVE_SETENV | |
+ setenv ("NLSPATH", new_val, 1); | |
+ free (new_val); | |
+# else | |
+ putenv (new_val); | |
+ /* Do *not* free the environment entry we just entered. It is used | |
+ from now on. */ | |
+# endif | |
+ | |
+#endif | |
+ | |
+ return (char *) domainname; | |
+} | |
+ | |
+#undef gettext | |
+char * | |
+gettext (msg) | |
+ const char *msg; | |
+{ | |
+ int msgid; | |
+ | |
+ if (msg == NULL || catalog == (nl_catd) -1) | |
+ return (char *) msg; | |
+ | |
+ /* Get the message from the catalog. We always use set number 1. | |
+ The message ID is computed by the function `msg_to_cat_id' | |
+ which works on the table generated by `po-to-tbl'. */ | |
+ msgid = msg_to_cat_id (msg); | |
+ if (msgid == -1) | |
+ return (char *) msg; | |
+ | |
+ return catgets (catalog, 1, msgid, (char *) msg); | |
+} | |
+ | |
+/* Look through the table `_msg_tbl' which has `_msg_tbl_length' entries | |
+ for the one equal to msg. If it is found return the ID. In case when | |
+ the string is not found return -1. */ | |
+static int | |
+msg_to_cat_id (msg) | |
+ const char *msg; | |
+{ | |
+ int cnt; | |
+ | |
+ for (cnt = 0; cnt < _msg_tbl_length; ++cnt) | |
+ if (strcmp (msg, _msg_tbl[cnt]._msg) == 0) | |
+ return _msg_tbl[cnt]._msg_number; | |
+ | |
+ return -1; | |
+} | |
+ | |
+ | |
+/* @@ 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/dcgettext.c b/intl/dcgettext.c | |
t@@ -0,0 +1,624 @@ | |
+/* Implementation of the dcgettext(3) function. | |
+ Copyright (C) 1995, 1996, 1997, 1998 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 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 <sys/types.h> | |
+ | |
+#ifdef __GNUC__ | |
+# define alloca __builtin_alloca | |
+# define HAVE_ALLOCA 1 | |
+#else | |
+# if defined HAVE_ALLOCA_H || defined _LIBC | |
+# include <alloca.h> | |
+# else | |
+# ifdef _AIX | |
+ #pragma alloca | |
+# else | |
+# ifndef alloca | |
+char *alloca (); | |
+# endif | |
+# endif | |
+# endif | |
+#endif | |
+ | |
+#include <errno.h> | |
+#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> | |
+#else | |
+char *getenv (); | |
+# ifdef HAVE_MALLOC_H | |
+# include <malloc.h> | |
+# else | |
+void free (); | |
+# endif | |
+#endif | |
+ | |
+#if defined HAVE_STRING_H || defined _LIBC | |
+# ifndef _GNU_SOURCE | |
+# define _GNU_SOURCE 1 | |
+# endif | |
+# include <string.h> | |
+#else | |
+# include <strings.h> | |
+#endif | |
+#if !HAVE_STRCHR && !defined _LIBC | |
+# ifndef strchr | |
+# define strchr index | |
+# endif | |
+#endif | |
+ | |
+#if defined HAVE_UNISTD_H || defined _LIBC | |
+# include <unistd.h> | |
+#endif | |
+ | |
+#include "gettext.h" | |
+#include "gettextP.h" | |
+#ifdef _LIBC | |
+# include <libintl.h> | |
+#else | |
+# include "libgettext.h" | |
+#endif | |
+#include "hash-string.h" | |
+ | |
+/* @@ 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 getcwd __getcwd | |
+# ifndef stpcpy | |
+# define stpcpy __stpcpy | |
+# endif | |
+#else | |
+# if !defined HAVE_GETCWD | |
+char *getwd (); | |
+# define getcwd(buf, max) getwd (buf) | |
+# else | |
+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. */ | |
+#define PATH_INCR 32 | |
+ | |
+/* The following is from pathmax.h. */ | |
+/* Non-POSIX BSD systems might have gcc's limits.h, which doesn't define | |
+ PATH_MAX but might cause redefinition warnings when sys/param.h is | |
+ later included (as on MORE/BSD 4.3). */ | |
+#if defined(_POSIX_VERSION) || (defined(HAVE_LIMITS_H) && !defined(__GNUC__)) | |
+# include <limits.h> | |
+#endif | |
+ | |
+#ifndef _POSIX_PATH_MAX | |
+# define _POSIX_PATH_MAX 255 | |
+#endif | |
+ | |
+#if !defined(PATH_MAX) && defined(_PC_PATH_MAX) | |
+# define PATH_MAX (pathconf ("/", _PC_PATH_MAX) < 1 ? 1024 : pathconf ("/", _P… | |
+#endif | |
+ | |
+/* Don't include sys/param.h if it already has been. */ | |
+#if defined(HAVE_SYS_PARAM_H) && !defined(PATH_MAX) && !defined(MAXPATHLEN) | |
+# include <sys/param.h> | |
+#endif | |
+ | |
+#if !defined(PATH_MAX) && defined(MAXPATHLEN) | |
+# define PATH_MAX MAXPATHLEN | |
+#endif | |
+ | |
+#ifndef PATH_MAX | |
+# define PATH_MAX _POSIX_PATH_MAX | |
+#endif | |
+ | |
+/* 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 | |
+ | |
+/* Name of the default domain used for gettext(3) prior any call to | |
+ textdomain(3). The default value for this is "messages". */ | |
+const char _nl_default_default_domain[] = "messages"; | |
+ | |
+/* Value used as the default domain for gettext(3). */ | |
+const char *_nl_current_default_domain = _nl_default_default_domain; | |
+ | |
+/* Contains the default location of the message catalogs. */ | |
+const char _nl_default_dirname[] = GNULOCALEDIR; | |
+ | |
+/* List with bindings of specific domains created by bindtextdomain() | |
+ calls. */ | |
+struct binding *_nl_domain_bindings; | |
+ | |
+/* Prototypes for local functions. */ | |
+static char *find_msg PARAMS ((struct loaded_l10nfile *domain_file, | |
+ const char *msgid)) internal_function; | |
+static const char *category_to_name PARAMS ((int category)) internal_function; | |
+static const char *guess_category_value PARAMS ((int category, | |
+ const char *categoryname)) | |
+ internal_function; | |
+ | |
+ | |
+/* 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 | |
+ with existing names and they should follow ANSI C. But this source | |
+ code is also used in GNU C Library where the names have a __ | |
+ prefix. So we have to make a difference here. */ | |
+#ifdef _LIBC | |
+# define DCGETTEXT __dcgettext | |
+#else | |
+# define DCGETTEXT dcgettext__ | |
+#endif | |
+ | |
+/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY | |
+ locale. */ | |
+char * | |
+DCGETTEXT (domainname, msgid, category) | |
+ const char *domainname; | |
+ const char *msgid; | |
+ int category; | |
+{ | |
+#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; | |
+ int saved_errno = errno; | |
+ | |
+ /* If no real MSGID is given return NULL. */ | |
+ if (msgid == NULL) | |
+ return NULL; | |
+ | |
+ /* If DOMAINNAME is NULL, we are interested in the default domain. If | |
+ CATEGORY is not LC_MESSAGES this might not make much sense but the | |
+ defintion left this undefined. */ | |
+ if (domainname == NULL) | |
+ domainname = _nl_current_default_domain; | |
+ | |
+ /* First find matching binding. */ | |
+ for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next) | |
+ { | |
+ int compare = strcmp (domainname, binding->domainname); | |
+ if (compare == 0) | |
+ /* We found it! */ | |
+ break; | |
+ if (compare < 0) | |
+ { | |
+ /* It is not in the list. */ | |
+ binding = NULL; | |
+ break; | |
+ } | |
+ } | |
+ | |
+ if (binding == NULL) | |
+ dirname = (char *) _nl_default_dirname; | |
+ else if (binding->dirname[0] == '/') | |
+ dirname = binding->dirname; | |
+ else | |
+ { | |
+ /* We have a relative path. Make it absolute now. */ | |
+ size_t dirname_len = strlen (binding->dirname) + 1; | |
+ size_t path_max; | |
+ char *ret; | |
+ | |
+ path_max = (unsigned) PATH_MAX; | |
+ path_max += 2; /* The getcwd docs say to do this. */ | |
+ | |
+ dirname = (char *) alloca (path_max + dirname_len); | |
+ ADD_BLOCK (block_list, dirname); | |
+ | |
+ __set_errno (0); | |
+ while ((ret = getcwd (dirname, path_max)) == NULL && errno == ERANGE) | |
+ { | |
+ path_max += PATH_INCR; | |
+ dirname = (char *) alloca (path_max + dirname_len); | |
+ ADD_BLOCK (block_list, dirname); | |
+ __set_errno (0); | |
+ } | |
+ | |
+ if (ret == NULL) | |
+ { | |
+ /* 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); | |
+ } | |
+ | |
+ /* Now determine the symbolic name of CATEGORY and its value. */ | |
+ categoryname = category_to_name (category); | |
+ categoryvalue = guess_category_value (category, categoryname); | |
+ | |
+ xdomainname = (char *) alloca (strlen (categoryname) | |
+ + strlen (domainname) + 5); | |
+ ADD_BLOCK (block_list, xdomainname); | |
+ | |
+ stpcpy (stpcpy (stpcpy (stpcpy (xdomainname, categoryname), "/"), | |
+ domainname), | |
+ ".mo"); | |
+ | |
+ /* 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 | |
+ got an ordered list of languages to consider for th translation. */ | |
+ while (1) | |
+ { | |
+ /* Make CATEGORYVALUE point to the next element of the list. */ | |
+ while (categoryvalue[0] != '\0' && categoryvalue[0] == ':') | |
+ ++categoryvalue; | |
+ if (categoryvalue[0] == '\0') | |
+ { | |
+ /* The whole contents of CATEGORYVALUE has been searched but | |
+ no valid entry has been found. We solve this situation | |
+ by implicitly appending a "C" entry, i.e. no translation | |
+ will take place. */ | |
+ single_locale[0] = 'C'; | |
+ single_locale[1] = '\0'; | |
+ } | |
+ else | |
+ { | |
+ char *cp = single_locale; | |
+ while (categoryvalue[0] != '\0' && categoryvalue[0] != ':') | |
+ *cp++ = *categoryvalue++; | |
+ *cp = '\0'; | |
+ } | |
+ | |
+ /* If the current locale value is C (or POSIX) we don't load a | |
+ domain. Return the MSGID. */ | |
+ if (strcmp (single_locale, "C") == 0 | |
+ || strcmp (single_locale, "POSIX") == 0) | |
+ { | |
+ FREE_BLOCKS (block_list); | |
+ __set_errno (saved_errno); | |
+ return (char *) msgid; | |
+ } | |
+ | |
+ | |
+ /* Find structure describing the message catalog matching the | |
+ DOMAINNAME and CATEGORY. */ | |
+ domain = _nl_find_domain (dirname, single_locale, xdomainname); | |
+ | |
+ if (domain != NULL) | |
+ { | |
+ retval = find_msg (domain, msgid); | |
+ | |
+ if (retval == NULL) | |
+ { | |
+ int cnt; | |
+ | |
+ for (cnt = 0; domain->successor[cnt] != NULL; ++cnt) | |
+ { | |
+ retval = find_msg (domain->successor[cnt], msgid); | |
+ | |
+ if (retval != NULL) | |
+ break; | |
+ } | |
+ } | |
+ | |
+ if (retval != NULL) | |
+ { | |
+ FREE_BLOCKS (block_list); | |
+ __set_errno (saved_errno); | |
+ return retval; | |
+ } | |
+ } | |
+ } | |
+ /* NOTREACHED */ | |
+} | |
+ | |
+#ifdef _LIBC | |
+/* Alias for function name in GNU C Library. */ | |
+weak_alias (__dcgettext, dcgettext); | |
+#endif | |
+ | |
+ | |
+static char * | |
+internal_function | |
+find_msg (domain_file, msgid) | |
+ struct loaded_l10nfile *domain_file; | |
+ const char *msgid; | |
+{ | |
+ size_t top, act, bottom; | |
+ struct loaded_domain *domain; | |
+ | |
+ if (domain_file->decided == 0) | |
+ _nl_load_domain (domain_file); | |
+ | |
+ if (domain_file->data == 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) | |
+ { | |
+ /* Use the hashing table. */ | |
+ nls_uint32 len = strlen (msgid); | |
+ nls_uint32 hash_val = hash_string (msgid); | |
+ nls_uint32 idx = hash_val % domain->hash_size; | |
+ nls_uint32 incr = 1 + (hash_val % (domain->hash_size - 2)); | |
+ nls_uint32 nstr = W (domain->must_swap, domain->hash_tab[idx]); | |
+ | |
+ if (nstr == 0) | |
+ /* Hash table entry is empty. */ | |
+ return NULL; | |
+ | |
+ if (W (domain->must_swap, domain->orig_tab[nstr - 1].length) == len | |
+ && strcmp (msgid, | |
+ domain->data + W (domain->must_swap, | |
+ domain->orig_tab[nstr - 1].offset)) == … | |
+ return (char *) domain->data + W (domain->must_swap, | |
+ domain->trans_tab[nstr - 1].offset); | |
+ | |
+ while (1) | |
+ { | |
+ if (idx >= domain->hash_size - incr) | |
+ idx -= domain->hash_size - incr; | |
+ else | |
+ idx += incr; | |
+ | |
+ nstr = W (domain->must_swap, domain->hash_tab[idx]); | |
+ if (nstr == 0) | |
+ /* Hash table entry is empty. */ | |
+ return NULL; | |
+ | |
+ if (W (domain->must_swap, domain->orig_tab[nstr - 1].length) == len | |
+ && strcmp (msgid, | |
+ domain->data + W (domain->must_swap, | |
+ domain->orig_tab[nstr - 1].offset)) | |
+ == 0) | |
+ return (char *) domain->data | |
+ + W (domain->must_swap, domain->trans_tab[nstr - 1].offset); | |
+ } | |
+ /* NOTREACHED */ | |
+ } | |
+ | |
+ /* Now we try the default method: binary search in the sorted | |
+ array of messages. */ | |
+ bottom = 0; | |
+ top = domain->nstrings; | |
+ while (bottom < top) | |
+ { | |
+ int cmp_val; | |
+ | |
+ act = (bottom + top) / 2; | |
+ cmp_val = strcmp (msgid, domain->data | |
+ + W (domain->must_swap, | |
+ domain->orig_tab[act].offset)); | |
+ if (cmp_val < 0) | |
+ top = act; | |
+ else if (cmp_val > 0) | |
+ bottom = act + 1; | |
+ else | |
+ break; | |
+ } | |
+ | |
+ /* If an translation is found return this. */ | |
+ return bottom >= top ? NULL : (char *) domain->data | |
+ + W (domain->must_swap, | |
+ domain->trans_tab[act].offset); | |
+} | |
+ | |
+ | |
+/* Return string representation of locale CATEGORY. */ | |
+static const char * | |
+internal_function | |
+category_to_name (category) | |
+ int category; | |
+{ | |
+ const char *retval; | |
+ | |
+ switch (category) | |
+ { | |
+#ifdef LC_COLLATE | |
+ case LC_COLLATE: | |
+ retval = "LC_COLLATE"; | |
+ break; | |
+#endif | |
+#ifdef LC_CTYPE | |
+ case LC_CTYPE: | |
+ retval = "LC_CTYPE"; | |
+ break; | |
+#endif | |
+#ifdef LC_MONETARY | |
+ case LC_MONETARY: | |
+ retval = "LC_MONETARY"; | |
+ break; | |
+#endif | |
+#ifdef LC_NUMERIC | |
+ case LC_NUMERIC: | |
+ retval = "LC_NUMERIC"; | |
+ break; | |
+#endif | |
+#ifdef LC_TIME | |
+ case LC_TIME: | |
+ retval = "LC_TIME"; | |
+ break; | |
+#endif | |
+#ifdef LC_MESSAGES | |
+ case LC_MESSAGES: | |
+ retval = "LC_MESSAGES"; | |
+ break; | |
+#endif | |
+#ifdef LC_RESPONSE | |
+ case LC_RESPONSE: | |
+ retval = "LC_RESPONSE"; | |
+ break; | |
+#endif | |
+#ifdef LC_ALL | |
+ case LC_ALL: | |
+ /* This might not make sense but is perhaps better than any other | |
+ value. */ | |
+ retval = "LC_ALL"; | |
+ break; | |
+#endif | |
+ default: | |
+ /* If you have a better idea for a default value let me know. */ | |
+ retval = "LC_XXX"; | |
+ } | |
+ | |
+ return retval; | |
+} | |
+ | |
+/* Guess value of current locale from value of the environment variables. */ | |
+static const char * | |
+internal_function | |
+guess_category_value (category, categoryname) | |
+ int category; | |
+ const char *categoryname; | |
+{ | |
+ const char *retval; | |
+ | |
+ /* The highest priority value is the `LANGUAGE' environment | |
+ variable. This is a GNU extension. */ | |
+ retval = getenv ("LANGUAGE"); | |
+ if (retval != NULL && retval[0] != '\0') | |
+ return retval; | |
+ | |
+ /* `LANGUAGE' is not set. So we have to proceed with the POSIX | |
+ methods of looking to `LC_ALL', `LC_xxx', and `LANG'. On some | |
+ systems this can be done by the `setlocale' function itself. */ | |
+#if defined HAVE_SETLOCALE && defined HAVE_LC_MESSAGES && defined HAVE_LOCALE_… | |
+ return setlocale (category, NULL); | |
+#else | |
+ /* Setting of LC_ALL overwrites all other. */ | |
+ retval = getenv ("LC_ALL"); | |
+ if (retval != NULL && retval[0] != '\0') | |
+ return retval; | |
+ | |
+ /* Next comes the name of the desired category. */ | |
+ retval = getenv (categoryname); | |
+ if (retval != NULL && retval[0] != '\0') | |
+ return retval; | |
+ | |
+ /* Last possibility is the LANG environment variable. */ | |
+ retval = getenv ("LANG"); | |
+ if (retval != NULL && retval[0] != '\0') | |
+ return retval; | |
+ | |
+ /* We use C as the default domain. POSIX says this is implementation | |
+ defined. */ | |
+ 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 | |
+ | |
+ | |
+#ifdef _LIBC | |
+/* If we want to free all resources we have to do some work at | |
+ program's end. */ | |
+static void __attribute__ ((unused)) | |
+free_mem (void) | |
+{ | |
+ struct binding *runp; | |
+ | |
+ for (runp = _nl_domain_bindings; runp != NULL; runp = runp->next) | |
+ { | |
+ free (runp->domainname); | |
+ if (runp->dirname != _nl_default_dirname) | |
+ /* Yes, this is a pointer comparison. */ | |
+ free (runp->dirname); | |
+ } | |
+ | |
+ if (_nl_current_default_domain != _nl_default_default_domain) | |
+ /* Yes, again a pointer comparison. */ | |
+ free ((char *) _nl_current_default_domain); | |
+} | |
+ | |
+text_set_element (__libc_subfreeres, free_mem); | |
+#endif | |
diff --git a/intl/dgettext.c b/intl/dgettext.c | |
t@@ -0,0 +1,59 @@ | |
+/* Implementation of the dgettext(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 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_LOCALE_H || defined _LIBC | |
+# include <locale.h> | |
+#endif | |
+ | |
+#ifdef _LIBC | |
+# include <libintl.h> | |
+#else | |
+# include "libgettext.h" | |
+#endif | |
+ | |
+/* @@ end of prolog @@ */ | |
+ | |
+/* Names for the libintl functions are a problem. They must not clash | |
+ with existing names and they should follow ANSI C. But this source | |
+ code is also used in GNU C Library where the names have a __ | |
+ prefix. So we have to make a difference here. */ | |
+#ifdef _LIBC | |
+# define DGETTEXT __dgettext | |
+# define DCGETTEXT __dcgettext | |
+#else | |
+# define DGETTEXT dgettext__ | |
+# define DCGETTEXT dcgettext__ | |
+#endif | |
+ | |
+/* Look up MSGID in the DOMAINNAME message catalog of the current | |
+ LC_MESSAGES locale. */ | |
+char * | |
+DGETTEXT (domainname, msgid) | |
+ const char *domainname; | |
+ const char *msgid; | |
+{ | |
+ return DCGETTEXT (domainname, msgid, LC_MESSAGES); | |
+} | |
+ | |
+#ifdef _LIBC | |
+/* Alias for function name in GNU C Library. */ | |
+weak_alias (__dgettext, dgettext); | |
+#endif | |
diff --git a/intl/explodename.c b/intl/explodename.c | |
t@@ -0,0 +1,188 @@ | |
+/* Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. | |
+ Contributed by Ulrich Drepper <[email protected]>, 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 STDC_HEADERS || defined _LIBC | |
+# include <stdlib.h> | |
+#endif | |
+ | |
+#if defined HAVE_STRING_H || defined _LIBC | |
+# include <string.h> | |
+#else | |
+# include <strings.h> | |
+#endif | |
+#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; | |
+} | |
diff --git a/intl/finddomain.c b/intl/finddomain.c | |
t@@ -0,0 +1,216 @@ | |
+/* Handle list of needed message catalogs | |
+ Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. | |
+ Written by Ulrich Drepper <[email protected]>, 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 <ctype.h> | |
+#include <errno.h> | |
+#include <stdio.h> | |
+#include <sys/types.h> | |
+ | |
+#if defined STDC_HEADERS || defined _LIBC | |
+# include <stdlib.h> | |
+#else | |
+# ifdef HAVE_MALLOC_H | |
+# include <malloc.h> | |
+# else | |
+void free (); | |
+# endif | |
+#endif | |
+ | |
+#if defined HAVE_STRING_H || defined _LIBC | |
+# 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 HAVE_UNISTD_H || defined _LIBC | |
+# include <unistd.h> | |
+#endif | |
+ | |
+#include "gettext.h" | |
+#include "gettextP.h" | |
+#ifdef _LIBC | |
+# include <libintl.h> | |
+#else | |
+# include "libgettext.h" | |
+#endif | |
+ | |
+/* @@ end of prolog @@ */ | |
+/* List of already loaded domains. */ | |
+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. */ | |
+struct loaded_l10nfile * | |
+internal_function | |
+_nl_find_domain (dirname, locale, domainname) | |
+ const char *dirname; | |
+ char *locale; | |
+ const char *domainname; | |
+{ | |
+ struct loaded_l10nfile *retval; | |
+ 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; | |
+ const char *alias_value; | |
+ int mask; | |
+ | |
+ /* 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][+audience][+special][,[sponsor][_revision]] | |
+ | |
+ Beside the first part all of them are allowed to be missing. If | |
+ the full specified locale is not found, the less specific one are | |
+ looked for. The various parts will be stripped off according to | |
+ the following order: | |
+ (1) revision | |
+ (2) sponsor | |
+ (3) special | |
+ (4) codeset | |
+ (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. */ | |
+ 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) | |
+ _nl_load_domain (retval); | |
+ | |
+ if (retval->data != NULL) | |
+ return retval; | |
+ | |
+ for (cnt = 0; retval->successor[cnt] != NULL; ++cnt) | |
+ { | |
+ if (retval->successor[cnt]->decided == 0) | |
+ _nl_load_domain (retval->successor[cnt]); | |
+ | |
+ if (retval->successor[cnt]->data != NULL) | |
+ break; | |
+ } | |
+ return cnt >= 0 ? retval : NULL; | |
+ /* NOTREACHED */ | |
+ } | |
+ | |
+ /* See whether the locale value is an alias. If yes its value | |
+ *overwrites* the alias name. No test for the original value is | |
+ done. */ | |
+ alias_value = _nl_expand_alias (locale); | |
+ if (alias_value != NULL) | |
+ { | |
+#if defined _LIBC || defined HAVE_STRDUP | |
+ locale = strdup (alias_value); | |
+ if (locale == NULL) | |
+ return NULL; | |
+#else | |
+ size_t len = strlen (alias_value) + 1; | |
+ locale = (char *) malloc (len); | |
+ if (locale == NULL) | |
+ return NULL; | |
+ | |
+ memcpy (locale, alias_value, len); | |
+#endif | |
+ } | |
+ | |
+ /* 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 = _nl_explode_name (locale, &language, &modifier, &territory, | |
+ &codeset, &normalized_codeset, &special, | |
+ &sponsor, &revision); | |
+ | |
+ /* Create all possible locale entries which might be interested in | |
+ 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->decided == 0) | |
+ _nl_load_domain (retval); | |
+ if (retval->data == NULL) | |
+ { | |
+ int cnt; | |
+ for (cnt = 0; retval->successor[cnt] != NULL; ++cnt) | |
+ { | |
+ if (retval->successor[cnt]->decided == 0) | |
+ _nl_load_domain (retval->successor[cnt]); | |
+ if (retval->successor[cnt]->data != NULL) | |
+ break; | |
+ } | |
+ } | |
+ | |
+ /* The room for an alias was dynamically allocated. Free it now. */ | |
+ if (alias_value != NULL) | |
+ free (locale); | |
+ | |
+ return retval; | |
+} | |
+ | |
+ | |
+#ifdef _LIBC | |
+static void __attribute__ ((unused)) | |
+free_mem (void) | |
+{ | |
+ struct loaded_l10nfile *runp = _nl_loaded_domains; | |
+ | |
+ while (runp != NULL) | |
+ { | |
+ struct loaded_l10nfile *here = runp; | |
+ if (runp->data != NULL) | |
+ _nl_unload_domain ((struct loaded_domain *) runp->data); | |
+ runp = runp->next; | |
+ free (here); | |
+ } | |
+} | |
+ | |
+text_set_element (__libc_subfreeres, free_mem); | |
+#endif | |
diff --git a/intl/gettext.c b/intl/gettext.c | |
t@@ -0,0 +1,70 @@ | |
+/* 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 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 | |
+ | |
+#ifdef _LIBC | |
+# define __need_NULL | |
+# include <stddef.h> | |
+#else | |
+# ifdef STDC_HEADERS | |
+# include <stdlib.h> /* Just for NULL. */ | |
+# else | |
+# ifdef HAVE_STRING_H | |
+# include <string.h> | |
+# else | |
+# define NULL ((void *) 0) | |
+# endif | |
+# endif | |
+#endif | |
+ | |
+#ifdef _LIBC | |
+# include <libintl.h> | |
+#else | |
+# include "libgettext.h" | |
+#endif | |
+ | |
+/* @@ end of prolog @@ */ | |
+ | |
+/* Names for the libintl functions are a problem. They must not clash | |
+ with existing names and they should follow ANSI C. But this source | |
+ code is also used in GNU C Library where the names have a __ | |
+ prefix. So we have to make a difference here. */ | |
+#ifdef _LIBC | |
+# define GETTEXT __gettext | |
+# define DGETTEXT __dgettext | |
+#else | |
+# define GETTEXT gettext__ | |
+# define DGETTEXT dgettext__ | |
+#endif | |
+ | |
+/* Look up MSGID in the current default message catalog for the current | |
+ LC_MESSAGES locale. If not found, returns MSGID itself (the default | |
+ text). */ | |
+char * | |
+GETTEXT (msgid) | |
+ const char *msgid; | |
+{ | |
+ return DGETTEXT (NULL, msgid); | |
+} | |
+ | |
+#ifdef _LIBC | |
+/* Alias for function name in GNU C Library. */ | |
+weak_alias (__gettext, gettext); | |
+#endif | |
diff --git a/intl/gettext.h b/intl/gettext.h | |
t@@ -0,0 +1,105 @@ | |
+/* 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 | |
+ | |
+#include <stdio.h> | |
+ | |
+#if HAVE_LIMITS_H || _LIBC | |
+# include <limits.h> | |
+#endif | |
+ | |
+/* @@ end of prolog @@ */ | |
+ | |
+/* The magic number of the GNU message catalog format. */ | |
+#define _MAGIC 0x950412de | |
+#define _MAGIC_SWAPPED 0xde120495 | |
+ | |
+/* Revision number of the currently used .mo (binary) file format. */ | |
+#define MO_REVISION_NUMBER 0 | |
+ | |
+/* The following contortions are an attempt to use the C preprocessor | |
+ to determine an unsigned integral type that is 32 bits wide. An | |
+ alternative approach is to use autoconf's AC_CHECK_SIZEOF macro, but | |
+ doing that would require that the configure script compile and *run* | |
+ the resulting executable. Locally running cross-compiled executables | |
+ is usually not possible. */ | |
+ | |
+#if __STDC__ | |
+# define UINT_MAX_32_BITS 4294967295U | |
+#else | |
+# define UINT_MAX_32_BITS 0xFFFFFFFF | |
+#endif | |
+ | |
+/* If UINT_MAX isn't defined, assume it's a 32-bit type. | |
+ This should be valid for all systems GNU cares about because | |
+ that doesn't include 16-bit systems, and only modern systems | |
+ (that certainly have <limits.h>) have 64+-bit integral types. */ | |
+ | |
+#ifndef UINT_MAX | |
+# define UINT_MAX UINT_MAX_32_BITS | |
+#endif | |
+ | |
+#if UINT_MAX == UINT_MAX_32_BITS | |
+typedef unsigned nls_uint32; | |
+#else | |
+# if USHRT_MAX == UINT_MAX_32_BITS | |
+typedef unsigned short nls_uint32; | |
+# else | |
+# if ULONG_MAX == UINT_MAX_32_BITS | |
+typedef unsigned long nls_uint32; | |
+# else | |
+ /* The following line is intended to throw an error. Using #error is | |
+ not portable enough. */ | |
+ "Cannot determine unsigned 32-bit data type." | |
+# endif | |
+# endif | |
+#endif | |
+ | |
+ | |
+/* Header for binary .mo file format. */ | |
+struct mo_file_header | |
+{ | |
+ /* The magic number. */ | |
+ nls_uint32 magic; | |
+ /* The revision number of the file format. */ | |
+ nls_uint32 revision; | |
+ /* The number of strings pairs. */ | |
+ nls_uint32 nstrings; | |
+ /* Offset of table with start offsets of original strings. */ | |
+ nls_uint32 orig_tab_offset; | |
+ /* Offset of table with start offsets of translation strings. */ | |
+ nls_uint32 trans_tab_offset; | |
+ /* Size of hashing table. */ | |
+ nls_uint32 hash_tab_size; | |
+ /* Offset of first hashing entry. */ | |
+ nls_uint32 hash_tab_offset; | |
+}; | |
+ | |
+struct string_desc | |
+{ | |
+ /* Length of addressed string. */ | |
+ nls_uint32 length; | |
+ /* Offset of string in file. */ | |
+ nls_uint32 offset; | |
+}; | |
+ | |
+/* @@ begin of epilog @@ */ | |
+ | |
+#endif /* gettext.h */ | |
diff --git a/intl/gettextP.h b/intl/gettextP.h | |
t@@ -0,0 +1,89 @@ | |
+/* Header describing internals of gettext library | |
+ Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. | |
+ Written by Ulrich Drepper <[email protected]>, 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. */ | |
+ | |
+#ifndef _GETTEXTP_H | |
+#define _GETTEXTP_H | |
+ | |
+#include "loadinfo.h" | |
+ | |
+/* @@ end of prolog @@ */ | |
+ | |
+#ifndef PARAMS | |
+# if __STDC__ | |
+# define PARAMS(args) args | |
+# else | |
+# define PARAMS(args) () | |
+# endif | |
+#endif | |
+ | |
+#ifndef internal_function | |
+# define internal_function | |
+#endif | |
+ | |
+#ifndef W | |
+# define W(flag, data) ((flag) ? SWAP (data) : (data)) | |
+#endif | |
+ | |
+ | |
+#ifdef _LIBC | |
+# include <byteswap.h> | |
+# define SWAP(i) bswap_32 (i) | |
+#else | |
+static nls_uint32 SWAP PARAMS ((nls_uint32 i)); | |
+ | |
+static inline nls_uint32 | |
+SWAP (i) | |
+ nls_uint32 i; | |
+{ | |
+ return (i << 24) | ((i & 0xff00) << 8) | ((i >> 8) & 0xff00) | (i >> 24); | |
+} | |
+#endif | |
+ | |
+ | |
+struct loaded_domain | |
+{ | |
+ const char *data; | |
+ int use_mmap; | |
+ size_t mmap_size; | |
+ int must_swap; | |
+ nls_uint32 nstrings; | |
+ struct string_desc *orig_tab; | |
+ struct string_desc *trans_tab; | |
+ nls_uint32 hash_size; | |
+ nls_uint32 *hash_tab; | |
+}; | |
+ | |
+struct binding | |
+{ | |
+ struct binding *next; | |
+ char *domainname; | |
+ char *dirname; | |
+}; | |
+ | |
+struct loaded_l10nfile *_nl_find_domain PARAMS ((const char *__dirname, | |
+ char *__locale, | |
+ const char *__domainname)) | |
+ internal_function; | |
+void _nl_load_domain PARAMS ((struct loaded_l10nfile *__domain)) | |
+ internal_function; | |
+void _nl_unload_domain PARAMS ((struct loaded_domain *__domain)) | |
+ internal_function; | |
+ | |
+/* @@ begin of epilog @@ */ | |
+ | |
+#endif /* gettextP.h */ | |
diff --git a/intl/hash-string.h b/intl/hash-string.h | |
t@@ -0,0 +1,59 @@ | |
+/* 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 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. */ | |
+ | |
+/* @@ end of prolog @@ */ | |
+ | |
+#ifndef PARAMS | |
+# if __STDC__ | |
+# define PARAMS(Args) Args | |
+# else | |
+# define PARAMS(Args) () | |
+# endif | |
+#endif | |
+ | |
+/* We assume to have `unsigned long int' value with at least 32 bits. */ | |
+#define HASHWORDBITS 32 | |
+ | |
+ | |
+/* 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 PARAMS ((const char *__str_param)); | |
+ | |
+static inline unsigned long | |
+hash_string (str_param) | |
+ const char *str_param; | |
+{ | |
+ unsigned long int hval, g; | |
+ const char *str = str_param; | |
+ | |
+ /* Compute the hash value for the given string. */ | |
+ hval = 0; | |
+ while (*str != '\0') | |
+ { | |
+ hval <<= 4; | |
+ hval += (unsigned long) *str++; | |
+ g = hval & ((unsigned long) 0xf << (HASHWORDBITS - 4)); | |
+ if (g != 0) | |
+ { | |
+ hval ^= g >> (HASHWORDBITS - 8); | |
+ hval ^= g; | |
+ } | |
+ } | |
+ return hval; | |
+} | |
diff --git a/intl/intl-compat.c b/intl/intl-compat.c | |
t@@ -0,0 +1,76 @@ | |
+/* intl-compat.c - Stub functions to call gettext functions from GNU gettext | |
+ Library. | |
+ 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 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 "libgettext.h" | |
+ | |
+/* @@ end of prolog @@ */ | |
+ | |
+ | |
+#undef gettext | |
+#undef dgettext | |
+#undef dcgettext | |
+#undef textdomain | |
+#undef bindtextdomain | |
+ | |
+ | |
+char * | |
+bindtextdomain (domainname, dirname) | |
+ const char *domainname; | |
+ const char *dirname; | |
+{ | |
+ return bindtextdomain__ (domainname, dirname); | |
+} | |
+ | |
+ | |
+char * | |
+dcgettext (domainname, msgid, category) | |
+ const char *domainname; | |
+ const char *msgid; | |
+ int category; | |
+{ | |
+ return dcgettext__ (domainname, msgid, category); | |
+} | |
+ | |
+ | |
+char * | |
+dgettext (domainname, msgid) | |
+ const char *domainname; | |
+ const char *msgid; | |
+{ | |
+ return dgettext__ (domainname, msgid); | |
+} | |
+ | |
+ | |
+char * | |
+gettext (msgid) | |
+ const char *msgid; | |
+{ | |
+ return gettext__ (msgid); | |
+} | |
+ | |
+ | |
+char * | |
+textdomain (domainname) | |
+ const char *domainname; | |
+{ | |
+ return textdomain__ (domainname); | |
+} | |
diff --git a/intl/l10nflist.c b/intl/l10nflist.c | |
t@@ -0,0 +1,411 @@ | |
+/* Handle list of needed message catalogs | |
+ Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. | |
+ Contributed by Ulrich Drepper <[email protected]>, 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. */ | |
+# ifndef stpcpy | |
+# define stpcpy(dest, src) __stpcpy(dest, src) | |
+# endif | |
+#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; | |
+} | |
+ | |
+ | |
+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; | |
+} | |
+ | |
+/* 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 unsigned 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 | |
diff --git a/intl/libgettext.h b/intl/libgettext.h | |
t@@ -0,0 +1,182 @@ | |
+/* Message catalogs for internationalization. | |
+ Copyright (C) 1995, 1996, 1997, 1998 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 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 | |
+ include protection above. But the systems header might perhaps also | |
+ define _LIBINTL_H and therefore we have to protect the definition here. */ | |
+ | |
+#if !defined _LIBINTL_H || !defined _LIBGETTEXT_H | |
+#ifndef _LIBINTL_H | |
+# define _LIBINTL_H 1 | |
+#endif | |
+#define _LIBGETTEXT_H 1 | |
+ | |
+/* We define an additional symbol to signal that we use the GNU | |
+ implementation of gettext. */ | |
+#define __USE_GNU_GETTEXT 1 | |
+ | |
+#include <sys/types.h> | |
+ | |
+#if HAVE_LOCALE_H | |
+# include <locale.h> | |
+#endif | |
+ | |
+ | |
+#ifdef __cplusplus | |
+extern "C" { | |
+#endif | |
+ | |
+/* @@ end of prolog @@ */ | |
+ | |
+#ifndef PARAMS | |
+# if __STDC__ || defined __cplusplus | |
+# define PARAMS(args) args | |
+# else | |
+# define PARAMS(args) () | |
+# endif | |
+#endif | |
+ | |
+#ifndef NULL | |
+# if !defined __cplusplus || defined __GNUC__ | |
+# define NULL ((void *) 0) | |
+# else | |
+# define NULL (0) | |
+# endif | |
+#endif | |
+ | |
+#if !HAVE_LC_MESSAGES | |
+/* This value determines the behaviour of the gettext() and dgettext() | |
+ function. But some system does not have this defined. Define it | |
+ to a default value. */ | |
+# define LC_MESSAGES (-1) | |
+#endif | |
+ | |
+ | |
+/* Declarations for gettext-using-catgets interface. Derived from | |
+ Jim Meyering's libintl.h. */ | |
+struct _msg_ent | |
+{ | |
+ const char *_msg; | |
+ int _msg_number; | |
+}; | |
+ | |
+ | |
+#if HAVE_CATGETS | |
+/* These two variables are defined in the automatically by po-to-tbl.sed | |
+ generated file `cat-id-tbl.c'. */ | |
+extern const struct _msg_ent _msg_tbl[]; | |
+extern int _msg_tbl_length; | |
+#endif | |
+ | |
+ | |
+/* For automatical extraction of messages sometimes no real | |
+ translation is needed. Instead the string itself is the result. */ | |
+#define gettext_noop(Str) (Str) | |
+ | |
+/* 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 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. */ | |
+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. */ | |
+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". */ | |
+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. */ | |
+extern char *bindtextdomain PARAMS ((const char *__domainname, | |
+ const char *__dirname)); | |
+extern char *bindtextdomain__ PARAMS ((const char *__domainname, | |
+ const char *__dirname)); | |
+ | |
+#if ENABLE_NLS | |
+ | |
+/* Solaris 2.3 has the gettext function but dcgettext is missing. | |
+ So we omit this optimization for Solaris 2.3. BTW, Solaris 2.4 | |
+ has dcgettext. */ | |
+# if !HAVE_CATGETS && (!HAVE_GETTEXT || HAVE_DCGETTEXT) | |
+ | |
+# define gettext(Msgid) \ | |
+ dgettext (NULL, Msgid) | |
+ | |
+# define dgettext(Domainname, Msgid) … | |
+ dcgettext (Domainname, Msgid, LC_MESSAGES) | |
+ | |
+# if defined __GNUC__ && __GNUC__ == 2 && __GNUC_MINOR__ >= 7 | |
+/* 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__ \ | |
+ ({ … | |
+ char *__result; … | |
+ if (__builtin_constant_p (Msgid)) … | |
+ { \ | |
+ static char *__translation__; … | |
+ static int __catalog_counter__; \ | |
+ if (! __translation__ || __catalog_counter__ != _nl_msg_cat_cntr) \ | |
+ { … | |
+ __translation__ = … | |
+ dcgettext__ (Domainname, Msgid, Category); … | |
+ __catalog_counter__ = _nl_msg_cat_cntr; … | |
+ } … | |
+ __result = __translation__; … | |
+ } \ | |
+ else … | |
+ __result = dcgettext__ (Domainname, Msgid, Category); … | |
+ __result; … | |
+ })) | |
+# endif | |
+# endif | |
+ | |
+#else | |
+ | |
+# define gettext(Msgid) (Msgid) | |
+# define dgettext(Domainname, Msgid) (Msgid) | |
+# define dcgettext(Domainname, Msgid, Category) (Msgid) | |
+# define textdomain(Domainname) ((char *) Domainname) | |
+# define bindtextdomain(Domainname, Dirname) ((char *) Dirname) | |
+ | |
+#endif | |
+ | |
+/* @@ begin of epilog @@ */ | |
+ | |
+#ifdef __cplusplus | |
+} | |
+#endif | |
+ | |
+#endif | |
diff --git a/intl/linux-msg.sed b/intl/linux-msg.sed | |
t@@ -0,0 +1,100 @@ | |
+# po2msg.sed - Convert Uniforum style .po file to Linux style .msg file | |
+# Copyright (C) 1995 Free Software Foundation, Inc. | |
+# Ulrich Drepper <[email protected]>, 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. | |
+# | |
+# | |
+# The first directive in the .msg should be the definition of the | |
+# message set number. We use always set number 1. | |
+# | |
+1 { | |
+ i\ | |
+$set 1 # Automatically created by po2msg.sed | |
+ h | |
+ s/.*/0/ | |
+ x | |
+} | |
+# | |
+# Mitch's old catalog format does not allow comments. | |
+# | |
+# We copy the original message as a comment into the .msg file. | |
+# | |
+/^msgid/ { | |
+ s/msgid[ ]*"// | |
+# | |
+# This does not work now with the new format. | |
+# /"$/! { | |
+# s/\\$// | |
+# s/$/ ... (more lines following)"/ | |
+# } | |
+ x | |
+# The following nice solution is by | |
+# Bruno <[email protected]> | |
+ td | |
+# Increment a decimal number in pattern space. | |
+# First hide trailing `9' digits. | |
+ :d | |
+ s/9\(_*\)$/_\1/ | |
+ td | |
+# Assure at least one digit is available. | |
+ s/^\(_*\)$/0\1/ | |
+# Increment the last digit. | |
+ s/8\(_*\)$/9\1/ | |
+ s/7\(_*\)$/8\1/ | |
+ s/6\(_*\)$/7\1/ | |
+ s/5\(_*\)$/6\1/ | |
+ s/4\(_*\)$/5\1/ | |
+ s/3\(_*\)$/4\1/ | |
+ s/2\(_*\)$/3\1/ | |
+ s/1\(_*\)$/2\1/ | |
+ s/0\(_*\)$/1\1/ | |
+# Convert the hidden `9' digits to `0's. | |
+ s/_/0/g | |
+ x | |
+ G | |
+ s/\(.*\)"\n\([0-9]*\)/$ #\2 Original Message:(\1)/p | |
+} | |
+# | |
+# The .msg file contains, other then the .po file, only the translations | |
+# but each given a unique ID. Starting from 1 and incrementing by 1 for | |
+# each message we assign them to the messages. | |
+# It is important that the .po file used to generate the cat-id-tbl.c file | |
+# (with po-to-tbl) is the same as the one used here. (At least the order | |
+# of declarations must not be changed.) | |
+# | |
+/^msgstr/ { | |
+ s/msgstr[ ]*"\(.*\)"/# \1/ | |
+# Clear substitution flag. | |
+ tb | |
+# Append the next line. | |
+ :b | |
+ N | |
+# Look whether second part is continuation line. | |
+ s/\(.*\n\)"\(.*\)"/\1\2/ | |
+# Yes, then branch. | |
+ ta | |
+ P | |
+ D | |
+# Note that D includes a jump to the start!! | |
+# We found a continuation line. But before printing insert '\'. | |
+ :a | |
+ s/\(.*\)\(\n.*\)/\1\\\2/ | |
+ P | |
+# We cannot use D here. | |
+ s/.*\n\(.*\)/\1/ | |
+ tb | |
+} | |
+d | |
diff --git a/intl/loadinfo.h b/intl/loadinfo.h | |
t@@ -0,0 +1,76 @@ | |
+/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. | |
+ This file is part of the GNU C Library. | |
+ Contributed by Ulrich Drepper <[email protected]>, 1996. | |
+ | |
+ 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. */ | |
+ | |
+#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 unsigned 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)); | |
diff --git a/intl/loadmsgcat.c b/intl/loadmsgcat.c | |
t@@ -0,0 +1,222 @@ | |
+/* Load needed message catalogs. | |
+ Copyright (C) 1995, 1996, 1997, 1998 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 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 <fcntl.h> | |
+#include <sys/types.h> | |
+#include <sys/stat.h> | |
+ | |
+#if defined STDC_HEADERS || defined _LIBC | |
+# include <stdlib.h> | |
+#endif | |
+ | |
+#if defined HAVE_UNISTD_H || defined _LIBC | |
+# include <unistd.h> | |
+#endif | |
+ | |
+#if (defined HAVE_MMAP && defined HAVE_MUNMAP) || defined _LIBC | |
+# include <sys/mman.h> | |
+#endif | |
+ | |
+#include "gettext.h" | |
+#include "gettextP.h" | |
+ | |
+/* @@ end of prolog @@ */ | |
+ | |
+#ifdef _LIBC | |
+/* 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 open __open | |
+# define close __close | |
+# define read __read | |
+# define mmap __mmap | |
+# define munmap __munmap | |
+#endif | |
+ | |
+/* 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 = 0; | |
+ | |
+ | |
+/* Load the message catalogs specified by FILENAME. If it is no valid | |
+ message catalog do nothing. */ | |
+void | |
+internal_function | |
+_nl_load_domain (domain_file) | |
+ struct loaded_l10nfile *domain_file; | |
+{ | |
+ int fd; | |
+ size_t size; | |
+ struct stat st; | |
+ struct mo_file_header *data = (struct mo_file_header *) -1; | |
+#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \ | |
+ || defined _LIBC | |
+ int use_mmap = 0; | |
+#endif | |
+ struct loaded_domain *domain; | |
+ | |
+ 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 (domain_file->filename == NULL) | |
+ return; | |
+ | |
+ /* Try to open the addressed file. */ | |
+ fd = open (domain_file->filename, O_RDONLY); | |
+ if (fd == -1) | |
+ return; | |
+ | |
+ /* We must know about the size of the file. */ | |
+ if (fstat (fd, &st) != 0 | |
+ || (size = (size_t) st.st_size) != st.st_size | |
+ || size < sizeof (struct mo_file_header)) | |
+ { | |
+ /* Something went wrong. */ | |
+ close (fd); | |
+ return; | |
+ } | |
+ | |
+#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \ | |
+ || defined _LIBC | |
+ /* Now we are ready to load the file. If mmap() is available we try | |
+ this first. If not available or it failed we try to load it. */ | |
+ data = (struct mo_file_header *) mmap (NULL, size, PROT_READ, | |
+ MAP_PRIVATE, fd, 0); | |
+ | |
+ if (data != (struct mo_file_header *) -1) | |
+ { | |
+ /* mmap() call was successful. */ | |
+ close (fd); | |
+ use_mmap = 1; | |
+ } | |
+#endif | |
+ | |
+ /* If the data is not yet available (i.e. mmap'ed) we try to load | |
+ it manually. */ | |
+ if (data == (struct mo_file_header *) -1) | |
+ { | |
+ size_t to_read; | |
+ char *read_ptr; | |
+ | |
+ data = (struct mo_file_header *) malloc (size); | |
+ if (data == NULL) | |
+ return; | |
+ | |
+ to_read = size; | |
+ read_ptr = (char *) data; | |
+ do | |
+ { | |
+ long int nb = (long int) read (fd, read_ptr, to_read); | |
+ if (nb == -1) | |
+ { | |
+ close (fd); | |
+ return; | |
+ } | |
+ | |
+ read_ptr += nb; | |
+ to_read -= nb; | |
+ } | |
+ while (to_read > 0); | |
+ | |
+ close (fd); | |
+ } | |
+ | |
+ /* Using the magic number we can test whether it really is a message | |
+ catalog file. */ | |
+ if (data->magic != _MAGIC && data->magic != _MAGIC_SWAPPED) | |
+ { | |
+ /* The magic number is wrong: not a message catalog file. */ | |
+#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \ | |
+ || defined _LIBC | |
+ if (use_mmap) | |
+ munmap ((caddr_t) data, size); | |
+ else | |
+#endif | |
+ free (data); | |
+ 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; | |
+#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \ | |
+ || defined _LIBC | |
+ domain->use_mmap = use_mmap; | |
+#endif | |
+ domain->mmap_size = size; | |
+ domain->must_swap = data->magic != _MAGIC; | |
+ | |
+ /* Fill in the information about the available tables. */ | |
+ switch (W (domain->must_swap, data->revision)) | |
+ { | |
+ case 0: | |
+ domain->nstrings = W (domain->must_swap, data->nstrings); | |
+ domain->orig_tab = (struct string_desc *) | |
+ ((char *) data + W (domain->must_swap, data->orig_tab_offset)); | |
+ domain->trans_tab = (struct string_desc *) | |
+ ((char *) data + W (domain->must_swap, data->trans_tab_offset)); | |
+ domain->hash_size = W (domain->must_swap, data->hash_tab_size); | |
+ domain->hash_tab = (nls_uint32 *) | |
+ ((char *) data + W (domain->must_swap, data->hash_tab_offset)); | |
+ break; | |
+ default: | |
+ /* This is an illegal revision. */ | |
+#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \ | |
+ || defined _LIBC | |
+ if (use_mmap) | |
+ munmap ((caddr_t) data, size); | |
+ else | |
+#endif | |
+ free (data); | |
+ free (domain); | |
+ domain_file->data = NULL; | |
+ return; | |
+ } | |
+ | |
+ /* Show that one domain is changed. This might make some cached | |
+ translations invalid. */ | |
+ ++_nl_msg_cat_cntr; | |
+} | |
+ | |
+ | |
+#ifdef _LIBC | |
+void | |
+internal_function | |
+_nl_unload_domain (domain) | |
+ struct loaded_domain *domain; | |
+{ | |
+ if (domain->use_mmap) | |
+ munmap ((caddr_t) domain->data, domain->mmap_size); | |
+ else | |
+ free ((void *) domain->data); | |
+ | |
+ free (domain); | |
+} | |
+#endif | |
diff --git a/intl/localealias.c b/intl/localealias.c | |
t@@ -0,0 +1,424 @@ | |
+/* Handle aliases for locale names. | |
+ Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. | |
+ Written by Ulrich Drepper <[email protected]>, 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 <ctype.h> | |
+#include <stdio.h> | |
+#include <sys/types.h> | |
+ | |
+#ifdef __GNUC__ | |
+# define alloca __builtin_alloca | |
+# define HAVE_ALLOCA 1 | |
+#else | |
+# if defined HAVE_ALLOCA_H || defined _LIBC | |
+# include <alloca.h> | |
+# else | |
+# ifdef _AIX | |
+ #pragma alloca | |
+# else | |
+# ifndef alloca | |
+char *alloca (); | |
+# endif | |
+# endif | |
+# endif | |
+#endif | |
+ | |
+#if defined STDC_HEADERS || defined _LIBC | |
+# include <stdlib.h> | |
+#else | |
+char *getenv (); | |
+# ifdef HAVE_MALLOC_H | |
+# include <malloc.h> | |
+# else | |
+void free (); | |
+# endif | |
+#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 | |
+ | |
+#include "gettext.h" | |
+#include "gettextP.h" | |
+ | |
+/* @@ 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 strcasecmp __strcasecmp | |
+ | |
+# define mempcpy __mempcpy | |
+# define HAVE_MEMPCPY 1 | |
+ | |
+/* We need locking here since we can be called from different places. */ | |
+# include <bits/libc-lock.h> | |
+ | |
+__libc_lock_define_initialized (static, lock); | |
+#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; | |
+ const char *value; | |
+}; | |
+ | |
+ | |
+static char *string_space = NULL; | |
+static size_t string_space_act = 0; | |
+static size_t string_space_max = 0; | |
+static struct alias_map *map; | |
+static size_t nmap = 0; | |
+static size_t maxmap = 0; | |
+ | |
+ | |
+/* Prototypes for local functions. */ | |
+static size_t read_alias_file PARAMS ((const char *fname, int fname_len)) | |
+ internal_function; | |
+static void extend_alias_table PARAMS ((void)); | |
+static int alias_compare PARAMS ((const struct alias_map *map1, | |
+ const struct alias_map *map2)); | |
+ | |
+ | |
+const char * | |
+_nl_expand_alias (name) | |
+ const char *name; | |
+{ | |
+ static const char *locale_alias_path = LOCALE_ALIAS_PATH; | |
+ struct alias_map *retval; | |
+ const char *result = NULL; | |
+ size_t added; | |
+ | |
+#ifdef _LIBC | |
+ __libc_lock_lock (lock); | |
+#endif | |
+ | |
+ do | |
+ { | |
+ struct alias_map item; | |
+ | |
+ item.alias = name; | |
+ | |
+ if (nmap > 0) | |
+ retval = (struct alias_map *) bsearch (&item, map, nmap, | |
+ sizeof (struct alias_map), | |
+ (int (*) PARAMS ((const void *, | |
+ const void *)) | |
+ ) alias_compare); | |
+ else | |
+ retval = NULL; | |
+ | |
+ /* We really found an alias. Return the value. */ | |
+ if (retval != NULL) | |
+ { | |
+ result = retval->value; | |
+ break; | |
+ } | |
+ | |
+ /* Perhaps we can find another alias file. */ | |
+ added = 0; | |
+ while (added == 0 && locale_alias_path[0] != '\0') | |
+ { | |
+ const char *start; | |
+ | |
+ while (locale_alias_path[0] == ':') | |
+ ++locale_alias_path; | |
+ start = locale_alias_path; | |
+ | |
+ while (locale_alias_path[0] != '\0' && locale_alias_path[0] != ':') | |
+ ++locale_alias_path; | |
+ | |
+ if (start < locale_alias_path) | |
+ added = read_alias_file (start, locale_alias_path - start); | |
+ } | |
+ } | |
+ while (added != 0); | |
+ | |
+#ifdef _LIBC | |
+ __libc_lock_unlock (lock); | |
+#endif | |
+ | |
+ return result; | |
+} | |
+ | |
+ | |
+static size_t | |
+internal_function | |
+read_alias_file (fname, 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); | |
+ ADD_BLOCK (block_list, full_fname); | |
+#ifdef HAVE_MEMPCPY | |
+ mempcpy (mempcpy (full_fname, fname, fname_len), | |
+ aliasfile, sizeof aliasfile); | |
+#else | |
+ memcpy (full_fname, fname, fname_len); | |
+ memcpy (&full_fname[fname_len], aliasfile, sizeof aliasfile); | |
+#endif | |
+ | |
+ fp = fopen (full_fname, "r"); | |
+ if (fp == NULL) | |
+ { | |
+ FREE_BLOCKS (block_list); | |
+ return 0; | |
+ } | |
+ | |
+ added = 0; | |
+ while (!feof (fp)) | |
+ { | |
+ /* It is a reasonable approach to use a fix buffer here because | |
+ a) we are only interested in the first two fields | |
+ b) these fields must be usable as file names and so must not | |
+ be that long | |
+ */ | |
+ unsigned char buf[BUFSIZ]; | |
+ unsigned char *alias; | |
+ unsigned char *value; | |
+ unsigned char *cp; | |
+ | |
+ if (fgets (buf, sizeof buf, fp) == NULL) | |
+ /* EOF reached. */ | |
+ break; | |
+ | |
+ /* Possibly not the whole line fits into the buffer. Ignore | |
+ the rest of the line. */ | |
+ if (strchr (buf, '\n') == NULL) | |
+ { | |
+ char altbuf[BUFSIZ]; | |
+ do | |
+ if (fgets (altbuf, sizeof altbuf, fp) == NULL) | |
+ /* Make sure the inner loop will be left. The outer loop | |
+ will exit at the `feof' test. */ | |
+ break; | |
+ while (strchr (altbuf, '\n') == NULL); | |
+ } | |
+ | |
+ cp = buf; | |
+ /* Ignore leading white space. */ | |
+ while (isspace (cp[0])) | |
+ ++cp; | |
+ | |
+ /* A leading '#' signals a comment line. */ | |
+ if (cp[0] != '\0' && cp[0] != '#') | |
+ { | |
+ alias = cp++; | |
+ while (cp[0] != '\0' && !isspace (cp[0])) | |
+ ++cp; | |
+ /* Terminate alias name. */ | |
+ if (cp[0] != '\0') | |
+ *cp++ = '\0'; | |
+ | |
+ /* Now look for the beginning of the value. */ | |
+ while (isspace (cp[0])) | |
+ ++cp; | |
+ | |
+ if (cp[0] != '\0') | |
+ { | |
+ size_t alias_len; | |
+ size_t value_len; | |
+ | |
+ value = cp++; | |
+ while (cp[0] != '\0' && !isspace (cp[0])) | |
+ ++cp; | |
+ /* Terminate value. */ | |
+ if (cp[0] == '\n') | |
+ { | |
+ /* This has to be done to make the following test | |
+ for the end of line possible. We are looking for | |
+ the terminating '\n' which do not overwrite here. */ | |
+ *cp++ = '\0'; | |
+ *cp = '\n'; | |
+ } | |
+ else if (cp[0] != '\0') | |
+ *cp++ = '\0'; | |
+ | |
+ if (nmap >= maxmap) | |
+ extend_alias_table (); | |
+ | |
+ alias_len = strlen (alias) + 1; | |
+ value_len = strlen (value) + 1; | |
+ | |
+ if (string_space_act + alias_len + value_len > string_space_max) | |
+ { | |
+ /* Increase size of memory pool. */ | |
+ size_t new_size = (string_space_max | |
+ + (alias_len + value_len > 1024 | |
+ ? alias_len + value_len : 1024)); | |
+ char *new_pool = (char *) realloc (string_space, new_size); | |
+ if (new_pool == NULL) | |
+ { | |
+ FREE_BLOCKS (block_list); | |
+ return added; | |
+ } | |
+ string_space = new_pool; | |
+ string_space_max = new_size; | |
+ } | |
+ | |
+ map[nmap].alias = memcpy (&string_space[string_space_act], | |
+ alias, alias_len); | |
+ string_space_act += alias_len; | |
+ | |
+ map[nmap].value = memcpy (&string_space[string_space_act], | |
+ value, value_len); | |
+ string_space_act += value_len; | |
+ | |
+ ++nmap; | |
+ ++added; | |
+ } | |
+ } | |
+ } | |
+ | |
+ /* Should we test for ferror()? I think we have to silently ignore | |
+ errors. --drepper */ | |
+ fclose (fp); | |
+ | |
+ if (added > 0) | |
+ qsort (map, nmap, sizeof (struct alias_map), | |
+ (int (*) PARAMS ((const void *, const void *))) alias_compare); | |
+ | |
+ FREE_BLOCKS (block_list); | |
+ return added; | |
+} | |
+ | |
+ | |
+static void | |
+extend_alias_table () | |
+{ | |
+ size_t new_size; | |
+ struct alias_map *new_map; | |
+ | |
+ new_size = maxmap == 0 ? 100 : 2 * maxmap; | |
+ new_map = (struct alias_map *) realloc (map, (new_size | |
+ * sizeof (struct alias_map))); | |
+ if (new_map == NULL) | |
+ /* Simply don't extend: we don't have any more core. */ | |
+ return; | |
+ | |
+ map = new_map; | |
+ maxmap = new_size; | |
+} | |
+ | |
+ | |
+#ifdef _LIBC | |
+static void __attribute__ ((unused)) | |
+free_mem (void) | |
+{ | |
+ if (string_space != NULL) | |
+ free (string_space); | |
+ if (map != NULL) | |
+ free (map); | |
+} | |
+text_set_element (__libc_subfreeres, free_mem); | |
+#endif | |
+ | |
+ | |
+static int | |
+alias_compare (map1, map2) | |
+ const struct alias_map *map1; | |
+ const struct alias_map *map2; | |
+{ | |
+#if defined _LIBC || defined HAVE_STRCASECMP | |
+ return strcasecmp (map1->alias, map2->alias); | |
+#else | |
+ const unsigned char *p1 = (const unsigned char *) map1->alias; | |
+ const unsigned char *p2 = (const unsigned char *) map2->alias; | |
+ unsigned char c1, c2; | |
+ | |
+ if (p1 == p2) | |
+ return 0; | |
+ | |
+ do | |
+ { | |
+ /* I know this seems to be odd but the tolower() function in | |
+ some systems libc cannot handle nonalpha characters. */ | |
+ c1 = isupper (*p1) ? tolower (*p1) : *p1; | |
+ c2 = isupper (*p2) ? tolower (*p2) : *p2; | |
+ if (c1 == '\0') | |
+ break; | |
+ ++p1; | |
+ ++p2; | |
+ } | |
+ while (c1 == c2); | |
+ | |
+ return c1 - c2; | |
+#endif | |
+} | |
diff --git a/intl/po2tbl.sed b/intl/po2tbl.sed | |
t@@ -0,0 +1,60 @@ | |
+1 { | |
+ i\ | |
+/* Automatically generated by po2tbl.sed from @PACKAGE [email protected]. */\ | |
+\ | |
+#if HAVE_CONFIG_H\ | |
+# include <config.h>\ | |
+#endif\ | |
+\ | |
+#include "libgettext.h"\ | |
+\ | |
+const struct _msg_ent _msg_tbl[] = { | |
+ h | |
+ s/.*/0/ | |
+ x | |
+} | |
+/^msgid/ { | |
+ s/msgid[ ]*\(".*"\)/ {\1/ | |
+ tb | |
+ :b | |
+ N | |
+ s/\(.*\)"\(\n\)"\(.*"\)/\1\2\3/ | |
+ ta | |
+ s/\(.*\)\n.*/\1/ | |
+ bc | |
+ :a | |
+ s/\(.*\)\(\n.*\)/\1\\\2/ | |
+ P | |
+ s/.*\n\(.*\)/\1/ | |
+ tb | |
+ :c | |
+ x | |
+ td | |
+ :d | |
+ s/9\(_*\)$/_\1/ | |
+ td | |
+ s/^\(_*\)$/0\1/ | |
+ s/8\(_*\)$/9\1/ | |
+ s/7\(_*\)$/8\1/ | |
+ s/6\(_*\)$/7\1/ | |
+ s/5\(_*\)$/6\1/ | |
+ s/4\(_*\)$/5\1/ | |
+ s/3\(_*\)$/4\1/ | |
+ s/2\(_*\)$/3\1/ | |
+ s/1\(_*\)$/2\1/ | |
+ s/0\(_*\)$/1\1/ | |
+ s/_/0/g | |
+ x | |
+ G | |
+ s/\(.*\)\n\([0-9]*\)/\1, \2},/ | |
+ s/\(.*\)"$/\1/ | |
+ p | |
+} | |
+$ { | |
+ i\ | |
+};\ | |
+ | |
+ g | |
+ s/0*\(.*\)/int _msg_tbl_length = \1;/p | |
+} | |
+d | |
diff --git a/intl/po2tbl.sed.in b/intl/po2tbl.sed.in | |
t@@ -0,0 +1,102 @@ | |
+# po2tbl.sed - Convert Uniforum style .po file to lookup table for catgets | |
+# Copyright (C) 1995 Free Software Foundation, Inc. | |
+# Ulrich Drepper <[email protected]>, 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. | |
+# | |
+1 { | |
+ i\ | |
+/* Automatically generated by po2tbl.sed from @PACKAGE [email protected]. */\ | |
+\ | |
+#if HAVE_CONFIG_H\ | |
+# include <config.h>\ | |
+#endif\ | |
+\ | |
+#include "libgettext.h"\ | |
+\ | |
+const struct _msg_ent _msg_tbl[] = { | |
+ h | |
+ s/.*/0/ | |
+ x | |
+} | |
+# | |
+# Write msgid entries in C array form. | |
+# | |
+/^msgid/ { | |
+ s/msgid[ ]*\(".*"\)/ {\1/ | |
+ tb | |
+# Append the next line | |
+ :b | |
+ N | |
+# Look whether second part is continuation line. | |
+ s/\(.*\)"\(\n\)"\(.*"\)/\1\2\3/ | |
+# Yes, then branch. | |
+ ta | |
+# Because we assume that the input file correctly formed the line | |
+# just read cannot be again be a msgid line. So it's safe to ignore | |
+# it. | |
+ s/\(.*\)\n.*/\1/ | |
+ bc | |
+# We found a continuation line. But before printing insert '\'. | |
+ :a | |
+ s/\(.*\)\(\n.*\)/\1\\\2/ | |
+ P | |
+# We cannot use D here. | |
+ s/.*\n\(.*\)/\1/ | |
+# Some buggy seds do not clear the `successful substitution since last ``t''' | |
+# flag on `N', so we do a `t' here to clear it. | |
+ tb | |
+# Not reached | |
+ :c | |
+ x | |
+# The following nice solution is by | |
+# Bruno <[email protected]> | |
+ td | |
+# Increment a decimal number in pattern space. | |
+# First hide trailing `9' digits. | |
+ :d | |
+ s/9\(_*\)$/_\1/ | |
+ td | |
+# Assure at least one digit is available. | |
+ s/^\(_*\)$/0\1/ | |
+# Increment the last digit. | |
+ s/8\(_*\)$/9\1/ | |
+ s/7\(_*\)$/8\1/ | |
+ s/6\(_*\)$/7\1/ | |
+ s/5\(_*\)$/6\1/ | |
+ s/4\(_*\)$/5\1/ | |
+ s/3\(_*\)$/4\1/ | |
+ s/2\(_*\)$/3\1/ | |
+ s/1\(_*\)$/2\1/ | |
+ s/0\(_*\)$/1\1/ | |
+# Convert the hidden `9' digits to `0's. | |
+ s/_/0/g | |
+ x | |
+ G | |
+ s/\(.*\)\n\([0-9]*\)/\1, \2},/ | |
+ s/\(.*\)"$/\1/ | |
+ p | |
+} | |
+# | |
+# Last line. | |
+# | |
+$ { | |
+ i\ | |
+};\ | |
+ | |
+ g | |
+ s/0*\(.*\)/int _msg_tbl_length = \1;/p | |
+} | |
+d | |
diff --git a/intl/textdomain.c b/intl/textdomain.c | |
t@@ -0,0 +1,108 @@ | |
+/* Implementation of the textdomain(3) function. | |
+ Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. | |
+ Written by Ulrich Drepper <[email protected]>, 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 STDC_HEADERS || defined _LIBC | |
+# include <stdlib.h> | |
+#endif | |
+ | |
+#if defined STDC_HEADERS || defined HAVE_STRING_H || defined _LIBC | |
+# include <string.h> | |
+#else | |
+# include <strings.h> | |
+# ifndef memcpy | |
+# define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num) | |
+# endif | |
+#endif | |
+ | |
+#ifdef _LIBC | |
+# include <libintl.h> | |
+#else | |
+# include "libgettext.h" | |
+#endif | |
+ | |
+/* @@ end of prolog @@ */ | |
+ | |
+/* Name of the default text domain. */ | |
+extern const char _nl_default_default_domain[]; | |
+ | |
+/* Default text domain in which entries for gettext(3) are to be found. */ | |
+extern const char *_nl_current_default_domain; | |
+ | |
+ | |
+/* Names for the libintl functions are a problem. They must not clash | |
+ with existing names and they should follow ANSI C. But this source | |
+ code is also used in GNU C Library where the names have a __ | |
+ prefix. So we have to make a difference here. */ | |
+#ifdef _LIBC | |
+# define TEXTDOMAIN __textdomain | |
+# ifndef strdup | |
+# define strdup(str) __strdup (str) | |
+# endif | |
+#else | |
+# define TEXTDOMAIN textdomain__ | |
+#endif | |
+ | |
+/* 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". */ | |
+char * | |
+TEXTDOMAIN (domainname) | |
+ const char *domainname; | |
+{ | |
+ char *old; | |
+ | |
+ /* A NULL pointer requests the current setting. */ | |
+ if (domainname == NULL) | |
+ return (char *) _nl_current_default_domain; | |
+ | |
+ old = (char *) _nl_current_default_domain; | |
+ | |
+ /* If domain name is the null string set to default domain "messages". */ | |
+ if (domainname[0] == '\0' | |
+ || strcmp (domainname, _nl_default_default_domain) == 0) | |
+ _nl_current_default_domain = _nl_default_default_domain; | |
+ else | |
+ { | |
+ /* 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; | |
+#endif | |
+ } | |
+ | |
+ if (old != _nl_default_default_domain) | |
+ free (old); | |
+ | |
+ return (char *) _nl_current_default_domain; | |
+} | |
+ | |
+#ifdef _LIBC | |
+/* Alias for function name in GNU C Library. */ | |
+weak_alias (__textdomain, textdomain); | |
+#endif | |
diff --git a/intl/xopen-msg.sed b/intl/xopen-msg.sed | |
t@@ -0,0 +1,104 @@ | |
+# po2msg.sed - Convert Uniforum style .po file to X/Open style .msg file | |
+# Copyright (C) 1995 Free Software Foundation, Inc. | |
+# Ulrich Drepper <[email protected]>, 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. | |
+# | |
+# | |
+# The first directive in the .msg should be the definition of the | |
+# message set number. We use always set number 1. | |
+# | |
+1 { | |
+ i\ | |
+$set 1 # Automatically created by po2msg.sed | |
+ h | |
+ s/.*/0/ | |
+ x | |
+} | |
+# | |
+# We copy all comments into the .msg file. Perhaps they can help. | |
+# | |
+/^#/ s/^#[ ]*/$ /p | |
+# | |
+# We copy the original message as a comment into the .msg file. | |
+# | |
+/^msgid/ { | |
+# Does not work now | |
+# /"$/! { | |
+# s/\\$// | |
+# s/$/ ... (more lines following)"/ | |
+# } | |
+ s/^msgid[ ]*"\(.*\)"$/$ Original Message: \1/ | |
+ p | |
+} | |
+# | |
+# The .msg file contains, other then the .po file, only the translations | |
+# but each given a unique ID. Starting from 1 and incrementing by 1 for | |
+# each message we assign them to the messages. | |
+# It is important that the .po file used to generate the cat-id-tbl.c file | |
+# (with po-to-tbl) is the same as the one used here. (At least the order | |
+# of declarations must not be changed.) | |
+# | |
+/^msgstr/ { | |
+ s/msgstr[ ]*"\(.*\)"/\1/ | |
+ x | |
+# The following nice solution is by | |
+# Bruno <[email protected]> | |
+ td | |
+# Increment a decimal number in pattern space. | |
+# First hide trailing `9' digits. | |
+ :d | |
+ s/9\(_*\)$/_\1/ | |
+ td | |
+# Assure at least one digit is available. | |
+ s/^\(_*\)$/0\1/ | |
+# Increment the last digit. | |
+ s/8\(_*\)$/9\1/ | |
+ s/7\(_*\)$/8\1/ | |
+ s/6\(_*\)$/7\1/ | |
+ s/5\(_*\)$/6\1/ | |
+ s/4\(_*\)$/5\1/ | |
+ s/3\(_*\)$/4\1/ | |
+ s/2\(_*\)$/3\1/ | |
+ s/1\(_*\)$/2\1/ | |
+ s/0\(_*\)$/1\1/ | |
+# Convert the hidden `9' digits to `0's. | |
+ s/_/0/g | |
+ x | |
+# Bring the line in the format `<number> <message>' | |
+ G | |
+ s/^[^\n]*$/& / | |
+ s/\(.*\)\n\([0-9]*\)/\2 \1/ | |
+# Clear flag from last substitution. | |
+ tb | |
+# Append the next line. | |
+ :b | |
+ N | |
+# Look whether second part is a continuation line. | |
+ s/\(.*\n\)"\(.*\)"/\1\2/ | |
+# Yes, then branch. | |
+ ta | |
+ P | |
+ D | |
+# Note that `D' includes a jump to the start!! | |
+# We found a continuation line. But before printing insert '\'. | |
+ :a | |
+ s/\(.*\)\(\n.*\)/\1\\\2/ | |
+ P | |
+# We cannot use the sed command `D' here | |
+ s/.*\n\(.*\)/\1/ | |
+ tb | |
+} | |
+d | |
diff --git a/po/Makefile.in.in b/po/Makefile.in.in | |
t@@ -0,0 +1,248 @@ | |
+# Makefile for program source directory in GNU NLS utilities package. | |
+# Copyright (C) 1995, 1996, 1997 by Ulrich Drepper <[email protected]> | |
+# | |
+# This file file be copied and used freely without restrictions. It can | |
+# be used in projects which are not available under the GNU Public License | |
+# but which still want to provide support for the GNU gettext functionality. | |
+# Please note that the actual code is *not* freely available. | |
+ | |
+PACKAGE = @PACKAGE@ | |
+VERSION = @VERSION@ | |
+ | |
+SHELL = /bin/sh | |
+@SET_MAKE@ | |
+ | |
+srcdir = @srcdir@ | |
+top_srcdir = @top_srcdir@ | |
+VPATH = @srcdir@ | |
+ | |
+prefix = @prefix@ | |
+exec_prefix = @exec_prefix@ | |
+datadir = $(prefix)/@DATADIRNAME@ | |
+localedir = $(datadir)/locale | |
+gnulocaledir = $(prefix)/share/locale | |
+gettextsrcdir = $(prefix)/share/gettext/po | |
+subdir = po | |
+ | |
+INSTALL = @INSTALL@ | |
+INSTALL_DATA = @INSTALL_DATA@ | |
+MKINSTALLDIRS = $(top_srcdir)/@MKINSTALLDIRS@ | |
+ | |
+CC = @CC@ | |
+GENCAT = @GENCAT@ | |
+GMSGFMT = PATH=../src:$$PATH @GMSGFMT@ | |
+MSGFMT = @MSGFMT@ | |
+XGETTEXT = PATH=../src:$$PATH @XGETTEXT@ | |
+MSGMERGE = PATH=../src:$$PATH msgmerge | |
+ | |
+DEFS = @DEFS@ | |
+CFLAGS = @CFLAGS@ | |
+CPPFLAGS = @CPPFLAGS@ | |
+ | |
+INCLUDES = -I.. -I$(top_srcdir)/intl | |
+ | |
+COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS) | |
+ | |
+SOURCES = cat-id-tbl.c | |
+POFILES = @POFILES@ | |
+GMOFILES = @GMOFILES@ | |
+DISTFILES = ChangeLog Makefile.in.in POTFILES.in $(PACKAGE).pot \ | |
+stamp-cat-id $(POFILES) $(GMOFILES) $(SOURCES) | |
+ | |
+POTFILES = \ | |
+ | |
+CATALOGS = @CATALOGS@ | |
+CATOBJEXT = @CATOBJEXT@ | |
+INSTOBJEXT = @INSTOBJEXT@ | |
+ | |
+.SUFFIXES: | |
+.SUFFIXES: .c .o .po .pox .gmo .mo .msg .cat | |
+ | |
+.c.o: | |
+ $(COMPILE) $< | |
+ | |
+.po.pox: | |
+ $(MAKE) $(PACKAGE).pot | |
+ $(MSGMERGE) $< $(srcdir)/$(PACKAGE).pot -o $*.pox | |
+ | |
+.po.mo: | |
+ $(MSGFMT) -o $@ $< | |
+ | |
+.po.gmo: | |
+ file=$(srcdir)/`echo $* | sed 's,.*/,,'`.gmo \ | |
+ && rm -f $$file && $(GMSGFMT) -o $$file $< | |
+ | |
+.po.cat: | |
+ sed -f ../intl/po2msg.sed < $< > $*.msg \ | |
+ && rm -f $@ && $(GENCAT) $@ $*.msg | |
+ | |
+ | |
+all: all-@USE_NLS@ | |
+ | |
+all-yes: cat-id-tbl.c $(CATALOGS) | |
+all-no: | |
+ | |
+$(srcdir)/$(PACKAGE).pot: $(POTFILES) | |
+ $(XGETTEXT) --default-domain=$(PACKAGE) --directory=$(top_srcdir) \ | |
+ --add-comments --keyword=_ --keyword=N_ \ | |
+ --files-from=$(srcdir)/POTFILES.in \ | |
+ && test ! -f $(PACKAGE).po \ | |
+ || ( rm -f $(srcdir)/$(PACKAGE).pot \ | |
+ && mv $(PACKAGE).po $(srcdir)/$(PACKAGE).pot ) | |
+ | |
+$(srcdir)/cat-id-tbl.c: stamp-cat-id; @: | |
+$(srcdir)/stamp-cat-id: $(PACKAGE).pot | |
+ rm -f cat-id-tbl.tmp | |
+ sed -f ../intl/po2tbl.sed $(srcdir)/$(PACKAGE).pot \ | |
+ | sed -e "s/@PACKAGE NAME@/$(PACKAGE)/" > cat-id-tbl.tmp | |
+ if cmp -s cat-id-tbl.tmp $(srcdir)/cat-id-tbl.c; then \ | |
+ rm cat-id-tbl.tmp; \ | |
+ else \ | |
+ echo cat-id-tbl.c changed; \ | |
+ rm -f $(srcdir)/cat-id-tbl.c; \ | |
+ mv cat-id-tbl.tmp $(srcdir)/cat-id-tbl.c; \ | |
+ fi | |
+ cd $(srcdir) && rm -f stamp-cat-id && echo timestamp > stamp-cat-id | |
+ | |
+ | |
+install: install-exec install-data | |
+install-exec: | |
+install-data: install-data-@USE_NLS@ | |
+install-data-no: all | |
+install-data-yes: all | |
+ if test -r "$(MKINSTALLDIRS)"; then \ | |
+ $(MKINSTALLDIRS) $(datadir); \ | |
+ else \ | |
+ $(SHELL) $(top_srcdir)/mkinstalldirs $(datadir); \ | |
+ fi | |
+ @catalogs='$(CATALOGS)'; \ | |
+ for cat in $$catalogs; do \ | |
+ cat=`basename $$cat`; \ | |
+ case "$$cat" in \ | |
+ *.gmo) destdir=$(gnulocaledir);; \ | |
+ *) destdir=$(localedir);; \ | |
+ esac; \ | |
+ lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \ | |
+ dir=$$destdir/$$lang/LC_MESSAGES; \ | |
+ if test -r "$(MKINSTALLDIRS)"; then \ | |
+ $(MKINSTALLDIRS) $$dir; \ | |
+ else \ | |
+ $(SHELL) $(top_srcdir)/mkinstalldirs $$dir; \ | |
+ fi; \ | |
+ if test -r $$cat; then \ | |
+ $(INSTALL_DATA) $$cat $$dir/$(PACKAGE)$(INSTOBJEXT); \ | |
+ echo "installing $$cat as $$dir/$(PACKAGE)$(INSTOBJEXT)"; \ | |
+ else \ | |
+ $(INSTALL_DATA) $(srcdir)/$$cat $$dir/$(PACKAGE)$(INSTOBJEXT); \ | |
+ echo "installing $(srcdir)/$$cat as" \ | |
+ "$$dir/$(PACKAGE)$(INSTOBJEXT)"; \ | |
+ fi; \ | |
+ if test -r $$cat.m; then \ | |
+ $(INSTALL_DATA) $$cat.m $$dir/$(PACKAGE)$(INSTOBJEXT).m; \ | |
+ echo "installing $$cat.m as $$dir/$(PACKAGE)$(INSTOBJEXT).m"; \ | |
+ else \ | |
+ if test -r $(srcdir)/$$cat.m ; then \ | |
+ $(INSTALL_DATA) $(srcdir)/$$cat.m \ | |
+ $$dir/$(PACKAGE)$(INSTOBJEXT).m; \ | |
+ echo "installing $(srcdir)/$$cat as" \ | |
+ "$$dir/$(PACKAGE)$(INSTOBJEXT).m"; \ | |
+ else \ | |
+ true; \ | |
+ fi; \ | |
+ fi; \ | |
+ done | |
+ if test "$(PACKAGE)" = "gettext"; then \ | |
+ if test -r "$(MKINSTALLDIRS)"; then \ | |
+ $(MKINSTALLDIRS) $(gettextsrcdir); \ | |
+ else \ | |
+ $(SHELL) $(top_srcdir)/mkinstalldirs $(gettextsrcdir); \ | |
+ fi; \ | |
+ $(INSTALL_DATA) $(srcdir)/Makefile.in.in \ | |
+ $(gettextsrcdir)/Makefile.in.in; \ | |
+ else \ | |
+ : ; \ | |
+ fi | |
+ | |
+# Define this as empty until I found a useful application. | |
+installcheck: | |
+ | |
+uninstall: | |
+ catalogs='$(CATALOGS)'; \ | |
+ for cat in $$catalogs; do \ | |
+ cat=`basename $$cat`; \ | |
+ lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \ | |
+ rm -f $(localedir)/$$lang/LC_MESSAGES/$(PACKAGE)$(INSTOBJEXT); \ | |
+ rm -f $(localedir)/$$lang/LC_MESSAGES/$(PACKAGE)$(INSTOBJEXT).m; \ | |
+ rm -f $(gnulocaledir)/$$lang/LC_MESSAGES/$(PACKAGE)$(INSTOBJEXT); \ | |
+ rm -f $(gnulocaledir)/$$lang/LC_MESSAGES/$(PACKAGE)$(INSTOBJEXT).m; \ | |
+ done | |
+ rm -f $(gettextsrcdir)/po-Makefile.in.in | |
+ | |
+check: all | |
+ | |
+cat-id-tbl.o: ../intl/libgettext.h | |
+ | |
+dvi info tags TAGS ID: | |
+ | |
+mostlyclean: | |
+ rm -f core core.* *.pox $(PACKAGE).po *.old.po cat-id-tbl.tmp | |
+ rm -fr *.o | |
+ | |
+clean: mostlyclean | |
+ | |
+distclean: clean | |
+ rm -f Makefile Makefile.in POTFILES *.mo *.msg *.cat *.cat.m | |
+ | |
+maintainer-clean: distclean | |
+ @echo "This command is intended for maintainers to use;" | |
+ @echo "it deletes files that may require special tools to rebuild." | |
+ rm -f $(GMOFILES) | |
+ | |
+distdir = ../$(PACKAGE)-$(VERSION)/$(subdir) | |
+dist distdir: update-po $(DISTFILES) | |
+ dists="$(DISTFILES)"; \ | |
+ for file in $$dists; do \ | |
+ ln $(srcdir)/$$file $(distdir) 2> /dev/null \ | |
+ || cp -p $(srcdir)/$$file $(distdir); \ | |
+ done | |
+ | |
+update-po: Makefile | |
+ $(MAKE) $(PACKAGE).pot | |
+ PATH=`pwd`/../src:$$PATH; \ | |
+ cd $(srcdir); \ | |
+ catalogs='$(CATALOGS)'; \ | |
+ for cat in $$catalogs; do \ | |
+ cat=`basename $$cat`; \ | |
+ lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \ | |
+ mv $$lang.po $$lang.old.po; \ | |
+ echo "$$lang:"; \ | |
+ if $(MSGMERGE) $$lang.old.po $(PACKAGE).pot -o $$lang.po; then \ | |
+ rm -f $$lang.old.po; \ | |
+ else \ | |
+ echo "msgmerge for $$cat failed!"; \ | |
+ rm -f $$lang.po; \ | |
+ mv $$lang.old.po $$lang.po; \ | |
+ fi; \ | |
+ done | |
+ | |
+POTFILES: POTFILES.in | |
+ ( if test 'x$(srcdir)' != 'x.'; then \ | |
+ posrcprefix='$(top_srcdir)/'; \ | |
+ else \ | |
+ posrcprefix="../"; \ | |
+ fi; \ | |
+ rm -f $@-t $@ \ | |
+ && (sed -e '/^#/d' -e '/^[ ]*$$/d' \ | |
+ -e "s@.*@ $$posrcprefix& \\\\@" < $(srcdir)/[email protected] \ | |
+ | sed -e '$$s/\\$$//') > $@-t \ | |
+ && chmod a-w $@-t \ | |
+ && mv $@-t $@ ) | |
+ | |
+Makefile: Makefile.in.in ../config.status POTFILES | |
+ cd .. \ | |
+ && CONFIG_FILES=$(subdir)/[email protected] CONFIG_HEADERS= \ | |
+ $(SHELL) ./config.status | |
+ | |
+# 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. | |
+.NOEXPORT: | |
diff --git a/po/dopewars.pot b/po/dopewars.pot | |
t@@ -6,7 +6,7 @@ | |
msgid "" | |
msgstr "" | |
"Project-Id-Version: PACKAGE VERSION\n" | |
-"POT-Creation-Date: 2000-09-10 04:08+0100\n" | |
+"POT-Creation-Date: 2000-09-10 22:48+0100\n" | |
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" | |
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" | |
"Language-Team: LANGUAGE <[email protected]>\n" | |
t@@ -998,7 +998,7 @@ msgstr "" | |
msgid "CLQP" | |
msgstr "" | |
-#: src/curses_client.c:363 src/gtk_client.c:795 | |
+#: src/curses_client.c:363 src/gtk_client.c:800 | |
msgid "Where to, dude ? " | |
msgstr "" | |
t@@ -1146,22 +1146,22 @@ msgstr "" | |
msgid "You don't have any %s to sell!" | |
msgstr "" | |
-#: src/curses_client.c:807 src/gtk_client.c:1067 | |
+#: src/curses_client.c:807 src/gtk_client.c:1072 | |
#, c-format | |
msgid "You'll need more %s to carry any more %s!" | |
msgstr "" | |
-#: src/curses_client.c:829 src/gtk_client.c:1071 | |
+#: src/curses_client.c:829 src/gtk_client.c:1076 | |
#, c-format | |
msgid "You don't have enough space to carry that %s!" | |
msgstr "" | |
-#: src/curses_client.c:837 src/gtk_client.c:1075 | |
+#: src/curses_client.c:837 src/gtk_client.c:1080 | |
#, c-format | |
msgid "You don't have enough cash to buy that %s!" | |
msgstr "" | |
-#: src/curses_client.c:850 src/gtk_client.c:1079 | |
+#: src/curses_client.c:850 src/gtk_client.c:1084 | |
msgid "You don't have any to sell!" | |
msgstr "" | |
t@@ -1169,7 +1169,7 @@ msgstr "" | |
msgid "How much money do you pay back? " | |
msgstr "" | |
-#: src/curses_client.c:880 src/curses_client.c:910 src/gtk_client.c:1879 | |
+#: src/curses_client.c:880 src/curses_client.c:910 src/gtk_client.c:1888 | |
msgid "You don't have that much money!" | |
msgstr "" | |
t@@ -1185,7 +1185,7 @@ msgstr "" | |
msgid "How much money? " | |
msgstr "" | |
-#: src/curses_client.c:913 src/gtk_client.c:1872 | |
+#: src/curses_client.c:913 src/gtk_client.c:1881 | |
msgid "There isn't that much money in the bank..." | |
msgstr "" | |
t@@ -1197,7 +1197,7 @@ msgstr "" | |
msgid "Messages" | |
msgstr "" | |
-#: src/curses_client.c:1130 src/gtk_client.c:1362 | |
+#: src/curses_client.c:1130 src/gtk_client.c:1371 | |
msgid "Stats" | |
msgstr "" | |
t@@ -1445,7 +1445,7 @@ msgstr "" | |
msgid "Inventory" | |
msgstr "" | |
-#: src/gtk_client.c:230 src/gtk_client.c:2115 src/gtk_client.c:2483 | |
+#: src/gtk_client.c:230 src/gtk_client.c:2124 src/gtk_client.c:2492 | |
msgid "Close" | |
msgstr "" | |
t@@ -1488,9 +1488,9 @@ msgstr "" | |
msgid "High Scores" | |
msgstr "" | |
-#: src/gtk_client.c:427 src/gtk_client.c:1018 src/gtk_client.c:1475 | |
-#: src/gtk_client.c:1788 src/gtk_client.c:1953 src/gtk_client.c:2232 | |
-#: src/gtk_client.c:2390 | |
+#: src/gtk_client.c:427 src/gtk_client.c:1023 src/gtk_client.c:1484 | |
+#: src/gtk_client.c:1797 src/gtk_client.c:1962 src/gtk_client.c:2241 | |
+#: src/gtk_client.c:2399 | |
msgid "OK" | |
msgstr "" | |
t@@ -1503,7 +1503,7 @@ msgstr "" | |
msgid "_Deal %s" | |
msgstr "" | |
-#: src/gtk_client.c:537 src/gtk_client.c:1111 src/gtk_client.c:1307 | |
+#: src/gtk_client.c:537 src/gtk_client.c:1119 src/gtk_client.c:1316 | |
msgid "_Fight" | |
msgstr "" | |
t@@ -1511,146 +1511,146 @@ msgstr "" | |
msgid "_Stand" | |
msgstr "" | |
-#: src/gtk_client.c:543 src/gtk_client.c:1110 | |
+#: src/gtk_client.c:543 src/gtk_client.c:1118 | |
msgid "_Run" | |
msgstr "" | |
-#: src/gtk_client.c:786 | |
+#: src/gtk_client.c:791 | |
msgid "Jet to location" | |
msgstr "" | |
-#: src/gtk_client.c:851 | |
+#: src/gtk_client.c:856 | |
#, c-format | |
msgid "at %s" | |
msgstr "" | |
-#: src/gtk_client.c:856 | |
+#: src/gtk_client.c:861 | |
#, c-format | |
msgid "You are currently carrying %d %s" | |
msgstr "" | |
-#: src/gtk_client.c:861 | |
+#: src/gtk_client.c:866 | |
#, c-format | |
msgid "Available space: %d" | |
msgstr "" | |
-#: src/gtk_client.c:866 | |
+#: src/gtk_client.c:871 | |
#, c-format | |
msgid "You can afford %d" | |
msgstr "" | |
-#: src/gtk_client.c:916 src/gtk_client.c:1047 | |
+#: src/gtk_client.c:921 src/gtk_client.c:1052 | |
msgid "Buy" | |
msgstr "" | |
-#: src/gtk_client.c:917 src/gtk_client.c:1048 | |
+#: src/gtk_client.c:922 src/gtk_client.c:1053 | |
msgid "Sell" | |
msgstr "" | |
-#: src/gtk_client.c:918 src/gtk_client.c:1049 | |
+#: src/gtk_client.c:923 src/gtk_client.c:1054 | |
msgid "Drop" | |
msgstr "" | |
-#: src/gtk_client.c:1006 | |
+#: src/gtk_client.c:1011 | |
#, c-format | |
msgid "%s how many?" | |
msgstr "" | |
-#: src/gtk_client.c:1024 src/gtk_client.c:1788 src/gtk_client.c:1964 | |
-#: src/gtk_client.c:2240 | |
+#: src/gtk_client.c:1029 src/gtk_client.c:1797 src/gtk_client.c:1973 | |
+#: src/gtk_client.c:2249 | |
msgid "Cancel" | |
msgstr "" | |
-#: src/gtk_client.c:1063 | |
+#: src/gtk_client.c:1068 | |
#, c-format | |
msgid "You don't have any %s!" | |
msgstr "" | |
-#: src/gtk_client.c:1110 src/gtk_client.c:1789 | |
+#: src/gtk_client.c:1118 src/gtk_client.c:1798 | |
msgid "_Yes" | |
msgstr "" | |
-#: src/gtk_client.c:1110 src/gtk_client.c:1789 | |
+#: src/gtk_client.c:1118 src/gtk_client.c:1798 | |
msgid "_No" | |
msgstr "" | |
-#: src/gtk_client.c:1111 | |
+#: src/gtk_client.c:1119 | |
msgid "_Attack" | |
msgstr "" | |
-#: src/gtk_client.c:1111 | |
+#: src/gtk_client.c:1119 | |
msgid "_Evade" | |
msgstr "" | |
-#: src/gtk_client.c:1129 | |
+#: src/gtk_client.c:1138 | |
msgid "Question" | |
msgstr "" | |
-#: src/gtk_client.c:1237 | |
+#: src/gtk_client.c:1246 | |
msgid "<main>/Talk" | |
msgstr "" | |
-#: src/gtk_client.c:1239 | |
+#: src/gtk_client.c:1248 | |
msgid "<main>/List" | |
msgstr "" | |
-#: src/gtk_client.c:1241 | |
+#: src/gtk_client.c:1250 | |
msgid "<main>/Errands" | |
msgstr "" | |
-#: src/gtk_client.c:1257 | |
+#: src/gtk_client.c:1266 | |
msgid "Space" | |
msgstr "" | |
-#: src/gtk_client.c:1262 | |
+#: src/gtk_client.c:1271 | |
msgid "Cash" | |
msgstr "" | |
-#: src/gtk_client.c:1267 | |
+#: src/gtk_client.c:1276 | |
msgid "Debt" | |
msgstr "" | |
-#: src/gtk_client.c:1272 | |
+#: src/gtk_client.c:1281 | |
msgid "Bank" | |
msgstr "" | |
-#: src/gtk_client.c:1287 | |
+#: src/gtk_client.c:1296 | |
msgid "Health" | |
msgstr "" | |
-#: src/gtk_client.c:1307 | |
+#: src/gtk_client.c:1316 | |
msgid "_Jet!" | |
msgstr "" | |
-#: src/gtk_client.c:1338 | |
+#: src/gtk_client.c:1347 | |
msgid "dopewars" | |
msgstr "" | |
-#: src/gtk_client.c:1422 | |
+#: src/gtk_client.c:1431 | |
msgid "Drug Dealing and Research" | |
msgstr "" | |
-#: src/gtk_client.c:1423 | |
+#: src/gtk_client.c:1432 | |
msgid "Play Testing" | |
msgstr "" | |
-#: src/gtk_client.c:1424 | |
+#: src/gtk_client.c:1433 | |
msgid "Extensive Play Testing" | |
msgstr "" | |
-#: src/gtk_client.c:1426 | |
+#: src/gtk_client.c:1435 | |
msgid "Constructive Criticism" | |
msgstr "" | |
-#: src/gtk_client.c:1428 | |
+#: src/gtk_client.c:1437 | |
msgid "Unconstructive Criticism" | |
msgstr "" | |
-#: src/gtk_client.c:1432 | |
+#: src/gtk_client.c:1441 | |
msgid "About dopewars" | |
msgstr "" | |
-#: src/gtk_client.c:1441 | |
+#: src/gtk_client.c:1450 | |
msgid "" | |
"Based on John E. Dell's old Drug Wars game, dopewars is a simulation of an\n" | |
"imaginary drug market. dopewars is an All-American game which features\n" | |
t@@ -1662,150 +1662,150 @@ msgid "" | |
"have one month of game time to make your fortune.\n" | |
msgstr "" | |
-#: src/gtk_client.c:1449 | |
+#: src/gtk_client.c:1458 | |
#, c-format | |
msgid "" | |
"Version %s Copyright (C) 1998-2000 Ben Webb [email protected]\n" | |
"dopewars is released under the GNU General Public Licence\n" | |
msgstr "" | |
-#: src/gtk_client.c:1467 | |
+#: src/gtk_client.c:1476 | |
msgid "" | |
"\n" | |
"For information on the command line options, type dopewars -h at your\n" | |
"Unix prompt. This will display a help screen, listing the availableoptions." | |
msgstr "" | |
-#: src/gtk_client.c:1505 src/gtk_client.c:1590 | |
+#: src/gtk_client.c:1514 src/gtk_client.c:1599 | |
msgid "Status: Attempting to contact server..." | |
msgstr "" | |
-#: src/gtk_client.c:1511 src/gtk_client.c:1596 | |
+#: src/gtk_client.c:1520 src/gtk_client.c:1605 | |
#, c-format | |
msgid "Status: Could not connect (%s)" | |
msgstr "" | |
-#: src/gtk_client.c:1545 | |
+#: src/gtk_client.c:1554 | |
#, c-format | |
msgid "%d of %d" | |
msgstr "" | |
-#: src/gtk_client.c:1612 src/gtk_client.c:1649 src/gtk_client.c:1690 | |
+#: src/gtk_client.c:1621 src/gtk_client.c:1658 src/gtk_client.c:1699 | |
msgid "Server" | |
msgstr "" | |
-#: src/gtk_client.c:1613 src/gtk_client.c:1664 | |
+#: src/gtk_client.c:1622 src/gtk_client.c:1673 | |
msgid "Port" | |
msgstr "" | |
-#: src/gtk_client.c:1614 | |
+#: src/gtk_client.c:1623 | |
msgid "Version" | |
msgstr "" | |
-#: src/gtk_client.c:1615 | |
+#: src/gtk_client.c:1624 | |
msgid "Players" | |
msgstr "" | |
-#: src/gtk_client.c:1616 | |
+#: src/gtk_client.c:1625 | |
msgid "Comment" | |
msgstr "" | |
-#: src/gtk_client.c:1625 | |
+#: src/gtk_client.c:1634 | |
msgid "New Game" | |
msgstr "" | |
-#: src/gtk_client.c:1634 | |
+#: src/gtk_client.c:1643 | |
msgid "Hey dude, what's your _name?" | |
msgstr "" | |
-#: src/gtk_client.c:1656 | |
+#: src/gtk_client.c:1665 | |
msgid "Host name" | |
msgstr "" | |
-#: src/gtk_client.c:1679 src/gtk_client.c:1742 | |
+#: src/gtk_client.c:1688 src/gtk_client.c:1751 | |
msgid "_Connect" | |
msgstr "" | |
-#: src/gtk_client.c:1692 src/gtk_client.c:1713 | |
+#: src/gtk_client.c:1701 src/gtk_client.c:1722 | |
msgid "Single player" | |
msgstr "" | |
-#: src/gtk_client.c:1698 | |
+#: src/gtk_client.c:1707 | |
msgid "_Antique mode" | |
msgstr "" | |
-#: src/gtk_client.c:1705 | |
+#: src/gtk_client.c:1714 | |
msgid "_Start single-player game" | |
msgstr "" | |
-#: src/gtk_client.c:1715 src/gtk_client.c:1753 | |
+#: src/gtk_client.c:1724 src/gtk_client.c:1762 | |
msgid "Metaserver" | |
msgstr "" | |
-#: src/gtk_client.c:1732 | |
+#: src/gtk_client.c:1741 | |
msgid "_Update" | |
msgstr "" | |
-#: src/gtk_client.c:1757 | |
+#: src/gtk_client.c:1766 | |
msgid "Status: Waiting for user input" | |
msgstr "" | |
-#: src/gtk_client.c:1910 | |
+#: src/gtk_client.c:1919 | |
#, c-format | |
msgid "Cash: %s" | |
msgstr "" | |
-#: src/gtk_client.c:1917 | |
+#: src/gtk_client.c:1926 | |
#, c-format | |
msgid "Debt: %s" | |
msgstr "" | |
-#: src/gtk_client.c:1920 | |
+#: src/gtk_client.c:1929 | |
#, c-format | |
msgid "Bank: %s" | |
msgstr "" | |
-#: src/gtk_client.c:1928 | |
+#: src/gtk_client.c:1937 | |
msgid "Pay back:" | |
msgstr "" | |
-#: src/gtk_client.c:1931 | |
+#: src/gtk_client.c:1940 | |
msgid "Deposit" | |
msgstr "" | |
-#: src/gtk_client.c:1935 | |
+#: src/gtk_client.c:1944 | |
msgid "Withdraw" | |
msgstr "" | |
-#: src/gtk_client.c:1959 | |
+#: src/gtk_client.c:1968 | |
msgid "Pay all" | |
msgstr "" | |
-#: src/gtk_client.c:1981 | |
+#: src/gtk_client.c:1990 | |
msgid "Player List" | |
msgstr "" | |
-#: src/gtk_client.c:2070 | |
+#: src/gtk_client.c:2079 | |
msgid "Talk to player(s)" | |
msgstr "" | |
-#: src/gtk_client.c:2092 | |
+#: src/gtk_client.c:2101 | |
msgid "Talk to all players" | |
msgstr "" | |
-#: src/gtk_client.c:2096 | |
+#: src/gtk_client.c:2105 | |
msgid "Message:-" | |
msgstr "" | |
-#: src/gtk_client.c:2109 | |
+#: src/gtk_client.c:2118 | |
msgid "Send" | |
msgstr "" | |
-#: src/gtk_client.c:2202 | |
+#: src/gtk_client.c:2211 | |
msgid "Spy On Player" | |
msgstr "" | |
-#: src/gtk_client.c:2204 | |
+#: src/gtk_client.c:2213 | |
#, c-format | |
msgid "" | |
"Please choose the player to spy on. Your %s will\n" | |
t@@ -1815,11 +1815,11 @@ msgid "" | |
"you, so any %s or %s that he's carrying may be lost!" | |
msgstr "" | |
-#: src/gtk_client.c:2212 | |
+#: src/gtk_client.c:2221 | |
msgid "Tip Off The Cops" | |
msgstr "" | |
-#: src/gtk_client.c:2214 | |
+#: src/gtk_client.c:2223 | |
#, c-format | |
msgid "" | |
"Please choose the player to tip off the cops to. Your %s will\n" | |
t@@ -1828,71 +1828,71 @@ msgid "" | |
"so any %s or %s that he's carrying may be lost!" | |
msgstr "" | |
-#: src/gtk_client.c:2254 | |
+#: src/gtk_client.c:2263 | |
#, c-format | |
msgid "Sack %s" | |
msgstr "" | |
-#: src/gtk_client.c:2255 | |
+#: src/gtk_client.c:2264 | |
#, c-format | |
msgid "" | |
"Are you sure? (Any %s or %s carried\n" | |
"by this %s may be lost!)" | |
msgstr "" | |
-#: src/gtk_client.c:2276 | |
+#: src/gtk_client.c:2285 | |
msgid "Name" | |
msgstr "" | |
-#: src/gtk_client.c:2277 | |
+#: src/gtk_client.c:2286 | |
msgid "Price" | |
msgstr "" | |
-#: src/gtk_client.c:2278 | |
+#: src/gtk_client.c:2287 | |
msgid "Number" | |
msgstr "" | |
-#: src/gtk_client.c:2280 | |
+#: src/gtk_client.c:2289 | |
msgid "_Buy ->" | |
msgstr "" | |
-#: src/gtk_client.c:2281 | |
+#: src/gtk_client.c:2290 | |
msgid "<- _Sell" | |
msgstr "" | |
-#: src/gtk_client.c:2282 | |
+#: src/gtk_client.c:2291 | |
msgid "_Drop <-" | |
msgstr "" | |
-#: src/gtk_client.c:2287 | |
+#: src/gtk_client.c:2296 | |
#, c-format | |
msgid "%s here" | |
msgstr "" | |
-#: src/gtk_client.c:2290 | |
+#: src/gtk_client.c:2299 | |
#, c-format | |
msgid "%s carried" | |
msgstr "" | |
-#: src/gtk_client.c:2366 | |
+#: src/gtk_client.c:2375 | |
msgid "Change Name" | |
msgstr "" | |
-#: src/gtk_client.c:2376 | |
+#: src/gtk_client.c:2385 | |
msgid "" | |
"Unfortunately, somebody else is already using \"your\" name. Please change " | |
"it:-" | |
msgstr "" | |
-#: src/gtk_client.c:2435 | |
+#: src/gtk_client.c:2444 | |
msgid "Done" | |
msgstr "" | |
-#: src/gtk_client.c:2469 | |
+#: src/gtk_client.c:2478 | |
msgid "Spy reports" | |
msgstr "" | |
-#: src/gtk_client.c:2540 | |
+#: src/gtk_client.c:2549 | |
msgid "" | |
"No GTK+ client available - rebuild the binary passing the\n" | |
"--enable-gtk-client option to configure, or use the curses\n" |