tUpdate gettext to 0.18.1. - vaccinewars - be a doctor and try to vaccinate the… | |
git clone git://src.adamsgaard.dk/vaccinewars | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit bb7e10e61879c55d9d920b4f28917ba7fb5b7bd8 | |
parent bb880caab59a37992f6f5e02479290112b9e2381 | |
Author: Ben Webb <[email protected]> | |
Date: Tue, 9 Jul 2013 05:41:02 +0000 | |
Update gettext to 0.18.1. | |
Diffstat: | |
M intl/ChangeLog | 4 ++-- | |
M intl/Makefile.in | 554 +++++++++++++++++++++++++----… | |
M intl/VERSION | 2 +- | |
M intl/bindtextdom.c | 82 ++++++++++-------------------… | |
M intl/config.charset | 1020 +++++++++++++++++++----------… | |
M intl/dcgettext.c | 29 ++++++++++++++--------------- | |
M intl/dcigettext.c | 1370 ++++++++++++++++++++---------… | |
M intl/dcngettext.c | 32 +++++++++++++++--------------… | |
M intl/dgettext.c | 32 ++++++++++++++++-------------… | |
M intl/dngettext.c | 33 +++++++++++++++--------------… | |
M intl/explodename.c | 142 ++++++++++-------------------… | |
M intl/finddomain.c | 107 ++++++++++++++++++-----------… | |
M intl/gettext.c | 28 ++++++++++++++-------------- | |
M intl/gettextP.h | 342 ++++++++++++++++++-----------… | |
M intl/hash-string.h | 60 ++++++++++-------------------… | |
M intl/intl-compat.c | 158 ++++++++++++-----------------… | |
M intl/l10nflist.c | 288 +++++++++++++++--------------… | |
M intl/loadinfo.h | 134 ++++++++++++++++++-----------… | |
M intl/loadmsgcat.c | 1367 ++++++++++++++++++++++++-----… | |
M intl/localcharset.c | 520 ++++++++++++++++++++++++-----… | |
M intl/locale.alias | 38 ++++++++++++++++-------------… | |
M intl/localealias.c | 270 ++++++++++++++++++-----------… | |
M intl/ngettext.c | 28 +++++++++++++--------------- | |
M intl/plural.c | 2254 ++++++++++++++++++++---------… | |
M intl/plural.y | 107 ++++++++++++-----------------… | |
M intl/ref-add.sin | 2 +- | |
M intl/ref-del.sin | 2 +- | |
M intl/textdomain.c | 56 ++++++++++++-----------------… | |
28 files changed, 5864 insertions(+), 3197 deletions(-) | |
--- | |
diff --git a/intl/ChangeLog b/intl/ChangeLog | |
t@@ -1,4 +1,4 @@ | |
-2001-05-23 GNU <[email protected]> | |
+2010-06-04 GNU <[email protected]> | |
- * Version 0.10.38 released. | |
+ * Version 0.18.1 released. | |
diff --git a/intl/Makefile.in b/intl/Makefile.in | |
t@@ -1,19 +1,20 @@ | |
-# Makefile for directory with message catalog handling in GNU NLS Utilities. | |
-# Copyright (C) 1995-1998, 2000, 2001 Free Software Foundation, Inc. | |
+# Makefile for directory with message catalog handling library of GNU gettext | |
+# Copyright (C) 1995-1998, 2000-2007, 2009-2010 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) | |
+# This program is free software; you can redistribute it and/or modify it | |
+# under the terms of the GNU Library General Public License as published | |
+# by the Free Software Foundation; either version 2, 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. | |
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
+# Library General Public License for more details. | |
# | |
-# You should have received a copy of the GNU General Public License | |
-# along with this program; if not, write to the Free Software | |
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |
+# You should have received a copy of the GNU Library General Public | |
+# License along with this program; if not, write to the Free Software | |
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, | |
+# USA. | |
PACKAGE = @PACKAGE@ | |
VERSION = @VERSION@ | |
t@@ -23,15 +24,26 @@ SHELL = /bin/sh | |
srcdir = @srcdir@ | |
top_srcdir = @top_srcdir@ | |
top_builddir = .. | |
-VPATH = @srcdir@ | |
+ | |
+# The VPATH variables allows builds with $builddir != $srcdir, assuming a | |
+# 'make' program that supports VPATH (such as GNU make). This line is removed | |
+# by autoconf automatically when "$(srcdir)" = ".". | |
+# In this directory, the VPATH handling is particular: | |
+# 1. If INTL_LIBTOOL_SUFFIX_PREFIX is 'l' (indicating a build with libtool), | |
+# the .c -> .lo rules carefully use $(srcdir), so that VPATH can be omitted. | |
+# 2. If PACKAGE = gettext-tools, VPATH _must_ be omitted, because otherwise | |
+# 'make' does the wrong thing if GNU gettext was configured with | |
+# "./configure --srcdir=`pwd`", namely it gets confused by the .lo and .la | |
+# files it finds in srcdir = ../../gettext-runtime/intl. | |
+VPATH = $(srcdir) | |
prefix = @prefix@ | |
exec_prefix = @exec_prefix@ | |
transform = @program_transform_name@ | |
libdir = @libdir@ | |
includedir = @includedir@ | |
-datadir = @datadir@ | |
datarootdir = @datarootdir@ | |
+datadir = @datadir@ | |
localedir = $(datadir)/locale | |
gettextsrcdir = $(datadir)/gettext/intl | |
aliaspath = $(localedir) | |
t@@ -39,8 +51,18 @@ subdir = intl | |
INSTALL = @INSTALL@ | |
INSTALL_DATA = @INSTALL_DATA@ | |
-MKINSTALLDIRS = @MKINSTALLDIRS@ | |
-mkinstalldirs = $(SHELL) `case "$(MKINSTALLDIRS)" in /*) echo "$(MKINSTALLDIRS… | |
+ | |
+# We use $(mkdir_p). | |
+# In automake <= 1.9.x, $(mkdir_p) is defined either as "mkdir -p --" or as | |
+# "$(mkinstalldirs)" or as "$(install_sh) -d". For these automake versions, | |
+# @install_sh@ does not start with $(SHELL), so we add it. | |
+# In automake >= 1.10, @mkdir_p@ is derived from ${MKDIR_P}, which is defined | |
+# either as "/path/to/mkdir -p" or ".../install-sh -c -d". For these automake | |
+# versions, $(mkinstalldirs) and $(install_sh) are unused. | |
+mkinstalldirs = $(SHELL) @install_sh@ -d | |
+install_sh = $(SHELL) @install_sh@ | |
+MKDIR_P = @MKDIR_P@ | |
+mkdir_p = @mkdir_p@ | |
l = @INTL_LIBTOOL_SUFFIX_PREFIX@ | |
t@@ -50,59 +72,139 @@ LIBTOOL = @LIBTOOL@ | |
RANLIB = @RANLIB@ | |
YACC = @INTLBISON@ -y -d | |
YFLAGS = --name-prefix=__gettext | |
- | |
+# Windows resource compiler (windres). Used when libtool is not used. | |
+WINDRES = @WINDRES@ | |
+# Windows resource compiler (windres). Used via libtool. | |
+RC = @RC@ | |
+ | |
+# Support for silent-rules. | |
+AM_V_at = $(am__v_at_$(V)) | |
+am__v_at_ = $(am__v_at_@INTL_DEFAULT_VERBOSITY@) | |
+am__v_at_0 = @ | |
+AM_V_AR = $(am__v_AR_$(V)) | |
+am__v_AR_ = $(am__v_AR_@INTL_DEFAULT_VERBOSITY@) | |
+am__v_AR_0 = @echo " AR " $@; | |
+AM_V_CC = $(am__v_CC_$(V)) | |
+am__v_CC_ = $(am__v_CC_@INTL_DEFAULT_VERBOSITY@) | |
+am__v_CC_0 = @echo " CC " $@; | |
+AM_V_GEN = $(am__v_GEN_$(V)) | |
+am__v_GEN_ = $(am__v_GEN_@INTL_DEFAULT_VERBOSITY@) | |
+am__v_GEN_0 = @echo " GEN " $@; | |
+AM_V_YACC = $(am__v_YACC_$(V)) | |
+am__v_YACC_ = $(am__v_YACC_@INTL_DEFAULT_VERBOSITY@) | |
+am__v_YACC_0 = @echo " YACC " $@; | |
+AM_V_lt = $(am__v_lt_$(V)) | |
+am__v_lt_ = $(am__v_lt_@INTL_DEFAULT_VERBOSITY@) | |
+am__v_lt_0 = --silent | |
+ | |
+# -DBUILDING_LIBINTL: Change expansion of LIBINTL_DLL_EXPORTED macro. | |
+# -DBUILDING_DLL: Change expansion of RELOCATABLE_DLL_EXPORTED macro. | |
DEFS = -DLOCALEDIR=\"$(localedir)\" -DLOCALE_ALIAS_PATH=\"$(aliaspath)\" \ | |
--DLIBDIR=\"$(libdir)\" @DEFS@ | |
+-DLIBDIR=\"$(libdir)\" -DBUILDING_LIBINTL -DBUILDING_DLL -DIN_LIBINTL \ | |
+-DENABLE_RELOCATABLE=1 -DIN_LIBRARY -DINSTALLDIR=\"$(libdir)\" -DNO_XMALLOC \ | |
+-Dset_relocation_prefix=libintl_set_relocation_prefix \ | |
+-Drelocate=libintl_relocate \ | |
+-DDEPENDS_ON_LIBICONV=1 @DEFS@ | |
CPPFLAGS = @CPPFLAGS@ | |
-CFLAGS = @CFLAGS@ | |
-LDFLAGS = @LDFLAGS@ | |
+CFLAGS = @CFLAGS@ @CFLAG_VISIBILITY@ | |
+LDFLAGS = @LDFLAGS@ $(LDFLAGS_@WOE32DLL@) | |
+LDFLAGS_yes = -Wl,--export-all-symbols | |
+LDFLAGS_no = | |
+LIBS = @LIBS@ | |
COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS) | |
-HEADERS = $(COMHDRS) libgnuintl.h libgettext.h loadinfo.h | |
-COMHDRS = gettext.h gettextP.h hash-string.h | |
-SOURCES = $(COMSRCS) intl-compat.c | |
-COMSRCS = bindtextdom.c dcgettext.c dgettext.c gettext.c \ | |
-finddomain.c loadmsgcat.c localealias.c textdomain.c l10nflist.c \ | |
-explodename.c dcigettext.c dcngettext.c dngettext.c ngettext.c plural.y \ | |
-localcharset.c | |
-OBJECTS = @INTLOBJS@ bindtextdom.$lo dcgettext.$lo dgettext.$lo gettext.$lo \ | |
-finddomain.$lo loadmsgcat.$lo localealias.$lo textdomain.$lo l10nflist.$lo \ | |
-explodename.$lo dcigettext.$lo dcngettext.$lo dngettext.$lo ngettext.$lo \ | |
-plural.$lo localcharset.$lo | |
-GETTOBJS = intl-compat.$lo | |
+HEADERS = \ | |
+ gmo.h \ | |
+ gettextP.h \ | |
+ hash-string.h \ | |
+ loadinfo.h \ | |
+ plural-exp.h \ | |
+ eval-plural.h \ | |
+ localcharset.h \ | |
+ lock.h \ | |
+ relocatable.h \ | |
+ tsearch.h tsearch.c \ | |
+ xsize.h \ | |
+ printf-args.h printf-args.c \ | |
+ printf-parse.h wprintf-parse.h printf-parse.c \ | |
+ vasnprintf.h vasnwprintf.h vasnprintf.c \ | |
+ os2compat.h \ | |
+ libgnuintl.h.in | |
+SOURCES = \ | |
+ bindtextdom.c \ | |
+ dcgettext.c \ | |
+ dgettext.c \ | |
+ gettext.c \ | |
+ finddomain.c \ | |
+ hash-string.c \ | |
+ loadmsgcat.c \ | |
+ localealias.c \ | |
+ textdomain.c \ | |
+ l10nflist.c \ | |
+ explodename.c \ | |
+ dcigettext.c \ | |
+ dcngettext.c \ | |
+ dngettext.c \ | |
+ ngettext.c \ | |
+ plural.y \ | |
+ plural-exp.c \ | |
+ localcharset.c \ | |
+ threadlib.c \ | |
+ lock.c \ | |
+ relocatable.c \ | |
+ langprefs.c \ | |
+ localename.c \ | |
+ log.c \ | |
+ printf.c \ | |
+ setlocale.c \ | |
+ version.c \ | |
+ osdep.c \ | |
+ os2compat.c \ | |
+ intl-exports.c \ | |
+ intl-compat.c | |
+OBJECTS = \ | |
+ bindtextdom.$lo \ | |
+ dcgettext.$lo \ | |
+ dgettext.$lo \ | |
+ gettext.$lo \ | |
+ finddomain.$lo \ | |
+ hash-string.$lo \ | |
+ loadmsgcat.$lo \ | |
+ localealias.$lo \ | |
+ textdomain.$lo \ | |
+ l10nflist.$lo \ | |
+ explodename.$lo \ | |
+ dcigettext.$lo \ | |
+ dcngettext.$lo \ | |
+ dngettext.$lo \ | |
+ ngettext.$lo \ | |
+ plural.$lo \ | |
+ plural-exp.$lo \ | |
+ localcharset.$lo \ | |
+ threadlib.$lo \ | |
+ lock.$lo \ | |
+ relocatable.$lo \ | |
+ langprefs.$lo \ | |
+ localename.$lo \ | |
+ log.$lo \ | |
+ printf.$lo \ | |
+ setlocale.$lo \ | |
+ version.$lo \ | |
+ osdep.$lo \ | |
+ intl-compat.$lo | |
+OBJECTS_RES_yes = libintl.res.$lo | |
+OBJECTS_RES_no = | |
DISTFILES.common = Makefile.in \ | |
-config.charset locale.alias ref-add.sin ref-del.sin $(HEADERS) $(SOURCES) | |
+config.charset locale.alias ref-add.sin ref-del.sin export.h libintl.rc \ | |
+$(HEADERS) $(SOURCES) | |
DISTFILES.generated = plural.c | |
DISTFILES.normal = VERSION | |
-DISTFILES.gettext = libintl.glibc | |
-DISTFILES.obsolete = xopen-msg.sed linux-msg.sed po2tbl.sed.in cat-compat.c | |
- | |
-# Libtool's library version information for libintl. | |
-# Before making a gettext release, the gettext maintainer must change this | |
-# according to the libtool documentation, section "Library interface versions". | |
-# Maintainers of other packages that include the intl directory must *not* | |
-# change these values. | |
-LTV_CURRENT=1 | |
-LTV_REVISION=1 | |
-LTV_AGE=0 | |
- | |
-.SUFFIXES: | |
-.SUFFIXES: .c .y .o .lo .sin .sed | |
-.c.o: | |
- $(COMPILE) $< | |
-.c.lo: | |
- $(LIBTOOL) --mode=compile $(COMPILE) $< | |
- | |
-.y.c: | |
- $(YACC) $(YFLAGS) --output $@ $< | |
- rm -f $*.h | |
- | |
-.sin.sed: | |
- sed -e '/^#/d' -e 's/@''PACKAGE''@/@PACKAGE@/g' $< > t-$@ | |
- mv t-$@ $@ | |
- | |
-INCLUDES = -I.. -I. -I$(top_srcdir)/intl | |
+DISTFILES.gettext = COPYING.LIB-2.0 COPYING.LIB-2.1 libintl.glibc README.woe32 | |
+DISTFILES.obsolete = xopen-msg.sed linux-msg.sed po2tbl.sed.in cat-compat.c \ | |
+COPYING.LIB-2 gettext.h libgettext.h plural-eval.c libgnuintl.h \ | |
+libgnuintl.h_vms Makefile.vms libgnuintl.h.msvc-static \ | |
+libgnuintl.h.msvc-shared Makefile.msvc | |
all: all-@USE_INCLUDED_LIBINTL@ | |
all-yes: libintl.$la libintl.h charset.alias ref-add.sed ref-del.sed | |
t@@ -111,30 +213,167 @@ all-no-yes: libgnuintl.$la | |
all-no-no: | |
libintl.a libgnuintl.a: $(OBJECTS) | |
- rm -f $@ | |
- $(AR) cru $@ $(OBJECTS) | |
- $(RANLIB) $@ | |
+ $(AM_V_at)rm -f $@ | |
+ $(AM_V_AR)$(AR) cru $@ $(OBJECTS) | |
+ $(AM_V_at)$(RANLIB) $@ | |
-libintl.la libgnuintl.la: $(OBJECTS) | |
- $(LIBTOOL) --mode=link \ | |
+libintl.la libgnuintl.la: $(OBJECTS) $(OBJECTS_RES_@WOE32@) | |
+ $(AM_V_GEN)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=link \ | |
$(CC) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS) $(LDFLAGS) -o $@ \ | |
- $(OBJECTS) @LIBICONV@ \ | |
+ $(OBJECTS) @LTLIBICONV@ @INTL_MACOSX_LIBS@ $(LIBS) @LTLIBTHREAD@ @LT… | |
+ $(OBJECTS_RES_@WOE32@) \ | |
-version-info $(LTV_CURRENT):$(LTV_REVISION):$(LTV_AGE) \ | |
-rpath $(libdir) \ | |
-no-undefined | |
-libintl.h: libgnuintl.h | |
- cp $(srcdir)/libgnuintl.h libintl.h | |
+# Libtool's library version information for libintl. | |
+# Before making a gettext release, the gettext maintainer must change this | |
+# according to the libtool documentation, section "Library interface versions". | |
+# Maintainers of other packages that include the intl directory must *not* | |
+# change these values. | |
+LTV_CURRENT=9 | |
+LTV_REVISION=1 | |
+LTV_AGE=1 | |
-charset.alias: config.charset | |
+.SUFFIXES: | |
+.SUFFIXES: .c .y .o .lo .sin .sed | |
+ | |
+.c.o: | |
+ $(AM_V_CC)$(COMPILE) $< | |
+ | |
+.y.c: | |
+ $(AM_V_YACC)$(YACC) $(YFLAGS) --output $@ $< | |
+ $(AM_V_at)rm -f $*.h | |
+ | |
+bindtextdom.lo: $(srcdir)/bindtextdom.c | |
+ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(s… | |
+dcgettext.lo: $(srcdir)/dcgettext.c | |
+ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(s… | |
+dgettext.lo: $(srcdir)/dgettext.c | |
+ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(s… | |
+gettext.lo: $(srcdir)/gettext.c | |
+ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(s… | |
+finddomain.lo: $(srcdir)/finddomain.c | |
+ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(s… | |
+hash-string.lo: $(srcdir)/hash-string.c | |
+ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(s… | |
+loadmsgcat.lo: $(srcdir)/loadmsgcat.c | |
+ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(s… | |
+localealias.lo: $(srcdir)/localealias.c | |
+ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(s… | |
+textdomain.lo: $(srcdir)/textdomain.c | |
+ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(s… | |
+l10nflist.lo: $(srcdir)/l10nflist.c | |
+ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(s… | |
+explodename.lo: $(srcdir)/explodename.c | |
+ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(s… | |
+dcigettext.lo: $(srcdir)/dcigettext.c | |
+ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(s… | |
+dcngettext.lo: $(srcdir)/dcngettext.c | |
+ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(s… | |
+dngettext.lo: $(srcdir)/dngettext.c | |
+ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(s… | |
+ngettext.lo: $(srcdir)/ngettext.c | |
+ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(s… | |
+plural.lo: $(srcdir)/plural.c | |
+ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(s… | |
+plural-exp.lo: $(srcdir)/plural-exp.c | |
+ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(s… | |
+localcharset.lo: $(srcdir)/localcharset.c | |
+ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(s… | |
+threadlib.lo: $(srcdir)/threadlib.c | |
+ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(s… | |
+lock.lo: $(srcdir)/lock.c | |
+ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(s… | |
+relocatable.lo: $(srcdir)/relocatable.c | |
+ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(s… | |
+langprefs.lo: $(srcdir)/langprefs.c | |
+ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(s… | |
+localename.lo: $(srcdir)/localename.c | |
+ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(s… | |
+log.lo: $(srcdir)/log.c | |
+ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(s… | |
+printf.lo: $(srcdir)/printf.c | |
+ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(s… | |
+setlocale.lo: $(srcdir)/setlocale.c | |
+ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(s… | |
+version.lo: $(srcdir)/version.c | |
+ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(s… | |
+osdep.lo: $(srcdir)/osdep.c | |
+ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(s… | |
+intl-compat.lo: $(srcdir)/intl-compat.c | |
+ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(s… | |
+ | |
+# This rule is executed only on Woe32 systems. | |
+# The following sed expressions come from the windres-options script. They are | |
+# inlined here, so that they can be written in a Makefile without requiring a | |
+# temporary file. They must contain literal newlines rather than semicolons, | |
+# so that they work with the sed-3.02 that is shipped with MSYS. | |
+libintl.res.o: $(srcdir)/libintl.rc | |
+ nlinit=`echo 'nl="'; echo '"'`; eval "$$nlinit"; \ | |
+ sed_extract_major='/^[0-9]/{'$${nl}'s/^\([0-9]*\).*/\1/p'$${nl}q$${nl}… | |
+ sed_extract_minor='/^[0-9][0-9]*[.][0-9]/{'$${nl}'s/^[0-9]*[.]\([0-9]*… | |
+ sed_extract_subminor='/^[0-9][0-9]*[.][0-9][0-9]*[.][0-9]/{'$${nl}'s/^… | |
+ $(WINDRES) \ | |
+ "-DPACKAGE_VERSION_STRING=\\\"$(VERSION)\\\"" \ | |
+ "-DPACKAGE_VERSION_MAJOR="`echo '$(VERSION)' | sed -n -e "$$sed_extr… | |
+ "-DPACKAGE_VERSION_MINOR="`echo '$(VERSION)' | sed -n -e "$$sed_extr… | |
+ "-DPACKAGE_VERSION_SUBMINOR="`echo '$(VERSION)' | sed -n -e "$$sed_e… | |
+ -i $(srcdir)/libintl.rc -o libintl.res.o --output-format=coff | |
+libintl.res.lo: $(srcdir)/libintl.rc | |
+ nlinit=`echo 'nl="'; echo '"'`; eval "$$nlinit"; \ | |
+ sed_extract_major='/^[0-9]/{'$${nl}'s/^\([0-9]*\).*/\1/p'$${nl}q$${nl}… | |
+ sed_extract_minor='/^[0-9][0-9]*[.][0-9]/{'$${nl}'s/^[0-9]*[.]\([0-9]*… | |
+ sed_extract_subminor='/^[0-9][0-9]*[.][0-9][0-9]*[.][0-9]/{'$${nl}'s/^… | |
+ $(LIBTOOL) --mode=compile --tag=RC $(RC) \ | |
+ "-DPACKAGE_VERSION_STRING=\\\"$(VERSION)\\\"" \ | |
+ "-DPACKAGE_VERSION_MAJOR="`echo '$(VERSION)' | sed -n -e "$$sed_extr… | |
+ "-DPACKAGE_VERSION_MINOR="`echo '$(VERSION)' | sed -n -e "$$sed_extr… | |
+ "-DPACKAGE_VERSION_SUBMINOR="`echo '$(VERSION)' | sed -n -e "$$sed_e… | |
+ -i $(srcdir)/libintl.rc -o libintl.res.lo --output-format=coff | |
+ | |
+ref-add.sed: $(srcdir)/ref-add.sin | |
+ sed -e '/^#/d' -e 's/@''PACKAGE''@/@PACKAGE@/g' $(srcdir)/ref-add.sin … | |
+ mv t-ref-add.sed ref-add.sed | |
+ref-del.sed: $(srcdir)/ref-del.sin | |
+ sed -e '/^#/d' -e 's/@''PACKAGE''@/@PACKAGE@/g' $(srcdir)/ref-del.sin … | |
+ mv t-ref-del.sed ref-del.sed | |
+ | |
+INCLUDES = -I. -I$(srcdir) -I.. | |
+ | |
+libgnuintl.h: $(srcdir)/libgnuintl.h.in | |
+ sed -e '/IN_LIBGLOCALE/d' \ | |
+ -e 's,@''HAVE_POSIX_PRINTF''@,@HAVE_POSIX_PRINTF@,g' \ | |
+ -e 's,@''HAVE_ASPRINTF''@,@HAVE_ASPRINTF@,g' \ | |
+ -e 's,@''HAVE_NEWLOCALE''@,@HAVE_NEWLOCALE@,g' \ | |
+ -e 's,@''HAVE_SNPRINTF''@,@HAVE_SNPRINTF@,g' \ | |
+ -e 's,@''HAVE_WPRINTF''@,@HAVE_WPRINTF@,g' \ | |
+ < $(srcdir)/libgnuintl.h.in \ | |
+ | if test '@WOE32DLL@' = yes; then \ | |
+ sed -e 's/extern \([^()]*\);/extern __declspec (dllimport) \1;/'; \ | |
+ else \ | |
+ cat; \ | |
+ fi \ | |
+ | sed -e 's/extern \([^"]\)/extern LIBINTL_DLL_EXPORTED \1/' \ | |
+ -e "/#define _LIBINTL_H/r $(srcdir)/export.h" \ | |
+ | sed -e 's,@''HAVE_VISIBILITY''@,@HAVE_VISIBILITY@,g' \ | |
+ > libgnuintl.h | |
+ | |
+libintl.h: $(srcdir)/libgnuintl.h.in | |
+ sed -e '/IN_LIBGLOCALE/d' \ | |
+ -e 's,@''HAVE_POSIX_PRINTF''@,@HAVE_POSIX_PRINTF@,g' \ | |
+ -e 's,@''HAVE_ASPRINTF''@,@HAVE_ASPRINTF@,g' \ | |
+ -e 's,@''HAVE_NEWLOCALE''@,@HAVE_NEWLOCALE@,g' \ | |
+ -e 's,@''HAVE_SNPRINTF''@,@HAVE_SNPRINTF@,g' \ | |
+ -e 's,@''HAVE_WPRINTF''@,@HAVE_WPRINTF@,g' \ | |
+ < $(srcdir)/libgnuintl.h.in > libintl.h | |
+ | |
+charset.alias: $(srcdir)/config.charset | |
$(SHELL) $(srcdir)/config.charset '@host@' > t-$@ | |
mv t-$@ $@ | |
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 GNU gettext() function in its C library or in a | |
# separate library. | |
t@@ -142,17 +381,50 @@ check: all | |
# 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 \ | |
- $(mkinstalldirs) $(DESTDIR)$(libdir) $(DESTDIR)$(includedir); \ | |
+ if { test "$(PACKAGE)" = "gettext-runtime" || test "$(PACKAGE)" = "get… | |
+ && test '@USE_INCLUDED_LIBINTL@' = yes; then \ | |
+ $(mkdir_p) $(DESTDIR)$(libdir) $(DESTDIR)$(includedir); \ | |
$(INSTALL_DATA) libintl.h $(DESTDIR)$(includedir)/libintl.h; \ | |
$(LIBTOOL) --mode=install \ | |
$(INSTALL_DATA) libintl.$la $(DESTDIR)$(libdir)/libintl.$la; \ | |
+ if test "@RELOCATABLE@" = yes; then \ | |
+ dependencies=`sed -n -e 's,^dependency_libs=\(.*\),\1,p' < $(DESTD… | |
+ if test -n "$$dependencies"; then \ | |
+ rm -f $(DESTDIR)$(libdir)/libintl.la; \ | |
+ fi; \ | |
+ fi; \ | |
+ else \ | |
+ : ; \ | |
+ fi | |
+ if test "$(PACKAGE)" = "gettext-tools" \ | |
+ && test '@USE_INCLUDED_LIBINTL@' = no \ | |
+ && test @GLIBC2@ != no; then \ | |
+ $(mkdir_p) $(DESTDIR)$(libdir); \ | |
+ $(LIBTOOL) --mode=install \ | |
+ $(INSTALL_DATA) libgnuintl.$la $(DESTDIR)$(libdir)/libgnuintl.$la;… | |
+ rm -f $(DESTDIR)$(libdir)/preloadable_libintl.so; \ | |
+ $(INSTALL_DATA) $(DESTDIR)$(libdir)/libgnuintl.so $(DESTDIR)$(libdir… | |
+ $(LIBTOOL) --mode=uninstall \ | |
+ rm -f $(DESTDIR)$(libdir)/libgnuintl.$la; \ | |
else \ | |
: ; \ | |
fi | |
if test '@USE_INCLUDED_LIBINTL@' = yes; then \ | |
- $(mkinstalldirs) $(DESTDIR)$(libdir); \ | |
+ if test @GLIBC21@ = no; then \ | |
+ case '@host_os@' in \ | |
+ darwin[56]*) \ | |
+ need_charset_alias=true ;; \ | |
+ darwin* | cygwin* | mingw* | pw32* | cegcc*) \ | |
+ need_charset_alias=false ;; \ | |
+ *) \ | |
+ need_charset_alias=true ;; \ | |
+ esac; \ | |
+ else \ | |
+ need_charset_alias=false; \ | |
+ fi; \ | |
+ if $$need_charset_alias; then \ | |
+ $(mkdir_p) $(DESTDIR)$(libdir); \ | |
+ fi; \ | |
temp=$(DESTDIR)$(libdir)/t-charset.alias; \ | |
dest=$(DESTDIR)$(libdir)/charset.alias; \ | |
if test -f $(DESTDIR)$(libdir)/charset.alias; then \ | |
t@@ -161,14 +433,14 @@ install-exec: all | |
$(INSTALL_DATA) $$temp $$dest; \ | |
rm -f $$temp; \ | |
else \ | |
- if test @GLIBC21@ = no; then \ | |
+ if $$need_charset_alias; then \ | |
orig=charset.alias; \ | |
sed -f ref-add.sed $$orig > $$temp; \ | |
$(INSTALL_DATA) $$temp $$dest; \ | |
rm -f $$temp; \ | |
fi; \ | |
fi; \ | |
- $(mkinstalldirs) $(DESTDIR)$(localedir); \ | |
+ $(mkdir_p) $(DESTDIR)$(localedir); \ | |
test -f $(DESTDIR)$(localedir)/locale.alias \ | |
&& orig=$(DESTDIR)$(localedir)/locale.alias \ | |
|| orig=$(srcdir)/locale.alias; \ | |
t@@ -181,11 +453,11 @@ install-exec: all | |
: ; \ | |
fi | |
install-data: all | |
- if test "$(PACKAGE)" = "gettext"; then \ | |
- $(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \ | |
+ if test "$(PACKAGE)" = "gettext-tools"; then \ | |
+ $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \ | |
$(INSTALL_DATA) VERSION $(DESTDIR)$(gettextsrcdir)/VERSION; \ | |
$(INSTALL_DATA) ChangeLog.inst $(DESTDIR)$(gettextsrcdir)/ChangeLog;… | |
- dists="$(DISTFILES.common)"; \ | |
+ dists="COPYING.LIB-2.0 COPYING.LIB-2.1 $(DISTFILES.common)"; \ | |
for file in $$dists; do \ | |
$(INSTALL_DATA) $(srcdir)/$$file \ | |
$(DESTDIR)$(gettextsrcdir)/$$file; \ | |
t@@ -205,18 +477,69 @@ install-data: all | |
: ; \ | |
fi | |
+install-strip: install | |
+ | |
+install-dvi install-html install-info install-ps install-pdf: | |
+ | |
+installdirs: | |
+ if { test "$(PACKAGE)" = "gettext-runtime" || test "$(PACKAGE)" = "get… | |
+ && test '@USE_INCLUDED_LIBINTL@' = yes; then \ | |
+ $(mkdir_p) $(DESTDIR)$(libdir) $(DESTDIR)$(includedir); \ | |
+ else \ | |
+ : ; \ | |
+ fi | |
+ if test "$(PACKAGE)" = "gettext-tools" \ | |
+ && test '@USE_INCLUDED_LIBINTL@' = no \ | |
+ && test @GLIBC2@ != no; then \ | |
+ $(mkdir_p) $(DESTDIR)$(libdir); \ | |
+ else \ | |
+ : ; \ | |
+ fi | |
+ if test '@USE_INCLUDED_LIBINTL@' = yes; then \ | |
+ if test @GLIBC21@ = no; then \ | |
+ case '@host_os@' in \ | |
+ darwin[56]*) \ | |
+ need_charset_alias=true ;; \ | |
+ darwin* | cygwin* | mingw* | pw32* | cegcc*) \ | |
+ need_charset_alias=false ;; \ | |
+ *) \ | |
+ need_charset_alias=true ;; \ | |
+ esac; \ | |
+ else \ | |
+ need_charset_alias=false; \ | |
+ fi; \ | |
+ if $$need_charset_alias; then \ | |
+ $(mkdir_p) $(DESTDIR)$(libdir); \ | |
+ fi; \ | |
+ $(mkdir_p) $(DESTDIR)$(localedir); \ | |
+ else \ | |
+ : ; \ | |
+ fi | |
+ if test "$(PACKAGE)" = "gettext-tools"; then \ | |
+ $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \ | |
+ else \ | |
+ : ; \ | |
+ fi | |
+ | |
# Define this as empty until I found a useful application. | |
installcheck: | |
uninstall: | |
- if test "$(PACKAGE)" = "gettext" \ | |
- && test '@INTLOBJS@' = '$(GETTOBJS)'; then \ | |
+ if { test "$(PACKAGE)" = "gettext-runtime" || test "$(PACKAGE)" = "get… | |
+ && test '@USE_INCLUDED_LIBINTL@' = yes; then \ | |
rm -f $(DESTDIR)$(includedir)/libintl.h; \ | |
$(LIBTOOL) --mode=uninstall \ | |
rm -f $(DESTDIR)$(libdir)/libintl.$la; \ | |
else \ | |
: ; \ | |
fi | |
+ if test "$(PACKAGE)" = "gettext-tools" \ | |
+ && test '@USE_INCLUDED_LIBINTL@' = no \ | |
+ && test @GLIBC2@ != no; then \ | |
+ rm -f $(DESTDIR)$(libdir)/preloadable_libintl.so; \ | |
+ else \ | |
+ : ; \ | |
+ fi | |
if test '@USE_INCLUDED_LIBINTL@' = yes; then \ | |
if test -f $(DESTDIR)$(libdir)/charset.alias; then \ | |
temp=$(DESTDIR)$(libdir)/t-charset.alias; \ | |
t@@ -243,25 +566,43 @@ uninstall: | |
else \ | |
: ; \ | |
fi | |
- if test "$(PACKAGE)" = "gettext"; then \ | |
- for file in VERSION ChangeLog $(DISTFILES.common) $(DISTFILES.genera… | |
+ if test "$(PACKAGE)" = "gettext-tools"; then \ | |
+ for file in VERSION ChangeLog COPYING.LIB-2.0 COPYING.LIB-2.1 $(DIST… | |
rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ | |
done; \ | |
else \ | |
: ; \ | |
fi | |
-info dvi: | |
+info dvi ps pdf html: | |
$(OBJECTS): ../config.h libgnuintl.h | |
-bindtextdom.$lo finddomain.$lo loadmsgcat.$lo: gettextP.h gettext.h loadinfo.h | |
-dcgettext.$lo: gettextP.h gettext.h hash-string.h loadinfo.h | |
+bindtextdom.$lo dcgettext.$lo dcigettext.$lo dcngettext.$lo dgettext.$lo dnget… | |
+localename.$lo: $(srcdir)/gettextP.h | |
+hash-string.$lo dcigettext.$lo loadmsgcat.$lo: $(srcdir)/hash-string.h | |
+explodename.$lo l10nflist.$lo: $(srcdir)/loadinfo.h | |
+dcigettext.$lo loadmsgcat.$lo plural.$lo plural-exp.$lo: $(srcdir)/plural-exp.h | |
+dcigettext.$lo: $(srcdir)/eval-plural.h | |
+localcharset.$lo: $(srcdir)/localcharset.h | |
+bindtextdom.$lo dcigettext.$lo finddomain.$lo loadmsgcat.$lo localealias.$lo l… | |
+localealias.$lo localcharset.$lo relocatable.$lo: $(srcdir)/relocatable.h | |
+printf.$lo: $(srcdir)/printf-args.h $(srcdir)/printf-args.c $(srcdir)/printf-p… | |
+ | |
+# A bison-2.1 generated plural.c includes <libintl.h> if ENABLE_NLS. | |
+PLURAL_DEPS_yes = libintl.h | |
+PLURAL_DEPS_no = | |
+plural.$lo: $(PLURAL_DEPS_@USE_INCLUDED_LIBINTL@) | |
tags: TAGS | |
TAGS: $(HEADERS) $(SOURCES) | |
here=`pwd`; cd $(srcdir) && etags -o $$here/TAGS $(HEADERS) $(SOURCES) | |
+ctags: CTAGS | |
+ | |
+CTAGS: $(HEADERS) $(SOURCES) | |
+ here=`pwd`; cd $(srcdir) && ctags -o $$here/CTAGS $(HEADERS) $(SOURCES) | |
+ | |
id: ID | |
ID: $(HEADERS) $(SOURCES) | |
t@@ -269,15 +610,15 @@ ID: $(HEADERS) $(SOURCES) | |
mostlyclean: | |
- rm -f *.a *.la *.o *.lo core core.* | |
- rm -f libintl.h charset.alias ref-add.sed ref-del.sed | |
+ rm -f *.a *.la *.o *.obj *.lo core core.* | |
+ rm -f libgnuintl.h libintl.h charset.alias ref-add.sed ref-del.sed | |
rm -f -r .libs _libs | |
clean: mostlyclean | |
distclean: clean | |
rm -f Makefile ID TAGS | |
- if test "$(PACKAGE)" = gettext; then \ | |
+ if test "$(PACKAGE)" = "gettext-runtime" || test "$(PACKAGE)" = "gette… | |
rm -f ChangeLog.inst $(DISTFILES.normal); \ | |
else \ | |
: ; \ | |
t@@ -292,21 +633,26 @@ maintainer-clean: distclean | |
# other files which should not be distributed in other packages. | |
distdir = ../$(PACKAGE)-$(VERSION)/$(subdir) | |
dist distdir: Makefile | |
- if test "$(PACKAGE)" = gettext; then \ | |
- additional="$(DISTFILES.gettext)"; \ | |
+ if test "$(PACKAGE)" = "gettext-tools"; then \ | |
+ : ; \ | |
else \ | |
- additional="$(DISTFILES.normal)"; \ | |
- fi; \ | |
- $(MAKE) $(DISTFILES.common) $(DISTFILES.generated) $$additional; \ | |
- for file in ChangeLog $(DISTFILES.common) $(DISTFILES.generated) $$add… | |
- if test -f $$file; then dir=.; else dir=$(srcdir); fi; \ | |
- ln $$dir/$$file $(distdir) 2> /dev/null \ | |
- || cp -p $$dir/$$file $(distdir); \ | |
- done | |
- | |
-Makefile: Makefile.in ../config.status | |
- cd .. \ | |
- && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status | |
+ if test "$(PACKAGE)" = "gettext-runtime"; then \ | |
+ additional="$(DISTFILES.gettext)"; \ | |
+ else \ | |
+ additional="$(DISTFILES.normal)"; \ | |
+ fi; \ | |
+ $(MAKE) $(DISTFILES.common) $(DISTFILES.generated) $$additional; \ | |
+ for file in ChangeLog $(DISTFILES.common) $(DISTFILES.generated) $$a… | |
+ if test -f $$file; then dir=.; else dir=$(srcdir); fi; \ | |
+ cp -p $$dir/$$file $(distdir) || test $$file = Makefile.in || exit… | |
+ done; \ | |
+ fi | |
+ | |
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status | |
+ cd $(top_builddir) && $(SHELL) ./config.status | |
+# This would be more efficient, but doesn't work any more with autoconf-2.57, | |
+# when AC_CONFIG_FILES([intl/Makefile:somedir/Makefile.in]) is used. | |
+# cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ | |
# 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. | |
diff --git a/intl/VERSION b/intl/VERSION | |
t@@ -1 +1 @@ | |
-GNU gettext library from gettext-0.10.38 | |
+GNU gettext library from gettext-0.18.1 | |
diff --git a/intl/bindtextdom.c b/intl/bindtextdom.c | |
t@@ -1,19 +1,21 @@ | |
/* Implementation of the bindtextdomain(3) function | |
- Copyright (C) 1995-1998, 2000, 2001 Free Software Foundation, Inc. | |
+ Copyright (C) 1995-1998, 2000-2003, 2005-2006, 2008 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) | |
+ This program is free software; you can redistribute it and/or modify it | |
+ under the terms of the GNU Library General Public License as published | |
+ by the Free Software Foundation; either version 2, 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. | |
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
+ Library General Public License for more details. | |
- You should have received a copy of the GNU General Public License | |
- along with this program; if not, write to the Free Software Foundation, | |
- Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |
+ You should have received a copy of the GNU Library General Public | |
+ License along with this program; if not, write to the Free Software | |
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, | |
+ USA. */ | |
#ifdef HAVE_CONFIG_H | |
# include <config.h> | |
t@@ -23,29 +25,21 @@ | |
#include <stdlib.h> | |
#include <string.h> | |
+#include "gettextP.h" | |
#ifdef _LIBC | |
# include <libintl.h> | |
#else | |
# include "libgnuintl.h" | |
#endif | |
-#include "gettextP.h" | |
+/* Handle multi-threaded applications. */ | |
#ifdef _LIBC | |
-/* We have to handle multi-threaded applications. */ | |
# include <bits/libc-lock.h> | |
+# define gl_rwlock_define __libc_rwlock_define | |
+# define gl_rwlock_wrlock __libc_rwlock_wrlock | |
+# define gl_rwlock_unlock __libc_rwlock_unlock | |
#else | |
-/* Provide dummy implementation if this is outside glibc. */ | |
-# define __libc_rwlock_define(CLASS, NAME) | |
-# define __libc_rwlock_wrlock(NAME) | |
-# define __libc_rwlock_unlock(NAME) | |
-#endif | |
- | |
-/* The internal variables in the standalone libintl.a must have different | |
- names than the internal variables in GNU libc, otherwise programs | |
- using libintl.a cannot be linked statically. */ | |
-#if !defined _LIBC | |
-# define _nl_default_dirname _nl_default_dirname__ | |
-# define _nl_domain_bindings _nl_domain_bindings__ | |
+# include "lock.h" | |
#endif | |
/* Some compilers, like SunOS4 cc, don't have offsetof in <stddef.h>. */ | |
t@@ -55,14 +49,8 @@ | |
/* @@ 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; | |
- | |
/* Lock variable to protect the global data in the gettext implementation. */ | |
-__libc_rwlock_define (extern, _nl_state_lock) | |
+gl_rwlock_define (extern, _nl_state_lock attribute_hidden) | |
/* Names for the libintl functions are a problem. They must not clash | |
t@@ -76,15 +64,10 @@ __libc_rwlock_define (extern, _nl_state_lock) | |
# define strdup(str) __strdup (str) | |
# endif | |
#else | |
-# define BINDTEXTDOMAIN bindtextdomain__ | |
-# define BIND_TEXTDOMAIN_CODESET bind_textdomain_codeset__ | |
+# define BINDTEXTDOMAIN libintl_bindtextdomain | |
+# define BIND_TEXTDOMAIN_CODESET libintl_bind_textdomain_codeset | |
#endif | |
-/* Prototypes for local functions. */ | |
-static void set_binding_values PARAMS ((const char *domainname, | |
- const char **dirnamep, | |
- const char **codesetp)); | |
- | |
/* Specifies the directory name *DIRNAMEP and the output codeset *CODESETP | |
to be used for the DOMAINNAME message catalog. | |
If *DIRNAMEP or *CODESETP is NULL, the corresponding attribute is not | |
t@@ -92,10 +75,8 @@ static void set_binding_values PARAMS ((const char *domainn… | |
If DIRNAMEP or CODESETP is NULL, the corresponding attribute is neither | |
modified nor returned. */ | |
static void | |
-set_binding_values (domainname, dirnamep, codesetp) | |
- const char *domainname; | |
- const char **dirnamep; | |
- const char **codesetp; | |
+set_binding_values (const char *domainname, | |
+ const char **dirnamep, const char **codesetp) | |
{ | |
struct binding *binding; | |
int modified; | |
t@@ -110,7 +91,7 @@ set_binding_values (domainname, dirnamep, codesetp) | |
return; | |
} | |
- __libc_rwlock_wrlock (_nl_state_lock); | |
+ gl_rwlock_wrlock (_nl_state_lock); | |
modified = 0; | |
t@@ -198,11 +179,9 @@ set_binding_values (domainname, dirnamep, codesetp) | |
if (__builtin_expect (result != NULL, 1)) | |
{ | |
- if (binding->codeset != NULL) | |
- free (binding->codeset); | |
+ free (binding->codeset); | |
binding->codeset = result; | |
- binding->codeset_cntr++; | |
modified = 1; | |
} | |
} | |
t@@ -266,8 +245,6 @@ set_binding_values (domainname, dirnamep, codesetp) | |
/* The default value. */ | |
new_binding->dirname = (char *) _nl_default_dirname; | |
- new_binding->codeset_cntr = 0; | |
- | |
if (codesetp) | |
{ | |
const char *codeset = *codesetp; | |
t@@ -288,7 +265,6 @@ set_binding_values (domainname, dirnamep, codesetp) | |
memcpy (result, codeset, len); | |
#endif | |
codeset = result; | |
- new_binding->codeset_cntr++; | |
} | |
*codesetp = codeset; | |
new_binding->codeset = (char *) codeset; | |
t@@ -336,15 +312,13 @@ set_binding_values (domainname, dirnamep, codesetp) | |
if (modified) | |
++_nl_msg_cat_cntr; | |
- __libc_rwlock_unlock (_nl_state_lock); | |
+ gl_rwlock_unlock (_nl_state_lock); | |
} | |
/* 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; | |
+BINDTEXTDOMAIN (const char *domainname, const char *dirname) | |
{ | |
set_binding_values (domainname, &dirname, NULL); | |
return (char *) dirname; | |
t@@ -353,9 +327,7 @@ BINDTEXTDOMAIN (domainname, dirname) | |
/* Specify the character encoding in which the messages from the | |
DOMAINNAME message catalog will be returned. */ | |
char * | |
-BIND_TEXTDOMAIN_CODESET (domainname, codeset) | |
- const char *domainname; | |
- const char *codeset; | |
+BIND_TEXTDOMAIN_CODESET (const char *domainname, const char *codeset) | |
{ | |
set_binding_values (domainname, NULL, &codeset); | |
return (char *) codeset; | |
diff --git a/intl/config.charset b/intl/config.charset | |
t@@ -1,7 +1,7 @@ | |
#! /bin/sh | |
# Output a system dependent table of character encoding aliases. | |
# | |
-# Copyright (C) 2000-2001 Free Software Foundation, Inc. | |
+# Copyright (C) 2000-2004, 2006-2010 Free Software Foundation, Inc. | |
# | |
# This program is free software; you can redistribute it and/or modify it | |
# under the terms of the GNU Library General Public License as published | |
t@@ -15,7 +15,7 @@ | |
# | |
# You should have received a copy of the GNU Library 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, | |
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, | |
# USA. | |
# | |
# The table consists of lines of the form | |
t@@ -30,72 +30,80 @@ | |
# MIME charset name is preferred. | |
# The current list of GNU canonical charset names is as follows. | |
# | |
-# name used by which systems a MIME name? | |
-# ASCII, ANSI_X3.4-1968 glibc solaris freebsd | |
-# ISO-8859-1 glibc aix hpux irix osf solaris freebsd yes | |
-# ISO-8859-2 glibc aix hpux irix osf solaris freebsd yes | |
-# ISO-8859-3 glibc yes | |
-# ISO-8859-4 osf solaris freebsd yes | |
-# ISO-8859-5 glibc aix hpux irix osf solaris freebsd yes | |
-# ISO-8859-6 glibc aix hpux solaris yes | |
-# ISO-8859-7 glibc aix hpux irix osf solaris yes | |
-# ISO-8859-8 glibc aix hpux osf solaris yes | |
-# ISO-8859-9 glibc aix hpux irix osf solaris yes | |
-# ISO-8859-13 glibc | |
-# ISO-8859-15 glibc aix osf solaris freebsd | |
-# KOI8-R glibc solaris freebsd yes | |
-# KOI8-U glibc freebsd yes | |
-# CP437 dos | |
-# CP775 dos | |
-# CP850 aix osf dos | |
-# CP852 dos | |
-# CP855 dos | |
-# CP856 aix | |
-# CP857 dos | |
-# CP861 dos | |
-# CP862 dos | |
-# CP864 dos | |
-# CP865 dos | |
-# CP866 freebsd dos | |
-# CP869 dos | |
-# CP874 win32 dos | |
-# CP922 aix | |
-# CP932 aix win32 dos | |
-# CP943 aix | |
-# CP949 osf win32 dos | |
-# CP950 win32 dos | |
-# CP1046 aix | |
-# CP1124 aix | |
-# CP1129 aix | |
-# CP1250 win32 | |
-# CP1251 glibc win32 | |
-# CP1252 aix win32 | |
-# CP1253 win32 | |
-# CP1254 win32 | |
-# CP1255 win32 | |
-# CP1256 win32 | |
-# CP1257 win32 | |
-# GB2312 glibc aix hpux irix solaris freebsd yes | |
-# EUC-JP glibc aix hpux irix osf solaris freebsd yes | |
-# EUC-KR glibc aix hpux irix osf solaris freebsd yes | |
-# EUC-TW glibc aix hpux irix osf solaris | |
-# BIG5 glibc aix hpux osf solaris freebsd yes | |
-# BIG5HKSCS glibc | |
-# GBK aix osf win32 dos | |
-# GB18030 glibc | |
-# SJIS hpux osf solaris freebsd | |
-# JOHAB glibc win32 | |
-# TIS-620 glibc aix hpux osf solaris | |
-# VISCII glibc yes | |
-# HP-ROMAN8 hpux | |
-# HP-ARABIC8 hpux | |
-# HP-GREEK8 hpux | |
-# HP-HEBREW8 hpux | |
-# HP-TURKISH8 hpux | |
-# HP-KANA8 hpux | |
-# DEC-KANJI osf | |
-# DEC-HANYU osf | |
-# UTF-8 glibc aix hpux osf solaris yes | |
+# name MIME? used by which systems | |
+# ASCII, ANSI_X3.4-1968 glibc solaris freebsd netbsd darwin cygwin | |
+# ISO-8859-1 Y glibc aix hpux irix osf solaris freebsd netbsd… | |
+# ISO-8859-2 Y glibc aix hpux irix osf solaris freebsd netbsd… | |
+# ISO-8859-3 Y glibc solaris cygwin | |
+# ISO-8859-4 Y osf solaris freebsd netbsd openbsd darwin | |
+# ISO-8859-5 Y glibc aix hpux irix osf solaris freebsd netbsd… | |
+# ISO-8859-6 Y glibc aix hpux solaris cygwin | |
+# ISO-8859-7 Y glibc aix hpux irix osf solaris netbsd openbsd… | |
+# ISO-8859-8 Y glibc aix hpux osf solaris cygwin | |
+# ISO-8859-9 Y glibc aix hpux irix osf solaris darwin cygwin | |
+# ISO-8859-13 glibc netbsd openbsd darwin cygwin | |
+# ISO-8859-14 glibc cygwin | |
+# ISO-8859-15 glibc aix osf solaris freebsd netbsd openbsd d… | |
+# KOI8-R Y glibc solaris freebsd netbsd openbsd darwin | |
+# KOI8-U Y glibc freebsd netbsd openbsd darwin cygwin | |
+# KOI8-T glibc | |
+# CP437 dos | |
+# CP775 dos | |
+# CP850 aix osf dos | |
+# CP852 dos | |
+# CP855 dos | |
+# CP856 aix | |
+# CP857 dos | |
+# CP861 dos | |
+# CP862 dos | |
+# CP864 dos | |
+# CP865 dos | |
+# CP866 freebsd netbsd openbsd darwin dos | |
+# CP869 dos | |
+# CP874 woe32 dos | |
+# CP922 aix | |
+# CP932 aix cygwin woe32 dos | |
+# CP943 aix | |
+# CP949 osf darwin woe32 dos | |
+# CP950 woe32 dos | |
+# CP1046 aix | |
+# CP1124 aix | |
+# CP1125 dos | |
+# CP1129 aix | |
+# CP1131 darwin | |
+# CP1250 woe32 | |
+# CP1251 glibc solaris netbsd openbsd darwin cygwin woe… | |
+# CP1252 aix woe32 | |
+# CP1253 woe32 | |
+# CP1254 woe32 | |
+# CP1255 glibc woe32 | |
+# CP1256 woe32 | |
+# CP1257 woe32 | |
+# GB2312 Y glibc aix hpux irix solaris freebsd netbsd dar… | |
+# EUC-JP Y glibc aix hpux irix osf solaris freebsd netbsd… | |
+# EUC-KR Y glibc aix hpux irix osf solaris freebsd netbsd… | |
+# EUC-TW glibc aix hpux irix osf solaris netbsd | |
+# BIG5 Y glibc aix hpux osf solaris freebsd netbsd darw… | |
+# BIG5-HKSCS glibc solaris darwin | |
+# GBK glibc aix osf solaris darwin cygwin woe32 dos | |
+# GB18030 glibc solaris netbsd darwin | |
+# SHIFT_JIS Y hpux osf solaris freebsd netbsd darwin | |
+# JOHAB glibc solaris woe32 | |
+# TIS-620 glibc aix hpux osf solaris cygwin | |
+# VISCII Y glibc | |
+# TCVN5712-1 glibc | |
+# ARMSCII-8 glibc darwin | |
+# GEORGIAN-PS glibc cygwin | |
+# PT154 glibc | |
+# HP-ROMAN8 hpux | |
+# HP-ARABIC8 hpux | |
+# HP-GREEK8 hpux | |
+# HP-HEBREW8 hpux | |
+# HP-TURKISH8 hpux | |
+# HP-KANA8 hpux | |
+# DEC-KANJI osf | |
+# DEC-HANYU osf | |
+# UTF-8 Y glibc aix hpux osf solaris netbsd darwin cygwin | |
# | |
# Note: Names which are not marked as being a MIME name should not be used in | |
# Internet protocols for information interchange (mail, news, etc.). | |
t@@ -116,323 +124,561 @@ echo "# It was automatically generated from config.cha… | |
# List of references, updated during installation: | |
echo "# Packages using this file: " | |
case "$os" in | |
- linux* | *-gnu*) | |
- # With glibc-2.1 or newer, we don't need any canonicalization, | |
- # because glibc has iconv and both glibc and libiconv support all | |
- # GNU canonical names directly. Therefore, the Makefile does not | |
- # need to install the alias file at all. | |
- # The following applies only to glibc-2.0.x and older libcs. | |
- echo "ISO_646.IRV:1983 ASCII" | |
- ;; | |
- aix*) | |
- echo "ISO8859-1 ISO-8859-1" | |
- echo "ISO8859-2 ISO-8859-2" | |
- echo "ISO8859-5 ISO-8859-5" | |
- echo "ISO8859-6 ISO-8859-6" | |
- echo "ISO8859-7 ISO-8859-7" | |
- echo "ISO8859-8 ISO-8859-8" | |
- echo "ISO8859-9 ISO-8859-9" | |
- echo "ISO8859-15 ISO-8859-15" | |
- echo "IBM-850 CP850" | |
- echo "IBM-856 CP856" | |
- echo "IBM-921 ISO-8859-13" | |
- echo "IBM-922 CP922" | |
- echo "IBM-932 CP932" | |
- echo "IBM-943 CP943" | |
- echo "IBM-1046 CP1046" | |
- echo "IBM-1124 CP1124" | |
- echo "IBM-1129 CP1129" | |
- echo "IBM-1252 CP1252" | |
- echo "IBM-eucCN GB2312" | |
- echo "IBM-eucJP EUC-JP" | |
- echo "IBM-eucKR EUC-KR" | |
- echo "IBM-eucTW EUC-TW" | |
- echo "big5 BIG5" | |
- echo "GBK GBK" | |
- echo "TIS-620 TIS-620" | |
- echo "UTF-8 UTF-8" | |
- ;; | |
- hpux*) | |
- echo "iso88591 ISO-8859-1" | |
- echo "iso88592 ISO-8859-2" | |
- echo "iso88595 ISO-8859-5" | |
- echo "iso88596 ISO-8859-6" | |
- echo "iso88597 ISO-8859-7" | |
- echo "iso88598 ISO-8859-8" | |
- echo "iso88599 ISO-8859-9" | |
- echo "iso885915 ISO-8859-15" | |
- echo "roman8 HP-ROMAN8" | |
- echo "arabic8 HP-ARABIC8" | |
- echo "greek8 HP-GREEK8" | |
- echo "hebrew8 HP-HEBREW8" | |
- echo "turkish8 HP-TURKISH8" | |
- echo "kana8 HP-KANA8" | |
- echo "tis620 TIS-620" | |
- echo "big5 BIG5" | |
- echo "eucJP EUC-JP" | |
- echo "eucKR EUC-KR" | |
- echo "eucTW EUC-TW" | |
- echo "hp15CN GB2312" | |
- #echo "ccdc ?" # what is this? | |
- echo "SJIS SJIS" | |
- echo "utf8 UTF-8" | |
- ;; | |
- irix*) | |
- echo "ISO8859-1 ISO-8859-1" | |
- echo "ISO8859-2 ISO-8859-2" | |
- echo "ISO8859-5 ISO-8859-5" | |
- echo "ISO8859-7 ISO-8859-7" | |
- echo "ISO8859-9 ISO-8859-9" | |
- echo "eucCN GB2312" | |
- echo "eucJP EUC-JP" | |
- echo "eucKR EUC-KR" | |
- echo "eucTW EUC-TW" | |
- ;; | |
- osf*) | |
- echo "ISO8859-1 ISO-8859-1" | |
- echo "ISO8859-2 ISO-8859-2" | |
- echo "ISO8859-4 ISO-8859-4" | |
- echo "ISO8859-5 ISO-8859-5" | |
- echo "ISO8859-7 ISO-8859-7" | |
- echo "ISO8859-8 ISO-8859-8" | |
- echo "ISO8859-9 ISO-8859-9" | |
- echo "ISO8859-15 ISO-8859-15" | |
- echo "cp850 CP850" | |
- echo "big5 BIG5" | |
- echo "dechanyu DEC-HANYU" | |
- echo "dechanzi GB2312" | |
- echo "deckanji DEC-KANJI" | |
- echo "deckorean EUC-KR" | |
- echo "eucJP EUC-JP" | |
- echo "eucKR EUC-KR" | |
- echo "eucTW EUC-TW" | |
- echo "GBK GBK" | |
- echo "KSC5601 CP949" | |
- echo "sdeckanji EUC-JP" | |
- echo "SJIS SJIS" | |
- echo "TACTIS TIS-620" | |
- echo "UTF-8 UTF-8" | |
- ;; | |
- solaris*) | |
- echo "646 ASCII" | |
- echo "ISO8859-1 ISO-8859-1" | |
- echo "ISO8859-2 ISO-8859-2" | |
- echo "ISO8859-4 ISO-8859-4" | |
- echo "ISO8859-5 ISO-8859-5" | |
- echo "ISO8859-6 ISO-8859-6" | |
- echo "ISO8859-7 ISO-8859-7" | |
- echo "ISO8859-8 ISO-8859-8" | |
- echo "ISO8859-9 ISO-8859-9" | |
- echo "ISO8859-15 ISO-8859-15" | |
- echo "koi8-r KOI8-R" | |
- echo "BIG5 BIG5" | |
- echo "gb2312 GB2312" | |
- echo "cns11643 EUC-TW" | |
- echo "5601 EUC-KR" | |
- echo "eucJP EUC-JP" | |
- echo "PCK SJIS" | |
- echo "TIS620.2533 TIS-620" | |
- #echo "sun_eu_greek ?" # what is this? | |
- echo "UTF-8 UTF-8" | |
- ;; | |
- freebsd*) | |
- # FreeBSD 4.2 doesn't have nl_langinfo(CODESET); therefore | |
- # localcharset.c falls back to using the full locale name | |
- # from the environment variables. | |
- echo "C ASCII" | |
- echo "US-ASCII ASCII" | |
- for l in la_LN lt_LN; do | |
- echo "$l.ASCII ASCII" | |
- done | |
- for l in da_DK de_AT de_CH de_DE en_AU en_CA en_GB en_US es_ES \ | |
- fi_FI fr_BE fr_CA fr_CH fr_FR is_IS it_CH it_IT la_LN \ | |
- lt_LN nl_BE nl_NL no_NO pt_PT sv_SE; do | |
- echo "$l.ISO_8859-1 ISO-8859-1" | |
- echo "$l.DIS_8859-15 ISO-8859-15" | |
- done | |
- for l in cs_CZ hr_HR hu_HU la_LN lt_LN pl_PL sl_SI; do | |
- echo "$l.ISO_8859-2 ISO-8859-2" | |
- done | |
- for l in la_LN lt_LT; do | |
- echo "$l.ISO_8859-4 ISO-8859-4" | |
- done | |
- for l in ru_RU ru_SU; do | |
- echo "$l.KOI8-R KOI8-R" | |
- echo "$l.ISO_8859-5 ISO-8859-5" | |
- echo "$l.CP866 CP866" | |
- done | |
- echo "uk_UA.KOI8-U KOI8-U" | |
- echo "zh_TW.BIG5 BIG5" | |
- echo "zh_TW.Big5 BIG5" | |
- echo "zh_CN.EUC GB2312" | |
- echo "ja_JP.EUC EUC-JP" | |
- echo "ja_JP.SJIS SJIS" | |
- echo "ja_JP.Shift_JIS SJIS" | |
- echo "ko_KR.EUC EUC-KR" | |
- ;; | |
- beos*) | |
- # BeOS has a single locale, and it has UTF-8 encoding. | |
- echo "* UTF-8" | |
- ;; | |
- msdosdjgpp*) | |
- # DJGPP 2.03 doesn't have nl_langinfo(CODESET); therefore | |
- # localcharset.c falls back to using the full locale name | |
- # from the environment variables. | |
- echo "#" | |
- echo "# The encodings given here may not all be correct." | |
- echo "# If you find that the encoding given for your language and" | |
- echo "# country is not the one your DOS machine actually uses, just" | |
- echo "# correct it in this file, and send a mail to" | |
- echo "# Juan Manuel Guerrero <[email protected]>" | |
- echo "# and Bruno Haible <[email protected]>." | |
- echo "#" | |
- echo "C ASCII" | |
- # ISO-8859-1 languages | |
- echo "ca CP850" | |
- echo "ca_ES CP850" | |
- echo "da CP865" # not CP850 ?? | |
- echo "da_DK CP865" # not CP850 ?? | |
- echo "de CP850" | |
- echo "de_AT CP850" | |
- echo "de_CH CP850" | |
- echo "de_DE CP850" | |
- echo "en CP850" | |
- echo "en_AU CP850" # not CP437 ?? | |
- echo "en_CA CP850" | |
- echo "en_GB CP850" | |
- echo "en_NZ CP437" | |
- echo "en_US CP437" | |
- echo "en_ZA CP850" # not CP437 ?? | |
- echo "es CP850" | |
- echo "es_AR CP850" | |
- echo "es_BO CP850" | |
- echo "es_CL CP850" | |
- echo "es_CO CP850" | |
- echo "es_CR CP850" | |
- echo "es_CU CP850" | |
- echo "es_DO CP850" | |
- echo "es_EC CP850" | |
- echo "es_ES CP850" | |
- echo "es_GT CP850" | |
- echo "es_HN CP850" | |
- echo "es_MX CP850" | |
- echo "es_NI CP850" | |
- echo "es_PA CP850" | |
- echo "es_PY CP850" | |
- echo "es_PE CP850" | |
- echo "es_SV CP850" | |
- echo "es_UY CP850" | |
- echo "es_VE CP850" | |
- echo "et CP850" | |
- echo "et_EE CP850" | |
- echo "eu CP850" | |
- echo "eu_ES CP850" | |
- echo "fi CP850" | |
- echo "fi_FI CP850" | |
- echo "fr CP850" | |
- echo "fr_BE CP850" | |
- echo "fr_CA CP850" | |
- echo "fr_CH CP850" | |
- echo "fr_FR CP850" | |
- echo "ga CP850" | |
- echo "ga_IE CP850" | |
- echo "gd CP850" | |
- echo "gd_GB CP850" | |
- echo "gl CP850" | |
- echo "gl_ES CP850" | |
- echo "id CP850" # not CP437 ?? | |
- echo "id_ID CP850" # not CP437 ?? | |
- echo "is CP861" # not CP850 ?? | |
- echo "is_IS CP861" # not CP850 ?? | |
- echo "it CP850" | |
- echo "it_CH CP850" | |
- echo "it_IT CP850" | |
- echo "lt CP775" | |
- echo "lt_LT CP775" | |
- echo "lv CP775" | |
- echo "lv_LV CP775" | |
- echo "nb CP865" # not CP850 ?? | |
- echo "nb_NO CP865" # not CP850 ?? | |
- echo "nl CP850" | |
- echo "nl_BE CP850" | |
- echo "nl_NL CP850" | |
- echo "nn CP865" # not CP850 ?? | |
- echo "nn_NO CP865" # not CP850 ?? | |
- echo "no CP865" # not CP850 ?? | |
- echo "no_NO CP865" # not CP850 ?? | |
- echo "pt CP850" | |
- echo "pt_BR CP850" | |
- echo "pt_PT CP850" | |
- echo "sv CP850" | |
- echo "sv_SE CP850" | |
- # ISO-8859-2 languages | |
- echo "cs CP852" | |
- echo "cs_CZ CP852" | |
- echo "hr CP852" | |
- echo "hr_HR CP852" | |
- echo "hu CP852" | |
- echo "hu_HU CP852" | |
- echo "pl CP852" | |
- echo "pl_PL CP852" | |
- echo "ro CP852" | |
- echo "ro_RO CP852" | |
- echo "sk CP852" | |
- echo "sk_SK CP852" | |
- echo "sl CP852" | |
- echo "sl_SI CP852" | |
- echo "sq CP852" | |
- echo "sq_AL CP852" | |
- echo "sr CP852" # CP852 or CP866 or CP855 ?? | |
- echo "sr_YU CP852" # CP852 or CP866 or CP855 ?? | |
- # ISO-8859-3 languages | |
- echo "mt CP850" | |
- echo "mt_MT CP850" | |
- # ISO-8859-5 languages | |
- echo "be CP866" | |
- echo "be_BE CP866" | |
- echo "bg CP866" # not CP855 ?? | |
- echo "bg_BG CP866" # not CP855 ?? | |
- echo "mk CP866" # not CP855 ?? | |
- echo "mk_MK CP866" # not CP855 ?? | |
- echo "ru KOI8-R" # not CP866 ?? | |
- echo "ru_RU KOI8-R" # not CP866 ?? | |
- # ISO-8859-6 languages | |
- echo "ar CP864" | |
- echo "ar_AE CP864" | |
- echo "ar_DZ CP864" | |
- echo "ar_EG CP864" | |
- echo "ar_IQ CP864" | |
- echo "ar_IR CP864" | |
- echo "ar_JO CP864" | |
- echo "ar_KW CP864" | |
- echo "ar_MA CP864" | |
- echo "ar_OM CP864" | |
- echo "ar_QA CP864" | |
- echo "ar_SA CP864" | |
- echo "ar_SY CP864" | |
- # ISO-8859-7 languages | |
- echo "el CP869" | |
- echo "el_GR CP869" | |
- # ISO-8859-8 languages | |
- echo "he CP862" | |
- echo "he_IL CP862" | |
- # ISO-8859-9 languages | |
- echo "tr CP857" | |
- echo "tr_TR CP857" | |
- # Japanese | |
- echo "ja CP932" | |
- echo "ja_JP CP932" | |
- # Chinese | |
- echo "zh_CN GBK" | |
- echo "zh_TW CP950" # not CP938 ?? | |
- # Korean | |
- echo "kr CP949" # not CP934 ?? | |
- echo "kr_KR CP949" # not CP934 ?? | |
- # Thai | |
- echo "th CP874" | |
- echo "th_TH CP874" | |
- # Other | |
- echo "eo CP850" | |
- echo "eo_EO CP850" | |
- ;; | |
+ linux-gnulibc1*) | |
+ # Linux libc5 doesn't have nl_langinfo(CODESET); therefore | |
+ # localcharset.c falls back to using the full locale name | |
+ # from the environment variables. | |
+ echo "C ASCII" | |
+ echo "POSIX ASCII" | |
+ for l in af af_ZA ca ca_ES da da_DK de de_AT de_BE de_CH de_DE de_LU \ | |
+ en en_AU en_BW en_CA en_DK en_GB en_IE en_NZ en_US en_ZA \ | |
+ en_ZW es es_AR es_BO es_CL es_CO es_DO es_EC es_ES es_GT \ | |
+ es_HN es_MX es_PA es_PE es_PY es_SV es_US es_UY es_VE et \ | |
+ et_EE eu eu_ES fi fi_FI fo fo_FO fr fr_BE fr_CA fr_CH fr_FR \ | |
+ fr_LU ga ga_IE gl gl_ES id id_ID in in_ID is is_IS it it_CH \ | |
+ it_IT kl kl_GL nl nl_BE nl_NL no no_NO pt pt_BR pt_PT sv \ | |
+ sv_FI sv_SE; do | |
+ echo "$l ISO-8859-1" | |
+ echo "$l.iso-8859-1 ISO-8859-1" | |
+ echo "$l.iso-8859-15 ISO-8859-15" | |
+ echo "$l.iso-8859-15@euro ISO-8859-15" | |
+ echo "$l@euro ISO-8859-15" | |
+ echo "$l.cp-437 CP437" | |
+ echo "$l.cp-850 CP850" | |
+ echo "$l.cp-1252 CP1252" | |
+ echo "$l.cp-1252@euro CP1252" | |
+ #echo "$l.atari-st ATARI-ST" # not a commonly used encoding | |
+ echo "$l.utf-8 UTF-8" | |
+ echo "$l.utf-8@euro UTF-8" | |
+ done | |
+ for l in cs cs_CZ hr hr_HR hu hu_HU pl pl_PL ro ro_RO sk sk_SK sl \ | |
+ sl_SI sr sr_CS sr_YU; do | |
+ echo "$l ISO-8859-2" | |
+ echo "$l.iso-8859-2 ISO-8859-2" | |
+ echo "$l.cp-852 CP852" | |
+ echo "$l.cp-1250 CP1250" | |
+ echo "$l.utf-8 UTF-8" | |
+ done | |
+ for l in mk mk_MK ru ru_RU; do | |
+ echo "$l ISO-8859-5" | |
+ echo "$l.iso-8859-5 ISO-8859-5" | |
+ echo "$l.koi8-r KOI8-R" | |
+ echo "$l.cp-866 CP866" | |
+ echo "$l.cp-1251 CP1251" | |
+ echo "$l.utf-8 UTF-8" | |
+ done | |
+ for l in ar ar_SA; do | |
+ echo "$l ISO-8859-6" | |
+ echo "$l.iso-8859-6 ISO-8859-6" | |
+ echo "$l.cp-864 CP864" | |
+ #echo "$l.cp-868 CP868" # not a commonly used encoding | |
+ echo "$l.cp-1256 CP1256" | |
+ echo "$l.utf-8 UTF-8" | |
+ done | |
+ for l in el el_GR gr gr_GR; do | |
+ echo "$l ISO-8859-7" | |
+ echo "$l.iso-8859-7 ISO-8859-7" | |
+ echo "$l.cp-869 CP869" | |
+ echo "$l.cp-1253 CP1253" | |
+ echo "$l.cp-1253@euro CP1253" | |
+ echo "$l.utf-8 UTF-8" | |
+ echo "$l.utf-8@euro UTF-8" | |
+ done | |
+ for l in he he_IL iw iw_IL; do | |
+ echo "$l ISO-8859-8" | |
+ echo "$l.iso-8859-8 ISO-8859-8" | |
+ echo "$l.cp-862 CP862" | |
+ echo "$l.cp-1255 CP1255" | |
+ echo "$l.utf-8 UTF-8" | |
+ done | |
+ for l in tr tr_TR; do | |
+ echo "$l ISO-8859-9" | |
+ echo "$l.iso-8859-9 ISO-8859-9" | |
+ echo "$l.cp-857 CP857" | |
+ echo "$l.cp-1254 CP1254" | |
+ echo "$l.utf-8 UTF-8" | |
+ done | |
+ for l in lt lt_LT lv lv_LV; do | |
+ #echo "$l BALTIC" # not a commonly used encoding, wrong encoding name | |
+ echo "$l ISO-8859-13" | |
+ done | |
+ for l in ru_UA uk uk_UA; do | |
+ echo "$l KOI8-U" | |
+ done | |
+ for l in zh zh_CN; do | |
+ #echo "$l GB_2312-80" # not a commonly used encoding, wrong encoding name | |
+ echo "$l GB2312" | |
+ done | |
+ for l in ja ja_JP ja_JP.EUC; do | |
+ echo "$l EUC-JP" | |
+ done | |
+ for l in ko ko_KR; do | |
+ echo "$l EUC-KR" | |
+ done | |
+ for l in th th_TH; do | |
+ echo "$l TIS-620" | |
+ done | |
+ for l in fa fa_IR; do | |
+ #echo "$l ISIRI-3342" # a broken encoding | |
+ echo "$l.utf-8 UTF-8" | |
+ done | |
+ ;; | |
+ linux* | *-gnu*) | |
+ # With glibc-2.1 or newer, we don't need any canonicalization, | |
+ # because glibc has iconv and both glibc and libiconv support all | |
+ # GNU canonical names directly. Therefore, the Makefile does not | |
+ # need to install the alias file at all. | |
+ # The following applies only to glibc-2.0.x and older libcs. | |
+ echo "ISO_646.IRV:1983 ASCII" | |
+ ;; | |
+ aix*) | |
+ echo "ISO8859-1 ISO-8859-1" | |
+ echo "ISO8859-2 ISO-8859-2" | |
+ echo "ISO8859-5 ISO-8859-5" | |
+ echo "ISO8859-6 ISO-8859-6" | |
+ echo "ISO8859-7 ISO-8859-7" | |
+ echo "ISO8859-8 ISO-8859-8" | |
+ echo "ISO8859-9 ISO-8859-9" | |
+ echo "ISO8859-15 ISO-8859-15" | |
+ echo "IBM-850 CP850" | |
+ echo "IBM-856 CP856" | |
+ echo "IBM-921 ISO-8859-13" | |
+ echo "IBM-922 CP922" | |
+ echo "IBM-932 CP932" | |
+ echo "IBM-943 CP943" | |
+ echo "IBM-1046 CP1046" | |
+ echo "IBM-1124 CP1124" | |
+ echo "IBM-1129 CP1129" | |
+ echo "IBM-1252 CP1252" | |
+ echo "IBM-eucCN GB2312" | |
+ echo "IBM-eucJP EUC-JP" | |
+ echo "IBM-eucKR EUC-KR" | |
+ echo "IBM-eucTW EUC-TW" | |
+ echo "big5 BIG5" | |
+ echo "GBK GBK" | |
+ echo "TIS-620 TIS-620" | |
+ echo "UTF-8 UTF-8" | |
+ ;; | |
+ hpux*) | |
+ echo "iso88591 ISO-8859-1" | |
+ echo "iso88592 ISO-8859-2" | |
+ echo "iso88595 ISO-8859-5" | |
+ echo "iso88596 ISO-8859-6" | |
+ echo "iso88597 ISO-8859-7" | |
+ echo "iso88598 ISO-8859-8" | |
+ echo "iso88599 ISO-8859-9" | |
+ echo "iso885915 ISO-8859-15" | |
+ echo "roman8 HP-ROMAN8" | |
+ echo "arabic8 HP-ARABIC8" | |
+ echo "greek8 HP-GREEK8" | |
+ echo "hebrew8 HP-HEBREW8" | |
+ echo "turkish8 HP-TURKISH8" | |
+ echo "kana8 HP-KANA8" | |
+ echo "tis620 TIS-620" | |
+ echo "big5 BIG5" | |
+ echo "eucJP EUC-JP" | |
+ echo "eucKR EUC-KR" | |
+ echo "eucTW EUC-TW" | |
+ echo "hp15CN GB2312" | |
+ #echo "ccdc ?" # what is this? | |
+ echo "SJIS SHIFT_JIS" | |
+ echo "utf8 UTF-8" | |
+ ;; | |
+ irix*) | |
+ echo "ISO8859-1 ISO-8859-1" | |
+ echo "ISO8859-2 ISO-8859-2" | |
+ echo "ISO8859-5 ISO-8859-5" | |
+ echo "ISO8859-7 ISO-8859-7" | |
+ echo "ISO8859-9 ISO-8859-9" | |
+ echo "eucCN GB2312" | |
+ echo "eucJP EUC-JP" | |
+ echo "eucKR EUC-KR" | |
+ echo "eucTW EUC-TW" | |
+ ;; | |
+ osf*) | |
+ echo "ISO8859-1 ISO-8859-1" | |
+ echo "ISO8859-2 ISO-8859-2" | |
+ echo "ISO8859-4 ISO-8859-4" | |
+ echo "ISO8859-5 ISO-8859-5" | |
+ echo "ISO8859-7 ISO-8859-7" | |
+ echo "ISO8859-8 ISO-8859-8" | |
+ echo "ISO8859-9 ISO-8859-9" | |
+ echo "ISO8859-15 ISO-8859-15" | |
+ echo "cp850 CP850" | |
+ echo "big5 BIG5" | |
+ echo "dechanyu DEC-HANYU" | |
+ echo "dechanzi GB2312" | |
+ echo "deckanji DEC-KANJI" | |
+ echo "deckorean EUC-KR" | |
+ echo "eucJP EUC-JP" | |
+ echo "eucKR EUC-KR" | |
+ echo "eucTW EUC-TW" | |
+ echo "GBK GBK" | |
+ echo "KSC5601 CP949" | |
+ echo "sdeckanji EUC-JP" | |
+ echo "SJIS SHIFT_JIS" | |
+ echo "TACTIS TIS-620" | |
+ echo "UTF-8 UTF-8" | |
+ ;; | |
+ solaris*) | |
+ echo "646 ASCII" | |
+ echo "ISO8859-1 ISO-8859-1" | |
+ echo "ISO8859-2 ISO-8859-2" | |
+ echo "ISO8859-3 ISO-8859-3" | |
+ echo "ISO8859-4 ISO-8859-4" | |
+ echo "ISO8859-5 ISO-8859-5" | |
+ echo "ISO8859-6 ISO-8859-6" | |
+ echo "ISO8859-7 ISO-8859-7" | |
+ echo "ISO8859-8 ISO-8859-8" | |
+ echo "ISO8859-9 ISO-8859-9" | |
+ echo "ISO8859-15 ISO-8859-15" | |
+ echo "koi8-r KOI8-R" | |
+ echo "ansi-1251 CP1251" | |
+ echo "BIG5 BIG5" | |
+ echo "Big5-HKSCS BIG5-HKSCS" | |
+ echo "gb2312 GB2312" | |
+ echo "GBK GBK" | |
+ echo "GB18030 GB18030" | |
+ echo "cns11643 EUC-TW" | |
+ echo "5601 EUC-KR" | |
+ echo "ko_KR.johap92 JOHAB" | |
+ echo "eucJP EUC-JP" | |
+ echo "PCK SHIFT_JIS" | |
+ echo "TIS620.2533 TIS-620" | |
+ #echo "sun_eu_greek ?" # what is this? | |
+ echo "UTF-8 UTF-8" | |
+ ;; | |
+ freebsd* | os2*) | |
+ # FreeBSD 4.2 doesn't have nl_langinfo(CODESET); therefore | |
+ # localcharset.c falls back to using the full locale name | |
+ # from the environment variables. | |
+ # Likewise for OS/2. OS/2 has XFree86 just like FreeBSD. Just | |
+ # reuse FreeBSD's locale data for OS/2. | |
+ echo "C ASCII" | |
+ echo "US-ASCII ASCII" | |
+ for l in la_LN lt_LN; do | |
+ echo "$l.ASCII ASCII" | |
+ done | |
+ for l in da_DK de_AT de_CH de_DE en_AU en_CA en_GB en_US es_ES \ | |
+ fi_FI fr_BE fr_CA fr_CH fr_FR is_IS it_CH it_IT la_LN \ | |
+ lt_LN nl_BE nl_NL no_NO pt_PT sv_SE; do | |
+ echo "$l.ISO_8859-1 ISO-8859-1" | |
+ echo "$l.DIS_8859-15 ISO-8859-15" | |
+ done | |
+ for l in cs_CZ hr_HR hu_HU la_LN lt_LN pl_PL sl_SI; do | |
+ echo "$l.ISO_8859-2 ISO-8859-2" | |
+ done | |
+ for l in la_LN lt_LT; do | |
+ echo "$l.ISO_8859-4 ISO-8859-4" | |
+ done | |
+ for l in ru_RU ru_SU; do | |
+ echo "$l.KOI8-R KOI8-R" | |
+ echo "$l.ISO_8859-5 ISO-8859-5" | |
+ echo "$l.CP866 CP866" | |
+ done | |
+ echo "uk_UA.KOI8-U KOI8-U" | |
+ echo "zh_TW.BIG5 BIG5" | |
+ echo "zh_TW.Big5 BIG5" | |
+ echo "zh_CN.EUC GB2312" | |
+ echo "ja_JP.EUC EUC-JP" | |
+ echo "ja_JP.SJIS SHIFT_JIS" | |
+ echo "ja_JP.Shift_JIS SHIFT_JIS" | |
+ echo "ko_KR.EUC EUC-KR" | |
+ ;; | |
+ netbsd*) | |
+ echo "646 ASCII" | |
+ echo "ISO8859-1 ISO-8859-1" | |
+ echo "ISO8859-2 ISO-8859-2" | |
+ echo "ISO8859-4 ISO-8859-4" | |
+ echo "ISO8859-5 ISO-8859-5" | |
+ echo "ISO8859-7 ISO-8859-7" | |
+ echo "ISO8859-13 ISO-8859-13" | |
+ echo "ISO8859-15 ISO-8859-15" | |
+ echo "eucCN GB2312" | |
+ echo "eucJP EUC-JP" | |
+ echo "eucKR EUC-KR" | |
+ echo "eucTW EUC-TW" | |
+ echo "BIG5 BIG5" | |
+ echo "SJIS SHIFT_JIS" | |
+ ;; | |
+ openbsd*) | |
+ echo "646 ASCII" | |
+ echo "ISO8859-1 ISO-8859-1" | |
+ echo "ISO8859-2 ISO-8859-2" | |
+ echo "ISO8859-4 ISO-8859-4" | |
+ echo "ISO8859-5 ISO-8859-5" | |
+ echo "ISO8859-7 ISO-8859-7" | |
+ echo "ISO8859-13 ISO-8859-13" | |
+ echo "ISO8859-15 ISO-8859-15" | |
+ ;; | |
+ darwin[56]*) | |
+ # Darwin 6.8 doesn't have nl_langinfo(CODESET); therefore | |
+ # localcharset.c falls back to using the full locale name | |
+ # from the environment variables. | |
+ echo "C ASCII" | |
+ for l in en_AU en_CA en_GB en_US la_LN; do | |
+ echo "$l.US-ASCII ASCII" | |
+ done | |
+ for l in da_DK de_AT de_CH de_DE en_AU en_CA en_GB en_US es_ES \ | |
+ fi_FI fr_BE fr_CA fr_CH fr_FR is_IS it_CH it_IT nl_BE \ | |
+ nl_NL no_NO pt_PT sv_SE; do | |
+ echo "$l ISO-8859-1" | |
+ echo "$l.ISO8859-1 ISO-8859-1" | |
+ echo "$l.ISO8859-15 ISO-8859-15" | |
+ done | |
+ for l in la_LN; do | |
+ echo "$l.ISO8859-1 ISO-8859-1" | |
+ echo "$l.ISO8859-15 ISO-8859-15" | |
+ done | |
+ for l in cs_CZ hr_HR hu_HU la_LN pl_PL sl_SI; do | |
+ echo "$l.ISO8859-2 ISO-8859-2" | |
+ done | |
+ for l in la_LN lt_LT; do | |
+ echo "$l.ISO8859-4 ISO-8859-4" | |
+ done | |
+ for l in ru_RU; do | |
+ echo "$l.KOI8-R KOI8-R" | |
+ echo "$l.ISO8859-5 ISO-8859-5" | |
+ echo "$l.CP866 CP866" | |
+ done | |
+ for l in bg_BG; do | |
+ echo "$l.CP1251 CP1251" | |
+ done | |
+ echo "uk_UA.KOI8-U KOI8-U" | |
+ echo "zh_TW.BIG5 BIG5" | |
+ echo "zh_TW.Big5 BIG5" | |
+ echo "zh_CN.EUC GB2312" | |
+ echo "ja_JP.EUC EUC-JP" | |
+ echo "ja_JP.SJIS SHIFT_JIS" | |
+ echo "ko_KR.EUC EUC-KR" | |
+ ;; | |
+ darwin*) | |
+ # Darwin 7.5 has nl_langinfo(CODESET), but sometimes its value is | |
+ # useless: | |
+ # - It returns the empty string when LANG is set to a locale of the | |
+ # form ll_CC, although ll_CC/LC_CTYPE is a symlink to an UTF-8 | |
+ # LC_CTYPE file. | |
+ # - The environment variables LANG, LC_CTYPE, LC_ALL are not set by | |
+ # the system; nl_langinfo(CODESET) returns "US-ASCII" in this case. | |
+ # - The documentation says: | |
+ # "... all code that calls BSD system routines should ensure | |
+ # that the const *char parameters of these routines are in UTF-8 | |
+ # encoding. All BSD system functions expect their string | |
+ # parameters to be in UTF-8 encoding and nothing else." | |
+ # It also says | |
+ # "An additional caveat is that string parameters for files, | |
+ # paths, and other file-system entities must be in canonical | |
+ # UTF-8. In a canonical UTF-8 Unicode string, all decomposable | |
+ # characters are decomposed ..." | |
+ # but this is not true: You can pass non-decomposed UTF-8 strings | |
+ # to file system functions, and it is the OS which will convert | |
+ # them to decomposed UTF-8 before accessing the file system. | |
+ # - The Apple Terminal application displays UTF-8 by default. | |
+ # - However, other applications are free to use different encodings: | |
+ # - xterm uses ISO-8859-1 by default. | |
+ # - TextEdit uses MacRoman by default. | |
+ # We prefer UTF-8 over decomposed UTF-8-MAC because one should | |
+ # minimize the use of decomposed Unicode. Unfortunately, through the | |
+ # Darwin file system, decomposed UTF-8 strings are leaked into user | |
+ # space nevertheless. | |
+ # Then there are also the locales with encodings other than US-ASCII | |
+ # and UTF-8. These locales can be occasionally useful to users (e.g. | |
+ # when grepping through ISO-8859-1 encoded text files), when all their | |
+ # file names are in US-ASCII. | |
+ echo "ISO8859-1 ISO-8859-1" | |
+ echo "ISO8859-2 ISO-8859-2" | |
+ echo "ISO8859-4 ISO-8859-4" | |
+ echo "ISO8859-5 ISO-8859-5" | |
+ echo "ISO8859-7 ISO-8859-7" | |
+ echo "ISO8859-9 ISO-8859-9" | |
+ echo "ISO8859-13 ISO-8859-13" | |
+ echo "ISO8859-15 ISO-8859-15" | |
+ echo "KOI8-R KOI8-R" | |
+ echo "KOI8-U KOI8-U" | |
+ echo "CP866 CP866" | |
+ echo "CP949 CP949" | |
+ echo "CP1131 CP1131" | |
+ echo "CP1251 CP1251" | |
+ echo "eucCN GB2312" | |
+ echo "GB2312 GB2312" | |
+ echo "eucJP EUC-JP" | |
+ echo "eucKR EUC-KR" | |
+ echo "Big5 BIG5" | |
+ echo "Big5HKSCS BIG5-HKSCS" | |
+ echo "GBK GBK" | |
+ echo "GB18030 GB18030" | |
+ echo "SJIS SHIFT_JIS" | |
+ echo "ARMSCII-8 ARMSCII-8" | |
+ echo "PT154 PT154" | |
+ #echo "ISCII-DEV ?" | |
+ echo "* UTF-8" | |
+ ;; | |
+ beos* | haiku*) | |
+ # BeOS and Haiku have a single locale, and it has UTF-8 encoding. | |
+ echo "* UTF-8" | |
+ ;; | |
+ msdosdjgpp*) | |
+ # DJGPP 2.03 doesn't have nl_langinfo(CODESET); therefore | |
+ # localcharset.c falls back to using the full locale name | |
+ # from the environment variables. | |
+ echo "#" | |
+ echo "# The encodings given here may not all be correct." | |
+ echo "# If you find that the encoding given for your language and" | |
+ echo "# country is not the one your DOS machine actually uses, just" | |
+ echo "# correct it in this file, and send a mail to" | |
+ echo "# Juan Manuel Guerrero <[email protected]>" | |
+ echo "# and Bruno Haible <[email protected]>." | |
+ echo "#" | |
+ echo "C ASCII" | |
+ # ISO-8859-1 languages | |
+ echo "ca CP850" | |
+ echo "ca_ES CP850" | |
+ echo "da CP865" # not CP850 ?? | |
+ echo "da_DK CP865" # not CP850 ?? | |
+ echo "de CP850" | |
+ echo "de_AT CP850" | |
+ echo "de_CH CP850" | |
+ echo "de_DE CP850" | |
+ echo "en CP850" | |
+ echo "en_AU CP850" # not CP437 ?? | |
+ echo "en_CA CP850" | |
+ echo "en_GB CP850" | |
+ echo "en_NZ CP437" | |
+ echo "en_US CP437" | |
+ echo "en_ZA CP850" # not CP437 ?? | |
+ echo "es CP850" | |
+ echo "es_AR CP850" | |
+ echo "es_BO CP850" | |
+ echo "es_CL CP850" | |
+ echo "es_CO CP850" | |
+ echo "es_CR CP850" | |
+ echo "es_CU CP850" | |
+ echo "es_DO CP850" | |
+ echo "es_EC CP850" | |
+ echo "es_ES CP850" | |
+ echo "es_GT CP850" | |
+ echo "es_HN CP850" | |
+ echo "es_MX CP850" | |
+ echo "es_NI CP850" | |
+ echo "es_PA CP850" | |
+ echo "es_PY CP850" | |
+ echo "es_PE CP850" | |
+ echo "es_SV CP850" | |
+ echo "es_UY CP850" | |
+ echo "es_VE CP850" | |
+ echo "et CP850" | |
+ echo "et_EE CP850" | |
+ echo "eu CP850" | |
+ echo "eu_ES CP850" | |
+ echo "fi CP850" | |
+ echo "fi_FI CP850" | |
+ echo "fr CP850" | |
+ echo "fr_BE CP850" | |
+ echo "fr_CA CP850" | |
+ echo "fr_CH CP850" | |
+ echo "fr_FR CP850" | |
+ echo "ga CP850" | |
+ echo "ga_IE CP850" | |
+ echo "gd CP850" | |
+ echo "gd_GB CP850" | |
+ echo "gl CP850" | |
+ echo "gl_ES CP850" | |
+ echo "id CP850" # not CP437 ?? | |
+ echo "id_ID CP850" # not CP437 ?? | |
+ echo "is CP861" # not CP850 ?? | |
+ echo "is_IS CP861" # not CP850 ?? | |
+ echo "it CP850" | |
+ echo "it_CH CP850" | |
+ echo "it_IT CP850" | |
+ echo "lt CP775" | |
+ echo "lt_LT CP775" | |
+ echo "lv CP775" | |
+ echo "lv_LV CP775" | |
+ echo "nb CP865" # not CP850 ?? | |
+ echo "nb_NO CP865" # not CP850 ?? | |
+ echo "nl CP850" | |
+ echo "nl_BE CP850" | |
+ echo "nl_NL CP850" | |
+ echo "nn CP865" # not CP850 ?? | |
+ echo "nn_NO CP865" # not CP850 ?? | |
+ echo "no CP865" # not CP850 ?? | |
+ echo "no_NO CP865" # not CP850 ?? | |
+ echo "pt CP850" | |
+ echo "pt_BR CP850" | |
+ echo "pt_PT CP850" | |
+ echo "sv CP850" | |
+ echo "sv_SE CP850" | |
+ # ISO-8859-2 languages | |
+ echo "cs CP852" | |
+ echo "cs_CZ CP852" | |
+ echo "hr CP852" | |
+ echo "hr_HR CP852" | |
+ echo "hu CP852" | |
+ echo "hu_HU CP852" | |
+ echo "pl CP852" | |
+ echo "pl_PL CP852" | |
+ echo "ro CP852" | |
+ echo "ro_RO CP852" | |
+ echo "sk CP852" | |
+ echo "sk_SK CP852" | |
+ echo "sl CP852" | |
+ echo "sl_SI CP852" | |
+ echo "sq CP852" | |
+ echo "sq_AL CP852" | |
+ echo "sr CP852" # CP852 or CP866 or CP855 ?? | |
+ echo "sr_CS CP852" # CP852 or CP866 or CP855 ?? | |
+ echo "sr_YU CP852" # CP852 or CP866 or CP855 ?? | |
+ # ISO-8859-3 languages | |
+ echo "mt CP850" | |
+ echo "mt_MT CP850" | |
+ # ISO-8859-5 languages | |
+ echo "be CP866" | |
+ echo "be_BE CP866" | |
+ echo "bg CP866" # not CP855 ?? | |
+ echo "bg_BG CP866" # not CP855 ?? | |
+ echo "mk CP866" # not CP855 ?? | |
+ echo "mk_MK CP866" # not CP855 ?? | |
+ echo "ru CP866" | |
+ echo "ru_RU CP866" | |
+ echo "uk CP1125" | |
+ echo "uk_UA CP1125" | |
+ # ISO-8859-6 languages | |
+ echo "ar CP864" | |
+ echo "ar_AE CP864" | |
+ echo "ar_DZ CP864" | |
+ echo "ar_EG CP864" | |
+ echo "ar_IQ CP864" | |
+ echo "ar_IR CP864" | |
+ echo "ar_JO CP864" | |
+ echo "ar_KW CP864" | |
+ echo "ar_MA CP864" | |
+ echo "ar_OM CP864" | |
+ echo "ar_QA CP864" | |
+ echo "ar_SA CP864" | |
+ echo "ar_SY CP864" | |
+ # ISO-8859-7 languages | |
+ echo "el CP869" | |
+ echo "el_GR CP869" | |
+ # ISO-8859-8 languages | |
+ echo "he CP862" | |
+ echo "he_IL CP862" | |
+ # ISO-8859-9 languages | |
+ echo "tr CP857" | |
+ echo "tr_TR CP857" | |
+ # Japanese | |
+ echo "ja CP932" | |
+ echo "ja_JP CP932" | |
+ # Chinese | |
+ echo "zh_CN GBK" | |
+ echo "zh_TW CP950" # not CP938 ?? | |
+ # Korean | |
+ echo "kr CP949" # not CP934 ?? | |
+ echo "kr_KR CP949" # not CP934 ?? | |
+ # Thai | |
+ echo "th CP874" | |
+ echo "th_TH CP874" | |
+ # Other | |
+ echo "eo CP850" | |
+ echo "eo_EO CP850" | |
+ ;; | |
esac | |
diff --git a/intl/dcgettext.c b/intl/dcgettext.c | |
t@@ -1,19 +1,20 @@ | |
/* Implementation of the dcgettext(3) function. | |
- Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc. | |
+ Copyright (C) 1995-1999, 2000-2003 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) | |
+ This program is free software; you can redistribute it and/or modify it | |
+ under the terms of the GNU Library General Public License as published | |
+ by the Free Software Foundation; either version 2, 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. | |
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
+ Library General Public License for more details. | |
- You should have received a copy of the GNU General Public License | |
- along with this program; if not, write to the Free Software Foundation, | |
- Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |
+ You should have received a copy of the GNU Library General Public | |
+ License along with this program; if not, write to the Free Software | |
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, | |
+ USA. */ | |
#ifdef HAVE_CONFIG_H | |
# include <config.h> | |
t@@ -36,22 +37,20 @@ | |
# define DCGETTEXT __dcgettext | |
# define DCIGETTEXT __dcigettext | |
#else | |
-# define DCGETTEXT dcgettext__ | |
-# define DCIGETTEXT dcigettext__ | |
+# define DCGETTEXT libintl_dcgettext | |
+# define DCIGETTEXT libintl_dcigettext | |
#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; | |
+DCGETTEXT (const char *domainname, const char *msgid, int category) | |
{ | |
return DCIGETTEXT (domainname, msgid, NULL, 0, 0, category); | |
} | |
#ifdef _LIBC | |
/* Alias for function name in GNU C Library. */ | |
+INTDEF(__dcgettext) | |
weak_alias (__dcgettext, dcgettext); | |
#endif | |
diff --git a/intl/dcigettext.c b/intl/dcigettext.c | |
t@@ -1,19 +1,20 @@ | |
/* Implementation of the internal dcigettext function. | |
- Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc. | |
+ Copyright (C) 1995-1999, 2000-2009 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) | |
+ This program is free software; you can redistribute it and/or modify it | |
+ under the terms of the GNU Library General Public License as published | |
+ by the Free Software Foundation; either version 2, 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. | |
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
+ Library General Public License for more details. | |
- You should have received a copy of the GNU General Public License | |
- along with this program; if not, write to the Free Software Foundation, | |
- Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |
+ You should have received a copy of the GNU Library General Public | |
+ License along with this program; if not, write to the Free Software | |
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, | |
+ USA. */ | |
/* Tell glibc's <string.h> to provide a prototype for mempcpy(). | |
This must come before <config.h> because <config.h> may include | |
t@@ -32,14 +33,19 @@ | |
# define alloca __builtin_alloca | |
# define HAVE_ALLOCA 1 | |
#else | |
-# if defined HAVE_ALLOCA_H || defined _LIBC | |
-# include <alloca.h> | |
+# ifdef _MSC_VER | |
+# include <malloc.h> | |
+# define alloca _alloca | |
# else | |
-# ifdef _AIX | |
- #pragma alloca | |
+# if defined HAVE_ALLOCA_H || defined _LIBC | |
+# include <alloca.h> | |
# else | |
-# ifndef alloca | |
+# ifdef _AIX | |
+ #pragma alloca | |
+# else | |
+# ifndef alloca | |
char *alloca (); | |
+# endif | |
# endif | |
# endif | |
# endif | |
t@@ -55,13 +61,7 @@ extern int errno; | |
#include <stddef.h> | |
#include <stdlib.h> | |
- | |
#include <string.h> | |
-#if !HAVE_STRCHR && !defined _LIBC | |
-# ifndef strchr | |
-# define strchr index | |
-# endif | |
-#endif | |
#if defined HAVE_UNISTD_H || defined _LIBC | |
# include <unistd.h> | |
t@@ -69,29 +69,49 @@ extern int errno; | |
#include <locale.h> | |
+#ifdef _LIBC | |
+ /* Guess whether integer division by zero raises signal SIGFPE. | |
+ Set to 1 only if you know for sure. In case of doubt, set to 0. */ | |
+# if defined __alpha__ || defined __arm__ || defined __i386__ \ | |
+ || defined __m68k__ || defined __s390__ | |
+# define INTDIV0_RAISES_SIGFPE 1 | |
+# else | |
+# define INTDIV0_RAISES_SIGFPE 0 | |
+# endif | |
+#endif | |
+#if !INTDIV0_RAISES_SIGFPE | |
+# include <signal.h> | |
+#endif | |
+ | |
#if defined HAVE_SYS_PARAM_H || defined _LIBC | |
# include <sys/param.h> | |
#endif | |
+#if !defined _LIBC | |
+# include "localcharset.h" | |
+#endif | |
+ | |
#include "gettextP.h" | |
+#include "plural-exp.h" | |
#ifdef _LIBC | |
# include <libintl.h> | |
#else | |
+# ifdef IN_LIBGLOCALE | |
+# include <libintl.h> | |
+# endif | |
# include "libgnuintl.h" | |
#endif | |
#include "hash-string.h" | |
-/* Thread safetyness. */ | |
+/* Handle multi-threaded applications. */ | |
#ifdef _LIBC | |
# include <bits/libc-lock.h> | |
+# define gl_rwlock_define_initialized __libc_rwlock_define_initialized | |
+# define gl_rwlock_rdlock __libc_rwlock_rdlock | |
+# define gl_rwlock_wrlock __libc_rwlock_wrlock | |
+# define gl_rwlock_unlock __libc_rwlock_unlock | |
#else | |
-/* Provide dummy implementation if this is outside glibc. */ | |
-# define __libc_lock_define_initialized(CLASS, NAME) | |
-# define __libc_lock_lock(NAME) | |
-# define __libc_lock_unlock(NAME) | |
-# define __libc_rwlock_define_initialized(CLASS, NAME) | |
-# define __libc_rwlock_rdlock(NAME) | |
-# define __libc_rwlock_unlock(NAME) | |
+# include "lock.h" | |
#endif | |
/* Alignment of types. */ | |
t@@ -102,16 +122,6 @@ extern int errno; | |
((int) &((struct { char dummy1; TYPE dummy2; } *) 0)->dummy2) | |
#endif | |
-/* The internal variables in the standalone libintl.a must have different | |
- names than the internal variables in GNU libc, otherwise programs | |
- using libintl.a cannot be linked statically. */ | |
-#if !defined _LIBC | |
-# define _nl_default_default_domain _nl_default_default_domain__ | |
-# define _nl_current_default_domain _nl_current_default_domain__ | |
-# define _nl_default_dirname _nl_default_dirname__ | |
-# define _nl_domain_bindings _nl_domain_bindings__ | |
-#endif | |
- | |
/* Some compilers, like SunOS4 cc, don't have offsetof in <stddef.h>. */ | |
#ifndef offsetof | |
# define offsetof(type,ident) ((size_t)&(((type*)0)->ident)) | |
t@@ -133,16 +143,36 @@ extern int errno; | |
char *getwd (); | |
# define getcwd(buf, max) getwd (buf) | |
# else | |
+# if VMS | |
+# define getcwd(buf, max) (getcwd) (buf, max, 0) | |
+# else | |
char *getcwd (); | |
+# endif | |
# endif | |
# ifndef HAVE_STPCPY | |
-static char *stpcpy PARAMS ((char *dest, const char *src)); | |
+static char *stpcpy (char *dest, const char *src); | |
# endif | |
# ifndef HAVE_MEMPCPY | |
-static void *mempcpy PARAMS ((void *dest, const void *src, size_t n)); | |
+static void *mempcpy (void *dest, const void *src, size_t n); | |
# endif | |
#endif | |
+/* Use a replacement if the system does not provide the `tsearch' function | |
+ family. */ | |
+#if HAVE_TSEARCH || defined _LIBC | |
+# include <search.h> | |
+#else | |
+# define tsearch libintl_tsearch | |
+# define tfind libintl_tfind | |
+# define tdelete libintl_tdelete | |
+# define twalk libintl_twalk | |
+# include "tsearch.h" | |
+#endif | |
+ | |
+#ifdef _LIBC | |
+# define tsearch __tsearch | |
+#endif | |
+ | |
/* Amount to increase buffer size by in each try. */ | |
#define PATH_INCR 32 | |
t@@ -181,8 +211,8 @@ static void *mempcpy PARAMS ((void *dest, const void *src,… | |
it may be concatenated to a directory pathname. | |
IS_PATH_WITH_DIR(P) tests whether P contains a directory specification. | |
*/ | |
-#if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__ | |
- /* Win32, OS/2, DOS */ | |
+#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX… | |
+ /* Win32, Cygwin, OS/2, DOS */ | |
# define ISSLASH(C) ((C) == '/' || (C) == '\\') | |
# define HAS_DEVICE(P) \ | |
((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \ | |
t@@ -197,14 +227,9 @@ static void *mempcpy PARAMS ((void *dest, const void *src… | |
# define IS_PATH_WITH_DIR(P) (strchr (P, '/') != NULL) | |
#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. Neither do SUSV2 and | |
- ISO C 99. So we can use this feature only on selected systems (e.g. | |
- those using GNU C Library). */ | |
-#if defined _LIBC || (defined __GNU_LIBRARY__ && __GNU_LIBRARY__ >= 2) | |
-# define HAVE_LOCALE_NULL | |
+/* Whether to support different locales in different threads. */ | |
+#if defined _LIBC || HAVE_USELOCALE || defined IN_LIBGLOCALE | |
+# define HAVE_PER_THREAD_LOCALE | |
#endif | |
/* This is the type used for the search tree where known translations | |
t@@ -212,11 +237,21 @@ static void *mempcpy PARAMS ((void *dest, const void *sr… | |
struct known_translation_t | |
{ | |
/* Domain in which to search. */ | |
- char *domainname; | |
+ const char *domainname; | |
/* The category. */ | |
int category; | |
+#ifdef HAVE_PER_THREAD_LOCALE | |
+ /* Name of the relevant locale category, or "" for the global locale. */ | |
+ const char *localename; | |
+#endif | |
+ | |
+#ifdef IN_LIBGLOCALE | |
+ /* The character encoding. */ | |
+ const char *encoding; | |
+#endif | |
+ | |
/* State of the catalog counter at the point the string was found. */ | |
int counter; | |
t@@ -228,26 +263,22 @@ struct known_translation_t | |
size_t translation_length; | |
/* Pointer to the string in question. */ | |
- char msgid[ZERO]; | |
+ union | |
+ { | |
+ char appended[ZERO]; /* used if domain != NULL */ | |
+ const char *ptr; /* used if domain == NULL */ | |
+ } | |
+ msgid; | |
}; | |
-/* Root of the search tree with known translations. We can use this | |
- only if the system provides the `tsearch' function family. */ | |
-#if defined HAVE_TSEARCH || defined _LIBC | |
-# include <search.h> | |
+gl_rwlock_define_initialized (static, tree_lock) | |
+/* Root of the search tree with known translations. */ | |
static void *root; | |
-# ifdef _LIBC | |
-# define tsearch __tsearch | |
-# endif | |
- | |
/* Function to compare two entries in the table of known translations. */ | |
-static int transcmp PARAMS ((const void *p1, const void *p2)); | |
static int | |
-transcmp (p1, p2) | |
- const void *p1; | |
- const void *p2; | |
+transcmp (const void *p1, const void *p2) | |
{ | |
const struct known_translation_t *s1; | |
const struct known_translation_t *s2; | |
t@@ -256,54 +287,98 @@ transcmp (p1, p2) | |
s1 = (const struct known_translation_t *) p1; | |
s2 = (const struct known_translation_t *) p2; | |
- result = strcmp (s1->msgid, s2->msgid); | |
+ result = strcmp (s1->domain != NULL ? s1->msgid.appended : s1->msgid.ptr, | |
+ s2->domain != NULL ? s2->msgid.appended : s2->msgid.ptr); | |
if (result == 0) | |
{ | |
result = strcmp (s1->domainname, s2->domainname); | |
if (result == 0) | |
- /* We compare the category last (though this is the cheapest | |
- operation) since it is hopefully always the same (namely | |
- LC_MESSAGES). */ | |
- result = s1->category - s2->category; | |
+ { | |
+#ifdef HAVE_PER_THREAD_LOCALE | |
+ result = strcmp (s1->localename, s2->localename); | |
+ if (result == 0) | |
+#endif | |
+ { | |
+#ifdef IN_LIBGLOCALE | |
+ result = strcmp (s1->encoding, s2->encoding); | |
+ if (result == 0) | |
+#endif | |
+ /* We compare the category last (though this is the cheapest | |
+ operation) since it is hopefully always the same (namely | |
+ LC_MESSAGES). */ | |
+ result = s1->category - s2->category; | |
+ } | |
+ } | |
} | |
return result; | |
} | |
-#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"; | |
+const char _nl_default_default_domain[] attribute_hidden = "messages"; | |
+#ifndef IN_LIBGLOCALE | |
/* Value used as the default domain for gettext(3). */ | |
-const char *_nl_current_default_domain = _nl_default_default_domain; | |
+const char *_nl_current_default_domain attribute_hidden | |
+ = _nl_default_default_domain; | |
+#endif | |
/* Contains the default location of the message catalogs. */ | |
+#if defined __EMX__ | |
+extern const char _nl_default_dirname[]; | |
+#else | |
+# ifdef _LIBC | |
+extern const char _nl_default_dirname[]; | |
+libc_hidden_proto (_nl_default_dirname) | |
+# endif | |
const char _nl_default_dirname[] = LOCALEDIR; | |
+# ifdef _LIBC | |
+libc_hidden_data_def (_nl_default_dirname) | |
+# endif | |
+#endif | |
+#ifndef IN_LIBGLOCALE | |
/* List with bindings of specific domains created by bindtextdomain() | |
calls. */ | |
struct binding *_nl_domain_bindings; | |
+#endif | |
/* Prototypes for local functions. */ | |
-static char *plural_lookup PARAMS ((struct loaded_l10nfile *domain, | |
- unsigned long int n, | |
- const char *translation, | |
- size_t translation_len)) | |
+static char *plural_lookup (struct loaded_l10nfile *domain, | |
+ unsigned long int n, | |
+ const char *translation, size_t translation_len) | |
internal_function; | |
-static unsigned long int plural_eval PARAMS ((struct expression *pexp, | |
- unsigned long int n)) | |
+ | |
+#ifdef IN_LIBGLOCALE | |
+static const char *guess_category_value (int category, | |
+ const char *categoryname, | |
+ const char *localename) | |
+ internal_function; | |
+#else | |
+static const char *guess_category_value (int category, | |
+ const char *categoryname) | |
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)) | |
+#endif | |
+ | |
+#ifdef _LIBC | |
+# include "../locale/localeinfo.h" | |
+# define category_to_name(category) \ | |
+ _nl_category_names.str + _nl_category_name_idxs[category] | |
+#else | |
+static const char *category_to_name (int category) internal_function; | |
+#endif | |
+#if (defined _LIBC || HAVE_ICONV) && !defined IN_LIBGLOCALE | |
+static const char *get_output_charset (struct binding *domainbinding) | |
internal_function; | |
+#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 freea(p) /* nothing */ | |
# define ADD_BLOCK(list, address) /* nothing */ | |
# define FREE_BLOCKS(list) /* nothing */ | |
#else | |
t@@ -328,11 +403,13 @@ struct block_list | |
while (list != NULL) { … | |
struct block_list *old = list; … | |
list = list->next; \ | |
+ free (old->address); … | |
free (old); … | |
} … | |
} while (0) | |
# undef alloca | |
# define alloca(size) (malloc (size)) | |
+# define freea(p) free (p) | |
#endif /* have alloca */ | |
t@@ -356,13 +433,11 @@ typedef unsigned char transmem_block_t; | |
#ifdef _LIBC | |
# define DCIGETTEXT __dcigettext | |
#else | |
-# define DCIGETTEXT dcigettext__ | |
+# define DCIGETTEXT libintl_dcigettext | |
#endif | |
/* Lock variable to protect the global data in the gettext implementation. */ | |
-#ifdef _LIBC | |
-__libc_rwlock_define_initialized (, _nl_state_lock) | |
-#endif | |
+gl_rwlock_define_initialized (, _nl_state_lock attribute_hidden) | |
/* Checking whether the binaries runs SUID must be done and glibc provides | |
easier methods therefore we make a difference here. */ | |
t@@ -394,17 +469,24 @@ static int enable_secure; | |
} | |
#endif | |
+/* Get the function to evaluate the plural expression. */ | |
+#include "eval-plural.h" | |
+ | |
/* Look up MSGID in the DOMAINNAME message catalog for the current | |
CATEGORY locale and, if PLURAL is nonzero, search over string | |
depending on the plural form determined by N. */ | |
+#ifdef IN_LIBGLOCALE | |
+char * | |
+gl_dcigettext (const char *domainname, | |
+ const char *msgid1, const char *msgid2, | |
+ int plural, unsigned long int n, | |
+ int category, | |
+ const char *localename, const char *encoding) | |
+#else | |
char * | |
-DCIGETTEXT (domainname, msgid1, msgid2, plural, n, category) | |
- const char *domainname; | |
- const char *msgid1; | |
- const char *msgid2; | |
- int plural; | |
- unsigned long int n; | |
- int category; | |
+DCIGETTEXT (const char *domainname, const char *msgid1, const char *msgid2, | |
+ int plural, unsigned long int n, int category) | |
+#endif | |
{ | |
#ifndef HAVE_ALLOCA | |
struct block_list *block_list = NULL; | |
t@@ -413,15 +495,16 @@ DCIGETTEXT (domainname, msgid1, msgid2, plural, n, categ… | |
struct binding *binding; | |
const char *categoryname; | |
const char *categoryvalue; | |
- char *dirname, *xdomainname; | |
+ const char *dirname; | |
+ char *xdomainname; | |
char *single_locale; | |
char *retval; | |
size_t retlen; | |
int saved_errno; | |
-#if defined HAVE_TSEARCH || defined _LIBC | |
- struct known_translation_t *search; | |
+ struct known_translation_t search; | |
struct known_translation_t **foundp = NULL; | |
- size_t msgid_len; | |
+#if defined HAVE_PER_THREAD_LOCALE && !defined IN_LIBGLOCALE | |
+ const char *localename; | |
#endif | |
size_t domainname_len; | |
t@@ -429,7 +512,24 @@ DCIGETTEXT (domainname, msgid1, msgid2, plural, n, catego… | |
if (msgid1 == NULL) | |
return NULL; | |
- __libc_rwlock_rdlock (_nl_state_lock); | |
+#ifdef _LIBC | |
+ if (category < 0 || category >= __LC_LAST || category == LC_ALL) | |
+ /* Bogus. */ | |
+ return (plural == 0 | |
+ ? (char *) msgid1 | |
+ /* Use the Germanic plural rule. */ | |
+ : n == 1 ? (char *) msgid1 : (char *) msgid2); | |
+#endif | |
+ | |
+ /* Preserve the `errno' value. */ | |
+ saved_errno = errno; | |
+ | |
+#ifdef _LIBC | |
+ __libc_rwlock_define (extern, __libc_setlocale_lock attribute_hidden) | |
+ __libc_rwlock_rdlock (__libc_setlocale_lock); | |
+#endif | |
+ | |
+ gl_rwlock_rdlock (_nl_state_lock); | |
/* 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 | |
t@@ -437,18 +537,43 @@ DCIGETTEXT (domainname, msgid1, msgid2, plural, n, categ… | |
if (domainname == NULL) | |
domainname = _nl_current_default_domain; | |
-#if defined HAVE_TSEARCH || defined _LIBC | |
- msgid_len = strlen (msgid1) + 1; | |
+ /* OS/2 specific: backward compatibility with older libintl versions */ | |
+#ifdef LC_MESSAGES_COMPAT | |
+ if (category == LC_MESSAGES_COMPAT) | |
+ category = LC_MESSAGES; | |
+#endif | |
/* Try to find the translation among those which we found at | |
some time. */ | |
- search = (struct known_translation_t *) | |
- alloca (offsetof (struct known_translation_t, msgid) + msgid_len); | |
- memcpy (search->msgid, msgid1, msgid_len); | |
- search->domainname = (char *) domainname; | |
- search->category = category; | |
+ search.domain = NULL; | |
+ search.msgid.ptr = msgid1; | |
+ search.domainname = domainname; | |
+ search.category = category; | |
+#ifdef HAVE_PER_THREAD_LOCALE | |
+# ifndef IN_LIBGLOCALE | |
+# ifdef _LIBC | |
+ localename = _strdupa (_current_locale_name (category)); | |
+# else | |
+ categoryname = category_to_name (category); | |
+# define CATEGORYNAME_INITIALIZED | |
+ localename = _nl_locale_name_thread_unsafe (category, categoryname); | |
+ if (localename == NULL) | |
+ localename = ""; | |
+# endif | |
+# endif | |
+ search.localename = localename; | |
+# ifdef IN_LIBGLOCALE | |
+ search.encoding = encoding; | |
+# endif | |
+ | |
+ /* Since tfind/tsearch manage a balanced tree, concurrent tfind and | |
+ tsearch calls can be fatal. */ | |
+ gl_rwlock_rdlock (tree_lock); | |
+ | |
+ foundp = (struct known_translation_t **) tfind (&search, &root, transcmp); | |
+ | |
+ gl_rwlock_unlock (tree_lock); | |
- foundp = (struct known_translation_t **) tfind (search, &root, transcmp); | |
if (foundp != NULL && (*foundp)->counter == _nl_msg_cat_cntr) | |
{ | |
/* Now deal with plural. */ | |
t@@ -458,18 +583,25 @@ DCIGETTEXT (domainname, msgid1, msgid2, plural, n, categ… | |
else | |
retval = (char *) (*foundp)->translation; | |
- __libc_rwlock_unlock (_nl_state_lock); | |
+ gl_rwlock_unlock (_nl_state_lock); | |
+# ifdef _LIBC | |
+ __libc_rwlock_unlock (__libc_setlocale_lock); | |
+# endif | |
+ __set_errno (saved_errno); | |
return retval; | |
} | |
#endif | |
- /* Preserve the `errno' value. */ | |
- saved_errno = errno; | |
- | |
/* See whether this is a SUID binary or not. */ | |
DETERMINE_SECURE; | |
/* First find matching binding. */ | |
+#ifdef IN_LIBGLOCALE | |
+ /* We can use a trivial binding, since _nl_find_msg will ignore it anyway, | |
+ and _nl_load_domain and _nl_find_domain just pass it through. */ | |
+ binding = NULL; | |
+ dirname = bindtextdomain (domainname, NULL); | |
+#else | |
for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next) | |
{ | |
int compare = strcmp (domainname, binding->domainname); | |
t@@ -485,59 +617,65 @@ DCIGETTEXT (domainname, msgid1, msgid2, plural, n, categ… | |
} | |
if (binding == NULL) | |
- dirname = (char *) _nl_default_dirname; | |
- else if (IS_ABSOLUTE_PATH (binding->dirname)) | |
- dirname = binding->dirname; | |
+ dirname = _nl_default_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; | |
+ dirname = binding->dirname; | |
+#endif | |
+ if (!IS_ABSOLUTE_PATH (dirname)) | |
+ { | |
+ /* We have a relative path. Make it absolute now. */ | |
+ size_t dirname_len = strlen (dirname) + 1; | |
+ size_t path_max; | |
+ char *resolved_dirname; | |
+ char *ret; | |
- path_max = (unsigned int) PATH_MAX; | |
- path_max += 2; /* The getcwd docs say to do this. */ | |
+ path_max = (unsigned int) PATH_MAX; | |
+ path_max += 2; /* The getcwd docs say to do this. */ | |
- for (;;) | |
- { | |
- dirname = (char *) alloca (path_max + dirname_len); | |
- ADD_BLOCK (block_list, dirname); | |
+ for (;;) | |
+ { | |
+ resolved_dirname = (char *) alloca (path_max + dirname_len); | |
+ ADD_BLOCK (block_list, tmp_dirname); | |
- __set_errno (0); | |
- ret = getcwd (dirname, path_max); | |
- if (ret != NULL || errno != ERANGE) | |
- break; | |
+ __set_errno (0); | |
+ ret = getcwd (resolved_dirname, path_max); | |
+ if (ret != NULL || errno != ERANGE) | |
+ break; | |
- path_max += path_max / 2; | |
- path_max += PATH_INCR; | |
- } | |
+ path_max += path_max / 2; | |
+ path_max += PATH_INCR; | |
+ } | |
- 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 (plural == 0 | |
- ? (char *) msgid1 | |
- /* Use the Germanic plural rule. */ | |
- : n == 1 ? (char *) msgid1 : (char *) msgid2); | |
- } | |
+ if (ret == NULL) | |
+ /* We cannot get the current working directory. Don't signal an | |
+ error but simply return the default string. */ | |
+ goto return_untranslated; | |
- stpcpy (stpcpy (strchr (dirname, '\0'), "/"), binding->dirname); | |
+ stpcpy (stpcpy (strchr (resolved_dirname, '\0'), "/"), dirname); | |
+ dirname = resolved_dirname; | |
+ } | |
+#ifndef IN_LIBGLOCALE | |
} | |
+#endif | |
/* Now determine the symbolic name of CATEGORY and its value. */ | |
+#ifndef CATEGORYNAME_INITIALIZED | |
categoryname = category_to_name (category); | |
+#endif | |
+#ifdef IN_LIBGLOCALE | |
+ categoryvalue = guess_category_value (category, categoryname, localename); | |
+#else | |
categoryvalue = guess_category_value (category, categoryname); | |
+#endif | |
domainname_len = strlen (domainname); | |
xdomainname = (char *) alloca (strlen (categoryname) | |
+ domainname_len + 5); | |
ADD_BLOCK (block_list, xdomainname); | |
- stpcpy (mempcpy (stpcpy (stpcpy (xdomainname, categoryname), "/"), | |
- domainname, domainname_len), | |
+ stpcpy ((char *) mempcpy (stpcpy (stpcpy (xdomainname, categoryname), "/"), | |
+ domainname, domainname_len), | |
".mo"); | |
/* Creating working area. */ | |
t@@ -579,16 +717,7 @@ DCIGETTEXT (domainname, msgid1, msgid2, plural, n, catego… | |
domain. Return the MSGID. */ | |
if (strcmp (single_locale, "C") == 0 | |
|| strcmp (single_locale, "POSIX") == 0) | |
- { | |
- FREE_BLOCKS (block_list); | |
- __libc_rwlock_unlock (_nl_state_lock); | |
- __set_errno (saved_errno); | |
- return (plural == 0 | |
- ? (char *) msgid1 | |
- /* Use the Germanic plural rule. */ | |
- : n == 1 ? (char *) msgid1 : (char *) msgid2); | |
- } | |
- | |
+ break; | |
/* Find structure describing the message catalog matching the | |
DOMAINNAME and CATEGORY. */ | |
t@@ -596,7 +725,11 @@ DCIGETTEXT (domainname, msgid1, msgid2, plural, n, catego… | |
if (domain != NULL) | |
{ | |
- retval = _nl_find_msg (domain, binding, msgid1, &retlen); | |
+#if defined IN_LIBGLOCALE | |
+ retval = _nl_find_msg (domain, binding, encoding, msgid1, &retlen); | |
+#else | |
+ retval = _nl_find_msg (domain, binding, msgid1, 1, &retlen); | |
+#endif | |
if (retval == NULL) | |
{ | |
t@@ -604,8 +737,13 @@ DCIGETTEXT (domainname, msgid1, msgid2, plural, n, catego… | |
for (cnt = 0; domain->successor[cnt] != NULL; ++cnt) | |
{ | |
+#if defined IN_LIBGLOCALE | |
retval = _nl_find_msg (domain->successor[cnt], binding, | |
- msgid1, &retlen); | |
+ encoding, msgid1, &retlen); | |
+#else | |
+ retval = _nl_find_msg (domain->successor[cnt], binding, | |
+ msgid1, 1, &retlen); | |
+#endif | |
if (retval != NULL) | |
{ | |
t@@ -615,35 +753,67 @@ DCIGETTEXT (domainname, msgid1, msgid2, plural, n, categ… | |
} | |
} | |
+ /* Returning -1 means that some resource problem exists | |
+ (likely memory) and that the strings could not be | |
+ converted. Return the original strings. */ | |
+ if (__builtin_expect (retval == (char *) -1, 0)) | |
+ break; | |
+ | |
if (retval != NULL) | |
{ | |
/* Found the translation of MSGID1 in domain DOMAIN: | |
starting at RETVAL, RETLEN bytes. */ | |
FREE_BLOCKS (block_list); | |
- __set_errno (saved_errno); | |
-#if defined HAVE_TSEARCH || defined _LIBC | |
if (foundp == NULL) | |
{ | |
/* Create a new entry and add it to the search tree. */ | |
+ size_t msgid_len; | |
+ size_t size; | |
struct known_translation_t *newp; | |
- newp = (struct known_translation_t *) | |
- malloc (offsetof (struct known_translation_t, msgid) | |
- + msgid_len + domainname_len + 1); | |
+ msgid_len = strlen (msgid1) + 1; | |
+ size = offsetof (struct known_translation_t, msgid) | |
+ + msgid_len + domainname_len + 1; | |
+#ifdef HAVE_PER_THREAD_LOCALE | |
+ size += strlen (localename) + 1; | |
+#endif | |
+ newp = (struct known_translation_t *) malloc (size); | |
if (newp != NULL) | |
{ | |
- newp->domainname = | |
- mempcpy (newp->msgid, msgid1, msgid_len); | |
- memcpy (newp->domainname, domainname, domainname_len + 1… | |
+ char *new_domainname; | |
+#ifdef HAVE_PER_THREAD_LOCALE | |
+ char *new_localename; | |
+#endif | |
+ | |
+ new_domainname = | |
+ (char *) mempcpy (newp->msgid.appended, msgid1, | |
+ msgid_len); | |
+ memcpy (new_domainname, domainname, domainname_len + 1); | |
+#ifdef HAVE_PER_THREAD_LOCALE | |
+ new_localename = new_domainname + domainname_len + 1; | |
+ strcpy (new_localename, localename); | |
+#endif | |
+ newp->domainname = new_domainname; | |
newp->category = category; | |
+#ifdef HAVE_PER_THREAD_LOCALE | |
+ newp->localename = new_localename; | |
+#endif | |
+#ifdef IN_LIBGLOCALE | |
+ newp->encoding = encoding; | |
+#endif | |
newp->counter = _nl_msg_cat_cntr; | |
newp->domain = domain; | |
newp->translation = retval; | |
newp->translation_length = retlen; | |
+ gl_rwlock_wrlock (tree_lock); | |
+ | |
/* Insert the entry in the search tree. */ | |
foundp = (struct known_translation_t **) | |
tsearch (newp, &root, transcmp); | |
+ | |
+ gl_rwlock_unlock (tree_lock); | |
+ | |
if (foundp == NULL | |
|| __builtin_expect (*foundp != newp, 0)) | |
/* The insert failed. */ | |
t@@ -658,34 +828,76 @@ DCIGETTEXT (domainname, msgid1, msgid2, plural, n, categ… | |
(*foundp)->translation = retval; | |
(*foundp)->translation_length = retlen; | |
} | |
-#endif | |
+ | |
+ __set_errno (saved_errno); | |
+ | |
/* Now deal with plural. */ | |
if (plural) | |
retval = plural_lookup (domain, n, retval, retlen); | |
- __libc_rwlock_unlock (_nl_state_lock); | |
+ gl_rwlock_unlock (_nl_state_lock); | |
+#ifdef _LIBC | |
+ __libc_rwlock_unlock (__libc_setlocale_lock); | |
+#endif | |
return retval; | |
} | |
} | |
} | |
- /* NOTREACHED */ | |
+ | |
+ return_untranslated: | |
+ /* Return the untranslated MSGID. */ | |
+ FREE_BLOCKS (block_list); | |
+ gl_rwlock_unlock (_nl_state_lock); | |
+#ifdef _LIBC | |
+ __libc_rwlock_unlock (__libc_setlocale_lock); | |
+#endif | |
+#ifndef _LIBC | |
+ if (!ENABLE_SECURE) | |
+ { | |
+ extern void _nl_log_untranslated (const char *logfilename, | |
+ const char *domainname, | |
+ const char *msgid1, const char *msgid2, | |
+ int plural); | |
+ const char *logfilename = getenv ("GETTEXT_LOG_UNTRANSLATED"); | |
+ | |
+ if (logfilename != NULL && logfilename[0] != '\0') | |
+ _nl_log_untranslated (logfilename, domainname, msgid1, msgid2, plural); | |
+ } | |
+#endif | |
+ __set_errno (saved_errno); | |
+ return (plural == 0 | |
+ ? (char *) msgid1 | |
+ /* Use the Germanic plural rule. */ | |
+ : n == 1 ? (char *) msgid1 : (char *) msgid2); | |
} | |
+/* Look up the translation of msgid within DOMAIN_FILE and DOMAINBINDING. | |
+ Return it if found. Return NULL if not found or in case of a conversion | |
+ failure (problem in the particular message catalog). Return (char *) -1 | |
+ in case of a memory allocation failure during conversion (only if | |
+ ENCODING != NULL resp. CONVERT == true). */ | |
char * | |
internal_function | |
-_nl_find_msg (domain_file, domainbinding, msgid, lengthp) | |
- struct loaded_l10nfile *domain_file; | |
- struct binding *domainbinding; | |
- const char *msgid; | |
- size_t *lengthp; | |
+#ifdef IN_LIBGLOCALE | |
+_nl_find_msg (struct loaded_l10nfile *domain_file, | |
+ struct binding *domainbinding, const char *encoding, | |
+ const char *msgid, | |
+ size_t *lengthp) | |
+#else | |
+_nl_find_msg (struct loaded_l10nfile *domain_file, | |
+ struct binding *domainbinding, | |
+ const char *msgid, int convert, | |
+ size_t *lengthp) | |
+#endif | |
{ | |
struct loaded_domain *domain; | |
+ nls_uint32 nstrings; | |
size_t act; | |
char *result; | |
size_t resultlen; | |
- if (domain_file->decided == 0) | |
+ if (domain_file->decided <= 0) | |
_nl_load_domain (domain_file, domainbinding); | |
if (domain_file->data == NULL) | |
t@@ -693,33 +905,43 @@ _nl_find_msg (domain_file, domainbinding, msgid, lengthp) | |
domain = (struct loaded_domain *) domain_file->data; | |
+ nstrings = domain->nstrings; | |
+ | |
/* Locate the MSGID and its translation. */ | |
- if (domain->hash_size > 2 && domain->hash_tab != NULL) | |
+ if (domain->hash_tab != NULL) | |
{ | |
/* Use the hashing table. */ | |
nls_uint32 len = strlen (msgid); | |
- nls_uint32 hash_val = hash_string (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)); | |
while (1) | |
{ | |
- nls_uint32 nstr = W (domain->must_swap, domain->hash_tab[idx]); | |
+ nls_uint32 nstr = | |
+ W (domain->must_swap_hash_tab, domain->hash_tab[idx]); | |
if (nstr == 0) | |
/* Hash table entry is empty. */ | |
return NULL; | |
- /* Compare msgid with the original string at index nstr-1. | |
+ nstr--; | |
+ | |
+ /* Compare msgid with the original string at index nstr. | |
We compare the lengths with >=, not ==, because plural entries | |
are represented by strings with an embedded NUL. */ | |
- 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)) | |
+ if (nstr < nstrings | |
+ ? W (domain->must_swap, domain->orig_tab[nstr].length) >= len | |
+ && (strcmp (msgid, | |
+ domain->data + W (domain->must_swap, | |
+ domain->orig_tab[nstr].offset)) | |
+ == 0) | |
+ : domain->orig_sysdep_tab[nstr - nstrings].length > len | |
+ && (strcmp (msgid, | |
+ domain->orig_sysdep_tab[nstr - nstrings].pointer) | |
+ == 0)) | |
{ | |
- act = nstr - 1; | |
+ act = nstr; | |
goto found; | |
} | |
t@@ -737,7 +959,7 @@ _nl_find_msg (domain_file, domainbinding, msgid, lengthp) | |
size_t top, bottom; | |
bottom = 0; | |
- top = domain->nstrings; | |
+ top = nstrings; | |
while (bottom < top) | |
{ | |
int cmp_val; | |
t@@ -760,199 +982,413 @@ _nl_find_msg (domain_file, domainbinding, msgid, lengt… | |
found: | |
/* The translation was found at index ACT. If we have to convert the | |
string to use a different character set, this is the time. */ | |
- result = ((char *) domain->data | |
- + W (domain->must_swap, domain->trans_tab[act].offset)); | |
- resultlen = W (domain->must_swap, domain->trans_tab[act].length) + 1; | |
+ if (act < nstrings) | |
+ { | |
+ result = (char *) | |
+ (domain->data + W (domain->must_swap, domain->trans_tab[act].offset)); | |
+ resultlen = W (domain->must_swap, domain->trans_tab[act].length) + 1; | |
+ } | |
+ else | |
+ { | |
+ result = (char *) domain->trans_sysdep_tab[act - nstrings].pointer; | |
+ resultlen = domain->trans_sysdep_tab[act - nstrings].length; | |
+ } | |
#if defined _LIBC || HAVE_ICONV | |
- if (domain->codeset_cntr | |
- != (domainbinding != NULL ? domainbinding->codeset_cntr : 0)) | |
+# ifdef IN_LIBGLOCALE | |
+ if (encoding != NULL) | |
+# else | |
+ if (convert) | |
+# endif | |
{ | |
- /* The domain's codeset has changed through bind_textdomain_codeset() | |
- since the message catalog was initialized or last accessed. We | |
- have to reinitialize the converter. */ | |
- _nl_free_domain_conv (domain); | |
- _nl_init_domain_conv (domain_file, domain, domainbinding); | |
- } | |
+ /* We are supposed to do a conversion. */ | |
+# ifndef IN_LIBGLOCALE | |
+ const char *encoding = get_output_charset (domainbinding); | |
+# endif | |
+ size_t nconversions; | |
+ struct converted_domain *convd; | |
+ size_t i; | |
+ | |
+ /* Protect against reallocation of the table. */ | |
+ gl_rwlock_rdlock (domain->conversions_lock); | |
+ | |
+ /* Search whether a table with converted translations for this | |
+ encoding has already been allocated. */ | |
+ nconversions = domain->nconversions; | |
+ convd = NULL; | |
+ | |
+ for (i = nconversions; i > 0; ) | |
+ { | |
+ i--; | |
+ if (strcmp (domain->conversions[i].encoding, encoding) == 0) | |
+ { | |
+ convd = &domain->conversions[i]; | |
+ break; | |
+ } | |
+ } | |
- if ( | |
+ gl_rwlock_unlock (domain->conversions_lock); | |
+ | |
+ if (convd == NULL) | |
+ { | |
+ /* We have to allocate a new conversions table. */ | |
+ gl_rwlock_wrlock (domain->conversions_lock); | |
+ nconversions = domain->nconversions; | |
+ | |
+ /* Maybe in the meantime somebody added the translation. | |
+ Recheck. */ | |
+ for (i = nconversions; i > 0; ) | |
+ { | |
+ i--; | |
+ if (strcmp (domain->conversions[i].encoding, encoding) == 0) | |
+ { | |
+ convd = &domain->conversions[i]; | |
+ goto found_convd; | |
+ } | |
+ } | |
+ | |
+ { | |
+ /* Allocate a table for the converted translations for this | |
+ encoding. */ | |
+ struct converted_domain *new_conversions = | |
+ (struct converted_domain *) | |
+ (domain->conversions != NULL | |
+ ? realloc (domain->conversions, | |
+ (nconversions + 1) * sizeof (struct converted_domain… | |
+ : malloc ((nconversions + 1) * sizeof (struct converted_domain)… | |
+ | |
+ if (__builtin_expect (new_conversions == NULL, 0)) | |
+ { | |
+ /* Nothing we can do, no more memory. We cannot use the | |
+ translation because it might be encoded incorrectly. */ | |
+ unlock_fail: | |
+ gl_rwlock_unlock (domain->conversions_lock); | |
+ return (char *) -1; | |
+ } | |
+ | |
+ domain->conversions = new_conversions; | |
+ | |
+ /* Copy the 'encoding' string to permanent storage. */ | |
+ encoding = strdup (encoding); | |
+ if (__builtin_expect (encoding == NULL, 0)) | |
+ /* Nothing we can do, no more memory. We cannot use the | |
+ translation because it might be encoded incorrectly. */ | |
+ goto unlock_fail; | |
+ | |
+ convd = &new_conversions[nconversions]; | |
+ convd->encoding = encoding; | |
+ | |
+ /* Find out about the character set the file is encoded with. | |
+ This can be found (in textual form) in the entry "". If this | |
+ entry does not exist or if this does not contain the 'charset=' | |
+ information, we will assume the charset matches the one the | |
+ current locale and we don't have to perform any conversion. */ | |
# ifdef _LIBC | |
- domain->conv != (__gconv_t) -1 | |
+ convd->conv = (__gconv_t) -1; | |
# else | |
# if HAVE_ICONV | |
- domain->conv != (iconv_t) -1 | |
+ convd->conv = (iconv_t) -1; | |
# endif | |
# endif | |
- ) | |
- { | |
- /* We are supposed to do a conversion. First allocate an | |
- appropriate table with the same structure as the table | |
- of translations in the file, where we can put the pointers | |
- to the converted strings in. | |
- There is a slight complication with plural entries. They | |
- are represented by consecutive NUL terminated strings. We | |
- handle this case by converting RESULTLEN bytes, including | |
- NULs. */ | |
- | |
- if (domain->conv_tab == NULL | |
- && ((domain->conv_tab = (char **) calloc (domain->nstrings, | |
- sizeof (char *))) | |
- == NULL)) | |
- /* Mark that we didn't succeed allocating a table. */ | |
- domain->conv_tab = (char **) -1; | |
- | |
- if (__builtin_expect (domain->conv_tab == (char **) -1, 0)) | |
- /* Nothing we can do, no more memory. */ | |
- goto converted; | |
- | |
- if (domain->conv_tab[act] == NULL) | |
+ { | |
+ char *nullentry; | |
+ size_t nullentrylen; | |
+ | |
+ /* Get the header entry. This is a recursion, but it doesn't | |
+ reallocate domain->conversions because we pass | |
+ encoding = NULL or convert = 0, respectively. */ | |
+ nullentry = | |
+# ifdef IN_LIBGLOCALE | |
+ _nl_find_msg (domain_file, domainbinding, NULL, "", | |
+ &nullentrylen); | |
+# else | |
+ _nl_find_msg (domain_file, domainbinding, "", 0, &nullentrylen… | |
+# endif | |
+ | |
+ if (nullentry != NULL) | |
+ { | |
+ const char *charsetstr; | |
+ | |
+ charsetstr = strstr (nullentry, "charset="); | |
+ if (charsetstr != NULL) | |
+ { | |
+ size_t len; | |
+ char *charset; | |
+ const char *outcharset; | |
+ | |
+ charsetstr += strlen ("charset="); | |
+ len = strcspn (charsetstr, " \t\n"); | |
+ | |
+ charset = (char *) alloca (len + 1); | |
+# if defined _LIBC || HAVE_MEMPCPY | |
+ *((char *) mempcpy (charset, charsetstr, len)) = '\0'; | |
+# else | |
+ memcpy (charset, charsetstr, len); | |
+ charset[len] = '\0'; | |
+# endif | |
+ | |
+ outcharset = encoding; | |
+ | |
+# ifdef _LIBC | |
+ /* We always want to use transliteration. */ | |
+ outcharset = norm_add_slashes (outcharset, "TRANSLIT"); | |
+ charset = norm_add_slashes (charset, ""); | |
+ int r = __gconv_open (outcharset, charset, &convd->conv, | |
+ GCONV_AVOID_NOCONV); | |
+ if (__builtin_expect (r != __GCONV_OK, 0)) | |
+ { | |
+ /* If the output encoding is the same there is | |
+ nothing to do. Otherwise do not use the | |
+ translation at all. */ | |
+ if (__builtin_expect (r != __GCONV_NULCONV, 1)) | |
+ { | |
+ gl_rwlock_unlock (domain->conversions_lock); | |
+ free ((char *) encoding); | |
+ return NULL; | |
+ } | |
+ | |
+ convd->conv = (__gconv_t) -1; | |
+ } | |
+# else | |
+# if HAVE_ICONV | |
+ /* When using GNU libc >= 2.2 or GNU libiconv >= 1.5, | |
+ we want to use transliteration. */ | |
+# if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2) || __GLIBC__ > 2 \ | |
+ || _LIBICONV_VERSION >= 0x0105 | |
+ if (strchr (outcharset, '/') == NULL) | |
+ { | |
+ char *tmp; | |
+ | |
+ len = strlen (outcharset); | |
+ tmp = (char *) alloca (len + 10 + 1); | |
+ memcpy (tmp, outcharset, len); | |
+ memcpy (tmp + len, "//TRANSLIT", 10 + 1); | |
+ outcharset = tmp; | |
+ | |
+ convd->conv = iconv_open (outcharset, charset); | |
+ | |
+ freea (outcharset); | |
+ } | |
+ else | |
+# endif | |
+ convd->conv = iconv_open (outcharset, charset); | |
+# endif | |
+# endif | |
+ | |
+ freea (charset); | |
+ } | |
+ } | |
+ } | |
+ convd->conv_tab = NULL; | |
+ /* Here domain->conversions is still == new_conversions. */ | |
+ domain->nconversions++; | |
+ } | |
+ | |
+ found_convd: | |
+ gl_rwlock_unlock (domain->conversions_lock); | |
+ } | |
+ | |
+ if ( | |
+# ifdef _LIBC | |
+ convd->conv != (__gconv_t) -1 | |
+# else | |
+# if HAVE_ICONV | |
+ convd->conv != (iconv_t) -1 | |
+# endif | |
+# endif | |
+ ) | |
{ | |
- /* We haven't used this string so far, so it is not | |
- translated yet. Do this now. */ | |
- /* We use a bit more efficient memory handling. | |
- We allocate always larger blocks which get used over | |
- time. This is faster than many small allocations. */ | |
+ /* We are supposed to do a conversion. First allocate an | |
+ appropriate table with the same structure as the table | |
+ of translations in the file, where we can put the pointers | |
+ to the converted strings in. | |
+ There is a slight complication with plural entries. They | |
+ are represented by consecutive NUL terminated strings. We | |
+ handle this case by converting RESULTLEN bytes, including | |
+ NULs. */ | |
+ | |
+ /* This lock primarily protects the memory management variables | |
+ freemem, freemem_size. It also protects write accesses to | |
+ convd->conv_tab. It's not worth using a separate lock (such | |
+ as domain->conversions_lock) for this purpose, because when | |
+ modifying convd->conv_tab, we also need to lock freemem, | |
+ freemem_size for most of the time. */ | |
__libc_lock_define_initialized (static, lock) | |
+ | |
+ if (__builtin_expect (convd->conv_tab == NULL, 0)) | |
+ { | |
+ __libc_lock_lock (lock); | |
+ if (convd->conv_tab == NULL) | |
+ { | |
+ convd->conv_tab = | |
+ (char **) calloc (nstrings + domain->n_sysdep_strings, | |
+ sizeof (char *)); | |
+ if (convd->conv_tab != NULL) | |
+ goto not_translated_yet; | |
+ /* Mark that we didn't succeed allocating a table. */ | |
+ convd->conv_tab = (char **) -1; | |
+ } | |
+ __libc_lock_unlock (lock); | |
+ } | |
+ | |
+ if (__builtin_expect (convd->conv_tab == (char **) -1, 0)) | |
+ /* Nothing we can do, no more memory. We cannot use the | |
+ translation because it might be encoded incorrectly. */ | |
+ return (char *) -1; | |
+ | |
+ if (convd->conv_tab[act] == NULL) | |
+ { | |
+ /* We haven't used this string so far, so it is not | |
+ translated yet. Do this now. */ | |
+ /* We use a bit more efficient memory handling. | |
+ We allocate always larger blocks which get used over | |
+ time. This is faster than many small allocations. */ | |
# define INITIAL_BLOCK_SIZE 4080 | |
- static unsigned char *freemem; | |
- static size_t freemem_size; | |
+ static unsigned char *freemem; | |
+ static size_t freemem_size; | |
- const unsigned char *inbuf; | |
- unsigned char *outbuf; | |
- int malloc_count; | |
+ const unsigned char *inbuf; | |
+ unsigned char *outbuf; | |
+ int malloc_count; | |
# ifndef _LIBC | |
- transmem_block_t *transmem_list = NULL; | |
+ transmem_block_t *transmem_list; | |
# endif | |
- __libc_lock_lock (lock); | |
+ __libc_lock_lock (lock); | |
+ not_translated_yet: | |
- inbuf = (const unsigned char *) result; | |
- outbuf = freemem + sizeof (size_t); | |
+ inbuf = (const unsigned char *) result; | |
+ outbuf = freemem + sizeof (size_t); | |
+# ifndef _LIBC | |
+ transmem_list = NULL; | |
+# endif | |
- malloc_count = 0; | |
- while (1) | |
- { | |
- transmem_block_t *newmem; | |
+ malloc_count = 0; | |
+ while (1) | |
+ { | |
+ transmem_block_t *newmem; | |
# ifdef _LIBC | |
- size_t non_reversible; | |
- int res; | |
+ size_t non_reversible; | |
+ int res; | |
- if (freemem_size < sizeof (size_t)) | |
- goto resize_freemem; | |
+ if (freemem_size < sizeof (size_t)) | |
+ goto resize_freemem; | |
- res = __gconv (domain->conv, | |
- &inbuf, inbuf + resultlen, | |
- &outbuf, | |
- outbuf + freemem_size - sizeof (size_t), | |
- &non_reversible); | |
+ res = __gconv (convd->conv, | |
+ &inbuf, inbuf + resultlen, | |
+ &outbuf, | |
+ outbuf + freemem_size - sizeof (size_t), | |
+ &non_reversible); | |
- if (res == __GCONV_OK || res == __GCONV_EMPTY_INPUT) | |
- break; | |
+ if (res == __GCONV_OK || res == __GCONV_EMPTY_INPUT) | |
+ break; | |
- if (res != __GCONV_FULL_OUTPUT) | |
- { | |
- __libc_lock_unlock (lock); | |
- goto converted; | |
- } | |
+ if (res != __GCONV_FULL_OUTPUT) | |
+ { | |
+ /* We should not use the translation at all, it | |
+ is incorrectly encoded. */ | |
+ __libc_lock_unlock (lock); | |
+ return NULL; | |
+ } | |
- inbuf = result; | |
+ inbuf = (const unsigned char *) result; | |
# else | |
# if HAVE_ICONV | |
- const char *inptr = (const char *) inbuf; | |
- size_t inleft = resultlen; | |
- char *outptr = (char *) outbuf; | |
- size_t outleft; | |
- | |
- if (freemem_size < sizeof (size_t)) | |
- goto resize_freemem; | |
- | |
- outleft = freemem_size - sizeof (size_t); | |
- if (iconv (domain->conv, | |
- (ICONV_CONST char **) &inptr, &inleft, | |
- &outptr, &outleft) | |
- != (size_t) (-1)) | |
- { | |
- outbuf = (unsigned char *) outptr; | |
- break; | |
- } | |
- if (errno != E2BIG) | |
- { | |
- __libc_lock_unlock (lock); | |
- goto converted; | |
- } | |
+ const char *inptr = (const char *) inbuf; | |
+ size_t inleft = resultlen; | |
+ char *outptr = (char *) outbuf; | |
+ size_t outleft; | |
+ | |
+ if (freemem_size < sizeof (size_t)) | |
+ goto resize_freemem; | |
+ | |
+ outleft = freemem_size - sizeof (size_t); | |
+ if (iconv (convd->conv, | |
+ (ICONV_CONST char **) &inptr, &inleft, | |
+ &outptr, &outleft) | |
+ != (size_t) (-1)) | |
+ { | |
+ outbuf = (unsigned char *) outptr; | |
+ break; | |
+ } | |
+ if (errno != E2BIG) | |
+ { | |
+ __libc_lock_unlock (lock); | |
+ return NULL; | |
+ } | |
# endif | |
# endif | |
- resize_freemem: | |
- /* We must allocate a new buffer or resize the old one. */ | |
- if (malloc_count > 0) | |
- { | |
- ++malloc_count; | |
- freemem_size = malloc_count * INITIAL_BLOCK_SIZE; | |
- newmem = (transmem_block_t *) realloc (transmem_list, | |
- freemem_size); | |
+ resize_freemem: | |
+ /* We must allocate a new buffer or resize the old one. */ | |
+ if (malloc_count > 0) | |
+ { | |
+ ++malloc_count; | |
+ freemem_size = malloc_count * INITIAL_BLOCK_SIZE; | |
+ newmem = (transmem_block_t *) realloc (transmem_list, | |
+ freemem_size); | |
# ifdef _LIBC | |
- if (newmem != NULL) | |
- transmem_list = transmem_list->next; | |
+ if (newmem != NULL) | |
+ transmem_list = transmem_list->next; | |
+ else | |
+ { | |
+ struct transmem_list *old = transmem_list; | |
+ | |
+ transmem_list = transmem_list->next; | |
+ free (old); | |
+ } | |
+# endif | |
+ } | |
else | |
{ | |
- struct transmem_list *old = transmem_list; | |
- | |
- transmem_list = transmem_list->next; | |
- free (old); | |
+ malloc_count = 1; | |
+ freemem_size = INITIAL_BLOCK_SIZE; | |
+ newmem = (transmem_block_t *) malloc (freemem_size); | |
+ } | |
+ if (__builtin_expect (newmem == NULL, 0)) | |
+ { | |
+ freemem = NULL; | |
+ freemem_size = 0; | |
+ __libc_lock_unlock (lock); | |
+ return (char *) -1; | |
} | |
-# endif | |
- } | |
- else | |
- { | |
- malloc_count = 1; | |
- freemem_size = INITIAL_BLOCK_SIZE; | |
- newmem = (transmem_block_t *) malloc (freemem_size); | |
- } | |
- if (__builtin_expect (newmem == NULL, 0)) | |
- { | |
- freemem = NULL; | |
- freemem_size = 0; | |
- __libc_lock_unlock (lock); | |
- goto converted; | |
- } | |
# ifdef _LIBC | |
- /* Add the block to the list of blocks we have to free | |
- at some point. */ | |
- newmem->next = transmem_list; | |
- transmem_list = newmem; | |
+ /* Add the block to the list of blocks we have to free | |
+ at some point. */ | |
+ newmem->next = transmem_list; | |
+ transmem_list = newmem; | |
- freemem = newmem->data; | |
- freemem_size -= offsetof (struct transmem_list, data); | |
+ freemem = (unsigned char *) newmem->data; | |
+ freemem_size -= offsetof (struct transmem_list, data); | |
# else | |
- transmem_list = newmem; | |
- freemem = newmem; | |
+ transmem_list = newmem; | |
+ freemem = newmem; | |
# endif | |
- outbuf = freemem + sizeof (size_t); | |
+ outbuf = freemem + sizeof (size_t); | |
+ } | |
+ | |
+ /* We have now in our buffer a converted string. Put this | |
+ into the table of conversions. */ | |
+ *(size_t *) freemem = outbuf - freemem - sizeof (size_t); | |
+ convd->conv_tab[act] = (char *) freemem; | |
+ /* Shrink freemem, but keep it aligned. */ | |
+ freemem_size -= outbuf - freemem; | |
+ freemem = outbuf; | |
+ freemem += freemem_size & (alignof (size_t) - 1); | |
+ freemem_size = freemem_size & ~ (alignof (size_t) - 1); | |
+ | |
+ __libc_lock_unlock (lock); | |
} | |
- /* We have now in our buffer a converted string. Put this | |
- into the table of conversions. */ | |
- *(size_t *) freemem = outbuf - freemem - sizeof (size_t); | |
- domain->conv_tab[act] = (char *) freemem; | |
- /* Shrink freemem, but keep it aligned. */ | |
- freemem_size -= outbuf - freemem; | |
- freemem = outbuf; | |
- freemem += freemem_size & (alignof (size_t) - 1); | |
- freemem_size = freemem_size & ~ (alignof (size_t) - 1); | |
- | |
- __libc_lock_unlock (lock); | |
+ /* Now convd->conv_tab[act] contains the translation of all | |
+ the plural variants. */ | |
+ result = convd->conv_tab[act] + sizeof (size_t); | |
+ resultlen = *(size_t *) convd->conv_tab[act]; | |
} | |
- | |
- /* Now domain->conv_tab[act] contains the translation of all | |
- the plural variants. */ | |
- result = domain->conv_tab[act] + sizeof (size_t); | |
- resultlen = *(size_t *) domain->conv_tab[act]; | |
} | |
- converted: | |
/* The result string is converted. */ | |
#endif /* _LIBC || HAVE_ICONV */ | |
t@@ -965,11 +1401,8 @@ _nl_find_msg (domain_file, domainbinding, msgid, lengthp) | |
/* Look up a plural variant. */ | |
static char * | |
internal_function | |
-plural_lookup (domain, n, translation, translation_len) | |
- struct loaded_l10nfile *domain; | |
- unsigned long int n; | |
- const char *translation; | |
- size_t translation_len; | |
+plural_lookup (struct loaded_l10nfile *domain, unsigned long int n, | |
+ const char *translation, size_t translation_len) | |
{ | |
struct loaded_domain *domaindata = (struct loaded_domain *) domain->data; | |
unsigned long int index; | |
t@@ -1002,93 +1435,11 @@ plural_lookup (domain, n, translation, translation_len) | |
return (char *) p; | |
} | |
- | |
-/* Function to evaluate the plural expression and return an index value. */ | |
-static unsigned long int | |
-internal_function | |
-plural_eval (pexp, n) | |
- struct expression *pexp; | |
- unsigned long int n; | |
-{ | |
- switch (pexp->nargs) | |
- { | |
- case 0: | |
- switch (pexp->operation) | |
- { | |
- case var: | |
- return n; | |
- case num: | |
- return pexp->val.num; | |
- default: | |
- break; | |
- } | |
- /* NOTREACHED */ | |
- break; | |
- case 1: | |
- { | |
- /* pexp->operation must be lnot. */ | |
- unsigned long int arg = plural_eval (pexp->val.args[0], n); | |
- return ! arg; | |
- } | |
- case 2: | |
- { | |
- unsigned long int leftarg = plural_eval (pexp->val.args[0], n); | |
- if (pexp->operation == lor) | |
- return leftarg || plural_eval (pexp->val.args[1], n); | |
- else if (pexp->operation == land) | |
- return leftarg && plural_eval (pexp->val.args[1], n); | |
- else | |
- { | |
- unsigned long int rightarg = plural_eval (pexp->val.args[1], n); | |
- | |
- switch (pexp->operation) | |
- { | |
- case mult: | |
- return leftarg * rightarg; | |
- case divide: | |
- return leftarg / rightarg; | |
- case module: | |
- return leftarg % rightarg; | |
- case plus: | |
- return leftarg + rightarg; | |
- case minus: | |
- return leftarg - rightarg; | |
- case less_than: | |
- return leftarg < rightarg; | |
- case greater_than: | |
- return leftarg > rightarg; | |
- case less_or_equal: | |
- return leftarg <= rightarg; | |
- case greater_or_equal: | |
- return leftarg >= rightarg; | |
- case equal: | |
- return leftarg == rightarg; | |
- case not_equal: | |
- return leftarg != rightarg; | |
- default: | |
- break; | |
- } | |
- } | |
- /* NOTREACHED */ | |
- break; | |
- } | |
- case 3: | |
- { | |
- /* pexp->operation must be qmop. */ | |
- unsigned long int boolarg = plural_eval (pexp->val.args[0], n); | |
- return plural_eval (pexp->val.args[boolarg ? 1 : 2], n); | |
- } | |
- } | |
- /* NOTREACHED */ | |
- return 0; | |
-} | |
- | |
- | |
+#ifndef _LIBC | |
/* Return string representation of locale CATEGORY. */ | |
static const char * | |
internal_function | |
-category_to_name (category) | |
- int category; | |
+category_to_name (int category) | |
{ | |
const char *retval; | |
t@@ -1143,51 +1494,152 @@ category_to_name (category) | |
return retval; | |
} | |
+#endif | |
-/* Guess value of current locale from value of the environment variables. */ | |
+/* Guess value of current locale from value of the environment variables | |
+ or system-dependent defaults. */ | |
static const char * | |
internal_function | |
-guess_category_value (category, categoryname) | |
- int category; | |
- const char *categoryname; | |
+#ifdef IN_LIBGLOCALE | |
+guess_category_value (int category, const char *categoryname, | |
+ const char *locale) | |
+ | |
+#else | |
+guess_category_value (int category, const char *categoryname) | |
+#endif | |
{ | |
const char *language; | |
- const char *retval; | |
- | |
- /* The highest priority value is the `LANGUAGE' environment | |
- variable. But we don't use the value if the currently selected | |
- locale is the C locale. This is a GNU extension. */ | |
- language = getenv ("LANGUAGE"); | |
- if (language != NULL && language[0] == '\0') | |
- language = NULL; | |
+#ifndef IN_LIBGLOCALE | |
+ const char *locale; | |
+# ifndef _LIBC | |
+ const char *language_default; | |
+ int locale_defaulted; | |
+# endif | |
+#endif | |
- /* We have to proceed with the POSIX methods of looking to `LC_ALL', | |
+ /* We use the settings in the following order: | |
+ 1. The value of the environment variable 'LANGUAGE'. This is a GNU | |
+ extension. Its value can be a colon-separated list of locale names. | |
+ 2. The value of the environment variable 'LC_ALL', 'LC_xxx', or 'LANG'. | |
+ More precisely, the first among these that is set to a non-empty value. | |
+ This is how POSIX specifies it. The value is a single locale name. | |
+ 3. A system-dependent preference list of languages. Its value can be a | |
+ colon-separated list of locale names. | |
+ 4. A system-dependent default locale name. | |
+ This way: | |
+ - System-dependent settings can be overridden by environment variables. | |
+ - If the system provides both a list of languages and a default locale, | |
+ the former is used. */ | |
+ | |
+#ifndef IN_LIBGLOCALE | |
+ /* Fetch the locale name, through the POSIX method of looking to `LC_ALL', | |
`LC_xxx', and `LANG'. On some systems this can be done by the | |
`setlocale' function itself. */ | |
-#if defined _LIBC || (defined HAVE_SETLOCALE && defined HAVE_LC_MESSAGES && de… | |
- retval = setlocale (category, NULL); | |
-#else | |
- /* Setting of LC_ALL overwrites all other. */ | |
- retval = getenv ("LC_ALL"); | |
- if (retval == NULL || retval[0] == '\0') | |
+# ifdef _LIBC | |
+ locale = __current_locale_name (category); | |
+# else | |
+ locale_defaulted = 0; | |
+# if HAVE_USELOCALE | |
+ locale = _nl_locale_name_thread_unsafe (category, categoryname); | |
+ if (locale == NULL) | |
+# endif | |
{ | |
- /* Next comes the name of the desired category. */ | |
- retval = getenv (categoryname); | |
- if (retval == NULL || retval[0] == '\0') | |
+ locale = _nl_locale_name_posix (category, categoryname); | |
+ if (locale == NULL) | |
{ | |
- /* Last possibility is the LANG environment variable. */ | |
- retval = getenv ("LANG"); | |
- if (retval == NULL || retval[0] == '\0') | |
- /* We use C as the default domain. POSIX says this is | |
- implementation defined. */ | |
- return "C"; | |
+ locale = _nl_locale_name_default (); | |
+ locale_defaulted = 1; | |
} | |
} | |
+# endif | |
#endif | |
- return language != NULL && strcmp (retval, "C") != 0 ? language : retval; | |
+ /* Ignore LANGUAGE and its system-dependent analogon if the locale is set | |
+ to "C" because | |
+ 1. "C" locale usually uses the ASCII encoding, and most international | |
+ messages use non-ASCII characters. These characters get displayed | |
+ as question marks (if using glibc's iconv()) or as invalid 8-bit | |
+ characters (because other iconv()s refuse to convert most non-ASCII | |
+ characters to ASCII). In any case, the output is ugly. | |
+ 2. The precise output of some programs in the "C" locale is specified | |
+ by POSIX and should not depend on environment variables like | |
+ "LANGUAGE" or system-dependent information. We allow such programs | |
+ to use gettext(). */ | |
+ if (strcmp (locale, "C") == 0) | |
+ return locale; | |
+ | |
+ /* The highest priority value is the value of the 'LANGUAGE' environment | |
+ variable. */ | |
+ language = getenv ("LANGUAGE"); | |
+ if (language != NULL && language[0] != '\0') | |
+ return language; | |
+#if !defined IN_LIBGLOCALE && !defined _LIBC | |
+ /* The next priority value is the locale name, if not defaulted. */ | |
+ if (locale_defaulted) | |
+ { | |
+ /* The next priority value is the default language preferences list. */ | |
+ language_default = _nl_language_preferences_default (); | |
+ if (language_default != NULL) | |
+ return language_default; | |
+ } | |
+ /* The least priority value is the locale name, if defaulted. */ | |
+#endif | |
+ return locale; | |
} | |
+#if (defined _LIBC || HAVE_ICONV) && !defined IN_LIBGLOCALE | |
+/* Returns the output charset. */ | |
+static const char * | |
+internal_function | |
+get_output_charset (struct binding *domainbinding) | |
+{ | |
+ /* The output charset should normally be determined by the locale. But | |
+ sometimes the locale is not used or not correctly set up, so we provide | |
+ a possibility for the user to override this: the OUTPUT_CHARSET | |
+ environment variable. Moreover, the value specified through | |
+ bind_textdomain_codeset overrides both. */ | |
+ if (domainbinding != NULL && domainbinding->codeset != NULL) | |
+ return domainbinding->codeset; | |
+ else | |
+ { | |
+ /* For speed reasons, we look at the value of OUTPUT_CHARSET only | |
+ once. This is a user variable that is not supposed to change | |
+ during a program run. */ | |
+ static char *output_charset_cache; | |
+ static int output_charset_cached; | |
+ | |
+ if (!output_charset_cached) | |
+ { | |
+ const char *value = getenv ("OUTPUT_CHARSET"); | |
+ | |
+ if (value != NULL && value[0] != '\0') | |
+ { | |
+ size_t len = strlen (value) + 1; | |
+ char *value_copy = (char *) malloc (len); | |
+ | |
+ if (value_copy != NULL) | |
+ memcpy (value_copy, value, len); | |
+ output_charset_cache = value_copy; | |
+ } | |
+ output_charset_cached = 1; | |
+ } | |
+ | |
+ if (output_charset_cache != NULL) | |
+ return output_charset_cache; | |
+ else | |
+ { | |
+# ifdef _LIBC | |
+ return _NL_CURRENT (LC_CTYPE, CODESET); | |
+# else | |
+# if HAVE_ICONV | |
+ return locale_charset (); | |
+# endif | |
+# endif | |
+ } | |
+ } | |
+} | |
+#endif | |
+ | |
/* @@ begin of epilog @@ */ | |
/* We don't want libintl.a to depend on any other library. So we | |
t@@ -1196,9 +1648,7 @@ guess_category_value (category, categoryname) | |
to be defined. */ | |
#if !_LIBC && !HAVE_STPCPY | |
static char * | |
-stpcpy (dest, src) | |
- char *dest; | |
- const char *src; | |
+stpcpy (char *dest, const char *src) | |
{ | |
while ((*dest++ = *src++) != '\0') | |
/* Do nothing. */ ; | |
t@@ -1208,21 +1658,21 @@ stpcpy (dest, src) | |
#if !_LIBC && !HAVE_MEMPCPY | |
static void * | |
-mempcpy (dest, src, n) | |
- void *dest; | |
- const void *src; | |
- size_t n; | |
+mempcpy (void *dest, const void *src, size_t n) | |
{ | |
return (void *) ((char *) memcpy (dest, src, n) + n); | |
} | |
#endif | |
+#if !_LIBC && !HAVE_TSEARCH | |
+# include "tsearch.c" | |
+#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) | |
+libc_freeres_fn (free_mem) | |
{ | |
void *old; | |
t@@ -1252,6 +1702,4 @@ free_mem (void) | |
free (old); | |
} | |
} | |
- | |
-text_set_element (__libc_subfreeres, free_mem); | |
#endif | |
diff --git a/intl/dcngettext.c b/intl/dcngettext.c | |
t@@ -1,19 +1,20 @@ | |
/* Implementation of the dcngettext(3) function. | |
- Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc. | |
+ Copyright (C) 1995-1999, 2000-2003 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) | |
+ This program is free software; you can redistribute it and/or modify it | |
+ under the terms of the GNU Library General Public License as published | |
+ by the Free Software Foundation; either version 2, 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. | |
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
+ Library General Public License for more details. | |
- You should have received a copy of the GNU General Public License | |
- along with this program; if not, write to the Free Software Foundation, | |
- Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |
+ You should have received a copy of the GNU Library General Public | |
+ License along with this program; if not, write to the Free Software | |
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, | |
+ USA. */ | |
#ifdef HAVE_CONFIG_H | |
# include <config.h> | |
t@@ -36,19 +37,16 @@ | |
# define DCNGETTEXT __dcngettext | |
# define DCIGETTEXT __dcigettext | |
#else | |
-# define DCNGETTEXT dcngettext__ | |
-# define DCIGETTEXT dcigettext__ | |
+# define DCNGETTEXT libintl_dcngettext | |
+# define DCIGETTEXT libintl_dcigettext | |
#endif | |
/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY | |
locale. */ | |
char * | |
-DCNGETTEXT (domainname, msgid1, msgid2, n, category) | |
- const char *domainname; | |
- const char *msgid1; | |
- const char *msgid2; | |
- unsigned long int n; | |
- int category; | |
+DCNGETTEXT (const char *domainname, | |
+ const char *msgid1, const char *msgid2, unsigned long int n, | |
+ int category) | |
{ | |
return DCIGETTEXT (domainname, msgid1, msgid2, 1, n, category); | |
} | |
diff --git a/intl/dgettext.c b/intl/dgettext.c | |
t@@ -1,27 +1,29 @@ | |
/* Implementation of the dgettext(3) function. | |
- Copyright (C) 1995-1997, 2000, 2001 Free Software Foundation, Inc. | |
+ Copyright (C) 1995-1997, 2000-2003 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) | |
+ This program is free software; you can redistribute it and/or modify it | |
+ under the terms of the GNU Library General Public License as published | |
+ by the Free Software Foundation; either version 2, 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. | |
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
+ Library General Public License for more details. | |
- You should have received a copy of the GNU General Public License | |
- along with this program; if not, write to the Free Software Foundation, | |
- Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |
+ You should have received a copy of the GNU Library General Public | |
+ License along with this program; if not, write to the Free Software | |
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, | |
+ USA. */ | |
#ifdef HAVE_CONFIG_H | |
# include <config.h> | |
#endif | |
+#include "gettextP.h" | |
+ | |
#include <locale.h> | |
-#include "gettextP.h" | |
#ifdef _LIBC | |
# include <libintl.h> | |
#else | |
t@@ -36,18 +38,16 @@ | |
prefix. So we have to make a difference here. */ | |
#ifdef _LIBC | |
# define DGETTEXT __dgettext | |
-# define DCGETTEXT __dcgettext | |
+# define DCGETTEXT INTUSE(__dcgettext) | |
#else | |
-# define DGETTEXT dgettext__ | |
-# define DCGETTEXT dcgettext__ | |
+# define DGETTEXT libintl_dgettext | |
+# define DCGETTEXT libintl_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; | |
+DGETTEXT (const char *domainname, const char *msgid) | |
{ | |
return DCGETTEXT (domainname, msgid, LC_MESSAGES); | |
} | |
diff --git a/intl/dngettext.c b/intl/dngettext.c | |
t@@ -1,27 +1,29 @@ | |
/* Implementation of the dngettext(3) function. | |
- Copyright (C) 1995-1997, 2000, 2001 Free Software Foundation, Inc. | |
+ Copyright (C) 1995-1997, 2000-2003 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) | |
+ This program is free software; you can redistribute it and/or modify it | |
+ under the terms of the GNU Library General Public License as published | |
+ by the Free Software Foundation; either version 2, 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. | |
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
+ Library General Public License for more details. | |
- You should have received a copy of the GNU General Public License | |
- along with this program; if not, write to the Free Software Foundation, | |
- Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |
+ You should have received a copy of the GNU Library General Public | |
+ License along with this program; if not, write to the Free Software | |
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, | |
+ USA. */ | |
#ifdef HAVE_CONFIG_H | |
# include <config.h> | |
#endif | |
+#include "gettextP.h" | |
+ | |
#include <locale.h> | |
-#include "gettextP.h" | |
#ifdef _LIBC | |
# include <libintl.h> | |
#else | |
t@@ -38,18 +40,15 @@ | |
# define DNGETTEXT __dngettext | |
# define DCNGETTEXT __dcngettext | |
#else | |
-# define DNGETTEXT dngettext__ | |
-# define DCNGETTEXT dcngettext__ | |
+# define DNGETTEXT libintl_dngettext | |
+# define DCNGETTEXT libintl_dcngettext | |
#endif | |
/* Look up MSGID in the DOMAINNAME message catalog of the current | |
LC_MESSAGES locale and skip message according to the plural form. */ | |
char * | |
-DNGETTEXT (domainname, msgid1, msgid2, n) | |
- const char *domainname; | |
- const char *msgid1; | |
- const char *msgid2; | |
- unsigned long int n; | |
+DNGETTEXT (const char *domainname, | |
+ const char *msgid1, const char *msgid2, unsigned long int n) | |
{ | |
return DCNGETTEXT (domainname, msgid1, msgid2, n, LC_MESSAGES); | |
} | |
diff --git a/intl/explodename.c b/intl/explodename.c | |
t@@ -1,19 +1,20 @@ | |
-/* Copyright (C) 1995-1998, 2000, 2001 Free Software Foundation, Inc. | |
+/* Copyright (C) 1995-1998, 2000-2001, 2003, 2005, 2007 Free Software Foundati… | |
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) | |
+ This program is free software; you can redistribute it and/or modify it | |
+ under the terms of the GNU Library General Public License as published | |
+ by the Free Software Foundation; either version 2, 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. | |
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
+ Library General Public License for more details. | |
- You should have received a copy of the GNU General Public License | |
- along with this program; if not, write to the Free Software Foundation, | |
- Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |
+ You should have received a copy of the GNU Library General Public | |
+ License along with this program; if not, write to the Free Software | |
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, | |
+ USA. */ | |
#ifdef HAVE_CONFIG_H | |
# include <config.h> | |
t@@ -36,12 +37,15 @@ | |
/* @@ end of prolog @@ */ | |
-char * | |
-_nl_find_language (name) | |
- const char *name; | |
+/* Split a locale name NAME into a leading language part and all the | |
+ rest. Return a pointer to the first character after the language, | |
+ i.e. to the first byte of the rest. */ | |
+static char *_nl_find_language (const char *name); | |
+ | |
+static char * | |
+_nl_find_language (const char *name) | |
{ | |
- while (name[0] != '\0' && name[0] != '_' && name[0] != '@' | |
- && name[0] != '+' && name[0] != ',') | |
+ while (name[0] != '\0' && name[0] != '_' && name[0] != '@' && name[0] != '.') | |
++name; | |
return (char *) name; | |
t@@ -49,19 +53,11 @@ _nl_find_language (name) | |
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; | |
+_nl_explode_name (char *name, | |
+ const char **language, const char **modifier, | |
+ const char **territory, const char **codeset, | |
+ const char **normalized_codeset) | |
{ | |
- enum { undecided, xpg, cen } syntax; | |
char *cp; | |
int mask; | |
t@@ -69,15 +65,10 @@ _nl_explode_name (name, language, modifier, territory, cod… | |
*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. */ | |
+ look for the language. Termination symbols are `_', '.', and `@'. */ | |
mask = 0; | |
- syntax = undecided; | |
*language = cp = name; | |
cp = _nl_find_language (*language); | |
t@@ -85,22 +76,23 @@ _nl_explode_name (name, language, modifier, territory, cod… | |
/* 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] == '_') | |
+ else | |
{ | |
- /* Next is the territory. */ | |
- cp[0] = '\0'; | |
- *territory = ++cp; | |
+ 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; | |
+ while (cp[0] != '\0' && cp[0] != '.' && cp[0] != '@') | |
+ ++cp; | |
- mask |= TERRITORY; | |
+ mask |= XPG_TERRITORY; | |
+ } | |
if (cp[0] == '.') | |
{ | |
/* Next is the codeset. */ | |
- syntax = xpg; | |
cp[0] = '\0'; | |
*codeset = ++cp; | |
t@@ -113,7 +105,9 @@ _nl_explode_name (name, language, modifier, territory, cod… | |
{ | |
*normalized_codeset = _nl_normalize_codeset (*codeset, | |
cp - *codeset); | |
- if (strcmp (*codeset, *normalized_codeset) == 0) | |
+ if (*normalized_codeset == NULL) | |
+ return -1; | |
+ else if (strcmp (*codeset, *normalized_codeset) == 0) | |
free ((char *) *normalized_codeset); | |
else | |
mask |= XPG_NORM_CODESET; | |
t@@ -121,71 +115,21 @@ _nl_explode_name (name, language, modifier, territory, c… | |
} | |
} | |
- if (cp[0] == '@' || (syntax != xpg && cp[0] == '+')) | |
+ if (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; | |
- } | |
+ if (cp[0] != '\0') | |
+ mask |= XPG_MODIFIER; | |
} | |
- /* 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 (*territory != NULL && (*territory)[0] == '\0') | |
+ mask &= ~XPG_TERRITORY; | |
- if (*modifier != NULL && (*modifier)[0] == '\0') | |
- mask &= ~XPG_MODIFIER; | |
- } | |
+ if (*codeset != NULL && (*codeset)[0] == '\0') | |
+ mask &= ~XPG_CODESET; | |
return mask; | |
} | |
diff --git a/intl/finddomain.c b/intl/finddomain.c | |
t@@ -1,20 +1,21 @@ | |
/* Handle list of needed message catalogs | |
- Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc. | |
+ Copyright (C) 1995-1999, 2000-2001, 2003-2007 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) | |
+ This program is free software; you can redistribute it and/or modify it | |
+ under the terms of the GNU Library General Public License as published | |
+ by the Free Software Foundation; either version 2, 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. | |
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
+ Library General Public License for more details. | |
- You should have received a copy of the GNU General Public License | |
- along with this program; if not, write to the Free Software Foundation, | |
- Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |
+ You should have received a copy of the GNU Library General Public | |
+ License along with this program; if not, write to the Free Software | |
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, | |
+ USA. */ | |
#ifdef HAVE_CONFIG_H | |
# include <config.h> | |
t@@ -36,6 +37,17 @@ | |
# include "libgnuintl.h" | |
#endif | |
+/* Handle multi-threaded applications. */ | |
+#ifdef _LIBC | |
+# include <bits/libc-lock.h> | |
+# define gl_rwlock_define_initialized __libc_rwlock_define_initialized | |
+# define gl_rwlock_rdlock __libc_rwlock_rdlock | |
+# define gl_rwlock_wrlock __libc_rwlock_wrlock | |
+# define gl_rwlock_unlock __libc_rwlock_unlock | |
+#else | |
+# include "lock.h" | |
+#endif | |
+ | |
/* @@ end of prolog @@ */ | |
/* List of already loaded domains. */ | |
static struct loaded_l10nfile *_nl_loaded_domains; | |
t@@ -46,11 +58,8 @@ static struct loaded_l10nfile *_nl_loaded_domains; | |
established bindings. */ | |
struct loaded_l10nfile * | |
internal_function | |
-_nl_find_domain (dirname, locale, domainname, domainbinding) | |
- const char *dirname; | |
- char *locale; | |
- const char *domainname; | |
- struct binding *domainbinding; | |
+_nl_find_domain (const char *dirname, char *locale, | |
+ const char *domainname, struct binding *domainbinding) | |
{ | |
struct loaded_l10nfile *retval; | |
const char *language; | |
t@@ -58,44 +67,41 @@ _nl_find_domain (dirname, locale, domainname, domainbindin… | |
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]] | |
+ language[_territory][.codeset][@modifier] | |
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 | |
+ (1) codeset | |
+ (2) normalized codeset | |
+ (3) territory | |
+ (4) modifier | |
*/ | |
+ /* We need to protect modifying the _NL_LOADED_DOMAINS data. */ | |
+ gl_rwlock_define_initialized (static, lock); | |
+ gl_rwlock_rdlock (lock); | |
+ | |
/* 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); | |
+ NULL, NULL, domainname, 0); | |
+ | |
+ gl_rwlock_unlock (lock); | |
+ | |
if (retval != NULL) | |
{ | |
/* We know something about this locale. */ | |
int cnt; | |
- if (retval->decided == 0) | |
+ if (retval->decided <= 0) | |
_nl_load_domain (retval, domainbinding); | |
if (retval->data != NULL) | |
t@@ -103,13 +109,14 @@ _nl_find_domain (dirname, locale, domainname, domainbind… | |
for (cnt = 0; retval->successor[cnt] != NULL; ++cnt) | |
{ | |
- if (retval->successor[cnt]->decided == 0) | |
+ if (retval->successor[cnt]->decided <= 0) | |
_nl_load_domain (retval->successor[cnt], domainbinding); | |
if (retval->successor[cnt]->data != NULL) | |
break; | |
} | |
- return cnt >= 0 ? retval : NULL; | |
+ | |
+ return retval; | |
/* NOTREACHED */ | |
} | |
t@@ -134,30 +141,37 @@ _nl_find_domain (dirname, locale, domainname, domainbind… | |
} | |
/* 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. */ | |
+ look for the language. Termination symbols are `_', '.', and `@'. */ | |
mask = _nl_explode_name (locale, &language, &modifier, &territory, | |
- &codeset, &normalized_codeset, &special, | |
- &sponsor, &revision); | |
+ &codeset, &normalized_codeset); | |
+ if (mask == -1) | |
+ /* This means we are out of core. */ | |
+ return NULL; | |
+ | |
+ /* We need to protect modifying the _NL_LOADED_DOMAINS data. */ | |
+ gl_rwlock_wrlock (lock); | |
/* 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); | |
+ codeset, normalized_codeset, modifier, | |
+ domainname, 1); | |
+ | |
+ gl_rwlock_unlock (lock); | |
+ | |
if (retval == NULL) | |
/* This means we are out of core. */ | |
- return NULL; | |
+ goto out; | |
- if (retval->decided == 0) | |
+ if (retval->decided <= 0) | |
_nl_load_domain (retval, domainbinding); | |
if (retval->data == NULL) | |
{ | |
int cnt; | |
for (cnt = 0; retval->successor[cnt] != NULL; ++cnt) | |
{ | |
- if (retval->successor[cnt]->decided == 0) | |
+ if (retval->successor[cnt]->decided <= 0) | |
_nl_load_domain (retval->successor[cnt], domainbinding); | |
if (retval->successor[cnt]->data != NULL) | |
break; | |
t@@ -168,6 +182,7 @@ _nl_find_domain (dirname, locale, domainname, domainbindin… | |
if (alias_value != NULL) | |
free (locale); | |
+out: | |
/* The space for normalized_codeset is dynamically allocated. Free it. */ | |
if (mask & XPG_NORM_CODESET) | |
free ((void *) normalized_codeset); | |
t@@ -177,8 +192,10 @@ _nl_find_domain (dirname, locale, domainname, domainbindi… | |
#ifdef _LIBC | |
-static void __attribute__ ((unused)) | |
-free_mem (void) | |
+/* This is called from iconv/gconv_db.c's free_mem, as locales must | |
+ be freed before freeing gconv steps arrays. */ | |
+void __libc_freeres_fn_section | |
+_nl_finddomain_subfreeres () | |
{ | |
struct loaded_l10nfile *runp = _nl_loaded_domains; | |
t@@ -192,6 +209,4 @@ free_mem (void) | |
free (here); | |
} | |
} | |
- | |
-text_set_element (__libc_subfreeres, free_mem); | |
#endif | |
diff --git a/intl/gettext.c b/intl/gettext.c | |
t@@ -1,19 +1,20 @@ | |
/* Implementation of gettext(3) function. | |
- Copyright (C) 1995, 1997, 2000, 2001 Free Software Foundation, Inc. | |
+ Copyright (C) 1995, 1997, 2000-2003 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) | |
+ This program is free software; you can redistribute it and/or modify it | |
+ under the terms of the GNU Library General Public License as published | |
+ by the Free Software Foundation; either version 2, 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. | |
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
+ Library General Public License for more details. | |
- You should have received a copy of the GNU General Public License | |
- along with this program; if not, write to the Free Software Foundation, | |
- Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |
+ You should have received a copy of the GNU Library General Public | |
+ License along with this program; if not, write to the Free Software | |
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, | |
+ USA. */ | |
#ifdef HAVE_CONFIG_H | |
# include <config.h> | |
t@@ -41,18 +42,17 @@ | |
prefix. So we have to make a difference here. */ | |
#ifdef _LIBC | |
# define GETTEXT __gettext | |
-# define DCGETTEXT __dcgettext | |
+# define DCGETTEXT INTUSE(__dcgettext) | |
#else | |
-# define GETTEXT gettext__ | |
-# define DCGETTEXT dcgettext__ | |
+# define GETTEXT libintl_gettext | |
+# define DCGETTEXT libintl_dcgettext | |
#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; | |
+GETTEXT (const char *msgid) | |
{ | |
return DCGETTEXT (NULL, msgid, LC_MESSAGES); | |
} | |
diff --git a/intl/gettextP.h b/intl/gettextP.h | |
t@@ -1,20 +1,21 @@ | |
/* Header describing internals of libintl library. | |
- Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc. | |
+ Copyright (C) 1995-1999, 2000-2007, 2009-2010 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) | |
+ This program is free software; you can redistribute it and/or modify it | |
+ under the terms of the GNU Library General Public License as published | |
+ by the Free Software Foundation; either version 2, 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. | |
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
+ Library General Public License for more details. | |
- You should have received a copy of the GNU General Public License | |
- along with this program; if not, write to the Free Software Foundation, | |
- Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |
+ You should have received a copy of the GNU Library General Public | |
+ License along with this program; if not, write to the Free Software | |
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, | |
+ USA. */ | |
#ifndef _GETTEXTP_H | |
#define _GETTEXTP_H | |
t@@ -29,24 +30,74 @@ | |
# endif | |
#endif | |
-#include "loadinfo.h" | |
- | |
-#include "gettext.h" /* Get nls_uint32. */ | |
- | |
-/* @@ end of prolog @@ */ | |
+/* Handle multi-threaded applications. */ | |
+#ifdef _LIBC | |
+# include <bits/libc-lock.h> | |
+# define gl_rwlock_define __libc_rwlock_define | |
+#else | |
+# include "lock.h" | |
+#endif | |
-#ifndef PARAMS | |
-# if __STDC__ | |
-# define PARAMS(args) args | |
+#ifdef _LIBC | |
+extern char *__gettext (const char *__msgid); | |
+extern char *__dgettext (const char *__domainname, const char *__msgid); | |
+extern char *__dcgettext (const char *__domainname, const char *__msgid, | |
+ int __category); | |
+extern char *__ngettext (const char *__msgid1, const char *__msgid2, | |
+ unsigned long int __n); | |
+extern char *__dngettext (const char *__domainname, | |
+ const char *__msgid1, const char *__msgid2, | |
+ unsigned long int n); | |
+extern char *__dcngettext (const char *__domainname, | |
+ const char *__msgid1, const char *__msgid2, | |
+ unsigned long int __n, int __category); | |
+extern char *__dcigettext (const char *__domainname, | |
+ const char *__msgid1, const char *__msgid2, | |
+ int __plural, unsigned long int __n, | |
+ int __category); | |
+extern char *__textdomain (const char *__domainname); | |
+extern char *__bindtextdomain (const char *__domainname, | |
+ const char *__dirname); | |
+extern char *__bind_textdomain_codeset (const char *__domainname, | |
+ const char *__codeset); | |
+extern void _nl_finddomain_subfreeres (void) attribute_hidden; | |
+extern void _nl_unload_domain (struct loaded_domain *__domain) | |
+ internal_function attribute_hidden; | |
+#else | |
+/* Declare the exported libintl_* functions, in a way that allows us to | |
+ call them under their real name. */ | |
+# undef _INTL_REDIRECT_INLINE | |
+# undef _INTL_REDIRECT_MACROS | |
+# define _INTL_REDIRECT_MACROS | |
+# include "libgnuintl.h" | |
+# ifdef IN_LIBGLOCALE | |
+extern char *gl_dcigettext (const char *__domainname, | |
+ const char *__msgid1, const char *__msgid2, | |
+ int __plural, unsigned long int __n, | |
+ int __category, | |
+ const char *__localename, const char *__encoding); | |
# else | |
-# define PARAMS(args) () | |
+extern char *libintl_dcigettext (const char *__domainname, | |
+ const char *__msgid1, const char *__msgid2, | |
+ int __plural, unsigned long int __n, | |
+ int __category); | |
# endif | |
#endif | |
+#include "loadinfo.h" | |
+ | |
+#include "gmo.h" /* Get nls_uint32. */ | |
+ | |
+/* @@ end of prolog @@ */ | |
+ | |
#ifndef internal_function | |
# define internal_function | |
#endif | |
+#ifndef attribute_hidden | |
+# define attribute_hidden | |
+#endif | |
+ | |
/* Tell the compiler when a conditional or integer expression is | |
almost always true or almost always false. */ | |
#ifndef HAVE_BUILTIN_EXPECT | |
t@@ -63,82 +114,88 @@ | |
# define SWAP(i) bswap_32 (i) | |
#else | |
static inline nls_uint32 | |
+# ifdef __cplusplus | |
+SWAP (nls_uint32 i) | |
+# else | |
SWAP (i) | |
nls_uint32 i; | |
+# endif | |
{ | |
return (i << 24) | ((i & 0xff00) << 8) | ((i >> 8) & 0xff00) | (i >> 24); | |
} | |
#endif | |
-/* This is the representation of the expressions to determine the | |
- plural form. */ | |
-struct expression | |
+/* In-memory representation of system dependent string. */ | |
+struct sysdep_string_desc | |
{ | |
- int nargs; /* Number of arguments. */ | |
- enum operator | |
- { | |
- /* Without arguments: */ | |
- var, /* The variable "n". */ | |
- num, /* Decimal number. */ | |
- /* Unary operators: */ | |
- lnot, /* Logical NOT. */ | |
- /* Binary operators: */ | |
- mult, /* Multiplication. */ | |
- divide, /* Division. */ | |
- module, /* Module operation. */ | |
- plus, /* Addition. */ | |
- minus, /* Subtraction. */ | |
- less_than, /* Comparison. */ | |
- greater_than, /* Comparison. */ | |
- less_or_equal, /* Comparison. */ | |
- greater_or_equal, /* Comparison. */ | |
- equal, /* Comparision for equality. */ | |
- not_equal, /* Comparision for inequality. */ | |
- land, /* Logical AND. */ | |
- lor, /* Logical OR. */ | |
- /* Ternary operators: */ | |
- qmop /* Question mark operator. */ | |
- } operation; | |
- union | |
- { | |
- unsigned long int num; /* Number value for `num'. */ | |
- struct expression *args[3]; /* Up to three arguments. */ | |
- } val; | |
+ /* Length of addressed string, including the trailing NUL. */ | |
+ size_t length; | |
+ /* Pointer to addressed string. */ | |
+ const char *pointer; | |
}; | |
-/* This is the data structure to pass information to the parser and get | |
- the result in a thread-safe way. */ | |
-struct parse_args | |
+/* Cache of translated strings after charset conversion. | |
+ Note: The strings are converted to the target encoding only on an as-needed | |
+ basis. */ | |
+struct converted_domain | |
{ | |
- const char *cp; | |
- struct expression *res; | |
+ /* The target encoding name. */ | |
+ const char *encoding; | |
+ /* The descriptor for conversion from the message catalog's encoding to | |
+ this target encoding. */ | |
+#ifdef _LIBC | |
+ __gconv_t conv; | |
+#else | |
+# if HAVE_ICONV | |
+ iconv_t conv; | |
+# endif | |
+#endif | |
+ /* The table of translated strings after charset conversion. */ | |
+ char **conv_tab; | |
}; | |
- | |
/* The representation of an opened message catalog. */ | |
struct loaded_domain | |
{ | |
+ /* Pointer to memory containing the .mo file. */ | |
const char *data; | |
+ /* 1 if the memory is mmap()ed, 0 if the memory is malloc()ed. */ | |
int use_mmap; | |
+ /* Size of mmap()ed memory. */ | |
size_t mmap_size; | |
+ /* 1 if the .mo file uses a different endianness than this machine. */ | |
int must_swap; | |
+ /* Pointer to additional malloc()ed memory. */ | |
+ void *malloced; | |
+ | |
+ /* Number of static strings pairs. */ | |
nls_uint32 nstrings; | |
- struct string_desc *orig_tab; | |
- struct string_desc *trans_tab; | |
+ /* Pointer to descriptors of original strings in the file. */ | |
+ const struct string_desc *orig_tab; | |
+ /* Pointer to descriptors of translated strings in the file. */ | |
+ const struct string_desc *trans_tab; | |
+ | |
+ /* Number of system dependent strings pairs. */ | |
+ nls_uint32 n_sysdep_strings; | |
+ /* Pointer to descriptors of original sysdep strings. */ | |
+ const struct sysdep_string_desc *orig_sysdep_tab; | |
+ /* Pointer to descriptors of translated sysdep strings. */ | |
+ const struct sysdep_string_desc *trans_sysdep_tab; | |
+ | |
+ /* Size of hash table. */ | |
nls_uint32 hash_size; | |
- nls_uint32 *hash_tab; | |
- int codeset_cntr; | |
-#ifdef _LIBC | |
- __gconv_t conv; | |
-#else | |
-# if HAVE_ICONV | |
- iconv_t conv; | |
-# endif | |
-#endif | |
- char **conv_tab; | |
+ /* Pointer to hash table. */ | |
+ const nls_uint32 *hash_tab; | |
+ /* 1 if the hash table uses a different endianness than this machine. */ | |
+ int must_swap_hash_tab; | |
- struct expression *plural; | |
+ /* Cache of charset conversions of the translated strings. */ | |
+ struct converted_domain *conversions; | |
+ size_t nconversions; | |
+ gl_rwlock_define (, conversions_lock) | |
+ | |
+ const struct expression *plural; | |
unsigned long int nplurals; | |
}; | |
t@@ -156,7 +213,6 @@ struct binding | |
{ | |
struct binding *next; | |
char *dirname; | |
- int codeset_cntr; /* Incremented each time codeset changes. */ | |
char *codeset; | |
char domainname[ZERO]; | |
}; | |
t@@ -164,88 +220,92 @@ struct binding | |
/* A counter which is incremented each time some previous translations | |
become invalid. | |
This variable is part of the external ABI of the GNU libintl. */ | |
-extern int _nl_msg_cat_cntr; | |
+#ifdef IN_LIBGLOCALE | |
+# include <glocale/config.h> | |
+extern LIBGLOCALE_DLL_EXPORTED int _nl_msg_cat_cntr; | |
+#else | |
+extern LIBINTL_DLL_EXPORTED int _nl_msg_cat_cntr; | |
+#endif | |
-struct loaded_l10nfile *_nl_find_domain PARAMS ((const char *__dirname, | |
- char *__locale, | |
- const char *__domainname, | |
- struct binding *__domainbinding)) | |
- internal_function; | |
-void _nl_load_domain PARAMS ((struct loaded_l10nfile *__domain, | |
- struct binding *__domainbinding)) | |
+#ifndef _LIBC | |
+extern const char *_nl_language_preferences_default (void); | |
+# define gl_locale_name_canonicalize _nl_locale_name_canonicalize | |
+extern void _nl_locale_name_canonicalize (char *name); | |
+# define gl_locale_name_from_win32_LANGID _nl_locale_name_from_win32_LANGID | |
+/* extern const char *_nl_locale_name_from_win32_LANGID (LANGID langid); */ | |
+# define gl_locale_name_from_win32_LCID _nl_locale_name_from_win32_LCID | |
+/* extern const char *_nl_locale_name_from_win32_LCID (LCID lcid); */ | |
+# define gl_locale_name_thread_unsafe _nl_locale_name_thread_unsafe | |
+extern const char *_nl_locale_name_thread_unsafe (int category, | |
+ const char *categoryname); | |
+# define gl_locale_name_thread _nl_locale_name_thread | |
+/* extern const char *_nl_locale_name_thread (int category, | |
+ const char *categoryname); */ | |
+# define gl_locale_name_posix _nl_locale_name_posix | |
+extern const char *_nl_locale_name_posix (int category, | |
+ const char *categoryname); | |
+# define gl_locale_name_environ _nl_locale_name_environ | |
+extern const char *_nl_locale_name_environ (int category, | |
+ const char *categoryname); | |
+# define gl_locale_name_default _nl_locale_name_default | |
+extern const char *_nl_locale_name_default (void); | |
+# define gl_locale_name _nl_locale_name | |
+/* extern const char *_nl_locale_name (int category, | |
+ const char *categoryname); */ | |
+#endif | |
+ | |
+struct loaded_l10nfile *_nl_find_domain (const char *__dirname, char *__locale, | |
+ const char *__domainname, | |
+ struct binding *__domainbinding) | |
internal_function; | |
-void _nl_unload_domain PARAMS ((struct loaded_domain *__domain)) | |
+void _nl_load_domain (struct loaded_l10nfile *__domain, | |
+ struct binding *__domainbinding) | |
internal_function; | |
-const char *_nl_init_domain_conv PARAMS ((struct loaded_l10nfile *__domain_fil… | |
- struct loaded_domain *__domain, | |
- struct binding *__domainbinding)) | |
+ | |
+#ifdef IN_LIBGLOCALE | |
+char *_nl_find_msg (struct loaded_l10nfile *domain_file, | |
+ struct binding *domainbinding, const char *encoding, | |
+ const char *msgid, | |
+ size_t *lengthp) | |
internal_function; | |
-void _nl_free_domain_conv PARAMS ((struct loaded_domain *__domain)) | |
+#else | |
+char *_nl_find_msg (struct loaded_l10nfile *domain_file, | |
+ struct binding *domainbinding, const char *msgid, | |
+ int convert, size_t *lengthp) | |
internal_function; | |
+#endif | |
-char *_nl_find_msg PARAMS ((struct loaded_l10nfile *domain_file, | |
- struct binding *domainbinding, | |
- const char *msgid, size_t *lengthp)) | |
- internal_function; | |
+/* The internal variables in the standalone libintl.a must have different | |
+ names than the internal variables in GNU libc, otherwise programs | |
+ using libintl.a cannot be linked statically. */ | |
+#if !defined _LIBC | |
+# define _nl_default_dirname libintl_nl_default_dirname | |
+# define _nl_domain_bindings libintl_nl_domain_bindings | |
+#endif | |
+/* Contains the default location of the message catalogs. */ | |
+extern const char _nl_default_dirname[]; | |
#ifdef _LIBC | |
-extern char *__gettext PARAMS ((const char *__msgid)); | |
-extern char *__dgettext PARAMS ((const char *__domainname, | |
- const char *__msgid)); | |
-extern char *__dcgettext PARAMS ((const char *__domainname, | |
- const char *__msgid, int __category)); | |
-extern char *__ngettext PARAMS ((const char *__msgid1, const char *__msgid2, | |
- unsigned long int __n)); | |
-extern char *__dngettext PARAMS ((const char *__domainname, | |
- const char *__msgid1, const char *__msgid2, | |
- unsigned long int n)); | |
-extern char *__dcngettext PARAMS ((const char *__domainname, | |
- const char *__msgid1, const char *__msgid2, | |
- unsigned long int __n, int __category)); | |
-extern char *__dcigettext PARAMS ((const char *__domainname, | |
- const char *__msgid1, const char *__msgid2, | |
- int __plural, unsigned long int __n, | |
- int __category)); | |
-extern char *__textdomain PARAMS ((const char *__domainname)); | |
-extern char *__bindtextdomain PARAMS ((const char *__domainname, | |
- const char *__dirname)); | |
-extern char *__bind_textdomain_codeset PARAMS ((const char *__domainname, | |
- const char *__codeset)); | |
-#else | |
-extern char *gettext__ PARAMS ((const char *__msgid)); | |
-extern char *dgettext__ PARAMS ((const char *__domainname, | |
- const char *__msgid)); | |
-extern char *dcgettext__ PARAMS ((const char *__domainname, | |
- const char *__msgid, int __category)); | |
-extern char *ngettext__ PARAMS ((const char *__msgid1, const char *__msgid2, | |
- unsigned long int __n)); | |
-extern char *dngettext__ PARAMS ((const char *__domainname, | |
- const char *__msgid1, const char *__msgid2, | |
- unsigned long int __n)); | |
-extern char *dcngettext__ PARAMS ((const char *__domainname, | |
- const char *__msgid1, const char *__msgid2, | |
- unsigned long int __n, int __category)); | |
-extern char *dcigettext__ PARAMS ((const char *__domainname, | |
- const char *__msgid1, const char *__msgid2, | |
- int __plural, unsigned long int __n, | |
- int __category)); | |
-extern char *textdomain__ PARAMS ((const char *__domainname)); | |
-extern char *bindtextdomain__ PARAMS ((const char *__domainname, | |
- const char *__dirname)); | |
-extern char *bind_textdomain_codeset__ PARAMS ((const char *__domainname, | |
- const char *__codeset)); | |
+libc_hidden_proto (_nl_default_dirname) | |
#endif | |
-#ifdef _LIBC | |
-extern void __gettext_free_exp PARAMS ((struct expression *exp)) | |
- internal_function; | |
-extern int __gettextparse PARAMS ((void *arg)); | |
-#else | |
-extern void gettext_free_exp__ PARAMS ((struct expression *exp)) | |
- internal_function; | |
-extern int gettextparse__ PARAMS ((void *arg)); | |
+/* List with bindings of specific domains. */ | |
+extern struct binding *_nl_domain_bindings; | |
+ | |
+/* The internal variables in the standalone libintl.a must have different | |
+ names than the internal variables in GNU libc, otherwise programs | |
+ using libintl.a cannot be linked statically. */ | |
+#if !defined _LIBC | |
+# define _nl_default_default_domain libintl_nl_default_default_domain | |
+# define _nl_current_default_domain libintl_nl_current_default_domain | |
#endif | |
+/* Name of the default text domain. */ | |
+extern const char _nl_default_default_domain[] attribute_hidden; | |
+ | |
+/* Default text domain in which entries for gettext(3) are to be found. */ | |
+extern const char *_nl_current_default_domain attribute_hidden; | |
+ | |
/* @@ begin of epilog @@ */ | |
#endif /* gettextP.h */ | |
diff --git a/intl/hash-string.h b/intl/hash-string.h | |
t@@ -1,58 +1,36 @@ | |
/* Description of GNU message catalog format: string hashing function. | |
- Copyright (C) 1995, 1997, 1998, 2000, 2001 Free Software Foundation, Inc. | |
+ Copyright (C) 1995, 1997-1998, 2000-2003, 2005 Free Software Foundation, In… | |
- 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) | |
+ This program is free software; you can redistribute it and/or modify it | |
+ under the terms of the GNU Library General Public License as published | |
+ by the Free Software Foundation; either version 2, 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. | |
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
+ Library General Public License for more details. | |
- You should have received a copy of the GNU General Public License | |
- along with this program; if not, write to the Free Software Foundation, | |
- Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |
+ You should have received a copy of the GNU Library General Public | |
+ License along with this program; if not, write to the Free Software | |
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, | |
+ 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 | |
+#ifndef _LIBC | |
+# ifdef IN_LIBINTL | |
+# define __hash_string libintl_hash_string | |
+# else | |
+# define __hash_string hash_string | |
+# endif | |
+#endif | |
+ | |
/* 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 int hash_string PARAMS ((const char *__str_param)); | |
- | |
-static inline unsigned long int | |
-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 int) *str++; | |
- g = hval & ((unsigned long int) 0xf << (HASHWORDBITS - 4)); | |
- if (g != 0) | |
- { | |
- hval ^= g >> (HASHWORDBITS - 8); | |
- hval ^= g; | |
- } | |
- } | |
- return hval; | |
-} | |
+extern unsigned long int __hash_string (const char *str_param); | |
diff --git a/intl/intl-compat.c b/intl/intl-compat.c | |
t@@ -1,71 +1,38 @@ | |
/* intl-compat.c - Stub functions to call gettext functions from GNU gettext | |
Library. | |
- Copyright (C) 1995, 2000, 2001 Software Foundation, Inc. | |
+ Copyright (C) 1995, 2000-2003, 2005 Software Foundation, Inc. | |
-This program is free software; you can redistribute it and/or modify | |
-it under the terms of the GNU General Public License as published by | |
-the Free Software Foundation; either version 2, or (at your option) | |
-any later version. | |
+ This program is free software; you can redistribute it and/or modify it | |
+ under the terms of the GNU Library General Public License as published | |
+ by the Free Software Foundation; either version 2, or (at your option) | |
+ any later version. | |
-This program is distributed in the hope that it will be useful, | |
-but WITHOUT ANY WARRANTY; without even the implied warranty of | |
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
-GNU General Public License for more details. | |
+ This program is distributed in the hope that it will be useful, | |
+ but WITHOUT ANY WARRANTY; without even the implied warranty of | |
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
+ Library General Public License for more details. | |
-You should have received a copy of the GNU General Public License | |
-along with this program; if not, write to the Free Software | |
-Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |
+ You should have received a copy of the GNU Library General Public | |
+ License along with this program; if not, write to the Free Software | |
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, | |
+ USA. */ | |
#ifdef HAVE_CONFIG_H | |
# include <config.h> | |
#endif | |
-#include "libgnuintl.h" | |
#include "gettextP.h" | |
/* @@ end of prolog @@ */ | |
-/* This file redirects the gettext functions (without prefix or suffix) to | |
- those defined in the included GNU gettext library (with "__" suffix). | |
- It is compiled into libintl when the included GNU gettext library is | |
- configured --with-included-gettext. | |
- | |
- This redirection works also in the case that the system C library or | |
- the system libintl library contain gettext/textdomain/... functions. | |
- If it didn't, we would need to add preprocessor level redirections to | |
- libgnuintl.h of the following form: | |
- | |
-# define gettext gettext__ | |
-# define dgettext dgettext__ | |
-# define dcgettext dcgettext__ | |
-# define ngettext ngettext__ | |
-# define dngettext dngettext__ | |
-# define dcngettext dcngettext__ | |
-# define textdomain textdomain__ | |
-# define bindtextdomain bindtextdomain__ | |
-# define bind_textdomain_codeset bind_textdomain_codeset__ | |
- | |
- How does this redirection work? There are two cases. | |
- A. When libintl.a is linked into an executable, it works because | |
- functions defined in the executable always override functions in | |
- the shared libraries. | |
- B. When libintl.so is used, it works because | |
- 1. those systems defining gettext/textdomain/... in the C library | |
- (namely, Solaris 2.4 and newer, and GNU libc 2.0 and newer) are | |
- ELF systems and define these symbols as weak, thus explicitly | |
- letting other shared libraries override it. | |
- 2. those systems defining gettext/textdomain/... in a standalone | |
- libintl.so library (namely, Solaris 2.3 and newer) have this | |
- shared library in /usr/lib, and the linker will search /usr/lib | |
- *after* the directory where the GNU gettext library is installed. | |
- | |
- A third case, namely when libintl.a is linked into a shared library | |
- whose name is not libintl.so, is not supported. In this case, on | |
- Solaris, when -lintl precedes the linker option for the shared library | |
- containing GNU gettext, the system's gettext would indeed override | |
- the GNU gettext. Anyone doing this kind of stuff must be clever enough | |
- to 1. compile libintl.a with -fPIC, 2. remove -lintl from his linker | |
- command line. */ | |
+/* This file redirects the gettext functions (without prefix) to those | |
+ defined in the included GNU libintl library (with "libintl_" prefix). | |
+ It is compiled into libintl in order to make the AM_GNU_GETTEXT test | |
+ of gettext <= 0.11.2 work with the libintl library >= 0.11.3 which | |
+ has the redirections primarily in the <libintl.h> include file. | |
+ It is also compiled into libgnuintl so that libgnuintl.so can be used | |
+ as LD_PRELOADable library on glibc systems, to provide the extra | |
+ features that the functions in the libc don't have (namely, logging). */ | |
#undef gettext | |
t@@ -79,87 +46,88 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA … | |
#undef bind_textdomain_codeset | |
+/* When building a DLL, we must export some functions. Note that because | |
+ the functions are only defined for binary backward compatibility, we | |
+ don't need to use __declspec(dllimport) in any case. */ | |
+#if HAVE_VISIBILITY && BUILDING_DLL | |
+# define DLL_EXPORTED __attribute__((__visibility__("default"))) | |
+#elif defined _MSC_VER && BUILDING_DLL | |
+# define DLL_EXPORTED __declspec(dllexport) | |
+#else | |
+# define DLL_EXPORTED | |
+#endif | |
+ | |
+ | |
+DLL_EXPORTED | |
char * | |
-gettext (msgid) | |
- const char *msgid; | |
+gettext (const char *msgid) | |
{ | |
- return gettext__ (msgid); | |
+ return libintl_gettext (msgid); | |
} | |
+DLL_EXPORTED | |
char * | |
-dgettext (domainname, msgid) | |
- const char *domainname; | |
- const char *msgid; | |
+dgettext (const char *domainname, const char *msgid) | |
{ | |
- return dgettext__ (domainname, msgid); | |
+ return libintl_dgettext (domainname, msgid); | |
} | |
+DLL_EXPORTED | |
char * | |
-dcgettext (domainname, msgid, category) | |
- const char *domainname; | |
- const char *msgid; | |
- int category; | |
+dcgettext (const char *domainname, const char *msgid, int category) | |
{ | |
- return dcgettext__ (domainname, msgid, category); | |
+ return libintl_dcgettext (domainname, msgid, category); | |
} | |
+DLL_EXPORTED | |
char * | |
-ngettext (msgid1, msgid2, n) | |
- const char *msgid1; | |
- const char *msgid2; | |
- unsigned long int n; | |
+ngettext (const char *msgid1, const char *msgid2, unsigned long int n) | |
{ | |
- return ngettext__ (msgid1, msgid2, n); | |
+ return libintl_ngettext (msgid1, msgid2, n); | |
} | |
+DLL_EXPORTED | |
char * | |
-dngettext (domainname, msgid1, msgid2, n) | |
- const char *domainname; | |
- const char *msgid1; | |
- const char *msgid2; | |
- unsigned long int n; | |
+dngettext (const char *domainname, | |
+ const char *msgid1, const char *msgid2, unsigned long int n) | |
{ | |
- return dngettext__ (domainname, msgid1, msgid2, n); | |
+ return libintl_dngettext (domainname, msgid1, msgid2, n); | |
} | |
+DLL_EXPORTED | |
char * | |
-dcngettext (domainname, msgid1, msgid2, n, category) | |
- const char *domainname; | |
- const char *msgid1; | |
- const char *msgid2; | |
- unsigned long int n; | |
- int category; | |
+dcngettext (const char *domainname, | |
+ const char *msgid1, const char *msgid2, unsigned long int n, | |
+ int category) | |
{ | |
- return dcngettext__ (domainname, msgid1, msgid2, n, category); | |
+ return libintl_dcngettext (domainname, msgid1, msgid2, n, category); | |
} | |
+DLL_EXPORTED | |
char * | |
-textdomain (domainname) | |
- const char *domainname; | |
+textdomain (const char *domainname) | |
{ | |
- return textdomain__ (domainname); | |
+ return libintl_textdomain (domainname); | |
} | |
+DLL_EXPORTED | |
char * | |
-bindtextdomain (domainname, dirname) | |
- const char *domainname; | |
- const char *dirname; | |
+bindtextdomain (const char *domainname, const char *dirname) | |
{ | |
- return bindtextdomain__ (domainname, dirname); | |
+ return libintl_bindtextdomain (domainname, dirname); | |
} | |
+DLL_EXPORTED | |
char * | |
-bind_textdomain_codeset (domainname, codeset) | |
- const char *domainname; | |
- const char *codeset; | |
+bind_textdomain_codeset (const char *domainname, const char *codeset) | |
{ | |
- return bind_textdomain_codeset__ (domainname, codeset); | |
+ return libintl_bind_textdomain_codeset (domainname, codeset); | |
} | |
diff --git a/intl/l10nflist.c b/intl/l10nflist.c | |
t@@ -1,19 +1,20 @@ | |
-/* Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc. | |
+/* Copyright (C) 1995-1999, 2000-2007 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) | |
+ This program is free software; you can redistribute it and/or modify it | |
+ under the terms of the GNU Library General Public License as published | |
+ by the Free Software Foundation; either version 2, 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. | |
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
+ Library General Public License for more details. | |
- You should have received a copy of the GNU General Public License | |
- along with this program; if not, write to the Free Software Foundation, | |
- Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |
+ You should have received a copy of the GNU Library General Public | |
+ License along with this program; if not, write to the Free Software | |
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, | |
+ USA. */ | |
/* Tell glibc's <string.h> to provide a prototype for stpcpy(). | |
This must come before <config.h> because <config.h> may include | |
t@@ -27,11 +28,6 @@ | |
#endif | |
#include <string.h> | |
-#if !HAVE_STRCHR && !defined _LIBC | |
-# ifndef strchr | |
-# define strchr index | |
-# endif | |
-#endif | |
#if defined _LIBC || defined HAVE_ARGZ_H | |
# include <argz.h> | |
t@@ -62,20 +58,39 @@ | |
# endif | |
#else | |
# ifndef HAVE_STPCPY | |
-static char *stpcpy PARAMS ((char *dest, const char *src)); | |
+static char *stpcpy (char *dest, const char *src); | |
# endif | |
#endif | |
+/* Pathname support. | |
+ ISSLASH(C) tests whether C is a directory separator character. | |
+ IS_ABSOLUTE_PATH(P) tests whether P is an absolute path. If it is not, | |
+ it may be concatenated to a directory pathname. | |
+ */ | |
+#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX… | |
+ /* Win32, Cygwin, OS/2, DOS */ | |
+# define ISSLASH(C) ((C) == '/' || (C) == '\\') | |
+# define HAS_DEVICE(P) \ | |
+ ((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \ | |
+ && (P)[1] == ':') | |
+# define IS_ABSOLUTE_PATH(P) (ISSLASH ((P)[0]) || HAS_DEVICE (P)) | |
+#else | |
+ /* Unix */ | |
+# define ISSLASH(C) ((C) == '/') | |
+# define IS_ABSOLUTE_PATH(P) ISSLASH ((P)[0]) | |
+#endif | |
+ | |
/* Define function which are usually not available. */ | |
-#if !defined _LIBC && !defined HAVE___ARGZ_COUNT | |
+#ifdef _LIBC | |
+# define __argz_count(argz, len) INTUSE(__argz_count) (argz, len) | |
+#elif defined HAVE_ARGZ_COUNT | |
+# undef __argz_count | |
+# define __argz_count argz_count | |
+#else | |
/* 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; | |
+argz_count__ (const char *argz, size_t len) | |
{ | |
size_t count = 0; | |
while (len > 0) | |
t@@ -89,18 +104,19 @@ argz_count__ (argz, len) | |
} | |
# undef __argz_count | |
# define __argz_count(argz, len) argz_count__ (argz, len) | |
-#endif /* !_LIBC && !HAVE___ARGZ_COUNT */ | |
+#endif /* !_LIBC && !HAVE_ARGZ_COUNT */ | |
-#if !defined _LIBC && !defined HAVE___ARGZ_STRINGIFY | |
+#ifdef _LIBC | |
+# define __argz_stringify(argz, len, sep) \ | |
+ INTUSE(__argz_stringify) (argz, len, sep) | |
+#elif defined HAVE_ARGZ_STRINGIFY | |
+# undef __argz_stringify | |
+# define __argz_stringify argz_stringify | |
+#else | |
/* 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; | |
+argz_stringify__ (char *argz, size_t len, int sep) | |
{ | |
while (len > 0) | |
{ | |
t@@ -113,17 +129,15 @@ argz_stringify__ (argz, len, 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)); | |
+#endif /* !_LIBC && !HAVE_ARGZ_STRINGIFY */ | |
+#ifdef _LIBC | |
+#elif defined HAVE_ARGZ_NEXT | |
+# undef __argz_next | |
+# define __argz_next argz_next | |
+#else | |
static char * | |
-argz_next__ (argz, argz_len, entry) | |
- char *argz; | |
- size_t argz_len; | |
- const char *entry; | |
+argz_next__ (char *argz, size_t argz_len, const char *entry) | |
{ | |
if (entry) | |
{ | |
t@@ -140,15 +154,12 @@ argz_next__ (argz, argz_len, entry) | |
} | |
# undef __argz_next | |
# define __argz_next(argz, len, entry) argz_next__ (argz, len, entry) | |
-#endif /* !_LIBC && !HAVE___ARGZ_NEXT */ | |
+#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; | |
+pop (int x) | |
{ | |
/* We assume that no more than 16 bits are used. */ | |
x = ((x & ~0x5555) >> 1) + (x & 0x5555); | |
t@@ -161,67 +172,55 @@ pop (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; | |
+_nl_make_l10nflist (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 *filename, int do_allocate) | |
{ | |
char *abs_filename; | |
- struct loaded_l10nfile *last = NULL; | |
+ struct loaded_l10nfile **lastp; | |
struct loaded_l10nfile *retval; | |
char *cp; | |
+ size_t dirlist_count; | |
size_t entries; | |
int cnt; | |
+ /* If LANGUAGE contains an absolute directory specification, we ignore | |
+ DIRLIST. */ | |
+ if (IS_ABSOLUTE_PATH (language)) | |
+ dirlist_len = 0; | |
+ | |
/* Allocate room for the full file name. */ | |
abs_filename = (char *) malloc (dirlist_len | |
+ strlen (language) | |
- + ((mask & TERRITORY) != 0 | |
+ + ((mask & XPG_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) | |
+ + ((mask & XPG_MODIFIER) != 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, PATH_SEPARATOR); | |
- cp = abs_filename + (dirlist_len - 1); | |
- *cp++ = '/'; | |
+ cp = abs_filename; | |
+ if (dirlist_len > 0) | |
+ { | |
+ memcpy (cp, dirlist, dirlist_len); | |
+ __argz_stringify (cp, dirlist_len, PATH_SEPARATOR); | |
+ cp += dirlist_len; | |
+ cp[-1] = '/'; | |
+ } | |
+ | |
cp = stpcpy (cp, language); | |
- if ((mask & TERRITORY) != 0) | |
+ if ((mask & XPG_TERRITORY) != 0) | |
{ | |
*cp++ = '_'; | |
cp = stpcpy (cp, territory); | |
t@@ -236,36 +235,18 @@ _nl_make_l10nflist (l10nfile_list, dirlist, dirlist_len,… | |
*cp++ = '.'; | |
cp = stpcpy (cp, normalized_codeset); | |
} | |
- if ((mask & (XPG_MODIFIER | CEN_AUDIENCE)) != 0) | |
+ if ((mask & XPG_MODIFIER) != 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++ = '@'; | |
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; | |
+ lastp = l10nfile_list; | |
for (retval = *l10nfile_list; retval != NULL; retval = retval->next) | |
if (retval->filename != NULL) | |
{ | |
t@@ -280,7 +261,7 @@ _nl_make_l10nflist (l10nfile_list, dirlist, dirlist_len, m… | |
break; | |
} | |
- last = retval; | |
+ lastp = &retval->next; | |
} | |
if (retval != NULL || do_allocate == 0) | |
t@@ -289,50 +270,69 @@ _nl_make_l10nflist (l10nfile_list, dirlist, dirlist_len,… | |
return retval; | |
} | |
- retval = (struct loaded_l10nfile *) | |
- malloc (sizeof (*retval) + (__argz_count (dirlist, dirlist_len) | |
- * (1 << pop (mask)) | |
- * sizeof (struct loaded_l10nfile *))); | |
+ dirlist_count = (dirlist_len > 0 ? __argz_count (dirlist, dirlist_len) : 1); | |
+ | |
+ /* Allocate a new loaded_l10nfile. */ | |
+ retval = | |
+ (struct loaded_l10nfile *) | |
+ malloc (sizeof (*retval) | |
+ + (((dirlist_count << pop (mask)) + (dirlist_count > 1 ? 1 : 0)) | |
+ * sizeof (struct loaded_l10nfile *))); | |
if (retval == NULL) | |
- return NULL; | |
+ { | |
+ free (abs_filename); | |
+ return NULL; | |
+ } | |
retval->filename = abs_filename; | |
- retval->decided = (__argz_count (dirlist, dirlist_len) != 1 | |
+ | |
+ /* We set retval->data to NULL here; it is filled in later. | |
+ Setting retval->decided to 1 here means that retval does not | |
+ correspond to a real file (dirlist_count > 1) or is not worth | |
+ looking up (if an unnormalized codeset was specified). */ | |
+ retval->decided = (dirlist_count > 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; | |
- } | |
+ retval->next = *lastp; | |
+ *lastp = 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) | |
+ /* Recurse to fill the inheritance list of RETVAL. | |
+ If the DIRLIST is a real list (i.e. DIRLIST_COUNT > 1), the RETVAL | |
+ entry does not correspond to a real file; retval->filename contains | |
+ colons. In this case we loop across all elements of DIRLIST and | |
+ across all bit patterns dominated by MASK. | |
+ If the DIRLIST is a single directory or entirely redundant (i.e. | |
+ DIRLIST_COUNT == 1), we loop across all bit patterns dominated by | |
+ MASK, excluding MASK itself. | |
+ In either case, we loop down from MASK to 0. This has the effect | |
+ that the extra bits in the locale name are dropped in this order: | |
+ first the modifier, then the territory, then the codeset, then the | |
+ normalized_codeset. */ | |
+ for (cnt = dirlist_count > 1 ? mask : mask - 1; cnt >= 0; --cnt) | |
if ((cnt & ~mask) == 0 | |
- && ((cnt & CEN_SPECIFIC) == 0 || (cnt & XPG_SPECIFIC) == 0) | |
- && ((cnt & XPG_CODESET) == 0 || (cnt & XPG_NORM_CODESET) == 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) | |
+ if (dirlist_count > 1) | |
+ { | |
+ /* 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, filename, | |
+ 1); | |
+ } | |
+ else | |
retval->successor[entries++] | |
- = _nl_make_l10nflist (l10nfile_list, dir, strlen (dir) + 1, cnt, | |
- language, territory, codeset, | |
- normalized_codeset, modifier, special, | |
- sponsor, revision, filename, 1); | |
+ = _nl_make_l10nflist (l10nfile_list, dirlist, dirlist_len, | |
+ cnt, language, territory, codeset, | |
+ normalized_codeset, modifier, filename, 1); | |
} | |
retval->successor[entries] = NULL; | |
t@@ -344,22 +344,20 @@ _nl_make_l10nflist (l10nfile_list, dirlist, dirlist_len,… | |
names. The return value is dynamically allocated and has to be | |
freed by the caller. */ | |
const char * | |
-_nl_normalize_codeset (codeset, name_len) | |
- const char *codeset; | |
- size_t name_len; | |
+_nl_normalize_codeset (const char *codeset, size_t name_len) | |
{ | |
- int len = 0; | |
+ size_t len = 0; | |
int only_digit = 1; | |
char *retval; | |
char *wp; | |
size_t cnt; | |
for (cnt = 0; cnt < name_len; ++cnt) | |
- if (isalnum (codeset[cnt])) | |
+ if (isalnum ((unsigned char) codeset[cnt])) | |
{ | |
++len; | |
- if (isalpha (codeset[cnt])) | |
+ if (isalpha ((unsigned char) codeset[cnt])) | |
only_digit = 0; | |
} | |
t@@ -373,9 +371,9 @@ _nl_normalize_codeset (codeset, name_len) | |
wp = retval; | |
for (cnt = 0; cnt < name_len; ++cnt) | |
- if (isalpha (codeset[cnt])) | |
- *wp++ = tolower (codeset[cnt]); | |
- else if (isdigit (codeset[cnt])) | |
+ if (isalpha ((unsigned char) codeset[cnt])) | |
+ *wp++ = tolower ((unsigned char) codeset[cnt]); | |
+ else if (isdigit ((unsigned char) codeset[cnt])) | |
*wp++ = codeset[cnt]; | |
*wp = '\0'; | |
t@@ -393,9 +391,7 @@ _nl_normalize_codeset (codeset, name_len) | |
to be defined. */ | |
#if !_LIBC && !HAVE_STPCPY | |
static char * | |
-stpcpy (dest, src) | |
- char *dest; | |
- const char *src; | |
+stpcpy (char *dest, const char *src) | |
{ | |
while ((*dest++ = *src++) != '\0') | |
/* Do nothing. */ ; | |
diff --git a/intl/loadinfo.h b/intl/loadinfo.h | |
t@@ -1,36 +1,45 @@ | |
-/* Copyright (C) 1996-1999, 2000, 2001 Free Software Foundation, Inc. | |
+/* Copyright (C) 1996-1999, 2000-2003, 2005-2006 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) | |
+ This program is free software; you can redistribute it and/or modify it | |
+ under the terms of the GNU Library General Public License as published | |
+ by the Free Software Foundation; either version 2, 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. | |
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
+ Library General Public License for more details. | |
- You should have received a copy of the GNU General Public License | |
- along with this program; if not, write to the Free Software Foundation, | |
- Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |
+ You should have received a copy of the GNU Library General Public | |
+ License along with this program; if not, write to the Free Software | |
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, | |
+ USA. */ | |
#ifndef _LOADINFO_H | |
#define _LOADINFO_H 1 | |
-#ifndef PARAMS | |
-# if __STDC__ | |
-# define PARAMS(args) args | |
-# else | |
-# define PARAMS(args) () | |
-# endif | |
-#endif | |
+/* Declarations of locale dependent catalog lookup functions. | |
+ Implemented in | |
+ | |
+ localealias.c Possibly replace a locale name by another. | |
+ explodename.c Split a locale name into its various fields. | |
+ l10nflist.c Generate a list of filenames of possible message catalog… | |
+ finddomain.c Find and open the relevant message catalogs. | |
+ | |
+ The main function _nl_find_domain() in finddomain.c is declared | |
+ in gettextP.h. | |
+ */ | |
#ifndef internal_function | |
# define internal_function | |
#endif | |
+#ifndef LIBINTL_DLL_EXPORTED | |
+# define LIBINTL_DLL_EXPORTED | |
+#endif | |
+ | |
/* Tell the compiler when a conditional or integer expression is | |
almost always true or almost always false. */ | |
#ifndef HAVE_BUILTIN_EXPECT | |
t@@ -38,7 +47,7 @@ | |
#endif | |
/* Separator in PATH like lists of pathnames. */ | |
-#if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__ | |
+#if ((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__) || defined … | |
/* Win32, OS/2, DOS */ | |
# define PATH_SEPARATOR ';' | |
#else | |
t@@ -47,17 +56,10 @@ | |
#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) | |
+#define XPG_NORM_CODESET 1 | |
+#define XPG_CODESET 2 | |
+#define XPG_TERRITORY 4 | |
+#define XPG_MODIFIER 8 | |
struct loaded_l10nfile | |
t@@ -76,33 +78,55 @@ struct loaded_l10nfile | |
names. Normalization allows the user to use any of the common | |
names. The return value is dynamically allocated and has to be | |
freed by the caller. */ | |
-extern const char *_nl_normalize_codeset PARAMS ((const char *codeset, | |
- size_t name_len)); | |
- | |
+extern const char *_nl_normalize_codeset (const char *codeset, | |
+ size_t name_len); | |
+ | |
+/* Lookup a locale dependent file. | |
+ *L10NFILE_LIST denotes a pool of lookup results of locale dependent | |
+ files of the same kind, sorted in decreasing order of ->filename. | |
+ DIRLIST and DIRLIST_LEN are an argz list of directories in which to | |
+ look, containing at least one directory (i.e. DIRLIST_LEN > 0). | |
+ MASK, LANGUAGE, TERRITORY, CODESET, NORMALIZED_CODESET, MODIFIER | |
+ are the pieces of the locale name, as produced by _nl_explode_name(). | |
+ FILENAME is the filename suffix. | |
+ The return value is the lookup result, either found in *L10NFILE_LIST, | |
+ or - if DO_ALLOCATE is nonzero - freshly allocated, or possibly NULL. | |
+ If the return value is non-NULL, it is added to *L10NFILE_LIST, and | |
+ its ->next field denotes the chaining inside *L10NFILE_LIST, and | |
+ furthermore its ->successor[] field contains a list of other lookup | |
+ results from which this lookup result inherits. */ | |
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)); | |
- | |
-/* normalized_codeset is dynamically allocated and has to be freed by | |
- the caller. */ | |
-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)); | |
- | |
-extern char *_nl_find_language PARAMS ((const char *name)); | |
+_nl_make_l10nflist (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 *filename, int do_allocate); | |
+ | |
+/* Lookup the real locale name for a locale alias NAME, or NULL if | |
+ NAME is not a locale alias (but possibly a real locale name). | |
+ The return value is statically allocated and must not be freed. */ | |
+/* Part of the libintl ABI only for the sake of the gettext.m4 macro. */ | |
+extern LIBINTL_DLL_EXPORTED const char *_nl_expand_alias (const char *name); | |
+ | |
+/* Split a locale name NAME into its pieces: language, modifier, | |
+ territory, codeset. | |
+ NAME gets destructively modified: NUL bytes are inserted here and | |
+ there. *LANGUAGE gets assigned NAME. Each of *MODIFIER, *TERRITORY, | |
+ *CODESET gets assigned either a pointer into the old NAME string, or | |
+ NULL. *NORMALIZED_CODESET gets assigned the expanded *CODESET, if it | |
+ is different from *CODESET; this one is dynamically allocated and has | |
+ to be freed by the caller. | |
+ The return value is a bitmask, where each bit corresponds to one | |
+ filled-in value: | |
+ XPG_MODIFIER for *MODIFIER, | |
+ XPG_TERRITORY for *TERRITORY, | |
+ XPG_CODESET for *CODESET, | |
+ XPG_NORM_CODESET for *NORMALIZED_CODESET. | |
+ */ | |
+extern int _nl_explode_name (char *name, const char **language, | |
+ const char **modifier, const char **territory, | |
+ const char **codeset, | |
+ const char **normalized_codeset); | |
#endif /* loadinfo.h */ | |
diff --git a/intl/loadmsgcat.c b/intl/loadmsgcat.c | |
t@@ -1,19 +1,20 @@ | |
/* Load needed message catalogs. | |
- Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc. | |
+ Copyright (C) 1995-1999, 2000-2008 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) | |
+ This program is free software; you can redistribute it and/or modify it | |
+ under the terms of the GNU Library General Public License as published | |
+ by the Free Software Foundation; either version 2, 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. | |
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
+ Library General Public License for more details. | |
- You should have received a copy of the GNU General Public License | |
- along with this program; if not, write to the Free Software Foundation, | |
- Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |
+ You should have received a copy of the GNU Library General Public | |
+ License along with this program; if not, write to the Free Software | |
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, | |
+ USA. */ | |
/* Tell glibc's <string.h> to provide a prototype for mempcpy(). | |
This must come before <config.h> because <config.h> may include | |
t@@ -33,17 +34,23 @@ | |
#include <sys/stat.h> | |
#ifdef __GNUC__ | |
+# undef alloca | |
# define alloca __builtin_alloca | |
# define HAVE_ALLOCA 1 | |
#else | |
-# if defined HAVE_ALLOCA_H || defined _LIBC | |
-# include <alloca.h> | |
+# ifdef _MSC_VER | |
+# include <malloc.h> | |
+# define alloca _alloca | |
# else | |
-# ifdef _AIX | |
- #pragma alloca | |
+# if defined HAVE_ALLOCA_H || defined _LIBC | |
+# include <alloca.h> | |
# else | |
-# ifndef alloca | |
+# ifdef _AIX | |
+ #pragma alloca | |
+# else | |
+# ifndef alloca | |
char *alloca (); | |
+# endif | |
# endif | |
# endif | |
# endif | |
t@@ -70,11 +77,386 @@ char *alloca (); | |
# undef HAVE_MMAP | |
#endif | |
-#include "gettext.h" | |
+#if defined HAVE_STDINT_H_WITH_UINTMAX || defined _LIBC | |
+# include <stdint.h> | |
+#endif | |
+#if defined HAVE_INTTYPES_H || defined _LIBC | |
+# include <inttypes.h> | |
+#endif | |
+ | |
+#include "gmo.h" | |
#include "gettextP.h" | |
+#include "hash-string.h" | |
+#include "plural-exp.h" | |
#ifdef _LIBC | |
# include "../locale/localeinfo.h" | |
+# include <not-cancel.h> | |
+#endif | |
+ | |
+/* Handle multi-threaded applications. */ | |
+#ifdef _LIBC | |
+# include <bits/libc-lock.h> | |
+#else | |
+# include "lock.h" | |
+#endif | |
+ | |
+/* Provide fallback values for macros that ought to be defined in <inttypes.h>. | |
+ Note that our fallback values need not be literal strings, because we don't | |
+ use them with preprocessor string concatenation. */ | |
+#if !defined PRId8 || PRI_MACROS_BROKEN | |
+# undef PRId8 | |
+# define PRId8 "d" | |
+#endif | |
+#if !defined PRIi8 || PRI_MACROS_BROKEN | |
+# undef PRIi8 | |
+# define PRIi8 "i" | |
+#endif | |
+#if !defined PRIo8 || PRI_MACROS_BROKEN | |
+# undef PRIo8 | |
+# define PRIo8 "o" | |
+#endif | |
+#if !defined PRIu8 || PRI_MACROS_BROKEN | |
+# undef PRIu8 | |
+# define PRIu8 "u" | |
+#endif | |
+#if !defined PRIx8 || PRI_MACROS_BROKEN | |
+# undef PRIx8 | |
+# define PRIx8 "x" | |
+#endif | |
+#if !defined PRIX8 || PRI_MACROS_BROKEN | |
+# undef PRIX8 | |
+# define PRIX8 "X" | |
+#endif | |
+#if !defined PRId16 || PRI_MACROS_BROKEN | |
+# undef PRId16 | |
+# define PRId16 "d" | |
+#endif | |
+#if !defined PRIi16 || PRI_MACROS_BROKEN | |
+# undef PRIi16 | |
+# define PRIi16 "i" | |
+#endif | |
+#if !defined PRIo16 || PRI_MACROS_BROKEN | |
+# undef PRIo16 | |
+# define PRIo16 "o" | |
+#endif | |
+#if !defined PRIu16 || PRI_MACROS_BROKEN | |
+# undef PRIu16 | |
+# define PRIu16 "u" | |
+#endif | |
+#if !defined PRIx16 || PRI_MACROS_BROKEN | |
+# undef PRIx16 | |
+# define PRIx16 "x" | |
+#endif | |
+#if !defined PRIX16 || PRI_MACROS_BROKEN | |
+# undef PRIX16 | |
+# define PRIX16 "X" | |
+#endif | |
+#if !defined PRId32 || PRI_MACROS_BROKEN | |
+# undef PRId32 | |
+# define PRId32 "d" | |
+#endif | |
+#if !defined PRIi32 || PRI_MACROS_BROKEN | |
+# undef PRIi32 | |
+# define PRIi32 "i" | |
+#endif | |
+#if !defined PRIo32 || PRI_MACROS_BROKEN | |
+# undef PRIo32 | |
+# define PRIo32 "o" | |
+#endif | |
+#if !defined PRIu32 || PRI_MACROS_BROKEN | |
+# undef PRIu32 | |
+# define PRIu32 "u" | |
+#endif | |
+#if !defined PRIx32 || PRI_MACROS_BROKEN | |
+# undef PRIx32 | |
+# define PRIx32 "x" | |
+#endif | |
+#if !defined PRIX32 || PRI_MACROS_BROKEN | |
+# undef PRIX32 | |
+# define PRIX32 "X" | |
+#endif | |
+#if !defined PRId64 || PRI_MACROS_BROKEN | |
+# undef PRId64 | |
+# define PRId64 (sizeof (long) == 8 ? "ld" : "lld") | |
+#endif | |
+#if !defined PRIi64 || PRI_MACROS_BROKEN | |
+# undef PRIi64 | |
+# define PRIi64 (sizeof (long) == 8 ? "li" : "lli") | |
+#endif | |
+#if !defined PRIo64 || PRI_MACROS_BROKEN | |
+# undef PRIo64 | |
+# define PRIo64 (sizeof (long) == 8 ? "lo" : "llo") | |
+#endif | |
+#if !defined PRIu64 || PRI_MACROS_BROKEN | |
+# undef PRIu64 | |
+# define PRIu64 (sizeof (long) == 8 ? "lu" : "llu") | |
+#endif | |
+#if !defined PRIx64 || PRI_MACROS_BROKEN | |
+# undef PRIx64 | |
+# define PRIx64 (sizeof (long) == 8 ? "lx" : "llx") | |
+#endif | |
+#if !defined PRIX64 || PRI_MACROS_BROKEN | |
+# undef PRIX64 | |
+# define PRIX64 (sizeof (long) == 8 ? "lX" : "llX") | |
+#endif | |
+#if !defined PRIdLEAST8 || PRI_MACROS_BROKEN | |
+# undef PRIdLEAST8 | |
+# define PRIdLEAST8 "d" | |
+#endif | |
+#if !defined PRIiLEAST8 || PRI_MACROS_BROKEN | |
+# undef PRIiLEAST8 | |
+# define PRIiLEAST8 "i" | |
+#endif | |
+#if !defined PRIoLEAST8 || PRI_MACROS_BROKEN | |
+# undef PRIoLEAST8 | |
+# define PRIoLEAST8 "o" | |
+#endif | |
+#if !defined PRIuLEAST8 || PRI_MACROS_BROKEN | |
+# undef PRIuLEAST8 | |
+# define PRIuLEAST8 "u" | |
+#endif | |
+#if !defined PRIxLEAST8 || PRI_MACROS_BROKEN | |
+# undef PRIxLEAST8 | |
+# define PRIxLEAST8 "x" | |
+#endif | |
+#if !defined PRIXLEAST8 || PRI_MACROS_BROKEN | |
+# undef PRIXLEAST8 | |
+# define PRIXLEAST8 "X" | |
+#endif | |
+#if !defined PRIdLEAST16 || PRI_MACROS_BROKEN | |
+# undef PRIdLEAST16 | |
+# define PRIdLEAST16 "d" | |
+#endif | |
+#if !defined PRIiLEAST16 || PRI_MACROS_BROKEN | |
+# undef PRIiLEAST16 | |
+# define PRIiLEAST16 "i" | |
+#endif | |
+#if !defined PRIoLEAST16 || PRI_MACROS_BROKEN | |
+# undef PRIoLEAST16 | |
+# define PRIoLEAST16 "o" | |
+#endif | |
+#if !defined PRIuLEAST16 || PRI_MACROS_BROKEN | |
+# undef PRIuLEAST16 | |
+# define PRIuLEAST16 "u" | |
+#endif | |
+#if !defined PRIxLEAST16 || PRI_MACROS_BROKEN | |
+# undef PRIxLEAST16 | |
+# define PRIxLEAST16 "x" | |
+#endif | |
+#if !defined PRIXLEAST16 || PRI_MACROS_BROKEN | |
+# undef PRIXLEAST16 | |
+# define PRIXLEAST16 "X" | |
+#endif | |
+#if !defined PRIdLEAST32 || PRI_MACROS_BROKEN | |
+# undef PRIdLEAST32 | |
+# define PRIdLEAST32 "d" | |
+#endif | |
+#if !defined PRIiLEAST32 || PRI_MACROS_BROKEN | |
+# undef PRIiLEAST32 | |
+# define PRIiLEAST32 "i" | |
+#endif | |
+#if !defined PRIoLEAST32 || PRI_MACROS_BROKEN | |
+# undef PRIoLEAST32 | |
+# define PRIoLEAST32 "o" | |
+#endif | |
+#if !defined PRIuLEAST32 || PRI_MACROS_BROKEN | |
+# undef PRIuLEAST32 | |
+# define PRIuLEAST32 "u" | |
+#endif | |
+#if !defined PRIxLEAST32 || PRI_MACROS_BROKEN | |
+# undef PRIxLEAST32 | |
+# define PRIxLEAST32 "x" | |
+#endif | |
+#if !defined PRIXLEAST32 || PRI_MACROS_BROKEN | |
+# undef PRIXLEAST32 | |
+# define PRIXLEAST32 "X" | |
+#endif | |
+#if !defined PRIdLEAST64 || PRI_MACROS_BROKEN | |
+# undef PRIdLEAST64 | |
+# define PRIdLEAST64 PRId64 | |
+#endif | |
+#if !defined PRIiLEAST64 || PRI_MACROS_BROKEN | |
+# undef PRIiLEAST64 | |
+# define PRIiLEAST64 PRIi64 | |
+#endif | |
+#if !defined PRIoLEAST64 || PRI_MACROS_BROKEN | |
+# undef PRIoLEAST64 | |
+# define PRIoLEAST64 PRIo64 | |
+#endif | |
+#if !defined PRIuLEAST64 || PRI_MACROS_BROKEN | |
+# undef PRIuLEAST64 | |
+# define PRIuLEAST64 PRIu64 | |
+#endif | |
+#if !defined PRIxLEAST64 || PRI_MACROS_BROKEN | |
+# undef PRIxLEAST64 | |
+# define PRIxLEAST64 PRIx64 | |
+#endif | |
+#if !defined PRIXLEAST64 || PRI_MACROS_BROKEN | |
+# undef PRIXLEAST64 | |
+# define PRIXLEAST64 PRIX64 | |
+#endif | |
+#if !defined PRIdFAST8 || PRI_MACROS_BROKEN | |
+# undef PRIdFAST8 | |
+# define PRIdFAST8 "d" | |
+#endif | |
+#if !defined PRIiFAST8 || PRI_MACROS_BROKEN | |
+# undef PRIiFAST8 | |
+# define PRIiFAST8 "i" | |
+#endif | |
+#if !defined PRIoFAST8 || PRI_MACROS_BROKEN | |
+# undef PRIoFAST8 | |
+# define PRIoFAST8 "o" | |
+#endif | |
+#if !defined PRIuFAST8 || PRI_MACROS_BROKEN | |
+# undef PRIuFAST8 | |
+# define PRIuFAST8 "u" | |
+#endif | |
+#if !defined PRIxFAST8 || PRI_MACROS_BROKEN | |
+# undef PRIxFAST8 | |
+# define PRIxFAST8 "x" | |
+#endif | |
+#if !defined PRIXFAST8 || PRI_MACROS_BROKEN | |
+# undef PRIXFAST8 | |
+# define PRIXFAST8 "X" | |
+#endif | |
+#if !defined PRIdFAST16 || PRI_MACROS_BROKEN | |
+# undef PRIdFAST16 | |
+# define PRIdFAST16 "d" | |
+#endif | |
+#if !defined PRIiFAST16 || PRI_MACROS_BROKEN | |
+# undef PRIiFAST16 | |
+# define PRIiFAST16 "i" | |
+#endif | |
+#if !defined PRIoFAST16 || PRI_MACROS_BROKEN | |
+# undef PRIoFAST16 | |
+# define PRIoFAST16 "o" | |
+#endif | |
+#if !defined PRIuFAST16 || PRI_MACROS_BROKEN | |
+# undef PRIuFAST16 | |
+# define PRIuFAST16 "u" | |
+#endif | |
+#if !defined PRIxFAST16 || PRI_MACROS_BROKEN | |
+# undef PRIxFAST16 | |
+# define PRIxFAST16 "x" | |
+#endif | |
+#if !defined PRIXFAST16 || PRI_MACROS_BROKEN | |
+# undef PRIXFAST16 | |
+# define PRIXFAST16 "X" | |
+#endif | |
+#if !defined PRIdFAST32 || PRI_MACROS_BROKEN | |
+# undef PRIdFAST32 | |
+# define PRIdFAST32 "d" | |
+#endif | |
+#if !defined PRIiFAST32 || PRI_MACROS_BROKEN | |
+# undef PRIiFAST32 | |
+# define PRIiFAST32 "i" | |
+#endif | |
+#if !defined PRIoFAST32 || PRI_MACROS_BROKEN | |
+# undef PRIoFAST32 | |
+# define PRIoFAST32 "o" | |
+#endif | |
+#if !defined PRIuFAST32 || PRI_MACROS_BROKEN | |
+# undef PRIuFAST32 | |
+# define PRIuFAST32 "u" | |
+#endif | |
+#if !defined PRIxFAST32 || PRI_MACROS_BROKEN | |
+# undef PRIxFAST32 | |
+# define PRIxFAST32 "x" | |
+#endif | |
+#if !defined PRIXFAST32 || PRI_MACROS_BROKEN | |
+# undef PRIXFAST32 | |
+# define PRIXFAST32 "X" | |
+#endif | |
+#if !defined PRIdFAST64 || PRI_MACROS_BROKEN | |
+# undef PRIdFAST64 | |
+# define PRIdFAST64 PRId64 | |
+#endif | |
+#if !defined PRIiFAST64 || PRI_MACROS_BROKEN | |
+# undef PRIiFAST64 | |
+# define PRIiFAST64 PRIi64 | |
+#endif | |
+#if !defined PRIoFAST64 || PRI_MACROS_BROKEN | |
+# undef PRIoFAST64 | |
+# define PRIoFAST64 PRIo64 | |
+#endif | |
+#if !defined PRIuFAST64 || PRI_MACROS_BROKEN | |
+# undef PRIuFAST64 | |
+# define PRIuFAST64 PRIu64 | |
+#endif | |
+#if !defined PRIxFAST64 || PRI_MACROS_BROKEN | |
+# undef PRIxFAST64 | |
+# define PRIxFAST64 PRIx64 | |
+#endif | |
+#if !defined PRIXFAST64 || PRI_MACROS_BROKEN | |
+# undef PRIXFAST64 | |
+# define PRIXFAST64 PRIX64 | |
+#endif | |
+#if !defined PRIdMAX || PRI_MACROS_BROKEN | |
+# undef PRIdMAX | |
+# define PRIdMAX (sizeof (uintmax_t) == sizeof (long) ? "ld" : "lld") | |
+#endif | |
+#if !defined PRIiMAX || PRI_MACROS_BROKEN | |
+# undef PRIiMAX | |
+# define PRIiMAX (sizeof (uintmax_t) == sizeof (long) ? "li" : "lli") | |
+#endif | |
+#if !defined PRIoMAX || PRI_MACROS_BROKEN | |
+# undef PRIoMAX | |
+# define PRIoMAX (sizeof (uintmax_t) == sizeof (long) ? "lo" : "llo") | |
+#endif | |
+#if !defined PRIuMAX || PRI_MACROS_BROKEN | |
+# undef PRIuMAX | |
+# define PRIuMAX (sizeof (uintmax_t) == sizeof (long) ? "lu" : "llu") | |
+#endif | |
+#if !defined PRIxMAX || PRI_MACROS_BROKEN | |
+# undef PRIxMAX | |
+# define PRIxMAX (sizeof (uintmax_t) == sizeof (long) ? "lx" : "llx") | |
+#endif | |
+#if !defined PRIXMAX || PRI_MACROS_BROKEN | |
+# undef PRIXMAX | |
+# define PRIXMAX (sizeof (uintmax_t) == sizeof (long) ? "lX" : "llX") | |
+#endif | |
+#if !defined PRIdPTR || PRI_MACROS_BROKEN | |
+# undef PRIdPTR | |
+# define PRIdPTR \ | |
+ (sizeof (void *) == sizeof (long) ? "ld" : \ | |
+ sizeof (void *) == sizeof (int) ? "d" : \ | |
+ "lld") | |
+#endif | |
+#if !defined PRIiPTR || PRI_MACROS_BROKEN | |
+# undef PRIiPTR | |
+# define PRIiPTR \ | |
+ (sizeof (void *) == sizeof (long) ? "li" : \ | |
+ sizeof (void *) == sizeof (int) ? "i" : \ | |
+ "lli") | |
+#endif | |
+#if !defined PRIoPTR || PRI_MACROS_BROKEN | |
+# undef PRIoPTR | |
+# define PRIoPTR \ | |
+ (sizeof (void *) == sizeof (long) ? "lo" : \ | |
+ sizeof (void *) == sizeof (int) ? "o" : \ | |
+ "llo") | |
+#endif | |
+#if !defined PRIuPTR || PRI_MACROS_BROKEN | |
+# undef PRIuPTR | |
+# define PRIuPTR \ | |
+ (sizeof (void *) == sizeof (long) ? "lu" : \ | |
+ sizeof (void *) == sizeof (int) ? "u" : \ | |
+ "llu") | |
+#endif | |
+#if !defined PRIxPTR || PRI_MACROS_BROKEN | |
+# undef PRIxPTR | |
+# define PRIxPTR \ | |
+ (sizeof (void *) == sizeof (long) ? "lx" : \ | |
+ sizeof (void *) == sizeof (int) ? "x" : \ | |
+ "llx") | |
+#endif | |
+#if !defined PRIXPTR || PRI_MACROS_BROKEN | |
+# undef PRIXPTR | |
+# define PRIXPTR \ | |
+ (sizeof (void *) == sizeof (long) ? "lX" : \ | |
+ sizeof (void *) == sizeof (int) ? "X" : \ | |
+ "llX") | |
#endif | |
/* @@ end of prolog @@ */ | |
t@@ -83,21 +465,12 @@ char *alloca (); | |
/* 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 | |
- | |
-/* 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 PLURAL_PARSE __gettextparse | |
-#else | |
-# define PLURAL_PARSE gettextparse__ | |
+# define open(name, flags) open_not_cancel_2 (name, flags) | |
+# define close(fd) close_not_cancel_no_status (fd) | |
+# define read(fd, buf, n) read_not_cancel (fd, buf, n) | |
+# define mmap(addr, len, prot, flags, fd, offset) \ | |
+ __mmap (addr, len, prot, flags, fd, offset) | |
+# define munmap(addr, len) __munmap (addr, len) | |
#endif | |
/* For those losing systems which don't have `alloca' we have to add | |
t@@ -126,221 +499,289 @@ char *alloca (); | |
# define O_BINARY 0 | |
#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; | |
-#if (defined __GNUC__ && !defined __APPLE_CC__) \ | |
- || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L) | |
-/* These structs are the constant expression for the germanic plural | |
- form determination. It represents the expression "n != 1". */ | |
-static const struct expression plvar = | |
-{ | |
- .nargs = 0, | |
- .operation = var, | |
-}; | |
-static const struct expression plone = | |
+/* Expand a system dependent string segment. Return NULL if unsupported. */ | |
+static const char * | |
+get_sysdep_segment_value (const char *name) | |
{ | |
- .nargs = 0, | |
- .operation = num, | |
- .val = | |
- { | |
- .num = 1 | |
- } | |
-}; | |
-static struct expression germanic_plural = | |
-{ | |
- .nargs = 2, | |
- .operation = not_equal, | |
- .val = | |
- { | |
- .args = | |
+ /* Test for an ISO C 99 section 7.8.1 format string directive. | |
+ Syntax: | |
+ P R I { d | i | o | u | x | X } | |
+ { { | LEAST | FAST } { 8 | 16 | 32 | 64 } | MAX | PTR } */ | |
+ /* We don't use a table of 14 times 6 'const char *' strings here, because | |
+ data relocations cost startup time. */ | |
+ if (name[0] == 'P' && name[1] == 'R' && name[2] == 'I') | |
{ | |
- [0] = (struct expression *) &plvar, | |
- [1] = (struct expression *) &plone | |
- } | |
- } | |
-}; | |
- | |
-# define INIT_GERMANIC_PLURAL() | |
- | |
-#else | |
- | |
-/* For compilers without support for ISO C 99 struct/union initializers: | |
- Initialization at run-time. */ | |
- | |
-static struct expression plvar; | |
-static struct expression plone; | |
-static struct expression germanic_plural; | |
- | |
-static void | |
-init_germanic_plural () | |
-{ | |
- if (plone.val.num == 0) | |
- { | |
- plvar.nargs = 0; | |
- plvar.operation = var; | |
- | |
- plone.nargs = 0; | |
- plone.operation = num; | |
- plone.val.num = 1; | |
- | |
- germanic_plural.nargs = 2; | |
- germanic_plural.operation = not_equal; | |
- germanic_plural.val.args[0] = &plvar; | |
- germanic_plural.val.args[1] = &plone; | |
- } | |
-} | |
- | |
-# define INIT_GERMANIC_PLURAL() init_germanic_plural () | |
- | |
-#endif | |
- | |
- | |
-/* Initialize the codeset dependent parts of an opened message catalog. | |
- Return the header entry. */ | |
-const char * | |
-internal_function | |
-_nl_init_domain_conv (domain_file, domain, domainbinding) | |
- struct loaded_l10nfile *domain_file; | |
- struct loaded_domain *domain; | |
- struct binding *domainbinding; | |
-{ | |
- /* Find out about the character set the file is encoded with. | |
- This can be found (in textual form) in the entry "". If this | |
- entry does not exist or if this does not contain the `charset=' | |
- information, we will assume the charset matches the one the | |
- current locale and we don't have to perform any conversion. */ | |
- char *nullentry; | |
- size_t nullentrylen; | |
- | |
- /* Preinitialize fields, to avoid recursion during _nl_find_msg. */ | |
- domain->codeset_cntr = | |
- (domainbinding != NULL ? domainbinding->codeset_cntr : 0); | |
-#ifdef _LIBC | |
- domain->conv = (__gconv_t) -1; | |
-#else | |
-# if HAVE_ICONV | |
- domain->conv = (iconv_t) -1; | |
-# endif | |
-#endif | |
- domain->conv_tab = NULL; | |
- | |
- /* Get the header entry. */ | |
- nullentry = _nl_find_msg (domain_file, domainbinding, "", &nullentrylen); | |
- | |
- if (nullentry != NULL) | |
- { | |
-#if defined _LIBC || HAVE_ICONV | |
- const char *charsetstr; | |
- | |
- charsetstr = strstr (nullentry, "charset="); | |
- if (charsetstr != NULL) | |
+ if (name[3] == 'd' || name[3] == 'i' || name[3] == 'o' || name[3] == 'u' | |
+ || name[3] == 'x' || name[3] == 'X') | |
{ | |
- size_t len; | |
- char *charset; | |
- const char *outcharset; | |
- | |
- charsetstr += strlen ("charset="); | |
- len = strcspn (charsetstr, " \t\n"); | |
- | |
- charset = (char *) alloca (len + 1); | |
-# if defined _LIBC || HAVE_MEMPCPY | |
- *((char *) mempcpy (charset, charsetstr, len)) = '\0'; | |
-# else | |
- memcpy (charset, charsetstr, len); | |
- charset[len] = '\0'; | |
-# endif | |
- | |
- /* The output charset should normally be determined by the | |
- locale. But sometimes the locale is not used or not correctly | |
- set up, so we provide a possibility for the user to override | |
- this. Moreover, the value specified through | |
- bind_textdomain_codeset overrides both. */ | |
- if (domainbinding != NULL && domainbinding->codeset != NULL) | |
- outcharset = domainbinding->codeset; | |
- else | |
+ if (name[4] == '8' && name[5] == '\0') | |
{ | |
- outcharset = getenv ("OUTPUT_CHARSET"); | |
- if (outcharset == NULL || outcharset[0] == '\0') | |
+ if (name[3] == 'd') | |
+ return PRId8; | |
+ if (name[3] == 'i') | |
+ return PRIi8; | |
+ if (name[3] == 'o') | |
+ return PRIo8; | |
+ if (name[3] == 'u') | |
+ return PRIu8; | |
+ if (name[3] == 'x') | |
+ return PRIx8; | |
+ if (name[3] == 'X') | |
+ return PRIX8; | |
+ abort (); | |
+ } | |
+ if (name[4] == '1' && name[5] == '6' && name[6] == '\0') | |
+ { | |
+ if (name[3] == 'd') | |
+ return PRId16; | |
+ if (name[3] == 'i') | |
+ return PRIi16; | |
+ if (name[3] == 'o') | |
+ return PRIo16; | |
+ if (name[3] == 'u') | |
+ return PRIu16; | |
+ if (name[3] == 'x') | |
+ return PRIx16; | |
+ if (name[3] == 'X') | |
+ return PRIX16; | |
+ abort (); | |
+ } | |
+ if (name[4] == '3' && name[5] == '2' && name[6] == '\0') | |
+ { | |
+ if (name[3] == 'd') | |
+ return PRId32; | |
+ if (name[3] == 'i') | |
+ return PRIi32; | |
+ if (name[3] == 'o') | |
+ return PRIo32; | |
+ if (name[3] == 'u') | |
+ return PRIu32; | |
+ if (name[3] == 'x') | |
+ return PRIx32; | |
+ if (name[3] == 'X') | |
+ return PRIX32; | |
+ abort (); | |
+ } | |
+ if (name[4] == '6' && name[5] == '4' && name[6] == '\0') | |
+ { | |
+ if (name[3] == 'd') | |
+ return PRId64; | |
+ if (name[3] == 'i') | |
+ return PRIi64; | |
+ if (name[3] == 'o') | |
+ return PRIo64; | |
+ if (name[3] == 'u') | |
+ return PRIu64; | |
+ if (name[3] == 'x') | |
+ return PRIx64; | |
+ if (name[3] == 'X') | |
+ return PRIX64; | |
+ abort (); | |
+ } | |
+ if (name[4] == 'L' && name[5] == 'E' && name[6] == 'A' | |
+ && name[7] == 'S' && name[8] == 'T') | |
+ { | |
+ if (name[9] == '8' && name[10] == '\0') | |
{ | |
-# ifdef _LIBC | |
- outcharset = (*_nl_current[LC_CTYPE])->values[_NL_ITEM_INDEX… | |
-# else | |
-# if HAVE_ICONV | |
- extern const char *locale_charset (void); | |
- outcharset = locale_charset (); | |
-# endif | |
-# endif | |
+ if (name[3] == 'd') | |
+ return PRIdLEAST8; | |
+ if (name[3] == 'i') | |
+ return PRIiLEAST8; | |
+ if (name[3] == 'o') | |
+ return PRIoLEAST8; | |
+ if (name[3] == 'u') | |
+ return PRIuLEAST8; | |
+ if (name[3] == 'x') | |
+ return PRIxLEAST8; | |
+ if (name[3] == 'X') | |
+ return PRIXLEAST8; | |
+ abort (); | |
+ } | |
+ if (name[9] == '1' && name[10] == '6' && name[11] == '\0') | |
+ { | |
+ if (name[3] == 'd') | |
+ return PRIdLEAST16; | |
+ if (name[3] == 'i') | |
+ return PRIiLEAST16; | |
+ if (name[3] == 'o') | |
+ return PRIoLEAST16; | |
+ if (name[3] == 'u') | |
+ return PRIuLEAST16; | |
+ if (name[3] == 'x') | |
+ return PRIxLEAST16; | |
+ if (name[3] == 'X') | |
+ return PRIXLEAST16; | |
+ abort (); | |
+ } | |
+ if (name[9] == '3' && name[10] == '2' && name[11] == '\0') | |
+ { | |
+ if (name[3] == 'd') | |
+ return PRIdLEAST32; | |
+ if (name[3] == 'i') | |
+ return PRIiLEAST32; | |
+ if (name[3] == 'o') | |
+ return PRIoLEAST32; | |
+ if (name[3] == 'u') | |
+ return PRIuLEAST32; | |
+ if (name[3] == 'x') | |
+ return PRIxLEAST32; | |
+ if (name[3] == 'X') | |
+ return PRIXLEAST32; | |
+ abort (); | |
+ } | |
+ if (name[9] == '6' && name[10] == '4' && name[11] == '\0') | |
+ { | |
+ if (name[3] == 'd') | |
+ return PRIdLEAST64; | |
+ if (name[3] == 'i') | |
+ return PRIiLEAST64; | |
+ if (name[3] == 'o') | |
+ return PRIoLEAST64; | |
+ if (name[3] == 'u') | |
+ return PRIuLEAST64; | |
+ if (name[3] == 'x') | |
+ return PRIxLEAST64; | |
+ if (name[3] == 'X') | |
+ return PRIXLEAST64; | |
+ abort (); | |
} | |
} | |
- | |
-# ifdef _LIBC | |
- /* We always want to use transliteration. */ | |
- outcharset = norm_add_slashes (outcharset, "TRANSLIT"); | |
- charset = norm_add_slashes (charset, NULL); | |
- if (__gconv_open (outcharset, charset, &domain->conv, | |
- GCONV_AVOID_NOCONV) | |
- != __GCONV_OK) | |
- domain->conv = (__gconv_t) -1; | |
-# else | |
-# if HAVE_ICONV | |
- /* When using GNU libiconv, we want to use transliteration. */ | |
-# if _LIBICONV_VERSION >= 0x0105 | |
- len = strlen (outcharset); | |
- { | |
- char *tmp = (char *) alloca (len + 10 + 1); | |
- memcpy (tmp, outcharset, len); | |
- memcpy (tmp + len, "//TRANSLIT", 10 + 1); | |
- outcharset = tmp; | |
- } | |
-# endif | |
- domain->conv = iconv_open (outcharset, charset); | |
-# if _LIBICONV_VERSION >= 0x0105 | |
- freea (outcharset); | |
-# endif | |
-# endif | |
-# endif | |
- | |
- freea (charset); | |
+ if (name[4] == 'F' && name[5] == 'A' && name[6] == 'S' | |
+ && name[7] == 'T') | |
+ { | |
+ if (name[8] == '8' && name[9] == '\0') | |
+ { | |
+ if (name[3] == 'd') | |
+ return PRIdFAST8; | |
+ if (name[3] == 'i') | |
+ return PRIiFAST8; | |
+ if (name[3] == 'o') | |
+ return PRIoFAST8; | |
+ if (name[3] == 'u') | |
+ return PRIuFAST8; | |
+ if (name[3] == 'x') | |
+ return PRIxFAST8; | |
+ if (name[3] == 'X') | |
+ return PRIXFAST8; | |
+ abort (); | |
+ } | |
+ if (name[8] == '1' && name[9] == '6' && name[10] == '\0') | |
+ { | |
+ if (name[3] == 'd') | |
+ return PRIdFAST16; | |
+ if (name[3] == 'i') | |
+ return PRIiFAST16; | |
+ if (name[3] == 'o') | |
+ return PRIoFAST16; | |
+ if (name[3] == 'u') | |
+ return PRIuFAST16; | |
+ if (name[3] == 'x') | |
+ return PRIxFAST16; | |
+ if (name[3] == 'X') | |
+ return PRIXFAST16; | |
+ abort (); | |
+ } | |
+ if (name[8] == '3' && name[9] == '2' && name[10] == '\0') | |
+ { | |
+ if (name[3] == 'd') | |
+ return PRIdFAST32; | |
+ if (name[3] == 'i') | |
+ return PRIiFAST32; | |
+ if (name[3] == 'o') | |
+ return PRIoFAST32; | |
+ if (name[3] == 'u') | |
+ return PRIuFAST32; | |
+ if (name[3] == 'x') | |
+ return PRIxFAST32; | |
+ if (name[3] == 'X') | |
+ return PRIXFAST32; | |
+ abort (); | |
+ } | |
+ if (name[8] == '6' && name[9] == '4' && name[10] == '\0') | |
+ { | |
+ if (name[3] == 'd') | |
+ return PRIdFAST64; | |
+ if (name[3] == 'i') | |
+ return PRIiFAST64; | |
+ if (name[3] == 'o') | |
+ return PRIoFAST64; | |
+ if (name[3] == 'u') | |
+ return PRIuFAST64; | |
+ if (name[3] == 'x') | |
+ return PRIxFAST64; | |
+ if (name[3] == 'X') | |
+ return PRIXFAST64; | |
+ abort (); | |
+ } | |
+ } | |
+ if (name[4] == 'M' && name[5] == 'A' && name[6] == 'X' | |
+ && name[7] == '\0') | |
+ { | |
+ if (name[3] == 'd') | |
+ return PRIdMAX; | |
+ if (name[3] == 'i') | |
+ return PRIiMAX; | |
+ if (name[3] == 'o') | |
+ return PRIoMAX; | |
+ if (name[3] == 'u') | |
+ return PRIuMAX; | |
+ if (name[3] == 'x') | |
+ return PRIxMAX; | |
+ if (name[3] == 'X') | |
+ return PRIXMAX; | |
+ abort (); | |
+ } | |
+ if (name[4] == 'P' && name[5] == 'T' && name[6] == 'R' | |
+ && name[7] == '\0') | |
+ { | |
+ if (name[3] == 'd') | |
+ return PRIdPTR; | |
+ if (name[3] == 'i') | |
+ return PRIiPTR; | |
+ if (name[3] == 'o') | |
+ return PRIoPTR; | |
+ if (name[3] == 'u') | |
+ return PRIuPTR; | |
+ if (name[3] == 'x') | |
+ return PRIxPTR; | |
+ if (name[3] == 'X') | |
+ return PRIXPTR; | |
+ abort (); | |
+ } | |
} | |
-#endif /* _LIBC || HAVE_ICONV */ | |
} | |
- | |
- return nullentry; | |
-} | |
- | |
-/* Frees the codeset dependent parts of an opened message catalog. */ | |
-void | |
-internal_function | |
-_nl_free_domain_conv (domain) | |
- struct loaded_domain *domain; | |
-{ | |
- if (domain->conv_tab != NULL && domain->conv_tab != (char **) -1) | |
- free (domain->conv_tab); | |
- | |
-#ifdef _LIBC | |
- if (domain->conv != (__gconv_t) -1) | |
- __gconv_close (domain->conv); | |
+ /* Test for a glibc specific printf() format directive flag. */ | |
+ if (name[0] == 'I' && name[1] == '\0') | |
+ { | |
+#if defined _LIBC || __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2) | |
+ /* The 'I' flag, in numeric format directives, replaces ASCII digits | |
+ with the 'outdigits' defined in the LC_CTYPE locale facet. This is | |
+ used for Farsi (Persian) and maybe Arabic. */ | |
+ return "I"; | |
#else | |
-# if HAVE_ICONV | |
- if (domain->conv != (iconv_t) -1) | |
- iconv_close (domain->conv); | |
-# endif | |
+ return ""; | |
#endif | |
+ } | |
+ /* Other system dependent strings are not valid. */ | |
+ return NULL; | |
} | |
/* Load the message catalogs specified by FILENAME. If it is no valid | |
message catalog do nothing. */ | |
void | |
internal_function | |
-_nl_load_domain (domain_file, domainbinding) | |
- struct loaded_l10nfile *domain_file; | |
- struct binding *domainbinding; | |
+_nl_load_domain (struct loaded_l10nfile *domain_file, | |
+ struct binding *domainbinding) | |
{ | |
- int fd; | |
+ __libc_lock_define_initialized_recursive (static, lock) | |
+ int fd = -1; | |
size_t size; | |
#ifdef _LIBC | |
struct stat64 st; | |
t@@ -350,9 +791,26 @@ _nl_load_domain (domain_file, domainbinding) | |
struct mo_file_header *data = (struct mo_file_header *) -1; | |
int use_mmap = 0; | |
struct loaded_domain *domain; | |
+ int revision; | |
const char *nullentry; | |
+ size_t nullentrylen; | |
- domain_file->decided = 1; | |
+ __libc_lock_lock_recursive (lock); | |
+ if (domain_file->decided != 0) | |
+ { | |
+ /* There are two possibilities: | |
+ | |
+ + this is the same thread calling again during this initialization | |
+ via _nl_find_msg. We have initialized everything this call needs. | |
+ | |
+ + this is another thread which tried to initialize this object. | |
+ Not necessary anymore since if the lock is available this | |
+ is finished. | |
+ */ | |
+ goto done; | |
+ } | |
+ | |
+ domain_file->decided = -1; | |
domain_file->data = NULL; | |
/* Note that it would be useless to store domainbinding in domain_file | |
t@@ -364,12 +822,12 @@ _nl_load_domain (domain_file, domainbinding) | |
specification the locale file name is different for XPG and CEN | |
syntax. */ | |
if (domain_file->filename == NULL) | |
- return; | |
+ goto out; | |
/* Try to open the addressed file. */ | |
fd = open (domain_file->filename, O_RDONLY | O_BINARY); | |
if (fd == -1) | |
- return; | |
+ goto out; | |
/* We must know about the size of the file. */ | |
if ( | |
t@@ -380,11 +838,8 @@ _nl_load_domain (domain_file, domainbinding) | |
#endif | |
|| __builtin_expect ((size = (size_t) st.st_size) != st.st_size, 0) | |
|| __builtin_expect (size < sizeof (struct mo_file_header), 0)) | |
- { | |
- /* Something went wrong. */ | |
- close (fd); | |
- return; | |
- } | |
+ /* Something went wrong. */ | |
+ goto out; | |
#ifdef HAVE_MMAP | |
/* Now we are ready to load the file. If mmap() is available we try | |
t@@ -396,6 +851,7 @@ _nl_load_domain (domain_file, domainbinding) | |
{ | |
/* mmap() call was successful. */ | |
close (fd); | |
+ fd = -1; | |
use_mmap = 1; | |
} | |
#endif | |
t@@ -409,7 +865,7 @@ _nl_load_domain (domain_file, domainbinding) | |
data = (struct mo_file_header *) malloc (size); | |
if (data == NULL) | |
- return; | |
+ goto out; | |
to_read = size; | |
read_ptr = (char *) data; | |
t@@ -422,8 +878,7 @@ _nl_load_domain (domain_file, domainbinding) | |
if (nb == -1 && errno == EINTR) | |
continue; | |
#endif | |
- close (fd); | |
- return; | |
+ goto out; | |
} | |
read_ptr += nb; | |
to_read -= nb; | |
t@@ -431,6 +886,7 @@ _nl_load_domain (domain_file, domainbinding) | |
while (to_read > 0); | |
close (fd); | |
+ fd = -1; | |
} | |
/* Using the magic number we can test whether it really is a message | |
t@@ -445,34 +901,365 @@ _nl_load_domain (domain_file, domainbinding) | |
else | |
#endif | |
free (data); | |
- return; | |
+ goto out; | |
} | |
domain = (struct loaded_domain *) malloc (sizeof (struct loaded_domain)); | |
if (domain == NULL) | |
- return; | |
+ goto out; | |
domain_file->data = domain; | |
domain->data = (char *) data; | |
domain->use_mmap = use_mmap; | |
domain->mmap_size = size; | |
domain->must_swap = data->magic != _MAGIC; | |
+ domain->malloced = NULL; | |
/* Fill in the information about the available tables. */ | |
- switch (W (domain->must_swap, data->revision)) | |
+ revision = W (domain->must_swap, data->revision); | |
+ /* We support only the major revisions 0 and 1. */ | |
+ switch (revision >> 16) | |
{ | |
case 0: | |
+ case 1: | |
domain->nstrings = W (domain->must_swap, data->nstrings); | |
- domain->orig_tab = (struct string_desc *) | |
+ domain->orig_tab = (const struct string_desc *) | |
((char *) data + W (domain->must_swap, data->orig_tab_offset)); | |
- domain->trans_tab = (struct string_desc *) | |
+ domain->trans_tab = (const 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)); | |
+ domain->hash_tab = | |
+ (domain->hash_size > 2 | |
+ ? (const nls_uint32 *) | |
+ ((char *) data + W (domain->must_swap, data->hash_tab_offset)) | |
+ : NULL); | |
+ domain->must_swap_hash_tab = domain->must_swap; | |
+ | |
+ /* Now dispatch on the minor revision. */ | |
+ switch (revision & 0xffff) | |
+ { | |
+ case 0: | |
+ domain->n_sysdep_strings = 0; | |
+ domain->orig_sysdep_tab = NULL; | |
+ domain->trans_sysdep_tab = NULL; | |
+ break; | |
+ case 1: | |
+ default: | |
+ { | |
+ nls_uint32 n_sysdep_strings; | |
+ | |
+ if (domain->hash_tab == NULL) | |
+ /* This is invalid. These minor revisions need a hash table. */ | |
+ goto invalid; | |
+ | |
+ n_sysdep_strings = | |
+ W (domain->must_swap, data->n_sysdep_strings); | |
+ if (n_sysdep_strings > 0) | |
+ { | |
+ nls_uint32 n_sysdep_segments; | |
+ const struct sysdep_segment *sysdep_segments; | |
+ const char **sysdep_segment_values; | |
+ const nls_uint32 *orig_sysdep_tab; | |
+ const nls_uint32 *trans_sysdep_tab; | |
+ nls_uint32 n_inmem_sysdep_strings; | |
+ size_t memneed; | |
+ char *mem; | |
+ struct sysdep_string_desc *inmem_orig_sysdep_tab; | |
+ struct sysdep_string_desc *inmem_trans_sysdep_tab; | |
+ nls_uint32 *inmem_hash_tab; | |
+ unsigned int i, j; | |
+ | |
+ /* Get the values of the system dependent segments. */ | |
+ n_sysdep_segments = | |
+ W (domain->must_swap, data->n_sysdep_segments); | |
+ sysdep_segments = (const struct sysdep_segment *) | |
+ ((char *) data | |
+ + W (domain->must_swap, data->sysdep_segments_offset)); | |
+ sysdep_segment_values = | |
+ (const char **) | |
+ alloca (n_sysdep_segments * sizeof (const char *)); | |
+ for (i = 0; i < n_sysdep_segments; i++) | |
+ { | |
+ const char *name = | |
+ (char *) data | |
+ + W (domain->must_swap, sysdep_segments[i].offset); | |
+ nls_uint32 namelen = | |
+ W (domain->must_swap, sysdep_segments[i].length); | |
+ | |
+ if (!(namelen > 0 && name[namelen - 1] == '\0')) | |
+ { | |
+ freea (sysdep_segment_values); | |
+ goto invalid; | |
+ } | |
+ | |
+ sysdep_segment_values[i] = get_sysdep_segment_value (name); | |
+ } | |
+ | |
+ orig_sysdep_tab = (const nls_uint32 *) | |
+ ((char *) data | |
+ + W (domain->must_swap, data->orig_sysdep_tab_offset)); | |
+ trans_sysdep_tab = (const nls_uint32 *) | |
+ ((char *) data | |
+ + W (domain->must_swap, data->trans_sysdep_tab_offset)); | |
+ | |
+ /* Compute the amount of additional memory needed for the | |
+ system dependent strings and the augmented hash table. | |
+ At the same time, also drop string pairs which refer to | |
+ an undefined system dependent segment. */ | |
+ n_inmem_sysdep_strings = 0; | |
+ memneed = domain->hash_size * sizeof (nls_uint32); | |
+ for (i = 0; i < n_sysdep_strings; i++) | |
+ { | |
+ int valid = 1; | |
+ size_t needs[2]; | |
+ | |
+ for (j = 0; j < 2; j++) | |
+ { | |
+ const struct sysdep_string *sysdep_string = | |
+ (const struct sysdep_string *) | |
+ ((char *) data | |
+ + W (domain->must_swap, | |
+ j == 0 | |
+ ? orig_sysdep_tab[i] | |
+ : trans_sysdep_tab[i])); | |
+ size_t need = 0; | |
+ const struct segment_pair *p = sysdep_string->segments; | |
+ | |
+ if (W (domain->must_swap, p->sysdepref) != SEGMENTS_EN… | |
+ for (p = sysdep_string->segments;; p++) | |
+ { | |
+ nls_uint32 sysdepref; | |
+ | |
+ need += W (domain->must_swap, p->segsize); | |
+ | |
+ sysdepref = W (domain->must_swap, p->sysdepref); | |
+ if (sysdepref == SEGMENTS_END) | |
+ break; | |
+ | |
+ if (sysdepref >= n_sysdep_segments) | |
+ { | |
+ /* Invalid. */ | |
+ freea (sysdep_segment_values); | |
+ goto invalid; | |
+ } | |
+ | |
+ if (sysdep_segment_values[sysdepref] == NULL) | |
+ { | |
+ /* This particular string pair is invalid. … | |
+ valid = 0; | |
+ break; | |
+ } | |
+ | |
+ need += strlen (sysdep_segment_values[sysdepref]… | |
+ } | |
+ | |
+ needs[j] = need; | |
+ if (!valid) | |
+ break; | |
+ } | |
+ | |
+ if (valid) | |
+ { | |
+ n_inmem_sysdep_strings++; | |
+ memneed += needs[0] + needs[1]; | |
+ } | |
+ } | |
+ memneed += 2 * n_inmem_sysdep_strings | |
+ * sizeof (struct sysdep_string_desc); | |
+ | |
+ if (n_inmem_sysdep_strings > 0) | |
+ { | |
+ unsigned int k; | |
+ | |
+ /* Allocate additional memory. */ | |
+ mem = (char *) malloc (memneed); | |
+ if (mem == NULL) | |
+ goto invalid; | |
+ | |
+ domain->malloced = mem; | |
+ inmem_orig_sysdep_tab = (struct sysdep_string_desc *) mem; | |
+ mem += n_inmem_sysdep_strings | |
+ * sizeof (struct sysdep_string_desc); | |
+ inmem_trans_sysdep_tab = (struct sysdep_string_desc *) mem; | |
+ mem += n_inmem_sysdep_strings | |
+ * sizeof (struct sysdep_string_desc); | |
+ inmem_hash_tab = (nls_uint32 *) mem; | |
+ mem += domain->hash_size * sizeof (nls_uint32); | |
+ | |
+ /* Compute the system dependent strings. */ | |
+ k = 0; | |
+ for (i = 0; i < n_sysdep_strings; i++) | |
+ { | |
+ int valid = 1; | |
+ | |
+ for (j = 0; j < 2; j++) | |
+ { | |
+ const struct sysdep_string *sysdep_string = | |
+ (const struct sysdep_string *) | |
+ ((char *) data | |
+ + W (domain->must_swap, | |
+ j == 0 | |
+ ? orig_sysdep_tab[i] | |
+ : trans_sysdep_tab[i])); | |
+ const struct segment_pair *p = | |
+ sysdep_string->segments; | |
+ | |
+ if (W (domain->must_swap, p->sysdepref) | |
+ != SEGMENTS_END) | |
+ for (p = sysdep_string->segments;; p++) | |
+ { | |
+ nls_uint32 sysdepref; | |
+ | |
+ sysdepref = | |
+ W (domain->must_swap, p->sysdepref); | |
+ if (sysdepref == SEGMENTS_END) | |
+ break; | |
+ | |
+ if (sysdep_segment_values[sysdepref] == NULL) | |
+ { | |
+ /* This particular string pair is | |
+ invalid. */ | |
+ valid = 0; | |
+ break; | |
+ } | |
+ } | |
+ | |
+ if (!valid) | |
+ break; | |
+ } | |
+ | |
+ if (valid) | |
+ { | |
+ for (j = 0; j < 2; j++) | |
+ { | |
+ const struct sysdep_string *sysdep_string = | |
+ (const struct sysdep_string *) | |
+ ((char *) data | |
+ + W (domain->must_swap, | |
+ j == 0 | |
+ ? orig_sysdep_tab[i] | |
+ : trans_sysdep_tab[i])); | |
+ const char *static_segments = | |
+ (char *) data | |
+ + W (domain->must_swap, sysdep_string->offse… | |
+ const struct segment_pair *p = | |
+ sysdep_string->segments; | |
+ | |
+ /* Concatenate the segments, and fill | |
+ inmem_orig_sysdep_tab[k] (for j == 0) and | |
+ inmem_trans_sysdep_tab[k] (for j == 1). */ | |
+ | |
+ struct sysdep_string_desc *inmem_tab_entry = | |
+ (j == 0 | |
+ ? inmem_orig_sysdep_tab | |
+ : inmem_trans_sysdep_tab) | |
+ + k; | |
+ | |
+ if (W (domain->must_swap, p->sysdepref) | |
+ == SEGMENTS_END) | |
+ { | |
+ /* Only one static segment. */ | |
+ inmem_tab_entry->length = | |
+ W (domain->must_swap, p->segsize); | |
+ inmem_tab_entry->pointer = static_segments; | |
+ } | |
+ else | |
+ { | |
+ inmem_tab_entry->pointer = mem; | |
+ | |
+ for (p = sysdep_string->segments;; p++) | |
+ { | |
+ nls_uint32 segsize = | |
+ W (domain->must_swap, p->segsize); | |
+ nls_uint32 sysdepref = | |
+ W (domain->must_swap, p->sysdepref); | |
+ size_t n; | |
+ | |
+ if (segsize > 0) | |
+ { | |
+ memcpy (mem, static_segments, segs… | |
+ mem += segsize; | |
+ static_segments += segsize; | |
+ } | |
+ | |
+ if (sysdepref == SEGMENTS_END) | |
+ break; | |
+ | |
+ n = strlen (sysdep_segment_values[sysd… | |
+ memcpy (mem, sysdep_segment_values[sys… | |
+ mem += n; | |
+ } | |
+ | |
+ inmem_tab_entry->length = | |
+ mem - inmem_tab_entry->pointer; | |
+ } | |
+ } | |
+ | |
+ k++; | |
+ } | |
+ } | |
+ if (k != n_inmem_sysdep_strings) | |
+ abort (); | |
+ | |
+ /* Compute the augmented hash table. */ | |
+ for (i = 0; i < domain->hash_size; i++) | |
+ inmem_hash_tab[i] = | |
+ W (domain->must_swap_hash_tab, domain->hash_tab[i]); | |
+ for (i = 0; i < n_inmem_sysdep_strings; i++) | |
+ { | |
+ const char *msgid = inmem_orig_sysdep_tab[i].pointer; | |
+ 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)); | |
+ | |
+ for (;;) | |
+ { | |
+ if (inmem_hash_tab[idx] == 0) | |
+ { | |
+ /* Hash table entry is empty. Use it. */ | |
+ inmem_hash_tab[idx] = 1 + domain->nstrings + i; | |
+ break; | |
+ } | |
+ | |
+ if (idx >= domain->hash_size - incr) | |
+ idx -= domain->hash_size - incr; | |
+ else | |
+ idx += incr; | |
+ } | |
+ } | |
+ | |
+ domain->n_sysdep_strings = n_inmem_sysdep_strings; | |
+ domain->orig_sysdep_tab = inmem_orig_sysdep_tab; | |
+ domain->trans_sysdep_tab = inmem_trans_sysdep_tab; | |
+ | |
+ domain->hash_tab = inmem_hash_tab; | |
+ domain->must_swap_hash_tab = 0; | |
+ } | |
+ else | |
+ { | |
+ domain->n_sysdep_strings = 0; | |
+ domain->orig_sysdep_tab = NULL; | |
+ domain->trans_sysdep_tab = NULL; | |
+ } | |
+ | |
+ freea (sysdep_segment_values); | |
+ } | |
+ else | |
+ { | |
+ domain->n_sysdep_strings = 0; | |
+ domain->orig_sysdep_tab = NULL; | |
+ domain->trans_sysdep_tab = NULL; | |
+ } | |
+ } | |
+ break; | |
+ } | |
break; | |
default: | |
/* This is an invalid revision. */ | |
+ invalid: | |
+ /* This is an invalid .mo file. */ | |
+ free (domain->malloced); | |
#ifdef HAVE_MMAP | |
if (use_mmap) | |
munmap ((caddr_t) data, size); | |
t@@ -481,78 +1268,58 @@ _nl_load_domain (domain_file, domainbinding) | |
free (data); | |
free (domain); | |
domain_file->data = NULL; | |
- return; | |
+ goto out; | |
} | |
- /* Now initialize the character set converter from the character set | |
- the file is encoded with (found in the header entry) to the domain's | |
- specified character set or the locale's character set. */ | |
- nullentry = _nl_init_domain_conv (domain_file, domain, domainbinding); | |
+ /* No caches of converted translations so far. */ | |
+ domain->conversions = NULL; | |
+ domain->nconversions = 0; | |
+ gl_rwlock_init (domain->conversions_lock); | |
- /* Also look for a plural specification. */ | |
- if (nullentry != NULL) | |
- { | |
- const char *plural; | |
- const char *nplurals; | |
- | |
- plural = strstr (nullentry, "plural="); | |
- nplurals = strstr (nullentry, "nplurals="); | |
- if (plural == NULL || nplurals == NULL) | |
- goto no_plural; | |
- else | |
- { | |
- /* First get the number. */ | |
- char *endp; | |
- unsigned long int n; | |
- struct parse_args args; | |
- | |
- nplurals += 9; | |
- while (*nplurals != '\0' && isspace (*nplurals)) | |
- ++nplurals; | |
-#if defined HAVE_STRTOUL || defined _LIBC | |
- n = strtoul (nplurals, &endp, 10); | |
+ /* Get the header entry and look for a plural specification. */ | |
+#ifdef IN_LIBGLOCALE | |
+ nullentry = | |
+ _nl_find_msg (domain_file, domainbinding, NULL, "", &nullentrylen); | |
#else | |
- for (endp = nplurals, n = 0; *endp >= '0' && *endp <= '9'; endp++) | |
- n = n * 10 + (*endp - '0'); | |
-#endif | |
- domain->nplurals = n; | |
- if (nplurals == endp) | |
- goto no_plural; | |
- | |
- /* Due to the restrictions bison imposes onto the interface of the | |
- scanner function we have to put the input string and the result | |
- passed up from the parser into the same structure which address | |
- is passed down to the parser. */ | |
- plural += 7; | |
- args.cp = plural; | |
- if (PLURAL_PARSE (&args) != 0) | |
- goto no_plural; | |
- domain->plural = args.res; | |
- } | |
- } | |
- else | |
- { | |
- /* By default we are using the Germanic form: singular form only | |
- for `one', the plural form otherwise. Yes, this is also what | |
- English is using since English is a Germanic language. */ | |
- no_plural: | |
- INIT_GERMANIC_PLURAL (); | |
- domain->plural = &germanic_plural; | |
- domain->nplurals = 2; | |
- } | |
+ nullentry = _nl_find_msg (domain_file, domainbinding, "", 0, &nullentrylen); | |
+#endif | |
+ EXTRACT_PLURAL_EXPRESSION (nullentry, &domain->plural, &domain->nplurals); | |
+ | |
+ out: | |
+ if (fd != -1) | |
+ close (fd); | |
+ | |
+ domain_file->decided = 1; | |
+ | |
+ done: | |
+ __libc_lock_unlock_recursive (lock); | |
} | |
#ifdef _LIBC | |
void | |
-internal_function | |
-_nl_unload_domain (domain) | |
- struct loaded_domain *domain; | |
+internal_function __libc_freeres_fn_section | |
+_nl_unload_domain (struct loaded_domain *domain) | |
{ | |
- if (domain->plural != &germanic_plural) | |
- __gettext_free_exp (domain->plural); | |
+ size_t i; | |
+ | |
+ if (domain->plural != &__gettext_germanic_plural) | |
+ __gettext_free_exp ((struct expression *) domain->plural); | |
+ | |
+ for (i = 0; i < domain->nconversions; i++) | |
+ { | |
+ struct converted_domain *convd = &domain->conversions[i]; | |
+ | |
+ free (convd->encoding); | |
+ if (convd->conv_tab != NULL && convd->conv_tab != (char **) -1) | |
+ free (convd->conv_tab); | |
+ if (convd->conv != (__gconv_t) -1) | |
+ __gconv_close (convd->conv); | |
+ } | |
+ free (domain->conversions); | |
+ __libc_rwlock_fini (domain->conversions_lock); | |
- _nl_free_domain_conv (domain); | |
+ free (domain->malloced); | |
# ifdef _POSIX_MAPPED_FILES | |
if (domain->use_mmap) | |
diff --git a/intl/localcharset.c b/intl/localcharset.c | |
t@@ -1,6 +1,6 @@ | |
/* Determine a canonical name for the current locale's character encoding. | |
- Copyright (C) 2000-2001 Free Software Foundation, Inc. | |
+ Copyright (C) 2000-2006, 2008-2010 Free Software Foundation, Inc. | |
This program is free software; you can redistribute it and/or modify it | |
under the terms of the GNU Library General Public License as published | |
t@@ -14,46 +14,79 @@ | |
You should have received a copy of the GNU Library 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, | |
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, | |
USA. */ | |
-/* Written by Bruno Haible <[email protected]>. */ | |
+/* Written by Bruno Haible <[email protected]>. */ | |
-#ifdef HAVE_CONFIG_H | |
-# include <config.h> | |
-#endif | |
+#include <config.h> | |
-#if HAVE_STDDEF_H | |
-# include <stddef.h> | |
-#endif | |
+/* Specification. */ | |
+#include "localcharset.h" | |
+#include <fcntl.h> | |
+#include <stddef.h> | |
#include <stdio.h> | |
-#if HAVE_STRING_H | |
-# include <string.h> | |
-#else | |
-# include <strings.h> | |
-#endif | |
-#if HAVE_STDLIB_H | |
-# include <stdlib.h> | |
+#include <string.h> | |
+#include <stdlib.h> | |
+ | |
+#if defined __APPLE__ && defined __MACH__ && HAVE_LANGINFO_CODESET | |
+# define DARWIN7 /* Darwin 7 or newer, i.e. MacOS X 10.3 or newer */ | |
#endif | |
#if defined _WIN32 || defined __WIN32__ | |
-# undef WIN32 /* avoid warning on mingw32 */ | |
-# define WIN32 | |
+# define WIN32_NATIVE | |
#endif | |
-#ifndef WIN32 | |
+#if defined __EMX__ | |
+/* Assume EMX program runs on OS/2, even if compiled under DOS. */ | |
+# ifndef OS2 | |
+# define OS2 | |
+# endif | |
+#endif | |
+ | |
+#if !defined WIN32_NATIVE | |
+# include <unistd.h> | |
# if HAVE_LANGINFO_CODESET | |
# include <langinfo.h> | |
# else | |
-# if HAVE_SETLOCALE | |
+# if 0 /* see comment below */ | |
# include <locale.h> | |
# endif | |
# endif | |
-#else /* WIN32 */ | |
+# ifdef __CYGWIN__ | |
+# define WIN32_LEAN_AND_MEAN | |
+# include <windows.h> | |
+# endif | |
+#elif defined WIN32_NATIVE | |
# define WIN32_LEAN_AND_MEAN | |
# include <windows.h> | |
#endif | |
+#if defined OS2 | |
+# define INCL_DOS | |
+# include <os2.h> | |
+#endif | |
+ | |
+#if ENABLE_RELOCATABLE | |
+# include "relocatable.h" | |
+#else | |
+# define relocate(pathname) (pathname) | |
+#endif | |
+ | |
+/* Get LIBDIR. */ | |
+#ifndef LIBDIR | |
+# include "configmake.h" | |
+#endif | |
+ | |
+/* Define O_NOFOLLOW to 0 on platforms where it does not exist. */ | |
+#ifndef O_NOFOLLOW | |
+# define O_NOFOLLOW 0 | |
+#endif | |
+ | |
+#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX… | |
+ /* Win32, Cygwin, OS/2, DOS */ | |
+# define ISSLASH(C) ((C) == '/' || (C) == '\\') | |
+#endif | |
#ifndef DIRECTORY_SEPARATOR | |
# define DIRECTORY_SEPARATOR '/' | |
t@@ -63,6 +96,11 @@ | |
# define ISSLASH(C) ((C) == DIRECTORY_SEPARATOR) | |
#endif | |
+#if HAVE_DECL_GETC_UNLOCKED | |
+# undef getc | |
+# define getc getc_unlocked | |
+#endif | |
+ | |
/* The following static variable is declared 'volatile' to avoid a | |
possible multithread problem in the function get_charset_aliases. If we | |
are running in a threaded environment, and if two threads initialize | |
t@@ -75,113 +113,232 @@ | |
/* Pointer to the contents of the charset.alias file, if it has already been | |
read, else NULL. Its format is: | |
ALIAS_1 '\0' CANONICAL_1 '\0' ... ALIAS_n '\0' CANONICAL_n '\0' '\0' */ | |
-static char * volatile charset_aliases; | |
+static const char * volatile charset_aliases; | |
/* Return a pointer to the contents of the charset.alias file. */ | |
static const char * | |
-get_charset_aliases () | |
+get_charset_aliases (void) | |
{ | |
- char *cp; | |
+ const char *cp; | |
cp = charset_aliases; | |
if (cp == NULL) | |
{ | |
-#ifndef WIN32 | |
- FILE *fp; | |
- const char *dir = LIBDIR; | |
+#if !(defined DARWIN7 || defined VMS || defined WIN32_NATIVE || defined __CYGW… | |
+ const char *dir; | |
const char *base = "charset.alias"; | |
char *file_name; | |
+ /* Make it possible to override the charset.alias location. This is | |
+ necessary for running the testsuite before "make install". */ | |
+ dir = getenv ("CHARSETALIASDIR"); | |
+ if (dir == NULL || dir[0] == '\0') | |
+ dir = relocate (LIBDIR); | |
+ | |
/* Concatenate dir and base into freshly allocated file_name. */ | |
{ | |
- size_t dir_len = strlen (dir); | |
- size_t base_len = strlen (base); | |
- int add_slash = (dir_len > 0 && !ISSLASH (dir[dir_len - 1])); | |
- file_name = (char *) malloc (dir_len + add_slash + base_len + 1); | |
- if (file_name != NULL) | |
- { | |
- memcpy (file_name, dir, dir_len); | |
- if (add_slash) | |
- file_name[dir_len] = DIRECTORY_SEPARATOR; | |
- memcpy (file_name + dir_len + add_slash, base, base_len + 1); | |
- } | |
+ size_t dir_len = strlen (dir); | |
+ size_t base_len = strlen (base); | |
+ int add_slash = (dir_len > 0 && !ISSLASH (dir[dir_len - 1])); | |
+ file_name = (char *) malloc (dir_len + add_slash + base_len + 1); | |
+ if (file_name != NULL) | |
+ { | |
+ memcpy (file_name, dir, dir_len); | |
+ if (add_slash) | |
+ file_name[dir_len] = DIRECTORY_SEPARATOR; | |
+ memcpy (file_name + dir_len + add_slash, base, base_len + 1); | |
+ } | |
} | |
- if (file_name == NULL || (fp = fopen (file_name, "r")) == NULL) | |
- /* Out of memory or file not found, treat it as empty. */ | |
- cp = ""; | |
+ if (file_name == NULL) | |
+ /* Out of memory. Treat the file as empty. */ | |
+ cp = ""; | |
else | |
- { | |
- /* Parse the file's contents. */ | |
- int c; | |
- char buf1[50+1]; | |
- char buf2[50+1]; | |
- char *res_ptr = NULL; | |
- size_t res_size = 0; | |
- size_t l1, l2; | |
- | |
- for (;;) | |
- { | |
- c = getc (fp); | |
- if (c == EOF) | |
- break; | |
- if (c == '\n' || c == ' ' || c == '\t') | |
- continue; | |
- if (c == '#') | |
- { | |
- /* Skip comment, to end of line. */ | |
- do | |
- c = getc (fp); | |
- while (!(c == EOF || c == '\n')); | |
- if (c == EOF) | |
- break; | |
- continue; | |
- } | |
- ungetc (c, fp); | |
- if (fscanf(fp, "%50s %50s", buf1, buf2) < 2) | |
- break; | |
- l1 = strlen (buf1); | |
- l2 = strlen (buf2); | |
- if (res_size == 0) | |
- { | |
- res_size = l1 + 1 + l2 + 1; | |
- res_ptr = malloc (res_size + 1); | |
- } | |
- else | |
- { | |
- res_size += l1 + 1 + l2 + 1; | |
- res_ptr = realloc (res_ptr, res_size + 1); | |
- } | |
- if (res_ptr == NULL) | |
- { | |
- /* Out of memory. */ | |
- res_size = 0; | |
- break; | |
- } | |
- strcpy (res_ptr + res_size - (l2 + 1) - (l1 + 1), buf1); | |
- strcpy (res_ptr + res_size - (l2 + 1), buf2); | |
- } | |
- fclose (fp); | |
- if (res_size == 0) | |
- cp = ""; | |
- else | |
- { | |
- *(res_ptr + res_size) = '\0'; | |
- cp = res_ptr; | |
- } | |
- } | |
- | |
- if (file_name != NULL) | |
- free (file_name); | |
- | |
-#else /* WIN32 */ | |
+ { | |
+ int fd; | |
+ | |
+ /* Open the file. Reject symbolic links on platforms that support | |
+ O_NOFOLLOW. This is a security feature. Without it, an attacker | |
+ could retrieve parts of the contents (namely, the tail of the | |
+ first line that starts with "* ") of an arbitrary file by placing | |
+ a symbolic link to that file under the name "charset.alias" in | |
+ some writable directory and defining the environment variable | |
+ CHARSETALIASDIR to point to that directory. */ | |
+ fd = open (file_name, | |
+ O_RDONLY | (HAVE_WORKING_O_NOFOLLOW ? O_NOFOLLOW : 0)); | |
+ if (fd < 0) | |
+ /* File not found. Treat it as empty. */ | |
+ cp = ""; | |
+ else | |
+ { | |
+ FILE *fp; | |
+ | |
+ fp = fdopen (fd, "r"); | |
+ if (fp == NULL) | |
+ { | |
+ /* Out of memory. Treat the file as empty. */ | |
+ close (fd); | |
+ cp = ""; | |
+ } | |
+ else | |
+ { | |
+ /* Parse the file's contents. */ | |
+ char *res_ptr = NULL; | |
+ size_t res_size = 0; | |
+ | |
+ for (;;) | |
+ { | |
+ int c; | |
+ char buf1[50+1]; | |
+ char buf2[50+1]; | |
+ size_t l1, l2; | |
+ char *old_res_ptr; | |
+ | |
+ c = getc (fp); | |
+ if (c == EOF) | |
+ break; | |
+ if (c == '\n' || c == ' ' || c == '\t') | |
+ continue; | |
+ if (c == '#') | |
+ { | |
+ /* Skip comment, to end of line. */ | |
+ do | |
+ c = getc (fp); | |
+ while (!(c == EOF || c == '\n')); | |
+ if (c == EOF) | |
+ break; | |
+ continue; | |
+ } | |
+ ungetc (c, fp); | |
+ if (fscanf (fp, "%50s %50s", buf1, buf2) < 2) | |
+ break; | |
+ l1 = strlen (buf1); | |
+ l2 = strlen (buf2); | |
+ old_res_ptr = res_ptr; | |
+ if (res_size == 0) | |
+ { | |
+ res_size = l1 + 1 + l2 + 1; | |
+ res_ptr = (char *) malloc (res_size + 1); | |
+ } | |
+ else | |
+ { | |
+ res_size += l1 + 1 + l2 + 1; | |
+ res_ptr = (char *) realloc (res_ptr, res_size + 1); | |
+ } | |
+ if (res_ptr == NULL) | |
+ { | |
+ /* Out of memory. */ | |
+ res_size = 0; | |
+ if (old_res_ptr != NULL) | |
+ free (old_res_ptr); | |
+ break; | |
+ } | |
+ strcpy (res_ptr + res_size - (l2 + 1) - (l1 + 1), buf1); | |
+ strcpy (res_ptr + res_size - (l2 + 1), buf2); | |
+ } | |
+ fclose (fp); | |
+ if (res_size == 0) | |
+ cp = ""; | |
+ else | |
+ { | |
+ *(res_ptr + res_size) = '\0'; | |
+ cp = res_ptr; | |
+ } | |
+ } | |
+ } | |
+ | |
+ free (file_name); | |
+ } | |
+ | |
+#else | |
+ | |
+# if defined DARWIN7 | |
+ /* To avoid the trouble of installing a file that is shared by many | |
+ GNU packages -- many packaging systems have problems with this --, | |
+ simply inline the aliases here. */ | |
+ cp = "ISO8859-1" "\0" "ISO-8859-1" "\0" | |
+ "ISO8859-2" "\0" "ISO-8859-2" "\0" | |
+ "ISO8859-4" "\0" "ISO-8859-4" "\0" | |
+ "ISO8859-5" "\0" "ISO-8859-5" "\0" | |
+ "ISO8859-7" "\0" "ISO-8859-7" "\0" | |
+ "ISO8859-9" "\0" "ISO-8859-9" "\0" | |
+ "ISO8859-13" "\0" "ISO-8859-13" "\0" | |
+ "ISO8859-15" "\0" "ISO-8859-15" "\0" | |
+ "KOI8-R" "\0" "KOI8-R" "\0" | |
+ "KOI8-U" "\0" "KOI8-U" "\0" | |
+ "CP866" "\0" "CP866" "\0" | |
+ "CP949" "\0" "CP949" "\0" | |
+ "CP1131" "\0" "CP1131" "\0" | |
+ "CP1251" "\0" "CP1251" "\0" | |
+ "eucCN" "\0" "GB2312" "\0" | |
+ "GB2312" "\0" "GB2312" "\0" | |
+ "eucJP" "\0" "EUC-JP" "\0" | |
+ "eucKR" "\0" "EUC-KR" "\0" | |
+ "Big5" "\0" "BIG5" "\0" | |
+ "Big5HKSCS" "\0" "BIG5-HKSCS" "\0" | |
+ "GBK" "\0" "GBK" "\0" | |
+ "GB18030" "\0" "GB18030" "\0" | |
+ "SJIS" "\0" "SHIFT_JIS" "\0" | |
+ "ARMSCII-8" "\0" "ARMSCII-8" "\0" | |
+ "PT154" "\0" "PT154" "\0" | |
+ /*"ISCII-DEV" "\0" "?" "\0"*/ | |
+ "*" "\0" "UTF-8" "\0"; | |
+# endif | |
+ | |
+# if defined VMS | |
+ /* To avoid the troubles of an extra file charset.alias_vms in the | |
+ sources of many GNU packages, simply inline the aliases here. */ | |
+ /* The list of encodings is taken from the OpenVMS 7.3-1 documentation | |
+ "Compaq C Run-Time Library Reference Manual for OpenVMS systems" | |
+ section 10.7 "Handling Different Character Sets". */ | |
+ cp = "ISO8859-1" "\0" "ISO-8859-1" "\0" | |
+ "ISO8859-2" "\0" "ISO-8859-2" "\0" | |
+ "ISO8859-5" "\0" "ISO-8859-5" "\0" | |
+ "ISO8859-7" "\0" "ISO-8859-7" "\0" | |
+ "ISO8859-8" "\0" "ISO-8859-8" "\0" | |
+ "ISO8859-9" "\0" "ISO-8859-9" "\0" | |
+ /* Japanese */ | |
+ "eucJP" "\0" "EUC-JP" "\0" | |
+ "SJIS" "\0" "SHIFT_JIS" "\0" | |
+ "DECKANJI" "\0" "DEC-KANJI" "\0" | |
+ "SDECKANJI" "\0" "EUC-JP" "\0" | |
+ /* Chinese */ | |
+ "eucTW" "\0" "EUC-TW" "\0" | |
+ "DECHANYU" "\0" "DEC-HANYU" "\0" | |
+ "DECHANZI" "\0" "GB2312" "\0" | |
+ /* Korean */ | |
+ "DECKOREAN" "\0" "EUC-KR" "\0"; | |
+# endif | |
+# if defined WIN32_NATIVE || defined __CYGWIN__ | |
/* To avoid the troubles of installing a separate file in the same | |
- directory as the DLL and of retrieving the DLL's directory at | |
- runtime, simply inline the aliases here. */ | |
+ directory as the DLL and of retrieving the DLL's directory at | |
+ runtime, simply inline the aliases here. */ | |
cp = "CP936" "\0" "GBK" "\0" | |
- "CP1361" "\0" "JOHAB" "\0"; | |
+ "CP1361" "\0" "JOHAB" "\0" | |
+ "CP20127" "\0" "ASCII" "\0" | |
+ "CP20866" "\0" "KOI8-R" "\0" | |
+ "CP20936" "\0" "GB2312" "\0" | |
+ "CP21866" "\0" "KOI8-RU" "\0" | |
+ "CP28591" "\0" "ISO-8859-1" "\0" | |
+ "CP28592" "\0" "ISO-8859-2" "\0" | |
+ "CP28593" "\0" "ISO-8859-3" "\0" | |
+ "CP28594" "\0" "ISO-8859-4" "\0" | |
+ "CP28595" "\0" "ISO-8859-5" "\0" | |
+ "CP28596" "\0" "ISO-8859-6" "\0" | |
+ "CP28597" "\0" "ISO-8859-7" "\0" | |
+ "CP28598" "\0" "ISO-8859-8" "\0" | |
+ "CP28599" "\0" "ISO-8859-9" "\0" | |
+ "CP28605" "\0" "ISO-8859-15" "\0" | |
+ "CP38598" "\0" "ISO-8859-8" "\0" | |
+ "CP51932" "\0" "EUC-JP" "\0" | |
+ "CP51936" "\0" "GB2312" "\0" | |
+ "CP51949" "\0" "EUC-KR" "\0" | |
+ "CP51950" "\0" "EUC-TW" "\0" | |
+ "CP54936" "\0" "GB18030" "\0" | |
+ "CP65001" "\0" "UTF-8" "\0"; | |
+# endif | |
#endif | |
charset_aliases = cp; | |
t@@ -200,18 +357,74 @@ get_charset_aliases () | |
STATIC | |
#endif | |
const char * | |
-locale_charset () | |
+locale_charset (void) | |
{ | |
const char *codeset; | |
const char *aliases; | |
-#ifndef WIN32 | |
+#if !(defined WIN32_NATIVE || defined OS2) | |
# if HAVE_LANGINFO_CODESET | |
/* Most systems support nl_langinfo (CODESET) nowadays. */ | |
codeset = nl_langinfo (CODESET); | |
+# ifdef __CYGWIN__ | |
+ /* Cygwin < 1.7 does not have locales. nl_langinfo (CODESET) always | |
+ returns "US-ASCII". Return the suffix of the locale name from the | |
+ environment variables (if present) or the codepage as a number. */ | |
+ if (codeset != NULL && strcmp (codeset, "US-ASCII") == 0) | |
+ { | |
+ const char *locale; | |
+ static char buf[2 + 10 + 1]; | |
+ | |
+ locale = getenv ("LC_ALL"); | |
+ if (locale == NULL || locale[0] == '\0') | |
+ { | |
+ locale = getenv ("LC_CTYPE"); | |
+ if (locale == NULL || locale[0] == '\0') | |
+ locale = getenv ("LANG"); | |
+ } | |
+ if (locale != NULL && locale[0] != '\0') | |
+ { | |
+ /* If the locale name contains an encoding after the dot, return | |
+ it. */ | |
+ const char *dot = strchr (locale, '.'); | |
+ | |
+ if (dot != NULL) | |
+ { | |
+ const char *modifier; | |
+ | |
+ dot++; | |
+ /* Look for the possible @... trailer and remove it, if any. */ | |
+ modifier = strchr (dot, '@'); | |
+ if (modifier == NULL) | |
+ return dot; | |
+ if (modifier - dot < sizeof (buf)) | |
+ { | |
+ memcpy (buf, dot, modifier - dot); | |
+ buf [modifier - dot] = '\0'; | |
+ return buf; | |
+ } | |
+ } | |
+ } | |
+ | |
+ /* Woe32 has a function returning the locale's codepage as a number: | |
+ GetACP(). This encoding is used by Cygwin, unless the user has set | |
+ the environment variable CYGWIN=codepage:oem (which very few people | |
+ do). | |
+ Output directed to console windows needs to be converted (to | |
+ GetOEMCP() if the console is using a raster font, or to | |
+ GetConsoleOutputCP() if it is using a TrueType font). Cygwin does | |
+ this conversion transparently (see winsup/cygwin/fhandler_console.cc), | |
+ converting to GetConsoleOutputCP(). This leads to correct results, | |
+ except when SetConsoleOutputCP has been called and a raster font is | |
+ in use. */ | |
+ sprintf (buf, "CP%u", GetACP ()); | |
+ codeset = buf; | |
+ } | |
+# endif | |
+ | |
# else | |
/* On old systems which lack it, use setlocale or getenv. */ | |
t@@ -221,18 +434,18 @@ locale_charset () | |
(like SunOS 4 or DJGPP) have only the C locale. Therefore we don't | |
use setlocale here; it would return "C" when it doesn't support the | |
locale name the user has set. */ | |
-# if HAVE_SETLOCALE && 0 | |
+# if 0 | |
locale = setlocale (LC_CTYPE, NULL); | |
# endif | |
if (locale == NULL || locale[0] == '\0') | |
{ | |
locale = getenv ("LC_ALL"); | |
if (locale == NULL || locale[0] == '\0') | |
- { | |
- locale = getenv ("LC_CTYPE"); | |
- if (locale == NULL || locale[0] == '\0') | |
- locale = getenv ("LANG"); | |
- } | |
+ { | |
+ locale = getenv ("LC_CTYPE"); | |
+ if (locale == NULL || locale[0] == '\0') | |
+ locale = getenv ("LANG"); | |
+ } | |
} | |
/* On some old systems, one used to set locale = "iso8859_1". On others, | |
t@@ -242,14 +455,73 @@ locale_charset () | |
# endif | |
-#else /* WIN32 */ | |
+#elif defined WIN32_NATIVE | |
static char buf[2 + 10 + 1]; | |
- /* Win32 has a function returning the locale's codepage as a number. */ | |
+ /* Woe32 has a function returning the locale's codepage as a number: | |
+ GetACP(). | |
+ When the output goes to a console window, it needs to be provided in | |
+ GetOEMCP() encoding if the console is using a raster font, or in | |
+ GetConsoleOutputCP() encoding if it is using a TrueType font. | |
+ But in GUI programs and for output sent to files and pipes, GetACP() | |
+ encoding is the best bet. */ | |
sprintf (buf, "CP%u", GetACP ()); | |
codeset = buf; | |
+#elif defined OS2 | |
+ | |
+ const char *locale; | |
+ static char buf[2 + 10 + 1]; | |
+ ULONG cp[3]; | |
+ ULONG cplen; | |
+ | |
+ /* Allow user to override the codeset, as set in the operating system, | |
+ with standard language environment variables. */ | |
+ locale = getenv ("LC_ALL"); | |
+ if (locale == NULL || locale[0] == '\0') | |
+ { | |
+ locale = getenv ("LC_CTYPE"); | |
+ if (locale == NULL || locale[0] == '\0') | |
+ locale = getenv ("LANG"); | |
+ } | |
+ if (locale != NULL && locale[0] != '\0') | |
+ { | |
+ /* If the locale name contains an encoding after the dot, return it. */ | |
+ const char *dot = strchr (locale, '.'); | |
+ | |
+ if (dot != NULL) | |
+ { | |
+ const char *modifier; | |
+ | |
+ dot++; | |
+ /* Look for the possible @... trailer and remove it, if any. */ | |
+ modifier = strchr (dot, '@'); | |
+ if (modifier == NULL) | |
+ return dot; | |
+ if (modifier - dot < sizeof (buf)) | |
+ { | |
+ memcpy (buf, dot, modifier - dot); | |
+ buf [modifier - dot] = '\0'; | |
+ return buf; | |
+ } | |
+ } | |
+ | |
+ /* Resolve through the charset.alias file. */ | |
+ codeset = locale; | |
+ } | |
+ else | |
+ { | |
+ /* OS/2 has a function returning the locale's codepage as a number. */ | |
+ if (DosQueryCp (sizeof (cp), cp, &cplen)) | |
+ codeset = ""; | |
+ else | |
+ { | |
+ sprintf (buf, "CP%u", cp[0]); | |
+ codeset = buf; | |
+ } | |
+ } | |
+ | |
#endif | |
if (codeset == NULL) | |
t@@ -261,11 +533,17 @@ locale_charset () | |
*aliases != '\0'; | |
aliases += strlen (aliases) + 1, aliases += strlen (aliases) + 1) | |
if (strcmp (codeset, aliases) == 0 | |
- || (aliases[0] == '*' && aliases[1] == '\0')) | |
+ || (aliases[0] == '*' && aliases[1] == '\0')) | |
{ | |
- codeset = aliases + strlen (aliases) + 1; | |
- break; | |
+ codeset = aliases + strlen (aliases) + 1; | |
+ break; | |
} | |
+ /* Don't return an empty string. GNU libc and GNU libiconv interpret | |
+ the empty string as denoting "the locale's character encoding", | |
+ thus GNU libiconv would call this function a second time. */ | |
+ if (codeset[0] == '\0') | |
+ codeset = "ASCII"; | |
+ | |
return codeset; | |
} | |
diff --git a/intl/locale.alias b/intl/locale.alias | |
t@@ -1,19 +1,20 @@ | |
# Locale name alias data base. | |
-# Copyright (C) 1996,1997,1998,1999,2000,2001 Free Software Foundation, Inc. | |
+# Copyright (C) 1996-2001,2003,2007 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) | |
+# This program is free software; you can redistribute it and/or modify it | |
+# under the terms of the GNU Library General Public License as published | |
+# by the Free Software Foundation; either version 2, 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. | |
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
+# Library General Public License for more details. | |
# | |
-# You should have received a copy of the GNU General Public License | |
-# along with this program; if not, write to the Free Software | |
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |
+# You should have received a copy of the GNU Library General Public | |
+# License along with this program; if not, write to the Free Software | |
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, | |
+# USA. | |
# The format of this file is the same as for the corresponding file of | |
# the X Window System, which normally can be found in | |
t@@ -21,15 +22,14 @@ | |
# A single line contains two fields: an alias and a substitution value. | |
# All entries are case independent. | |
-# Note: This file is far from being complete. If you have a value for | |
-# your own site which you think might be useful for others too, share | |
-# it with the rest of us. Send it using the `glibcbug' script to | |
-# [email protected]. | |
+# Note: This file is obsolete and is kept around for the time being for | |
+# backward compatibility. Nobody should rely on the names defined here. | |
+# Locales should always be specified by their full name. | |
# Packages using this file: | |
-bokmal no_NO.ISO-8859-1 | |
-bokm�l no_NO.ISO-8859-1 | |
+bokmal nb_NO.ISO-8859-1 | |
+bokm�l nb_NO.ISO-8859-1 | |
catalan ca_ES.ISO-8859-1 | |
croatian hr_HR.ISO-8859-2 | |
czech cs_CZ.ISO-8859-2 | |
t@@ -46,7 +46,7 @@ galego gl_ES.ISO-8859-1 | |
galician gl_ES.ISO-8859-1 | |
german de_DE.ISO-8859-1 | |
greek el_GR.ISO-8859-7 | |
-hebrew iw_IL.ISO-8859-8 | |
+hebrew he_IL.ISO-8859-8 | |
hrvatski hr_HR.ISO-8859-2 | |
hungarian hu_HU.ISO-8859-2 | |
icelandic is_IS.ISO-8859-1 | |
t@@ -60,9 +60,9 @@ korean ko_KR.eucKR | |
korean.euc ko_KR.eucKR | |
ko_KR ko_KR.eucKR | |
lithuanian lt_LT.ISO-8859-13 | |
-nb_NO no_NO.ISO-8859-1 | |
-nb_NO.ISO-8859-1 no_NO.ISO-8859-1 | |
-norwegian no_NO.ISO-8859-1 | |
+no_NO nb_NO.ISO-8859-1 | |
+no_NO.ISO-8859-1 nb_NO.ISO-8859-1 | |
+norwegian nb_NO.ISO-8859-1 | |
nynorsk nn_NO.ISO-8859-1 | |
polish pl_PL.ISO-8859-2 | |
portuguese pt_PT.ISO-8859-1 | |
diff --git a/intl/localealias.c b/intl/localealias.c | |
t@@ -1,19 +1,20 @@ | |
/* Handle aliases for locale names. | |
- Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc. | |
+ Copyright (C) 1995-1999, 2000-2001, 2003, 2005-2006 Free Software Foundatio… | |
- 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) | |
+ This program is free software; you can redistribute it and/or modify it | |
+ under the terms of the GNU Library General Public License as published | |
+ by the Free Software Foundation; either version 2, 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. | |
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
+ Library General Public License for more details. | |
- You should have received a copy of the GNU General Public License | |
- along with this program; if not, write to the Free Software Foundation, | |
- Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |
+ You should have received a copy of the GNU Library General Public | |
+ License along with this program; if not, write to the Free Software | |
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, | |
+ USA. */ | |
/* Tell glibc's <string.h> to provide a prototype for mempcpy(). | |
This must come before <config.h> because <config.h> may include | |
t@@ -28,36 +29,45 @@ | |
#include <ctype.h> | |
#include <stdio.h> | |
+#if defined _LIBC || defined HAVE___FSETLOCKING | |
+# include <stdio_ext.h> | |
+#endif | |
#include <sys/types.h> | |
#ifdef __GNUC__ | |
+# undef alloca | |
# define alloca __builtin_alloca | |
# define HAVE_ALLOCA 1 | |
#else | |
-# if defined HAVE_ALLOCA_H || defined _LIBC | |
-# include <alloca.h> | |
+# ifdef _MSC_VER | |
+# include <malloc.h> | |
+# define alloca _alloca | |
# else | |
-# ifdef _AIX | |
- #pragma alloca | |
+# if defined HAVE_ALLOCA_H || defined _LIBC | |
+# include <alloca.h> | |
# else | |
-# ifndef alloca | |
+# ifdef _AIX | |
+ #pragma alloca | |
+# else | |
+# ifndef alloca | |
char *alloca (); | |
+# endif | |
# endif | |
# endif | |
# endif | |
#endif | |
#include <stdlib.h> | |
- | |
#include <string.h> | |
-#if !HAVE_STRCHR && !defined _LIBC | |
-# ifndef strchr | |
-# define strchr index | |
-# endif | |
-#endif | |
#include "gettextP.h" | |
+#if ENABLE_RELOCATABLE | |
+# include "relocatable.h" | |
+#else | |
+# define relocate(pathname) (pathname) | |
+#endif | |
+ | |
/* @@ end of prolog @@ */ | |
#ifdef _LIBC | |
t@@ -70,17 +80,29 @@ char *alloca (); | |
# define mempcpy __mempcpy | |
# endif | |
# define HAVE_MEMPCPY 1 | |
+# define HAVE___FSETLOCKING 1 | |
+#endif | |
-/* We need locking here since we can be called from different places. */ | |
+/* Handle multi-threaded applications. */ | |
+#ifdef _LIBC | |
# include <bits/libc-lock.h> | |
- | |
-__libc_lock_define_initialized (static, lock); | |
+#else | |
+# include "lock.h" | |
#endif | |
#ifndef internal_function | |
# define internal_function | |
#endif | |
+/* Some optimizations for glibc. */ | |
+#ifdef _LIBC | |
+# define FEOF(fp) feof_unlocked (fp) | |
+# define FGETS(buf, n, fp) fgets_unlocked (buf, n, fp) | |
+#else | |
+# define FEOF(fp) feof (fp) | |
+# define FGETS(buf, n, fp) fgets (buf, n, fp) | |
+#endif | |
+ | |
/* For those losing systems which don't have `alloca' we have to add | |
some additional code emulating it. */ | |
#ifdef HAVE_ALLOCA | |
t@@ -90,16 +112,19 @@ __libc_lock_define_initialized (static, lock); | |
# define freea(p) free (p) | |
#endif | |
-#if defined _LIBC_REENTRANT || defined HAVE_FGETS_UNLOCKED | |
+#if defined _LIBC_REENTRANT || HAVE_DECL_FGETS_UNLOCKED | |
# undef fgets | |
# define fgets(buf, len, s) fgets_unlocked (buf, len, s) | |
#endif | |
-#if defined _LIBC_REENTRANT || defined HAVE_FEOF_UNLOCKED | |
+#if defined _LIBC_REENTRANT || HAVE_DECL_FEOF_UNLOCKED | |
# undef feof | |
# define feof(s) feof_unlocked (s) | |
#endif | |
+__libc_lock_define_initialized (static, lock) | |
+ | |
+ | |
struct alias_map | |
{ | |
const char *alias; | |
t@@ -107,34 +132,38 @@ struct alias_map | |
}; | |
-static char *string_space; | |
+#ifndef _LIBC | |
+# define libc_freeres_ptr(decl) decl | |
+#endif | |
+ | |
+libc_freeres_ptr (static char *string_space); | |
static size_t string_space_act; | |
static size_t string_space_max; | |
-static struct alias_map *map; | |
+libc_freeres_ptr (static struct alias_map *map); | |
static size_t nmap; | |
static size_t maxmap; | |
/* Prototypes for local functions. */ | |
-static size_t read_alias_file PARAMS ((const char *fname, int fname_len)) | |
+static size_t read_alias_file (const char *fname, int fname_len) | |
internal_function; | |
-static int extend_alias_table PARAMS ((void)); | |
-static int alias_compare PARAMS ((const struct alias_map *map1, | |
- const struct alias_map *map2)); | |
+static int extend_alias_table (void); | |
+static int alias_compare (const struct alias_map *map1, | |
+ const struct alias_map *map2); | |
const char * | |
-_nl_expand_alias (name) | |
- const char *name; | |
+_nl_expand_alias (const char *name) | |
{ | |
- static const char *locale_alias_path = LOCALE_ALIAS_PATH; | |
+ static const char *locale_alias_path; | |
struct alias_map *retval; | |
const char *result = NULL; | |
size_t added; | |
-#ifdef _LIBC | |
__libc_lock_lock (lock); | |
-#endif | |
+ | |
+ if (locale_alias_path == NULL) | |
+ locale_alias_path = LOCALE_ALIAS_PATH; | |
do | |
{ | |
t@@ -145,8 +174,8 @@ _nl_expand_alias (name) | |
if (nmap > 0) | |
retval = (struct alias_map *) bsearch (&item, map, nmap, | |
sizeof (struct alias_map), | |
- (int (*) PARAMS ((const void *, | |
- const void *)) | |
+ (int (*) (const void *, | |
+ const void *) | |
) alias_compare); | |
else | |
retval = NULL; | |
t@@ -178,9 +207,7 @@ _nl_expand_alias (name) | |
} | |
while (added != 0); | |
-#ifdef _LIBC | |
__libc_lock_unlock (lock); | |
-#endif | |
return result; | |
} | |
t@@ -188,9 +215,7 @@ _nl_expand_alias (name) | |
static size_t | |
internal_function | |
-read_alias_file (fname, fname_len) | |
- const char *fname; | |
- int fname_len; | |
+read_alias_file (const char *fname, int fname_len) | |
{ | |
FILE *fp; | |
char *full_fname; | |
t@@ -206,67 +231,68 @@ read_alias_file (fname, fname_len) | |
memcpy (&full_fname[fname_len], aliasfile, sizeof aliasfile); | |
#endif | |
- fp = fopen (full_fname, "r"); | |
+#ifdef _LIBC | |
+ /* Note the file is opened with cancellation in the I/O functions | |
+ disabled. */ | |
+ fp = fopen (relocate (full_fname), "rc"); | |
+#else | |
+ fp = fopen (relocate (full_fname), "r"); | |
+#endif | |
freea (full_fname); | |
if (fp == NULL) | |
return 0; | |
+#ifdef HAVE___FSETLOCKING | |
+ /* No threads present. */ | |
+ __fsetlocking (fp, FSETLOCKING_BYCALLER); | |
+#endif | |
+ | |
added = 0; | |
- while (!feof (fp)) | |
+ 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 | |
- */ | |
- char buf[BUFSIZ]; | |
+ We avoid a multi-kilobyte buffer here since this would use up | |
+ stack space which we might not have if the program ran out of | |
+ memory. */ | |
+ char buf[400]; | |
char *alias; | |
char *value; | |
char *cp; | |
+ int complete_line; | |
- if (fgets (buf, sizeof buf, fp) == NULL) | |
+ 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); | |
- } | |
+ /* Determine whether the line is complete. */ | |
+ complete_line = strchr (buf, '\n') != NULL; | |
cp = buf; | |
/* Ignore leading white space. */ | |
- while (isspace (cp[0])) | |
+ while (isspace ((unsigned char) cp[0])) | |
++cp; | |
/* A leading '#' signals a comment line. */ | |
if (cp[0] != '\0' && cp[0] != '#') | |
{ | |
alias = cp++; | |
- while (cp[0] != '\0' && !isspace (cp[0])) | |
+ while (cp[0] != '\0' && !isspace ((unsigned char) cp[0])) | |
++cp; | |
/* Terminate alias name. */ | |
if (cp[0] != '\0') | |
*cp++ = '\0'; | |
/* Now look for the beginning of the value. */ | |
- while (isspace (cp[0])) | |
+ while (isspace ((unsigned char) cp[0])) | |
++cp; | |
if (cp[0] != '\0') | |
{ | |
- size_t alias_len; | |
- size_t value_len; | |
- | |
value = cp++; | |
- while (cp[0] != '\0' && !isspace (cp[0])) | |
+ while (cp[0] != '\0' && !isspace ((unsigned char) cp[0])) | |
++cp; | |
/* Terminate value. */ | |
if (cp[0] == '\n') | |
t@@ -280,59 +306,84 @@ read_alias_file (fname, fname_len) | |
else if (cp[0] != '\0') | |
*cp++ = '\0'; | |
- if (nmap >= maxmap) | |
- if (__builtin_expect (extend_alias_table (), 0)) | |
- return added; | |
+#ifdef IN_LIBGLOCALE | |
+ /* glibc's locale.alias contains entries for ja_JP and ko_KR | |
+ that make it impossible to use a Japanese or Korean UTF-8 | |
+ locale under the name "ja_JP" or "ko_KR". Ignore these | |
+ entries. */ | |
+ if (strchr (alias, '_') == NULL) | |
+#endif | |
+ { | |
+ size_t alias_len; | |
+ size_t value_len; | |
- alias_len = strlen (alias) + 1; | |
- value_len = strlen (value) + 1; | |
+ if (nmap >= maxmap) | |
+ if (__builtin_expect (extend_alias_table (), 0)) | |
+ goto out; | |
- 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) | |
- return added; | |
- | |
- if (__builtin_expect (string_space != new_pool, 0)) | |
- { | |
- size_t i; | |
+ alias_len = strlen (alias) + 1; | |
+ value_len = strlen (value) + 1; | |
- for (i = 0; i < nmap; i++) | |
+ if (string_space_act + alias_len + value_len > string_space_… | |
+ { | |
+ /* 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_siz… | |
+ if (new_pool == NULL) | |
+ goto out; | |
+ | |
+ if (__builtin_expect (string_space != new_pool, 0)) | |
{ | |
- map[i].alias += new_pool - string_space; | |
- map[i].value += new_pool - string_space; | |
+ size_t i; | |
+ | |
+ for (i = 0; i < nmap; i++) | |
+ { | |
+ map[i].alias += new_pool - string_space; | |
+ map[i].value += new_pool - string_space; | |
+ } | |
} | |
- } | |
- string_space = new_pool; | |
- string_space_max = new_size; | |
- } | |
+ 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].alias = | |
+ (const char *) 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; | |
+ map[nmap].value = | |
+ (const char *) memcpy (&string_space[string_space_act], | |
+ value, value_len); | |
+ string_space_act += value_len; | |
- ++nmap; | |
- ++added; | |
+ ++nmap; | |
+ ++added; | |
+ } | |
} | |
} | |
+ | |
+ /* Possibly not the whole line fits into the buffer. Ignore | |
+ the rest of the line. */ | |
+ if (! complete_line) | |
+ do | |
+ if (FGETS (buf, sizeof buf, fp) == NULL) | |
+ /* Make sure the inner loop will be left. The outer loop | |
+ will exit at the `feof' test. */ | |
+ break; | |
+ while (strchr (buf, '\n') == NULL); | |
} | |
+ out: | |
/* 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); | |
+ (int (*) (const void *, const void *)) alias_compare); | |
return added; | |
} | |
t@@ -357,23 +408,8 @@ extend_alias_table () | |
} | |
-#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; | |
+alias_compare (const struct alias_map *map1, const struct alias_map *map2) | |
{ | |
#if defined _LIBC || defined HAVE_STRCASECMP | |
return strcasecmp (map1->alias, map2->alias); | |
diff --git a/intl/ngettext.c b/intl/ngettext.c | |
t@@ -1,19 +1,20 @@ | |
/* Implementation of ngettext(3) function. | |
- Copyright (C) 1995, 1997, 2000, 2001 Free Software Foundation, Inc. | |
+ Copyright (C) 1995, 1997, 2000-2003 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) | |
+ This program is free software; you can redistribute it and/or modify it | |
+ under the terms of the GNU Library General Public License as published | |
+ by the Free Software Foundation; either version 2, 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. | |
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
+ Library General Public License for more details. | |
- You should have received a copy of the GNU General Public License | |
- along with this program; if not, write to the Free Software Foundation, | |
- Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |
+ You should have received a copy of the GNU Library General Public | |
+ License along with this program; if not, write to the Free Software | |
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, | |
+ USA. */ | |
#ifdef HAVE_CONFIG_H | |
# include <config.h> | |
t@@ -45,18 +46,15 @@ | |
# define NGETTEXT __ngettext | |
# define DCNGETTEXT __dcngettext | |
#else | |
-# define NGETTEXT ngettext__ | |
-# define DCNGETTEXT dcngettext__ | |
+# define NGETTEXT libintl_ngettext | |
+# define DCNGETTEXT libintl_dcngettext | |
#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 * | |
-NGETTEXT (msgid1, msgid2, n) | |
- const char *msgid1; | |
- const char *msgid2; | |
- unsigned long int n; | |
+NGETTEXT (const char *msgid1, const char *msgid2, unsigned long int n) | |
{ | |
return DCNGETTEXT (NULL, msgid1, msgid2, n, LC_MESSAGES); | |
} | |
diff --git a/intl/plural.c b/intl/plural.c | |
t@@ -1,46 +1,101 @@ | |
+/* A Bison parser, made by GNU Bison 2.3a. */ | |
-/* A Bison parser, made from plural.y | |
- by GNU Bison version 1.28 */ | |
+/* Skeleton implementation for Bison's Yacc-like parsers in C | |
-#define YYBISON 1 /* Identify Bison output. */ | |
+ Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 | |
+ 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., 51 Franklin Street, Fifth Floor, | |
+ Boston, MA 02110-1301, USA. */ | |
+ | |
+/* As a special exception, you may create a larger work that contains | |
+ part or all of the Bison parser skeleton and distribute that work | |
+ under terms of your choice, so long as that work isn't itself a | |
+ parser generator using the skeleton or a modified version thereof | |
+ as a parser skeleton. Alternatively, if you modify or redistribute | |
+ the parser skeleton itself, you may (at your option) remove this | |
+ special exception, which will cause the skeleton and the resulting | |
+ Bison output files to be licensed under the GNU General Public | |
+ License without this special exception. | |
+ | |
+ This special exception was added by the Free Software Foundation in | |
+ version 2.2 of Bison. */ | |
+ | |
+/* C LALR(1) parser skeleton written by Richard Stallman, by | |
+ simplifying the original so-called "semantic" parser. */ | |
+ | |
+/* All symbols defined below should begin with yy or YY, to avoid | |
+ infringing on user name space. This should be done even for local | |
+ variables, as they might otherwise be expanded by user macros. | |
+ There are some unavoidable exceptions within include files to | |
+ define necessary library symbols; they are noted "INFRINGES ON | |
+ USER NAME SPACE" below. */ | |
+ | |
+/* Identify Bison output. */ | |
+#define YYBISON 1 | |
+ | |
+/* Bison version. */ | |
+#define YYBISON_VERSION "2.3a" | |
+ | |
+/* Skeleton name. */ | |
+#define YYSKELETON_NAME "yacc.c" | |
+ | |
+/* Pure parsers. */ | |
+#define YYPURE 1 | |
+ | |
+/* Using locations. */ | |
+#define YYLSP_NEEDED 0 | |
+ | |
+/* Substitute the variable and function names. */ | |
#define yyparse __gettextparse | |
-#define yylex __gettextlex | |
+#define yylex __gettextlex | |
#define yyerror __gettexterror | |
-#define yylval __gettextlval | |
-#define yychar __gettextchar | |
+#define yylval __gettextlval | |
+#define yychar __gettextchar | |
#define yydebug __gettextdebug | |
#define yynerrs __gettextnerrs | |
-#define EQUOP2 257 | |
-#define CMPOP2 258 | |
-#define ADDOP2 259 | |
-#define MULOP2 260 | |
-#define NUMBER 261 | |
+ | |
+/* Copy the first part of user declarations. */ | |
+/* Line 164 of yacc.c. */ | |
#line 1 "plural.y" | |
/* Expression parsing for plural form selection. | |
- Copyright (C) 2000, 2001 Free Software Foundation, Inc. | |
+ Copyright (C) 2000-2001, 2003, 2005-2006 Free Software Foundation, Inc. | |
Written by Ulrich Drepper <[email protected]>, 2000. | |
- 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) | |
+ This program is free software; you can redistribute it and/or modify it | |
+ under the terms of the GNU Library General Public License as published | |
+ by the Free Software Foundation; either version 2, 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 bison generated parser uses alloca. AIX 3 forces us to put this | |
- declaration at the beginning of the file. The declaration in bison's | |
- skeleton file comes too late. This must come before <config.h> | |
- because <config.h> may include arbitrary system headers. */ | |
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
+ Library General Public License for more details. | |
+ | |
+ You should have received a copy of the GNU Library General Public | |
+ License along with this program; if not, write to the Free Software | |
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, | |
+ USA. */ | |
+ | |
+/* For bison < 2.0, the bison generated parser uses alloca. AIX 3 forces us | |
+ to put this declaration at the beginning of the file. The declaration in | |
+ bison's skeleton file comes too late. This must come before <config.h> | |
+ because <config.h> may include arbitrary system headers. | |
+ This can go away once the AM_INTL_SUBDIR macro requires bison >= 2.0. */ | |
#if defined _AIX && !defined __GNUC__ | |
#pragma alloca | |
#endif | |
t@@ -49,54 +104,96 @@ | |
# include <config.h> | |
#endif | |
+#include <stddef.h> | |
#include <stdlib.h> | |
-#include "gettextP.h" | |
- | |
-/* 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 FREE_EXPRESSION __gettext_free_exp | |
-#else | |
-# define FREE_EXPRESSION gettext_free_exp__ | |
-# define __gettextparse gettextparse__ | |
+#include <string.h> | |
+#include "plural-exp.h" | |
+ | |
+/* The main function generated by the parser is called __gettextparse, | |
+ but we want it to be called PLURAL_PARSE. */ | |
+#ifndef _LIBC | |
+# define __gettextparse PLURAL_PARSE | |
#endif | |
#define YYLEX_PARAM &((struct parse_args *) arg)->cp | |
#define YYPARSE_PARAM arg | |
-#line 52 "plural.y" | |
-typedef union { | |
+ | |
+/* Enabling traces. */ | |
+#ifndef YYDEBUG | |
+# define YYDEBUG 0 | |
+#endif | |
+ | |
+/* Enabling verbose error messages. */ | |
+#ifdef YYERROR_VERBOSE | |
+# undef YYERROR_VERBOSE | |
+# define YYERROR_VERBOSE 1 | |
+#else | |
+# define YYERROR_VERBOSE 0 | |
+#endif | |
+ | |
+/* Enabling the token table. */ | |
+#ifndef YYTOKEN_TABLE | |
+# define YYTOKEN_TABLE 0 | |
+#endif | |
+ | |
+ | |
+/* Tokens. */ | |
+#ifndef YYTOKENTYPE | |
+# define YYTOKENTYPE | |
+ /* Put the tokens into the symbol table, so that GDB and other debuggers | |
+ know about them. */ | |
+ enum yytokentype { | |
+ EQUOP2 = 258, | |
+ CMPOP2 = 259, | |
+ ADDOP2 = 260, | |
+ MULOP2 = 261, | |
+ NUMBER = 262 | |
+ }; | |
+#endif | |
+/* Tokens. */ | |
+#define EQUOP2 258 | |
+#define CMPOP2 259 | |
+#define ADDOP2 260 | |
+#define MULOP2 261 | |
+#define NUMBER 262 | |
+ | |
+ | |
+ | |
+ | |
+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED | |
+typedef union YYSTYPE | |
+{/* Line 191 of yacc.c. */ | |
+#line 51 "plural.y" | |
+ | |
unsigned long int num; | |
- enum operator op; | |
+ enum expression_operator op; | |
struct expression *exp; | |
-} YYSTYPE; | |
-#line 58 "plural.y" | |
+} | |
+/* Line 191 of yacc.c. */ | |
+#line 175 "plural.c" | |
+ YYSTYPE; | |
+# define YYSTYPE_IS_TRIVIAL 1 | |
+# define yystype YYSTYPE /* obsolescent; will be withdrawn */ | |
+# define YYSTYPE_IS_DECLARED 1 | |
+#endif | |
+ | |
+ | |
+ | |
+ | |
+/* Copy the second part of user declarations. */ | |
+/* Line 221 of yacc.c. */ | |
+#line 57 "plural.y" | |
/* Prototypes for local functions. */ | |
-static struct expression *new_exp PARAMS ((int nargs, enum operator op, | |
- struct expression * const *args)); | |
-static inline struct expression *new_exp_0 PARAMS ((enum operator op)); | |
-static inline struct expression *new_exp_1 PARAMS ((enum operator op, | |
- struct expression *right)); | |
-static struct expression *new_exp_2 PARAMS ((enum operator op, | |
- struct expression *left, | |
- struct expression *right)); | |
-static inline struct expression *new_exp_3 PARAMS ((enum operator op, | |
- struct expression *bexp, | |
- struct expression *tbranch, | |
- struct expression *fbranch)… | |
-static int yylex PARAMS ((YYSTYPE *lval, const char **pexp)); | |
-static void yyerror PARAMS ((const char *str)); | |
+static int yylex (YYSTYPE *lval, const char **pexp); | |
+static void yyerror (const char *str); | |
/* Allocation of expressions. */ | |
static struct expression * | |
-new_exp (nargs, op, args) | |
- int nargs; | |
- enum operator op; | |
- struct expression * const *args; | |
+new_exp (int nargs, enum expression_operator op, | |
+ struct expression * const *args) | |
{ | |
int i; | |
struct expression *newp; | |
t@@ -125,16 +222,13 @@ new_exp (nargs, op, args) | |
} | |
static inline struct expression * | |
-new_exp_0 (op) | |
- enum operator op; | |
+new_exp_0 (enum expression_operator op) | |
{ | |
return new_exp (0, op, NULL); | |
} | |
static inline struct expression * | |
-new_exp_1 (op, right) | |
- enum operator op; | |
- struct expression *right; | |
+new_exp_1 (enum expression_operator op, struct expression *right) | |
{ | |
struct expression *args[1]; | |
t@@ -143,10 +237,8 @@ new_exp_1 (op, right) | |
} | |
static struct expression * | |
-new_exp_2 (op, left, right) | |
- enum operator op; | |
- struct expression *left; | |
- struct expression *right; | |
+new_exp_2 (enum expression_operator op, struct expression *left, | |
+ struct expression *right) | |
{ | |
struct expression *args[2]; | |
t@@ -156,11 +248,8 @@ new_exp_2 (op, left, right) | |
} | |
static inline struct expression * | |
-new_exp_3 (op, bexp, tbranch, fbranch) | |
- enum operator op; | |
- struct expression *bexp; | |
- struct expression *tbranch; | |
- struct expression *fbranch; | |
+new_exp_3 (enum expression_operator op, struct expression *bexp, | |
+ struct expression *tbranch, struct expression *fbranch) | |
{ | |
struct expression *args[3]; | |
t@@ -170,431 +259,1020 @@ new_exp_3 (op, bexp, tbranch, fbranch) | |
return new_exp (3, op, args); | |
} | |
-#include <stdio.h> | |
-#ifndef __cplusplus | |
-#ifndef __STDC__ | |
-#define const | |
-#endif | |
+/* Line 221 of yacc.c. */ | |
+#line 265 "plural.c" | |
+ | |
+#ifdef short | |
+# undef short | |
#endif | |
+#ifdef YYTYPE_UINT8 | |
+typedef YYTYPE_UINT8 yytype_uint8; | |
+#else | |
+typedef unsigned char yytype_uint8; | |
+#endif | |
+#ifdef YYTYPE_INT8 | |
+typedef YYTYPE_INT8 yytype_int8; | |
+#elif (defined __STDC__ || defined __C99__FUNC__ \ | |
+ || defined __cplusplus || defined _MSC_VER) | |
+typedef signed char yytype_int8; | |
+#else | |
+typedef short int yytype_int8; | |
+#endif | |
-#define YYFINAL 27 | |
-#define YYFLAG -32768 | |
-#define YYNTBASE 16 | |
- | |
-#define YYTRANSLATE(x) ((unsigned)(x) <= 261 ? yytranslate[x] : 18) | |
- | |
-static const char yytranslate[] = { 0, | |
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
- 2, 2, 10, 2, 2, 2, 2, 5, 2, 14, | |
- 15, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
- 2, 2, 2, 2, 2, 2, 2, 12, 2, 2, | |
- 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, | |
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 13, | |
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
- 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, | |
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
- 2, 2, 2, 2, 2, 1, 6, 7, 8, 9, | |
- 11 | |
-}; | |
+#ifdef YYTYPE_UINT16 | |
+typedef YYTYPE_UINT16 yytype_uint16; | |
+#else | |
+typedef unsigned short int yytype_uint16; | |
+#endif | |
-#if YYDEBUG != 0 | |
-static const short yyprhs[] = { 0, | |
- 0, 2, 8, 12, 16, 20, 24, 28, 32, 35, | |
- 37, 39 | |
-}; | |
+#ifdef YYTYPE_INT16 | |
+typedef YYTYPE_INT16 yytype_int16; | |
+#else | |
+typedef short int yytype_int16; | |
+#endif | |
-static const short yyrhs[] = { 17, | |
- 0, 17, 3, 17, 12, 17, 0, 17, 4, 17, | |
- 0, 17, 5, 17, 0, 17, 6, 17, 0, 17, | |
- 7, 17, 0, 17, 8, 17, 0, 17, 9, 17, | |
- 0, 10, 17, 0, 13, 0, 11, 0, 14, 17, | |
- 15, 0 | |
-}; | |
+#ifndef YYSIZE_T | |
+# ifdef __SIZE_TYPE__ | |
+# define YYSIZE_T __SIZE_TYPE__ | |
+# elif defined size_t | |
+# define YYSIZE_T size_t | |
+# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ | |
+ || defined __cplusplus || defined _MSC_VER) | |
+# include <stddef.h> /* INFRINGES ON USER NAME SPACE */ | |
+# define YYSIZE_T size_t | |
+# else | |
+# define YYSIZE_T unsigned int | |
+# endif | |
+#endif | |
+#define YYSIZE_MAXIMUM ((YYSIZE_T) -1) | |
+ | |
+#ifndef YY_ | |
+# if YYENABLE_NLS | |
+# if ENABLE_NLS | |
+# include <libintl.h> /* INFRINGES ON USER NAME SPACE */ | |
+# define YY_(msgid) dgettext ("bison-runtime", msgid) | |
+# endif | |
+# endif | |
+# ifndef YY_ | |
+# define YY_(msgid) msgid | |
+# endif | |
#endif | |
-#if YYDEBUG != 0 | |
-static const short yyrline[] = { 0, | |
- 177, 185, 189, 193, 197, 201, 205, 209, 213, 217, | |
- 221, 226 | |
-}; | |
+/* Suppress unused-variable warnings by "using" E. */ | |
+#if ! defined lint || defined __GNUC__ | |
+# define YYUSE(e) ((void) (e)) | |
+#else | |
+# define YYUSE(e) /* empty */ | |
#endif | |
+/* Identity function, used to suppress warnings about constant conditions. */ | |
+#ifndef lint | |
+# define YYID(n) (n) | |
+#else | |
+#if (defined __STDC__ || defined __C99__FUNC__ \ | |
+ || defined __cplusplus || defined _MSC_VER) | |
+static int | |
+YYID (int yyi) | |
+#else | |
+static int | |
+YYID (yyi) | |
+ int yyi; | |
+#endif | |
+{ | |
+ return yyi; | |
+} | |
+#endif | |
-#if YYDEBUG != 0 || defined (YYERROR_VERBOSE) | |
+#if ! defined yyoverflow || YYERROR_VERBOSE | |
+ | |
+/* The parser invokes alloca or malloc; define the necessary symbols. */ | |
+ | |
+# ifdef YYSTACK_USE_ALLOCA | |
+# if YYSTACK_USE_ALLOCA | |
+# ifdef __GNUC__ | |
+# define YYSTACK_ALLOC __builtin_alloca | |
+# elif defined __BUILTIN_VA_ARG_INCR | |
+# include <alloca.h> /* INFRINGES ON USER NAME SPACE */ | |
+# elif defined _AIX | |
+# define YYSTACK_ALLOC __alloca | |
+# elif defined _MSC_VER | |
+# include <malloc.h> /* INFRINGES ON USER NAME SPACE */ | |
+# define alloca _alloca | |
+# else | |
+# define YYSTACK_ALLOC alloca | |
+# if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || def… | |
+ || defined __cplusplus || defined _MSC_VER) | |
+# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */ | |
+# ifndef _STDLIB_H | |
+# define _STDLIB_H 1 | |
+# endif | |
+# endif | |
+# endif | |
+# endif | |
+# endif | |
+ | |
+# ifdef YYSTACK_ALLOC | |
+ /* Pacify GCC's `empty if-body' warning. */ | |
+# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) | |
+# ifndef YYSTACK_ALLOC_MAXIMUM | |
+ /* The OS might guarantee only one guard page at the bottom of the stack, | |
+ and a page size can be as small as 4096 bytes. So we cannot safely | |
+ invoke alloca (N) if N exceeds 4096. Use a slightly smaller number | |
+ to allow for a few compiler-allocated temporary stack slots. */ | |
+# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ | |
+# endif | |
+# else | |
+# define YYSTACK_ALLOC YYMALLOC | |
+# define YYSTACK_FREE YYFREE | |
+# ifndef YYSTACK_ALLOC_MAXIMUM | |
+# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM | |
+# endif | |
+# if (defined __cplusplus && ! defined _STDLIB_H \ | |
+ && ! ((defined YYMALLOC || defined malloc) \ | |
+ && (defined YYFREE || defined free))) | |
+# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */ | |
+# ifndef _STDLIB_H | |
+# define _STDLIB_H 1 | |
+# endif | |
+# endif | |
+# ifndef YYMALLOC | |
+# define YYMALLOC malloc | |
+# if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined… | |
+ || defined __cplusplus || defined _MSC_VER) | |
+void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ | |
+# endif | |
+# endif | |
+# ifndef YYFREE | |
+# define YYFREE free | |
+# if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined _… | |
+ || defined __cplusplus || defined _MSC_VER) | |
+void free (void *); /* INFRINGES ON USER NAME SPACE */ | |
+# endif | |
+# endif | |
+# endif | |
+#endif /* ! defined yyoverflow || YYERROR_VERBOSE */ | |
+ | |
+ | |
+#if (! defined yyoverflow \ | |
+ && (! defined __cplusplus \ | |
+ || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) | |
+ | |
+/* A type that is properly aligned for any stack member. */ | |
+union yyalloc | |
+{ | |
+ yytype_int16 yyss; | |
+ YYSTYPE yyvs; | |
+ }; | |
+ | |
+/* The size of the maximum gap between one aligned stack and the next. */ | |
+# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) | |
+ | |
+/* The size of an array large to enough to hold all stacks, each with | |
+ N elements. */ | |
+# define YYSTACK_BYTES(N) \ | |
+ ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ | |
+ + YYSTACK_GAP_MAXIMUM) | |
+ | |
+/* Copy COUNT objects from FROM to TO. The source and destination do | |
+ not overlap. */ | |
+# ifndef YYCOPY | |
+# if defined __GNUC__ && 1 < __GNUC__ | |
+# define YYCOPY(To, From, Count) \ | |
+ __builtin_memcpy (To, From, (Count) * sizeof (*(From))) | |
+# else | |
+# define YYCOPY(To, From, Count) \ | |
+ do \ | |
+ { \ | |
+ YYSIZE_T yyi; \ | |
+ for (yyi = 0; yyi < (Count); yyi++) \ | |
+ (To)[yyi] = (From)[yyi]; \ | |
+ } \ | |
+ while (YYID (0)) | |
+# endif | |
+# endif | |
+ | |
+/* Relocate STACK from its old location to the new one. The | |
+ local variables YYSIZE and YYSTACKSIZE give the old and new number of | |
+ elements in the stack, and YYPTR gives the new location of the | |
+ stack. Advance YYPTR to a properly aligned location for the next | |
+ stack. */ | |
+# define YYSTACK_RELOCATE(Stack) \ | |
+ do \ | |
+ { … | |
+ YYSIZE_T yynewbytes; \ | |
+ YYCOPY (&yyptr->Stack, Stack, yysize); \ | |
+ Stack = &yyptr->Stack; \ | |
+ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ | |
+ yyptr += yynewbytes / sizeof (*yyptr); \ | |
+ } … | |
+ while (YYID (0)) | |
-static const char * const yytname[] = { "$","error","$undefined.","'?'","'|'… | |
-"'&'","EQUOP2","CMPOP2","ADDOP2","MULOP2","'!'","NUMBER","':'","'n'","'('","')… | |
-"start","exp", NULL | |
-}; | |
#endif | |
-static const short yyr1[] = { 0, | |
- 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, | |
- 17, 17 | |
+/* YYFINAL -- State number of the termination state. */ | |
+#define YYFINAL 9 | |
+/* YYLAST -- Last index in YYTABLE. */ | |
+#define YYLAST 54 | |
+ | |
+/* YYNTOKENS -- Number of terminals. */ | |
+#define YYNTOKENS 16 | |
+/* YYNNTS -- Number of nonterminals. */ | |
+#define YYNNTS 3 | |
+/* YYNRULES -- Number of rules. */ | |
+#define YYNRULES 13 | |
+/* YYNRULES -- Number of states. */ | |
+#define YYNSTATES 27 | |
+ | |
+/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ | |
+#define YYUNDEFTOK 2 | |
+#define YYMAXUTOK 262 | |
+ | |
+#define YYTRANSLATE(YYX) \ | |
+ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) | |
+ | |
+/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ | |
+static const yytype_uint8 yytranslate[] = | |
+{ | |
+ 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
+ 2, 2, 2, 10, 2, 2, 2, 2, 5, 2, | |
+ 14, 15, 2, 2, 2, 2, 2, 2, 2, 2, | |
+ 2, 2, 2, 2, 2, 2, 2, 2, 12, 2, | |
+ 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, | |
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
+ 13, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
+ 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, | |
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | |
+ 2, 2, 2, 2, 2, 2, 1, 2, 6, 7, | |
+ 8, 9, 11 | |
}; | |
-static const short yyr2[] = { 0, | |
- 1, 5, 3, 3, 3, 3, 3, 3, 2, 1, | |
- 1, 3 | |
+#if YYDEBUG | |
+/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in | |
+ YYRHS. */ | |
+static const yytype_uint8 yyprhs[] = | |
+{ | |
+ 0, 0, 3, 5, 11, 15, 19, 23, 27, 31, | |
+ 35, 38, 40, 42 | |
}; | |
-static const short yydefact[] = { 0, | |
- 0, 11, 10, 0, 1, 9, 0, 0, 0, 0, | |
- 0, 0, 0, 0, 12, 0, 3, 4, 5, 6, | |
- 7, 8, 0, 2, 0, 0, 0 | |
+/* YYRHS -- A `-1'-separated list of the rules' RHS. */ | |
+static const yytype_int8 yyrhs[] = | |
+{ | |
+ 17, 0, -1, 18, -1, 18, 3, 18, 12, 18, | |
+ -1, 18, 4, 18, -1, 18, 5, 18, -1, 18, | |
+ 6, 18, -1, 18, 7, 18, -1, 18, 8, 18, | |
+ -1, 18, 9, 18, -1, 10, 18, -1, 13, -1, | |
+ 11, -1, 14, 18, 15, -1 | |
}; | |
-static const short yydefgoto[] = { 25, | |
- 5 | |
+/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ | |
+static const yytype_uint8 yyrline[] = | |
+{ | |
+ 0, 154, 154, 162, 166, 170, 174, 178, 182, 186, | |
+ 190, 194, 198, 203 | |
}; | |
+#endif | |
-static const short yypact[] = { -9, | |
- -9,-32768,-32768, -9, 34,-32768, 11, -9, -9, -9, | |
- -9, -9, -9, -9,-32768, 24, 39, 43, 16, 26, | |
- -3,-32768, -9, 34, 21, 53,-32768 | |
+#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE | |
+/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. | |
+ First, the terminals, then, starting at YYNTOKENS, nonterminals. */ | |
+static const char *const yytname[] = | |
+{ | |
+ "$end", "error", "$undefined", "'?'", "'|'", "'&'", "EQUOP2", "CMPOP2", | |
+ "ADDOP2", "MULOP2", "'!'", "NUMBER", "':'", "'n'", "'('", "')'", | |
+ "$accept", "start", "exp", 0 | |
}; | |
+#endif | |
-static const short yypgoto[] = {-32768, | |
- -1 | |
+# ifdef YYPRINT | |
+/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to | |
+ token YYLEX-NUM. */ | |
+static const yytype_uint16 yytoknum[] = | |
+{ | |
+ 0, 256, 257, 63, 124, 38, 258, 259, 260, 261, | |
+ 33, 262, 58, 110, 40, 41 | |
}; | |
+# endif | |
+/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ | |
+static const yytype_uint8 yyr1[] = | |
+{ | |
+ 0, 16, 17, 18, 18, 18, 18, 18, 18, 18, | |
+ 18, 18, 18, 18 | |
+}; | |
-#define YYLAST 53 | |
- | |
- | |
-static const short yytable[] = { 6, | |
- 1, 2, 7, 3, 4, 14, 16, 17, 18, 19, | |
- 20, 21, 22, 8, 9, 10, 11, 12, 13, 14, | |
- 26, 24, 12, 13, 14, 15, 8, 9, 10, 11, | |
- 12, 13, 14, 13, 14, 23, 8, 9, 10, 11, | |
- 12, 13, 14, 10, 11, 12, 13, 14, 11, 12, | |
- 13, 14, 27 | |
+/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ | |
+static const yytype_uint8 yyr2[] = | |
+{ | |
+ 0, 2, 1, 5, 3, 3, 3, 3, 3, 3, | |
+ 2, 1, 1, 3 | |
}; | |
-static const short yycheck[] = { 1, | |
- 10, 11, 4, 13, 14, 9, 8, 9, 10, 11, | |
- 12, 13, 14, 3, 4, 5, 6, 7, 8, 9, | |
- 0, 23, 7, 8, 9, 15, 3, 4, 5, 6, | |
- 7, 8, 9, 8, 9, 12, 3, 4, 5, 6, | |
- 7, 8, 9, 5, 6, 7, 8, 9, 6, 7, | |
- 8, 9, 0 | |
+/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state | |
+ STATE-NUM when YYTABLE doesn't specify something else to do. Zero | |
+ means the default is an error. */ | |
+static const yytype_uint8 yydefact[] = | |
+{ | |
+ 0, 0, 12, 11, 0, 0, 2, 10, 0, 1, | |
+ 0, 0, 0, 0, 0, 0, 0, 13, 0, 4, | |
+ 5, 6, 7, 8, 9, 0, 3 | |
}; | |
-#define YYPURE 1 | |
-/* -*-C-*- Note some compilers choke on comments on `#line' lines. */ | |
-#line 3 "/home/haible/gnu/arch/linuxlibc6/share/bison.simple" | |
-/* This file comes from bison-1.28. */ | |
+/* YYDEFGOTO[NTERM-NUM]. */ | |
+static const yytype_int8 yydefgoto[] = | |
+{ | |
+ -1, 5, 6 | |
+}; | |
-/* Skeleton output parser for bison, | |
- Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc. | |
+/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing | |
+ STATE-NUM. */ | |
+#define YYPACT_NINF -10 | |
+static const yytype_int8 yypact[] = | |
+{ | |
+ -9, -9, -10, -10, -9, 8, 36, -10, 13, -10, | |
+ -9, -9, -9, -9, -9, -9, -9, -10, 26, 41, | |
+ 45, 18, -2, 14, -10, -9, 36 | |
+}; | |
- 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. | |
+/* YYPGOTO[NTERM-NUM]. */ | |
+static const yytype_int8 yypgoto[] = | |
+{ | |
+ -10, -10, -1 | |
+}; | |
- 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. | |
+/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If | |
+ positive, shift that token. If negative, reduce the rule which | |
+ number is the opposite. If zero, do what YYDEFACT says. | |
+ If YYTABLE_NINF, syntax error. */ | |
+#define YYTABLE_NINF -1 | |
+static const yytype_uint8 yytable[] = | |
+{ | |
+ 7, 1, 2, 8, 3, 4, 15, 16, 9, 18, | |
+ 19, 20, 21, 22, 23, 24, 10, 11, 12, 13, | |
+ 14, 15, 16, 16, 26, 14, 15, 16, 17, 10, | |
+ 11, 12, 13, 14, 15, 16, 0, 0, 25, 10, | |
+ 11, 12, 13, 14, 15, 16, 12, 13, 14, 15, | |
+ 16, 13, 14, 15, 16 | |
+}; | |
- 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. */ | |
- | |
-/* As a special exception, when this file is copied by Bison into a | |
- Bison output file, you may use that output file without restriction. | |
- This special exception was added by the Free Software Foundation | |
- in version 1.24 of Bison. */ | |
- | |
-/* This is the parser code that is written into each bison parser | |
- when the %semantic_parser declaration is not specified in the grammar. | |
- It was written by Richard Stallman by simplifying the hairy parser | |
- used when %semantic_parser is specified. */ | |
- | |
-#ifndef YYSTACK_USE_ALLOCA | |
-#ifdef alloca | |
-#define YYSTACK_USE_ALLOCA | |
-#else /* alloca not defined */ | |
-#ifdef __GNUC__ | |
-#define YYSTACK_USE_ALLOCA | |
-#define alloca __builtin_alloca | |
-#else /* not GNU C. */ | |
-#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined… | |
-#define YYSTACK_USE_ALLOCA | |
-#include <alloca.h> | |
-#else /* not sparc */ | |
-/* We think this test detects Watcom and Microsoft C. */ | |
-/* This used to test MSDOS, but that is a bad idea | |
- since that symbol is in the user namespace. */ | |
-#if (defined (_MSDOS) || defined (_MSDOS_)) && !defined (__TURBOC__) | |
-#if 0 /* No need for malloc.h, which pollutes the namespace; | |
- instead, just don't use alloca. */ | |
-#include <malloc.h> | |
-#endif | |
-#else /* not MSDOS, or __TURBOC__ */ | |
-#if defined(_AIX) | |
-/* I don't know what this was needed for, but it pollutes the namespace. | |
- So I turned it off. rms, 2 May 1997. */ | |
-/* #include <malloc.h> */ | |
- #pragma alloca | |
-#define YYSTACK_USE_ALLOCA | |
-#else /* not MSDOS, or __TURBOC__, or _AIX */ | |
-#if 0 | |
-#ifdef __hpux /* [email protected] says this works for HPUX 9.05 and up, | |
- and on HPUX 10. Eventually we can turn this on. */ | |
-#define YYSTACK_USE_ALLOCA | |
-#define alloca __builtin_alloca | |
-#endif /* __hpux */ | |
-#endif | |
-#endif /* not _AIX */ | |
-#endif /* not MSDOS, or __TURBOC__ */ | |
-#endif /* not sparc */ | |
-#endif /* not GNU C */ | |
-#endif /* alloca not defined */ | |
-#endif /* YYSTACK_USE_ALLOCA not defined */ | |
- | |
-#ifdef YYSTACK_USE_ALLOCA | |
-#define YYSTACK_ALLOC alloca | |
-#else | |
-#define YYSTACK_ALLOC malloc | |
-#endif | |
+static const yytype_int8 yycheck[] = | |
+{ | |
+ 1, 10, 11, 4, 13, 14, 8, 9, 0, 10, | |
+ 11, 12, 13, 14, 15, 16, 3, 4, 5, 6, | |
+ 7, 8, 9, 9, 25, 7, 8, 9, 15, 3, | |
+ 4, 5, 6, 7, 8, 9, -1, -1, 12, 3, | |
+ 4, 5, 6, 7, 8, 9, 5, 6, 7, 8, | |
+ 9, 6, 7, 8, 9 | |
+}; | |
-/* Note: there must be only one dollar sign in this file. | |
- It is replaced by the list of actions, each action | |
- as one case of the switch. */ | |
+/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing | |
+ symbol of state STATE-NUM. */ | |
+static const yytype_uint8 yystos[] = | |
+{ | |
+ 0, 10, 11, 13, 14, 17, 18, 18, 18, 0, | |
+ 3, 4, 5, 6, 7, 8, 9, 15, 18, 18, | |
+ 18, 18, 18, 18, 18, 12, 18 | |
+}; | |
#define yyerrok (yyerrstatus = 0) | |
#define yyclearin (yychar = YYEMPTY) | |
-#define YYEMPTY -2 | |
+#define YYEMPTY (-2) | |
#define YYEOF 0 | |
+ | |
#define YYACCEPT goto yyacceptlab | |
-#define YYABORT goto yyabortlab | |
-#define YYERROR goto yyerrlab1 | |
-/* Like YYERROR except do call yyerror. | |
- This remains here temporarily to ease the | |
- transition to the new meaning of YYERROR, for GCC. | |
+#define YYABORT goto yyabortlab | |
+#define YYERROR goto yyerrorlab | |
+ | |
+ | |
+/* Like YYERROR except do call yyerror. This remains here temporarily | |
+ to ease the transition to the new meaning of YYERROR, for GCC. | |
Once GCC version 2 has supplanted version 1, this can go. */ | |
+ | |
#define YYFAIL goto yyerrlab | |
+ | |
#define YYRECOVERING() (!!yyerrstatus) | |
-#define YYBACKUP(token, value) \ | |
+ | |
+#define YYBACKUP(Token, Value) \ | |
do \ | |
if (yychar == YYEMPTY && yylen == 1) \ | |
- { yychar = (token), yylval = (value); \ | |
- yychar1 = YYTRANSLATE (yychar); \ | |
- YYPOPSTACK; \ | |
+ { \ | |
+ yychar = (Token); \ | |
+ yylval = (Value); \ | |
+ yytoken = YYTRANSLATE (yychar); \ | |
+ YYPOPSTACK (1); \ | |
goto yybackup; \ | |
} \ | |
else \ | |
- { yyerror ("syntax error: cannot back up"); YYERROR; } \ | |
-while (0) | |
+ { \ | |
+ yyerror (YY_("syntax error: cannot back up")); \ | |
+ YYERROR; \ | |
+ } \ | |
+while (YYID (0)) | |
+ | |
#define YYTERROR 1 | |
#define YYERRCODE 256 | |
-#ifndef YYPURE | |
-#define YYLEX yylex() | |
+ | |
+/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. | |
+ If N is 0, then set CURRENT to the empty location which ends | |
+ the previous symbol: RHS[0] (always defined). */ | |
+ | |
+#define YYRHSLOC(Rhs, K) ((Rhs)[K]) | |
+#ifndef YYLLOC_DEFAULT | |
+# define YYLLOC_DEFAULT(Current, Rhs, N) \ | |
+ do \ | |
+ if (YYID (N)) \ | |
+ { \ | |
+ (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ | |
+ (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ | |
+ (Current).last_line = YYRHSLOC (Rhs, N).last_line; … | |
+ (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ | |
+ } \ | |
+ else \ | |
+ { \ | |
+ (Current).first_line = (Current).last_line = \ | |
+ YYRHSLOC (Rhs, 0).last_line; \ | |
+ (Current).first_column = (Current).last_column = \ | |
+ YYRHSLOC (Rhs, 0).last_column; \ | |
+ } \ | |
+ while (YYID (0)) | |
#endif | |
-#ifdef YYPURE | |
-#ifdef YYLSP_NEEDED | |
-#ifdef YYLEX_PARAM | |
-#define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM) | |
-#else | |
-#define YYLEX yylex(&yylval, &yylloc) | |
+ | |
+/* YY_LOCATION_PRINT -- Print the location on the stream. | |
+ This macro was not mandated originally: define only if we know | |
+ we won't break user code: when these are the locations we know. */ | |
+ | |
+#ifndef YY_LOCATION_PRINT | |
+# if YYLTYPE_IS_TRIVIAL | |
+# define YY_LOCATION_PRINT(File, Loc) \ | |
+ fprintf (File, "%d.%d-%d.%d", \ | |
+ (Loc).first_line, (Loc).first_column, \ | |
+ (Loc).last_line, (Loc).last_column) | |
+# else | |
+# define YY_LOCATION_PRINT(File, Loc) ((void) 0) | |
+# endif | |
#endif | |
-#else /* not YYLSP_NEEDED */ | |
+ | |
+ | |
+/* YYLEX -- calling `yylex' with the right arguments. */ | |
+ | |
#ifdef YYLEX_PARAM | |
-#define YYLEX yylex(&yylval, YYLEX_PARAM) | |
+# define YYLEX yylex (&yylval, YYLEX_PARAM) | |
#else | |
-#define YYLEX yylex(&yylval) | |
+# define YYLEX yylex (&yylval) | |
#endif | |
-#endif /* not YYLSP_NEEDED */ | |
+ | |
+/* Enable debugging if requested. */ | |
+#if YYDEBUG | |
+ | |
+# ifndef YYFPRINTF | |
+# include <stdio.h> /* INFRINGES ON USER NAME SPACE */ | |
+# define YYFPRINTF fprintf | |
+# endif | |
+ | |
+# define YYDPRINTF(Args) \ | |
+do { \ | |
+ if (yydebug) \ | |
+ YYFPRINTF Args; \ | |
+} while (YYID (0)) | |
+ | |
+# define YY_SYMBOL_PRINT(Title, Type, Value, Location) … | |
+do { \ | |
+ if (yydebug) … | |
+ { … | |
+ YYFPRINTF (stderr, "%s ", Title); … | |
+ yy_symbol_print (stderr, … | |
+ Type, Value); \ | |
+ YYFPRINTF (stderr, "\n"); … | |
+ } … | |
+} while (YYID (0)) | |
+ | |
+ | |
+/*--------------------------------. | |
+| Print this symbol on YYOUTPUT. | | |
+`--------------------------------*/ | |
+ | |
+/*ARGSUSED*/ | |
+#if (defined __STDC__ || defined __C99__FUNC__ \ | |
+ || defined __cplusplus || defined _MSC_VER) | |
+static void | |
+yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyval… | |
+#else | |
+static void | |
+yy_symbol_value_print (yyoutput, yytype, yyvaluep) | |
+ FILE *yyoutput; | |
+ int yytype; | |
+ YYSTYPE const * const yyvaluep; | |
#endif | |
+{ | |
+ if (!yyvaluep) | |
+ return; | |
+# ifdef YYPRINT | |
+ if (yytype < YYNTOKENS) | |
+ YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); | |
+# else | |
+ YYUSE (yyoutput); | |
+# endif | |
+ switch (yytype) | |
+ { | |
+ default: | |
+ break; | |
+ } | |
+} | |
+ | |
+ | |
+/*--------------------------------. | |
+| Print this symbol on YYOUTPUT. | | |
+`--------------------------------*/ | |
-/* If nonreentrant, generate the variables here */ | |
+#if (defined __STDC__ || defined __C99__FUNC__ \ | |
+ || defined __cplusplus || defined _MSC_VER) | |
+static void | |
+yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) | |
+#else | |
+static void | |
+yy_symbol_print (yyoutput, yytype, yyvaluep) | |
+ FILE *yyoutput; | |
+ int yytype; | |
+ YYSTYPE const * const yyvaluep; | |
+#endif | |
+{ | |
+ if (yytype < YYNTOKENS) | |
+ YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); | |
+ else | |
+ YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); | |
-#ifndef YYPURE | |
+ yy_symbol_value_print (yyoutput, yytype, yyvaluep); | |
+ YYFPRINTF (yyoutput, ")"); | |
+} | |
-int yychar; /* the lookahead symbol … | |
-YYSTYPE yylval; /* the semantic value of the … | |
- /* lookahead symbol */ | |
+/*------------------------------------------------------------------. | |
+| yy_stack_print -- Print the state stack from its BOTTOM up to its | | |
+| TOP (included). | | |
+`------------------------------------------------------------------*/ | |
-#ifdef YYLSP_NEEDED | |
-YYLTYPE yylloc; /* location data for the lookahead … | |
- /* symbol */ | |
+#if (defined __STDC__ || defined __C99__FUNC__ \ | |
+ || defined __cplusplus || defined _MSC_VER) | |
+static void | |
+yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop) | |
+#else | |
+static void | |
+yy_stack_print (yybottom, yytop) | |
+ yytype_int16 *yybottom; | |
+ yytype_int16 *yytop; | |
#endif | |
+{ | |
+ YYFPRINTF (stderr, "Stack now"); | |
+ for (; yybottom <= yytop; yybottom++) | |
+ { | |
+ int yybot = *yybottom; | |
+ YYFPRINTF (stderr, " %d", yybot); | |
+ } | |
+ YYFPRINTF (stderr, "\n"); | |
+} | |
-int yynerrs; /* number of parse errors so far */ | |
-#endif /* not YYPURE */ | |
+# define YY_STACK_PRINT(Bottom, Top) \ | |
+do { \ | |
+ if (yydebug) \ | |
+ yy_stack_print ((Bottom), (Top)); \ | |
+} while (YYID (0)) | |
-#if YYDEBUG != 0 | |
-int yydebug; /* nonzero means print parse trace … | |
-/* Since this is uninitialized, it does not stop multiple parsers | |
- from coexisting. */ | |
+ | |
+/*------------------------------------------------. | |
+| Report that the YYRULE is going to be reduced. | | |
+`------------------------------------------------*/ | |
+ | |
+#if (defined __STDC__ || defined __C99__FUNC__ \ | |
+ || defined __cplusplus || defined _MSC_VER) | |
+static void | |
+yy_reduce_print (YYSTYPE *yyvsp, int yyrule) | |
+#else | |
+static void | |
+yy_reduce_print (yyvsp, yyrule) | |
+ YYSTYPE *yyvsp; | |
+ int yyrule; | |
#endif | |
+{ | |
+ int yynrhs = yyr2[yyrule]; | |
+ int yyi; | |
+ unsigned long int yylno = yyrline[yyrule]; | |
+ YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", | |
+ yyrule - 1, yylno); | |
+ /* The symbols being reduced. */ | |
+ for (yyi = 0; yyi < yynrhs; yyi++) | |
+ { | |
+ fprintf (stderr, " $%d = ", yyi + 1); | |
+ yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], | |
+ &(yyvsp[(yyi + 1) - (yynrhs)]) | |
+ ); | |
+ fprintf (stderr, "\n"); | |
+ } | |
+} | |
+ | |
+# define YY_REDUCE_PRINT(Rule) \ | |
+do { \ | |
+ if (yydebug) \ | |
+ yy_reduce_print (yyvsp, Rule); \ | |
+} while (YYID (0)) | |
+ | |
+/* Nonzero means print parse trace. It is left uninitialized so that | |
+ multiple parsers can coexist. */ | |
+int yydebug; | |
+#else /* !YYDEBUG */ | |
+# define YYDPRINTF(Args) | |
+# define YY_SYMBOL_PRINT(Title, Type, Value, Location) | |
+# define YY_STACK_PRINT(Bottom, Top) | |
+# define YY_REDUCE_PRINT(Rule) | |
+#endif /* !YYDEBUG */ | |
-/* YYINITDEPTH indicates the initial size of the parser's stacks */ | |
+/* YYINITDEPTH -- initial size of the parser's stacks. */ | |
#ifndef YYINITDEPTH | |
-#define YYINITDEPTH 200 | |
+# define YYINITDEPTH 200 | |
#endif | |
-/* YYMAXDEPTH is the maximum size the stacks can grow to | |
- (effective only if the built-in stack extension method is used). */ | |
+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only | |
+ if the built-in stack extension method is used). | |
-#if YYMAXDEPTH == 0 | |
-#undef YYMAXDEPTH | |
-#endif | |
+ Do not make this value too large; the results are undefined if | |
+ YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) | |
+ evaluated with infinite-precision integer arithmetic. */ | |
#ifndef YYMAXDEPTH | |
-#define YYMAXDEPTH 10000 | |
+# define YYMAXDEPTH 10000 | |
#endif | |
+ | |
-/* Define __yy_memcpy. Note that the size argument | |
- should be passed with type unsigned int, because that is what the non-GCC | |
- definitions require. With GCC, __builtin_memcpy takes an arg | |
- of type size_t, but it can handle unsigned int. */ | |
- | |
-#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */ | |
-#define __yy_memcpy(TO,FROM,COUNT) __builtin_memcpy(TO,FROM,COUNT) | |
-#else /* not GNU C or C++ */ | |
-#ifndef __cplusplus | |
- | |
-/* This is the most reliable way to avoid incompatibilities | |
- in available built-in functions on various systems. */ | |
-static void | |
-__yy_memcpy (to, from, count) | |
- char *to; | |
- char *from; | |
- unsigned int count; | |
+ | |
+#if YYERROR_VERBOSE | |
+ | |
+# ifndef yystrlen | |
+# if defined __GLIBC__ && defined _STRING_H | |
+# define yystrlen strlen | |
+# else | |
+/* Return the length of YYSTR. */ | |
+#if (defined __STDC__ || defined __C99__FUNC__ \ | |
+ || defined __cplusplus || defined _MSC_VER) | |
+static YYSIZE_T | |
+yystrlen (const char *yystr) | |
+#else | |
+static YYSIZE_T | |
+yystrlen (yystr) | |
+ const char *yystr; | |
+#endif | |
+{ | |
+ YYSIZE_T yylen; | |
+ for (yylen = 0; yystr[yylen]; yylen++) | |
+ continue; | |
+ return yylen; | |
+} | |
+# endif | |
+# endif | |
+ | |
+# ifndef yystpcpy | |
+# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE | |
+# define yystpcpy stpcpy | |
+# else | |
+/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in | |
+ YYDEST. */ | |
+#if (defined __STDC__ || defined __C99__FUNC__ \ | |
+ || defined __cplusplus || defined _MSC_VER) | |
+static char * | |
+yystpcpy (char *yydest, const char *yysrc) | |
+#else | |
+static char * | |
+yystpcpy (yydest, yysrc) | |
+ char *yydest; | |
+ const char *yysrc; | |
+#endif | |
{ | |
- register char *f = from; | |
- register char *t = to; | |
- register int i = count; | |
+ char *yyd = yydest; | |
+ const char *yys = yysrc; | |
+ | |
+ while ((*yyd++ = *yys++) != '\0') | |
+ continue; | |
- while (i-- > 0) | |
- *t++ = *f++; | |
+ return yyd - 1; | |
} | |
+# endif | |
+# endif | |
+ | |
+# ifndef yytnamerr | |
+/* Copy to YYRES the contents of YYSTR after stripping away unnecessary | |
+ quotes and backslashes, so that it's suitable for yyerror. The | |
+ heuristic is that double-quoting is unnecessary unless the string | |
+ contains an apostrophe, a comma, or backslash (other than | |
+ backslash-backslash). YYSTR is taken from yytname. If YYRES is | |
+ null, do not copy; instead, return the length of what the result | |
+ would have been. */ | |
+static YYSIZE_T | |
+yytnamerr (char *yyres, const char *yystr) | |
+{ | |
+ if (*yystr == '"') | |
+ { | |
+ YYSIZE_T yyn = 0; | |
+ char const *yyp = yystr; | |
+ | |
+ for (;;) | |
+ switch (*++yyp) | |
+ { | |
+ case '\'': | |
+ case ',': | |
+ goto do_not_strip_quotes; | |
+ | |
+ case '\\': | |
+ if (*++yyp != '\\') | |
+ goto do_not_strip_quotes; | |
+ /* Fall through. */ | |
+ default: | |
+ if (yyres) | |
+ yyres[yyn] = *yyp; | |
+ yyn++; | |
+ break; | |
+ | |
+ case '"': | |
+ if (yyres) | |
+ yyres[yyn] = '\0'; | |
+ return yyn; | |
+ } | |
+ do_not_strip_quotes: ; | |
+ } | |
-#else /* __cplusplus */ | |
+ if (! yyres) | |
+ return yystrlen (yystr); | |
-/* This is the most reliable way to avoid incompatibilities | |
- in available built-in functions on various systems. */ | |
-static void | |
-__yy_memcpy (char *to, char *from, unsigned int count) | |
+ return yystpcpy (yyres, yystr) - yyres; | |
+} | |
+# endif | |
+ | |
+/* Copy into YYRESULT an error message about the unexpected token | |
+ YYCHAR while in state YYSTATE. Return the number of bytes copied, | |
+ including the terminating null byte. If YYRESULT is null, do not | |
+ copy anything; just return the number of bytes that would be | |
+ copied. As a special case, return 0 if an ordinary "syntax error" | |
+ message will do. Return YYSIZE_MAXIMUM if overflow occurs during | |
+ size calculation. */ | |
+static YYSIZE_T | |
+yysyntax_error (char *yyresult, int yystate, int yychar) | |
{ | |
- register char *t = to; | |
- register char *f = from; | |
- register int i = count; | |
+ int yyn = yypact[yystate]; | |
- while (i-- > 0) | |
- *t++ = *f++; | |
+ if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) | |
+ return 0; | |
+ else | |
+ { | |
+ int yytype = YYTRANSLATE (yychar); | |
+ YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); | |
+ YYSIZE_T yysize = yysize0; | |
+ YYSIZE_T yysize1; | |
+ int yysize_overflow = 0; | |
+ enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; | |
+ char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; | |
+ int yyx; | |
+ | |
+# if 0 | |
+ /* This is so xgettext sees the translatable formats that are | |
+ constructed on the fly. */ | |
+ YY_("syntax error, unexpected %s"); | |
+ YY_("syntax error, unexpected %s, expecting %s"); | |
+ YY_("syntax error, unexpected %s, expecting %s or %s"); | |
+ YY_("syntax error, unexpected %s, expecting %s or %s or %s"); | |
+ YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); | |
+# endif | |
+ char *yyfmt; | |
+ char const *yyf; | |
+ static char const yyunexpected[] = "syntax error, unexpected %s"; | |
+ static char const yyexpecting[] = ", expecting %s"; | |
+ static char const yyor[] = " or %s"; | |
+ char yyformat[sizeof yyunexpected | |
+ + sizeof yyexpecting - 1 | |
+ + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) | |
+ * (sizeof yyor - 1))]; | |
+ char const *yyprefix = yyexpecting; | |
+ | |
+ /* Start YYX at -YYN if negative to avoid negative indexes in | |
+ YYCHECK. */ | |
+ int yyxbegin = yyn < 0 ? -yyn : 0; | |
+ | |
+ /* Stay within bounds of both yycheck and yytname. */ | |
+ int yychecklim = YYLAST - yyn + 1; | |
+ int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; | |
+ int yycount = 1; | |
+ | |
+ yyarg[0] = yytname[yytype]; | |
+ yyfmt = yystpcpy (yyformat, yyunexpected); | |
+ | |
+ for (yyx = yyxbegin; yyx < yyxend; ++yyx) | |
+ if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) | |
+ { | |
+ if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) | |
+ { | |
+ yycount = 1; | |
+ yysize = yysize0; | |
+ yyformat[sizeof yyunexpected - 1] = '\0'; | |
+ break; | |
+ } | |
+ yyarg[yycount++] = yytname[yyx]; | |
+ yysize1 = yysize + yytnamerr (0, yytname[yyx]); | |
+ yysize_overflow |= (yysize1 < yysize); | |
+ yysize = yysize1; | |
+ yyfmt = yystpcpy (yyfmt, yyprefix); | |
+ yyprefix = yyor; | |
+ } | |
+ | |
+ yyf = YY_(yyformat); | |
+ yysize1 = yysize + yystrlen (yyf); | |
+ yysize_overflow |= (yysize1 < yysize); | |
+ yysize = yysize1; | |
+ | |
+ if (yysize_overflow) | |
+ return YYSIZE_MAXIMUM; | |
+ | |
+ if (yyresult) | |
+ { | |
+ /* Avoid sprintf, as that infringes on the user's name space. | |
+ Don't have undefined behavior even if the translation | |
+ produced a string with the wrong number of "%s"s. */ | |
+ char *yyp = yyresult; | |
+ int yyi = 0; | |
+ while ((*yyp = *yyf) != '\0') | |
+ { | |
+ if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) | |
+ { | |
+ yyp += yytnamerr (yyp, yyarg[yyi++]); | |
+ yyf += 2; | |
+ } | |
+ else | |
+ { | |
+ yyp++; | |
+ yyf++; | |
+ } | |
+ } | |
+ } | |
+ return yysize; | |
+ } | |
} | |
+#endif /* YYERROR_VERBOSE */ | |
+ | |
+/*-----------------------------------------------. | |
+| Release the memory associated to this symbol. | | |
+`-----------------------------------------------*/ | |
+ | |
+/*ARGSUSED*/ | |
+#if (defined __STDC__ || defined __C99__FUNC__ \ | |
+ || defined __cplusplus || defined _MSC_VER) | |
+static void | |
+yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) | |
+#else | |
+static void | |
+yydestruct (yymsg, yytype, yyvaluep) | |
+ const char *yymsg; | |
+ int yytype; | |
+ YYSTYPE *yyvaluep; | |
#endif | |
-#endif | |
+{ | |
+ YYUSE (yyvaluep); | |
+ | |
+ if (!yymsg) | |
+ yymsg = "Deleting"; | |
+ YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); | |
+ | |
+ switch (yytype) | |
+ { | |
+ | |
+ default: | |
+ break; | |
+ } | |
+} | |
-#line 217 "/home/haible/gnu/arch/linuxlibc6/share/bison.simple" | |
-/* The user can define YYPARSE_PARAM as the name of an argument to be passed | |
- into yyparse. The argument should have type void *. | |
- It should actually point to an object. | |
- Grammar actions can access the variable by casting it | |
- to the proper pointer type. */ | |
+/* Prevent warnings from -Wmissing-prototypes. */ | |
#ifdef YYPARSE_PARAM | |
-#ifdef __cplusplus | |
-#define YYPARSE_PARAM_ARG void *YYPARSE_PARAM | |
-#define YYPARSE_PARAM_DECL | |
-#else /* not __cplusplus */ | |
-#define YYPARSE_PARAM_ARG YYPARSE_PARAM | |
-#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; | |
-#endif /* not __cplusplus */ | |
-#else /* not YYPARSE_PARAM */ | |
-#define YYPARSE_PARAM_ARG | |
-#define YYPARSE_PARAM_DECL | |
-#endif /* not YYPARSE_PARAM */ | |
- | |
-/* Prevent warning if -Wstrict-prototypes. */ | |
-#ifdef __GNUC__ | |
-#ifdef YYPARSE_PARAM | |
-int yyparse (void *); | |
+#if defined __STDC__ || defined __cplusplus | |
+int yyparse (void *YYPARSE_PARAM); | |
#else | |
-int yyparse (void); | |
+int yyparse (); | |
#endif | |
+#else /* ! YYPARSE_PARAM */ | |
+#if defined __STDC__ || defined __cplusplus | |
+int yyparse (void); | |
+#else | |
+int yyparse (); | |
#endif | |
+#endif /* ! YYPARSE_PARAM */ | |
+ | |
-int | |
-yyparse(YYPARSE_PARAM_ARG) | |
- YYPARSE_PARAM_DECL | |
-{ | |
- register int yystate; | |
- register int yyn; | |
- register short *yyssp; | |
- register YYSTYPE *yyvsp; | |
- int yyerrstatus; /* number of tokens to shift before error messages … | |
- int yychar1 = 0; /* lookahead token as an internal (translat… | |
- short yyssa[YYINITDEPTH]; /* the state stack … | |
- YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack … | |
- short *yyss = yyssa; /* refer to the stacks thru separate po… | |
- YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them els… | |
-#ifdef YYLSP_NEEDED | |
- YYLTYPE yylsa[YYINITDEPTH]; /* the location stack … | |
- YYLTYPE *yyls = yylsa; | |
- YYLTYPE *yylsp; | |
-#define YYPOPSTACK (yyvsp--, yyssp--, yylsp--) | |
+/*----------. | |
+| yyparse. | | |
+`----------*/ | |
+ | |
+#ifdef YYPARSE_PARAM | |
+#if (defined __STDC__ || defined __C99__FUNC__ \ | |
+ || defined __cplusplus || defined _MSC_VER) | |
+int | |
+yyparse (void *YYPARSE_PARAM) | |
#else | |
-#define YYPOPSTACK (yyvsp--, yyssp--) | |
+int | |
+yyparse (YYPARSE_PARAM) | |
+ void *YYPARSE_PARAM; | |
#endif | |
+#else /* ! YYPARSE_PARAM */ | |
+#if (defined __STDC__ || defined __C99__FUNC__ \ | |
+ || defined __cplusplus || defined _MSC_VER) | |
+int | |
+yyparse (void) | |
+#else | |
+int | |
+yyparse () | |
- int yystacksize = YYINITDEPTH; | |
- int yyfree_stacks = 0; | |
- | |
-#ifdef YYPURE | |
- int yychar; | |
- YYSTYPE yylval; | |
- int yynerrs; | |
-#ifdef YYLSP_NEEDED | |
- YYLTYPE yylloc; | |
#endif | |
#endif | |
+{ | |
+ /* The lookahead symbol. */ | |
+int yychar; | |
+ | |
+/* The semantic value of the lookahead symbol. */ | |
+YYSTYPE yylval; | |
+ | |
+/* Number of syntax errors so far. */ | |
+int yynerrs; | |
+ | |
+ int yystate; | |
+ int yyn; | |
+ int yyresult; | |
+ /* Number of tokens to shift before error messages enabled. */ | |
+ int yyerrstatus; | |
+ /* Lookahead token as an internal (translated) token number. */ | |
+ int yytoken = 0; | |
+#if YYERROR_VERBOSE | |
+ /* Buffer for error messages, and its allocated size. */ | |
+ char yymsgbuf[128]; | |
+ char *yymsg = yymsgbuf; | |
+ YYSIZE_T yymsg_alloc = sizeof yymsgbuf; | |
+#endif | |
- YYSTYPE yyval; /* the variable used to return … | |
- /* semantic values from the action */ | |
- /* routines */ | |
+ /* Three stacks and their tools: | |
+ `yyss': related to states, | |
+ `yyvs': related to semantic values, | |
+ `yyls': related to locations. | |
- int yylen; | |
+ Refer to the stacks thru separate pointers, to allow yyoverflow | |
+ to reallocate them elsewhere. */ | |
+ | |
+ /* The state stack. */ | |
+ yytype_int16 yyssa[YYINITDEPTH]; | |
+ yytype_int16 *yyss = yyssa; | |
+ yytype_int16 *yyssp; | |
+ | |
+ /* The semantic value stack. */ | |
+ YYSTYPE yyvsa[YYINITDEPTH]; | |
+ YYSTYPE *yyvs = yyvsa; | |
+ YYSTYPE *yyvsp; | |
+ | |
+ | |
+ | |
+#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) | |
+ | |
+ YYSIZE_T yystacksize = YYINITDEPTH; | |
+ | |
+ /* The variables used to return semantic value and location from the | |
+ action routines. */ | |
+ YYSTYPE yyval; | |
-#if YYDEBUG != 0 | |
- if (yydebug) | |
- fprintf(stderr, "Starting parse\n"); | |
-#endif | |
+ | |
+ /* The number of symbols on the RHS of the reduced rule. | |
+ Keep to zero when no symbol should be popped. */ | |
+ int yylen = 0; | |
+ | |
+ YYDPRINTF ((stderr, "Starting parse\n")); | |
yystate = 0; | |
yyerrstatus = 0; | |
t@@ -606,548 +1284,508 @@ yyparse(YYPARSE_PARAM_ARG) | |
so that they stay on the same level as the state stack. | |
The wasted elements are never initialized. */ | |
- yyssp = yyss - 1; | |
+ yyssp = yyss; | |
yyvsp = yyvs; | |
-#ifdef YYLSP_NEEDED | |
- yylsp = yyls; | |
-#endif | |
-/* Push a new state, which is found in yystate . */ | |
-/* In all cases, when you get here, the value and location stacks | |
- have just been pushed. so pushing a state here evens the stacks. */ | |
-yynewstate: | |
+ goto yysetstate; | |
- *++yyssp = yystate; | |
+/*------------------------------------------------------------. | |
+| yynewstate -- Push a new state, which is found in yystate. | | |
+`------------------------------------------------------------*/ | |
+ yynewstate: | |
+ /* In all cases, when you get here, the value and location stacks | |
+ have just been pushed. So pushing a state here evens the stacks. */ | |
+ yyssp++; | |
- if (yyssp >= yyss + yystacksize - 1) | |
- { | |
- /* Give user a chance to reallocate the stack */ | |
- /* Use copies of these so that the &'s don't force the real ones into me… | |
- YYSTYPE *yyvs1 = yyvs; | |
- short *yyss1 = yyss; | |
-#ifdef YYLSP_NEEDED | |
- YYLTYPE *yyls1 = yyls; | |
-#endif | |
+ yysetstate: | |
+ *yyssp = yystate; | |
+ if (yyss + yystacksize - 1 <= yyssp) | |
+ { | |
/* Get the current used size of the three stacks, in elements. */ | |
- int size = yyssp - yyss + 1; | |
+ YYSIZE_T yysize = yyssp - yyss + 1; | |
#ifdef yyoverflow | |
- /* Each stack pointer address is followed by the size of | |
- the data in use in that stack, in bytes. */ | |
-#ifdef YYLSP_NEEDED | |
- /* This used to be a conditional around just the two extra args, | |
- but that might be undefined if yyoverflow is a macro. */ | |
- yyoverflow("parser stack overflow", | |
- &yyss1, size * sizeof (*yyssp), | |
- &yyvs1, size * sizeof (*yyvsp), | |
- &yyls1, size * sizeof (*yylsp), | |
- &yystacksize); | |
-#else | |
- yyoverflow("parser stack overflow", | |
- &yyss1, size * sizeof (*yyssp), | |
- &yyvs1, size * sizeof (*yyvsp), | |
- &yystacksize); | |
-#endif | |
+ { | |
+ /* Give user a chance to reallocate the stack. Use copies of | |
+ these so that the &'s don't force the real ones into | |
+ memory. */ | |
+ YYSTYPE *yyvs1 = yyvs; | |
+ yytype_int16 *yyss1 = yyss; | |
- yyss = yyss1; yyvs = yyvs1; | |
-#ifdef YYLSP_NEEDED | |
- yyls = yyls1; | |
-#endif | |
+ | |
+ /* Each stack pointer address is followed by the size of the | |
+ data in use in that stack, in bytes. This used to be a | |
+ conditional around just the two extra args, but that might | |
+ be undefined if yyoverflow is a macro. */ | |
+ yyoverflow (YY_("memory exhausted"), | |
+ &yyss1, yysize * sizeof (*yyssp), | |
+ &yyvs1, yysize * sizeof (*yyvsp), | |
+ | |
+ &yystacksize); | |
+ | |
+ yyss = yyss1; | |
+ yyvs = yyvs1; | |
+ } | |
#else /* no yyoverflow */ | |
+# ifndef YYSTACK_RELOCATE | |
+ goto yyexhaustedlab; | |
+# else | |
/* Extend the stack our own way. */ | |
- if (yystacksize >= YYMAXDEPTH) | |
- { | |
- yyerror("parser stack overflow"); | |
- if (yyfree_stacks) | |
- { | |
- free (yyss); | |
- free (yyvs); | |
-#ifdef YYLSP_NEEDED | |
- free (yyls); | |
-#endif | |
- } | |
- return 2; | |
- } | |
+ if (YYMAXDEPTH <= yystacksize) | |
+ goto yyexhaustedlab; | |
yystacksize *= 2; | |
- if (yystacksize > YYMAXDEPTH) | |
+ if (YYMAXDEPTH < yystacksize) | |
yystacksize = YYMAXDEPTH; | |
-#ifndef YYSTACK_USE_ALLOCA | |
- yyfree_stacks = 1; | |
-#endif | |
- yyss = (short *) YYSTACK_ALLOC (yystacksize * sizeof (*yyssp)); | |
- __yy_memcpy ((char *)yyss, (char *)yyss1, | |
- size * (unsigned int) sizeof (*yyssp)); | |
- yyvs = (YYSTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yyvsp)); | |
- __yy_memcpy ((char *)yyvs, (char *)yyvs1, | |
- size * (unsigned int) sizeof (*yyvsp)); | |
-#ifdef YYLSP_NEEDED | |
- yyls = (YYLTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yylsp)); | |
- __yy_memcpy ((char *)yyls, (char *)yyls1, | |
- size * (unsigned int) sizeof (*yylsp)); | |
-#endif | |
+ | |
+ { | |
+ yytype_int16 *yyss1 = yyss; | |
+ union yyalloc *yyptr = | |
+ (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); | |
+ if (! yyptr) | |
+ goto yyexhaustedlab; | |
+ YYSTACK_RELOCATE (yyss); | |
+ YYSTACK_RELOCATE (yyvs); | |
+ | |
+# undef YYSTACK_RELOCATE | |
+ if (yyss1 != yyssa) | |
+ YYSTACK_FREE (yyss1); | |
+ } | |
+# endif | |
#endif /* no yyoverflow */ | |
- yyssp = yyss + size - 1; | |
- yyvsp = yyvs + size - 1; | |
-#ifdef YYLSP_NEEDED | |
- yylsp = yyls + size - 1; | |
-#endif | |
+ yyssp = yyss + yysize - 1; | |
+ yyvsp = yyvs + yysize - 1; | |
-#if YYDEBUG != 0 | |
- if (yydebug) | |
- fprintf(stderr, "Stack size increased to %d\n", yystacksize); | |
-#endif | |
- if (yyssp >= yyss + yystacksize - 1) | |
+ YYDPRINTF ((stderr, "Stack size increased to %lu\n", | |
+ (unsigned long int) yystacksize)); | |
+ | |
+ if (yyss + yystacksize - 1 <= yyssp) | |
YYABORT; | |
} | |
-#if YYDEBUG != 0 | |
- if (yydebug) | |
- fprintf(stderr, "Entering state %d\n", yystate); | |
-#endif | |
+ YYDPRINTF ((stderr, "Entering state %d\n", yystate)); | |
+ | |
+ if (yystate == YYFINAL) | |
+ YYACCEPT; | |
goto yybackup; | |
- yybackup: | |
-/* Do appropriate processing given the current state. */ | |
-/* Read a lookahead token if we need one and don't already have one. */ | |
-/* yyresume: */ | |
+/*-----------. | |
+| yybackup. | | |
+`-----------*/ | |
+yybackup: | |
- /* First try to decide what to do without reference to lookahead token. */ | |
+ /* Do appropriate processing given the current state. Read a | |
+ lookahead token if we need one and don't already have one. */ | |
+ /* First try to decide what to do without reference to lookahead token. */ | |
yyn = yypact[yystate]; | |
- if (yyn == YYFLAG) | |
+ if (yyn == YYPACT_NINF) | |
goto yydefault; | |
/* Not known => get a lookahead token if don't already have one. */ | |
- /* yychar is either YYEMPTY or YYEOF | |
- or a valid token in external form. */ | |
- | |
+ /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ | |
if (yychar == YYEMPTY) | |
{ | |
-#if YYDEBUG != 0 | |
- if (yydebug) | |
- fprintf(stderr, "Reading a token: "); | |
-#endif | |
+ YYDPRINTF ((stderr, "Reading a token: ")); | |
yychar = YYLEX; | |
} | |
- /* Convert token to internal form (in yychar1) for indexing tables with */ | |
- | |
- if (yychar <= 0) /* This means end of input. */ | |
+ if (yychar <= YYEOF) | |
{ | |
- yychar1 = 0; | |
- yychar = YYEOF; /* Don't call YYLEX any more */ | |
- | |
-#if YYDEBUG != 0 | |
- if (yydebug) | |
- fprintf(stderr, "Now at end of input.\n"); | |
-#endif | |
+ yychar = yytoken = YYEOF; | |
+ YYDPRINTF ((stderr, "Now at end of input.\n")); | |
} | |
else | |
{ | |
- yychar1 = YYTRANSLATE(yychar); | |
- | |
-#if YYDEBUG != 0 | |
- if (yydebug) | |
- { | |
- fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]); | |
- /* Give the individual parser a way to print the precise meaning | |
- of a token, for further debugging info. */ | |
-#ifdef YYPRINT | |
- YYPRINT (stderr, yychar, yylval); | |
-#endif | |
- fprintf (stderr, ")\n"); | |
- } | |
-#endif | |
+ yytoken = YYTRANSLATE (yychar); | |
+ YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); | |
} | |
- yyn += yychar1; | |
- if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1) | |
+ /* If the proper action on seeing token YYTOKEN is to reduce or to | |
+ detect an error, take that action. */ | |
+ yyn += yytoken; | |
+ if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) | |
goto yydefault; | |
- | |
yyn = yytable[yyn]; | |
- | |
- /* yyn is what to do for this token type in this state. | |
- Negative => reduce, -yyn is rule number. | |
- Positive => shift, yyn is new state. | |
- New state is final state => don't bother to shift, | |
- just return success. | |
- 0, or most negative number => error. */ | |
- | |
- if (yyn < 0) | |
+ if (yyn <= 0) | |
{ | |
- if (yyn == YYFLAG) | |
+ if (yyn == 0 || yyn == YYTABLE_NINF) | |
goto yyerrlab; | |
yyn = -yyn; | |
goto yyreduce; | |
} | |
- else if (yyn == 0) | |
- goto yyerrlab; | |
- if (yyn == YYFINAL) | |
- YYACCEPT; | |
+ /* Count tokens shifted since error; after three, turn off error | |
+ status. */ | |
+ if (yyerrstatus) | |
+ yyerrstatus--; | |
/* Shift the lookahead token. */ | |
+ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); | |
-#if YYDEBUG != 0 | |
- if (yydebug) | |
- fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]); | |
-#endif | |
- | |
- /* Discard the token being shifted unless it is eof. */ | |
- if (yychar != YYEOF) | |
- yychar = YYEMPTY; | |
+ /* Discard the shifted token. */ | |
+ yychar = YYEMPTY; | |
+ yystate = yyn; | |
*++yyvsp = yylval; | |
-#ifdef YYLSP_NEEDED | |
- *++yylsp = yylloc; | |
-#endif | |
- /* count tokens shifted since error; after three, turn off error status. */ | |
- if (yyerrstatus) yyerrstatus--; | |
- | |
- yystate = yyn; | |
goto yynewstate; | |
-/* Do the default action for the current state. */ | |
-yydefault: | |
+/*-----------------------------------------------------------. | |
+| yydefault -- do the default action for the current state. | | |
+`-----------------------------------------------------------*/ | |
+yydefault: | |
yyn = yydefact[yystate]; | |
if (yyn == 0) | |
goto yyerrlab; | |
+ goto yyreduce; | |
+ | |
-/* Do a reduction. yyn is the number of a rule to reduce with. */ | |
+/*-----------------------------. | |
+| yyreduce -- Do a reduction. | | |
+`-----------------------------*/ | |
yyreduce: | |
+ /* yyn is the number of a rule to reduce with. */ | |
yylen = yyr2[yyn]; | |
- if (yylen > 0) | |
- yyval = yyvsp[1-yylen]; /* implement default value of the action */ | |
-#if YYDEBUG != 0 | |
- if (yydebug) | |
+ /* If YYLEN is nonzero, implement the default value of the action: | |
+ `$$ = $1'. | |
+ | |
+ Otherwise, the following line sets YYVAL to garbage. | |
+ This behavior is undocumented and Bison | |
+ users should not rely upon it. Assigning to YYVAL | |
+ unconditionally makes the parser a bit smaller, and it avoids a | |
+ GCC warning that YYVAL may be used uninitialized. */ | |
+ yyval = yyvsp[1-yylen]; | |
+ | |
+ | |
+ YY_REDUCE_PRINT (yyn); | |
+ switch (yyn) | |
{ | |
- int i; | |
+ case 2: | |
+/* Line 1269 of yacc.c. */ | |
+#line 155 "plural.y" | |
+ { | |
+ if ((yyvsp[(1) - (1)].exp) == NULL) | |
+ YYABORT; | |
+ ((struct parse_args *) arg)->res = (yyvsp[(1) - (1)].exp); | |
+ } | |
+ break; | |
- fprintf (stderr, "Reducing via rule %d (line %d), ", | |
- yyn, yyrline[yyn]); | |
+ case 3: | |
+/* Line 1269 of yacc.c. */ | |
+#line 163 "plural.y" | |
+ { | |
+ (yyval.exp) = new_exp_3 (qmop, (yyvsp[(1) - (5)].exp), (yyvsp[(3) … | |
+ } | |
+ break; | |
- /* Print the symbols being reduced, and their result. */ | |
- for (i = yyprhs[yyn]; yyrhs[i] > 0; i++) | |
- fprintf (stderr, "%s ", yytname[yyrhs[i]]); | |
- fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]); | |
- } | |
-#endif | |
+ case 4: | |
+/* Line 1269 of yacc.c. */ | |
+#line 167 "plural.y" | |
+ { | |
+ (yyval.exp) = new_exp_2 (lor, (yyvsp[(1) - (3)].exp), (yyvsp[(3) -… | |
+ } | |
+ break; | |
+ case 5: | |
+/* Line 1269 of yacc.c. */ | |
+#line 171 "plural.y" | |
+ { | |
+ (yyval.exp) = new_exp_2 (land, (yyvsp[(1) - (3)].exp), (yyvsp[(3) … | |
+ } | |
+ break; | |
- switch (yyn) { | |
+ case 6: | |
+/* Line 1269 of yacc.c. */ | |
+#line 175 "plural.y" | |
+ { | |
+ (yyval.exp) = new_exp_2 ((yyvsp[(2) - (3)].op), (yyvsp[(1) - (3)].… | |
+ } | |
+ break; | |
-case 1: | |
-#line 178 "plural.y" | |
-{ | |
- if (yyvsp[0].exp == NULL) | |
- YYABORT; | |
- ((struct parse_args *) arg)->res = yyvsp[0].exp; | |
- ; | |
- break;} | |
-case 2: | |
-#line 186 "plural.y" | |
-{ | |
- yyval.exp = new_exp_3 (qmop, yyvsp[-4].exp, yyvsp[-2].exp, yyvsp[0… | |
- ; | |
- break;} | |
-case 3: | |
-#line 190 "plural.y" | |
-{ | |
- yyval.exp = new_exp_2 (lor, yyvsp[-2].exp, yyvsp[0].exp); | |
- ; | |
- break;} | |
-case 4: | |
-#line 194 "plural.y" | |
-{ | |
- yyval.exp = new_exp_2 (land, yyvsp[-2].exp, yyvsp[0].exp); | |
- ; | |
- break;} | |
-case 5: | |
-#line 198 "plural.y" | |
-{ | |
- yyval.exp = new_exp_2 (yyvsp[-1].op, yyvsp[-2].exp, yyvsp[0].exp); | |
- ; | |
- break;} | |
-case 6: | |
-#line 202 "plural.y" | |
-{ | |
- yyval.exp = new_exp_2 (yyvsp[-1].op, yyvsp[-2].exp, yyvsp[0].exp); | |
- ; | |
- break;} | |
-case 7: | |
-#line 206 "plural.y" | |
-{ | |
- yyval.exp = new_exp_2 (yyvsp[-1].op, yyvsp[-2].exp, yyvsp[0].exp); | |
- ; | |
- break;} | |
-case 8: | |
-#line 210 "plural.y" | |
-{ | |
- yyval.exp = new_exp_2 (yyvsp[-1].op, yyvsp[-2].exp, yyvsp[0].exp); | |
- ; | |
- break;} | |
-case 9: | |
-#line 214 "plural.y" | |
-{ | |
- yyval.exp = new_exp_1 (lnot, yyvsp[0].exp); | |
- ; | |
- break;} | |
-case 10: | |
-#line 218 "plural.y" | |
-{ | |
- yyval.exp = new_exp_0 (var); | |
- ; | |
- break;} | |
-case 11: | |
-#line 222 "plural.y" | |
-{ | |
- if ((yyval.exp = new_exp_0 (num)) != NULL) | |
- yyval.exp->val.num = yyvsp[0].num; | |
- ; | |
- break;} | |
-case 12: | |
-#line 227 "plural.y" | |
-{ | |
- yyval.exp = yyvsp[-1].exp; | |
- ; | |
- break;} | |
-} | |
- /* the action file gets copied in in place of this dollarsign */ | |
-#line 543 "/home/haible/gnu/arch/linuxlibc6/share/bison.simple" | |
- | |
- yyvsp -= yylen; | |
- yyssp -= yylen; | |
-#ifdef YYLSP_NEEDED | |
- yylsp -= yylen; | |
-#endif | |
+ case 7: | |
+/* Line 1269 of yacc.c. */ | |
+#line 179 "plural.y" | |
+ { | |
+ (yyval.exp) = new_exp_2 ((yyvsp[(2) - (3)].op), (yyvsp[(1) - (3)].… | |
+ } | |
+ break; | |
-#if YYDEBUG != 0 | |
- if (yydebug) | |
+ case 8: | |
+/* Line 1269 of yacc.c. */ | |
+#line 183 "plural.y" | |
{ | |
- short *ssp1 = yyss - 1; | |
- fprintf (stderr, "state stack now"); | |
- while (ssp1 != yyssp) | |
- fprintf (stderr, " %d", *++ssp1); | |
- fprintf (stderr, "\n"); | |
- } | |
-#endif | |
+ (yyval.exp) = new_exp_2 ((yyvsp[(2) - (3)].op), (yyvsp[(1) - (3)].… | |
+ } | |
+ break; | |
- *++yyvsp = yyval; | |
+ case 9: | |
+/* Line 1269 of yacc.c. */ | |
+#line 187 "plural.y" | |
+ { | |
+ (yyval.exp) = new_exp_2 ((yyvsp[(2) - (3)].op), (yyvsp[(1) - (3)].… | |
+ } | |
+ break; | |
-#ifdef YYLSP_NEEDED | |
- yylsp++; | |
- if (yylen == 0) | |
+ case 10: | |
+/* Line 1269 of yacc.c. */ | |
+#line 191 "plural.y" | |
{ | |
- yylsp->first_line = yylloc.first_line; | |
- yylsp->first_column = yylloc.first_column; | |
- yylsp->last_line = (yylsp-1)->last_line; | |
- yylsp->last_column = (yylsp-1)->last_column; | |
- yylsp->text = 0; | |
- } | |
- else | |
+ (yyval.exp) = new_exp_1 (lnot, (yyvsp[(2) - (2)].exp)); | |
+ } | |
+ break; | |
+ | |
+ case 11: | |
+/* Line 1269 of yacc.c. */ | |
+#line 195 "plural.y" | |
{ | |
- yylsp->last_line = (yylsp+yylen-1)->last_line; | |
- yylsp->last_column = (yylsp+yylen-1)->last_column; | |
+ (yyval.exp) = new_exp_0 (var); | |
+ } | |
+ break; | |
+ | |
+ case 12: | |
+/* Line 1269 of yacc.c. */ | |
+#line 199 "plural.y" | |
+ { | |
+ if (((yyval.exp) = new_exp_0 (num)) != NULL) | |
+ (yyval.exp)->val.num = (yyvsp[(1) - (1)].num); | |
+ } | |
+ break; | |
+ | |
+ case 13: | |
+/* Line 1269 of yacc.c. */ | |
+#line 204 "plural.y" | |
+ { | |
+ (yyval.exp) = (yyvsp[(2) - (3)].exp); | |
+ } | |
+ break; | |
+ | |
+ | |
+/* Line 1269 of yacc.c. */ | |
+#line 1572 "plural.c" | |
+ default: break; | |
} | |
-#endif | |
+ YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); | |
- /* Now "shift" the result of the reduction. | |
- Determine what state that goes to, | |
- based on the state we popped back to | |
- and the rule number reduced by. */ | |
+ YYPOPSTACK (yylen); | |
+ yylen = 0; | |
+ YY_STACK_PRINT (yyss, yyssp); | |
+ | |
+ *++yyvsp = yyval; | |
+ | |
+ | |
+ /* Now `shift' the result of the reduction. Determine what state | |
+ that goes to, based on the state we popped back to and the rule | |
+ number reduced by. */ | |
yyn = yyr1[yyn]; | |
- yystate = yypgoto[yyn - YYNTBASE] + *yyssp; | |
- if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) | |
+ yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; | |
+ if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) | |
yystate = yytable[yystate]; | |
else | |
- yystate = yydefgoto[yyn - YYNTBASE]; | |
+ yystate = yydefgoto[yyn - YYNTOKENS]; | |
goto yynewstate; | |
-yyerrlab: /* here on detecting error */ | |
- if (! yyerrstatus) | |
- /* If not already recovering from an error, report this error. */ | |
+/*------------------------------------. | |
+| yyerrlab -- here on detecting error | | |
+`------------------------------------*/ | |
+yyerrlab: | |
+ /* If not already recovering from an error, report this error. */ | |
+ if (!yyerrstatus) | |
{ | |
++yynerrs; | |
+#if ! YYERROR_VERBOSE | |
+ yyerror (YY_("syntax error")); | |
+#else | |
+ { | |
+ YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); | |
+ if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) | |
+ { | |
+ YYSIZE_T yyalloc = 2 * yysize; | |
+ if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) | |
+ yyalloc = YYSTACK_ALLOC_MAXIMUM; | |
+ if (yymsg != yymsgbuf) | |
+ YYSTACK_FREE (yymsg); | |
+ yymsg = (char *) YYSTACK_ALLOC (yyalloc); | |
+ if (yymsg) | |
+ yymsg_alloc = yyalloc; | |
+ else | |
+ { | |
+ yymsg = yymsgbuf; | |
+ yymsg_alloc = sizeof yymsgbuf; | |
+ } | |
+ } | |
-#ifdef YYERROR_VERBOSE | |
- yyn = yypact[yystate]; | |
- | |
- if (yyn > YYFLAG && yyn < YYLAST) | |
- { | |
- int size = 0; | |
- char *msg; | |
- int x, count; | |
- | |
- count = 0; | |
- /* Start X at -yyn if nec to avoid negative indexes in yycheck. */ | |
- for (x = (yyn < 0 ? -yyn : 0); | |
- x < (sizeof(yytname) / sizeof(char *)); x++) | |
- if (yycheck[x + yyn] == x) | |
- size += strlen(yytname[x]) + 15, count++; | |
- msg = (char *) malloc(size + 15); | |
- if (msg != 0) | |
- { | |
- strcpy(msg, "parse error"); | |
- | |
- if (count < 5) | |
- { | |
- count = 0; | |
- for (x = (yyn < 0 ? -yyn : 0); | |
- x < (sizeof(yytname) / sizeof(char *)); x++) | |
- if (yycheck[x + yyn] == x) | |
- { | |
- strcat(msg, count == 0 ? ", expecting `" : " or `"); | |
- strcat(msg, yytname[x]); | |
- strcat(msg, "'"); | |
- count++; | |
- } | |
- } | |
- yyerror(msg); | |
- free(msg); | |
- } | |
- else | |
- yyerror ("parse error; also virtual memory exceeded"); | |
- } | |
- else | |
-#endif /* YYERROR_VERBOSE */ | |
- yyerror("parse error"); | |
+ if (0 < yysize && yysize <= yymsg_alloc) | |
+ { | |
+ (void) yysyntax_error (yymsg, yystate, yychar); | |
+ yyerror (yymsg); | |
+ } | |
+ else | |
+ { | |
+ yyerror (YY_("syntax error")); | |
+ if (yysize != 0) | |
+ goto yyexhaustedlab; | |
+ } | |
+ } | |
+#endif | |
} | |
- goto yyerrlab1; | |
-yyerrlab1: /* here on error raised explicitly by an action */ | |
+ | |
if (yyerrstatus == 3) | |
{ | |
- /* if just tried and failed to reuse lookahead token after an error, dis… | |
- | |
- /* return failure if at end of input */ | |
- if (yychar == YYEOF) | |
- YYABORT; | |
- | |
-#if YYDEBUG != 0 | |
- if (yydebug) | |
- fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1… | |
-#endif | |
+ /* If just tried and failed to reuse lookahead token after an | |
+ error, discard it. */ | |
- yychar = YYEMPTY; | |
+ if (yychar <= YYEOF) | |
+ { | |
+ /* Return failure if at end of input. */ | |
+ if (yychar == YYEOF) | |
+ YYABORT; | |
+ } | |
+ else | |
+ { | |
+ yydestruct ("Error: discarding", | |
+ yytoken, &yylval); | |
+ yychar = YYEMPTY; | |
+ } | |
} | |
- /* Else will try to reuse lookahead token | |
- after shifting the error token. */ | |
+ /* Else will try to reuse lookahead token after shifting the error | |
+ token. */ | |
+ goto yyerrlab1; | |
- yyerrstatus = 3; /* Each real token shifted decrements this */ | |
- goto yyerrhandle; | |
+/*---------------------------------------------------. | |
+| yyerrorlab -- error raised explicitly by YYERROR. | | |
+`---------------------------------------------------*/ | |
+yyerrorlab: | |
-yyerrdefault: /* current state does not do anything special for the error tok… | |
+ /* Pacify compilers like GCC when the user code never invokes | |
+ YYERROR and the label yyerrorlab therefore never appears in user | |
+ code. */ | |
+ if (/*CONSTCOND*/ 0) | |
+ goto yyerrorlab; | |
-#if 0 | |
- /* This is wrong; only states that explicitly want error tokens | |
- should shift them. */ | |
- yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Oth… | |
- if (yyn) goto yydefault; | |
-#endif | |
+ /* Do not reclaim the symbols of the rule which action triggered | |
+ this YYERROR. */ | |
+ YYPOPSTACK (yylen); | |
+ yylen = 0; | |
+ YY_STACK_PRINT (yyss, yyssp); | |
+ yystate = *yyssp; | |
+ goto yyerrlab1; | |
-yyerrpop: /* pop the current state because it cannot handle the error token … | |
- if (yyssp == yyss) YYABORT; | |
- yyvsp--; | |
- yystate = *--yyssp; | |
-#ifdef YYLSP_NEEDED | |
- yylsp--; | |
-#endif | |
+/*-------------------------------------------------------------. | |
+| yyerrlab1 -- common code for both syntax error and YYERROR. | | |
+`-------------------------------------------------------------*/ | |
+yyerrlab1: | |
+ yyerrstatus = 3; /* Each real token shifted decrements this. */ | |
-#if YYDEBUG != 0 | |
- if (yydebug) | |
+ for (;;) | |
{ | |
- short *ssp1 = yyss - 1; | |
- fprintf (stderr, "Error: state stack now"); | |
- while (ssp1 != yyssp) | |
- fprintf (stderr, " %d", *++ssp1); | |
- fprintf (stderr, "\n"); | |
- } | |
-#endif | |
- | |
-yyerrhandle: | |
+ yyn = yypact[yystate]; | |
+ if (yyn != YYPACT_NINF) | |
+ { | |
+ yyn += YYTERROR; | |
+ if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) | |
+ { | |
+ yyn = yytable[yyn]; | |
+ if (0 < yyn) | |
+ break; | |
+ } | |
+ } | |
- yyn = yypact[yystate]; | |
- if (yyn == YYFLAG) | |
- goto yyerrdefault; | |
+ /* Pop the current state because it cannot handle the error token. */ | |
+ if (yyssp == yyss) | |
+ YYABORT; | |
- yyn += YYTERROR; | |
- if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR) | |
- goto yyerrdefault; | |
- yyn = yytable[yyn]; | |
- if (yyn < 0) | |
- { | |
- if (yyn == YYFLAG) | |
- goto yyerrpop; | |
- yyn = -yyn; | |
- goto yyreduce; | |
+ yydestruct ("Error: popping", | |
+ yystos[yystate], yyvsp); | |
+ YYPOPSTACK (1); | |
+ yystate = *yyssp; | |
+ YY_STACK_PRINT (yyss, yyssp); | |
} | |
- else if (yyn == 0) | |
- goto yyerrpop; | |
- if (yyn == YYFINAL) | |
- YYACCEPT; | |
+ *++yyvsp = yylval; | |
-#if YYDEBUG != 0 | |
- if (yydebug) | |
- fprintf(stderr, "Shifting error token, "); | |
-#endif | |
- *++yyvsp = yylval; | |
-#ifdef YYLSP_NEEDED | |
- *++yylsp = yylloc; | |
-#endif | |
+ /* Shift the error token. */ | |
+ YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); | |
yystate = yyn; | |
goto yynewstate; | |
- yyacceptlab: | |
- /* YYACCEPT comes here. */ | |
- if (yyfree_stacks) | |
- { | |
- free (yyss); | |
- free (yyvs); | |
-#ifdef YYLSP_NEEDED | |
- free (yyls); | |
+ | |
+/*-------------------------------------. | |
+| yyacceptlab -- YYACCEPT comes here. | | |
+`-------------------------------------*/ | |
+yyacceptlab: | |
+ yyresult = 0; | |
+ goto yyreturn; | |
+ | |
+/*-----------------------------------. | |
+| yyabortlab -- YYABORT comes here. | | |
+`-----------------------------------*/ | |
+yyabortlab: | |
+ yyresult = 1; | |
+ goto yyreturn; | |
+ | |
+#ifndef yyoverflow | |
+/*-------------------------------------------------. | |
+| yyexhaustedlab -- memory exhaustion comes here. | | |
+`-------------------------------------------------*/ | |
+yyexhaustedlab: | |
+ yyerror (YY_("memory exhausted")); | |
+ yyresult = 2; | |
+ /* Fall through. */ | |
#endif | |
- } | |
- return 0; | |
- yyabortlab: | |
- /* YYABORT comes here. */ | |
- if (yyfree_stacks) | |
+yyreturn: | |
+ if (yychar != YYEMPTY) | |
+ yydestruct ("Cleanup: discarding lookahead", | |
+ yytoken, &yylval); | |
+ /* Do not reclaim the symbols of the rule which action triggered | |
+ this YYABORT or YYACCEPT. */ | |
+ YYPOPSTACK (yylen); | |
+ YY_STACK_PRINT (yyss, yyssp); | |
+ while (yyssp != yyss) | |
{ | |
- free (yyss); | |
- free (yyvs); | |
-#ifdef YYLSP_NEEDED | |
- free (yyls); | |
-#endif | |
+ yydestruct ("Cleanup: popping", | |
+ yystos[*yyssp], yyvsp); | |
+ YYPOPSTACK (1); | |
} | |
- return 1; | |
+#ifndef yyoverflow | |
+ if (yyss != yyssa) | |
+ YYSTACK_FREE (yyss); | |
+#endif | |
+#if YYERROR_VERBOSE | |
+ if (yymsg != yymsgbuf) | |
+ YYSTACK_FREE (yymsg); | |
+#endif | |
+ /* Make sure YYID is used. */ | |
+ return YYID (yyresult); | |
} | |
-#line 232 "plural.y" | |
+ | |
+ | |
+/* Line 1486 of yacc.c. */ | |
+#line 209 "plural.y" | |
void | |
internal_function | |
-FREE_EXPRESSION (exp) | |
- struct expression *exp; | |
+FREE_EXPRESSION (struct expression *exp) | |
{ | |
if (exp == NULL) | |
return; | |
t@@ -1173,9 +1811,7 @@ FREE_EXPRESSION (exp) | |
static int | |
-yylex (lval, pexp) | |
- YYSTYPE *lval; | |
- const char **pexp; | |
+yylex (YYSTYPE *lval, const char **pexp) | |
{ | |
const char *exp = *pexp; | |
int result; | |
t@@ -1318,8 +1954,8 @@ yylex (lval, pexp) | |
static void | |
-yyerror (str) | |
- const char *str; | |
+yyerror (const char *str) | |
{ | |
/* Do nothing. We don't print error messages here. */ | |
} | |
+ | |
diff --git a/intl/plural.y b/intl/plural.y | |
t@@ -1,26 +1,28 @@ | |
%{ | |
/* Expression parsing for plural form selection. | |
- Copyright (C) 2000, 2001 Free Software Foundation, Inc. | |
+ Copyright (C) 2000-2001, 2003, 2005-2006 Free Software Foundation, Inc. | |
Written by Ulrich Drepper <[email protected]>, 2000. | |
- 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) | |
+ This program is free software; you can redistribute it and/or modify it | |
+ under the terms of the GNU Library General Public License as published | |
+ by the Free Software Foundation; either version 2, 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 bison generated parser uses alloca. AIX 3 forces us to put this | |
- declaration at the beginning of the file. The declaration in bison's | |
- skeleton file comes too late. This must come before <config.h> | |
- because <config.h> may include arbitrary system headers. */ | |
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
+ Library General Public License for more details. | |
+ | |
+ You should have received a copy of the GNU Library General Public | |
+ License along with this program; if not, write to the Free Software | |
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, | |
+ USA. */ | |
+ | |
+/* For bison < 2.0, the bison generated parser uses alloca. AIX 3 forces us | |
+ to put this declaration at the beginning of the file. The declaration in | |
+ bison's skeleton file comes too late. This must come before <config.h> | |
+ because <config.h> may include arbitrary system headers. | |
+ This can go away once the AM_INTL_SUBDIR macro requires bison >= 2.0. */ | |
#if defined _AIX && !defined __GNUC__ | |
#pragma alloca | |
#endif | |
t@@ -29,56 +31,39 @@ | |
# include <config.h> | |
#endif | |
+#include <stddef.h> | |
#include <stdlib.h> | |
-#include "gettextP.h" | |
- | |
-/* 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 FREE_EXPRESSION __gettext_free_exp | |
-#else | |
-# define FREE_EXPRESSION gettext_free_exp__ | |
-# define __gettextparse gettextparse__ | |
+#include <string.h> | |
+#include "plural-exp.h" | |
+ | |
+/* The main function generated by the parser is called __gettextparse, | |
+ but we want it to be called PLURAL_PARSE. */ | |
+#ifndef _LIBC | |
+# define __gettextparse PLURAL_PARSE | |
#endif | |
#define YYLEX_PARAM &((struct parse_args *) arg)->cp | |
#define YYPARSE_PARAM arg | |
%} | |
%pure_parser | |
-%expect 10 | |
+%expect 7 | |
%union { | |
unsigned long int num; | |
- enum operator op; | |
+ enum expression_operator op; | |
struct expression *exp; | |
} | |
%{ | |
/* Prototypes for local functions. */ | |
-static struct expression *new_exp PARAMS ((int nargs, enum operator op, | |
- struct expression * const *args)); | |
-static inline struct expression *new_exp_0 PARAMS ((enum operator op)); | |
-static inline struct expression *new_exp_1 PARAMS ((enum operator op, | |
- struct expression *right)); | |
-static struct expression *new_exp_2 PARAMS ((enum operator op, | |
- struct expression *left, | |
- struct expression *right)); | |
-static inline struct expression *new_exp_3 PARAMS ((enum operator op, | |
- struct expression *bexp, | |
- struct expression *tbranch, | |
- struct expression *fbranch)… | |
-static int yylex PARAMS ((YYSTYPE *lval, const char **pexp)); | |
-static void yyerror PARAMS ((const char *str)); | |
+static int yylex (YYSTYPE *lval, const char **pexp); | |
+static void yyerror (const char *str); | |
/* Allocation of expressions. */ | |
static struct expression * | |
-new_exp (nargs, op, args) | |
- int nargs; | |
- enum operator op; | |
- struct expression * const *args; | |
+new_exp (int nargs, enum expression_operator op, | |
+ struct expression * const *args) | |
{ | |
int i; | |
struct expression *newp; | |
t@@ -107,16 +92,13 @@ new_exp (nargs, op, args) | |
} | |
static inline struct expression * | |
-new_exp_0 (op) | |
- enum operator op; | |
+new_exp_0 (enum expression_operator op) | |
{ | |
return new_exp (0, op, NULL); | |
} | |
static inline struct expression * | |
-new_exp_1 (op, right) | |
- enum operator op; | |
- struct expression *right; | |
+new_exp_1 (enum expression_operator op, struct expression *right) | |
{ | |
struct expression *args[1]; | |
t@@ -125,10 +107,8 @@ new_exp_1 (op, right) | |
} | |
static struct expression * | |
-new_exp_2 (op, left, right) | |
- enum operator op; | |
- struct expression *left; | |
- struct expression *right; | |
+new_exp_2 (enum expression_operator op, struct expression *left, | |
+ struct expression *right) | |
{ | |
struct expression *args[2]; | |
t@@ -138,11 +118,8 @@ new_exp_2 (op, left, right) | |
} | |
static inline struct expression * | |
-new_exp_3 (op, bexp, tbranch, fbranch) | |
- enum operator op; | |
- struct expression *bexp; | |
- struct expression *tbranch; | |
- struct expression *fbranch; | |
+new_exp_3 (enum expression_operator op, struct expression *bexp, | |
+ struct expression *tbranch, struct expression *fbranch) | |
{ | |
struct expression *args[3]; | |
t@@ -233,8 +210,7 @@ exp: exp '?' exp ':' exp | |
void | |
internal_function | |
-FREE_EXPRESSION (exp) | |
- struct expression *exp; | |
+FREE_EXPRESSION (struct expression *exp) | |
{ | |
if (exp == NULL) | |
return; | |
t@@ -260,9 +236,7 @@ FREE_EXPRESSION (exp) | |
static int | |
-yylex (lval, pexp) | |
- YYSTYPE *lval; | |
- const char **pexp; | |
+yylex (YYSTYPE *lval, const char **pexp) | |
{ | |
const char *exp = *pexp; | |
int result; | |
t@@ -405,8 +379,7 @@ yylex (lval, pexp) | |
static void | |
-yyerror (str) | |
- const char *str; | |
+yyerror (const char *str) | |
{ | |
/* Do nothing. We don't print error messages here. */ | |
} | |
diff --git a/intl/ref-add.sin b/intl/ref-add.sin | |
t@@ -14,7 +14,7 @@ | |
# | |
# You should have received a copy of the GNU Library 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, | |
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, | |
# USA. | |
# | |
# Written by Bruno Haible <[email protected]>. | |
diff --git a/intl/ref-del.sin b/intl/ref-del.sin | |
t@@ -14,7 +14,7 @@ | |
# | |
# You should have received a copy of the GNU Library 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, | |
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, | |
# USA. | |
# | |
# Written by Bruno Haible <[email protected]>. | |
diff --git a/intl/textdomain.c b/intl/textdomain.c | |
t@@ -1,19 +1,20 @@ | |
/* Implementation of the textdomain(3) function. | |
- Copyright (C) 1995-1998, 2000, 2001 Free Software Foundation, Inc. | |
+ Copyright (C) 1995-1998, 2000-2003, 2005-2006 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) | |
+ This program is free software; you can redistribute it and/or modify it | |
+ under the terms of the GNU Library General Public License as published | |
+ by the Free Software Foundation; either version 2, 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. | |
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
+ Library General Public License for more details. | |
- You should have received a copy of the GNU General Public License | |
- along with this program; if not, write to the Free Software Foundation, | |
- Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |
+ You should have received a copy of the GNU Library General Public | |
+ License along with this program; if not, write to the Free Software | |
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, | |
+ USA. */ | |
#ifdef HAVE_CONFIG_H | |
# include <config.h> | |
t@@ -22,39 +23,25 @@ | |
#include <stdlib.h> | |
#include <string.h> | |
+#include "gettextP.h" | |
#ifdef _LIBC | |
# include <libintl.h> | |
#else | |
# include "libgnuintl.h" | |
#endif | |
-#include "gettextP.h" | |
+/* Handle multi-threaded applications. */ | |
#ifdef _LIBC | |
-/* We have to handle multi-threaded applications. */ | |
# include <bits/libc-lock.h> | |
+# define gl_rwlock_define __libc_rwlock_define | |
+# define gl_rwlock_wrlock __libc_rwlock_wrlock | |
+# define gl_rwlock_unlock __libc_rwlock_unlock | |
#else | |
-/* Provide dummy implementation if this is outside glibc. */ | |
-# define __libc_rwlock_define(CLASS, NAME) | |
-# define __libc_rwlock_wrlock(NAME) | |
-# define __libc_rwlock_unlock(NAME) | |
-#endif | |
- | |
-/* The internal variables in the standalone libintl.a must have different | |
- names than the internal variables in GNU libc, otherwise programs | |
- using libintl.a cannot be linked statically. */ | |
-#if !defined _LIBC | |
-# define _nl_default_default_domain _nl_default_default_domain__ | |
-# define _nl_current_default_domain _nl_current_default_domain__ | |
+# include "lock.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 | |
t@@ -66,18 +53,17 @@ extern const char *_nl_current_default_domain; | |
# define strdup(str) __strdup (str) | |
# endif | |
#else | |
-# define TEXTDOMAIN textdomain__ | |
+# define TEXTDOMAIN libintl_textdomain | |
#endif | |
/* Lock variable to protect the global data in the gettext implementation. */ | |
-__libc_rwlock_define (extern, _nl_state_lock) | |
+gl_rwlock_define (extern, _nl_state_lock attribute_hidden) | |
/* 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; | |
+TEXTDOMAIN (const char *domainname) | |
{ | |
char *new_domain; | |
char *old_domain; | |
t@@ -86,7 +72,7 @@ TEXTDOMAIN (domainname) | |
if (domainname == NULL) | |
return (char *) _nl_current_default_domain; | |
- __libc_rwlock_wrlock (_nl_state_lock); | |
+ gl_rwlock_wrlock (_nl_state_lock); | |
old_domain = (char *) _nl_current_default_domain; | |
t@@ -130,7 +116,7 @@ TEXTDOMAIN (domainname) | |
free (old_domain); | |
} | |
- __libc_rwlock_unlock (_nl_state_lock); | |
+ gl_rwlock_unlock (_nl_state_lock); | |
return new_domain; | |
} |