gettext: Upgrade to version 0.18

* configure.ac (AM_GNU_GETTEXT_VERSION): Bump to 0.18.
* po/Makefile.in.in: Upgrade to gettext-0.18.  Keep option --previous
of msgmerge.
* intl/: Upgrade to gettext-0.18.
* m4/gettext.m4: Upgrade to gettext-0.18.1.
* m4/iconv.m4: Upgrade to gettext-0.18.1.
* m4/lib-ld.m4: Upgrade to gettext-0.18.1.
* m4/lib-link.m4: Upgrade to gettext-0.18.1.
* m4/lib-prefix.m4: Upgrade to gettext-0.18.1.
* m4/nls.m4: Upgrade to gettext-0.18.1.
* m4/po.m4: Upgrade to gettext-0.18.1.
* m4/progtest.m4: Upgrade to gettext-0.18.1.
* m4/codeset.m4: Upgrade to gettext-0.18.1.
* m4/fcntl-o.m4: New file, from gettext-0.18.1.
* m4/glibc2.m4: Upgrade to gettext-0.18.1.
* m4/glibc21.m4: Upgrade to gettext-0.18.1.
* m4/intdiv0.m4: Upgrade to gettext-0.18.1.
* m4/intl.m4: Upgrade to gettext-0.18.1.
* m4/intldir.m4: Upgrade to gettext-0.18.1.
* m4/intlmacosx.m4: Upgrade to gettext-0.18.1.
* m4/intmax.m4: Upgrade to gettext-0.18.1.
* m4/inttypes_h.m4: Upgrade to gettext-0.18.1.
* m4/inttypes-pri.m4: Upgrade to gettext-0.18.1.
* m4/lcmessage.m4: Upgrade to gettext-0.18.1.
* m4/lock.m4: Upgrade to gettext-0.18.1.
* m4/longlong.m4: Upgrade to gettext-0.18.1.
* m4/printf-posix.m4: Upgrade to gettext-0.18.1.
* m4/size_max.m4: Upgrade to gettext-0.18.1.
* m4/stdint_h.m4: Upgrade to gettext-0.18.1.
* m4/threadlib.m4: New file, from gettext-0.18.1.
* m4/uintmax_t.m4: Upgrade to gettext-0.18.1.
* m4/visibility.m4: Upgrade to gettext-0.18.1.
* m4/wchar_t.m4: Upgrade to gettext-0.18.1.
* m4/wint_t.m4: Upgrade to gettext-0.18.1.
* m4/xsize.m4: Upgrade to gettext-0.18.1.
* m4/Makefile.am (EXTRA_DIST): Add the new files.
This commit is contained in:
Werner Koch 2012-12-14 16:08:23 +01:00
parent 0fee571260
commit 4032aa8be8
85 changed files with 16677 additions and 6457 deletions

2025
ABOUT-NLS

File diff suppressed because it is too large Load Diff

View File

@ -852,7 +852,7 @@ AC_SUBST(MPI_OPT_FLAGS)
dnl Checks for libraries. dnl Checks for libraries.
AM_PO_SUBDIRS AM_PO_SUBDIRS
AM_GNU_GETTEXT_VERSION([0.16.1]) AM_GNU_GETTEXT_VERSION([0.18.1])
if test "$try_gettext" = yes; then if test "$try_gettext" = yes; then
AM_GNU_GETTEXT(,[need-ngettext]) AM_GNU_GETTEXT(,[need-ngettext])
# gettext requires some extra checks. These really should be part of # gettext requires some extra checks. These really should be part of

3
intl/ChangeLog Normal file
View File

@ -0,0 +1,3 @@
2010-06-04 GNU <bug-gnu-gettext@gnu.org>
* Version 0.18.1 released.

View File

@ -1,5 +1,5 @@
# Makefile for directory with message catalog handling library of GNU gettext # Makefile for directory with message catalog handling library of GNU gettext
# Copyright (C) 1995-1998, 2000-2006 Free Software Foundation, Inc. # 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 # 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 # under the terms of the GNU Library General Public License as published
@ -72,6 +72,30 @@ LIBTOOL = @LIBTOOL@
RANLIB = @RANLIB@ RANLIB = @RANLIB@
YACC = @INTLBISON@ -y -d YACC = @INTLBISON@ -y -d
YFLAGS = --name-prefix=__gettext 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_LIBINTL: Change expansion of LIBINTL_DLL_EXPORTED macro.
# -DBUILDING_DLL: Change expansion of RELOCATABLE_DLL_EXPORTED macro. # -DBUILDING_DLL: Change expansion of RELOCATABLE_DLL_EXPORTED macro.
@ -100,6 +124,7 @@ HEADERS = \
localcharset.h \ localcharset.h \
lock.h \ lock.h \
relocatable.h \ relocatable.h \
tsearch.h tsearch.c \
xsize.h \ xsize.h \
printf-args.h printf-args.c \ printf-args.h printf-args.c \
printf-parse.h wprintf-parse.h printf-parse.c \ printf-parse.h wprintf-parse.h printf-parse.c \
@ -125,12 +150,14 @@ SOURCES = \
plural.y \ plural.y \
plural-exp.c \ plural-exp.c \
localcharset.c \ localcharset.c \
threadlib.c \
lock.c \ lock.c \
relocatable.c \ relocatable.c \
langprefs.c \ langprefs.c \
localename.c \ localename.c \
log.c \ log.c \
printf.c \ printf.c \
setlocale.c \
version.c \ version.c \
osdep.c \ osdep.c \
os2compat.c \ os2compat.c \
@ -155,17 +182,21 @@ OBJECTS = \
plural.$lo \ plural.$lo \
plural-exp.$lo \ plural-exp.$lo \
localcharset.$lo \ localcharset.$lo \
threadlib.$lo \
lock.$lo \ lock.$lo \
relocatable.$lo \ relocatable.$lo \
langprefs.$lo \ langprefs.$lo \
localename.$lo \ localename.$lo \
log.$lo \ log.$lo \
printf.$lo \ printf.$lo \
setlocale.$lo \
version.$lo \ version.$lo \
osdep.$lo \ osdep.$lo \
intl-compat.$lo intl-compat.$lo
OBJECTS_RES_yes = libintl.res.$lo
OBJECTS_RES_no =
DISTFILES.common = Makefile.in \ DISTFILES.common = Makefile.in \
config.charset locale.alias ref-add.sin ref-del.sin export.h \ config.charset locale.alias ref-add.sin ref-del.sin export.h libintl.rc \
$(HEADERS) $(SOURCES) $(HEADERS) $(SOURCES)
DISTFILES.generated = plural.c DISTFILES.generated = plural.c
DISTFILES.normal = VERSION DISTFILES.normal = VERSION
@ -182,14 +213,15 @@ all-no-yes: libgnuintl.$la
all-no-no: all-no-no:
libintl.a libgnuintl.a: $(OBJECTS) libintl.a libgnuintl.a: $(OBJECTS)
rm -f $@ $(AM_V_at)rm -f $@
$(AR) cru $@ $(OBJECTS) $(AM_V_AR)$(AR) cru $@ $(OBJECTS)
$(RANLIB) $@ $(AM_V_at)$(RANLIB) $@
libintl.la libgnuintl.la: $(OBJECTS) libintl.la libgnuintl.la: $(OBJECTS) $(OBJECTS_RES_@WOE32@)
$(LIBTOOL) --mode=link \ $(AM_V_GEN)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=link \
$(CC) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS) $(LDFLAGS) -o $@ \ $(CC) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS) $(LDFLAGS) -o $@ \
$(OBJECTS) @LTLIBICONV@ @INTL_MACOSX_LIBS@ $(LIBS) @LTLIBTHREAD@ -lc \ $(OBJECTS) @LTLIBICONV@ @INTL_MACOSX_LIBS@ $(LIBS) @LTLIBTHREAD@ @LTLIBC@ \
$(OBJECTS_RES_@WOE32@) \
-version-info $(LTV_CURRENT):$(LTV_REVISION):$(LTV_AGE) \ -version-info $(LTV_CURRENT):$(LTV_REVISION):$(LTV_AGE) \
-rpath $(libdir) \ -rpath $(libdir) \
-no-undefined -no-undefined
@ -199,74 +231,106 @@ libintl.la libgnuintl.la: $(OBJECTS)
# according to the libtool documentation, section "Library interface versions". # according to the libtool documentation, section "Library interface versions".
# Maintainers of other packages that include the intl directory must *not* # Maintainers of other packages that include the intl directory must *not*
# change these values. # change these values.
LTV_CURRENT=8 LTV_CURRENT=9
LTV_REVISION=1 LTV_REVISION=1
LTV_AGE=0 LTV_AGE=1
.SUFFIXES: .SUFFIXES:
.SUFFIXES: .c .y .o .lo .sin .sed .SUFFIXES: .c .y .o .lo .sin .sed
.c.o: .c.o:
$(COMPILE) $< $(AM_V_CC)$(COMPILE) $<
.y.c: .y.c:
$(YACC) $(YFLAGS) --output $@ $< $(AM_V_YACC)$(YACC) $(YFLAGS) --output $@ $<
rm -f $*.h $(AM_V_at)rm -f $*.h
bindtextdom.lo: $(srcdir)/bindtextdom.c bindtextdom.lo: $(srcdir)/bindtextdom.c
$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/bindtextdom.c $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(srcdir)/bindtextdom.c
dcgettext.lo: $(srcdir)/dcgettext.c dcgettext.lo: $(srcdir)/dcgettext.c
$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/dcgettext.c $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(srcdir)/dcgettext.c
dgettext.lo: $(srcdir)/dgettext.c dgettext.lo: $(srcdir)/dgettext.c
$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/dgettext.c $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(srcdir)/dgettext.c
gettext.lo: $(srcdir)/gettext.c gettext.lo: $(srcdir)/gettext.c
$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/gettext.c $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(srcdir)/gettext.c
finddomain.lo: $(srcdir)/finddomain.c finddomain.lo: $(srcdir)/finddomain.c
$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/finddomain.c $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(srcdir)/finddomain.c
hash-string.lo: $(srcdir)/hash-string.c hash-string.lo: $(srcdir)/hash-string.c
$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/hash-string.c $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(srcdir)/hash-string.c
loadmsgcat.lo: $(srcdir)/loadmsgcat.c loadmsgcat.lo: $(srcdir)/loadmsgcat.c
$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/loadmsgcat.c $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(srcdir)/loadmsgcat.c
localealias.lo: $(srcdir)/localealias.c localealias.lo: $(srcdir)/localealias.c
$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/localealias.c $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(srcdir)/localealias.c
textdomain.lo: $(srcdir)/textdomain.c textdomain.lo: $(srcdir)/textdomain.c
$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/textdomain.c $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(srcdir)/textdomain.c
l10nflist.lo: $(srcdir)/l10nflist.c l10nflist.lo: $(srcdir)/l10nflist.c
$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/l10nflist.c $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(srcdir)/l10nflist.c
explodename.lo: $(srcdir)/explodename.c explodename.lo: $(srcdir)/explodename.c
$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/explodename.c $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(srcdir)/explodename.c
dcigettext.lo: $(srcdir)/dcigettext.c dcigettext.lo: $(srcdir)/dcigettext.c
$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/dcigettext.c $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(srcdir)/dcigettext.c
dcngettext.lo: $(srcdir)/dcngettext.c dcngettext.lo: $(srcdir)/dcngettext.c
$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/dcngettext.c $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(srcdir)/dcngettext.c
dngettext.lo: $(srcdir)/dngettext.c dngettext.lo: $(srcdir)/dngettext.c
$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/dngettext.c $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(srcdir)/dngettext.c
ngettext.lo: $(srcdir)/ngettext.c ngettext.lo: $(srcdir)/ngettext.c
$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/ngettext.c $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(srcdir)/ngettext.c
plural.lo: $(srcdir)/plural.c plural.lo: $(srcdir)/plural.c
$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/plural.c $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(srcdir)/plural.c
plural-exp.lo: $(srcdir)/plural-exp.c plural-exp.lo: $(srcdir)/plural-exp.c
$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/plural-exp.c $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(srcdir)/plural-exp.c
localcharset.lo: $(srcdir)/localcharset.c localcharset.lo: $(srcdir)/localcharset.c
$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/localcharset.c $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(srcdir)/localcharset.c
threadlib.lo: $(srcdir)/threadlib.c
$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(srcdir)/threadlib.c
lock.lo: $(srcdir)/lock.c lock.lo: $(srcdir)/lock.c
$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/lock.c $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(srcdir)/lock.c
relocatable.lo: $(srcdir)/relocatable.c relocatable.lo: $(srcdir)/relocatable.c
$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/relocatable.c $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(srcdir)/relocatable.c
langprefs.lo: $(srcdir)/langprefs.c langprefs.lo: $(srcdir)/langprefs.c
$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/langprefs.c $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(srcdir)/langprefs.c
localename.lo: $(srcdir)/localename.c localename.lo: $(srcdir)/localename.c
$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/localename.c $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(srcdir)/localename.c
log.lo: $(srcdir)/log.c log.lo: $(srcdir)/log.c
$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/log.c $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(srcdir)/log.c
printf.lo: $(srcdir)/printf.c printf.lo: $(srcdir)/printf.c
$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/printf.c $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(srcdir)/printf.c
setlocale.lo: $(srcdir)/setlocale.c
$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(srcdir)/setlocale.c
version.lo: $(srcdir)/version.c version.lo: $(srcdir)/version.c
$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/version.c $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(srcdir)/version.c
osdep.lo: $(srcdir)/osdep.c osdep.lo: $(srcdir)/osdep.c
$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/osdep.c $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(srcdir)/osdep.c
intl-compat.lo: $(srcdir)/intl-compat.c intl-compat.lo: $(srcdir)/intl-compat.c
$(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/intl-compat.c $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC --mode=compile $(COMPILE) $(srcdir)/intl-compat.c
# 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}'}'$${nl}'c\'$${nl}0$${nl}q; \
sed_extract_minor='/^[0-9][0-9]*[.][0-9]/{'$${nl}'s/^[0-9]*[.]\([0-9]*\).*/\1/p'$${nl}q$${nl}'}'$${nl}'c\'$${nl}0$${nl}q; \
sed_extract_subminor='/^[0-9][0-9]*[.][0-9][0-9]*[.][0-9]/{'$${nl}'s/^[0-9]*[.][0-9]*[.]\([0-9]*\).*/\1/p'$${nl}q$${nl}'}'$${nl}'c\'$${nl}0$${nl}q; \
$(WINDRES) \
"-DPACKAGE_VERSION_STRING=\\\"$(VERSION)\\\"" \
"-DPACKAGE_VERSION_MAJOR="`echo '$(VERSION)' | sed -n -e "$$sed_extract_major"` \
"-DPACKAGE_VERSION_MINOR="`echo '$(VERSION)' | sed -n -e "$$sed_extract_minor"` \
"-DPACKAGE_VERSION_SUBMINOR="`echo '$(VERSION)' | sed -n -e "$$sed_extract_subminor"` \
-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}'}'$${nl}'c\'$${nl}0$${nl}q; \
sed_extract_minor='/^[0-9][0-9]*[.][0-9]/{'$${nl}'s/^[0-9]*[.]\([0-9]*\).*/\1/p'$${nl}q$${nl}'}'$${nl}'c\'$${nl}0$${nl}q; \
sed_extract_subminor='/^[0-9][0-9]*[.][0-9][0-9]*[.][0-9]/{'$${nl}'s/^[0-9]*[.][0-9]*[.]\([0-9]*\).*/\1/p'$${nl}q$${nl}'}'$${nl}'c\'$${nl}0$${nl}q; \
$(LIBTOOL) --mode=compile --tag=RC $(RC) \
"-DPACKAGE_VERSION_STRING=\\\"$(VERSION)\\\"" \
"-DPACKAGE_VERSION_MAJOR="`echo '$(VERSION)' | sed -n -e "$$sed_extract_major"` \
"-DPACKAGE_VERSION_MINOR="`echo '$(VERSION)' | sed -n -e "$$sed_extract_minor"` \
"-DPACKAGE_VERSION_SUBMINOR="`echo '$(VERSION)' | sed -n -e "$$sed_extract_subminor"` \
-i $(srcdir)/libintl.rc -o libintl.res.lo --output-format=coff
ref-add.sed: $(srcdir)/ref-add.sin ref-add.sed: $(srcdir)/ref-add.sin
sed -e '/^#/d' -e 's/@''PACKAGE''@/@PACKAGE@/g' $(srcdir)/ref-add.sin > t-ref-add.sed sed -e '/^#/d' -e 's/@''PACKAGE''@/@PACKAGE@/g' $(srcdir)/ref-add.sin > t-ref-add.sed
@ -281,6 +345,7 @@ libgnuintl.h: $(srcdir)/libgnuintl.h.in
sed -e '/IN_LIBGLOCALE/d' \ sed -e '/IN_LIBGLOCALE/d' \
-e 's,@''HAVE_POSIX_PRINTF''@,@HAVE_POSIX_PRINTF@,g' \ -e 's,@''HAVE_POSIX_PRINTF''@,@HAVE_POSIX_PRINTF@,g' \
-e 's,@''HAVE_ASPRINTF''@,@HAVE_ASPRINTF@,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_SNPRINTF''@,@HAVE_SNPRINTF@,g' \
-e 's,@''HAVE_WPRINTF''@,@HAVE_WPRINTF@,g' \ -e 's,@''HAVE_WPRINTF''@,@HAVE_WPRINTF@,g' \
< $(srcdir)/libgnuintl.h.in \ < $(srcdir)/libgnuintl.h.in \
@ -298,6 +363,7 @@ libintl.h: $(srcdir)/libgnuintl.h.in
sed -e '/IN_LIBGLOCALE/d' \ sed -e '/IN_LIBGLOCALE/d' \
-e 's,@''HAVE_POSIX_PRINTF''@,@HAVE_POSIX_PRINTF@,g' \ -e 's,@''HAVE_POSIX_PRINTF''@,@HAVE_POSIX_PRINTF@,g' \
-e 's,@''HAVE_ASPRINTF''@,@HAVE_ASPRINTF@,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_SNPRINTF''@,@HAVE_SNPRINTF@,g' \
-e 's,@''HAVE_WPRINTF''@,@HAVE_WPRINTF@,g' \ -e 's,@''HAVE_WPRINTF''@,@HAVE_WPRINTF@,g' \
< $(srcdir)/libgnuintl.h.in > libintl.h < $(srcdir)/libgnuintl.h.in > libintl.h
@ -344,7 +410,21 @@ install-exec: all
: ; \ : ; \
fi fi
if test '@USE_INCLUDED_LIBINTL@' = yes; then \ if test '@USE_INCLUDED_LIBINTL@' = yes; then \
test @GLIBC21@ != no || $(mkdir_p) $(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; \ temp=$(DESTDIR)$(libdir)/t-charset.alias; \
dest=$(DESTDIR)$(libdir)/charset.alias; \ dest=$(DESTDIR)$(libdir)/charset.alias; \
if test -f $(DESTDIR)$(libdir)/charset.alias; then \ if test -f $(DESTDIR)$(libdir)/charset.alias; then \
@ -353,7 +433,7 @@ install-exec: all
$(INSTALL_DATA) $$temp $$dest; \ $(INSTALL_DATA) $$temp $$dest; \
rm -f $$temp; \ rm -f $$temp; \
else \ else \
if test @GLIBC21@ = no; then \ if $$need_charset_alias; then \
orig=charset.alias; \ orig=charset.alias; \
sed -f ref-add.sed $$orig > $$temp; \ sed -f ref-add.sed $$orig > $$temp; \
$(INSTALL_DATA) $$temp $$dest; \ $(INSTALL_DATA) $$temp $$dest; \
@ -376,6 +456,7 @@ install-data: all
if test "$(PACKAGE)" = "gettext-tools"; then \ if test "$(PACKAGE)" = "gettext-tools"; then \
$(mkdir_p) $(DESTDIR)$(gettextsrcdir); \ $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \
$(INSTALL_DATA) VERSION $(DESTDIR)$(gettextsrcdir)/VERSION; \ $(INSTALL_DATA) VERSION $(DESTDIR)$(gettextsrcdir)/VERSION; \
$(INSTALL_DATA) ChangeLog.inst $(DESTDIR)$(gettextsrcdir)/ChangeLog; \
dists="COPYING.LIB-2.0 COPYING.LIB-2.1 $(DISTFILES.common)"; \ dists="COPYING.LIB-2.0 COPYING.LIB-2.1 $(DISTFILES.common)"; \
for file in $$dists; do \ for file in $$dists; do \
$(INSTALL_DATA) $(srcdir)/$$file \ $(INSTALL_DATA) $(srcdir)/$$file \
@ -398,6 +479,8 @@ install-data: all
install-strip: install install-strip: install
install-dvi install-html install-info install-ps install-pdf:
installdirs: installdirs:
if { test "$(PACKAGE)" = "gettext-runtime" || test "$(PACKAGE)" = "gettext-tools"; } \ if { test "$(PACKAGE)" = "gettext-runtime" || test "$(PACKAGE)" = "gettext-tools"; } \
&& test '@USE_INCLUDED_LIBINTL@' = yes; then \ && test '@USE_INCLUDED_LIBINTL@' = yes; then \
@ -413,7 +496,21 @@ installdirs:
: ; \ : ; \
fi fi
if test '@USE_INCLUDED_LIBINTL@' = yes; then \ if test '@USE_INCLUDED_LIBINTL@' = yes; then \
test @GLIBC21@ != no || $(mkdir_p) $(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; \
$(mkdir_p) $(DESTDIR)$(localedir); \ $(mkdir_p) $(DESTDIR)$(localedir); \
else \ else \
: ; \ : ; \
@ -480,7 +577,8 @@ uninstall:
info dvi ps pdf html: info dvi ps pdf html:
$(OBJECTS): ../config.h libgnuintl.h $(OBJECTS): ../config.h libgnuintl.h
bindtextdom.$lo dcgettext.$lo dcigettext.$lo dcngettext.$lo dgettext.$lo dngettext.$lo finddomain.$lo gettext.$lo intl-compat.$lo loadmsgcat.$lo localealias.$lo ngettext.$lo textdomain.$lo: $(srcdir)/gettextP.h $(srcdir)/gmo.h $(srcdir)/loadinfo.h bindtextdom.$lo dcgettext.$lo dcigettext.$lo dcngettext.$lo dgettext.$lo dngettext.$lo finddomain.$lo gettext.$lo intl-compat.$lo loadmsgcat.$lo localealias.$lo ngettext.$lo setlocale.$lo textdomain.$lo: $(srcdir)/gettextP.h $(srcdir)/gmo.h $(srcdir)/loadinfo.h
localename.$lo: $(srcdir)/gettextP.h
hash-string.$lo dcigettext.$lo loadmsgcat.$lo: $(srcdir)/hash-string.h hash-string.$lo dcigettext.$lo loadmsgcat.$lo: $(srcdir)/hash-string.h
explodename.$lo l10nflist.$lo: $(srcdir)/loadinfo.h explodename.$lo l10nflist.$lo: $(srcdir)/loadinfo.h
dcigettext.$lo loadmsgcat.$lo plural.$lo plural-exp.$lo: $(srcdir)/plural-exp.h dcigettext.$lo loadmsgcat.$lo plural.$lo plural-exp.$lo: $(srcdir)/plural-exp.h
@ -544,7 +642,7 @@ dist distdir: Makefile
additional="$(DISTFILES.normal)"; \ additional="$(DISTFILES.normal)"; \
fi; \ fi; \
$(MAKE) $(DISTFILES.common) $(DISTFILES.generated) $$additional; \ $(MAKE) $(DISTFILES.common) $(DISTFILES.generated) $$additional; \
for file in $(DISTFILES.common) $(DISTFILES.generated) $$additional; do \ for file in ChangeLog $(DISTFILES.common) $(DISTFILES.generated) $$additional; do \
if test -f $$file; then dir=.; else dir=$(srcdir); fi; \ if test -f $$file; then dir=.; else dir=$(srcdir); fi; \
cp -p $$dir/$$file $(distdir) || test $$file = Makefile.in || exit 1; \ cp -p $$dir/$$file $(distdir) || test $$file = Makefile.in || exit 1; \
done; \ done; \

View File

@ -1 +1 @@
GNU gettext library from gettext-0.16.1 GNU gettext library from gettext-0.18.1

View File

@ -1,5 +1,6 @@
/* Implementation of the bindtextdomain(3) function /* Implementation of the bindtextdomain(3) function
Copyright (C) 1995-1998, 2000-2003, 2005-2006 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 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 under the terms of the GNU Library General Public License as published
@ -41,14 +42,6 @@
# include "lock.h" # include "lock.h"
#endif #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 libintl_nl_default_dirname
# define _nl_domain_bindings libintl_nl_domain_bindings
#endif
/* Some compilers, like SunOS4 cc, don't have offsetof in <stddef.h>. */ /* Some compilers, like SunOS4 cc, don't have offsetof in <stddef.h>. */
#ifndef offsetof #ifndef offsetof
# define offsetof(type,ident) ((size_t)&(((type*)0)->ident)) # define offsetof(type,ident) ((size_t)&(((type*)0)->ident))
@ -56,15 +49,6 @@
/* @@ end of prolog @@ */ /* @@ end of prolog @@ */
/* Contains the default location of the message catalogs. */
extern const char _nl_default_dirname[];
#ifdef _LIBC
libc_hidden_proto (_nl_default_dirname)
#endif
/* List with bindings of specific domains. */
extern struct binding *_nl_domain_bindings;
/* Lock variable to protect the global data in the gettext implementation. */ /* Lock variable to protect the global data in the gettext implementation. */
gl_rwlock_define (extern, _nl_state_lock attribute_hidden) gl_rwlock_define (extern, _nl_state_lock attribute_hidden)
@ -195,8 +179,7 @@ set_binding_values (const char *domainname,
if (__builtin_expect (result != NULL, 1)) if (__builtin_expect (result != NULL, 1))
{ {
if (binding->codeset != NULL) free (binding->codeset);
free (binding->codeset);
binding->codeset = result; binding->codeset = result;
modified = 1; modified = 1;

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,5 @@
/* Implementation of the internal dcigettext function. /* Implementation of the internal dcigettext function.
Copyright (C) 1995-1999, 2000-2006 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 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 under the terms of the GNU Library General Public License as published
@ -27,9 +27,6 @@
# include <config.h> # include <config.h>
#endif #endif
/* NL_LOCALE_NAME does not work in glibc-2.4. Ignore it. */
#undef HAVE_NL_LOCALE_NAME
#include <sys/types.h> #include <sys/types.h>
#ifdef __GNUC__ #ifdef __GNUC__
@ -90,8 +87,8 @@ extern int errno;
# include <sys/param.h> # include <sys/param.h>
#endif #endif
#if !defined _LIBC && HAVE_NL_LOCALE_NAME #if !defined _LIBC
# include <langinfo.h> # include "localcharset.h"
#endif #endif
#include "gettextP.h" #include "gettextP.h"
@ -125,16 +122,6 @@ extern int errno;
((int) &((struct { char dummy1; TYPE dummy2; } *) 0)->dummy2) ((int) &((struct { char dummy1; TYPE dummy2; } *) 0)->dummy2)
#endif #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 libintl_nl_default_default_domain
# define _nl_current_default_domain libintl_nl_current_default_domain
# define _nl_default_dirname libintl_nl_default_dirname
# define _nl_domain_bindings libintl_nl_domain_bindings
#endif
/* Some compilers, like SunOS4 cc, don't have offsetof in <stddef.h>. */ /* Some compilers, like SunOS4 cc, don't have offsetof in <stddef.h>. */
#ifndef offsetof #ifndef offsetof
# define offsetof(type,ident) ((size_t)&(((type*)0)->ident)) # define offsetof(type,ident) ((size_t)&(((type*)0)->ident))
@ -170,6 +157,22 @@ static void *mempcpy (void *dest, const void *src, size_t n);
# endif # endif
#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. */ /* Amount to increase buffer size by in each try. */
#define PATH_INCR 32 #define PATH_INCR 32
@ -225,7 +228,7 @@ static void *mempcpy (void *dest, const void *src, size_t n);
#endif #endif
/* Whether to support different locales in different threads. */ /* Whether to support different locales in different threads. */
#if defined _LIBC || HAVE_NL_LOCALE_NAME || (HAVE_STRUCT___LOCALE_STRUCT___NAMES && defined USE_IN_GETTEXT_TESTS) || defined IN_LIBGLOCALE #if defined _LIBC || HAVE_USELOCALE || defined IN_LIBGLOCALE
# define HAVE_PER_THREAD_LOCALE # define HAVE_PER_THREAD_LOCALE
#endif #endif
@ -260,22 +263,19 @@ struct known_translation_t
size_t translation_length; size_t translation_length;
/* Pointer to the string in question. */ /* 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) gl_rwlock_define_initialized (static, tree_lock)
/* Root of the search tree with known translations. */
static void *root; static void *root;
# ifdef _LIBC
# define tsearch __tsearch
# endif
/* Function to compare two entries in the table of known translations. */ /* Function to compare two entries in the table of known translations. */
static int static int
transcmp (const void *p1, const void *p2) transcmp (const void *p1, const void *p2)
@ -287,7 +287,8 @@ transcmp (const void *p1, const void *p2)
s1 = (const struct known_translation_t *) p1; s1 = (const struct known_translation_t *) p1;
s2 = (const struct known_translation_t *) p2; 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) if (result == 0)
{ {
result = strcmp (s1->domainname, s2->domainname); result = strcmp (s1->domainname, s2->domainname);
@ -312,7 +313,6 @@ transcmp (const void *p1, const void *p2)
return result; return result;
} }
#endif
/* Name of the default domain used for gettext(3) prior any call to /* Name of the default domain used for gettext(3) prior any call to
textdomain(3). The default value for this is "messages". */ textdomain(3). The default value for this is "messages". */
@ -501,13 +501,10 @@ DCIGETTEXT (const char *domainname, const char *msgid1, const char *msgid2,
char *retval; char *retval;
size_t retlen; size_t retlen;
int saved_errno; 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; struct known_translation_t **foundp = NULL;
size_t msgid_len; #if defined HAVE_PER_THREAD_LOCALE && !defined IN_LIBGLOCALE
# if defined HAVE_PER_THREAD_LOCALE && !defined IN_LIBGLOCALE
const char *localename; const char *localename;
# endif
#endif #endif
size_t domainname_len; size_t domainname_len;
@ -524,6 +521,14 @@ DCIGETTEXT (const char *domainname, const char *msgid1, const char *msgid2,
: n == 1 ? (char *) msgid1 : (char *) msgid2); : n == 1 ? (char *) msgid1 : (char *) msgid2);
#endif #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); gl_rwlock_rdlock (_nl_state_lock);
/* If DOMAINNAME is NULL, we are interested in the default domain. If /* If DOMAINNAME is NULL, we are interested in the default domain. If
@ -538,54 +543,37 @@ DCIGETTEXT (const char *domainname, const char *msgid1, const char *msgid2,
category = LC_MESSAGES; category = LC_MESSAGES;
#endif #endif
#if defined HAVE_TSEARCH || defined _LIBC
msgid_len = strlen (msgid1) + 1;
/* Try to find the translation among those which we found at /* Try to find the translation among those which we found at
some time. */ some time. */
search = (struct known_translation_t *) search.domain = NULL;
alloca (offsetof (struct known_translation_t, msgid) + msgid_len); search.msgid.ptr = msgid1;
memcpy (search->msgid, msgid1, msgid_len); search.domainname = domainname;
search->domainname = domainname; search.category = category;
search->category = category; #ifdef HAVE_PER_THREAD_LOCALE
# ifdef HAVE_PER_THREAD_LOCALE # ifndef IN_LIBGLOCALE
# ifndef IN_LIBGLOCALE # ifdef _LIBC
# ifdef _LIBC localename = _strdupa (_current_locale_name (category));
localename = __current_locale_name (category); # else
# else categoryname = category_to_name (category);
# if HAVE_NL_LOCALE_NAME # define CATEGORYNAME_INITIALIZED
/* NL_LOCALE_NAME is public glibc API introduced in glibc-2.4. */ localename = _nl_locale_name_thread_unsafe (category, categoryname);
localename = nl_langinfo (NL_LOCALE_NAME (category)); if (localename == NULL)
# else localename = "";
# if HAVE_STRUCT___LOCALE_STRUCT___NAMES && defined USE_IN_GETTEXT_TESTS
/* The __names field is not public glibc API and must therefore not be used
in code that is installed in public locations. */
{
locale_t thread_locale = uselocale (NULL);
if (thread_locale != LC_GLOBAL_LOCALE)
localename = thread_locale->__names[category];
else
localename = "";
}
# endif
# endif
# endif
# endif
search->localename = localename;
# ifdef IN_LIBGLOCALE
search->encoding = encoding;
# endif # endif
# endif
search.localename = localename;
# ifdef IN_LIBGLOCALE
search.encoding = encoding;
# endif # endif
/* Since tfind/tsearch manage a balanced tree, concurrent tfind and /* Since tfind/tsearch manage a balanced tree, concurrent tfind and
tsearch calls can be fatal. */ tsearch calls can be fatal. */
gl_rwlock_rdlock (tree_lock); gl_rwlock_rdlock (tree_lock);
foundp = (struct known_translation_t **) tfind (search, &root, transcmp); foundp = (struct known_translation_t **) tfind (&search, &root, transcmp);
gl_rwlock_unlock (tree_lock); gl_rwlock_unlock (tree_lock);
freea (search);
if (foundp != NULL && (*foundp)->counter == _nl_msg_cat_cntr) if (foundp != NULL && (*foundp)->counter == _nl_msg_cat_cntr)
{ {
/* Now deal with plural. */ /* Now deal with plural. */
@ -596,13 +584,14 @@ DCIGETTEXT (const char *domainname, const char *msgid1, const char *msgid2,
retval = (char *) (*foundp)->translation; retval = (char *) (*foundp)->translation;
gl_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; return retval;
} }
#endif #endif
/* Preserve the `errno' value. */
saved_errno = errno;
/* See whether this is a SUID binary or not. */ /* See whether this is a SUID binary or not. */
DETERMINE_SECURE; DETERMINE_SECURE;
@ -671,7 +660,9 @@ DCIGETTEXT (const char *domainname, const char *msgid1, const char *msgid2,
#endif #endif
/* Now determine the symbolic name of CATEGORY and its value. */ /* Now determine the symbolic name of CATEGORY and its value. */
#ifndef CATEGORYNAME_INITIALIZED
categoryname = category_to_name (category); categoryname = category_to_name (category);
#endif
#ifdef IN_LIBGLOCALE #ifdef IN_LIBGLOCALE
categoryvalue = guess_category_value (category, categoryname, localename); categoryvalue = guess_category_value (category, categoryname, localename);
#else #else
@ -683,8 +674,8 @@ DCIGETTEXT (const char *domainname, const char *msgid1, const char *msgid2,
+ domainname_len + 5); + domainname_len + 5);
ADD_BLOCK (block_list, xdomainname); ADD_BLOCK (block_list, xdomainname);
stpcpy (mempcpy (stpcpy (stpcpy (xdomainname, categoryname), "/"), stpcpy ((char *) mempcpy (stpcpy (stpcpy (xdomainname, categoryname), "/"),
domainname, domainname_len), domainname, domainname_len),
".mo"); ".mo");
/* Creating working area. */ /* Creating working area. */
@ -773,40 +764,43 @@ DCIGETTEXT (const char *domainname, const char *msgid1, const char *msgid2,
/* Found the translation of MSGID1 in domain DOMAIN: /* Found the translation of MSGID1 in domain DOMAIN:
starting at RETVAL, RETLEN bytes. */ starting at RETVAL, RETLEN bytes. */
FREE_BLOCKS (block_list); FREE_BLOCKS (block_list);
#if defined HAVE_TSEARCH || defined _LIBC
if (foundp == NULL) if (foundp == NULL)
{ {
/* Create a new entry and add it to the search tree. */ /* Create a new entry and add it to the search tree. */
size_t msgid_len;
size_t size; size_t size;
struct known_translation_t *newp; struct known_translation_t *newp;
msgid_len = strlen (msgid1) + 1;
size = offsetof (struct known_translation_t, msgid) size = offsetof (struct known_translation_t, msgid)
+ msgid_len + domainname_len + 1; + msgid_len + domainname_len + 1;
# ifdef HAVE_PER_THREAD_LOCALE #ifdef HAVE_PER_THREAD_LOCALE
size += strlen (localename) + 1; size += strlen (localename) + 1;
# endif #endif
newp = (struct known_translation_t *) malloc (size); newp = (struct known_translation_t *) malloc (size);
if (newp != NULL) if (newp != NULL)
{ {
char *new_domainname; char *new_domainname;
# ifdef HAVE_PER_THREAD_LOCALE #ifdef HAVE_PER_THREAD_LOCALE
char *new_localename; char *new_localename;
# endif #endif
new_domainname = mempcpy (newp->msgid, msgid1, msgid_len); new_domainname =
(char *) mempcpy (newp->msgid.appended, msgid1,
msgid_len);
memcpy (new_domainname, domainname, domainname_len + 1); memcpy (new_domainname, domainname, domainname_len + 1);
# ifdef HAVE_PER_THREAD_LOCALE #ifdef HAVE_PER_THREAD_LOCALE
new_localename = new_domainname + domainname_len + 1; new_localename = new_domainname + domainname_len + 1;
strcpy (new_localename, localename); strcpy (new_localename, localename);
# endif #endif
newp->domainname = new_domainname; newp->domainname = new_domainname;
newp->category = category; newp->category = category;
# ifdef HAVE_PER_THREAD_LOCALE #ifdef HAVE_PER_THREAD_LOCALE
newp->localename = new_localename; newp->localename = new_localename;
# endif #endif
# ifdef IN_LIBGLOCALE #ifdef IN_LIBGLOCALE
newp->encoding = encoding; newp->encoding = encoding;
# endif #endif
newp->counter = _nl_msg_cat_cntr; newp->counter = _nl_msg_cat_cntr;
newp->domain = domain; newp->domain = domain;
newp->translation = retval; newp->translation = retval;
@ -834,7 +828,7 @@ DCIGETTEXT (const char *domainname, const char *msgid1, const char *msgid2,
(*foundp)->translation = retval; (*foundp)->translation = retval;
(*foundp)->translation_length = retlen; (*foundp)->translation_length = retlen;
} }
#endif
__set_errno (saved_errno); __set_errno (saved_errno);
/* Now deal with plural. */ /* Now deal with plural. */
@ -842,6 +836,9 @@ DCIGETTEXT (const char *domainname, const char *msgid1, const char *msgid2,
retval = plural_lookup (domain, n, retval, retlen); retval = plural_lookup (domain, n, retval, retlen);
gl_rwlock_unlock (_nl_state_lock); gl_rwlock_unlock (_nl_state_lock);
#ifdef _LIBC
__libc_rwlock_unlock (__libc_setlocale_lock);
#endif
return retval; return retval;
} }
} }
@ -851,6 +848,9 @@ DCIGETTEXT (const char *domainname, const char *msgid1, const char *msgid2,
/* Return the untranslated MSGID. */ /* Return the untranslated MSGID. */
FREE_BLOCKS (block_list); FREE_BLOCKS (block_list);
gl_rwlock_unlock (_nl_state_lock); gl_rwlock_unlock (_nl_state_lock);
#ifdef _LIBC
__libc_rwlock_unlock (__libc_setlocale_lock);
#endif
#ifndef _LIBC #ifndef _LIBC
if (!ENABLE_SECURE) if (!ENABLE_SECURE)
{ {
@ -1005,12 +1005,17 @@ _nl_find_msg (struct loaded_l10nfile *domain_file,
# ifndef IN_LIBGLOCALE # ifndef IN_LIBGLOCALE
const char *encoding = get_output_charset (domainbinding); const char *encoding = get_output_charset (domainbinding);
# endif # 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 /* Search whether a table with converted translations for this
encoding has already been allocated. */ encoding has already been allocated. */
size_t nconversions = domain->nconversions; nconversions = domain->nconversions;
struct converted_domain *convd = NULL; convd = NULL;
size_t i;
for (i = nconversions; i > 0; ) for (i = nconversions; i > 0; )
{ {
@ -1022,134 +1027,165 @@ _nl_find_msg (struct loaded_l10nfile *domain_file,
} }
} }
gl_rwlock_unlock (domain->conversions_lock);
if (convd == NULL) if (convd == NULL)
{ {
/* Allocate a table for the converted translations for this /* We have to allocate a new conversions table. */
encoding. */ gl_rwlock_wrlock (domain->conversions_lock);
struct converted_domain *new_conversions = nconversions = domain->nconversions;
(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)) /* Maybe in the meantime somebody added the translation.
/* Nothing we can do, no more memory. We cannot use the Recheck. */
translation because it might be encoded incorrectly. */ for (i = nconversions; i > 0; )
return (char *) -1; {
i--;
if (strcmp (domain->conversions[i].encoding, encoding) == 0)
{
convd = &domain->conversions[i];
goto found_convd;
}
}
domain->conversions = new_conversions; {
/* 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)));
/* Copy the 'encoding' string to permanent storage. */ if (__builtin_expect (new_conversions == NULL, 0))
encoding = strdup (encoding); {
if (__builtin_expect (encoding == NULL, 0)) /* Nothing we can do, no more memory. We cannot use the
/* Nothing we can do, no more memory. We cannot use the translation because it might be encoded incorrectly. */
translation because it might be encoded incorrectly. */ unlock_fail:
return (char *) -1; gl_rwlock_unlock (domain->conversions_lock);
return (char *) -1;
}
convd = &new_conversions[nconversions]; domain->conversions = new_conversions;
convd->encoding = encoding;
/* Find out about the character set the file is encoded with. /* Copy the 'encoding' string to permanent storage. */
This can be found (in textual form) in the entry "". If this encoding = strdup (encoding);
entry does not exist or if this does not contain the 'charset=' if (__builtin_expect (encoding == NULL, 0))
information, we will assume the charset matches the one the /* Nothing we can do, no more memory. We cannot use the
current locale and we don't have to perform any conversion. */ 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 # ifdef _LIBC
convd->conv = (__gconv_t) -1; convd->conv = (__gconv_t) -1;
# else # else
# if HAVE_ICONV # if HAVE_ICONV
convd->conv = (iconv_t) -1; convd->conv = (iconv_t) -1;
# endif # endif
# endif # endif
{ {
char *nullentry; char *nullentry;
size_t nullentrylen; size_t nullentrylen;
/* Get the header entry. This is a recursion, but it doesn't /* Get the header entry. This is a recursion, but it doesn't
reallocate domain->conversions because we pass reallocate domain->conversions because we pass
encoding = NULL or convert = 0, respectively. */ encoding = NULL or convert = 0, respectively. */
nullentry = nullentry =
# ifdef IN_LIBGLOCALE # ifdef IN_LIBGLOCALE
_nl_find_msg (domain_file, domainbinding, NULL, "", _nl_find_msg (domain_file, domainbinding, NULL, "",
&nullentrylen); &nullentrylen);
# else # else
_nl_find_msg (domain_file, domainbinding, "", 0, &nullentrylen); _nl_find_msg (domain_file, domainbinding, "", 0, &nullentrylen);
# endif # endif
if (nullentry != NULL) if (nullentry != NULL)
{ {
const char *charsetstr; const char *charsetstr;
charsetstr = strstr (nullentry, "charset="); charsetstr = strstr (nullentry, "charset=");
if (charsetstr != NULL) if (charsetstr != NULL)
{ {
size_t len; size_t len;
char *charset; char *charset;
const char *outcharset; const char *outcharset;
charsetstr += strlen ("charset="); charsetstr += strlen ("charset=");
len = strcspn (charsetstr, " \t\n"); len = strcspn (charsetstr, " \t\n");
charset = (char *) alloca (len + 1); charset = (char *) alloca (len + 1);
# if defined _LIBC || HAVE_MEMPCPY # if defined _LIBC || HAVE_MEMPCPY
*((char *) mempcpy (charset, charsetstr, len)) = '\0'; *((char *) mempcpy (charset, charsetstr, len)) = '\0';
# else # else
memcpy (charset, charsetstr, len); memcpy (charset, charsetstr, len);
charset[len] = '\0'; charset[len] = '\0';
# endif # endif
outcharset = encoding; outcharset = encoding;
# ifdef _LIBC # ifdef _LIBC
/* We always want to use transliteration. */ /* We always want to use transliteration. */
outcharset = norm_add_slashes (outcharset, "TRANSLIT"); outcharset = norm_add_slashes (outcharset, "TRANSLIT");
charset = norm_add_slashes (charset, ""); charset = norm_add_slashes (charset, "");
int r = __gconv_open (outcharset, charset, &convd->conv, int r = __gconv_open (outcharset, charset, &convd->conv,
GCONV_AVOID_NOCONV); GCONV_AVOID_NOCONV);
if (__builtin_expect (r != __GCONV_OK, 0)) if (__builtin_expect (r != __GCONV_OK, 0))
{ {
/* If the output encoding is the same there is /* If the output encoding is the same there is
nothing to do. Otherwise do not use the nothing to do. Otherwise do not use the
translation at all. */ translation at all. */
if (__builtin_expect (r != __GCONV_NOCONV, 1)) if (__builtin_expect (r != __GCONV_NULCONV, 1))
return NULL; {
gl_rwlock_unlock (domain->conversions_lock);
free ((char *) encoding);
return NULL;
}
convd->conv = (__gconv_t) -1; convd->conv = (__gconv_t) -1;
} }
# else # else
# if HAVE_ICONV # if HAVE_ICONV
/* When using GNU libc >= 2.2 or GNU libiconv >= 1.5, /* When using GNU libc >= 2.2 or GNU libiconv >= 1.5,
we want to use transliteration. */ we want to use transliteration. */
# if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2) || __GLIBC__ > 2 \ # if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2) || __GLIBC__ > 2 \
|| _LIBICONV_VERSION >= 0x0105 || _LIBICONV_VERSION >= 0x0105
if (strchr (outcharset, '/') == NULL) if (strchr (outcharset, '/') == NULL)
{ {
char *tmp; char *tmp;
len = strlen (outcharset); len = strlen (outcharset);
tmp = (char *) alloca (len + 10 + 1); tmp = (char *) alloca (len + 10 + 1);
memcpy (tmp, outcharset, len); memcpy (tmp, outcharset, len);
memcpy (tmp + len, "//TRANSLIT", 10 + 1); memcpy (tmp + len, "//TRANSLIT", 10 + 1);
outcharset = tmp; outcharset = tmp;
convd->conv = iconv_open (outcharset, charset); convd->conv = iconv_open (outcharset, charset);
freea (outcharset); freea (outcharset);
} }
else else
# endif # endif
convd->conv = iconv_open (outcharset, charset); convd->conv = iconv_open (outcharset, charset);
# endif # endif
# endif # endif
freea (charset); freea (charset);
} }
} }
}
convd->conv_tab = NULL;
/* Here domain->conversions is still == new_conversions. */
domain->nconversions++;
} }
convd->conv_tab = NULL;
/* Here domain->conversions is still == new_conversions. */ found_convd:
domain->nconversions++; gl_rwlock_unlock (domain->conversions_lock);
} }
if ( if (
@ -1171,13 +1207,29 @@ _nl_find_msg (struct loaded_l10nfile *domain_file,
handle this case by converting RESULTLEN bytes, including handle this case by converting RESULTLEN bytes, including
NULs. */ NULs. */
if (convd->conv_tab == NULL /* This lock primarily protects the memory management variables
&& ((convd->conv_tab = 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, (char **) calloc (nstrings + domain->n_sysdep_strings,
sizeof (char *))) sizeof (char *));
== NULL)) if (convd->conv_tab != NULL)
/* Mark that we didn't succeed allocating a table. */ goto not_translated_yet;
convd->conv_tab = (char **) -1; /* 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)) if (__builtin_expect (convd->conv_tab == (char **) -1, 0))
/* Nothing we can do, no more memory. We cannot use the /* Nothing we can do, no more memory. We cannot use the
@ -1191,7 +1243,6 @@ _nl_find_msg (struct loaded_l10nfile *domain_file,
/* We use a bit more efficient memory handling. /* We use a bit more efficient memory handling.
We allocate always larger blocks which get used over We allocate always larger blocks which get used over
time. This is faster than many small allocations. */ time. This is faster than many small allocations. */
__libc_lock_define_initialized (static, lock)
# define INITIAL_BLOCK_SIZE 4080 # define INITIAL_BLOCK_SIZE 4080
static unsigned char *freemem; static unsigned char *freemem;
static size_t freemem_size; static size_t freemem_size;
@ -1200,13 +1251,17 @@ _nl_find_msg (struct loaded_l10nfile *domain_file,
unsigned char *outbuf; unsigned char *outbuf;
int malloc_count; int malloc_count;
# ifndef _LIBC # ifndef _LIBC
transmem_block_t *transmem_list = NULL; transmem_block_t *transmem_list;
# endif # endif
__libc_lock_lock (lock); __libc_lock_lock (lock);
not_translated_yet:
inbuf = (const unsigned char *) result; inbuf = (const unsigned char *) result;
outbuf = freemem + sizeof (size_t); outbuf = freemem + sizeof (size_t);
# ifndef _LIBC
transmem_list = NULL;
# endif
malloc_count = 0; malloc_count = 0;
while (1) while (1)
@ -1483,20 +1538,13 @@ guess_category_value (int category, const char *categoryname)
# ifdef _LIBC # ifdef _LIBC
locale = __current_locale_name (category); locale = __current_locale_name (category);
# else # else
# if HAVE_STRUCT___LOCALE_STRUCT___NAMES && defined USE_IN_GETTEXT_TESTS locale_defaulted = 0;
/* The __names field is not public glibc API and must therefore not be used # if HAVE_USELOCALE
in code that is installed in public locations. */ locale = _nl_locale_name_thread_unsafe (category, categoryname);
locale_t thread_locale = uselocale (NULL); if (locale == NULL)
if (thread_locale != LC_GLOBAL_LOCALE)
{
locale = thread_locale->__names[category];
locale_defaulted = 0;
}
else
# endif # endif
{ {
locale = _nl_locale_name_posix (category, categoryname); locale = _nl_locale_name_posix (category, categoryname);
locale_defaulted = 0;
if (locale == NULL) if (locale == NULL)
{ {
locale = _nl_locale_name_default (); locale = _nl_locale_name_default ();
@ -1584,7 +1632,6 @@ get_output_charset (struct binding *domainbinding)
return _NL_CURRENT (LC_CTYPE, CODESET); return _NL_CURRENT (LC_CTYPE, CODESET);
# else # else
# if HAVE_ICONV # if HAVE_ICONV
extern const char *locale_charset (void);
return locale_charset (); return locale_charset ();
# endif # endif
# endif # endif
@ -1617,6 +1664,10 @@ mempcpy (void *dest, const void *src, size_t n)
} }
#endif #endif
#if !_LIBC && !HAVE_TSEARCH
# include "tsearch.c"
#endif
#ifdef _LIBC #ifdef _LIBC
/* If we want to free all resources we have to do some work at /* If we want to free all resources we have to do some work at

View File

@ -1,5 +1,5 @@
/* Plural expression evaluation. /* Plural expression evaluation.
Copyright (C) 2000-2003 Free Software Foundation, Inc. Copyright (C) 2000-2003, 2007 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify it 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 under the terms of the GNU Library General Public License as published
@ -24,7 +24,7 @@
STATIC STATIC
unsigned long int unsigned long int
internal_function internal_function
plural_eval (struct expression *pexp, unsigned long int n) plural_eval (const struct expression *pexp, unsigned long int n)
{ {
switch (pexp->nargs) switch (pexp->nargs)
{ {

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1995-1998, 2000-2001, 2003, 2005 Free Software Foundation, Inc. /* Copyright (C) 1995-1998, 2000-2001, 2003, 2005, 2007 Free Software Foundation, Inc.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
This program is free software; you can redistribute it and/or modify it This program is free software; you can redistribute it and/or modify it
@ -105,7 +105,9 @@ _nl_explode_name (char *name,
{ {
*normalized_codeset = _nl_normalize_codeset (*codeset, *normalized_codeset = _nl_normalize_codeset (*codeset,
cp - *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); free ((char *) *normalized_codeset);
else else
mask |= XPG_NORM_CODESET; mask |= XPG_NORM_CODESET;

View File

@ -1,5 +1,5 @@
/* Handle list of needed message catalogs /* Handle list of needed message catalogs
Copyright (C) 1995-1999, 2000-2001, 2003-2006 Free Software Foundation, Inc. Copyright (C) 1995-1999, 2000-2001, 2003-2007 Free Software Foundation, Inc.
Written by Ulrich Drepper <drepper@gnu.org>, 1995. Written by Ulrich Drepper <drepper@gnu.org>, 1995.
This program is free software; you can redistribute it and/or modify it This program is free software; you can redistribute it and/or modify it
@ -144,6 +144,9 @@ _nl_find_domain (const char *dirname, char *locale,
look for the language. Termination symbols are `_', '.', and `@'. */ look for the language. Termination symbols are `_', '.', and `@'. */
mask = _nl_explode_name (locale, &language, &modifier, &territory, mask = _nl_explode_name (locale, &language, &modifier, &territory,
&codeset, &normalized_codeset); &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. */ /* We need to protect modifying the _NL_LOADED_DOMAINS data. */
gl_rwlock_wrlock (lock); gl_rwlock_wrlock (lock);
@ -159,7 +162,7 @@ _nl_find_domain (const char *dirname, char *locale,
if (retval == NULL) if (retval == NULL)
/* This means we are out of core. */ /* This means we are out of core. */
return NULL; goto out;
if (retval->decided <= 0) if (retval->decided <= 0)
_nl_load_domain (retval, domainbinding); _nl_load_domain (retval, domainbinding);
@ -179,6 +182,7 @@ _nl_find_domain (const char *dirname, char *locale,
if (alias_value != NULL) if (alias_value != NULL)
free (locale); free (locale);
out:
/* The space for normalized_codeset is dynamically allocated. Free it. */ /* The space for normalized_codeset is dynamically allocated. Free it. */
if (mask & XPG_NORM_CODESET) if (mask & XPG_NORM_CODESET)
free ((void *) normalized_codeset); free ((void *) normalized_codeset);

View File

@ -1,102 +0,0 @@
/* Description of GNU message catalog format: general file layout.
Copyright (C) 1995, 1997, 2000, 2001 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
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
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. */
#ifndef _GETTEXT_H
#define _GETTEXT_H 1
#if HAVE_LIMITS_H || _LIBC
# include <limits.h>
#endif
/* @@ end of prolog @@ */
/* The magic number of the GNU message catalog format. */
#define _MAGIC 0x950412de
#define _MAGIC_SWAPPED 0xde120495
/* Revision number of the currently used .mo (binary) file format. */
#define MO_REVISION_NUMBER 0
/* The following contortions are an attempt to use the C preprocessor
to determine an unsigned integral type that is 32 bits wide. An
alternative approach is to use autoconf's AC_CHECK_SIZEOF macro, but
as of version autoconf-2.13, the AC_CHECK_SIZEOF macro doesn't work
when cross-compiling. */
#if __STDC__
# define UINT_MAX_32_BITS 4294967295U
#else
# define UINT_MAX_32_BITS 0xFFFFFFFF
#endif
/* If UINT_MAX isn't defined, assume it's a 32-bit type.
This should be valid for all systems GNU cares about because
that doesn't include 16-bit systems, and only modern systems
(that certainly have <limits.h>) have 64+-bit integral types. */
#ifndef UINT_MAX
# define UINT_MAX UINT_MAX_32_BITS
#endif
#if UINT_MAX == UINT_MAX_32_BITS
typedef unsigned nls_uint32;
#else
# if USHRT_MAX == UINT_MAX_32_BITS
typedef unsigned short nls_uint32;
# else
# if ULONG_MAX == UINT_MAX_32_BITS
typedef unsigned long nls_uint32;
# else
/* The following line is intended to throw an error. Using #error is
not portable enough. */
"Cannot determine unsigned 32-bit data type."
# endif
# endif
#endif
/* Header for binary .mo file format. */
struct mo_file_header
{
/* The magic number. */
nls_uint32 magic;
/* The revision number of the file format. */
nls_uint32 revision;
/* The number of strings pairs. */
nls_uint32 nstrings;
/* Offset of table with start offsets of original strings. */
nls_uint32 orig_tab_offset;
/* Offset of table with start offsets of translation strings. */
nls_uint32 trans_tab_offset;
/* Size of hashing table. */
nls_uint32 hash_tab_size;
/* Offset of first hashing entry. */
nls_uint32 hash_tab_offset;
};
struct string_desc
{
/* Length of addressed string. */
nls_uint32 length;
/* Offset of string in file. */
nls_uint32 offset;
};
/* @@ begin of epilog @@ */
#endif /* gettext.h */

View File

@ -1,5 +1,5 @@
/* Header describing internals of libintl library. /* Header describing internals of libintl library.
Copyright (C) 1995-1999, 2000-2005 Free Software Foundation, Inc. Copyright (C) 1995-1999, 2000-2007, 2009-2010 Free Software Foundation, Inc.
Written by Ulrich Drepper <drepper@cygnus.com>, 1995. Written by Ulrich Drepper <drepper@cygnus.com>, 1995.
This program is free software; you can redistribute it and/or modify it This program is free software; you can redistribute it and/or modify it
@ -30,6 +30,14 @@
# endif # endif
#endif #endif
/* Handle multi-threaded applications. */
#ifdef _LIBC
# include <bits/libc-lock.h>
# define gl_rwlock_define __libc_rwlock_define
#else
# include "lock.h"
#endif
#ifdef _LIBC #ifdef _LIBC
extern char *__gettext (const char *__msgid); extern char *__gettext (const char *__msgid);
extern char *__dgettext (const char *__domainname, const char *__msgid); extern char *__dgettext (const char *__domainname, const char *__msgid);
@ -106,8 +114,12 @@ extern char *libintl_dcigettext (const char *__domainname,
# define SWAP(i) bswap_32 (i) # define SWAP(i) bswap_32 (i)
#else #else
static inline nls_uint32 static inline nls_uint32
# ifdef __cplusplus
SWAP (nls_uint32 i)
# else
SWAP (i) SWAP (i)
nls_uint32 i; nls_uint32 i;
# endif
{ {
return (i << 24) | ((i & 0xff00) << 8) | ((i >> 8) & 0xff00) | (i >> 24); return (i << 24) | ((i & 0xff00) << 8) | ((i >> 8) & 0xff00) | (i >> 24);
} }
@ -181,8 +193,9 @@ struct loaded_domain
/* Cache of charset conversions of the translated strings. */ /* Cache of charset conversions of the translated strings. */
struct converted_domain *conversions; struct converted_domain *conversions;
size_t nconversions; size_t nconversions;
gl_rwlock_define (, conversions_lock)
struct expression *plural; const struct expression *plural;
unsigned long int nplurals; unsigned long int nplurals;
}; };
@ -215,10 +228,30 @@ extern LIBINTL_DLL_EXPORTED int _nl_msg_cat_cntr;
#endif #endif
#ifndef _LIBC #ifndef _LIBC
const char *_nl_language_preferences_default (void); extern const char *_nl_language_preferences_default (void);
const char *_nl_locale_name_posix (int category, const char *categoryname); # define gl_locale_name_canonicalize _nl_locale_name_canonicalize
const char *_nl_locale_name_default (void); extern void _nl_locale_name_canonicalize (char *name);
const char *_nl_locale_name (int category, const char *categoryname); # 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 #endif
struct loaded_l10nfile *_nl_find_domain (const char *__dirname, char *__locale, struct loaded_l10nfile *_nl_find_domain (const char *__dirname, char *__locale,
@ -242,6 +275,37 @@ char *_nl_find_msg (struct loaded_l10nfile *domain_file,
internal_function; internal_function;
#endif #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 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
libc_hidden_proto (_nl_default_dirname)
#endif
/* 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 @@ */ /* @@ begin of epilog @@ */
#endif /* gettextP.h */ #endif /* gettextP.h */

View File

@ -1,5 +1,5 @@
/* Description of GNU message catalog format: general file layout. /* Description of GNU message catalog format: general file layout.
Copyright (C) 1995, 1997, 2000-2002, 2004 Free Software Foundation, Inc. Copyright (C) 1995, 1997, 2000-2002, 2004, 2006 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify it 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 under the terms of the GNU Library General Public License as published
@ -124,6 +124,15 @@ struct sysdep_segment
nls_uint32 offset; nls_uint32 offset;
}; };
/* Pair of a static and a system dependent segment, in struct sysdep_string. */
struct segment_pair
{
/* Size of static segment. */
nls_uint32 segsize;
/* Reference to system dependent string segment, or ~0 at the end. */
nls_uint32 sysdepref;
};
/* Descriptor for system dependent string. */ /* Descriptor for system dependent string. */
struct sysdep_string struct sysdep_string
{ {
@ -131,13 +140,7 @@ struct sysdep_string
nls_uint32 offset; nls_uint32 offset;
/* Alternating sequence of static and system dependent segments. /* Alternating sequence of static and system dependent segments.
The last segment is a static segment, including the trailing NUL. */ The last segment is a static segment, including the trailing NUL. */
struct segment_pair struct segment_pair segments[1];
{
/* Size of static segment. */
nls_uint32 segsize;
/* Reference to system dependent string segment, or ~0 at the end. */
nls_uint32 sysdepref;
} segments[1];
}; };
/* Marker for the end of the segments[] array. This has the value 0xFFFFFFFF, /* Marker for the end of the segments[] array. This has the value 0xFFFFFFFF,

View File

@ -93,7 +93,7 @@ ngettext (const char *msgid1, const char *msgid2, unsigned long int n)
DLL_EXPORTED DLL_EXPORTED
char * char *
dngettext (const char *domainname, dngettext (const char *domainname,
const char *msgid1, const char *msgid2, unsigned long int n) const char *msgid1, const char *msgid2, unsigned long int n)
{ {
return libintl_dngettext (domainname, msgid1, msgid2, n); return libintl_dngettext (domainname, msgid1, msgid2, n);
} }
@ -102,8 +102,8 @@ dngettext (const char *domainname,
DLL_EXPORTED DLL_EXPORTED
char * char *
dcngettext (const char *domainname, dcngettext (const char *domainname,
const char *msgid1, const char *msgid2, unsigned long int n, const char *msgid1, const char *msgid2, unsigned long int n,
int category) int category)
{ {
return libintl_dcngettext (domainname, msgid1, msgid2, n, category); return libintl_dcngettext (domainname, msgid1, msgid2, n, category);
} }

View File

@ -23,14 +23,14 @@
/* Ensure that the variable x is exported from the library, and that a /* Ensure that the variable x is exported from the library, and that a
pseudo-variable IMP(x) is available. */ pseudo-variable IMP(x) is available. */
#define VARIABLE(x) \ #define VARIABLE(x) \
/* Export x without redefining x. This code was found by compiling a \ /* Export x without redefining x. This code was found by compiling a \
snippet: \ snippet: \
extern __declspec(dllexport) int x; int x = 42; */ \ extern __declspec(dllexport) int x; int x = 42; */ \
asm (".section .drectve\n"); \ asm (".section .drectve\n"); \
asm (".ascii \" -export:" #x ",data\"\n"); \ asm (".ascii \" -export:" #x ",data\"\n"); \
asm (".data\n"); \ asm (".data\n"); \
/* Allocate a pseudo-variable IMP(x). */ \ /* Allocate a pseudo-variable IMP(x). */ \
extern int x; \ extern int x; \
void * IMP(x) = &x; void * IMP(x) = &x;
VARIABLE(libintl_version) VARIABLE(libintl_version)

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1995-1999, 2000-2006 Free Software Foundation, Inc. /* Copyright (C) 1995-1999, 2000-2007 Free Software Foundation, Inc.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
This program is free software; you can redistribute it and/or modify it This program is free software; you can redistribute it and/or modify it
@ -346,7 +346,7 @@ _nl_make_l10nflist (struct loaded_l10nfile **l10nfile_list,
const char * const char *
_nl_normalize_codeset (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; int only_digit = 1;
char *retval; char *retval;
char *wp; char *wp;

View File

@ -1,5 +1,5 @@
/* Determine the user's language preferences. /* Determine the user's language preferences.
Copyright (C) 2004-2006 Free Software Foundation, Inc. Copyright (C) 2004-2007 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify it 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 under the terms of the GNU Library General Public License as published
@ -16,7 +16,8 @@
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
USA. */ USA. */
/* Written by Bruno Haible <bruno@clisp.org>. */ /* Written by Bruno Haible <bruno@clisp.org>.
Win32 code originally by Michele Cicciotti <hackbunny@reactos.com>. */
#ifdef HAVE_CONFIG_H #ifdef HAVE_CONFIG_H
# include <config.h> # include <config.h>
@ -33,6 +34,197 @@
extern void _nl_locale_name_canonicalize (char *name); extern void _nl_locale_name_canonicalize (char *name);
#endif #endif
#if defined _WIN32 || defined __WIN32__
# define WIN32_NATIVE
#endif
#ifdef WIN32_NATIVE
# define WIN32_LEAN_AND_MEAN
# include <windows.h>
# ifndef MUI_LANGUAGE_NAME
# define MUI_LANGUAGE_NAME 8
# endif
# ifndef STATUS_BUFFER_OVERFLOW
# define STATUS_BUFFER_OVERFLOW 0x80000005
# endif
extern void _nl_locale_name_canonicalize (char *name);
extern const char *_nl_locale_name_from_win32_LANGID (LANGID langid);
extern const char *_nl_locale_name_from_win32_LCID (LCID lcid);
/* Get the preferences list through the MUI APIs. This works on Windows Vista
and newer. */
static const char *
_nl_language_preferences_win32_mui (HMODULE kernel32)
{
/* DWORD GetUserPreferredUILanguages (ULONG dwFlags,
PULONG pulNumLanguages,
PWSTR pwszLanguagesBuffer,
PULONG pcchLanguagesBuffer); */
typedef DWORD (WINAPI *GetUserPreferredUILanguages_func) (ULONG, PULONG, PWSTR, PULONG);
GetUserPreferredUILanguages_func p_GetUserPreferredUILanguages;
p_GetUserPreferredUILanguages =
(GetUserPreferredUILanguages_func)
GetProcAddress (kernel32, "GetUserPreferredUILanguages");
if (p_GetUserPreferredUILanguages != NULL)
{
ULONG num_languages;
ULONG bufsize;
DWORD ret;
bufsize = 0;
ret = p_GetUserPreferredUILanguages (MUI_LANGUAGE_NAME,
&num_languages,
NULL, &bufsize);
if (ret == 0
&& GetLastError () == STATUS_BUFFER_OVERFLOW
&& bufsize > 0)
{
WCHAR *buffer = (WCHAR *) malloc (bufsize * sizeof (WCHAR));
if (buffer != NULL)
{
ret = p_GetUserPreferredUILanguages (MUI_LANGUAGE_NAME,
&num_languages,
buffer, &bufsize);
if (ret)
{
/* Convert the list from NUL-delimited WCHAR[] Win32 locale
names to colon-delimited char[] Unix locale names.
We assume that all these locale names are in ASCII,
nonempty and contain no colons. */
char *languages =
(char *) malloc (bufsize + num_languages * 10 + 1);
if (languages != NULL)
{
const WCHAR *p = buffer;
char *q = languages;
ULONG i;
for (i = 0; i < num_languages; i++)
{
char *q1;
char *q2;
q1 = q;
if (i > 0)
*q++ = ':';
q2 = q;
for (; *p != (WCHAR)'\0'; p++)
{
if ((unsigned char) *p != *p || *p == ':')
{
/* A non-ASCII character or a colon inside
the Win32 locale name! Punt. */
q = q1;
break;
}
*q++ = (unsigned char) *p;
}
if (q == q1)
/* An unexpected Win32 locale name occurred. */
break;
*q = '\0';
_nl_locale_name_canonicalize (q2);
q = q2 + strlen (q2);
p++;
}
*q = '\0';
if (q > languages)
{
free (buffer);
return languages;
}
free (languages);
}
}
free (buffer);
}
}
}
return NULL;
}
/* Get a preference. This works on Windows ME and newer. */
static const char *
_nl_language_preferences_win32_ME (HMODULE kernel32)
{
/* LANGID GetUserDefaultUILanguage (void); */
typedef LANGID (WINAPI *GetUserDefaultUILanguage_func) (void);
GetUserDefaultUILanguage_func p_GetUserDefaultUILanguage;
p_GetUserDefaultUILanguage =
(GetUserDefaultUILanguage_func)
GetProcAddress (kernel32, "GetUserDefaultUILanguage");
if (p_GetUserDefaultUILanguage != NULL)
return _nl_locale_name_from_win32_LANGID (p_GetUserDefaultUILanguage ());
return NULL;
}
/* Get a preference. This works on Windows 95 and newer. */
static const char *
_nl_language_preferences_win32_95 ()
{
HKEY desktop_resource_locale_key;
if (RegOpenKeyExA (HKEY_CURRENT_USER,
"Control Panel\\Desktop\\ResourceLocale",
0, KEY_QUERY_VALUE, &desktop_resource_locale_key)
== NO_ERROR)
{
DWORD type;
char data[8 + 1];
DWORD data_size = sizeof (data);
DWORD ret;
ret = RegQueryValueExA (desktop_resource_locale_key, NULL, NULL,
&type, data, &data_size);
RegCloseKey (desktop_resource_locale_key);
if (ret == NO_ERROR)
{
/* We expect a string, at most 8 bytes long, that parses as a
hexadecimal number. */
if (type == REG_SZ
&& data_size <= sizeof (data)
&& (data_size < sizeof (data)
|| data[sizeof (data) - 1] == '\0'))
{
LCID lcid;
char *endp;
/* Ensure it's NUL terminated. */
if (data_size < sizeof (data))
data[data_size] = '\0';
/* Parse it as a hexadecimal number. */
lcid = strtoul (data, &endp, 16);
if (endp > data && *endp == '\0')
return _nl_locale_name_from_win32_LCID (lcid);
}
}
}
return NULL;
}
/* Get the system's preference. This can be used as a fallback. */
static BOOL CALLBACK
ret_first_language (HMODULE h, LPCSTR type, LPCSTR name, WORD lang, LONG_PTR param)
{
*(const char **)param = _nl_locale_name_from_win32_LANGID (lang);
return FALSE;
}
static const char *
_nl_language_preferences_win32_system (HMODULE kernel32)
{
const char *languages = NULL;
/* Ignore the warning on mingw here. mingw has a wrong definition of the last
parameter type of ENUMRESLANGPROC. */
EnumResourceLanguages (kernel32, RT_VERSION, MAKEINTRESOURCE (1),
ret_first_language, (LONG_PTR)&languages);
return languages;
}
#endif
/* Determine the user's language preferences, as a colon separated list of /* Determine the user's language preferences, as a colon separated list of
locale names in XPG syntax locale names in XPG syntax
language[_territory][.codeset][@modifier] language[_territory][.codeset][@modifier]
@ -51,75 +243,108 @@ _nl_language_preferences_default (void)
if (!cache_initialized) if (!cache_initialized)
{ {
CFTypeRef preferences = CFTypeRef preferences =
CFPreferencesCopyAppValue (CFSTR ("AppleLanguages"), CFPreferencesCopyAppValue (CFSTR ("AppleLanguages"),
kCFPreferencesCurrentApplication); kCFPreferencesCurrentApplication);
if (preferences != NULL if (preferences != NULL
&& CFGetTypeID (preferences) == CFArrayGetTypeID ()) && CFGetTypeID (preferences) == CFArrayGetTypeID ())
{ {
CFArrayRef prefArray = (CFArrayRef)preferences; CFArrayRef prefArray = (CFArrayRef)preferences;
int n = CFArrayGetCount (prefArray); int n = CFArrayGetCount (prefArray);
char buf[256]; char buf[256];
size_t size = 0; size_t size = 0;
int i; int i;
for (i = 0; i < n; i++) for (i = 0; i < n; i++)
{ {
CFTypeRef element = CFArrayGetValueAtIndex (prefArray, i); CFTypeRef element = CFArrayGetValueAtIndex (prefArray, i);
if (element != NULL if (element != NULL
&& CFGetTypeID (element) == CFStringGetTypeID () && CFGetTypeID (element) == CFStringGetTypeID ()
&& CFStringGetCString ((CFStringRef)element, && CFStringGetCString ((CFStringRef)element,
buf, sizeof (buf), buf, sizeof (buf),
kCFStringEncodingASCII)) kCFStringEncodingASCII))
{ {
_nl_locale_name_canonicalize (buf); _nl_locale_name_canonicalize (buf);
size += strlen (buf) + 1; size += strlen (buf) + 1;
/* Most GNU programs use msgids in English and don't ship /* Most GNU programs use msgids in English and don't ship
an en.mo message catalog. Therefore when we see "en" an en.mo message catalog. Therefore when we see "en"
in the preferences list, arrange for gettext() to in the preferences list, arrange for gettext() to
return the msgid, and ignore all further elements of return the msgid, and ignore all further elements of
the preferences list. */ the preferences list. */
if (strcmp (buf, "en") == 0) if (strcmp (buf, "en") == 0)
break; break;
} }
else else
break; break;
} }
if (size > 0) if (size > 0)
{ {
char *languages = (char *) malloc (size); char *languages = (char *) malloc (size);
if (languages != NULL) if (languages != NULL)
{ {
char *p = languages; char *p = languages;
for (i = 0; i < n; i++) for (i = 0; i < n; i++)
{ {
CFTypeRef element = CFTypeRef element =
CFArrayGetValueAtIndex (prefArray, i); CFArrayGetValueAtIndex (prefArray, i);
if (element != NULL if (element != NULL
&& CFGetTypeID (element) == CFStringGetTypeID () && CFGetTypeID (element) == CFStringGetTypeID ()
&& CFStringGetCString ((CFStringRef)element, && CFStringGetCString ((CFStringRef)element,
buf, sizeof (buf), buf, sizeof (buf),
kCFStringEncodingASCII)) kCFStringEncodingASCII))
{ {
_nl_locale_name_canonicalize (buf); _nl_locale_name_canonicalize (buf);
strcpy (p, buf); strcpy (p, buf);
p += strlen (buf); p += strlen (buf);
*p++ = ':'; *p++ = ':';
if (strcmp (buf, "en") == 0) if (strcmp (buf, "en") == 0)
break; break;
} }
else else
break; break;
} }
*--p = '\0'; *--p = '\0';
cached_languages = languages; cached_languages = languages;
} }
} }
} }
cache_initialized = 1; cache_initialized = 1;
}
if (cached_languages != NULL)
return cached_languages;
}
#endif
#ifdef WIN32_NATIVE
{
/* Cache the preferences list, since computing it is expensive. */
static const char *cached_languages;
static int cache_initialized;
/* Activate the new code only when the GETTEXT_MUI environment variable is
set, for the time being, since the new code is not well tested. */
if (!cache_initialized && getenv ("GETTEXT_MUI") != NULL)
{
const char *languages = NULL;
HMODULE kernel32 = GetModuleHandle ("kernel32");
if (kernel32 != NULL)
languages = _nl_language_preferences_win32_mui (kernel32);
if (languages == NULL && kernel32 != NULL)
languages = _nl_language_preferences_win32_ME (kernel32);
if (languages == NULL)
languages = _nl_language_preferences_win32_95 ();
if (languages == NULL && kernel32 != NULL)
languages = _nl_language_preferences_win32_system (kernel32);
cached_languages = languages;
cache_initialized = 1;
} }
if (cached_languages != NULL) if (cached_languages != NULL)
return cached_languages; return cached_languages;

View File

@ -1,49 +0,0 @@
/* Convenience header for conditional use of GNU <libintl.h>.
Copyright (C) 1995-1998, 2000, 2001 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
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
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. */
#ifndef _LIBGETTEXT_H
#define _LIBGETTEXT_H 1
/* NLS can be disabled through the configure --disable-nls option. */
#if ENABLE_NLS
/* Get declarations of GNU message catalog functions. */
# include <libintl.h>
#else
# define gettext(Msgid) (Msgid)
# define dgettext(Domainname, Msgid) (Msgid)
# define dcgettext(Domainname, Msgid, Category) (Msgid)
# define ngettext(Msgid1, Msgid2, N) \
((N) == 1 ? (char *) (Msgid1) : (char *) (Msgid2))
# define dngettext(Domainname, Msgid1, Msgid2, N) \
((N) == 1 ? (char *) (Msgid1) : (char *) (Msgid2))
# define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \
((N) == 1 ? (char *) (Msgid1) : (char *) (Msgid2))
# define textdomain(Domainname) ((char *) (Domainname))
# define bindtextdomain(Domainname, Dirname) ((char *) (Dirname))
# define bind_textdomain_codeset(Domainname, Codeset) ((char *) (Codeset))
#endif
/* For automatical extraction of messages sometimes no real
translation is needed. Instead the string itself is the result. */
#define gettext_noop(Str) (Str)
#endif /* _LIBGETTEXT_H */

View File

@ -1,5 +1,5 @@
/* Message catalogs for internationalization. /* Message catalogs for internationalization.
Copyright (C) 1995-1997, 2000-2006 Free Software Foundation, Inc. Copyright (C) 1995-1997, 2000-2010 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify it 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 under the terms of the GNU Library General Public License as published
@ -17,9 +17,12 @@
USA. */ USA. */
#ifndef _LIBINTL_H #ifndef _LIBINTL_H
#define _LIBINTL_H 1 #define _LIBINTL_H 1
#include <locale.h> #include <locale.h>
#if (defined __APPLE__ && defined __MACH__) && @HAVE_NEWLOCALE@
# include <xlocale.h>
#endif
/* The LC_MESSAGES locale category is the category used by the functions /* The LC_MESSAGES locale category is the category used by the functions
gettext() and dgettext(). It is specified in POSIX, but not in ANSI C. gettext() and dgettext(). It is specified in POSIX, but not in ANSI C.
@ -53,7 +56,7 @@ extern "C" {
/* Version number: (major<<16) + (minor<<8) + subminor */ /* Version number: (major<<16) + (minor<<8) + subminor */
#define LIBINTL_VERSION 0x001000 #define LIBINTL_VERSION 0x001201
extern int libintl_version; extern int libintl_version;
@ -88,7 +91,7 @@ extern int libintl_version;
If he doesn't, we choose the method. A third possible method is If he doesn't, we choose the method. A third possible method is
_INTL_REDIRECT_ASM, supported only by GCC. */ _INTL_REDIRECT_ASM, supported only by GCC. */
#if !(defined _INTL_REDIRECT_INLINE || defined _INTL_REDIRECT_MACROS) #if !(defined _INTL_REDIRECT_INLINE || defined _INTL_REDIRECT_MACROS)
# if __GNUC__ >= 2 && !(__APPLE_CC__ > 1) && !defined __MINGW32__ && !(__GNUC__ == 2 && defined _AIX) && (defined __STDC__ || defined __cplusplus) # if defined __GNUC__ && __GNUC__ >= 2 && !(defined __APPLE_CC__ && __APPLE_CC__ > 1) && !defined __MINGW32__ && !(__GNUC__ == 2 && defined _AIX) && (defined __STDC__ || defined __cplusplus)
# define _INTL_REDIRECT_ASM # define _INTL_REDIRECT_ASM
# else # else
# ifdef __cplusplus # ifdef __cplusplus
@ -110,7 +113,7 @@ extern int libintl_version;
/* _INTL_MAY_RETURN_STRING_ARG(n) declares that the given function may return /* _INTL_MAY_RETURN_STRING_ARG(n) declares that the given function may return
its n-th argument literally. This enables GCC to warn for example about its n-th argument literally. This enables GCC to warn for example about
printf (gettext ("foo %y")). */ printf (gettext ("foo %y")). */
#if __GNUC__ >= 3 && !(__APPLE_CC__ > 1 && defined __cplusplus) #if defined __GNUC__ && __GNUC__ >= 3 && !(defined __APPLE_CC__ && __APPLE_CC__ > 1 && defined __cplusplus)
# define _INTL_MAY_RETURN_STRING_ARG(n) __attribute__ ((__format_arg__ (n))) # define _INTL_MAY_RETURN_STRING_ARG(n) __attribute__ ((__format_arg__ (n)))
#else #else
# define _INTL_MAY_RETURN_STRING_ARG(n) # define _INTL_MAY_RETURN_STRING_ARG(n)
@ -157,10 +160,10 @@ extern char *dgettext (const char *__domainname, const char *__msgid)
locale. */ locale. */
#ifdef _INTL_REDIRECT_INLINE #ifdef _INTL_REDIRECT_INLINE
extern char *libintl_dcgettext (const char *__domainname, const char *__msgid, extern char *libintl_dcgettext (const char *__domainname, const char *__msgid,
int __category) int __category)
_INTL_MAY_RETURN_STRING_ARG (2); _INTL_MAY_RETURN_STRING_ARG (2);
static inline char *dcgettext (const char *__domainname, const char *__msgid, static inline char *dcgettext (const char *__domainname, const char *__msgid,
int __category) int __category)
{ {
return libintl_dcgettext (__domainname, __msgid, __category); return libintl_dcgettext (__domainname, __msgid, __category);
} }
@ -169,7 +172,7 @@ static inline char *dcgettext (const char *__domainname, const char *__msgid,
# define dcgettext libintl_dcgettext # define dcgettext libintl_dcgettext
#endif #endif
extern char *dcgettext (const char *__domainname, const char *__msgid, extern char *dcgettext (const char *__domainname, const char *__msgid,
int __category) int __category)
_INTL_ASM (libintl_dcgettext) _INTL_ASM (libintl_dcgettext)
_INTL_MAY_RETURN_STRING_ARG (2); _INTL_MAY_RETURN_STRING_ARG (2);
#endif #endif
@ -179,10 +182,10 @@ extern char *dcgettext (const char *__domainname, const char *__msgid,
number N. */ number N. */
#ifdef _INTL_REDIRECT_INLINE #ifdef _INTL_REDIRECT_INLINE
extern char *libintl_ngettext (const char *__msgid1, const char *__msgid2, extern char *libintl_ngettext (const char *__msgid1, const char *__msgid2,
unsigned long int __n) unsigned long int __n)
_INTL_MAY_RETURN_STRING_ARG (1) _INTL_MAY_RETURN_STRING_ARG (2); _INTL_MAY_RETURN_STRING_ARG (1) _INTL_MAY_RETURN_STRING_ARG (2);
static inline char *ngettext (const char *__msgid1, const char *__msgid2, static inline char *ngettext (const char *__msgid1, const char *__msgid2,
unsigned long int __n) unsigned long int __n)
{ {
return libintl_ngettext (__msgid1, __msgid2, __n); return libintl_ngettext (__msgid1, __msgid2, __n);
} }
@ -191,7 +194,7 @@ static inline char *ngettext (const char *__msgid1, const char *__msgid2,
# define ngettext libintl_ngettext # define ngettext libintl_ngettext
#endif #endif
extern char *ngettext (const char *__msgid1, const char *__msgid2, extern char *ngettext (const char *__msgid1, const char *__msgid2,
unsigned long int __n) unsigned long int __n)
_INTL_ASM (libintl_ngettext) _INTL_ASM (libintl_ngettext)
_INTL_MAY_RETURN_STRING_ARG (1) _INTL_MAY_RETURN_STRING_ARG (2); _INTL_MAY_RETURN_STRING_ARG (1) _INTL_MAY_RETURN_STRING_ARG (2);
#endif #endif
@ -200,10 +203,10 @@ extern char *ngettext (const char *__msgid1, const char *__msgid2,
number N. */ number N. */
#ifdef _INTL_REDIRECT_INLINE #ifdef _INTL_REDIRECT_INLINE
extern char *libintl_dngettext (const char *__domainname, const char *__msgid1, extern char *libintl_dngettext (const char *__domainname, const char *__msgid1,
const char *__msgid2, unsigned long int __n) const char *__msgid2, unsigned long int __n)
_INTL_MAY_RETURN_STRING_ARG (2) _INTL_MAY_RETURN_STRING_ARG (3); _INTL_MAY_RETURN_STRING_ARG (2) _INTL_MAY_RETURN_STRING_ARG (3);
static inline char *dngettext (const char *__domainname, const char *__msgid1, static inline char *dngettext (const char *__domainname, const char *__msgid1,
const char *__msgid2, unsigned long int __n) const char *__msgid2, unsigned long int __n)
{ {
return libintl_dngettext (__domainname, __msgid1, __msgid2, __n); return libintl_dngettext (__domainname, __msgid1, __msgid2, __n);
} }
@ -212,8 +215,8 @@ static inline char *dngettext (const char *__domainname, const char *__msgid1,
# define dngettext libintl_dngettext # define dngettext libintl_dngettext
#endif #endif
extern char *dngettext (const char *__domainname, extern char *dngettext (const char *__domainname,
const char *__msgid1, const char *__msgid2, const char *__msgid1, const char *__msgid2,
unsigned long int __n) unsigned long int __n)
_INTL_ASM (libintl_dngettext) _INTL_ASM (libintl_dngettext)
_INTL_MAY_RETURN_STRING_ARG (2) _INTL_MAY_RETURN_STRING_ARG (3); _INTL_MAY_RETURN_STRING_ARG (2) _INTL_MAY_RETURN_STRING_ARG (3);
#endif #endif
@ -222,12 +225,12 @@ extern char *dngettext (const char *__domainname,
number N. */ number N. */
#ifdef _INTL_REDIRECT_INLINE #ifdef _INTL_REDIRECT_INLINE
extern char *libintl_dcngettext (const char *__domainname, extern char *libintl_dcngettext (const char *__domainname,
const char *__msgid1, const char *__msgid2, const char *__msgid1, const char *__msgid2,
unsigned long int __n, int __category) unsigned long int __n, int __category)
_INTL_MAY_RETURN_STRING_ARG (2) _INTL_MAY_RETURN_STRING_ARG (3); _INTL_MAY_RETURN_STRING_ARG (2) _INTL_MAY_RETURN_STRING_ARG (3);
static inline char *dcngettext (const char *__domainname, static inline char *dcngettext (const char *__domainname,
const char *__msgid1, const char *__msgid2, const char *__msgid1, const char *__msgid2,
unsigned long int __n, int __category) unsigned long int __n, int __category)
{ {
return libintl_dcngettext (__domainname, __msgid1, __msgid2, __n, __category); return libintl_dcngettext (__domainname, __msgid1, __msgid2, __n, __category);
} }
@ -236,8 +239,8 @@ static inline char *dcngettext (const char *__domainname,
# define dcngettext libintl_dcngettext # define dcngettext libintl_dcngettext
#endif #endif
extern char *dcngettext (const char *__domainname, extern char *dcngettext (const char *__domainname,
const char *__msgid1, const char *__msgid2, const char *__msgid1, const char *__msgid2,
unsigned long int __n, int __category) unsigned long int __n, int __category)
_INTL_ASM (libintl_dcngettext) _INTL_ASM (libintl_dcngettext)
_INTL_MAY_RETURN_STRING_ARG (2) _INTL_MAY_RETURN_STRING_ARG (3); _INTL_MAY_RETURN_STRING_ARG (2) _INTL_MAY_RETURN_STRING_ARG (3);
#endif #endif
@ -266,9 +269,9 @@ extern char *textdomain (const char *__domainname)
in DIRNAME rather than in the system locale data base. */ in DIRNAME rather than in the system locale data base. */
#ifdef _INTL_REDIRECT_INLINE #ifdef _INTL_REDIRECT_INLINE
extern char *libintl_bindtextdomain (const char *__domainname, extern char *libintl_bindtextdomain (const char *__domainname,
const char *__dirname); const char *__dirname);
static inline char *bindtextdomain (const char *__domainname, static inline char *bindtextdomain (const char *__domainname,
const char *__dirname) const char *__dirname)
{ {
return libintl_bindtextdomain (__domainname, __dirname); return libintl_bindtextdomain (__domainname, __dirname);
} }
@ -284,9 +287,9 @@ extern char *bindtextdomain (const char *__domainname, const char *__dirname)
DOMAINNAME message catalog will be returned. */ DOMAINNAME message catalog will be returned. */
#ifdef _INTL_REDIRECT_INLINE #ifdef _INTL_REDIRECT_INLINE
extern char *libintl_bind_textdomain_codeset (const char *__domainname, extern char *libintl_bind_textdomain_codeset (const char *__domainname,
const char *__codeset); const char *__codeset);
static inline char *bind_textdomain_codeset (const char *__domainname, static inline char *bind_textdomain_codeset (const char *__domainname,
const char *__codeset) const char *__codeset)
{ {
return libintl_bind_textdomain_codeset (__domainname, __codeset); return libintl_bind_textdomain_codeset (__domainname, __codeset);
} }
@ -295,7 +298,7 @@ static inline char *bind_textdomain_codeset (const char *__domainname,
# define bind_textdomain_codeset libintl_bind_textdomain_codeset # define bind_textdomain_codeset libintl_bind_textdomain_codeset
#endif #endif
extern char *bind_textdomain_codeset (const char *__domainname, extern char *bind_textdomain_codeset (const char *__domainname,
const char *__codeset) const char *__codeset)
_INTL_ASM (libintl_bind_textdomain_codeset); _INTL_ASM (libintl_bind_textdomain_codeset);
#endif #endif
@ -316,58 +319,84 @@ extern char *bind_textdomain_codeset (const char *__domainname,
#include <stddef.h> #include <stddef.h>
/* Get va_list. */ /* Get va_list. */
#if __STDC__ || defined __cplusplus || defined _MSC_VER #if (defined __STDC__ && __STDC__) || defined __cplusplus || defined _MSC_VER
# include <stdarg.h> # include <stdarg.h>
#else #else
# include <varargs.h> # include <varargs.h>
#endif #endif
#if !(defined fprintf && defined _GL_STDIO_H) /* don't override gnulib */
#undef fprintf #undef fprintf
#define fprintf libintl_fprintf #define fprintf libintl_fprintf
extern int fprintf (FILE *, const char *, ...); extern int fprintf (FILE *, const char *, ...);
#endif
#if !(defined vfprintf && defined _GL_STDIO_H) /* don't override gnulib */
#undef vfprintf #undef vfprintf
#define vfprintf libintl_vfprintf #define vfprintf libintl_vfprintf
extern int vfprintf (FILE *, const char *, va_list); extern int vfprintf (FILE *, const char *, va_list);
#endif
#if !(defined printf && defined _GL_STDIO_H) /* don't override gnulib */
#undef printf #undef printf
#if defined __NetBSD__ || defined __CYGWIN__ || defined __MINGW32__ #if defined __NetBSD__ || defined __BEOS__ || defined __CYGWIN__ || defined __MINGW32__
/* Don't break __attribute__((format(printf,M,N))). /* Don't break __attribute__((format(printf,M,N))).
This redefinition is only possible because the libc in NetBSD, Cygwin, This redefinition is only possible because the libc in NetBSD, Cygwin,
mingw does not have a function __printf__. */ mingw does not have a function __printf__.
Alternatively, we could have done this redirection only when compiling with
__GNUC__, together with a symbol redirection:
extern int printf (const char *, ...)
__asm__ (#__USER_LABEL_PREFIX__ "libintl_printf");
But doing it now would introduce a binary incompatibility with already
distributed versions of libintl on these systems. */
# define libintl_printf __printf__ # define libintl_printf __printf__
#endif #endif
#define printf libintl_printf #define printf libintl_printf
extern int printf (const char *, ...); extern int printf (const char *, ...);
#endif
#if !(defined vprintf && defined _GL_STDIO_H) /* don't override gnulib */
#undef vprintf #undef vprintf
#define vprintf libintl_vprintf #define vprintf libintl_vprintf
extern int vprintf (const char *, va_list); extern int vprintf (const char *, va_list);
#endif
#if !(defined sprintf && defined _GL_STDIO_H) /* don't override gnulib */
#undef sprintf #undef sprintf
#define sprintf libintl_sprintf #define sprintf libintl_sprintf
extern int sprintf (char *, const char *, ...); extern int sprintf (char *, const char *, ...);
#endif
#if !(defined vsprintf && defined _GL_STDIO_H) /* don't override gnulib */
#undef vsprintf #undef vsprintf
#define vsprintf libintl_vsprintf #define vsprintf libintl_vsprintf
extern int vsprintf (char *, const char *, va_list); extern int vsprintf (char *, const char *, va_list);
#endif
#if @HAVE_SNPRINTF@ #if @HAVE_SNPRINTF@
#if !(defined snprintf && defined _GL_STDIO_H) /* don't override gnulib */
#undef snprintf #undef snprintf
#define snprintf libintl_snprintf #define snprintf libintl_snprintf
extern int snprintf (char *, size_t, const char *, ...); extern int snprintf (char *, size_t, const char *, ...);
#endif
#if !(defined vsnprintf && defined _GL_STDIO_H) /* don't override gnulib */
#undef vsnprintf #undef vsnprintf
#define vsnprintf libintl_vsnprintf #define vsnprintf libintl_vsnprintf
extern int vsnprintf (char *, size_t, const char *, va_list); extern int vsnprintf (char *, size_t, const char *, va_list);
#endif
#endif #endif
#if @HAVE_ASPRINTF@ #if @HAVE_ASPRINTF@
#if !(defined asprintf && defined _GL_STDIO_H) /* don't override gnulib */
#undef asprintf #undef asprintf
#define asprintf libintl_asprintf #define asprintf libintl_asprintf
extern int asprintf (char **, const char *, ...); extern int asprintf (char **, const char *, ...);
#endif
#if !(defined vasprintf && defined _GL_STDIO_H) /* don't override gnulib */
#undef vasprintf #undef vasprintf
#define vasprintf libintl_vasprintf #define vasprintf libintl_vasprintf
extern int vasprintf (char **, const char *, va_list); extern int vasprintf (char **, const char *, va_list);
#endif
#endif #endif
@ -399,6 +428,24 @@ extern int vswprintf (wchar_t *, size_t, const wchar_t *, va_list);
#endif #endif
/* Support for the locale chosen by the user. */
#if (defined __APPLE__ && defined __MACH__) || defined _WIN32 || defined __WIN32__ || defined __CYGWIN__
#undef setlocale
#define setlocale libintl_setlocale
extern char *setlocale (int, const char *);
#if @HAVE_NEWLOCALE@
#undef newlocale
#define newlocale libintl_newlocale
extern locale_t newlocale (int, const char *, locale_t);
#endif
#endif
/* Support for relocatable packages. */ /* Support for relocatable packages. */
/* Sets the original and the current installation prefix of the package. /* Sets the original and the current installation prefix of the package.
@ -409,7 +456,7 @@ extern int vswprintf (wchar_t *, size_t, const wchar_t *, va_list);
#define libintl_set_relocation_prefix libintl_set_relocation_prefix #define libintl_set_relocation_prefix libintl_set_relocation_prefix
extern void extern void
libintl_set_relocation_prefix (const char *orig_prefix, libintl_set_relocation_prefix (const char *orig_prefix,
const char *curr_prefix); const char *curr_prefix);
#ifdef __cplusplus #ifdef __cplusplus

38
intl/libintl.rc Normal file
View File

@ -0,0 +1,38 @@
/* Resources for intl.dll */
#include <winver.h>
VS_VERSION_INFO VERSIONINFO
FILEVERSION PACKAGE_VERSION_MAJOR,PACKAGE_VERSION_MINOR,PACKAGE_VERSION_SUBMINOR,0
PRODUCTVERSION PACKAGE_VERSION_MAJOR,PACKAGE_VERSION_MINOR,PACKAGE_VERSION_SUBMINOR,0
FILEFLAGSMASK 0x3fL /* VS_FFI_FILEFLAGSMASK */
#ifdef _DEBUG
FILEFLAGS 0x1L /* VS_FF_DEBUG */
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x10004L /* VOS_DOS_WINDOWS32 */
FILETYPE 0x2L /* VFT_DLL */
FILESUBTYPE 0x0L /* VFT2_UNKNOWN */
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "04090000" /* Lang = US English, Charset = ASCII */
BEGIN
VALUE "Comments", "This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA\0"
VALUE "CompanyName", "Free Software Foundation\0"
VALUE "FileDescription", "LGPLed libintl for Windows NT/2000/XP/Vista/7 and Windows 95/98/ME\0"
VALUE "FileVersion", PACKAGE_VERSION_STRING "\0"
VALUE "InternalName", "intl.dll\0"
VALUE "LegalCopyright", "Copyright (C) 1995-2010\0"
VALUE "LegalTrademarks", "\0"
VALUE "OriginalFilename", "intl.dll\0"
VALUE "ProductName", "libintl: accessing NLS message catalogs\0"
VALUE "ProductVersion", PACKAGE_VERSION_STRING "\0"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x0409, 0 /* US English, ASCII */
END
END

View File

@ -1,5 +1,5 @@
/* Load needed message catalogs. /* Load needed message catalogs.
Copyright (C) 1995-1999, 2000-2005 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 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 under the terms of the GNU Library General Public License as published
@ -976,6 +976,7 @@ _nl_load_domain (struct loaded_l10nfile *domain_file,
((char *) data ((char *) data
+ W (domain->must_swap, data->sysdep_segments_offset)); + W (domain->must_swap, data->sysdep_segments_offset));
sysdep_segment_values = sysdep_segment_values =
(const char **)
alloca (n_sysdep_segments * sizeof (const char *)); alloca (n_sysdep_segments * sizeof (const char *));
for (i = 0; i < n_sysdep_segments; i++) for (i = 0; i < n_sysdep_segments; i++)
{ {
@ -1258,8 +1259,7 @@ _nl_load_domain (struct loaded_l10nfile *domain_file,
/* This is an invalid revision. */ /* This is an invalid revision. */
invalid: invalid:
/* This is an invalid .mo file. */ /* This is an invalid .mo file. */
if (domain->malloced) free (domain->malloced);
free (domain->malloced);
#ifdef HAVE_MMAP #ifdef HAVE_MMAP
if (use_mmap) if (use_mmap)
munmap ((caddr_t) data, size); munmap ((caddr_t) data, size);
@ -1274,6 +1274,7 @@ _nl_load_domain (struct loaded_l10nfile *domain_file,
/* No caches of converted translations so far. */ /* No caches of converted translations so far. */
domain->conversions = NULL; domain->conversions = NULL;
domain->nconversions = 0; domain->nconversions = 0;
gl_rwlock_init (domain->conversions_lock);
/* Get the header entry and look for a plural specification. */ /* Get the header entry and look for a plural specification. */
#ifdef IN_LIBGLOCALE #ifdef IN_LIBGLOCALE
@ -1303,7 +1304,7 @@ _nl_unload_domain (struct loaded_domain *domain)
size_t i; size_t i;
if (domain->plural != &__gettext_germanic_plural) if (domain->plural != &__gettext_germanic_plural)
__gettext_free_exp (domain->plural); __gettext_free_exp ((struct expression *) domain->plural);
for (i = 0; i < domain->nconversions; i++) for (i = 0; i < domain->nconversions; i++)
{ {
@ -1315,11 +1316,10 @@ _nl_unload_domain (struct loaded_domain *domain)
if (convd->conv != (__gconv_t) -1) if (convd->conv != (__gconv_t) -1)
__gconv_close (convd->conv); __gconv_close (convd->conv);
} }
if (domain->conversions != NULL) free (domain->conversions);
free (domain->conversions); __libc_rwlock_fini (domain->conversions_lock);
if (domain->malloced) free (domain->malloced);
free (domain->malloced);
# ifdef _POSIX_MAPPED_FILES # ifdef _POSIX_MAPPED_FILES
if (domain->use_mmap) if (domain->use_mmap)

View File

@ -1,6 +1,6 @@
/* Determine a canonical name for the current locale's character encoding. /* Determine a canonical name for the current locale's character encoding.
Copyright (C) 2000-2006 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 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 under the terms of the GNU Library General Public License as published
@ -24,21 +24,29 @@
/* Specification. */ /* Specification. */
#include "localcharset.h" #include "localcharset.h"
#include <fcntl.h>
#include <stddef.h> #include <stddef.h>
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <stdlib.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__ #if defined _WIN32 || defined __WIN32__
# define WIN32_NATIVE # define WIN32_NATIVE
#endif #endif
#if defined __EMX__ #if defined __EMX__
/* Assume EMX program runs on OS/2, even if compiled under DOS. */ /* Assume EMX program runs on OS/2, even if compiled under DOS. */
# define OS2 # ifndef OS2
# define OS2
# endif
#endif #endif
#if !defined WIN32_NATIVE #if !defined WIN32_NATIVE
# include <unistd.h>
# if HAVE_LANGINFO_CODESET # if HAVE_LANGINFO_CODESET
# include <langinfo.h> # include <langinfo.h>
# else # else
@ -70,6 +78,11 @@
# include "configmake.h" # include "configmake.h"
#endif #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__ || defined __DJGPP__ #if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__
/* Win32, Cygwin, OS/2, DOS */ /* Win32, Cygwin, OS/2, DOS */
# define ISSLASH(C) ((C) == '/' || (C) == '\\') # define ISSLASH(C) ((C) == '/' || (C) == '\\')
@ -111,160 +124,220 @@ get_charset_aliases (void)
cp = charset_aliases; cp = charset_aliases;
if (cp == NULL) if (cp == NULL)
{ {
#if !(defined VMS || defined WIN32_NATIVE || defined __CYGWIN__) #if !(defined DARWIN7 || defined VMS || defined WIN32_NATIVE || defined __CYGWIN__)
FILE *fp;
const char *dir; const char *dir;
const char *base = "charset.alias"; const char *base = "charset.alias";
char *file_name; char *file_name;
/* Make it possible to override the charset.alias location. This is /* Make it possible to override the charset.alias location. This is
necessary for running the testsuite before "make install". */ necessary for running the testsuite before "make install". */
dir = getenv ("CHARSETALIASDIR"); dir = getenv ("CHARSETALIASDIR");
if (dir == NULL || dir[0] == '\0') if (dir == NULL || dir[0] == '\0')
dir = relocate (LIBDIR); dir = relocate (LIBDIR);
/* Concatenate dir and base into freshly allocated file_name. */ /* Concatenate dir and base into freshly allocated file_name. */
{ {
size_t dir_len = strlen (dir); size_t dir_len = strlen (dir);
size_t base_len = strlen (base); size_t base_len = strlen (base);
int add_slash = (dir_len > 0 && !ISSLASH (dir[dir_len - 1])); int add_slash = (dir_len > 0 && !ISSLASH (dir[dir_len - 1]));
file_name = (char *) malloc (dir_len + add_slash + base_len + 1); file_name = (char *) malloc (dir_len + add_slash + base_len + 1);
if (file_name != NULL) if (file_name != NULL)
{ {
memcpy (file_name, dir, dir_len); memcpy (file_name, dir, dir_len);
if (add_slash) if (add_slash)
file_name[dir_len] = DIRECTORY_SEPARATOR; file_name[dir_len] = DIRECTORY_SEPARATOR;
memcpy (file_name + dir_len + add_slash, base, base_len + 1); memcpy (file_name + dir_len + add_slash, base, base_len + 1);
} }
} }
if (file_name == NULL || (fp = fopen (file_name, "r")) == NULL) if (file_name == NULL)
/* Out of memory or file not found, treat it as empty. */ /* Out of memory. Treat the file as empty. */
cp = ""; cp = "";
else else
{ {
/* Parse the file's contents. */ int fd;
char *res_ptr = NULL;
size_t res_size = 0;
for (;;) /* Open the file. Reject symbolic links on platforms that support
{ O_NOFOLLOW. This is a security feature. Without it, an attacker
int c; could retrieve parts of the contents (namely, the tail of the
char buf1[50+1]; first line that starts with "* ") of an arbitrary file by placing
char buf2[50+1]; a symbolic link to that file under the name "charset.alias" in
size_t l1, l2; some writable directory and defining the environment variable
char *old_res_ptr; 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;
c = getc (fp); fp = fdopen (fd, "r");
if (c == EOF) if (fp == NULL)
break; {
if (c == '\n' || c == ' ' || c == '\t') /* Out of memory. Treat the file as empty. */
continue; close (fd);
if (c == '#') cp = "";
{ }
/* Skip comment, to end of line. */ else
do {
c = getc (fp); /* Parse the file's contents. */
while (!(c == EOF || c == '\n')); char *res_ptr = NULL;
if (c == EOF) size_t res_size = 0;
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;
}
}
if (file_name != NULL) for (;;)
free (file_name); {
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 #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 # if defined VMS
/* To avoid the troubles of an extra file charset.alias_vms in the /* To avoid the troubles of an extra file charset.alias_vms in the
sources of many GNU packages, simply inline the aliases here. */ sources of many GNU packages, simply inline the aliases here. */
/* The list of encodings is taken from the OpenVMS 7.3-1 documentation /* The list of encodings is taken from the OpenVMS 7.3-1 documentation
"Compaq C Run-Time Library Reference Manual for OpenVMS systems" "Compaq C Run-Time Library Reference Manual for OpenVMS systems"
section 10.7 "Handling Different Character Sets". */ section 10.7 "Handling Different Character Sets". */
cp = "ISO8859-1" "\0" "ISO-8859-1" "\0" cp = "ISO8859-1" "\0" "ISO-8859-1" "\0"
"ISO8859-2" "\0" "ISO-8859-2" "\0" "ISO8859-2" "\0" "ISO-8859-2" "\0"
"ISO8859-5" "\0" "ISO-8859-5" "\0" "ISO8859-5" "\0" "ISO-8859-5" "\0"
"ISO8859-7" "\0" "ISO-8859-7" "\0" "ISO8859-7" "\0" "ISO-8859-7" "\0"
"ISO8859-8" "\0" "ISO-8859-8" "\0" "ISO8859-8" "\0" "ISO-8859-8" "\0"
"ISO8859-9" "\0" "ISO-8859-9" "\0" "ISO8859-9" "\0" "ISO-8859-9" "\0"
/* Japanese */ /* Japanese */
"eucJP" "\0" "EUC-JP" "\0" "eucJP" "\0" "EUC-JP" "\0"
"SJIS" "\0" "SHIFT_JIS" "\0" "SJIS" "\0" "SHIFT_JIS" "\0"
"DECKANJI" "\0" "DEC-KANJI" "\0" "DECKANJI" "\0" "DEC-KANJI" "\0"
"SDECKANJI" "\0" "EUC-JP" "\0" "SDECKANJI" "\0" "EUC-JP" "\0"
/* Chinese */ /* Chinese */
"eucTW" "\0" "EUC-TW" "\0" "eucTW" "\0" "EUC-TW" "\0"
"DECHANYU" "\0" "DEC-HANYU" "\0" "DECHANYU" "\0" "DEC-HANYU" "\0"
"DECHANZI" "\0" "GB2312" "\0" "DECHANZI" "\0" "GB2312" "\0"
/* Korean */ /* Korean */
"DECKOREAN" "\0" "EUC-KR" "\0"; "DECKOREAN" "\0" "EUC-KR" "\0";
# endif # endif
# if defined WIN32_NATIVE || defined __CYGWIN__ # if defined WIN32_NATIVE || defined __CYGWIN__
/* To avoid the troubles of installing a separate file in the same /* To avoid the troubles of installing a separate file in the same
directory as the DLL and of retrieving the DLL's directory at directory as the DLL and of retrieving the DLL's directory at
runtime, simply inline the aliases here. */ runtime, simply inline the aliases here. */
cp = "CP936" "\0" "GBK" "\0" cp = "CP936" "\0" "GBK" "\0"
"CP1361" "\0" "JOHAB" "\0" "CP1361" "\0" "JOHAB" "\0"
"CP20127" "\0" "ASCII" "\0" "CP20127" "\0" "ASCII" "\0"
"CP20866" "\0" "KOI8-R" "\0" "CP20866" "\0" "KOI8-R" "\0"
"CP20936" "\0" "GB2312" "\0" "CP20936" "\0" "GB2312" "\0"
"CP21866" "\0" "KOI8-RU" "\0" "CP21866" "\0" "KOI8-RU" "\0"
"CP28591" "\0" "ISO-8859-1" "\0" "CP28591" "\0" "ISO-8859-1" "\0"
"CP28592" "\0" "ISO-8859-2" "\0" "CP28592" "\0" "ISO-8859-2" "\0"
"CP28593" "\0" "ISO-8859-3" "\0" "CP28593" "\0" "ISO-8859-3" "\0"
"CP28594" "\0" "ISO-8859-4" "\0" "CP28594" "\0" "ISO-8859-4" "\0"
"CP28595" "\0" "ISO-8859-5" "\0" "CP28595" "\0" "ISO-8859-5" "\0"
"CP28596" "\0" "ISO-8859-6" "\0" "CP28596" "\0" "ISO-8859-6" "\0"
"CP28597" "\0" "ISO-8859-7" "\0" "CP28597" "\0" "ISO-8859-7" "\0"
"CP28598" "\0" "ISO-8859-8" "\0" "CP28598" "\0" "ISO-8859-8" "\0"
"CP28599" "\0" "ISO-8859-9" "\0" "CP28599" "\0" "ISO-8859-9" "\0"
"CP28605" "\0" "ISO-8859-15" "\0" "CP28605" "\0" "ISO-8859-15" "\0"
"CP38598" "\0" "ISO-8859-8" "\0" "CP38598" "\0" "ISO-8859-8" "\0"
"CP51932" "\0" "EUC-JP" "\0" "CP51932" "\0" "EUC-JP" "\0"
"CP51936" "\0" "GB2312" "\0" "CP51936" "\0" "GB2312" "\0"
"CP51949" "\0" "EUC-KR" "\0" "CP51949" "\0" "EUC-KR" "\0"
"CP51950" "\0" "EUC-TW" "\0" "CP51950" "\0" "EUC-TW" "\0"
"CP54936" "\0" "GB18030" "\0" "CP54936" "\0" "GB18030" "\0"
"CP65001" "\0" "UTF-8" "\0"; "CP65001" "\0" "UTF-8" "\0";
# endif # endif
#endif #endif
@ -297,10 +370,9 @@ locale_charset (void)
codeset = nl_langinfo (CODESET); codeset = nl_langinfo (CODESET);
# ifdef __CYGWIN__ # ifdef __CYGWIN__
/* Cygwin 2006 does not have locales. nl_langinfo (CODESET) always /* Cygwin < 1.7 does not have locales. nl_langinfo (CODESET) always
returns "US-ASCII". As long as this is not fixed, return the suffix returns "US-ASCII". Return the suffix of the locale name from the
of the locale name from the environment variables (if present) or environment variables (if present) or the codepage as a number. */
the codepage as a number. */
if (codeset != NULL && strcmp (codeset, "US-ASCII") == 0) if (codeset != NULL && strcmp (codeset, "US-ASCII") == 0)
{ {
const char *locale; const char *locale;
@ -308,36 +380,46 @@ locale_charset (void)
locale = getenv ("LC_ALL"); locale = getenv ("LC_ALL");
if (locale == NULL || locale[0] == '\0') if (locale == NULL || locale[0] == '\0')
{ {
locale = getenv ("LC_CTYPE"); locale = getenv ("LC_CTYPE");
if (locale == NULL || locale[0] == '\0') if (locale == NULL || locale[0] == '\0')
locale = getenv ("LANG"); locale = getenv ("LANG");
} }
if (locale != NULL && locale[0] != '\0') if (locale != NULL && locale[0] != '\0')
{ {
/* If the locale name contains an encoding after the dot, return /* If the locale name contains an encoding after the dot, return
it. */ it. */
const char *dot = strchr (locale, '.'); const char *dot = strchr (locale, '.');
if (dot != NULL) if (dot != NULL)
{ {
const char *modifier; const char *modifier;
dot++; dot++;
/* Look for the possible @... trailer and remove it, if any. */ /* Look for the possible @... trailer and remove it, if any. */
modifier = strchr (dot, '@'); modifier = strchr (dot, '@');
if (modifier == NULL) if (modifier == NULL)
return dot; return dot;
if (modifier - dot < sizeof (buf)) if (modifier - dot < sizeof (buf))
{ {
memcpy (buf, dot, modifier - dot); memcpy (buf, dot, modifier - dot);
buf [modifier - dot] = '\0'; buf [modifier - dot] = '\0';
return buf; return buf;
} }
} }
} }
/* Woe32 has a function returning the locale's codepage as a number. */ /* 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 ()); sprintf (buf, "CP%u", GetACP ());
codeset = buf; codeset = buf;
} }
@ -359,11 +441,11 @@ locale_charset (void)
{ {
locale = getenv ("LC_ALL"); locale = getenv ("LC_ALL");
if (locale == NULL || locale[0] == '\0') if (locale == NULL || locale[0] == '\0')
{ {
locale = getenv ("LC_CTYPE"); locale = getenv ("LC_CTYPE");
if (locale == NULL || locale[0] == '\0') if (locale == NULL || locale[0] == '\0')
locale = getenv ("LANG"); locale = getenv ("LANG");
} }
} }
/* On some old systems, one used to set locale = "iso8859_1". On others, /* On some old systems, one used to set locale = "iso8859_1". On others,
@ -377,7 +459,13 @@ locale_charset (void)
static char buf[2 + 10 + 1]; static char buf[2 + 10 + 1];
/* Woe32 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 ()); sprintf (buf, "CP%u", GetACP ());
codeset = buf; codeset = buf;
@ -395,7 +483,7 @@ locale_charset (void)
{ {
locale = getenv ("LC_CTYPE"); locale = getenv ("LC_CTYPE");
if (locale == NULL || locale[0] == '\0') if (locale == NULL || locale[0] == '\0')
locale = getenv ("LANG"); locale = getenv ("LANG");
} }
if (locale != NULL && locale[0] != '\0') if (locale != NULL && locale[0] != '\0')
{ {
@ -403,21 +491,21 @@ locale_charset (void)
const char *dot = strchr (locale, '.'); const char *dot = strchr (locale, '.');
if (dot != NULL) if (dot != NULL)
{ {
const char *modifier; const char *modifier;
dot++; dot++;
/* Look for the possible @... trailer and remove it, if any. */ /* Look for the possible @... trailer and remove it, if any. */
modifier = strchr (dot, '@'); modifier = strchr (dot, '@');
if (modifier == NULL) if (modifier == NULL)
return dot; return dot;
if (modifier - dot < sizeof (buf)) if (modifier - dot < sizeof (buf))
{ {
memcpy (buf, dot, modifier - dot); memcpy (buf, dot, modifier - dot);
buf [modifier - dot] = '\0'; buf [modifier - dot] = '\0';
return buf; return buf;
} }
} }
/* Resolve through the charset.alias file. */ /* Resolve through the charset.alias file. */
codeset = locale; codeset = locale;
@ -426,12 +514,12 @@ locale_charset (void)
{ {
/* OS/2 has a function returning the locale's codepage as a number. */ /* OS/2 has a function returning the locale's codepage as a number. */
if (DosQueryCp (sizeof (cp), cp, &cplen)) if (DosQueryCp (sizeof (cp), cp, &cplen))
codeset = ""; codeset = "";
else else
{ {
sprintf (buf, "CP%u", cp[0]); sprintf (buf, "CP%u", cp[0]);
codeset = buf; codeset = buf;
} }
} }
#endif #endif
@ -445,10 +533,10 @@ locale_charset (void)
*aliases != '\0'; *aliases != '\0';
aliases += strlen (aliases) + 1, aliases += strlen (aliases) + 1) aliases += strlen (aliases) + 1, aliases += strlen (aliases) + 1)
if (strcmp (codeset, aliases) == 0 if (strcmp (codeset, aliases) == 0
|| (aliases[0] == '*' && aliases[1] == '\0')) || (aliases[0] == '*' && aliases[1] == '\0'))
{ {
codeset = aliases + strlen (aliases) + 1; codeset = aliases + strlen (aliases) + 1;
break; break;
} }
/* Don't return an empty string. GNU libc and GNU libiconv interpret /* Don't return an empty string. GNU libc and GNU libiconv interpret

View File

@ -1,5 +1,5 @@
# Locale name alias data base. # Locale name alias data base.
# Copyright (C) 1996-2001,2003 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 # 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 # under the terms of the GNU Library General Public License as published
@ -22,10 +22,9 @@
# A single line contains two fields: an alias and a substitution value. # A single line contains two fields: an alias and a substitution value.
# All entries are case independent. # All entries are case independent.
# Note: This file is far from being complete. If you have a value for # Note: This file is obsolete and is kept around for the time being for
# your own site which you think might be useful for others too, share # backward compatibility. Nobody should rely on the names defined here.
# it with the rest of us. Send it using the `glibcbug' script to # Locales should always be specified by their full name.
# bugs@gnu.org.
# Packages using this file: # Packages using this file:

View File

@ -1,5 +1,5 @@
/* Handle aliases for locale names. /* Handle aliases for locale names.
Copyright (C) 1995-1999, 2000-2001, 2003, 2005 Free Software Foundation, Inc. Copyright (C) 1995-1999, 2000-2001, 2003, 2005-2006 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify it 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 under the terms of the GNU Library General Public License as published
@ -349,12 +349,14 @@ read_alias_file (const char *fname, int fname_len)
string_space_max = new_size; string_space_max = new_size;
} }
map[nmap].alias = memcpy (&string_space[string_space_act], map[nmap].alias =
alias, alias_len); (const char *) memcpy (&string_space[string_space_act],
alias, alias_len);
string_space_act += alias_len; string_space_act += alias_len;
map[nmap].value = memcpy (&string_space[string_space_act], map[nmap].value =
value, value_len); (const char *) memcpy (&string_space[string_space_act],
value, value_len);
string_space_act += value_len; string_space_act += value_len;
++nmap; ++nmap;

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,5 @@
/* Locking in multithreaded situations. /* Locking in multithreaded situations.
Copyright (C) 2005-2006 Free Software Foundation, Inc. Copyright (C) 2005-2008 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify it 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 under the terms of the GNU Library General Public License as published
@ -32,6 +32,11 @@
Taking the lock: gl_lock_lock (name); Taking the lock: gl_lock_lock (name);
Releasing the lock: gl_lock_unlock (name); Releasing the lock: gl_lock_unlock (name);
De-initialization: gl_lock_destroy (name); De-initialization: gl_lock_destroy (name);
Equivalent functions with control of error handling:
Initialization: err = glthread_lock_init (&name);
Taking the lock: err = glthread_lock_lock (&name);
Releasing the lock: err = glthread_lock_unlock (&name);
De-initialization: err = glthread_lock_destroy (&name);
Read-Write (non-recursive) locks: Read-Write (non-recursive) locks:
Type: gl_rwlock_t Type: gl_rwlock_t
@ -42,6 +47,12 @@
gl_rwlock_wrlock (name); gl_rwlock_wrlock (name);
Releasing the lock: gl_rwlock_unlock (name); Releasing the lock: gl_rwlock_unlock (name);
De-initialization: gl_rwlock_destroy (name); De-initialization: gl_rwlock_destroy (name);
Equivalent functions with control of error handling:
Initialization: err = glthread_rwlock_init (&name);
Taking the lock: err = glthread_rwlock_rdlock (&name);
err = glthread_rwlock_wrlock (&name);
Releasing the lock: err = glthread_rwlock_unlock (&name);
De-initialization: err = glthread_rwlock_destroy (&name);
Recursive locks: Recursive locks:
Type: gl_recursive_lock_t Type: gl_recursive_lock_t
@ -51,17 +62,27 @@
Taking the lock: gl_recursive_lock_lock (name); Taking the lock: gl_recursive_lock_lock (name);
Releasing the lock: gl_recursive_lock_unlock (name); Releasing the lock: gl_recursive_lock_unlock (name);
De-initialization: gl_recursive_lock_destroy (name); De-initialization: gl_recursive_lock_destroy (name);
Equivalent functions with control of error handling:
Initialization: err = glthread_recursive_lock_init (&name);
Taking the lock: err = glthread_recursive_lock_lock (&name);
Releasing the lock: err = glthread_recursive_lock_unlock (&name);
De-initialization: err = glthread_recursive_lock_destroy (&name);
Once-only execution: Once-only execution:
Type: gl_once_t Type: gl_once_t
Initializer: gl_once_define(extern, name) Initializer: gl_once_define(extern, name)
Execution: gl_once (name, initfunction); Execution: gl_once (name, initfunction);
Equivalent functions with control of error handling:
Execution: err = glthread_once (&name, initfunction);
*/ */
#ifndef _LOCK_H #ifndef _LOCK_H
#define _LOCK_H #define _LOCK_H
#include <errno.h>
#include <stdlib.h>
/* ========================================================================= */ /* ========================================================================= */
#if USE_POSIX_THREADS #if USE_POSIX_THREADS
@ -69,7 +90,6 @@
/* Use the POSIX threads library. */ /* Use the POSIX threads library. */
# include <pthread.h> # include <pthread.h>
# include <stdlib.h>
# ifdef __cplusplus # ifdef __cplusplus
extern "C" { extern "C" {
@ -147,14 +167,14 @@ typedef pthread_mutex_t gl_lock_t;
STORAGECLASS pthread_mutex_t NAME = gl_lock_initializer; STORAGECLASS pthread_mutex_t NAME = gl_lock_initializer;
# define gl_lock_initializer \ # define gl_lock_initializer \
PTHREAD_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER
# define gl_lock_init(NAME) \ # define glthread_lock_init(LOCK) \
if (pthread_in_use () && pthread_mutex_init (&NAME, NULL) != 0) abort () (pthread_in_use () ? pthread_mutex_init (LOCK, NULL) : 0)
# define gl_lock_lock(NAME) \ # define glthread_lock_lock(LOCK) \
if (pthread_in_use () && pthread_mutex_lock (&NAME) != 0) abort () (pthread_in_use () ? pthread_mutex_lock (LOCK) : 0)
# define gl_lock_unlock(NAME) \ # define glthread_lock_unlock(LOCK) \
if (pthread_in_use () && pthread_mutex_unlock (&NAME) != 0) abort () (pthread_in_use () ? pthread_mutex_unlock (LOCK) : 0)
# define gl_lock_destroy(NAME) \ # define glthread_lock_destroy(LOCK) \
if (pthread_in_use () && pthread_mutex_destroy (&NAME) != 0) abort () (pthread_in_use () ? pthread_mutex_destroy (LOCK) : 0)
/* ------------------------- gl_rwlock_t datatype ------------------------- */ /* ------------------------- gl_rwlock_t datatype ------------------------- */
@ -169,16 +189,16 @@ typedef pthread_rwlock_t gl_rwlock_t;
STORAGECLASS pthread_rwlock_t NAME = gl_rwlock_initializer; STORAGECLASS pthread_rwlock_t NAME = gl_rwlock_initializer;
# define gl_rwlock_initializer \ # define gl_rwlock_initializer \
PTHREAD_RWLOCK_INITIALIZER PTHREAD_RWLOCK_INITIALIZER
# define gl_rwlock_init(NAME) \ # define glthread_rwlock_init(LOCK) \
if (pthread_in_use () && pthread_rwlock_init (&NAME, NULL) != 0) abort () (pthread_in_use () ? pthread_rwlock_init (LOCK, NULL) : 0)
# define gl_rwlock_rdlock(NAME) \ # define glthread_rwlock_rdlock(LOCK) \
if (pthread_in_use () && pthread_rwlock_rdlock (&NAME) != 0) abort () (pthread_in_use () ? pthread_rwlock_rdlock (LOCK) : 0)
# define gl_rwlock_wrlock(NAME) \ # define glthread_rwlock_wrlock(LOCK) \
if (pthread_in_use () && pthread_rwlock_wrlock (&NAME) != 0) abort () (pthread_in_use () ? pthread_rwlock_wrlock (LOCK) : 0)
# define gl_rwlock_unlock(NAME) \ # define glthread_rwlock_unlock(LOCK) \
if (pthread_in_use () && pthread_rwlock_unlock (&NAME) != 0) abort () (pthread_in_use () ? pthread_rwlock_unlock (LOCK) : 0)
# define gl_rwlock_destroy(NAME) \ # define glthread_rwlock_destroy(LOCK) \
if (pthread_in_use () && pthread_rwlock_destroy (&NAME) != 0) abort () (pthread_in_use () ? pthread_rwlock_destroy (LOCK) : 0)
# else # else
@ -195,21 +215,21 @@ typedef struct
STORAGECLASS gl_rwlock_t NAME = gl_rwlock_initializer; STORAGECLASS gl_rwlock_t NAME = gl_rwlock_initializer;
# define gl_rwlock_initializer \ # define gl_rwlock_initializer \
{ 0, PTHREAD_MUTEX_INITIALIZER } { 0, PTHREAD_MUTEX_INITIALIZER }
# define gl_rwlock_init(NAME) \ # define glthread_rwlock_init(LOCK) \
if (pthread_in_use ()) glthread_rwlock_init (&NAME) (pthread_in_use () ? glthread_rwlock_init_multithreaded (LOCK) : 0)
# define gl_rwlock_rdlock(NAME) \ # define glthread_rwlock_rdlock(LOCK) \
if (pthread_in_use ()) glthread_rwlock_rdlock (&NAME) (pthread_in_use () ? glthread_rwlock_rdlock_multithreaded (LOCK) : 0)
# define gl_rwlock_wrlock(NAME) \ # define glthread_rwlock_wrlock(LOCK) \
if (pthread_in_use ()) glthread_rwlock_wrlock (&NAME) (pthread_in_use () ? glthread_rwlock_wrlock_multithreaded (LOCK) : 0)
# define gl_rwlock_unlock(NAME) \ # define glthread_rwlock_unlock(LOCK) \
if (pthread_in_use ()) glthread_rwlock_unlock (&NAME) (pthread_in_use () ? glthread_rwlock_unlock_multithreaded (LOCK) : 0)
# define gl_rwlock_destroy(NAME) \ # define glthread_rwlock_destroy(LOCK) \
if (pthread_in_use ()) glthread_rwlock_destroy (&NAME) (pthread_in_use () ? glthread_rwlock_destroy_multithreaded (LOCK) : 0)
extern void glthread_rwlock_init (gl_rwlock_t *lock); extern int glthread_rwlock_init_multithreaded (gl_rwlock_t *lock);
extern void glthread_rwlock_rdlock (gl_rwlock_t *lock); extern int glthread_rwlock_rdlock_multithreaded (gl_rwlock_t *lock);
extern void glthread_rwlock_wrlock (gl_rwlock_t *lock); extern int glthread_rwlock_wrlock_multithreaded (gl_rwlock_t *lock);
extern void glthread_rwlock_unlock (gl_rwlock_t *lock); extern int glthread_rwlock_unlock_multithreaded (gl_rwlock_t *lock);
extern void glthread_rwlock_destroy (gl_rwlock_t *lock); extern int glthread_rwlock_destroy_multithreaded (gl_rwlock_t *lock);
# endif # endif
@ -230,21 +250,21 @@ typedef struct
STORAGECLASS gl_rwlock_t NAME = gl_rwlock_initializer; STORAGECLASS gl_rwlock_t NAME = gl_rwlock_initializer;
# define gl_rwlock_initializer \ # define gl_rwlock_initializer \
{ PTHREAD_MUTEX_INITIALIZER, PTHREAD_COND_INITIALIZER, PTHREAD_COND_INITIALIZER, 0, 0 } { PTHREAD_MUTEX_INITIALIZER, PTHREAD_COND_INITIALIZER, PTHREAD_COND_INITIALIZER, 0, 0 }
# define gl_rwlock_init(NAME) \ # define glthread_rwlock_init(LOCK) \
if (pthread_in_use ()) glthread_rwlock_init (&NAME) (pthread_in_use () ? glthread_rwlock_init_multithreaded (LOCK) : 0)
# define gl_rwlock_rdlock(NAME) \ # define glthread_rwlock_rdlock(LOCK) \
if (pthread_in_use ()) glthread_rwlock_rdlock (&NAME) (pthread_in_use () ? glthread_rwlock_rdlock_multithreaded (LOCK) : 0)
# define gl_rwlock_wrlock(NAME) \ # define glthread_rwlock_wrlock(LOCK) \
if (pthread_in_use ()) glthread_rwlock_wrlock (&NAME) (pthread_in_use () ? glthread_rwlock_wrlock_multithreaded (LOCK) : 0)
# define gl_rwlock_unlock(NAME) \ # define glthread_rwlock_unlock(LOCK) \
if (pthread_in_use ()) glthread_rwlock_unlock (&NAME) (pthread_in_use () ? glthread_rwlock_unlock_multithreaded (LOCK) : 0)
# define gl_rwlock_destroy(NAME) \ # define glthread_rwlock_destroy(LOCK) \
if (pthread_in_use ()) glthread_rwlock_destroy (&NAME) (pthread_in_use () ? glthread_rwlock_destroy_multithreaded (LOCK) : 0)
extern void glthread_rwlock_init (gl_rwlock_t *lock); extern int glthread_rwlock_init_multithreaded (gl_rwlock_t *lock);
extern void glthread_rwlock_rdlock (gl_rwlock_t *lock); extern int glthread_rwlock_rdlock_multithreaded (gl_rwlock_t *lock);
extern void glthread_rwlock_wrlock (gl_rwlock_t *lock); extern int glthread_rwlock_wrlock_multithreaded (gl_rwlock_t *lock);
extern void glthread_rwlock_unlock (gl_rwlock_t *lock); extern int glthread_rwlock_unlock_multithreaded (gl_rwlock_t *lock);
extern void glthread_rwlock_destroy (gl_rwlock_t *lock); extern int glthread_rwlock_destroy_multithreaded (gl_rwlock_t *lock);
# endif # endif
@ -266,14 +286,15 @@ typedef pthread_mutex_t gl_recursive_lock_t;
# define gl_recursive_lock_initializer \ # define gl_recursive_lock_initializer \
PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP
# endif # endif
# define gl_recursive_lock_init(NAME) \ # define glthread_recursive_lock_init(LOCK) \
if (pthread_in_use () && pthread_mutex_init (&NAME, NULL) != 0) abort () (pthread_in_use () ? glthread_recursive_lock_init_multithreaded (LOCK) : 0)
# define gl_recursive_lock_lock(NAME) \ # define glthread_recursive_lock_lock(LOCK) \
if (pthread_in_use () && pthread_mutex_lock (&NAME) != 0) abort () (pthread_in_use () ? pthread_mutex_lock (LOCK) : 0)
# define gl_recursive_lock_unlock(NAME) \ # define glthread_recursive_lock_unlock(LOCK) \
if (pthread_in_use () && pthread_mutex_unlock (&NAME) != 0) abort () (pthread_in_use () ? pthread_mutex_unlock (LOCK) : 0)
# define gl_recursive_lock_destroy(NAME) \ # define glthread_recursive_lock_destroy(LOCK) \
if (pthread_in_use () && pthread_mutex_destroy (&NAME) != 0) abort () (pthread_in_use () ? pthread_mutex_destroy (LOCK) : 0)
extern int glthread_recursive_lock_init_multithreaded (gl_recursive_lock_t *lock);
# else # else
@ -290,18 +311,18 @@ typedef struct
STORAGECLASS gl_recursive_lock_t NAME = gl_recursive_lock_initializer; STORAGECLASS gl_recursive_lock_t NAME = gl_recursive_lock_initializer;
# define gl_recursive_lock_initializer \ # define gl_recursive_lock_initializer \
{ PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, 0 } { PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, 0 }
# define gl_recursive_lock_init(NAME) \ # define glthread_recursive_lock_init(LOCK) \
if (pthread_in_use ()) glthread_recursive_lock_init (&NAME) (pthread_in_use () ? glthread_recursive_lock_init_multithreaded (LOCK) : 0)
# define gl_recursive_lock_lock(NAME) \ # define glthread_recursive_lock_lock(LOCK) \
if (pthread_in_use ()) glthread_recursive_lock_lock (&NAME) (pthread_in_use () ? glthread_recursive_lock_lock_multithreaded (LOCK) : 0)
# define gl_recursive_lock_unlock(NAME) \ # define glthread_recursive_lock_unlock(LOCK) \
if (pthread_in_use ()) glthread_recursive_lock_unlock (&NAME) (pthread_in_use () ? glthread_recursive_lock_unlock_multithreaded (LOCK) : 0)
# define gl_recursive_lock_destroy(NAME) \ # define glthread_recursive_lock_destroy(LOCK) \
if (pthread_in_use ()) glthread_recursive_lock_destroy (&NAME) (pthread_in_use () ? glthread_recursive_lock_destroy_multithreaded (LOCK) : 0)
extern void glthread_recursive_lock_init (gl_recursive_lock_t *lock); extern int glthread_recursive_lock_init_multithreaded (gl_recursive_lock_t *lock);
extern void glthread_recursive_lock_lock (gl_recursive_lock_t *lock); extern int glthread_recursive_lock_lock_multithreaded (gl_recursive_lock_t *lock);
extern void glthread_recursive_lock_unlock (gl_recursive_lock_t *lock); extern int glthread_recursive_lock_unlock_multithreaded (gl_recursive_lock_t *lock);
extern void glthread_recursive_lock_destroy (gl_recursive_lock_t *lock); extern int glthread_recursive_lock_destroy_multithreaded (gl_recursive_lock_t *lock);
# endif # endif
@ -323,18 +344,18 @@ typedef struct
STORAGECLASS gl_recursive_lock_t NAME = gl_recursive_lock_initializer; STORAGECLASS gl_recursive_lock_t NAME = gl_recursive_lock_initializer;
# define gl_recursive_lock_initializer \ # define gl_recursive_lock_initializer \
{ PTHREAD_MUTEX_INITIALIZER, (pthread_t) 0, 0 } { PTHREAD_MUTEX_INITIALIZER, (pthread_t) 0, 0 }
# define gl_recursive_lock_init(NAME) \ # define glthread_recursive_lock_init(LOCK) \
if (pthread_in_use ()) glthread_recursive_lock_init (&NAME) (pthread_in_use () ? glthread_recursive_lock_init_multithreaded (LOCK) : 0)
# define gl_recursive_lock_lock(NAME) \ # define glthread_recursive_lock_lock(LOCK) \
if (pthread_in_use ()) glthread_recursive_lock_lock (&NAME) (pthread_in_use () ? glthread_recursive_lock_lock_multithreaded (LOCK) : 0)
# define gl_recursive_lock_unlock(NAME) \ # define glthread_recursive_lock_unlock(LOCK) \
if (pthread_in_use ()) glthread_recursive_lock_unlock (&NAME) (pthread_in_use () ? glthread_recursive_lock_unlock_multithreaded (LOCK) : 0)
# define gl_recursive_lock_destroy(NAME) \ # define glthread_recursive_lock_destroy(LOCK) \
if (pthread_in_use ()) glthread_recursive_lock_destroy (&NAME) (pthread_in_use () ? glthread_recursive_lock_destroy_multithreaded (LOCK) : 0)
extern void glthread_recursive_lock_init (gl_recursive_lock_t *lock); extern int glthread_recursive_lock_init_multithreaded (gl_recursive_lock_t *lock);
extern void glthread_recursive_lock_lock (gl_recursive_lock_t *lock); extern int glthread_recursive_lock_lock_multithreaded (gl_recursive_lock_t *lock);
extern void glthread_recursive_lock_unlock (gl_recursive_lock_t *lock); extern int glthread_recursive_lock_unlock_multithreaded (gl_recursive_lock_t *lock);
extern void glthread_recursive_lock_destroy (gl_recursive_lock_t *lock); extern int glthread_recursive_lock_destroy_multithreaded (gl_recursive_lock_t *lock);
# endif # endif
@ -343,21 +364,10 @@ extern void glthread_recursive_lock_destroy (gl_recursive_lock_t *lock);
typedef pthread_once_t gl_once_t; typedef pthread_once_t gl_once_t;
# define gl_once_define(STORAGECLASS, NAME) \ # define gl_once_define(STORAGECLASS, NAME) \
STORAGECLASS pthread_once_t NAME = PTHREAD_ONCE_INIT; STORAGECLASS pthread_once_t NAME = PTHREAD_ONCE_INIT;
# define gl_once(NAME, INITFUNCTION) \ # define glthread_once(ONCE_CONTROL, INITFUNCTION) \
do \ (pthread_in_use () \
{ \ ? pthread_once (ONCE_CONTROL, INITFUNCTION) \
if (pthread_in_use ()) \ : (glthread_once_singlethreaded (ONCE_CONTROL) ? (INITFUNCTION (), 0) : 0))
{ \
if (pthread_once (&NAME, INITFUNCTION) != 0) \
abort (); \
} \
else \
{ \
if (glthread_once_singlethreaded (&NAME)) \
INITFUNCTION (); \
} \
} \
while (0)
extern int glthread_once_singlethreaded (pthread_once_t *once_control); extern int glthread_once_singlethreaded (pthread_once_t *once_control);
# ifdef __cplusplus # ifdef __cplusplus
@ -373,7 +383,6 @@ extern int glthread_once_singlethreaded (pthread_once_t *once_control);
/* Use the GNU Pth threads library. */ /* Use the GNU Pth threads library. */
# include <pth.h> # include <pth.h>
# include <stdlib.h>
# ifdef __cplusplus # ifdef __cplusplus
extern "C" { extern "C" {
@ -409,14 +418,14 @@ typedef pth_mutex_t gl_lock_t;
STORAGECLASS pth_mutex_t NAME = gl_lock_initializer; STORAGECLASS pth_mutex_t NAME = gl_lock_initializer;
# define gl_lock_initializer \ # define gl_lock_initializer \
PTH_MUTEX_INIT PTH_MUTEX_INIT
# define gl_lock_init(NAME) \ # define glthread_lock_init(LOCK) \
if (pth_in_use() && !pth_mutex_init (&NAME)) abort () (pth_in_use () && !pth_mutex_init (LOCK) ? errno : 0)
# define gl_lock_lock(NAME) \ # define glthread_lock_lock(LOCK) \
if (pth_in_use() && !pth_mutex_acquire (&NAME, 0, NULL)) abort () (pth_in_use () && !pth_mutex_acquire (LOCK, 0, NULL) ? errno : 0)
# define gl_lock_unlock(NAME) \ # define glthread_lock_unlock(LOCK) \
if (pth_in_use() && !pth_mutex_release (&NAME)) abort () (pth_in_use () && !pth_mutex_release (LOCK) ? errno : 0)
# define gl_lock_destroy(NAME) \ # define glthread_lock_destroy(LOCK) \
(void)(&NAME) ((void)(LOCK), 0)
/* ------------------------- gl_rwlock_t datatype ------------------------- */ /* ------------------------- gl_rwlock_t datatype ------------------------- */
@ -427,16 +436,16 @@ typedef pth_rwlock_t gl_rwlock_t;
STORAGECLASS pth_rwlock_t NAME = gl_rwlock_initializer; STORAGECLASS pth_rwlock_t NAME = gl_rwlock_initializer;
# define gl_rwlock_initializer \ # define gl_rwlock_initializer \
PTH_RWLOCK_INIT PTH_RWLOCK_INIT
# define gl_rwlock_init(NAME) \ # define glthread_rwlock_init(LOCK) \
if (pth_in_use() && !pth_rwlock_init (&NAME)) abort () (pth_in_use () && !pth_rwlock_init (LOCK) ? errno : 0)
# define gl_rwlock_rdlock(NAME) \ # define glthread_rwlock_rdlock(LOCK) \
if (pth_in_use() && !pth_rwlock_acquire (&NAME, PTH_RWLOCK_RD, 0, NULL)) abort () (pth_in_use () && !pth_rwlock_acquire (LOCK, PTH_RWLOCK_RD, 0, NULL) ? errno : 0)
# define gl_rwlock_wrlock(NAME) \ # define glthread_rwlock_wrlock(LOCK) \
if (pth_in_use() && !pth_rwlock_acquire (&NAME, PTH_RWLOCK_RW, 0, NULL)) abort () (pth_in_use () && !pth_rwlock_acquire (LOCK, PTH_RWLOCK_RW, 0, NULL) ? errno : 0)
# define gl_rwlock_unlock(NAME) \ # define glthread_rwlock_unlock(LOCK) \
if (pth_in_use() && !pth_rwlock_release (&NAME)) abort () (pth_in_use () && !pth_rwlock_release (LOCK) ? errno : 0)
# define gl_rwlock_destroy(NAME) \ # define glthread_rwlock_destroy(LOCK) \
(void)(&NAME) ((void)(LOCK), 0)
/* --------------------- gl_recursive_lock_t datatype --------------------- */ /* --------------------- gl_recursive_lock_t datatype --------------------- */
@ -448,37 +457,25 @@ typedef pth_mutex_t gl_recursive_lock_t;
STORAGECLASS pth_mutex_t NAME = gl_recursive_lock_initializer; STORAGECLASS pth_mutex_t NAME = gl_recursive_lock_initializer;
# define gl_recursive_lock_initializer \ # define gl_recursive_lock_initializer \
PTH_MUTEX_INIT PTH_MUTEX_INIT
# define gl_recursive_lock_init(NAME) \ # define glthread_recursive_lock_init(LOCK) \
if (pth_in_use() && !pth_mutex_init (&NAME)) abort () (pth_in_use () && !pth_mutex_init (LOCK) ? errno : 0)
# define gl_recursive_lock_lock(NAME) \ # define glthread_recursive_lock_lock(LOCK) \
if (pth_in_use() && !pth_mutex_acquire (&NAME, 0, NULL)) abort () (pth_in_use () && !pth_mutex_acquire (LOCK, 0, NULL) ? errno : 0)
# define gl_recursive_lock_unlock(NAME) \ # define glthread_recursive_lock_unlock(LOCK) \
if (pth_in_use() && !pth_mutex_release (&NAME)) abort () (pth_in_use () && !pth_mutex_release (LOCK) ? errno : 0)
# define gl_recursive_lock_destroy(NAME) \ # define glthread_recursive_lock_destroy(LOCK) \
(void)(&NAME) ((void)(LOCK), 0)
/* -------------------------- gl_once_t datatype -------------------------- */ /* -------------------------- gl_once_t datatype -------------------------- */
typedef pth_once_t gl_once_t; typedef pth_once_t gl_once_t;
# define gl_once_define(STORAGECLASS, NAME) \ # define gl_once_define(STORAGECLASS, NAME) \
STORAGECLASS pth_once_t NAME = PTH_ONCE_INIT; STORAGECLASS pth_once_t NAME = PTH_ONCE_INIT;
# define gl_once(NAME, INITFUNCTION) \ # define glthread_once(ONCE_CONTROL, INITFUNCTION) \
do \ (pth_in_use () \
{ \ ? glthread_once_multithreaded (ONCE_CONTROL, INITFUNCTION) \
if (pth_in_use ()) \ : (glthread_once_singlethreaded (ONCE_CONTROL) ? (INITFUNCTION (), 0) : 0))
{ \ extern int glthread_once_multithreaded (pth_once_t *once_control, void (*initfunction) (void));
void (*gl_once_temp) (void) = INITFUNCTION; \
if (!pth_once (&NAME, glthread_once_call, &gl_once_temp)) \
abort (); \
} \
else \
{ \
if (glthread_once_singlethreaded (&NAME)) \
INITFUNCTION (); \
} \
} \
while (0)
extern void glthread_once_call (void *arg);
extern int glthread_once_singlethreaded (pth_once_t *once_control); extern int glthread_once_singlethreaded (pth_once_t *once_control);
# ifdef __cplusplus # ifdef __cplusplus
@ -495,7 +492,6 @@ extern int glthread_once_singlethreaded (pth_once_t *once_control);
# include <thread.h> # include <thread.h>
# include <synch.h> # include <synch.h>
# include <stdlib.h>
# ifdef __cplusplus # ifdef __cplusplus
extern "C" { extern "C" {
@ -534,14 +530,14 @@ typedef mutex_t gl_lock_t;
STORAGECLASS mutex_t NAME = gl_lock_initializer; STORAGECLASS mutex_t NAME = gl_lock_initializer;
# define gl_lock_initializer \ # define gl_lock_initializer \
DEFAULTMUTEX DEFAULTMUTEX
# define gl_lock_init(NAME) \ # define glthread_lock_init(LOCK) \
if (thread_in_use () && mutex_init (&NAME, USYNC_THREAD, NULL) != 0) abort () (thread_in_use () ? mutex_init (LOCK, USYNC_THREAD, NULL) : 0)
# define gl_lock_lock(NAME) \ # define glthread_lock_lock(LOCK) \
if (thread_in_use () && mutex_lock (&NAME) != 0) abort () (thread_in_use () ? mutex_lock (LOCK) : 0)
# define gl_lock_unlock(NAME) \ # define glthread_lock_unlock(LOCK) \
if (thread_in_use () && mutex_unlock (&NAME) != 0) abort () (thread_in_use () ? mutex_unlock (LOCK) : 0)
# define gl_lock_destroy(NAME) \ # define glthread_lock_destroy(LOCK) \
if (thread_in_use () && mutex_destroy (&NAME) != 0) abort () (thread_in_use () ? mutex_destroy (LOCK) : 0)
/* ------------------------- gl_rwlock_t datatype ------------------------- */ /* ------------------------- gl_rwlock_t datatype ------------------------- */
@ -552,16 +548,16 @@ typedef rwlock_t gl_rwlock_t;
STORAGECLASS rwlock_t NAME = gl_rwlock_initializer; STORAGECLASS rwlock_t NAME = gl_rwlock_initializer;
# define gl_rwlock_initializer \ # define gl_rwlock_initializer \
DEFAULTRWLOCK DEFAULTRWLOCK
# define gl_rwlock_init(NAME) \ # define glthread_rwlock_init(LOCK) \
if (thread_in_use () && rwlock_init (&NAME, USYNC_THREAD, NULL) != 0) abort () (thread_in_use () ? rwlock_init (LOCK, USYNC_THREAD, NULL) : 0)
# define gl_rwlock_rdlock(NAME) \ # define glthread_rwlock_rdlock(LOCK) \
if (thread_in_use () && rw_rdlock (&NAME) != 0) abort () (thread_in_use () ? rw_rdlock (LOCK) : 0)
# define gl_rwlock_wrlock(NAME) \ # define glthread_rwlock_wrlock(LOCK) \
if (thread_in_use () && rw_wrlock (&NAME) != 0) abort () (thread_in_use () ? rw_wrlock (LOCK) : 0)
# define gl_rwlock_unlock(NAME) \ # define glthread_rwlock_unlock(LOCK) \
if (thread_in_use () && rw_unlock (&NAME) != 0) abort () (thread_in_use () ? rw_unlock (LOCK) : 0)
# define gl_rwlock_destroy(NAME) \ # define glthread_rwlock_destroy(LOCK) \
if (thread_in_use () && rwlock_destroy (&NAME) != 0) abort () (thread_in_use () ? rwlock_destroy (LOCK) : 0)
/* --------------------- gl_recursive_lock_t datatype --------------------- */ /* --------------------- gl_recursive_lock_t datatype --------------------- */
@ -581,18 +577,18 @@ typedef struct
STORAGECLASS gl_recursive_lock_t NAME = gl_recursive_lock_initializer; STORAGECLASS gl_recursive_lock_t NAME = gl_recursive_lock_initializer;
# define gl_recursive_lock_initializer \ # define gl_recursive_lock_initializer \
{ DEFAULTMUTEX, (thread_t) 0, 0 } { DEFAULTMUTEX, (thread_t) 0, 0 }
# define gl_recursive_lock_init(NAME) \ # define glthread_recursive_lock_init(LOCK) \
if (thread_in_use ()) glthread_recursive_lock_init (&NAME) (thread_in_use () ? glthread_recursive_lock_init_multithreaded (LOCK) : 0)
# define gl_recursive_lock_lock(NAME) \ # define glthread_recursive_lock_lock(LOCK) \
if (thread_in_use ()) glthread_recursive_lock_lock (&NAME) (thread_in_use () ? glthread_recursive_lock_lock_multithreaded (LOCK) : 0)
# define gl_recursive_lock_unlock(NAME) \ # define glthread_recursive_lock_unlock(LOCK) \
if (thread_in_use ()) glthread_recursive_lock_unlock (&NAME) (thread_in_use () ? glthread_recursive_lock_unlock_multithreaded (LOCK) : 0)
# define gl_recursive_lock_destroy(NAME) \ # define glthread_recursive_lock_destroy(LOCK) \
if (thread_in_use ()) glthread_recursive_lock_destroy (&NAME) (thread_in_use () ? glthread_recursive_lock_destroy_multithreaded (LOCK) : 0)
extern void glthread_recursive_lock_init (gl_recursive_lock_t *lock); extern int glthread_recursive_lock_init_multithreaded (gl_recursive_lock_t *lock);
extern void glthread_recursive_lock_lock (gl_recursive_lock_t *lock); extern int glthread_recursive_lock_lock_multithreaded (gl_recursive_lock_t *lock);
extern void glthread_recursive_lock_unlock (gl_recursive_lock_t *lock); extern int glthread_recursive_lock_unlock_multithreaded (gl_recursive_lock_t *lock);
extern void glthread_recursive_lock_destroy (gl_recursive_lock_t *lock); extern int glthread_recursive_lock_destroy_multithreaded (gl_recursive_lock_t *lock);
/* -------------------------- gl_once_t datatype -------------------------- */ /* -------------------------- gl_once_t datatype -------------------------- */
@ -604,21 +600,11 @@ typedef struct
gl_once_t; gl_once_t;
# define gl_once_define(STORAGECLASS, NAME) \ # define gl_once_define(STORAGECLASS, NAME) \
STORAGECLASS gl_once_t NAME = { 0, DEFAULTMUTEX }; STORAGECLASS gl_once_t NAME = { 0, DEFAULTMUTEX };
# define gl_once(NAME, INITFUNCTION) \ # define glthread_once(ONCE_CONTROL, INITFUNCTION) \
do \ (thread_in_use () \
{ \ ? glthread_once_multithreaded (ONCE_CONTROL, INITFUNCTION) \
if (thread_in_use ()) \ : (glthread_once_singlethreaded (ONCE_CONTROL) ? (INITFUNCTION (), 0) : 0))
{ \ extern int glthread_once_multithreaded (gl_once_t *once_control, void (*initfunction) (void));
glthread_once (&NAME, INITFUNCTION); \
} \
else \
{ \
if (glthread_once_singlethreaded (&NAME)) \
INITFUNCTION (); \
} \
} \
while (0)
extern void glthread_once (gl_once_t *once_control, void (*initfunction) (void));
extern int glthread_once_singlethreaded (gl_once_t *once_control); extern int glthread_once_singlethreaded (gl_once_t *once_control);
# ifdef __cplusplus # ifdef __cplusplus
@ -664,18 +650,18 @@ typedef struct
STORAGECLASS gl_lock_t NAME = gl_lock_initializer; STORAGECLASS gl_lock_t NAME = gl_lock_initializer;
# define gl_lock_initializer \ # define gl_lock_initializer \
{ { 0, -1 } } { { 0, -1 } }
# define gl_lock_init(NAME) \ # define glthread_lock_init(LOCK) \
glthread_lock_init (&NAME) (glthread_lock_init_func (LOCK), 0)
# define gl_lock_lock(NAME) \ # define glthread_lock_lock(LOCK) \
glthread_lock_lock (&NAME) glthread_lock_lock_func (LOCK)
# define gl_lock_unlock(NAME) \ # define glthread_lock_unlock(LOCK) \
glthread_lock_unlock (&NAME) glthread_lock_unlock_func (LOCK)
# define gl_lock_destroy(NAME) \ # define glthread_lock_destroy(LOCK) \
glthread_lock_destroy (&NAME) glthread_lock_destroy_func (LOCK)
extern void glthread_lock_init (gl_lock_t *lock); extern void glthread_lock_init_func (gl_lock_t *lock);
extern void glthread_lock_lock (gl_lock_t *lock); extern int glthread_lock_lock_func (gl_lock_t *lock);
extern void glthread_lock_unlock (gl_lock_t *lock); extern int glthread_lock_unlock_func (gl_lock_t *lock);
extern void glthread_lock_destroy (gl_lock_t *lock); extern int glthread_lock_destroy_func (gl_lock_t *lock);
/* ------------------------- gl_rwlock_t datatype ------------------------- */ /* ------------------------- gl_rwlock_t datatype ------------------------- */
@ -690,13 +676,13 @@ typedef struct
unsigned int alloc; /* length of allocated array */ unsigned int alloc; /* length of allocated array */
unsigned int offset; /* index of first waiting thread in array */ unsigned int offset; /* index of first waiting thread in array */
} }
gl_waitqueue_t; gl_carray_waitqueue_t;
typedef struct typedef struct
{ {
gl_spinlock_t guard; /* protects the initialization */ gl_spinlock_t guard; /* protects the initialization */
CRITICAL_SECTION lock; /* protects the remaining fields */ CRITICAL_SECTION lock; /* protects the remaining fields */
gl_waitqueue_t waiting_readers; /* waiting readers */ gl_carray_waitqueue_t waiting_readers; /* waiting readers */
gl_waitqueue_t waiting_writers; /* waiting writers */ gl_carray_waitqueue_t waiting_writers; /* waiting writers */
int runcount; /* number of readers running, or -1 when a writer runs */ int runcount; /* number of readers running, or -1 when a writer runs */
} }
gl_rwlock_t; gl_rwlock_t;
@ -706,21 +692,21 @@ typedef struct
STORAGECLASS gl_rwlock_t NAME = gl_rwlock_initializer; STORAGECLASS gl_rwlock_t NAME = gl_rwlock_initializer;
# define gl_rwlock_initializer \ # define gl_rwlock_initializer \
{ { 0, -1 } } { { 0, -1 } }
# define gl_rwlock_init(NAME) \ # define glthread_rwlock_init(LOCK) \
glthread_rwlock_init (&NAME) (glthread_rwlock_init_func (LOCK), 0)
# define gl_rwlock_rdlock(NAME) \ # define glthread_rwlock_rdlock(LOCK) \
glthread_rwlock_rdlock (&NAME) glthread_rwlock_rdlock_func (LOCK)
# define gl_rwlock_wrlock(NAME) \ # define glthread_rwlock_wrlock(LOCK) \
glthread_rwlock_wrlock (&NAME) glthread_rwlock_wrlock_func (LOCK)
# define gl_rwlock_unlock(NAME) \ # define glthread_rwlock_unlock(LOCK) \
glthread_rwlock_unlock (&NAME) glthread_rwlock_unlock_func (LOCK)
# define gl_rwlock_destroy(NAME) \ # define glthread_rwlock_destroy(LOCK) \
glthread_rwlock_destroy (&NAME) glthread_rwlock_destroy_func (LOCK)
extern void glthread_rwlock_init (gl_rwlock_t *lock); extern void glthread_rwlock_init_func (gl_rwlock_t *lock);
extern void glthread_rwlock_rdlock (gl_rwlock_t *lock); extern int glthread_rwlock_rdlock_func (gl_rwlock_t *lock);
extern void glthread_rwlock_wrlock (gl_rwlock_t *lock); extern int glthread_rwlock_wrlock_func (gl_rwlock_t *lock);
extern void glthread_rwlock_unlock (gl_rwlock_t *lock); extern int glthread_rwlock_unlock_func (gl_rwlock_t *lock);
extern void glthread_rwlock_destroy (gl_rwlock_t *lock); extern int glthread_rwlock_destroy_func (gl_rwlock_t *lock);
/* --------------------- gl_recursive_lock_t datatype --------------------- */ /* --------------------- gl_recursive_lock_t datatype --------------------- */
@ -742,18 +728,18 @@ typedef struct
STORAGECLASS gl_recursive_lock_t NAME = gl_recursive_lock_initializer; STORAGECLASS gl_recursive_lock_t NAME = gl_recursive_lock_initializer;
# define gl_recursive_lock_initializer \ # define gl_recursive_lock_initializer \
{ { 0, -1 }, 0, 0 } { { 0, -1 }, 0, 0 }
# define gl_recursive_lock_init(NAME) \ # define glthread_recursive_lock_init(LOCK) \
glthread_recursive_lock_init (&NAME) (glthread_recursive_lock_init_func (LOCK), 0)
# define gl_recursive_lock_lock(NAME) \ # define glthread_recursive_lock_lock(LOCK) \
glthread_recursive_lock_lock (&NAME) glthread_recursive_lock_lock_func (LOCK)
# define gl_recursive_lock_unlock(NAME) \ # define glthread_recursive_lock_unlock(LOCK) \
glthread_recursive_lock_unlock (&NAME) glthread_recursive_lock_unlock_func (LOCK)
# define gl_recursive_lock_destroy(NAME) \ # define glthread_recursive_lock_destroy(LOCK) \
glthread_recursive_lock_destroy (&NAME) glthread_recursive_lock_destroy_func (LOCK)
extern void glthread_recursive_lock_init (gl_recursive_lock_t *lock); extern void glthread_recursive_lock_init_func (gl_recursive_lock_t *lock);
extern void glthread_recursive_lock_lock (gl_recursive_lock_t *lock); extern int glthread_recursive_lock_lock_func (gl_recursive_lock_t *lock);
extern void glthread_recursive_lock_unlock (gl_recursive_lock_t *lock); extern int glthread_recursive_lock_unlock_func (gl_recursive_lock_t *lock);
extern void glthread_recursive_lock_destroy (gl_recursive_lock_t *lock); extern int glthread_recursive_lock_destroy_func (gl_recursive_lock_t *lock);
/* -------------------------- gl_once_t datatype -------------------------- */ /* -------------------------- gl_once_t datatype -------------------------- */
@ -766,9 +752,9 @@ typedef struct
gl_once_t; gl_once_t;
# define gl_once_define(STORAGECLASS, NAME) \ # define gl_once_define(STORAGECLASS, NAME) \
STORAGECLASS gl_once_t NAME = { -1, -1 }; STORAGECLASS gl_once_t NAME = { -1, -1 };
# define gl_once(NAME, INITFUNCTION) \ # define glthread_once(ONCE_CONTROL, INITFUNCTION) \
glthread_once (&NAME, INITFUNCTION) (glthread_once_func (ONCE_CONTROL, INITFUNCTION), 0)
extern void glthread_once (gl_once_t *once_control, void (*initfunction) (void)); extern void glthread_once_func (gl_once_t *once_control, void (*initfunction) (void));
# ifdef __cplusplus # ifdef __cplusplus
} }
@ -787,47 +773,156 @@ extern void glthread_once (gl_once_t *once_control, void (*initfunction) (void))
typedef int gl_lock_t; typedef int gl_lock_t;
# define gl_lock_define(STORAGECLASS, NAME) # define gl_lock_define(STORAGECLASS, NAME)
# define gl_lock_define_initialized(STORAGECLASS, NAME) # define gl_lock_define_initialized(STORAGECLASS, NAME)
# define gl_lock_init(NAME) # define glthread_lock_init(NAME) 0
# define gl_lock_lock(NAME) # define glthread_lock_lock(NAME) 0
# define gl_lock_unlock(NAME) # define glthread_lock_unlock(NAME) 0
# define glthread_lock_destroy(NAME) 0
/* ------------------------- gl_rwlock_t datatype ------------------------- */ /* ------------------------- gl_rwlock_t datatype ------------------------- */
typedef int gl_rwlock_t; typedef int gl_rwlock_t;
# define gl_rwlock_define(STORAGECLASS, NAME) # define gl_rwlock_define(STORAGECLASS, NAME)
# define gl_rwlock_define_initialized(STORAGECLASS, NAME) # define gl_rwlock_define_initialized(STORAGECLASS, NAME)
# define gl_rwlock_init(NAME) # define glthread_rwlock_init(NAME) 0
# define gl_rwlock_rdlock(NAME) # define glthread_rwlock_rdlock(NAME) 0
# define gl_rwlock_wrlock(NAME) # define glthread_rwlock_wrlock(NAME) 0
# define gl_rwlock_unlock(NAME) # define glthread_rwlock_unlock(NAME) 0
# define glthread_rwlock_destroy(NAME) 0
/* --------------------- gl_recursive_lock_t datatype --------------------- */ /* --------------------- gl_recursive_lock_t datatype --------------------- */
typedef int gl_recursive_lock_t; typedef int gl_recursive_lock_t;
# define gl_recursive_lock_define(STORAGECLASS, NAME) # define gl_recursive_lock_define(STORAGECLASS, NAME)
# define gl_recursive_lock_define_initialized(STORAGECLASS, NAME) # define gl_recursive_lock_define_initialized(STORAGECLASS, NAME)
# define gl_recursive_lock_init(NAME) # define glthread_recursive_lock_init(NAME) 0
# define gl_recursive_lock_lock(NAME) # define glthread_recursive_lock_lock(NAME) 0
# define gl_recursive_lock_unlock(NAME) # define glthread_recursive_lock_unlock(NAME) 0
# define glthread_recursive_lock_destroy(NAME) 0
/* -------------------------- gl_once_t datatype -------------------------- */ /* -------------------------- gl_once_t datatype -------------------------- */
typedef int gl_once_t; typedef int gl_once_t;
# define gl_once_define(STORAGECLASS, NAME) \ # define gl_once_define(STORAGECLASS, NAME) \
STORAGECLASS gl_once_t NAME = 0; STORAGECLASS gl_once_t NAME = 0;
# define gl_once(NAME, INITFUNCTION) \ # define glthread_once(ONCE_CONTROL, INITFUNCTION) \
do \ (*(ONCE_CONTROL) == 0 ? (*(ONCE_CONTROL) = ~ 0, INITFUNCTION (), 0) : 0)
{ \
if (NAME == 0) \
{ \
NAME = ~ 0; \
INITFUNCTION (); \
} \
} \
while (0)
#endif #endif
/* ========================================================================= */ /* ========================================================================= */
/* Macros with built-in error handling. */
/* -------------------------- gl_lock_t datatype -------------------------- */
#define gl_lock_init(NAME) \
do \
{ \
if (glthread_lock_init (&NAME)) \
abort (); \
} \
while (0)
#define gl_lock_lock(NAME) \
do \
{ \
if (glthread_lock_lock (&NAME)) \
abort (); \
} \
while (0)
#define gl_lock_unlock(NAME) \
do \
{ \
if (glthread_lock_unlock (&NAME)) \
abort (); \
} \
while (0)
#define gl_lock_destroy(NAME) \
do \
{ \
if (glthread_lock_destroy (&NAME)) \
abort (); \
} \
while (0)
/* ------------------------- gl_rwlock_t datatype ------------------------- */
#define gl_rwlock_init(NAME) \
do \
{ \
if (glthread_rwlock_init (&NAME)) \
abort (); \
} \
while (0)
#define gl_rwlock_rdlock(NAME) \
do \
{ \
if (glthread_rwlock_rdlock (&NAME)) \
abort (); \
} \
while (0)
#define gl_rwlock_wrlock(NAME) \
do \
{ \
if (glthread_rwlock_wrlock (&NAME)) \
abort (); \
} \
while (0)
#define gl_rwlock_unlock(NAME) \
do \
{ \
if (glthread_rwlock_unlock (&NAME)) \
abort (); \
} \
while (0)
#define gl_rwlock_destroy(NAME) \
do \
{ \
if (glthread_rwlock_destroy (&NAME)) \
abort (); \
} \
while (0)
/* --------------------- gl_recursive_lock_t datatype --------------------- */
#define gl_recursive_lock_init(NAME) \
do \
{ \
if (glthread_recursive_lock_init (&NAME)) \
abort (); \
} \
while (0)
#define gl_recursive_lock_lock(NAME) \
do \
{ \
if (glthread_recursive_lock_lock (&NAME)) \
abort (); \
} \
while (0)
#define gl_recursive_lock_unlock(NAME) \
do \
{ \
if (glthread_recursive_lock_unlock (&NAME)) \
abort (); \
} \
while (0)
#define gl_recursive_lock_destroy(NAME) \
do \
{ \
if (glthread_recursive_lock_destroy (&NAME)) \
abort (); \
} \
while (0)
/* -------------------------- gl_once_t datatype -------------------------- */
#define gl_once(NAME, INITFUNCTION) \
do \
{ \
if (glthread_once (&NAME, INITFUNCTION)) \
abort (); \
} \
while (0)
/* ========================================================================= */
#endif /* _LOCK_H */ #endif /* _LOCK_H */

View File

@ -1,5 +1,5 @@
/* Log file output. /* Log file output.
Copyright (C) 2003, 2005 Free Software Foundation, Inc. Copyright (C) 2003, 2005, 2009 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify it 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 under the terms of the GNU Library General Public License as published
@ -33,24 +33,27 @@
# include "lock.h" # include "lock.h"
#endif #endif
/* Separator between msgctxt and msgid in .mo files. */
#define MSGCTXT_SEPARATOR '\004' /* EOT */
/* Print an ASCII string with quotes and escape sequences where needed. */ /* Print an ASCII string with quotes and escape sequences where needed. */
static void static void
print_escaped (FILE *stream, const char *str) print_escaped (FILE *stream, const char *str, const char *str_end)
{ {
putc ('"', stream); putc ('"', stream);
for (; *str != '\0'; str++) for (; str != str_end; str++)
if (*str == '\n') if (*str == '\n')
{ {
fputs ("\\n\"", stream); fputs ("\\n\"", stream);
if (str[1] == '\0') if (str + 1 == str_end)
return; return;
fputs ("\n\"", stream); fputs ("\n\"", stream);
} }
else else
{ {
if (*str == '"' || *str == '\\') if (*str == '"' || *str == '\\')
putc ('\\', stream); putc ('\\', stream);
putc (*str, stream); putc (*str, stream);
} }
putc ('"', stream); putc ('"', stream);
} }
@ -61,43 +64,52 @@ __libc_lock_define_initialized (static, lock)
static inline void static inline void
_nl_log_untranslated_locked (const char *logfilename, const char *domainname, _nl_log_untranslated_locked (const char *logfilename, const char *domainname,
const char *msgid1, const char *msgid2, int plural) const char *msgid1, const char *msgid2, int plural)
{ {
FILE *logfile; FILE *logfile;
const char *separator;
/* Can we reuse the last opened logfile? */ /* Can we reuse the last opened logfile? */
if (last_logfilename == NULL || strcmp (logfilename, last_logfilename) != 0) if (last_logfilename == NULL || strcmp (logfilename, last_logfilename) != 0)
{ {
/* Close the last used logfile. */ /* Close the last used logfile. */
if (last_logfilename != NULL) if (last_logfilename != NULL)
{ {
if (last_logfile != NULL) if (last_logfile != NULL)
{ {
fclose (last_logfile); fclose (last_logfile);
last_logfile = NULL; last_logfile = NULL;
} }
free (last_logfilename); free (last_logfilename);
last_logfilename = NULL; last_logfilename = NULL;
} }
/* Open the logfile. */ /* Open the logfile. */
last_logfilename = (char *) malloc (strlen (logfilename) + 1); last_logfilename = (char *) malloc (strlen (logfilename) + 1);
if (last_logfilename == NULL) if (last_logfilename == NULL)
return; return;
strcpy (last_logfilename, logfilename); strcpy (last_logfilename, logfilename);
last_logfile = fopen (logfilename, "a"); last_logfile = fopen (logfilename, "a");
if (last_logfile == NULL) if (last_logfile == NULL)
return; return;
} }
logfile = last_logfile; logfile = last_logfile;
fprintf (logfile, "domain "); fprintf (logfile, "domain ");
print_escaped (logfile, domainname); print_escaped (logfile, domainname, domainname + strlen (domainname));
separator = strchr (msgid1, MSGCTXT_SEPARATOR);
if (separator != NULL)
{
/* The part before the MSGCTXT_SEPARATOR is the msgctxt. */
fprintf (logfile, "\nmsgctxt ");
print_escaped (logfile, msgid1, separator);
msgid1 = separator + 1;
}
fprintf (logfile, "\nmsgid "); fprintf (logfile, "\nmsgid ");
print_escaped (logfile, msgid1); print_escaped (logfile, msgid1, msgid1 + strlen (msgid1));
if (plural) if (plural)
{ {
fprintf (logfile, "\nmsgid_plural "); fprintf (logfile, "\nmsgid_plural ");
print_escaped (logfile, msgid2); print_escaped (logfile, msgid2, msgid2 + strlen (msgid2));
fprintf (logfile, "\nmsgstr[0] \"\"\n"); fprintf (logfile, "\nmsgstr[0] \"\"\n");
} }
else else
@ -108,7 +120,7 @@ _nl_log_untranslated_locked (const char *logfilename, const char *domainname,
/* Add to the log file an entry denoting a failed translation. */ /* Add to the log file an entry denoting a failed translation. */
void void
_nl_log_untranslated (const char *logfilename, const char *domainname, _nl_log_untranslated (const char *logfilename, const char *domainname,
const char *msgid1, const char *msgid2, int plural) const char *msgid1, const char *msgid2, int plural)
{ {
__libc_lock_lock (lock); __libc_lock_lock (lock);
_nl_log_untranslated_locked (logfilename, domainname, msgid1, msgid2, plural); _nl_log_untranslated_locked (logfilename, domainname, msgid1, msgid2, plural);

View File

@ -21,15 +21,15 @@
#ifndef OS2_AWARE #ifndef OS2_AWARE
#undef LIBDIR #undef LIBDIR
#define LIBDIR _nlos2_libdir #define LIBDIR _nlos2_libdir
extern char *_nlos2_libdir; extern char *_nlos2_libdir;
#undef LOCALEDIR #undef LOCALEDIR
#define LOCALEDIR _nlos2_localedir #define LOCALEDIR _nlos2_localedir
extern char *_nlos2_localedir; extern char *_nlos2_localedir;
#undef LOCALE_ALIAS_PATH #undef LOCALE_ALIAS_PATH
#define LOCALE_ALIAS_PATH _nlos2_localealiaspath #define LOCALE_ALIAS_PATH _nlos2_localealiaspath
extern char *_nlos2_localealiaspath; extern char *_nlos2_localealiaspath;
#endif #endif

View File

@ -1,5 +1,5 @@
/* Expression parsing for plural form selection. /* Expression parsing for plural form selection.
Copyright (C) 2000-2001, 2003, 2005 Free Software Foundation, Inc. Copyright (C) 2000-2001, 2003, 2005-2007 Free Software Foundation, Inc.
Written by Ulrich Drepper <drepper@cygnus.com>, 2000. Written by Ulrich Drepper <drepper@cygnus.com>, 2000.
This program is free software; you can redistribute it and/or modify it This program is free software; you can redistribute it and/or modify it
@ -27,7 +27,7 @@
#include "plural-exp.h" #include "plural-exp.h"
#if (defined __GNUC__ && !(__APPLE_CC__ > 1)) \ #if (defined __GNUC__ && !(__APPLE_CC__ > 1) && !defined __cplusplus) \
|| (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L)
/* These structs are the constant expression for the germanic plural /* These structs are the constant expression for the germanic plural
@ -96,7 +96,8 @@ init_germanic_plural ()
void void
internal_function internal_function
EXTRACT_PLURAL_EXPRESSION (const char *nullentry, struct expression **pluralp, EXTRACT_PLURAL_EXPRESSION (const char *nullentry,
const struct expression **pluralp,
unsigned long int *npluralsp) unsigned long int *npluralsp)
{ {
if (nullentry != NULL) if (nullentry != NULL)

View File

@ -1,5 +1,5 @@
/* Expression parsing and evaluation for plural form selection. /* Expression parsing and evaluation for plural form selection.
Copyright (C) 2000-2003, 2005 Free Software Foundation, Inc. Copyright (C) 2000-2003, 2005-2007 Free Software Foundation, Inc.
Written by Ulrich Drepper <drepper@cygnus.com>, 2000. Written by Ulrich Drepper <drepper@cygnus.com>, 2000.
This program is free software; you can redistribute it and/or modify it This program is free software; you can redistribute it and/or modify it
@ -28,36 +28,42 @@
# define attribute_hidden # define attribute_hidden
#endif #endif
#ifdef __cplusplus
extern "C" {
#endif
enum expression_operator
{
/* Without arguments: */
var, /* The variable "n". */
num, /* Decimal number. */
/* Unary operators: */
lnot, /* Logical NOT. */
/* Binary operators: */
mult, /* Multiplication. */
divide, /* Division. */
module, /* Modulo operation. */
plus, /* Addition. */
minus, /* Subtraction. */
less_than, /* Comparison. */
greater_than, /* Comparison. */
less_or_equal, /* Comparison. */
greater_or_equal, /* Comparison. */
equal, /* Comparison for equality. */
not_equal, /* Comparison for inequality. */
land, /* Logical AND. */
lor, /* Logical OR. */
/* Ternary operators: */
qmop /* Question mark operator. */
};
/* This is the representation of the expressions to determine the /* This is the representation of the expressions to determine the
plural form. */ plural form. */
struct expression struct expression
{ {
int nargs; /* Number of arguments. */ int nargs; /* Number of arguments. */
enum operator enum expression_operator operation;
{
/* Without arguments: */
var, /* The variable "n". */
num, /* Decimal number. */
/* Unary operators: */
lnot, /* Logical NOT. */
/* Binary operators: */
mult, /* Multiplication. */
divide, /* Division. */
module, /* Modulo operation. */
plus, /* Addition. */
minus, /* Subtraction. */
less_than, /* Comparison. */
greater_than, /* Comparison. */
less_or_equal, /* Comparison. */
greater_or_equal, /* Comparison. */
equal, /* Comparison for equality. */
not_equal, /* Comparison for inequality. */
land, /* Logical AND. */
lor, /* Logical OR. */
/* Ternary operators: */
qmop /* Question mark operator. */
} operation;
union union
{ {
unsigned long int num; /* Number value for `num'. */ unsigned long int num; /* Number value for `num'. */
@ -106,13 +112,18 @@ extern void FREE_EXPRESSION (struct expression *exp)
extern int PLURAL_PARSE (void *arg); extern int PLURAL_PARSE (void *arg);
extern struct expression GERMANIC_PLURAL attribute_hidden; extern struct expression GERMANIC_PLURAL attribute_hidden;
extern void EXTRACT_PLURAL_EXPRESSION (const char *nullentry, extern void EXTRACT_PLURAL_EXPRESSION (const char *nullentry,
struct expression **pluralp, const struct expression **pluralp,
unsigned long int *npluralsp) unsigned long int *npluralsp)
internal_function; internal_function;
#if !defined (_LIBC) && !defined (IN_LIBINTL) && !defined (IN_LIBGLOCALE) #if !defined (_LIBC) && !defined (IN_LIBINTL) && !defined (IN_LIBGLOCALE)
extern unsigned long int plural_eval (struct expression *pexp, extern unsigned long int plural_eval (const struct expression *pexp,
unsigned long int n); unsigned long int n);
#endif #endif
#ifdef __cplusplus
}
#endif
#endif /* _PLURAL_EXP_H */ #endif /* _PLURAL_EXP_H */

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
%{ %{
/* Expression parsing for plural form selection. /* Expression parsing for plural form selection.
Copyright (C) 2000-2001, 2003, 2005 Free Software Foundation, Inc. Copyright (C) 2000-2001, 2003, 2005-2006 Free Software Foundation, Inc.
Written by Ulrich Drepper <drepper@cygnus.com>, 2000. Written by Ulrich Drepper <drepper@cygnus.com>, 2000.
This program is free software; you can redistribute it and/or modify it This program is free software; you can redistribute it and/or modify it
@ -50,7 +50,7 @@
%union { %union {
unsigned long int num; unsigned long int num;
enum operator op; enum expression_operator op;
struct expression *exp; struct expression *exp;
} }
@ -62,7 +62,8 @@ static void yyerror (const char *str);
/* Allocation of expressions. */ /* Allocation of expressions. */
static struct expression * static struct expression *
new_exp (int nargs, enum operator op, struct expression * const *args) new_exp (int nargs, enum expression_operator op,
struct expression * const *args)
{ {
int i; int i;
struct expression *newp; struct expression *newp;
@ -91,13 +92,13 @@ new_exp (int nargs, enum operator op, struct expression * const *args)
} }
static inline struct expression * static inline struct expression *
new_exp_0 (enum operator op) new_exp_0 (enum expression_operator op)
{ {
return new_exp (0, op, NULL); return new_exp (0, op, NULL);
} }
static inline struct expression * static inline struct expression *
new_exp_1 (enum operator op, struct expression *right) new_exp_1 (enum expression_operator op, struct expression *right)
{ {
struct expression *args[1]; struct expression *args[1];
@ -106,7 +107,8 @@ new_exp_1 (enum operator op, struct expression *right)
} }
static struct expression * static struct expression *
new_exp_2 (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]; struct expression *args[2];
@ -116,7 +118,7 @@ new_exp_2 (enum operator op, struct expression *left, struct expression *right)
} }
static inline struct expression * static inline struct expression *
new_exp_3 (enum operator op, struct expression *bexp, new_exp_3 (enum expression_operator op, struct expression *bexp,
struct expression *tbranch, struct expression *fbranch) struct expression *tbranch, struct expression *fbranch)
{ {
struct expression *args[3]; struct expression *args[3];

View File

@ -1,5 +1,5 @@
/* Decomposed printf argument list. /* Decomposed printf argument list.
Copyright (C) 1999, 2002-2003, 2005-2006 Free Software Foundation, Inc. Copyright (C) 1999, 2002-2003, 2005-2007 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify it 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 under the terms of the GNU Library General Public License as published
@ -16,16 +16,25 @@
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
USA. */ USA. */
#include <config.h> /* This file can be parametrized with the following macros:
ENABLE_UNISTDIO Set to 1 to enable the unistdio extensions.
PRINTF_FETCHARGS Name of the function to be defined.
STATIC Set to 'static' to declare the function static. */
#ifndef PRINTF_FETCHARGS
# include <config.h>
#endif
/* Specification. */ /* Specification. */
#include "printf-args.h" #ifndef PRINTF_FETCHARGS
# include "printf-args.h"
#endif
#ifdef STATIC #ifdef STATIC
STATIC STATIC
#endif #endif
int int
printf_fetchargs (va_list args, arguments *a) PRINTF_FETCHARGS (va_list args, arguments *a)
{ {
size_t i; size_t i;
argument *ap; argument *ap;
@ -34,109 +43,146 @@ printf_fetchargs (va_list args, arguments *a)
switch (ap->type) switch (ap->type)
{ {
case TYPE_SCHAR: case TYPE_SCHAR:
ap->a.a_schar = va_arg (args, /*signed char*/ int); ap->a.a_schar = va_arg (args, /*signed char*/ int);
break; break;
case TYPE_UCHAR: case TYPE_UCHAR:
ap->a.a_uchar = va_arg (args, /*unsigned char*/ int); ap->a.a_uchar = va_arg (args, /*unsigned char*/ int);
break; break;
case TYPE_SHORT: case TYPE_SHORT:
ap->a.a_short = va_arg (args, /*short*/ int); ap->a.a_short = va_arg (args, /*short*/ int);
break; break;
case TYPE_USHORT: case TYPE_USHORT:
ap->a.a_ushort = va_arg (args, /*unsigned short*/ int); ap->a.a_ushort = va_arg (args, /*unsigned short*/ int);
break; break;
case TYPE_INT: case TYPE_INT:
ap->a.a_int = va_arg (args, int); ap->a.a_int = va_arg (args, int);
break; break;
case TYPE_UINT: case TYPE_UINT:
ap->a.a_uint = va_arg (args, unsigned int); ap->a.a_uint = va_arg (args, unsigned int);
break; break;
case TYPE_LONGINT: case TYPE_LONGINT:
ap->a.a_longint = va_arg (args, long int); ap->a.a_longint = va_arg (args, long int);
break; break;
case TYPE_ULONGINT: case TYPE_ULONGINT:
ap->a.a_ulongint = va_arg (args, unsigned long int); ap->a.a_ulongint = va_arg (args, unsigned long int);
break; break;
#ifdef HAVE_LONG_LONG_INT #if HAVE_LONG_LONG_INT
case TYPE_LONGLONGINT: case TYPE_LONGLONGINT:
ap->a.a_longlongint = va_arg (args, long long int); ap->a.a_longlongint = va_arg (args, long long int);
break; break;
case TYPE_ULONGLONGINT: case TYPE_ULONGLONGINT:
ap->a.a_ulonglongint = va_arg (args, unsigned long long int); ap->a.a_ulonglongint = va_arg (args, unsigned long long int);
break; break;
#endif #endif
case TYPE_DOUBLE: case TYPE_DOUBLE:
ap->a.a_double = va_arg (args, double); ap->a.a_double = va_arg (args, double);
break; break;
#ifdef HAVE_LONG_DOUBLE
case TYPE_LONGDOUBLE: case TYPE_LONGDOUBLE:
ap->a.a_longdouble = va_arg (args, long double); ap->a.a_longdouble = va_arg (args, long double);
break; break;
#endif
case TYPE_CHAR: case TYPE_CHAR:
ap->a.a_char = va_arg (args, int); ap->a.a_char = va_arg (args, int);
break; break;
#ifdef HAVE_WINT_T #if HAVE_WINT_T
case TYPE_WIDE_CHAR: case TYPE_WIDE_CHAR:
/* Although ISO C 99 7.24.1.(2) says that wint_t is "unchanged by /* Although ISO C 99 7.24.1.(2) says that wint_t is "unchanged by
default argument promotions", this is not the case in mingw32, default argument promotions", this is not the case in mingw32,
where wint_t is 'unsigned short'. */ where wint_t is 'unsigned short'. */
ap->a.a_wide_char = ap->a.a_wide_char =
(sizeof (wint_t) < sizeof (int) (sizeof (wint_t) < sizeof (int)
? va_arg (args, int) ? va_arg (args, int)
: va_arg (args, wint_t)); : va_arg (args, wint_t));
break; break;
#endif #endif
case TYPE_STRING: case TYPE_STRING:
ap->a.a_string = va_arg (args, const char *); ap->a.a_string = va_arg (args, const char *);
/* A null pointer is an invalid argument for "%s", but in practice /* A null pointer is an invalid argument for "%s", but in practice
it occurs quite frequently in printf statements that produce it occurs quite frequently in printf statements that produce
debug output. Use a fallback in this case. */ debug output. Use a fallback in this case. */
if (ap->a.a_string == NULL) if (ap->a.a_string == NULL)
ap->a.a_string = "(NULL)"; ap->a.a_string = "(NULL)";
break; break;
#ifdef HAVE_WCHAR_T #if HAVE_WCHAR_T
case TYPE_WIDE_STRING: case TYPE_WIDE_STRING:
ap->a.a_wide_string = va_arg (args, const wchar_t *); ap->a.a_wide_string = va_arg (args, const wchar_t *);
/* A null pointer is an invalid argument for "%ls", but in practice /* A null pointer is an invalid argument for "%ls", but in practice
it occurs quite frequently in printf statements that produce it occurs quite frequently in printf statements that produce
debug output. Use a fallback in this case. */ debug output. Use a fallback in this case. */
if (ap->a.a_wide_string == NULL) if (ap->a.a_wide_string == NULL)
{ {
static const wchar_t wide_null_string[] = static const wchar_t wide_null_string[] =
{ {
(wchar_t)'(', (wchar_t)'(',
(wchar_t)'N', (wchar_t)'U', (wchar_t)'L', (wchar_t)'L', (wchar_t)'N', (wchar_t)'U', (wchar_t)'L', (wchar_t)'L',
(wchar_t)')', (wchar_t)')',
(wchar_t)0 (wchar_t)0
}; };
ap->a.a_wide_string = wide_null_string; ap->a.a_wide_string = wide_null_string;
} }
break; break;
#endif #endif
case TYPE_POINTER: case TYPE_POINTER:
ap->a.a_pointer = va_arg (args, void *); ap->a.a_pointer = va_arg (args, void *);
break; break;
case TYPE_COUNT_SCHAR_POINTER: case TYPE_COUNT_SCHAR_POINTER:
ap->a.a_count_schar_pointer = va_arg (args, signed char *); ap->a.a_count_schar_pointer = va_arg (args, signed char *);
break; break;
case TYPE_COUNT_SHORT_POINTER: case TYPE_COUNT_SHORT_POINTER:
ap->a.a_count_short_pointer = va_arg (args, short *); ap->a.a_count_short_pointer = va_arg (args, short *);
break; break;
case TYPE_COUNT_INT_POINTER: case TYPE_COUNT_INT_POINTER:
ap->a.a_count_int_pointer = va_arg (args, int *); ap->a.a_count_int_pointer = va_arg (args, int *);
break; break;
case TYPE_COUNT_LONGINT_POINTER: case TYPE_COUNT_LONGINT_POINTER:
ap->a.a_count_longint_pointer = va_arg (args, long int *); ap->a.a_count_longint_pointer = va_arg (args, long int *);
break; break;
#ifdef HAVE_LONG_LONG_INT #if HAVE_LONG_LONG_INT
case TYPE_COUNT_LONGLONGINT_POINTER: case TYPE_COUNT_LONGLONGINT_POINTER:
ap->a.a_count_longlongint_pointer = va_arg (args, long long int *); ap->a.a_count_longlongint_pointer = va_arg (args, long long int *);
break; break;
#endif
#if ENABLE_UNISTDIO
/* The unistdio extensions. */
case TYPE_U8_STRING:
ap->a.a_u8_string = va_arg (args, const uint8_t *);
/* A null pointer is an invalid argument for "%U", but in practice
it occurs quite frequently in printf statements that produce
debug output. Use a fallback in this case. */
if (ap->a.a_u8_string == NULL)
{
static const uint8_t u8_null_string[] =
{ '(', 'N', 'U', 'L', 'L', ')', 0 };
ap->a.a_u8_string = u8_null_string;
}
break;
case TYPE_U16_STRING:
ap->a.a_u16_string = va_arg (args, const uint16_t *);
/* A null pointer is an invalid argument for "%lU", but in practice
it occurs quite frequently in printf statements that produce
debug output. Use a fallback in this case. */
if (ap->a.a_u16_string == NULL)
{
static const uint16_t u16_null_string[] =
{ '(', 'N', 'U', 'L', 'L', ')', 0 };
ap->a.a_u16_string = u16_null_string;
}
break;
case TYPE_U32_STRING:
ap->a.a_u32_string = va_arg (args, const uint32_t *);
/* A null pointer is an invalid argument for "%llU", but in practice
it occurs quite frequently in printf statements that produce
debug output. Use a fallback in this case. */
if (ap->a.a_u32_string == NULL)
{
static const uint32_t u32_null_string[] =
{ '(', 'N', 'U', 'L', 'L', ')', 0 };
ap->a.a_u32_string = u32_null_string;
}
break;
#endif #endif
default: default:
/* Unknown type. */ /* Unknown type. */
return -1; return -1;
} }
return 0; return 0;
} }

View File

@ -1,5 +1,5 @@
/* Decomposed printf argument list. /* Decomposed printf argument list.
Copyright (C) 1999, 2002-2003, 2006 Free Software Foundation, Inc. Copyright (C) 1999, 2002-2003, 2006-2007 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify it 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 under the terms of the GNU Library General Public License as published
@ -19,16 +19,26 @@
#ifndef _PRINTF_ARGS_H #ifndef _PRINTF_ARGS_H
#define _PRINTF_ARGS_H #define _PRINTF_ARGS_H
/* This file can be parametrized with the following macros:
ENABLE_UNISTDIO Set to 1 to enable the unistdio extensions.
PRINTF_FETCHARGS Name of the function to be declared.
STATIC Set to 'static' to declare the function static. */
/* Default parameters. */
#ifndef PRINTF_FETCHARGS
# define PRINTF_FETCHARGS printf_fetchargs
#endif
/* Get size_t. */ /* Get size_t. */
#include <stddef.h> #include <stddef.h>
/* Get wchar_t. */ /* Get wchar_t. */
#ifdef HAVE_WCHAR_T #if HAVE_WCHAR_T
# include <stddef.h> # include <stddef.h>
#endif #endif
/* Get wint_t. */ /* Get wint_t. */
#ifdef HAVE_WINT_T #if HAVE_WINT_T
# include <wchar.h> # include <wchar.h>
#endif #endif
@ -48,20 +58,18 @@ typedef enum
TYPE_UINT, TYPE_UINT,
TYPE_LONGINT, TYPE_LONGINT,
TYPE_ULONGINT, TYPE_ULONGINT,
#ifdef HAVE_LONG_LONG_INT #if HAVE_LONG_LONG_INT
TYPE_LONGLONGINT, TYPE_LONGLONGINT,
TYPE_ULONGLONGINT, TYPE_ULONGLONGINT,
#endif #endif
TYPE_DOUBLE, TYPE_DOUBLE,
#ifdef HAVE_LONG_DOUBLE
TYPE_LONGDOUBLE, TYPE_LONGDOUBLE,
#endif
TYPE_CHAR, TYPE_CHAR,
#ifdef HAVE_WINT_T #if HAVE_WINT_T
TYPE_WIDE_CHAR, TYPE_WIDE_CHAR,
#endif #endif
TYPE_STRING, TYPE_STRING,
#ifdef HAVE_WCHAR_T #if HAVE_WCHAR_T
TYPE_WIDE_STRING, TYPE_WIDE_STRING,
#endif #endif
TYPE_POINTER, TYPE_POINTER,
@ -69,9 +77,15 @@ typedef enum
TYPE_COUNT_SHORT_POINTER, TYPE_COUNT_SHORT_POINTER,
TYPE_COUNT_INT_POINTER, TYPE_COUNT_INT_POINTER,
TYPE_COUNT_LONGINT_POINTER TYPE_COUNT_LONGINT_POINTER
#ifdef HAVE_LONG_LONG_INT #if HAVE_LONG_LONG_INT
, TYPE_COUNT_LONGLONGINT_POINTER , TYPE_COUNT_LONGLONGINT_POINTER
#endif #endif
#if ENABLE_UNISTDIO
/* The unistdio extensions. */
, TYPE_U8_STRING
, TYPE_U16_STRING
, TYPE_U32_STRING
#endif
} arg_type; } arg_type;
/* Polymorphic argument */ /* Polymorphic argument */
@ -80,38 +94,42 @@ typedef struct
arg_type type; arg_type type;
union union
{ {
signed char a_schar; signed char a_schar;
unsigned char a_uchar; unsigned char a_uchar;
short a_short; short a_short;
unsigned short a_ushort; unsigned short a_ushort;
int a_int; int a_int;
unsigned int a_uint; unsigned int a_uint;
long int a_longint; long int a_longint;
unsigned long int a_ulongint; unsigned long int a_ulongint;
#ifdef HAVE_LONG_LONG_INT #if HAVE_LONG_LONG_INT
long long int a_longlongint; long long int a_longlongint;
unsigned long long int a_ulonglongint; unsigned long long int a_ulonglongint;
#endif #endif
float a_float; float a_float;
double a_double; double a_double;
#ifdef HAVE_LONG_DOUBLE long double a_longdouble;
long double a_longdouble; int a_char;
#if HAVE_WINT_T
wint_t a_wide_char;
#endif #endif
int a_char; const char* a_string;
#ifdef HAVE_WINT_T #if HAVE_WCHAR_T
wint_t a_wide_char; const wchar_t* a_wide_string;
#endif #endif
const char* a_string; void* a_pointer;
#ifdef HAVE_WCHAR_T signed char * a_count_schar_pointer;
const wchar_t* a_wide_string; short * a_count_short_pointer;
int * a_count_int_pointer;
long int * a_count_longint_pointer;
#if HAVE_LONG_LONG_INT
long long int * a_count_longlongint_pointer;
#endif #endif
void* a_pointer; #if ENABLE_UNISTDIO
signed char * a_count_schar_pointer; /* The unistdio extensions. */
short * a_count_short_pointer; const uint8_t * a_u8_string;
int * a_count_int_pointer; const uint16_t * a_u16_string;
long int * a_count_longint_pointer; const uint32_t * a_u32_string;
#ifdef HAVE_LONG_LONG_INT
long long int * a_count_longlongint_pointer;
#endif #endif
} }
a; a;
@ -132,6 +150,6 @@ STATIC
#else #else
extern extern
#endif #endif
int printf_fetchargs (va_list args, arguments *a); int PRINTF_FETCHARGS (va_list args, arguments *a);
#endif /* _PRINTF_ARGS_H */ #endif /* _PRINTF_ARGS_H */

File diff suppressed because it is too large Load Diff

View File

@ -23,15 +23,15 @@
/* Flags */ /* Flags */
#define FLAG_GROUP 1 /* ' flag */ #define FLAG_GROUP 1 /* ' flag */
#define FLAG_LEFT 2 /* - flag */ #define FLAG_LEFT 2 /* - flag */
#define FLAG_SHOWSIGN 4 /* + flag */ #define FLAG_SHOWSIGN 4 /* + flag */
#define FLAG_SPACE 8 /* space flag */ #define FLAG_SPACE 8 /* space flag */
#define FLAG_ALT 16 /* # flag */ #define FLAG_ALT 16 /* # flag */
#define FLAG_ZERO 32 #define FLAG_ZERO 32
/* arg_index value indicating that no argument is consumed. */ /* arg_index value indicating that no argument is consumed. */
#define ARG_NONE (~(size_t)0) #define ARG_NONE (~(size_t)0)
/* A parsed directive. */ /* A parsed directive. */
typedef struct typedef struct

View File

@ -1,5 +1,5 @@
/* Formatted output to strings, using POSIX/XSI format strings with positions. /* Formatted output to strings, using POSIX/XSI format strings with positions.
Copyright (C) 2003, 2006 Free Software Foundation, Inc. Copyright (C) 2003, 2006-2007, 2009 Free Software Foundation, Inc.
Written by Bruno Haible <bruno@clisp.org>, 2003. Written by Bruno Haible <bruno@clisp.org>, 2003.
This program is free software; you can redistribute it and/or modify it This program is free software; you can redistribute it and/or modify it
@ -60,7 +60,9 @@ char *alloca ();
/* When building a DLL, we must export some functions. Note that because /* When building a DLL, we must export some functions. Note that because
the functions are only defined for binary backward compatibility, we the functions are only defined for binary backward compatibility, we
don't need to use __declspec(dllimport) in any case. */ don't need to use __declspec(dllimport) in any case. */
#if defined _MSC_VER && BUILDING_DLL #if HAVE_VISIBILITY && BUILDING_DLL
# define DLL_EXPORTED __attribute__((__visibility__("default")))
#elif defined _MSC_VER && BUILDING_DLL
# define DLL_EXPORTED __declspec(dllexport) # define DLL_EXPORTED __declspec(dllexport)
#else #else
# define DLL_EXPORTED # define DLL_EXPORTED
@ -69,7 +71,7 @@ char *alloca ();
#define STATIC static #define STATIC static
/* This needs to be consistent with libgnuintl.h.in. */ /* This needs to be consistent with libgnuintl.h.in. */
#if defined __NetBSD__ || defined __CYGWIN__ || defined __MINGW32__ #if defined __NetBSD__ || defined __BEOS__ || defined __CYGWIN__ || defined __MINGW32__
/* Don't break __attribute__((format(printf,M,N))). /* Don't break __attribute__((format(printf,M,N))).
This redefinition is only possible because the libc in NetBSD, Cygwin, This redefinition is only possible because the libc in NetBSD, Cygwin,
mingw does not have a function __printf__. */ mingw does not have a function __printf__. */
@ -102,17 +104,17 @@ libintl_vfprintf (FILE *stream, const char *format, va_list args)
char *result = libintl_vasnprintf (NULL, &length, format, args); char *result = libintl_vasnprintf (NULL, &length, format, args);
int retval = -1; int retval = -1;
if (result != NULL) if (result != NULL)
{ {
size_t written = fwrite (result, 1, length, stream); size_t written = fwrite (result, 1, length, stream);
free (result); free (result);
if (written == length) if (written == length)
{ {
if (length > INT_MAX) if (length > INT_MAX)
errno = EOVERFLOW; errno = EOVERFLOW;
else else
retval = length; retval = length;
} }
} }
return retval; return retval;
} }
} }
@ -161,17 +163,17 @@ libintl_vsprintf (char *resultbuf, const char *format, va_list args)
size_t length = (size_t) ~0 / (4 * sizeof (char)); size_t length = (size_t) ~0 / (4 * sizeof (char));
char *result = libintl_vasnprintf (resultbuf, &length, format, args); char *result = libintl_vasnprintf (resultbuf, &length, format, args);
if (result != resultbuf) if (result != resultbuf)
{ {
free (result); free (result);
return -1; return -1;
} }
if (length > INT_MAX) if (length > INT_MAX)
{ {
errno = EOVERFLOW; errno = EOVERFLOW;
return -1; return -1;
} }
else else
return length; return length;
} }
} }
@ -209,23 +211,23 @@ libintl_vsnprintf (char *resultbuf, size_t length, const char *format, va_list a
size_t maxlength = length; size_t maxlength = length;
char *result = libintl_vasnprintf (resultbuf, &length, format, args); char *result = libintl_vasnprintf (resultbuf, &length, format, args);
if (result != resultbuf) if (result != resultbuf)
{ {
if (maxlength > 0) if (maxlength > 0)
{ {
size_t pruned_length = size_t pruned_length =
(length < maxlength ? length : maxlength - 1); (length < maxlength ? length : maxlength - 1);
memcpy (resultbuf, result, pruned_length); memcpy (resultbuf, result, pruned_length);
resultbuf[pruned_length] = '\0'; resultbuf[pruned_length] = '\0';
} }
free (result); free (result);
} }
if (length > INT_MAX) if (length > INT_MAX)
{ {
errno = EOVERFLOW; errno = EOVERFLOW;
return -1; return -1;
} }
else else
return length; return length;
} }
} }
@ -285,7 +287,12 @@ libintl_asprintf (char **resultp, const char *format, ...)
#define WIDE_CHAR_VERSION 1 #define WIDE_CHAR_VERSION 1
#include "wprintf-parse.h"
/* Define auxiliary functions declared in "wprintf-parse.h". */ /* Define auxiliary functions declared in "wprintf-parse.h". */
#define CHAR_T wchar_t
#define DIRECTIVE wchar_t_directive
#define DIRECTIVES wchar_t_directives
#define PRINTF_PARSE wprintf_parse
#include "printf-parse.c" #include "printf-parse.c"
/* Define functions declared in "vasnprintf.h". */ /* Define functions declared in "vasnprintf.h". */
@ -316,20 +323,20 @@ libintl_vfwprintf (FILE *stream, const wchar_t *format, va_list args)
wchar_t *result = libintl_vasnwprintf (NULL, &length, format, args); wchar_t *result = libintl_vasnwprintf (NULL, &length, format, args);
int retval = -1; int retval = -1;
if (result != NULL) if (result != NULL)
{ {
size_t i; size_t i;
for (i = 0; i < length; i++) for (i = 0; i < length; i++)
if (fputwc (result[i], stream) == WEOF) if (fputwc (result[i], stream) == WEOF)
break; break;
free (result); free (result);
if (i == length) if (i == length)
{ {
if (length > INT_MAX) if (length > INT_MAX)
errno = EOVERFLOW; errno = EOVERFLOW;
else else
retval = length; retval = length;
} }
} }
return retval; return retval;
} }
} }
@ -378,29 +385,29 @@ libintl_vswprintf (wchar_t *resultbuf, size_t length, const wchar_t *format, va_
size_t maxlength = length; size_t maxlength = length;
wchar_t *result = libintl_vasnwprintf (resultbuf, &length, format, args); wchar_t *result = libintl_vasnwprintf (resultbuf, &length, format, args);
if (result != resultbuf) if (result != resultbuf)
{ {
if (maxlength > 0) if (maxlength > 0)
{ {
size_t pruned_length = size_t pruned_length =
(length < maxlength ? length : maxlength - 1); (length < maxlength ? length : maxlength - 1);
memcpy (resultbuf, result, pruned_length * sizeof (wchar_t)); memcpy (resultbuf, result, pruned_length * sizeof (wchar_t));
resultbuf[pruned_length] = 0; resultbuf[pruned_length] = 0;
} }
free (result); free (result);
/* Unlike vsnprintf, which has to return the number of character that /* Unlike vsnprintf, which has to return the number of character that
would have been produced if the resultbuf had been sufficiently would have been produced if the resultbuf had been sufficiently
large, the vswprintf function has to return a negative value if large, the vswprintf function has to return a negative value if
the resultbuf was not sufficiently large. */ the resultbuf was not sufficiently large. */
if (length >= maxlength) if (length >= maxlength)
return -1; return -1;
} }
if (length > INT_MAX) if (length > INT_MAX)
{ {
errno = EOVERFLOW; errno = EOVERFLOW;
return -1; return -1;
} }
else else
return length; return length;
} }
} }

View File

@ -1,5 +1,5 @@
/* Provide relocatable packages. /* Provide relocatable packages.
Copyright (C) 2003-2006 Free Software Foundation, Inc. Copyright (C) 2003-2006, 2008-2009 Free Software Foundation, Inc.
Written by Bruno Haible <bruno@clisp.org>, 2003. Written by Bruno Haible <bruno@clisp.org>, 2003.
This program is free software; you can redistribute it and/or modify it This program is free software; you can redistribute it and/or modify it
@ -22,7 +22,7 @@
This must come before <config.h> because <config.h> may include This must come before <config.h> because <config.h> may include
<features.h>, and once <features.h> has been included, it's too late. */ <features.h>, and once <features.h> has been included, it's too late. */
#ifndef _GNU_SOURCE #ifndef _GNU_SOURCE
# define _GNU_SOURCE 1 # define _GNU_SOURCE 1
#endif #endif
#include <config.h> #include <config.h>
@ -102,11 +102,11 @@ static size_t curr_prefix_len;
instead of "/"). */ instead of "/"). */
static void static void
set_this_relocation_prefix (const char *orig_prefix_arg, set_this_relocation_prefix (const char *orig_prefix_arg,
const char *curr_prefix_arg) const char *curr_prefix_arg)
{ {
if (orig_prefix_arg != NULL && curr_prefix_arg != NULL if (orig_prefix_arg != NULL && curr_prefix_arg != NULL
/* Optimization: if orig_prefix and curr_prefix are equal, the /* Optimization: if orig_prefix and curr_prefix are equal, the
relocation is a nop. */ relocation is a nop. */
&& strcmp (orig_prefix_arg, curr_prefix_arg) != 0) && strcmp (orig_prefix_arg, curr_prefix_arg) != 0)
{ {
/* Duplicate the argument strings. */ /* Duplicate the argument strings. */
@ -118,14 +118,14 @@ set_this_relocation_prefix (const char *orig_prefix_arg,
#ifdef NO_XMALLOC #ifdef NO_XMALLOC
if (memory != NULL) if (memory != NULL)
#endif #endif
{ {
memcpy (memory, orig_prefix_arg, orig_prefix_len + 1); memcpy (memory, orig_prefix_arg, orig_prefix_len + 1);
orig_prefix = memory; orig_prefix = memory;
memory += orig_prefix_len + 1; memory += orig_prefix_len + 1;
memcpy (memory, curr_prefix_arg, curr_prefix_len + 1); memcpy (memory, curr_prefix_arg, curr_prefix_len + 1);
curr_prefix = memory; curr_prefix = memory;
return; return;
} }
} }
orig_prefix = NULL; orig_prefix = NULL;
curr_prefix = NULL; curr_prefix = NULL;
@ -160,17 +160,18 @@ set_relocation_prefix (const char *orig_prefix_arg, const char *curr_prefix_arg)
/* Convenience function: /* Convenience function:
Computes the current installation prefix, based on the original Computes the current installation prefix, based on the original
installation prefix, the original installation directory of a particular installation prefix, the original installation directory of a particular
file, and the current pathname of this file. Returns NULL upon failure. */ file, and the current pathname of this file.
Returns it, freshly allocated. Returns NULL upon failure. */
#ifdef IN_LIBRARY #ifdef IN_LIBRARY
#define compute_curr_prefix local_compute_curr_prefix #define compute_curr_prefix local_compute_curr_prefix
static static
#endif #endif
const char * char *
compute_curr_prefix (const char *orig_installprefix, compute_curr_prefix (const char *orig_installprefix,
const char *orig_installdir, const char *orig_installdir,
const char *curr_pathname) const char *curr_pathname)
{ {
const char *curr_installdir; char *curr_installdir;
const char *rel_installdir; const char *rel_installdir;
if (curr_pathname == NULL) if (curr_pathname == NULL)
@ -193,9 +194,9 @@ compute_curr_prefix (const char *orig_installprefix,
while (p > p_base) while (p > p_base)
{ {
p--; p--;
if (ISSLASH (*p)) if (ISSLASH (*p))
break; break;
} }
q = (char *) xmalloc (p - curr_pathname + 1); q = (char *) xmalloc (p - curr_pathname + 1);
@ -218,44 +219,47 @@ compute_curr_prefix (const char *orig_installprefix,
while (rp > rel_installdir && cp > cp_base) while (rp > rel_installdir && cp > cp_base)
{ {
bool same = false; bool same = false;
const char *rpi = rp; const char *rpi = rp;
const char *cpi = cp; const char *cpi = cp;
while (rpi > rel_installdir && cpi > cp_base) while (rpi > rel_installdir && cpi > cp_base)
{ {
rpi--; rpi--;
cpi--; cpi--;
if (ISSLASH (*rpi) || ISSLASH (*cpi)) if (ISSLASH (*rpi) || ISSLASH (*cpi))
{ {
if (ISSLASH (*rpi) && ISSLASH (*cpi)) if (ISSLASH (*rpi) && ISSLASH (*cpi))
same = true; same = true;
break; break;
} }
/* Do case-insensitive comparison if the filesystem is always or /* Do case-insensitive comparison if the file system is always or
often case-insensitive. It's better to accept the comparison often case-insensitive. It's better to accept the comparison
if the difference is only in case, rather than to fail. */ if the difference is only in case, rather than to fail. */
#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__ #if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__
/* Win32, Cygwin, OS/2, DOS - case insignificant filesystem */ /* Win32, Cygwin, OS/2, DOS - case insignificant file system */
if ((*rpi >= 'a' && *rpi <= 'z' ? *rpi - 'a' + 'A' : *rpi) if ((*rpi >= 'a' && *rpi <= 'z' ? *rpi - 'a' + 'A' : *rpi)
!= (*cpi >= 'a' && *cpi <= 'z' ? *cpi - 'a' + 'A' : *cpi)) != (*cpi >= 'a' && *cpi <= 'z' ? *cpi - 'a' + 'A' : *cpi))
break; break;
#else #else
if (*rpi != *cpi) if (*rpi != *cpi)
break; break;
#endif #endif
} }
if (!same) if (!same)
break; break;
/* The last pathname component was the same. opi and cpi now point /* The last pathname component was the same. opi and cpi now point
to the slash before it. */ to the slash before it. */
rp = rpi; rp = rpi;
cp = cpi; cp = cpi;
} }
if (rp > rel_installdir) if (rp > rel_installdir)
/* Unexpected: The curr_installdir does not end with rel_installdir. */ {
return NULL; /* Unexpected: The curr_installdir does not end with rel_installdir. */
free (curr_installdir);
return NULL;
}
{ {
size_t curr_prefix_len = cp - curr_installdir; size_t curr_prefix_len = cp - curr_installdir;
@ -264,11 +268,16 @@ compute_curr_prefix (const char *orig_installprefix,
curr_prefix = (char *) xmalloc (curr_prefix_len + 1); curr_prefix = (char *) xmalloc (curr_prefix_len + 1);
#ifdef NO_XMALLOC #ifdef NO_XMALLOC
if (curr_prefix == NULL) if (curr_prefix == NULL)
return NULL; {
free (curr_installdir);
return NULL;
}
#endif #endif
memcpy (curr_prefix, curr_installdir, curr_prefix_len); memcpy (curr_prefix, curr_installdir, curr_prefix_len);
curr_prefix[curr_prefix_len] = '\0'; curr_prefix[curr_prefix_len] = '\0';
free (curr_installdir);
return curr_prefix; return curr_prefix;
} }
} }
@ -296,30 +305,30 @@ DllMain (HINSTANCE module_handle, DWORD event, LPVOID reserved)
static char location[MAX_PATH]; static char location[MAX_PATH];
if (!GetModuleFileName (module_handle, location, sizeof (location))) if (!GetModuleFileName (module_handle, location, sizeof (location)))
/* Shouldn't happen. */ /* Shouldn't happen. */
return FALSE; return FALSE;
if (!IS_PATH_WITH_DIR (location)) if (!IS_PATH_WITH_DIR (location))
/* Shouldn't happen. */ /* Shouldn't happen. */
return FALSE; return FALSE;
{ {
#if defined __CYGWIN__ #if defined __CYGWIN__
/* On Cygwin, we need to convert paths coming from Win32 system calls /* On Cygwin, we need to convert paths coming from Win32 system calls
to the Unix-like slashified notation. */ to the Unix-like slashified notation. */
static char location_as_posix_path[2 * MAX_PATH]; static char location_as_posix_path[2 * MAX_PATH];
/* There's no error return defined for cygwin_conv_to_posix_path. /* There's no error return defined for cygwin_conv_to_posix_path.
See cygwin-api/func-cygwin-conv-to-posix-path.html. See cygwin-api/func-cygwin-conv-to-posix-path.html.
Does it overflow the buffer of expected size MAX_PATH or does it Does it overflow the buffer of expected size MAX_PATH or does it
truncate the path? I don't know. Let's catch both. */ truncate the path? I don't know. Let's catch both. */
cygwin_conv_to_posix_path (location, location_as_posix_path); cygwin_conv_to_posix_path (location, location_as_posix_path);
location_as_posix_path[MAX_PATH - 1] = '\0'; location_as_posix_path[MAX_PATH - 1] = '\0';
if (strlen (location_as_posix_path) >= MAX_PATH - 1) if (strlen (location_as_posix_path) >= MAX_PATH - 1)
/* A sign of buffer overflow or path truncation. */ /* A sign of buffer overflow or path truncation. */
return FALSE; return FALSE;
shared_library_fullname = strdup (location_as_posix_path); shared_library_fullname = strdup (location_as_posix_path);
#else #else
shared_library_fullname = strdup (location); shared_library_fullname = strdup (location);
#endif #endif
} }
} }
@ -342,37 +351,37 @@ find_shared_library_fullname ()
{ {
unsigned long address = (unsigned long) &find_shared_library_fullname; unsigned long address = (unsigned long) &find_shared_library_fullname;
for (;;) for (;;)
{ {
unsigned long start, end; unsigned long start, end;
int c; int c;
if (fscanf (fp, "%lx-%lx", &start, &end) != 2) if (fscanf (fp, "%lx-%lx", &start, &end) != 2)
break; break;
if (address >= start && address <= end - 1) if (address >= start && address <= end - 1)
{ {
/* Found it. Now see if this line contains a filename. */ /* Found it. Now see if this line contains a filename. */
while (c = getc (fp), c != EOF && c != '\n' && c != '/') while (c = getc (fp), c != EOF && c != '\n' && c != '/')
continue; continue;
if (c == '/') if (c == '/')
{ {
size_t size; size_t size;
int len; int len;
ungetc (c, fp); ungetc (c, fp);
shared_library_fullname = NULL; size = 0; shared_library_fullname = NULL; size = 0;
len = getline (&shared_library_fullname, &size, fp); len = getline (&shared_library_fullname, &size, fp);
if (len >= 0) if (len >= 0)
{ {
/* Success: filled shared_library_fullname. */ /* Success: filled shared_library_fullname. */
if (len > 0 && shared_library_fullname[len - 1] == '\n') if (len > 0 && shared_library_fullname[len - 1] == '\n')
shared_library_fullname[len - 1] = '\0'; shared_library_fullname[len - 1] = '\0';
} }
} }
break; break;
} }
while (c = getc (fp), c != EOF && c != '\n') while (c = getc (fp), c != EOF && c != '\n')
continue; continue;
} }
fclose (fp); fclose (fp);
} }
#endif #endif
@ -400,7 +409,9 @@ get_shared_library_fullname ()
#endif /* PIC */ #endif /* PIC */
/* Returns the pathname, relocated according to the current installation /* Returns the pathname, relocated according to the current installation
directory. */ directory.
The returned string is either PATHNAME unmodified or a freshly allocated
string that you can free with free() after casting it to 'char *'. */
const char * const char *
relocate (const char *pathname) relocate (const char *pathname)
{ {
@ -411,55 +422,69 @@ relocate (const char *pathname)
if (!initialized) if (!initialized)
{ {
/* At this point, orig_prefix and curr_prefix likely have already been /* At this point, orig_prefix and curr_prefix likely have already been
set through the main program's set_program_name_and_installdir set through the main program's set_program_name_and_installdir
function. This is sufficient in the case that the library has function. This is sufficient in the case that the library has
initially been installed in the same orig_prefix. But we can do initially been installed in the same orig_prefix. But we can do
better, to also cover the cases that 1. it has been installed better, to also cover the cases that 1. it has been installed
in a different prefix before being moved to orig_prefix and (later) in a different prefix before being moved to orig_prefix and (later)
to curr_prefix, 2. unlike the program, it has not moved away from to curr_prefix, 2. unlike the program, it has not moved away from
orig_prefix. */ orig_prefix. */
const char *orig_installprefix = INSTALLPREFIX; const char *orig_installprefix = INSTALLPREFIX;
const char *orig_installdir = INSTALLDIR; const char *orig_installdir = INSTALLDIR;
const char *curr_prefix_better; char *curr_prefix_better;
curr_prefix_better = curr_prefix_better =
compute_curr_prefix (orig_installprefix, orig_installdir, compute_curr_prefix (orig_installprefix, orig_installdir,
get_shared_library_fullname ()); get_shared_library_fullname ());
if (curr_prefix_better == NULL)
curr_prefix_better = curr_prefix;
set_relocation_prefix (orig_installprefix, curr_prefix_better); set_relocation_prefix (orig_installprefix,
curr_prefix_better != NULL
? curr_prefix_better
: curr_prefix);
if (curr_prefix_better != NULL)
free (curr_prefix_better);
initialized = 1; initialized = 1;
} }
#endif #endif
/* Note: It is not necessary to perform case insensitive comparison here, /* Note: It is not necessary to perform case insensitive comparison here,
even for DOS-like filesystems, because the pathname argument was even for DOS-like file systems, because the pathname argument was
typically created from the same Makefile variable as orig_prefix came typically created from the same Makefile variable as orig_prefix came
from. */ from. */
if (orig_prefix != NULL && curr_prefix != NULL if (orig_prefix != NULL && curr_prefix != NULL
&& strncmp (pathname, orig_prefix, orig_prefix_len) == 0) && strncmp (pathname, orig_prefix, orig_prefix_len) == 0)
{ {
if (pathname[orig_prefix_len] == '\0') if (pathname[orig_prefix_len] == '\0')
/* pathname equals orig_prefix. */ {
return curr_prefix; /* pathname equals orig_prefix. */
if (ISSLASH (pathname[orig_prefix_len])) char *result = (char *) xmalloc (strlen (curr_prefix) + 1);
{
/* pathname starts with orig_prefix. */
const char *pathname_tail = &pathname[orig_prefix_len];
char *result =
(char *) xmalloc (curr_prefix_len + strlen (pathname_tail) + 1);
#ifdef NO_XMALLOC #ifdef NO_XMALLOC
if (result != NULL) if (result != NULL)
#endif #endif
{ {
memcpy (result, curr_prefix, curr_prefix_len); strcpy (result, curr_prefix);
strcpy (result + curr_prefix_len, pathname_tail); return result;
return result; }
} }
} else if (ISSLASH (pathname[orig_prefix_len]))
{
/* pathname starts with orig_prefix. */
const char *pathname_tail = &pathname[orig_prefix_len];
char *result =
(char *) xmalloc (curr_prefix_len + strlen (pathname_tail) + 1);
#ifdef NO_XMALLOC
if (result != NULL)
#endif
{
memcpy (result, curr_prefix, curr_prefix_len);
strcpy (result + curr_prefix_len, pathname_tail);
return result;
}
}
} }
/* Nothing to relocate. */ /* Nothing to relocate. */
return pathname; return pathname;

View File

@ -1,5 +1,5 @@
/* Provide relocatable packages. /* Provide relocatable packages.
Copyright (C) 2003, 2005 Free Software Foundation, Inc. Copyright (C) 2003, 2005, 2008 Free Software Foundation, Inc.
Written by Bruno Haible <bruno@clisp.org>, 2003. Written by Bruno Haible <bruno@clisp.org>, 2003.
This program is free software; you can redistribute it and/or modify it This program is free software; you can redistribute it and/or modify it
@ -46,23 +46,27 @@ extern "C" {
instead of "/"). */ instead of "/"). */
extern RELOCATABLE_DLL_EXPORTED void extern RELOCATABLE_DLL_EXPORTED void
set_relocation_prefix (const char *orig_prefix, set_relocation_prefix (const char *orig_prefix,
const char *curr_prefix); const char *curr_prefix);
/* Returns the pathname, relocated according to the current installation /* Returns the pathname, relocated according to the current installation
directory. */ directory.
The returned string is either PATHNAME unmodified or a freshly allocated
string that you can free with free() after casting it to 'char *'. */
extern const char * relocate (const char *pathname); extern const char * relocate (const char *pathname);
/* Memory management: relocate() leaks memory, because it has to construct /* Memory management: relocate() potentially allocates memory, because it has
a fresh pathname. If this is a problem because your program calls to construct a fresh pathname. If this is a problem because your program
relocate() frequently, think about caching the result. */ calls relocate() frequently, think about caching the result. Or free the
return value if it was different from the argument pathname. */
/* Convenience function: /* Convenience function:
Computes the current installation prefix, based on the original Computes the current installation prefix, based on the original
installation prefix, the original installation directory of a particular installation prefix, the original installation directory of a particular
file, and the current pathname of this file. Returns NULL upon failure. */ file, and the current pathname of this file.
extern const char * compute_curr_prefix (const char *orig_installprefix, Returns it, freshly allocated. Returns NULL upon failure. */
const char *orig_installdir, extern char * compute_curr_prefix (const char *orig_installprefix,
const char *curr_pathname); const char *orig_installdir,
const char *curr_pathname);
#else #else

1015
intl/setlocale.c Normal file

File diff suppressed because it is too large Load Diff

View File

@ -40,22 +40,8 @@
# include "lock.h" # include "lock.h"
#endif #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 libintl_nl_default_default_domain
# define _nl_current_default_domain libintl_nl_current_default_domain
#endif
/* @@ end of prolog @@ */ /* @@ end of prolog @@ */
/* 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;
/* Names for the libintl functions are a problem. They must not clash /* Names for the libintl functions are a problem. They must not clash
with existing names and they should follow ANSI C. But this source with existing names and they should follow ANSI C. But this source

75
intl/threadlib.c Normal file
View File

@ -0,0 +1,75 @@
/* Multithreading primitives.
Copyright (C) 2005-2009 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
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
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. */
/* Written by Bruno Haible <bruno@clisp.org>, 2005. */
#include <config.h>
/* ========================================================================= */
#if USE_POSIX_THREADS
/* Use the POSIX threads library. */
# include <pthread.h>
# include <stdlib.h>
# if PTHREAD_IN_USE_DETECTION_HARD
/* The function to be executed by a dummy thread. */
static void *
dummy_thread_func (void *arg)
{
return arg;
}
int
glthread_in_use (void)
{
static int tested;
static int result; /* 1: linked with -lpthread, 0: only with libc */
if (!tested)
{
pthread_t thread;
if (pthread_create (&thread, NULL, dummy_thread_func, NULL) != 0)
/* Thread creation failed. */
result = 0;
else
{
/* Thread creation works. */
void *retval;
if (pthread_join (thread, &retval) != 0)
abort ();
result = 1;
}
tested = 1;
}
return result;
}
# endif
#endif
/* ========================================================================= */
/* This declaration is solely to ensure that after preprocessing
this file is never empty. */
typedef int dummy;

684
intl/tsearch.c Normal file
View File

@ -0,0 +1,684 @@
/* Copyright (C) 1995, 1996, 1997, 2000, 2006 Free Software Foundation, Inc.
Contributed by Bernd Schmidt <crux@Pool.Informatik.RWTH-Aachen.DE>, 1997.
NOTE: The canonical source of this file is maintained with the GNU C
Library. Bugs can be reported to bug-glibc@gnu.org.
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
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. */
/* Tree search for red/black trees.
The algorithm for adding nodes is taken from one of the many "Algorithms"
books by Robert Sedgewick, although the implementation differs.
The algorithm for deleting nodes can probably be found in a book named
"Introduction to Algorithms" by Cormen/Leiserson/Rivest. At least that's
the book that my professor took most algorithms from during the "Data
Structures" course...
Totally public domain. */
/* Red/black trees are binary trees in which the edges are colored either red
or black. They have the following properties:
1. The number of black edges on every path from the root to a leaf is
constant.
2. No two red edges are adjacent.
Therefore there is an upper bound on the length of every path, it's
O(log n) where n is the number of nodes in the tree. No path can be longer
than 1+2*P where P is the length of the shortest path in the tree.
Useful for the implementation:
3. If one of the children of a node is NULL, then the other one is red
(if it exists).
In the implementation, not the edges are colored, but the nodes. The color
interpreted as the color of the edge leading to this node. The color is
meaningless for the root node, but we color the root node black for
convenience. All added nodes are red initially.
Adding to a red/black tree is rather easy. The right place is searched
with a usual binary tree search. Additionally, whenever a node N is
reached that has two red successors, the successors are colored black and
the node itself colored red. This moves red edges up the tree where they
pose less of a problem once we get to really insert the new node. Changing
N's color to red may violate rule 2, however, so rotations may become
necessary to restore the invariants. Adding a new red leaf may violate
the same rule, so afterwards an additional check is run and the tree
possibly rotated.
Deleting is hairy. There are mainly two nodes involved: the node to be
deleted (n1), and another node that is to be unchained from the tree (n2).
If n1 has a successor (the node with a smallest key that is larger than
n1), then the successor becomes n2 and its contents are copied into n1,
otherwise n1 becomes n2.
Unchaining a node may violate rule 1: if n2 is black, one subtree is
missing one black edge afterwards. The algorithm must try to move this
error upwards towards the root, so that the subtree that does not have
enough black edges becomes the whole tree. Once that happens, the error
has disappeared. It may not be necessary to go all the way up, since it
is possible that rotations and recoloring can fix the error before that.
Although the deletion algorithm must walk upwards through the tree, we
do not store parent pointers in the nodes. Instead, delete allocates a
small array of parent pointers and fills it while descending the tree.
Since we know that the length of a path is O(log n), where n is the number
of nodes, this is likely to use less memory. */
/* Tree rotations look like this:
A C
/ \ / \
B C A G
/ \ / \ --> / \
D E F G B F
/ \
D E
In this case, A has been rotated left. This preserves the ordering of the
binary tree. */
#include <config.h>
/* Specification. */
#ifdef IN_LIBINTL
# include "tsearch.h"
#else
# include <search.h>
#endif
#include <stdlib.h>
typedef int (*__compar_fn_t) (const void *, const void *);
typedef void (*__action_fn_t) (const void *, VISIT, int);
#ifndef weak_alias
# define __tsearch tsearch
# define __tfind tfind
# define __tdelete tdelete
# define __twalk twalk
#endif
#ifndef internal_function
/* Inside GNU libc we mark some function in a special way. In other
environments simply ignore the marking. */
# define internal_function
#endif
typedef struct node_t
{
/* Callers expect this to be the first element in the structure - do not
move! */
const void *key;
struct node_t *left;
struct node_t *right;
unsigned int red:1;
} *node;
typedef const struct node_t *const_node;
#undef DEBUGGING
#ifdef DEBUGGING
/* Routines to check tree invariants. */
#include <assert.h>
#define CHECK_TREE(a) check_tree(a)
static void
check_tree_recurse (node p, int d_sofar, int d_total)
{
if (p == NULL)
{
assert (d_sofar == d_total);
return;
}
check_tree_recurse (p->left, d_sofar + (p->left && !p->left->red), d_total);
check_tree_recurse (p->right, d_sofar + (p->right && !p->right->red), d_total);
if (p->left)
assert (!(p->left->red && p->red));
if (p->right)
assert (!(p->right->red && p->red));
}
static void
check_tree (node root)
{
int cnt = 0;
node p;
if (root == NULL)
return;
root->red = 0;
for(p = root->left; p; p = p->left)
cnt += !p->red;
check_tree_recurse (root, 0, cnt);
}
#else
#define CHECK_TREE(a)
#endif
/* Possibly "split" a node with two red successors, and/or fix up two red
edges in a row. ROOTP is a pointer to the lowest node we visited, PARENTP
and GPARENTP pointers to its parent/grandparent. P_R and GP_R contain the
comparison values that determined which way was taken in the tree to reach
ROOTP. MODE is 1 if we need not do the split, but must check for two red
edges between GPARENTP and ROOTP. */
static void
maybe_split_for_insert (node *rootp, node *parentp, node *gparentp,
int p_r, int gp_r, int mode)
{
node root = *rootp;
node *rp, *lp;
rp = &(*rootp)->right;
lp = &(*rootp)->left;
/* See if we have to split this node (both successors red). */
if (mode == 1
|| ((*rp) != NULL && (*lp) != NULL && (*rp)->red && (*lp)->red))
{
/* This node becomes red, its successors black. */
root->red = 1;
if (*rp)
(*rp)->red = 0;
if (*lp)
(*lp)->red = 0;
/* If the parent of this node is also red, we have to do
rotations. */
if (parentp != NULL && (*parentp)->red)
{
node gp = *gparentp;
node p = *parentp;
/* There are two main cases:
1. The edge types (left or right) of the two red edges differ.
2. Both red edges are of the same type.
There exist two symmetries of each case, so there is a total of
4 cases. */
if ((p_r > 0) != (gp_r > 0))
{
/* Put the child at the top of the tree, with its parent
and grandparent as successors. */
p->red = 1;
gp->red = 1;
root->red = 0;
if (p_r < 0)
{
/* Child is left of parent. */
p->left = *rp;
*rp = p;
gp->right = *lp;
*lp = gp;
}
else
{
/* Child is right of parent. */
p->right = *lp;
*lp = p;
gp->left = *rp;
*rp = gp;
}
*gparentp = root;
}
else
{
*gparentp = *parentp;
/* Parent becomes the top of the tree, grandparent and
child are its successors. */
p->red = 0;
gp->red = 1;
if (p_r < 0)
{
/* Left edges. */
gp->left = p->right;
p->right = gp;
}
else
{
/* Right edges. */
gp->right = p->left;
p->left = gp;
}
}
}
}
}
/* Find or insert datum into search tree.
KEY is the key to be located, ROOTP is the address of tree root,
COMPAR the ordering function. */
void *
__tsearch (const void *key, void **vrootp, __compar_fn_t compar)
{
node q;
node *parentp = NULL, *gparentp = NULL;
node *rootp = (node *) vrootp;
node *nextp;
int r = 0, p_r = 0, gp_r = 0; /* No they might not, Mr Compiler. */
if (rootp == NULL)
return NULL;
/* This saves some additional tests below. */
if (*rootp != NULL)
(*rootp)->red = 0;
CHECK_TREE (*rootp);
nextp = rootp;
while (*nextp != NULL)
{
node root = *rootp;
r = (*compar) (key, root->key);
if (r == 0)
return root;
maybe_split_for_insert (rootp, parentp, gparentp, p_r, gp_r, 0);
/* If that did any rotations, parentp and gparentp are now garbage.
That doesn't matter, because the values they contain are never
used again in that case. */
nextp = r < 0 ? &root->left : &root->right;
if (*nextp == NULL)
break;
gparentp = parentp;
parentp = rootp;
rootp = nextp;
gp_r = p_r;
p_r = r;
}
q = (struct node_t *) malloc (sizeof (struct node_t));
if (q != NULL)
{
*nextp = q; /* link new node to old */
q->key = key; /* initialize new node */
q->red = 1;
q->left = q->right = NULL;
if (nextp != rootp)
/* There may be two red edges in a row now, which we must avoid by
rotating the tree. */
maybe_split_for_insert (nextp, rootp, parentp, r, p_r, 1);
}
return q;
}
#ifdef weak_alias
weak_alias (__tsearch, tsearch)
#endif
/* Find datum in search tree.
KEY is the key to be located, ROOTP is the address of tree root,
COMPAR the ordering function. */
void *
__tfind (key, vrootp, compar)
const void *key;
void *const *vrootp;
__compar_fn_t compar;
{
node *rootp = (node *) vrootp;
if (rootp == NULL)
return NULL;
CHECK_TREE (*rootp);
while (*rootp != NULL)
{
node root = *rootp;
int r;
r = (*compar) (key, root->key);
if (r == 0)
return root;
rootp = r < 0 ? &root->left : &root->right;
}
return NULL;
}
#ifdef weak_alias
weak_alias (__tfind, tfind)
#endif
/* Delete node with given key.
KEY is the key to be deleted, ROOTP is the address of the root of tree,
COMPAR the comparison function. */
void *
__tdelete (const void *key, void **vrootp, __compar_fn_t compar)
{
node p, q, r, retval;
int cmp;
node *rootp = (node *) vrootp;
node root, unchained;
/* Stack of nodes so we remember the parents without recursion. It's
_very_ unlikely that there are paths longer than 40 nodes. The tree
would need to have around 250.000 nodes. */
int stacksize = 100;
int sp = 0;
node *nodestack[100];
if (rootp == NULL)
return NULL;
p = *rootp;
if (p == NULL)
return NULL;
CHECK_TREE (p);
while ((cmp = (*compar) (key, (*rootp)->key)) != 0)
{
if (sp == stacksize)
abort ();
nodestack[sp++] = rootp;
p = *rootp;
rootp = ((cmp < 0)
? &(*rootp)->left
: &(*rootp)->right);
if (*rootp == NULL)
return NULL;
}
/* This is bogus if the node to be deleted is the root... this routine
really should return an integer with 0 for success, -1 for failure
and errno = ESRCH or something. */
retval = p;
/* We don't unchain the node we want to delete. Instead, we overwrite
it with its successor and unchain the successor. If there is no
successor, we really unchain the node to be deleted. */
root = *rootp;
r = root->right;
q = root->left;
if (q == NULL || r == NULL)
unchained = root;
else
{
node *parent = rootp, *up = &root->right;
for (;;)
{
if (sp == stacksize)
abort ();
nodestack[sp++] = parent;
parent = up;
if ((*up)->left == NULL)
break;
up = &(*up)->left;
}
unchained = *up;
}
/* We know that either the left or right successor of UNCHAINED is NULL.
R becomes the other one, it is chained into the parent of UNCHAINED. */
r = unchained->left;
if (r == NULL)
r = unchained->right;
if (sp == 0)
*rootp = r;
else
{
q = *nodestack[sp-1];
if (unchained == q->right)
q->right = r;
else
q->left = r;
}
if (unchained != root)
root->key = unchained->key;
if (!unchained->red)
{
/* Now we lost a black edge, which means that the number of black
edges on every path is no longer constant. We must balance the
tree. */
/* NODESTACK now contains all parents of R. R is likely to be NULL
in the first iteration. */
/* NULL nodes are considered black throughout - this is necessary for
correctness. */
while (sp > 0 && (r == NULL || !r->red))
{
node *pp = nodestack[sp - 1];
p = *pp;
/* Two symmetric cases. */
if (r == p->left)
{
/* Q is R's brother, P is R's parent. The subtree with root
R has one black edge less than the subtree with root Q. */
q = p->right;
if (q->red)
{
/* If Q is red, we know that P is black. We rotate P left
so that Q becomes the top node in the tree, with P below
it. P is colored red, Q is colored black.
This action does not change the black edge count for any
leaf in the tree, but we will be able to recognize one
of the following situations, which all require that Q
is black. */
q->red = 0;
p->red = 1;
/* Left rotate p. */
p->right = q->left;
q->left = p;
*pp = q;
/* Make sure pp is right if the case below tries to use
it. */
nodestack[sp++] = pp = &q->left;
q = p->right;
}
/* We know that Q can't be NULL here. We also know that Q is
black. */
if ((q->left == NULL || !q->left->red)
&& (q->right == NULL || !q->right->red))
{
/* Q has two black successors. We can simply color Q red.
The whole subtree with root P is now missing one black
edge. Note that this action can temporarily make the
tree invalid (if P is red). But we will exit the loop
in that case and set P black, which both makes the tree
valid and also makes the black edge count come out
right. If P is black, we are at least one step closer
to the root and we'll try again the next iteration. */
q->red = 1;
r = p;
}
else
{
/* Q is black, one of Q's successors is red. We can
repair the tree with one operation and will exit the
loop afterwards. */
if (q->right == NULL || !q->right->red)
{
/* The left one is red. We perform the same action as
in maybe_split_for_insert where two red edges are
adjacent but point in different directions:
Q's left successor (let's call it Q2) becomes the
top of the subtree we are looking at, its parent (Q)
and grandparent (P) become its successors. The former
successors of Q2 are placed below P and Q.
P becomes black, and Q2 gets the color that P had.
This changes the black edge count only for node R and
its successors. */
node q2 = q->left;
q2->red = p->red;
p->right = q2->left;
q->left = q2->right;
q2->right = q;
q2->left = p;
*pp = q2;
p->red = 0;
}
else
{
/* It's the right one. Rotate P left. P becomes black,
and Q gets the color that P had. Q's right successor
also becomes black. This changes the black edge
count only for node R and its successors. */
q->red = p->red;
p->red = 0;
q->right->red = 0;
/* left rotate p */
p->right = q->left;
q->left = p;
*pp = q;
}
/* We're done. */
sp = 1;
r = NULL;
}
}
else
{
/* Comments: see above. */
q = p->left;
if (q->red)
{
q->red = 0;
p->red = 1;
p->left = q->right;
q->right = p;
*pp = q;
nodestack[sp++] = pp = &q->right;
q = p->left;
}
if ((q->right == NULL || !q->right->red)
&& (q->left == NULL || !q->left->red))
{
q->red = 1;
r = p;
}
else
{
if (q->left == NULL || !q->left->red)
{
node q2 = q->right;
q2->red = p->red;
p->left = q2->right;
q->right = q2->left;
q2->left = q;
q2->right = p;
*pp = q2;
p->red = 0;
}
else
{
q->red = p->red;
p->red = 0;
q->left->red = 0;
p->left = q->right;
q->right = p;
*pp = q;
}
sp = 1;
r = NULL;
}
}
--sp;
}
if (r != NULL)
r->red = 0;
}
free (unchained);
return retval;
}
#ifdef weak_alias
weak_alias (__tdelete, tdelete)
#endif
/* Walk the nodes of a tree.
ROOT is the root of the tree to be walked, ACTION the function to be
called at each node. LEVEL is the level of ROOT in the whole tree. */
static void
internal_function
trecurse (const void *vroot, __action_fn_t action, int level)
{
const_node root = (const_node) vroot;
if (root->left == NULL && root->right == NULL)
(*action) (root, leaf, level);
else
{
(*action) (root, preorder, level);
if (root->left != NULL)
trecurse (root->left, action, level + 1);
(*action) (root, postorder, level);
if (root->right != NULL)
trecurse (root->right, action, level + 1);
(*action) (root, endorder, level);
}
}
/* Walk the nodes of a tree.
ROOT is the root of the tree to be walked, ACTION the function to be
called at each node. */
void
__twalk (const void *vroot, __action_fn_t action)
{
const_node root = (const_node) vroot;
CHECK_TREE (root);
if (root != NULL && action != NULL)
trecurse (root, action, 0);
}
#ifdef weak_alias
weak_alias (__twalk, twalk)
#endif
#ifdef _LIBC
/* The standardized functions miss an important functionality: the
tree cannot be removed easily. We provide a function to do this. */
static void
internal_function
tdestroy_recurse (node root, __free_fn_t freefct)
{
if (root->left != NULL)
tdestroy_recurse (root->left, freefct);
if (root->right != NULL)
tdestroy_recurse (root->right, freefct);
(*freefct) ((void *) root->key);
/* Free the node itself. */
free (root);
}
void
__tdestroy (void *vroot, __free_fn_t freefct)
{
node root = (node) vroot;
CHECK_TREE (root);
if (root != NULL)
tdestroy_recurse (root, freefct);
}
weak_alias (__tdestroy, tdestroy)
#endif /* _LIBC */

83
intl/tsearch.h Normal file
View File

@ -0,0 +1,83 @@
/* Binary tree data structure.
Copyright (C) 2006 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
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
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. */
#ifndef _TSEARCH_H
#define _TSEARCH_H
#if HAVE_TSEARCH
/* Get tseach(), tfind(), tdelete(), twalk() declarations. */
#include <search.h>
#else
#ifdef __cplusplus
extern "C" {
#endif
/* See <http://www.opengroup.org/susv3xbd/search.h.html>,
<http://www.opengroup.org/susv3xsh/tsearch.html>
for details. */
typedef enum
{
preorder,
postorder,
endorder,
leaf
}
VISIT;
/* Searches an element in the tree *VROOTP that compares equal to KEY.
If one is found, it is returned. Otherwise, a new element equal to KEY
is inserted in the tree and is returned. */
extern void * tsearch (const void *key, void **vrootp,
int (*compar) (const void *, const void *));
/* Searches an element in the tree *VROOTP that compares equal to KEY.
If one is found, it is returned. Otherwise, NULL is returned. */
extern void * tfind (const void *key, void *const *vrootp,
int (*compar) (const void *, const void *));
/* Searches an element in the tree *VROOTP that compares equal to KEY.
If one is found, it is removed from the tree, and its parent node is
returned. Otherwise, NULL is returned. */
extern void * tdelete (const void *key, void **vrootp,
int (*compar) (const void *, const void *));
/* Perform a depth-first, left-to-right traversal of the tree VROOT.
The ACTION function is called:
- for non-leaf nodes: 3 times, before the left subtree traversal,
after the left subtree traversal but before the right subtree traversal,
and after the right subtree traversal,
- for leaf nodes: once.
The arguments passed to ACTION are:
1. the node; it can be casted to a 'const void * const *', i.e. into a
pointer to the key,
2. an indicator which visit of the node this is,
3. the level of the node in the tree (0 for the root). */
extern void twalk (const void *vroot,
void (*action) (const void *, VISIT, int));
#ifdef __cplusplus
}
#endif
#endif
#endif /* _TSEARCH_H */

File diff suppressed because it is too large Load Diff

View File

@ -38,7 +38,7 @@
# endif # endif
#endif #endif
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
@ -71,7 +71,7 @@ extern char * asnprintf (char *resultbuf, size_t *lengthp, const char *format, .
extern char * vasnprintf (char *resultbuf, size_t *lengthp, const char *format, va_list args) extern char * vasnprintf (char *resultbuf, size_t *lengthp, const char *format, va_list args)
__attribute__ ((__format__ (__printf__, 3, 0))); __attribute__ ((__format__ (__printf__, 3, 0)));
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@ -25,7 +25,7 @@
/* Get wchar_t, size_t. */ /* Get wchar_t, size_t. */
#include <stddef.h> #include <stddef.h>
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
@ -39,7 +39,7 @@ extern "C" {
extern wchar_t * asnwprintf (wchar_t *resultbuf, size_t *lengthp, const wchar_t *format, ...); extern wchar_t * asnwprintf (wchar_t *resultbuf, size_t *lengthp, const wchar_t *format, ...);
extern wchar_t * vasnwprintf (wchar_t *resultbuf, size_t *lengthp, const wchar_t *format, va_list args); extern wchar_t * vasnwprintf (wchar_t *resultbuf, size_t *lengthp, const wchar_t *format, va_list args);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@ -23,15 +23,15 @@
/* Flags */ /* Flags */
#define FLAG_GROUP 1 /* ' flag */ #define FLAG_GROUP 1 /* ' flag */
#define FLAG_LEFT 2 /* - flag */ #define FLAG_LEFT 2 /* - flag */
#define FLAG_SHOWSIGN 4 /* + flag */ #define FLAG_SHOWSIGN 4 /* + flag */
#define FLAG_SPACE 8 /* space flag */ #define FLAG_SPACE 8 /* space flag */
#define FLAG_ALT 16 /* # flag */ #define FLAG_ALT 16 /* # flag */
#define FLAG_ZERO 32 #define FLAG_ZERO 32
/* arg_index value indicating that no argument is consumed. */ /* arg_index value indicating that no argument is consumed. */
#define ARG_NONE (~(size_t)0) #define ARG_NONE (~(size_t)0)
/* A parsed directive. */ /* A parsed directive. */
typedef struct typedef struct

View File

@ -1,6 +1,6 @@
/* xsize.h -- Checked size_t computations. /* xsize.h -- Checked size_t computations.
Copyright (C) 2003 Free Software Foundation, Inc. Copyright (C) 2003, 2008 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify it 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 under the terms of the GNU Library General Public License as published
@ -95,7 +95,7 @@ xmax (size_t size1, size_t size2)
/* Multiplication of a count with an element size, with overflow check. /* Multiplication of a count with an element size, with overflow check.
The count must be >= 0 and the element size must be > 0. The count must be >= 0 and the element size must be > 0.
This is a macro, not an inline function, so that it works correctly even This is a macro, not an inline function, so that it works correctly even
when N is of a wider tupe and N > SIZE_MAX. */ when N is of a wider type and N > SIZE_MAX. */
#define xtimes(N, ELSIZE) \ #define xtimes(N, ELSIZE) \
((N) <= SIZE_MAX / (ELSIZE) ? (size_t) (N) * (ELSIZE) : SIZE_MAX) ((N) <= SIZE_MAX / (ELSIZE) ? (size_t) (N) * (ELSIZE) : SIZE_MAX)

View File

@ -1,5 +1,5 @@
# codeset.m4 serial 2 (gettext-0.16) # codeset.m4 serial 4 (gettext-0.18)
dnl Copyright (C) 2000-2002, 2006 Free Software Foundation, Inc. dnl Copyright (C) 2000-2002, 2006, 2008-2010 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it, dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved. dnl with or without modifications, as long as this notice is preserved.
@ -8,14 +8,14 @@ dnl From Bruno Haible.
AC_DEFUN([AM_LANGINFO_CODESET], AC_DEFUN([AM_LANGINFO_CODESET],
[ [
AC_CACHE_CHECK([for nl_langinfo and CODESET], am_cv_langinfo_codeset, AC_CACHE_CHECK([for nl_langinfo and CODESET], [am_cv_langinfo_codeset],
[AC_TRY_LINK([#include <langinfo.h>], [AC_TRY_LINK([#include <langinfo.h>],
[char* cs = nl_langinfo(CODESET); return !cs;], [char* cs = nl_langinfo(CODESET); return !cs;],
am_cv_langinfo_codeset=yes, [am_cv_langinfo_codeset=yes],
am_cv_langinfo_codeset=no) [am_cv_langinfo_codeset=no])
]) ])
if test $am_cv_langinfo_codeset = yes; then if test $am_cv_langinfo_codeset = yes; then
AC_DEFINE(HAVE_LANGINFO_CODESET, 1, AC_DEFINE([HAVE_LANGINFO_CODESET], [1],
[Define if you have <langinfo.h> and nl_langinfo(CODESET).]) [Define if you have <langinfo.h> and nl_langinfo(CODESET).])
fi fi
]) ])

81
m4/fcntl-o.m4 Normal file
View File

@ -0,0 +1,81 @@
# fcntl-o.m4 serial 1
dnl Copyright (C) 2006, 2009-2010 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved.
dnl Written by Paul Eggert.
# Test whether the flags O_NOATIME and O_NOFOLLOW actually work.
# Define HAVE_WORKING_O_NOATIME to 1 if O_NOATIME works, or to 0 otherwise.
# Define HAVE_WORKING_O_NOFOLLOW to 1 if O_NOFOLLOW works, or to 0 otherwise.
AC_DEFUN([gl_FCNTL_O_FLAGS],
[
dnl Persuade glibc <fcntl.h> to define O_NOATIME and O_NOFOLLOW.
AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
AC_CACHE_CHECK([for working fcntl.h], [gl_cv_header_working_fcntl_h],
[AC_RUN_IFELSE(
[AC_LANG_PROGRAM(
[[#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#ifndef O_NOATIME
#define O_NOATIME 0
#endif
#ifndef O_NOFOLLOW
#define O_NOFOLLOW 0
#endif
static int const constants[] =
{
O_CREAT, O_EXCL, O_NOCTTY, O_TRUNC, O_APPEND,
O_NONBLOCK, O_SYNC, O_ACCMODE, O_RDONLY, O_RDWR, O_WRONLY
};
]],
[[
int status = !constants;
{
static char const sym[] = "conftest.sym";
if (symlink (".", sym) != 0
|| close (open (sym, O_RDONLY | O_NOFOLLOW)) == 0)
status |= 32;
unlink (sym);
}
{
static char const file[] = "confdefs.h";
int fd = open (file, O_RDONLY | O_NOATIME);
char c;
struct stat st0, st1;
if (fd < 0
|| fstat (fd, &st0) != 0
|| sleep (1) != 0
|| read (fd, &c, 1) != 1
|| close (fd) != 0
|| stat (file, &st1) != 0
|| st0.st_atime != st1.st_atime)
status |= 64;
}
return status;]])],
[gl_cv_header_working_fcntl_h=yes],
[case $? in #(
32) gl_cv_header_working_fcntl_h='no (bad O_NOFOLLOW)';; #(
64) gl_cv_header_working_fcntl_h='no (bad O_NOATIME)';; #(
96) gl_cv_header_working_fcntl_h='no (bad O_NOATIME, O_NOFOLLOW)';; #(
*) gl_cv_header_working_fcntl_h='no';;
esac],
[gl_cv_header_working_fcntl_h=cross-compiling])])
case $gl_cv_header_working_fcntl_h in #(
*O_NOATIME* | no | cross-compiling) ac_val=0;; #(
*) ac_val=1;;
esac
AC_DEFINE_UNQUOTED([HAVE_WORKING_O_NOATIME], [$ac_val],
[Define to 1 if O_NOATIME works.])
case $gl_cv_header_working_fcntl_h in #(
*O_NOFOLLOW* | no | cross-compiling) ac_val=0;; #(
*) ac_val=1;;
esac
AC_DEFINE_UNQUOTED([HAVE_WORKING_O_NOFOLLOW], [$ac_val],
[Define to 1 if O_NOFOLLOW works.])
])

View File

@ -1,5 +1,5 @@
# gettext.m4 serial 59 (gettext-0.16.1) # gettext.m4 serial 63 (gettext-0.18)
dnl Copyright (C) 1995-2006 Free Software Foundation, Inc. dnl Copyright (C) 1995-2010 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it, dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved. dnl with or without modifications, as long as this notice is preserved.
@ -15,7 +15,7 @@ dnl They are *not* in the public domain.
dnl Authors: dnl Authors:
dnl Ulrich Drepper <drepper@cygnus.com>, 1995-2000. dnl Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
dnl Bruno Haible <haible@clisp.cons.org>, 2000-2006. dnl Bruno Haible <haible@clisp.cons.org>, 2000-2006, 2008-2010.
dnl Macro to add for using GNU gettext. dnl Macro to add for using GNU gettext.
@ -60,6 +60,8 @@ AC_DEFUN([AM_GNU_GETTEXT],
ifelse([$1], [], , [ifelse([$1], [external], , [ifelse([$1], [no-libtool], , [ifelse([$1], [use-libtool], , ifelse([$1], [], , [ifelse([$1], [external], , [ifelse([$1], [no-libtool], , [ifelse([$1], [use-libtool], ,
[errprint([ERROR: invalid first argument to AM_GNU_GETTEXT [errprint([ERROR: invalid first argument to AM_GNU_GETTEXT
])])])])]) ])])])])])
ifelse(ifelse([$1], [], [old])[]ifelse([$1], [no-libtool], [old]), [old],
[AC_DIAGNOSE([obsolete], [Use of AM_GNU_GETTEXT without [external] argument is deprecated.])])
ifelse([$2], [], , [ifelse([$2], [need-ngettext], , [ifelse([$2], [need-formatstring-macros], , ifelse([$2], [], , [ifelse([$2], [need-ngettext], , [ifelse([$2], [need-formatstring-macros], ,
[errprint([ERROR: invalid second argument to AM_GNU_GETTEXT [errprint([ERROR: invalid second argument to AM_GNU_GETTEXT
])])])]) ])])])])
@ -123,11 +125,11 @@ AC_DEFUN([AM_GNU_GETTEXT],
gt_use_preinstalled_gnugettext=no gt_use_preinstalled_gnugettext=no
ifelse(gt_included_intl, yes, [ ifelse(gt_included_intl, yes, [
AC_MSG_CHECKING([whether included gettext is requested]) AC_MSG_CHECKING([whether included gettext is requested])
AC_ARG_WITH(included-gettext, AC_ARG_WITH([included-gettext],
[ --with-included-gettext use the GNU gettext library included here], [ --with-included-gettext use the GNU gettext library included here],
nls_cv_force_use_gnu_gettext=$withval, nls_cv_force_use_gnu_gettext=$withval,
nls_cv_force_use_gnu_gettext=no) nls_cv_force_use_gnu_gettext=no)
AC_MSG_RESULT($nls_cv_force_use_gnu_gettext) AC_MSG_RESULT([$nls_cv_force_use_gnu_gettext])
nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext" nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext"
if test "$nls_cv_force_use_gnu_gettext" != "yes"; then if test "$nls_cv_force_use_gnu_gettext" != "yes"; then
@ -267,7 +269,7 @@ return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_a
if test "$gt_use_preinstalled_gnugettext" = "yes" \ if test "$gt_use_preinstalled_gnugettext" = "yes" \
|| test "$nls_cv_use_gnu_gettext" = "yes"; then || test "$nls_cv_use_gnu_gettext" = "yes"; then
AC_DEFINE(ENABLE_NLS, 1, AC_DEFINE([ENABLE_NLS], [1],
[Define to 1 if translation of program messages to the user's native language [Define to 1 if translation of program messages to the user's native language
is requested.]) is requested.])
else else
@ -301,9 +303,9 @@ return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_a
fi fi
dnl For backward compatibility. Some packages may be using this. dnl For backward compatibility. Some packages may be using this.
AC_DEFINE(HAVE_GETTEXT, 1, AC_DEFINE([HAVE_GETTEXT], [1],
[Define if the GNU gettext() function is already present or preinstalled.]) [Define if the GNU gettext() function is already present or preinstalled.])
AC_DEFINE(HAVE_DCGETTEXT, 1, AC_DEFINE([HAVE_DCGETTEXT], [1],
[Define if the GNU dcgettext() function is already present or preinstalled.]) [Define if the GNU dcgettext() function is already present or preinstalled.])
fi fi
@ -319,9 +321,9 @@ return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_a
fi fi
dnl Make all variables we use known to autoconf. dnl Make all variables we use known to autoconf.
AC_SUBST(BUILD_INCLUDED_LIBINTL) AC_SUBST([BUILD_INCLUDED_LIBINTL])
AC_SUBST(USE_INCLUDED_LIBINTL) AC_SUBST([USE_INCLUDED_LIBINTL])
AC_SUBST(CATOBJEXT) AC_SUBST([CATOBJEXT])
dnl For backward compatibility. Some configure.ins may be using this. dnl For backward compatibility. Some configure.ins may be using this.
nls_cv_header_intl= nls_cv_header_intl=
@ -329,74 +331,36 @@ return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_a
dnl For backward compatibility. Some Makefiles may be using this. dnl For backward compatibility. Some Makefiles may be using this.
DATADIRNAME=share DATADIRNAME=share
AC_SUBST(DATADIRNAME) AC_SUBST([DATADIRNAME])
dnl For backward compatibility. Some Makefiles may be using this. dnl For backward compatibility. Some Makefiles may be using this.
INSTOBJEXT=.mo INSTOBJEXT=.mo
AC_SUBST(INSTOBJEXT) AC_SUBST([INSTOBJEXT])
dnl For backward compatibility. Some Makefiles may be using this. dnl For backward compatibility. Some Makefiles may be using this.
GENCAT=gencat GENCAT=gencat
AC_SUBST(GENCAT) AC_SUBST([GENCAT])
dnl For backward compatibility. Some Makefiles may be using this. dnl For backward compatibility. Some Makefiles may be using this.
INTLOBJS= INTLOBJS=
if test "$USE_INCLUDED_LIBINTL" = yes; then if test "$USE_INCLUDED_LIBINTL" = yes; then
INTLOBJS="\$(GETTOBJS)" INTLOBJS="\$(GETTOBJS)"
fi fi
AC_SUBST(INTLOBJS) AC_SUBST([INTLOBJS])
dnl Enable libtool support if the surrounding package wishes it. dnl Enable libtool support if the surrounding package wishes it.
INTL_LIBTOOL_SUFFIX_PREFIX=gt_libtool_suffix_prefix INTL_LIBTOOL_SUFFIX_PREFIX=gt_libtool_suffix_prefix
AC_SUBST(INTL_LIBTOOL_SUFFIX_PREFIX) AC_SUBST([INTL_LIBTOOL_SUFFIX_PREFIX])
]) ])
dnl For backward compatibility. Some Makefiles may be using this. dnl For backward compatibility. Some Makefiles may be using this.
INTLLIBS="$LIBINTL" INTLLIBS="$LIBINTL"
AC_SUBST(INTLLIBS) AC_SUBST([INTLLIBS])
dnl Make all documented variables known to autoconf. dnl Make all documented variables known to autoconf.
AC_SUBST(LIBINTL) AC_SUBST([LIBINTL])
AC_SUBST(LTLIBINTL) AC_SUBST([LTLIBINTL])
AC_SUBST(POSUB) AC_SUBST([POSUB])
])
dnl Checks for special options needed on MacOS X.
dnl Defines INTL_MACOSX_LIBS.
AC_DEFUN([gt_INTL_MACOSX],
[
dnl Check for API introduced in MacOS X 10.2.
AC_CACHE_CHECK([for CFPreferencesCopyAppValue],
gt_cv_func_CFPreferencesCopyAppValue,
[gt_save_LIBS="$LIBS"
LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation"
AC_TRY_LINK([#include <CoreFoundation/CFPreferences.h>],
[CFPreferencesCopyAppValue(NULL, NULL)],
[gt_cv_func_CFPreferencesCopyAppValue=yes],
[gt_cv_func_CFPreferencesCopyAppValue=no])
LIBS="$gt_save_LIBS"])
if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then
AC_DEFINE([HAVE_CFPREFERENCESCOPYAPPVALUE], 1,
[Define to 1 if you have the MacOS X function CFPreferencesCopyAppValue in the CoreFoundation framework.])
fi
dnl Check for API introduced in MacOS X 10.3.
AC_CACHE_CHECK([for CFLocaleCopyCurrent], gt_cv_func_CFLocaleCopyCurrent,
[gt_save_LIBS="$LIBS"
LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation"
AC_TRY_LINK([#include <CoreFoundation/CFLocale.h>], [CFLocaleCopyCurrent();],
[gt_cv_func_CFLocaleCopyCurrent=yes],
[gt_cv_func_CFLocaleCopyCurrent=no])
LIBS="$gt_save_LIBS"])
if test $gt_cv_func_CFLocaleCopyCurrent = yes; then
AC_DEFINE([HAVE_CFLOCALECOPYCURRENT], 1,
[Define to 1 if you have the MacOS X function CFLocaleCopyCurrent in the CoreFoundation framework.])
fi
INTL_MACOSX_LIBS=
if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then
INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation"
fi
AC_SUBST([INTL_MACOSX_LIBS])
]) ])

View File

@ -1,5 +1,5 @@
# glibc2.m4 serial 1 # glibc2.m4 serial 2
dnl Copyright (C) 2000-2002, 2004 Free Software Foundation, Inc. dnl Copyright (C) 2000-2002, 2004, 2008-2010 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it, dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved. dnl with or without modifications, as long as this notice is preserved.
@ -9,22 +9,22 @@ dnl with or without modifications, as long as this notice is preserved.
AC_DEFUN([gt_GLIBC2], AC_DEFUN([gt_GLIBC2],
[ [
AC_CACHE_CHECK(whether we are using the GNU C Library 2 or newer, AC_CACHE_CHECK([whether we are using the GNU C Library 2 or newer],
ac_cv_gnu_library_2, [ac_cv_gnu_library_2],
[AC_EGREP_CPP([Lucky GNU user], [AC_EGREP_CPP([Lucky GNU user],
[ [
#include <features.h> #include <features.h>
#ifdef __GNU_LIBRARY__ #ifdef __GNU_LIBRARY__
#if (__GLIBC__ >= 2) #if (__GLIBC__ >= 2)
Lucky GNU user Lucky GNU user
#endif #endif
#endif #endif
], ],
ac_cv_gnu_library_2=yes, [ac_cv_gnu_library_2=yes],
ac_cv_gnu_library_2=no) [ac_cv_gnu_library_2=no])
] ]
) )
AC_SUBST(GLIBC2) AC_SUBST([GLIBC2])
GLIBC2="$ac_cv_gnu_library_2" GLIBC2="$ac_cv_gnu_library_2"
] ]
) )

View File

@ -1,5 +1,5 @@
# glibc21.m4 serial 3 # glibc21.m4 serial 4
dnl Copyright (C) 2000-2002, 2004 Free Software Foundation, Inc. dnl Copyright (C) 2000-2002, 2004, 2008-2010 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it, dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved. dnl with or without modifications, as long as this notice is preserved.
@ -9,22 +9,22 @@ dnl with or without modifications, as long as this notice is preserved.
AC_DEFUN([gl_GLIBC21], AC_DEFUN([gl_GLIBC21],
[ [
AC_CACHE_CHECK(whether we are using the GNU C Library 2.1 or newer, AC_CACHE_CHECK([whether we are using the GNU C Library 2.1 or newer],
ac_cv_gnu_library_2_1, [ac_cv_gnu_library_2_1],
[AC_EGREP_CPP([Lucky GNU user], [AC_EGREP_CPP([Lucky GNU user],
[ [
#include <features.h> #include <features.h>
#ifdef __GNU_LIBRARY__ #ifdef __GNU_LIBRARY__
#if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2) #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2)
Lucky GNU user Lucky GNU user
#endif #endif
#endif #endif
], ],
ac_cv_gnu_library_2_1=yes, [ac_cv_gnu_library_2_1=yes],
ac_cv_gnu_library_2_1=no) [ac_cv_gnu_library_2_1=no])
] ]
) )
AC_SUBST(GLIBC21) AC_SUBST([GLIBC21])
GLIBC21="$ac_cv_gnu_library_2_1" GLIBC21="$ac_cv_gnu_library_2_1"
] ]
) )

View File

@ -1,5 +1,5 @@
# iconv.m4 serial AM4 (gettext-0.11.3) # iconv.m4 serial 11 (gettext-0.18.1)
dnl Copyright (C) 2000-2002 Free Software Foundation, Inc. dnl Copyright (C) 2000-2002, 2007-2010 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it, dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved. dnl with or without modifications, as long as this notice is preserved.
@ -21,6 +21,7 @@ AC_DEFUN([AM_ICONV_LINK],
[ [
dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and
dnl those with the standalone portable GNU libiconv installed). dnl those with the standalone portable GNU libiconv installed).
AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV
dnl accordingly. dnl accordingly.
@ -33,7 +34,7 @@ AC_DEFUN([AM_ICONV_LINK],
am_save_CPPFLAGS="$CPPFLAGS" am_save_CPPFLAGS="$CPPFLAGS"
AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV]) AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV])
AC_CACHE_CHECK(for iconv, am_cv_func_iconv, [ AC_CACHE_CHECK([for iconv], [am_cv_func_iconv], [
am_cv_func_iconv="no, consider installing GNU libiconv" am_cv_func_iconv="no, consider installing GNU libiconv"
am_cv_lib_iconv=no am_cv_lib_iconv=no
AC_TRY_LINK([#include <stdlib.h> AC_TRY_LINK([#include <stdlib.h>
@ -41,7 +42,7 @@ AC_DEFUN([AM_ICONV_LINK],
[iconv_t cd = iconv_open("",""); [iconv_t cd = iconv_open("","");
iconv(cd,NULL,NULL,NULL,NULL); iconv(cd,NULL,NULL,NULL,NULL);
iconv_close(cd);], iconv_close(cd);],
am_cv_func_iconv=yes) [am_cv_func_iconv=yes])
if test "$am_cv_func_iconv" != yes; then if test "$am_cv_func_iconv" != yes; then
am_save_LIBS="$LIBS" am_save_LIBS="$LIBS"
LIBS="$LIBS $LIBICONV" LIBS="$LIBS $LIBICONV"
@ -50,13 +51,110 @@ AC_DEFUN([AM_ICONV_LINK],
[iconv_t cd = iconv_open("",""); [iconv_t cd = iconv_open("","");
iconv(cd,NULL,NULL,NULL,NULL); iconv(cd,NULL,NULL,NULL,NULL);
iconv_close(cd);], iconv_close(cd);],
am_cv_lib_iconv=yes [am_cv_lib_iconv=yes]
am_cv_func_iconv=yes) [am_cv_func_iconv=yes])
LIBS="$am_save_LIBS" LIBS="$am_save_LIBS"
fi fi
]) ])
if test "$am_cv_func_iconv" = yes; then if test "$am_cv_func_iconv" = yes; then
AC_DEFINE(HAVE_ICONV, 1, [Define if you have the iconv() function.]) AC_CACHE_CHECK([for working iconv], [am_cv_func_iconv_works], [
dnl This tests against bugs in AIX 5.1, HP-UX 11.11, Solaris 10.
am_save_LIBS="$LIBS"
if test $am_cv_lib_iconv = yes; then
LIBS="$LIBS $LIBICONV"
fi
AC_TRY_RUN([
#include <iconv.h>
#include <string.h>
int main ()
{
/* Test against AIX 5.1 bug: Failures are not distinguishable from successful
returns. */
{
iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8");
if (cd_utf8_to_88591 != (iconv_t)(-1))
{
static const char input[] = "\342\202\254"; /* EURO SIGN */
char buf[10];
const char *inptr = input;
size_t inbytesleft = strlen (input);
char *outptr = buf;
size_t outbytesleft = sizeof (buf);
size_t res = iconv (cd_utf8_to_88591,
(char **) &inptr, &inbytesleft,
&outptr, &outbytesleft);
if (res == 0)
return 1;
}
}
/* Test against Solaris 10 bug: Failures are not distinguishable from
successful returns. */
{
iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646");
if (cd_ascii_to_88591 != (iconv_t)(-1))
{
static const char input[] = "\263";
char buf[10];
const char *inptr = input;
size_t inbytesleft = strlen (input);
char *outptr = buf;
size_t outbytesleft = sizeof (buf);
size_t res = iconv (cd_ascii_to_88591,
(char **) &inptr, &inbytesleft,
&outptr, &outbytesleft);
if (res == 0)
return 1;
}
}
#if 0 /* This bug could be worked around by the caller. */
/* Test against HP-UX 11.11 bug: Positive return value instead of 0. */
{
iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591");
if (cd_88591_to_utf8 != (iconv_t)(-1))
{
static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
char buf[50];
const char *inptr = input;
size_t inbytesleft = strlen (input);
char *outptr = buf;
size_t outbytesleft = sizeof (buf);
size_t res = iconv (cd_88591_to_utf8,
(char **) &inptr, &inbytesleft,
&outptr, &outbytesleft);
if ((int)res > 0)
return 1;
}
}
#endif
/* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is
provided. */
if (/* Try standardized names. */
iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1)
/* Try IRIX, OSF/1 names. */
&& iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1)
/* Try AIX names. */
&& iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1)
/* Try HP-UX names. */
&& iconv_open ("utf8", "eucJP") == (iconv_t)(-1))
return 1;
return 0;
}], [am_cv_func_iconv_works=yes], [am_cv_func_iconv_works=no],
[case "$host_os" in
aix* | hpux*) am_cv_func_iconv_works="guessing no" ;;
*) am_cv_func_iconv_works="guessing yes" ;;
esac])
LIBS="$am_save_LIBS"
])
case "$am_cv_func_iconv_works" in
*no) am_func_iconv=no am_cv_lib_iconv=no ;;
*) am_func_iconv=yes ;;
esac
else
am_func_iconv=no am_cv_lib_iconv=no
fi
if test "$am_func_iconv" = yes; then
AC_DEFINE([HAVE_ICONV], [1],
[Define if you have the iconv() function and it works.])
fi fi
if test "$am_cv_lib_iconv" = yes; then if test "$am_cv_lib_iconv" = yes; then
AC_MSG_CHECKING([how to link with libiconv]) AC_MSG_CHECKING([how to link with libiconv])
@ -68,16 +166,31 @@ AC_DEFUN([AM_ICONV_LINK],
LIBICONV= LIBICONV=
LTLIBICONV= LTLIBICONV=
fi fi
AC_SUBST(LIBICONV) AC_SUBST([LIBICONV])
AC_SUBST(LTLIBICONV) AC_SUBST([LTLIBICONV])
]) ])
AC_DEFUN([AM_ICONV], dnl Define AM_ICONV using AC_DEFUN_ONCE for Autoconf >= 2.64, in order to
dnl avoid warnings like
dnl "warning: AC_REQUIRE: `AM_ICONV' was expanded before it was required".
dnl This is tricky because of the way 'aclocal' is implemented:
dnl - It requires defining an auxiliary macro whose name ends in AC_DEFUN.
dnl Otherwise aclocal's initial scan pass would miss the macro definition.
dnl - It requires a line break inside the AC_DEFUN_ONCE and AC_DEFUN expansions.
dnl Otherwise aclocal would emit many "Use of uninitialized value $1"
dnl warnings.
m4_define([gl_iconv_AC_DEFUN],
m4_version_prereq([2.64],
[[AC_DEFUN_ONCE(
[$1], [$2])]],
[[AC_DEFUN(
[$1], [$2])]]))
gl_iconv_AC_DEFUN([AM_ICONV],
[ [
AM_ICONV_LINK AM_ICONV_LINK
if test "$am_cv_func_iconv" = yes; then if test "$am_cv_func_iconv" = yes; then
AC_MSG_CHECKING([for iconv declaration]) AC_MSG_CHECKING([for iconv declaration])
AC_CACHE_VAL(am_cv_proto_iconv, [ AC_CACHE_VAL([am_cv_proto_iconv], [
AC_TRY_COMPILE([ AC_TRY_COMPILE([
#include <stdlib.h> #include <stdlib.h>
#include <iconv.h> #include <iconv.h>
@ -90,12 +203,12 @@ size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, si
#else #else
size_t iconv(); size_t iconv();
#endif #endif
], [], am_cv_proto_iconv_arg1="", am_cv_proto_iconv_arg1="const") ], [], [am_cv_proto_iconv_arg1=""], [am_cv_proto_iconv_arg1="const"])
am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"]) am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"])
am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'`
AC_MSG_RESULT([$]{ac_t:- AC_MSG_RESULT([
}[$]am_cv_proto_iconv) $am_cv_proto_iconv])
AC_DEFINE_UNQUOTED(ICONV_CONST, $am_cv_proto_iconv_arg1, AC_DEFINE_UNQUOTED([ICONV_CONST], [$am_cv_proto_iconv_arg1],
[Define as const if the declaration of iconv() needs const.]) [Define as const if the declaration of iconv() needs const.])
fi fi
]) ])

View File

@ -1,5 +1,5 @@
# intdiv0.m4 serial 1 (gettext-0.11.3) # intdiv0.m4 serial 3 (gettext-0.18)
dnl Copyright (C) 2002 Free Software Foundation, Inc. dnl Copyright (C) 2002, 2007-2010 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it, dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved. dnl with or without modifications, as long as this notice is preserved.
@ -14,16 +14,27 @@ AC_DEFUN([gt_INTDIV0],
AC_CACHE_CHECK([whether integer division by zero raises SIGFPE], AC_CACHE_CHECK([whether integer division by zero raises SIGFPE],
gt_cv_int_divbyzero_sigfpe, gt_cv_int_divbyzero_sigfpe,
[ [
AC_TRY_RUN([ gt_cv_int_divbyzero_sigfpe=
changequote(,)dnl
case "$host_os" in
macos* | darwin[6-9]* | darwin[1-9][0-9]*)
# On MacOS X 10.2 or newer, just assume the same as when cross-
# compiling. If we were to perform the real test, 1 Crash Report
# dialog window would pop up.
case "$host_cpu" in
i[34567]86 | x86_64)
gt_cv_int_divbyzero_sigfpe="guessing yes" ;;
esac
;;
esac
changequote([,])dnl
if test -z "$gt_cv_int_divbyzero_sigfpe"; then
AC_TRY_RUN([
#include <stdlib.h> #include <stdlib.h>
#include <signal.h> #include <signal.h>
static void static void
#ifdef __cplusplus
sigfpe_handler (int sig) sigfpe_handler (int sig)
#else
sigfpe_handler (sig) int sig;
#endif
{ {
/* Exit with code 0 if SIGFPE, with code 1 if any other signal. */ /* Exit with code 0 if SIGFPE, with code 1 if any other signal. */
exit (sig != SIGFPE); exit (sig != SIGFPE);
@ -50,21 +61,24 @@ int main ()
nan = y / y; nan = y / y;
exit (1); exit (1);
} }
], gt_cv_int_divbyzero_sigfpe=yes, gt_cv_int_divbyzero_sigfpe=no, ], [gt_cv_int_divbyzero_sigfpe=yes], [gt_cv_int_divbyzero_sigfpe=no],
[ [
# Guess based on the CPU. # Guess based on the CPU.
case "$host_cpu" in changequote(,)dnl
alpha* | i[34567]86 | m68k | s390*) case "$host_cpu" in
gt_cv_int_divbyzero_sigfpe="guessing yes";; alpha* | i[34567]86 | x86_64 | m68k | s390*)
*) gt_cv_int_divbyzero_sigfpe="guessing yes";;
gt_cv_int_divbyzero_sigfpe="guessing no";; *)
esac gt_cv_int_divbyzero_sigfpe="guessing no";;
]) esac
changequote([,])dnl
])
fi
]) ])
case "$gt_cv_int_divbyzero_sigfpe" in case "$gt_cv_int_divbyzero_sigfpe" in
*yes) value=1;; *yes) value=1;;
*) value=0;; *) value=0;;
esac esac
AC_DEFINE_UNQUOTED(INTDIV0_RAISES_SIGFPE, $value, AC_DEFINE_UNQUOTED([INTDIV0_RAISES_SIGFPE], [$value],
[Define if integer division by zero raises signal SIGFPE.]) [Define if integer division by zero raises signal SIGFPE.])
]) ])

View File

@ -1,5 +1,5 @@
# intl.m4 serial 3 (gettext-0.16) # intl.m4 serial 17 (gettext-0.18)
dnl Copyright (C) 1995-2006 Free Software Foundation, Inc. dnl Copyright (C) 1995-2009 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it, dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved. dnl with or without modifications, as long as this notice is preserved.
@ -15,9 +15,9 @@ dnl They are *not* in the public domain.
dnl Authors: dnl Authors:
dnl Ulrich Drepper <drepper@cygnus.com>, 1995-2000. dnl Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
dnl Bruno Haible <haible@clisp.cons.org>, 2000-2006. dnl Bruno Haible <haible@clisp.cons.org>, 2000-2009.
AC_PREREQ(2.52) AC_PREREQ([2.52])
dnl Checks for all prerequisites of the intl subdirectory, dnl Checks for all prerequisites of the intl subdirectory,
dnl except for INTL_LIBTOOL_SUFFIX_PREFIX (and possibly LIBTOOL), INTLOBJS, dnl except for INTL_LIBTOOL_SUFFIX_PREFIX (and possibly LIBTOOL), INTLOBJS,
@ -33,7 +33,6 @@ AC_DEFUN([AM_INTL_SUBDIR],
AC_REQUIRE([gl_VISIBILITY])dnl AC_REQUIRE([gl_VISIBILITY])dnl
AC_REQUIRE([gt_INTL_SUBDIR_CORE])dnl AC_REQUIRE([gt_INTL_SUBDIR_CORE])dnl
AC_REQUIRE([AC_TYPE_LONG_LONG_INT])dnl AC_REQUIRE([AC_TYPE_LONG_LONG_INT])dnl
AC_REQUIRE([gt_TYPE_LONGDOUBLE])dnl
AC_REQUIRE([gt_TYPE_WCHAR_T])dnl AC_REQUIRE([gt_TYPE_WCHAR_T])dnl
AC_REQUIRE([gt_TYPE_WINT_T])dnl AC_REQUIRE([gt_TYPE_WINT_T])dnl
AC_REQUIRE([gl_AC_HEADER_INTTYPES_H]) AC_REQUIRE([gl_AC_HEADER_INTTYPES_H])
@ -41,14 +40,24 @@ AC_DEFUN([AM_INTL_SUBDIR],
AC_REQUIRE([gt_PRINTF_POSIX]) AC_REQUIRE([gt_PRINTF_POSIX])
AC_REQUIRE([gl_GLIBC21])dnl AC_REQUIRE([gl_GLIBC21])dnl
AC_REQUIRE([gl_XSIZE])dnl AC_REQUIRE([gl_XSIZE])dnl
AC_REQUIRE([gl_FCNTL_O_FLAGS])dnl
AC_REQUIRE([gt_INTL_MACOSX])dnl AC_REQUIRE([gt_INTL_MACOSX])dnl
dnl Support for automake's --enable-silent-rules.
case "$enable_silent_rules" in
yes) INTL_DEFAULT_VERBOSITY=0;;
no) INTL_DEFAULT_VERBOSITY=1;;
*) INTL_DEFAULT_VERBOSITY=1;;
esac
AC_SUBST([INTL_DEFAULT_VERBOSITY])
AC_CHECK_TYPE([ptrdiff_t], , AC_CHECK_TYPE([ptrdiff_t], ,
[AC_DEFINE([ptrdiff_t], [long], [AC_DEFINE([ptrdiff_t], [long],
[Define as the type of the result of subtracting two pointers, if the system doesn't define it.]) [Define as the type of the result of subtracting two pointers, if the system doesn't define it.])
]) ])
AC_CHECK_HEADERS([stddef.h stdlib.h string.h]) AC_CHECK_HEADERS([stddef.h stdlib.h string.h])
AC_CHECK_FUNCS([asprintf fwprintf putenv setenv setlocale snprintf wcslen]) AC_CHECK_FUNCS([asprintf fwprintf newlocale putenv setenv setlocale \
snprintf strnlen wcslen wcsnlen mbrtowc wcrtomb])
dnl Use the _snprintf function only if it is declared (because on NetBSD it dnl Use the _snprintf function only if it is declared (because on NetBSD it
dnl is defined as a weak alias of snprintf; we prefer to use the latter). dnl is defined as a weak alias of snprintf; we prefer to use the latter).
@ -79,6 +88,12 @@ AC_DEFUN([AM_INTL_SUBDIR],
HAVE_SNPRINTF=0 HAVE_SNPRINTF=0
fi fi
AC_SUBST([HAVE_SNPRINTF]) AC_SUBST([HAVE_SNPRINTF])
if test "$ac_cv_func_newlocale" = yes; then
HAVE_NEWLOCALE=1
else
HAVE_NEWLOCALE=0
fi
AC_SUBST([HAVE_NEWLOCALE])
if test "$ac_cv_func_wprintf" = yes; then if test "$ac_cv_func_wprintf" = yes; then
HAVE_WPRINTF=1 HAVE_WPRINTF=1
else else
@ -98,7 +113,7 @@ AC_DEFUN([AM_INTL_SUBDIR],
dnl exported variables _also_ in the static library. dnl exported variables _also_ in the static library.
if test "$enable_shared" = yes; then if test "$enable_shared" = yes; then
case "$host_os" in case "$host_os" in
cygwin*) is_woe32dll=yes ;; mingw* | cygwin*) is_woe32dll=yes ;;
*) is_woe32dll=no ;; *) is_woe32dll=no ;;
esac esac
else else
@ -107,6 +122,31 @@ AC_DEFUN([AM_INTL_SUBDIR],
WOE32DLL=$is_woe32dll WOE32DLL=$is_woe32dll
AC_SUBST([WOE32DLL]) AC_SUBST([WOE32DLL])
dnl On mingw and Cygwin, we can activate special Makefile rules which add
dnl version information to the shared libraries and executables.
case "$host_os" in
mingw* | cygwin*) is_woe32=yes ;;
*) is_woe32=no ;;
esac
WOE32=$is_woe32
AC_SUBST([WOE32])
if test $WOE32 = yes; then
dnl Check for a program that compiles Windows resource files.
AC_CHECK_TOOL([WINDRES], [windres])
fi
dnl Determine whether when creating a library, "-lc" should be passed to
dnl libtool or not. On many platforms, it is required for the libtool option
dnl -no-undefined to work. On HP-UX, however, the -lc - stored by libtool
dnl in the *.la files - makes it impossible to create multithreaded programs,
dnl because libtool also reorders the -lc to come before the -pthread, and
dnl this disables pthread_create() <http://docs.hp.com/en/1896/pthreads.html>.
case "$host_os" in
hpux*) LTLIBC="" ;;
*) LTLIBC="-lc" ;;
esac
AC_SUBST([LTLIBC])
dnl Rename some macros and functions used for locking. dnl Rename some macros and functions used for locking.
AH_BOTTOM([ AH_BOTTOM([
#define __libc_lock_t gl_lock_t #define __libc_lock_t gl_lock_t
@ -122,22 +162,31 @@ AC_DEFUN([AM_INTL_SUBDIR],
#define __libc_lock_lock_recursive gl_recursive_lock_lock #define __libc_lock_lock_recursive gl_recursive_lock_lock
#define __libc_lock_unlock_recursive gl_recursive_lock_unlock #define __libc_lock_unlock_recursive gl_recursive_lock_unlock
#define glthread_in_use libintl_thread_in_use #define glthread_in_use libintl_thread_in_use
#define glthread_lock_init libintl_lock_init #define glthread_lock_init_func libintl_lock_init_func
#define glthread_lock_lock libintl_lock_lock #define glthread_lock_lock_func libintl_lock_lock_func
#define glthread_lock_unlock libintl_lock_unlock #define glthread_lock_unlock_func libintl_lock_unlock_func
#define glthread_lock_destroy libintl_lock_destroy #define glthread_lock_destroy_func libintl_lock_destroy_func
#define glthread_rwlock_init libintl_rwlock_init #define glthread_rwlock_init_multithreaded libintl_rwlock_init_multithreaded
#define glthread_rwlock_rdlock libintl_rwlock_rdlock #define glthread_rwlock_init_func libintl_rwlock_init_func
#define glthread_rwlock_wrlock libintl_rwlock_wrlock #define glthread_rwlock_rdlock_multithreaded libintl_rwlock_rdlock_multithreaded
#define glthread_rwlock_unlock libintl_rwlock_unlock #define glthread_rwlock_rdlock_func libintl_rwlock_rdlock_func
#define glthread_rwlock_destroy libintl_rwlock_destroy #define glthread_rwlock_wrlock_multithreaded libintl_rwlock_wrlock_multithreaded
#define glthread_recursive_lock_init libintl_recursive_lock_init #define glthread_rwlock_wrlock_func libintl_rwlock_wrlock_func
#define glthread_recursive_lock_lock libintl_recursive_lock_lock #define glthread_rwlock_unlock_multithreaded libintl_rwlock_unlock_multithreaded
#define glthread_recursive_lock_unlock libintl_recursive_lock_unlock #define glthread_rwlock_unlock_func libintl_rwlock_unlock_func
#define glthread_recursive_lock_destroy libintl_recursive_lock_destroy #define glthread_rwlock_destroy_multithreaded libintl_rwlock_destroy_multithreaded
#define glthread_once libintl_once #define glthread_rwlock_destroy_func libintl_rwlock_destroy_func
#define glthread_once_call libintl_once_call #define glthread_recursive_lock_init_multithreaded libintl_recursive_lock_init_multithreaded
#define glthread_recursive_lock_init_func libintl_recursive_lock_init_func
#define glthread_recursive_lock_lock_multithreaded libintl_recursive_lock_lock_multithreaded
#define glthread_recursive_lock_lock_func libintl_recursive_lock_lock_func
#define glthread_recursive_lock_unlock_multithreaded libintl_recursive_lock_unlock_multithreaded
#define glthread_recursive_lock_unlock_func libintl_recursive_lock_unlock_func
#define glthread_recursive_lock_destroy_multithreaded libintl_recursive_lock_destroy_multithreaded
#define glthread_recursive_lock_destroy_func libintl_recursive_lock_destroy_func
#define glthread_once_func libintl_once_func
#define glthread_once_singlethreaded libintl_once_singlethreaded #define glthread_once_singlethreaded libintl_once_singlethreaded
#define glthread_once_multithreaded libintl_once_multithreaded
]) ])
]) ])
@ -174,38 +223,24 @@ AC_DEFUN([gt_INTL_SUBDIR_CORE],
AC_TRY_LINK( AC_TRY_LINK(
[int foo (int a) { a = __builtin_expect (a, 10); return a == 10 ? 0 : 1; }], [int foo (int a) { a = __builtin_expect (a, 10); return a == 10 ? 0 : 1; }],
[], [],
[AC_DEFINE([HAVE_BUILTIN_EXPECT], 1, [AC_DEFINE([HAVE_BUILTIN_EXPECT], [1],
[Define to 1 if the compiler understands __builtin_expect.])]) [Define to 1 if the compiler understands __builtin_expect.])])
AC_CHECK_HEADERS([argz.h inttypes.h limits.h unistd.h sys/param.h]) AC_CHECK_HEADERS([argz.h inttypes.h limits.h unistd.h sys/param.h])
AC_CHECK_FUNCS([getcwd getegid geteuid getgid getuid mempcpy munmap \ AC_CHECK_FUNCS([getcwd getegid geteuid getgid getuid mempcpy munmap \
stpcpy strcasecmp strdup strtoul tsearch argz_count argz_stringify \ stpcpy strcasecmp strdup strtoul tsearch uselocale argz_count \
argz_next __fsetlocking]) argz_stringify argz_next __fsetlocking])
dnl Use the *_unlocked functions only if they are declared. dnl Use the *_unlocked functions only if they are declared.
dnl (because some of them were defined without being declared in Solaris dnl (because some of them were defined without being declared in Solaris
dnl 2.5.1 but were removed in Solaris 2.6, whereas we want binaries built dnl 2.5.1 but were removed in Solaris 2.6, whereas we want binaries built
dnl on Solaris 2.5.1 to run on Solaris 2.6). dnl on Solaris 2.5.1 to run on Solaris 2.6).
dnl Don't use AC_CHECK_DECLS because it isn't supported in autoconf-2.13. dnl Don't use AC_CHECK_DECLS because it isn't supported in autoconf-2.13.
gt_CHECK_DECL(feof_unlocked, [#include <stdio.h>]) gt_CHECK_DECL([feof_unlocked], [#include <stdio.h>])
gt_CHECK_DECL(fgets_unlocked, [#include <stdio.h>]) gt_CHECK_DECL([fgets_unlocked], [#include <stdio.h>])
AM_ICONV AM_ICONV
dnl glibc >= 2.4 has a NL_LOCALE_NAME macro when _GNU_SOURCE is defined,
dnl and a _NL_LOCALE_NAME macro always.
AC_CACHE_CHECK([for NL_LOCALE_NAME macro], gt_cv_nl_locale_name,
[AC_TRY_LINK([#include <langinfo.h>
#include <locale.h>],
[char* cs = nl_langinfo(_NL_LOCALE_NAME(LC_MESSAGES));],
gt_cv_nl_locale_name=yes,
gt_cv_nl_locale_name=no)
])
if test $gt_cv_nl_locale_name = yes; then
AC_DEFINE(HAVE_NL_LOCALE_NAME, 1,
[Define if you have <langinfo.h> and it defines the NL_LOCALE_NAME macro if _GNU_SOURCE is defined.])
fi
dnl intl/plural.c is generated from intl/plural.y. It requires bison, dnl intl/plural.c is generated from intl/plural.y. It requires bison,
dnl because plural.y uses bison specific features. It requires at least dnl because plural.y uses bison specific features. It requires at least
dnl bison-1.26 because earlier versions generate a plural.c that doesn't dnl bison-1.26 because earlier versions generate a plural.c that doesn't
@ -243,7 +278,7 @@ dnl gt_CHECK_DECL(FUNC, INCLUDES)
dnl Check whether a function is declared. dnl Check whether a function is declared.
AC_DEFUN([gt_CHECK_DECL], AC_DEFUN([gt_CHECK_DECL],
[ [
AC_CACHE_CHECK([whether $1 is declared], ac_cv_have_decl_$1, AC_CACHE_CHECK([whether $1 is declared], [ac_cv_have_decl_$1],
[AC_TRY_COMPILE([$2], [ [AC_TRY_COMPILE([$2], [
#ifndef $1 #ifndef $1
char *p = (char *) $1; char *p = (char *) $1;

View File

@ -1,5 +1,5 @@
# intldir.m4 serial 1 (gettext-0.16) # intldir.m4 serial 2 (gettext-0.18)
dnl Copyright (C) 2006 Free Software Foundation, Inc. dnl Copyright (C) 2006, 2009-2010 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it, dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved. dnl with or without modifications, as long as this notice is preserved.
@ -13,7 +13,7 @@ dnl by the GNU Library General Public License, and the rest of the GNU
dnl gettext package package is covered by the GNU General Public License. dnl gettext package package is covered by the GNU General Public License.
dnl They are *not* in the public domain. dnl They are *not* in the public domain.
AC_PREREQ(2.52) AC_PREREQ([2.52])
dnl Tells the AM_GNU_GETTEXT macro to consider an intl/ directory. dnl Tells the AM_GNU_GETTEXT macro to consider an intl/ directory.
AC_DEFUN([AM_GNU_GETTEXT_INTL_SUBDIR], []) AC_DEFUN([AM_GNU_GETTEXT_INTL_SUBDIR], [])

51
m4/intlmacosx.m4 Normal file
View File

@ -0,0 +1,51 @@
# intlmacosx.m4 serial 3 (gettext-0.18)
dnl Copyright (C) 2004-2010 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved.
dnl
dnl This file can can be used in projects which are not available under
dnl the GNU General Public License or the GNU Library General Public
dnl License but which still want to provide support for the GNU gettext
dnl functionality.
dnl Please note that the actual code of the GNU gettext library is covered
dnl by the GNU Library General Public License, and the rest of the GNU
dnl gettext package package is covered by the GNU General Public License.
dnl They are *not* in the public domain.
dnl Checks for special options needed on MacOS X.
dnl Defines INTL_MACOSX_LIBS.
AC_DEFUN([gt_INTL_MACOSX],
[
dnl Check for API introduced in MacOS X 10.2.
AC_CACHE_CHECK([for CFPreferencesCopyAppValue],
[gt_cv_func_CFPreferencesCopyAppValue],
[gt_save_LIBS="$LIBS"
LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation"
AC_TRY_LINK([#include <CoreFoundation/CFPreferences.h>],
[CFPreferencesCopyAppValue(NULL, NULL)],
[gt_cv_func_CFPreferencesCopyAppValue=yes],
[gt_cv_func_CFPreferencesCopyAppValue=no])
LIBS="$gt_save_LIBS"])
if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then
AC_DEFINE([HAVE_CFPREFERENCESCOPYAPPVALUE], [1],
[Define to 1 if you have the MacOS X function CFPreferencesCopyAppValue in the CoreFoundation framework.])
fi
dnl Check for API introduced in MacOS X 10.3.
AC_CACHE_CHECK([for CFLocaleCopyCurrent], [gt_cv_func_CFLocaleCopyCurrent],
[gt_save_LIBS="$LIBS"
LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation"
AC_TRY_LINK([#include <CoreFoundation/CFLocale.h>], [CFLocaleCopyCurrent();],
[gt_cv_func_CFLocaleCopyCurrent=yes],
[gt_cv_func_CFLocaleCopyCurrent=no])
LIBS="$gt_save_LIBS"])
if test $gt_cv_func_CFLocaleCopyCurrent = yes; then
AC_DEFINE([HAVE_CFLOCALECOPYCURRENT], [1],
[Define to 1 if you have the MacOS X function CFLocaleCopyCurrent in the CoreFoundation framework.])
fi
INTL_MACOSX_LIBS=
if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then
INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation"
fi
AC_SUBST([INTL_MACOSX_LIBS])
])

View File

@ -1,5 +1,5 @@
# intmax.m4 serial 3 (gettext-0.16) # intmax.m4 serial 5 (gettext-0.18)
dnl Copyright (C) 2002-2005 Free Software Foundation, Inc. dnl Copyright (C) 2002-2005, 2008-2010 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it, dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved. dnl with or without modifications, as long as this notice is preserved.
@ -12,7 +12,7 @@ AC_DEFUN([gt_TYPE_INTMAX_T],
[ [
AC_REQUIRE([gl_AC_HEADER_INTTYPES_H]) AC_REQUIRE([gl_AC_HEADER_INTTYPES_H])
AC_REQUIRE([gl_AC_HEADER_STDINT_H]) AC_REQUIRE([gl_AC_HEADER_STDINT_H])
AC_CACHE_CHECK(for intmax_t, gt_cv_c_intmax_t, AC_CACHE_CHECK([for intmax_t], [gt_cv_c_intmax_t],
[AC_TRY_COMPILE([ [AC_TRY_COMPILE([
#include <stddef.h> #include <stddef.h>
#include <stdlib.h> #include <stdlib.h>
@ -24,10 +24,10 @@ AC_DEFUN([gt_TYPE_INTMAX_T],
#endif #endif
], [intmax_t x = -1; ], [intmax_t x = -1;
return !x;], return !x;],
gt_cv_c_intmax_t=yes, [gt_cv_c_intmax_t=yes],
gt_cv_c_intmax_t=no)]) [gt_cv_c_intmax_t=no])])
if test $gt_cv_c_intmax_t = yes; then if test $gt_cv_c_intmax_t = yes; then
AC_DEFINE(HAVE_INTMAX_T, 1, AC_DEFINE([HAVE_INTMAX_T], [1],
[Define if you have the 'intmax_t' type in <stdint.h> or <inttypes.h>.]) [Define if you have the 'intmax_t' type in <stdint.h> or <inttypes.h>.])
fi fi
]) ])

View File

@ -1,12 +1,12 @@
# inttypes-pri.m4 serial 4 (gettext-0.16) # inttypes-pri.m4 serial 6 (gettext-0.18)
dnl Copyright (C) 1997-2002, 2006 Free Software Foundation, Inc. dnl Copyright (C) 1997-2002, 2006, 2008-2010 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it, dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved. dnl with or without modifications, as long as this notice is preserved.
dnl From Bruno Haible. dnl From Bruno Haible.
AC_PREREQ(2.52) AC_PREREQ([2.52])
# Define PRI_MACROS_BROKEN if <inttypes.h> exists and defines the PRI* # Define PRI_MACROS_BROKEN if <inttypes.h> exists and defines the PRI*
# macros to non-string values. This is the case on AIX 4.3.3. # macros to non-string values. This is the case on AIX 4.3.3.
@ -16,17 +16,17 @@ AC_DEFUN([gt_INTTYPES_PRI],
AC_CHECK_HEADERS([inttypes.h]) AC_CHECK_HEADERS([inttypes.h])
if test $ac_cv_header_inttypes_h = yes; then if test $ac_cv_header_inttypes_h = yes; then
AC_CACHE_CHECK([whether the inttypes.h PRIxNN macros are broken], AC_CACHE_CHECK([whether the inttypes.h PRIxNN macros are broken],
gt_cv_inttypes_pri_broken, [gt_cv_inttypes_pri_broken],
[ [
AC_TRY_COMPILE([#include <inttypes.h> AC_TRY_COMPILE([#include <inttypes.h>
#ifdef PRId32 #ifdef PRId32
char *p = PRId32; char *p = PRId32;
#endif #endif
], [], gt_cv_inttypes_pri_broken=no, gt_cv_inttypes_pri_broken=yes) ], [], [gt_cv_inttypes_pri_broken=no], [gt_cv_inttypes_pri_broken=yes])
]) ])
fi fi
if test "$gt_cv_inttypes_pri_broken" = yes; then if test "$gt_cv_inttypes_pri_broken" = yes; then
AC_DEFINE_UNQUOTED(PRI_MACROS_BROKEN, 1, AC_DEFINE_UNQUOTED([PRI_MACROS_BROKEN], [1],
[Define if <inttypes.h> exists and defines unusable PRI* macros.]) [Define if <inttypes.h> exists and defines unusable PRI* macros.])
PRI_MACROS_BROKEN=1 PRI_MACROS_BROKEN=1
else else

View File

@ -1,5 +1,5 @@
# inttypes_h.m4 serial 7 # inttypes_h.m4 serial 9
dnl Copyright (C) 1997-2004, 2006 Free Software Foundation, Inc. dnl Copyright (C) 1997-2004, 2006, 2008-2010 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it, dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved. dnl with or without modifications, as long as this notice is preserved.
@ -11,15 +11,15 @@ dnl From Paul Eggert.
AC_DEFUN([gl_AC_HEADER_INTTYPES_H], AC_DEFUN([gl_AC_HEADER_INTTYPES_H],
[ [
AC_CACHE_CHECK([for inttypes.h], gl_cv_header_inttypes_h, AC_CACHE_CHECK([for inttypes.h], [gl_cv_header_inttypes_h],
[AC_TRY_COMPILE( [AC_TRY_COMPILE(
[#include <sys/types.h> [#include <sys/types.h>
#include <inttypes.h>], #include <inttypes.h>],
[uintmax_t i = (uintmax_t) -1; return !i;], [uintmax_t i = (uintmax_t) -1; return !i;],
gl_cv_header_inttypes_h=yes, [gl_cv_header_inttypes_h=yes],
gl_cv_header_inttypes_h=no)]) [gl_cv_header_inttypes_h=no])])
if test $gl_cv_header_inttypes_h = yes; then if test $gl_cv_header_inttypes_h = yes; then
AC_DEFINE_UNQUOTED(HAVE_INTTYPES_H_WITH_UINTMAX, 1, AC_DEFINE_UNQUOTED([HAVE_INTTYPES_H_WITH_UINTMAX], [1],
[Define if <inttypes.h> exists, doesn't clash with <sys/types.h>, [Define if <inttypes.h> exists, doesn't clash with <sys/types.h>,
and declares uintmax_t. ]) and declares uintmax_t. ])
fi fi

View File

@ -1,5 +1,6 @@
# lcmessage.m4 serial 4 (gettext-0.14.2) # lcmessage.m4 serial 6 (gettext-0.18)
dnl Copyright (C) 1995-2002, 2004-2005 Free Software Foundation, Inc. dnl Copyright (C) 1995-2002, 2004-2005, 2008-2010 Free Software Foundation,
dnl Inc.
dnl This file is free software; the Free Software Foundation dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it, dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved. dnl with or without modifications, as long as this notice is preserved.
@ -20,11 +21,11 @@ dnl Ulrich Drepper <drepper@cygnus.com>, 1995.
AC_DEFUN([gt_LC_MESSAGES], AC_DEFUN([gt_LC_MESSAGES],
[ [
AC_CACHE_CHECK([for LC_MESSAGES], gt_cv_val_LC_MESSAGES, AC_CACHE_CHECK([for LC_MESSAGES], [gt_cv_val_LC_MESSAGES],
[AC_TRY_LINK([#include <locale.h>], [return LC_MESSAGES], [AC_TRY_LINK([#include <locale.h>], [return LC_MESSAGES],
gt_cv_val_LC_MESSAGES=yes, gt_cv_val_LC_MESSAGES=no)]) [gt_cv_val_LC_MESSAGES=yes], [gt_cv_val_LC_MESSAGES=no])])
if test $gt_cv_val_LC_MESSAGES = yes; then if test $gt_cv_val_LC_MESSAGES = yes; then
AC_DEFINE(HAVE_LC_MESSAGES, 1, AC_DEFINE([HAVE_LC_MESSAGES], [1],
[Define if your <locale.h> file defines LC_MESSAGES.]) [Define if your <locale.h> file defines LC_MESSAGES.])
fi fi
]) ])

View File

@ -1,5 +1,5 @@
# lib-ld.m4 serial 3 (gettext-0.13) # lib-ld.m4 serial 4 (gettext-0.18)
dnl Copyright (C) 1996-2003 Free Software Foundation, Inc. dnl Copyright (C) 1996-2003, 2009-2010 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it, dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved. dnl with or without modifications, as long as this notice is preserved.
@ -10,7 +10,7 @@ dnl with libtool.m4.
dnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no. dnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no.
AC_DEFUN([AC_LIB_PROG_LD_GNU], AC_DEFUN([AC_LIB_PROG_LD_GNU],
[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], acl_cv_prog_gnu_ld, [AC_CACHE_CHECK([if the linker ($LD) is GNU ld], [acl_cv_prog_gnu_ld],
[# I'd rather use --version here, but apparently some GNU ld's only accept -v. [# I'd rather use --version here, but apparently some GNU ld's only accept -v.
case `$LD -v 2>&1 </dev/null` in case `$LD -v 2>&1 </dev/null` in
*GNU* | *'with BFD'*) *GNU* | *'with BFD'*)
@ -23,7 +23,7 @@ with_gnu_ld=$acl_cv_prog_gnu_ld
dnl From libtool-1.4. Sets the variable LD. dnl From libtool-1.4. Sets the variable LD.
AC_DEFUN([AC_LIB_PROG_LD], AC_DEFUN([AC_LIB_PROG_LD],
[AC_ARG_WITH(gnu-ld, [AC_ARG_WITH([gnu-ld],
[ --with-gnu-ld assume the C compiler uses GNU ld [default=no]], [ --with-gnu-ld assume the C compiler uses GNU ld [default=no]],
test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no) test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no)
AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_CC])dnl
@ -59,7 +59,7 @@ if test "$GCC" = yes; then
# Canonicalize the path of ld # Canonicalize the path of ld
ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'`
while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
done done
test -z "$LD" && LD="$ac_prog" test -z "$LD" && LD="$ac_prog"
;; ;;
@ -77,7 +77,7 @@ elif test "$with_gnu_ld" = yes; then
else else
AC_MSG_CHECKING([for non-GNU ld]) AC_MSG_CHECKING([for non-GNU ld])
fi fi
AC_CACHE_VAL(acl_cv_path_LD, AC_CACHE_VAL([acl_cv_path_LD],
[if test -z "$LD"; then [if test -z "$LD"; then
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}"
for ac_dir in $PATH; do for ac_dir in $PATH; do
@ -89,9 +89,9 @@ AC_CACHE_VAL(acl_cv_path_LD,
# Break only if it was the GNU/non-GNU ld that we prefer. # Break only if it was the GNU/non-GNU ld that we prefer.
case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in
*GNU* | *'with BFD'*) *GNU* | *'with BFD'*)
test "$with_gnu_ld" != no && break ;; test "$with_gnu_ld" != no && break ;;
*) *)
test "$with_gnu_ld" != yes && break ;; test "$with_gnu_ld" != yes && break ;;
esac esac
fi fi
done done
@ -101,9 +101,9 @@ else
fi]) fi])
LD="$acl_cv_path_LD" LD="$acl_cv_path_LD"
if test -n "$LD"; then if test -n "$LD"; then
AC_MSG_RESULT($LD) AC_MSG_RESULT([$LD])
else else
AC_MSG_RESULT(no) AC_MSG_RESULT([no])
fi fi
test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
AC_LIB_PROG_LD_GNU AC_LIB_PROG_LD_GNU

View File

@ -1,58 +1,66 @@
# lib-link.m4 serial 9 (gettext-0.16) # lib-link.m4 serial 21 (gettext-0.18)
dnl Copyright (C) 2001-2006 Free Software Foundation, Inc. dnl Copyright (C) 2001-2010 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it, dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved. dnl with or without modifications, as long as this notice is preserved.
dnl From Bruno Haible. dnl From Bruno Haible.
AC_PREREQ(2.50) AC_PREREQ([2.54])
dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and
dnl the libraries corresponding to explicit and implicit dependencies. dnl the libraries corresponding to explicit and implicit dependencies.
dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and
dnl augments the CPPFLAGS variable. dnl augments the CPPFLAGS variable.
dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname
dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem.
AC_DEFUN([AC_LIB_LINKFLAGS], AC_DEFUN([AC_LIB_LINKFLAGS],
[ [
AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
AC_REQUIRE([AC_LIB_RPATH]) AC_REQUIRE([AC_LIB_RPATH])
define([Name],[translit([$1],[./-], [___])]) pushdef([Name],[translit([$1],[./-], [___])])
define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], pushdef([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [ AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [
AC_LIB_LINKFLAGS_BODY([$1], [$2]) AC_LIB_LINKFLAGS_BODY([$1], [$2])
ac_cv_lib[]Name[]_libs="$LIB[]NAME" ac_cv_lib[]Name[]_libs="$LIB[]NAME"
ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME" ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME"
ac_cv_lib[]Name[]_cppflags="$INC[]NAME" ac_cv_lib[]Name[]_cppflags="$INC[]NAME"
ac_cv_lib[]Name[]_prefix="$LIB[]NAME[]_PREFIX"
]) ])
LIB[]NAME="$ac_cv_lib[]Name[]_libs" LIB[]NAME="$ac_cv_lib[]Name[]_libs"
LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs" LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs"
INC[]NAME="$ac_cv_lib[]Name[]_cppflags" INC[]NAME="$ac_cv_lib[]Name[]_cppflags"
LIB[]NAME[]_PREFIX="$ac_cv_lib[]Name[]_prefix"
AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
AC_SUBST([LIB]NAME) AC_SUBST([LIB]NAME)
AC_SUBST([LTLIB]NAME) AC_SUBST([LTLIB]NAME)
AC_SUBST([LIB]NAME[_PREFIX])
dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the
dnl results of this search when this library appears as a dependency. dnl results of this search when this library appears as a dependency.
HAVE_LIB[]NAME=yes HAVE_LIB[]NAME=yes
undefine([Name]) popdef([NAME])
undefine([NAME]) popdef([Name])
]) ])
dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode) dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode, [missing-message])
dnl searches for libname and the libraries corresponding to explicit and dnl searches for libname and the libraries corresponding to explicit and
dnl implicit dependencies, together with the specified include files and dnl implicit dependencies, together with the specified include files and
dnl the ability to compile and link the specified testcode. If found, it dnl the ability to compile and link the specified testcode. The missing-message
dnl sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} and dnl defaults to 'no' and may contain additional hints for the user.
dnl LTLIB${NAME} variables and augments the CPPFLAGS variable, and dnl If found, it sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME}
dnl and LTLIB${NAME} variables and augments the CPPFLAGS variable, and
dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs
dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty. dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty.
dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname
dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem.
AC_DEFUN([AC_LIB_HAVE_LINKFLAGS], AC_DEFUN([AC_LIB_HAVE_LINKFLAGS],
[ [
AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
AC_REQUIRE([AC_LIB_RPATH]) AC_REQUIRE([AC_LIB_RPATH])
define([Name],[translit([$1],[./-], [___])]) pushdef([Name],[translit([$1],[./-], [___])])
define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], pushdef([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME
dnl accordingly. dnl accordingly.
@ -66,13 +74,25 @@ AC_DEFUN([AC_LIB_HAVE_LINKFLAGS],
AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [ AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [
ac_save_LIBS="$LIBS" ac_save_LIBS="$LIBS"
LIBS="$LIBS $LIB[]NAME" dnl If $LIB[]NAME contains some -l options, add it to the end of LIBS,
AC_TRY_LINK([$3], [$4], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name=no]) dnl because these -l options might require -L options that are present in
dnl LIBS. -l options benefit only from the -L options listed before it.
dnl Otherwise, add it to the front of LIBS, because it may be a static
dnl library that depends on another static library that is present in LIBS.
dnl Static libraries benefit only from the static libraries listed after
dnl it.
case " $LIB[]NAME" in
*" -l"*) LIBS="$LIBS $LIB[]NAME" ;;
*) LIBS="$LIB[]NAME $LIBS" ;;
esac
AC_TRY_LINK([$3], [$4],
[ac_cv_lib[]Name=yes],
[ac_cv_lib[]Name='m4_if([$5], [], [no], [[$5]])'])
LIBS="$ac_save_LIBS" LIBS="$ac_save_LIBS"
]) ])
if test "$ac_cv_lib[]Name" = yes; then if test "$ac_cv_lib[]Name" = yes; then
HAVE_LIB[]NAME=yes HAVE_LIB[]NAME=yes
AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the $1 library.]) AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the lib][$1 library.])
AC_MSG_CHECKING([how to link with lib[]$1]) AC_MSG_CHECKING([how to link with lib[]$1])
AC_MSG_RESULT([$LIB[]NAME]) AC_MSG_RESULT([$LIB[]NAME])
else else
@ -82,17 +102,23 @@ AC_DEFUN([AC_LIB_HAVE_LINKFLAGS],
CPPFLAGS="$ac_save_CPPFLAGS" CPPFLAGS="$ac_save_CPPFLAGS"
LIB[]NAME= LIB[]NAME=
LTLIB[]NAME= LTLIB[]NAME=
LIB[]NAME[]_PREFIX=
fi fi
AC_SUBST([HAVE_LIB]NAME) AC_SUBST([HAVE_LIB]NAME)
AC_SUBST([LIB]NAME) AC_SUBST([LIB]NAME)
AC_SUBST([LTLIB]NAME) AC_SUBST([LTLIB]NAME)
undefine([Name]) AC_SUBST([LIB]NAME[_PREFIX])
undefine([NAME]) popdef([NAME])
popdef([Name])
]) ])
dnl Determine the platform dependent parameters needed to use rpath: dnl Determine the platform dependent parameters needed to use rpath:
dnl libext, shlibext, hardcode_libdir_flag_spec, hardcode_libdir_separator, dnl acl_libext,
dnl hardcode_direct, hardcode_minus_L. dnl acl_shlibext,
dnl acl_hardcode_libdir_flag_spec,
dnl acl_hardcode_libdir_separator,
dnl acl_hardcode_direct,
dnl acl_hardcode_minus_L.
AC_DEFUN([AC_LIB_RPATH], AC_DEFUN([AC_LIB_RPATH],
[ [
dnl Tell automake >= 1.10 to complain if config.rpath is missing. dnl Tell automake >= 1.10 to complain if config.rpath is missing.
@ -101,7 +127,7 @@ AC_DEFUN([AC_LIB_RPATH],
AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld
AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host
AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir
AC_CACHE_CHECK([for shared library run path origin], acl_cv_rpath, [ AC_CACHE_CHECK([for shared library run path origin], [acl_cv_rpath], [
CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \
${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh
. ./conftest.sh . ./conftest.sh
@ -109,35 +135,66 @@ AC_DEFUN([AC_LIB_RPATH],
acl_cv_rpath=done acl_cv_rpath=done
]) ])
wl="$acl_cv_wl" wl="$acl_cv_wl"
libext="$acl_cv_libext" acl_libext="$acl_cv_libext"
shlibext="$acl_cv_shlibext" acl_shlibext="$acl_cv_shlibext"
hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" acl_libname_spec="$acl_cv_libname_spec"
hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" acl_library_names_spec="$acl_cv_library_names_spec"
hardcode_direct="$acl_cv_hardcode_direct" acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
hardcode_minus_L="$acl_cv_hardcode_minus_L" acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
acl_hardcode_direct="$acl_cv_hardcode_direct"
acl_hardcode_minus_L="$acl_cv_hardcode_minus_L"
dnl Determine whether the user wants rpath handling at all. dnl Determine whether the user wants rpath handling at all.
AC_ARG_ENABLE(rpath, AC_ARG_ENABLE([rpath],
[ --disable-rpath do not hardcode runtime library paths], [ --disable-rpath do not hardcode runtime library paths],
:, enable_rpath=yes) :, enable_rpath=yes)
]) ])
dnl AC_LIB_FROMPACKAGE(name, package)
dnl declares that libname comes from the given package. The configure file
dnl will then not have a --with-libname-prefix option but a
dnl --with-package-prefix option. Several libraries can come from the same
dnl package. This declaration must occur before an AC_LIB_LINKFLAGS or similar
dnl macro call that searches for libname.
AC_DEFUN([AC_LIB_FROMPACKAGE],
[
pushdef([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
define([acl_frompackage_]NAME, [$2])
popdef([NAME])
pushdef([PACK],[$2])
pushdef([PACKUP],[translit(PACK,[abcdefghijklmnopqrstuvwxyz./-],
[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
define([acl_libsinpackage_]PACKUP,
m4_ifdef([acl_libsinpackage_]PACKUP, [acl_libsinpackage_]PACKUP[[, ]],)[lib$1])
popdef([PACKUP])
popdef([PACK])
])
dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and
dnl the libraries corresponding to explicit and implicit dependencies. dnl the libraries corresponding to explicit and implicit dependencies.
dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables. dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables.
dnl Also, sets the LIB${NAME}_PREFIX variable to nonempty if libname was found
dnl in ${LIB${NAME}_PREFIX}/$acl_libdirstem.
AC_DEFUN([AC_LIB_LINKFLAGS_BODY], AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
[ [
AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])
define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], pushdef([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
pushdef([PACK],[m4_ifdef([acl_frompackage_]NAME, [acl_frompackage_]NAME, lib[$1])])
pushdef([PACKUP],[translit(PACK,[abcdefghijklmnopqrstuvwxyz./-],
[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
pushdef([PACKLIBS],[m4_ifdef([acl_frompackage_]NAME, [acl_libsinpackage_]PACKUP, lib[$1])])
dnl Autoconf >= 2.61 supports dots in --with options.
pushdef([P_A_C_K],[m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]),[2.61]),[-1],[translit(PACK,[.],[_])],PACK)])
dnl By default, look in $includedir and $libdir. dnl By default, look in $includedir and $libdir.
use_additional=yes use_additional=yes
AC_LIB_WITH_FINAL_PREFIX([ AC_LIB_WITH_FINAL_PREFIX([
eval additional_includedir=\"$includedir\" eval additional_includedir=\"$includedir\"
eval additional_libdir=\"$libdir\" eval additional_libdir=\"$libdir\"
]) ])
AC_LIB_ARG_WITH([lib$1-prefix], AC_ARG_WITH(P_A_C_K[-prefix],
[ --with-lib$1-prefix[=DIR] search for lib$1 in DIR/include and DIR/lib [[ --with-]]P_A_C_K[[-prefix[=DIR] search for ]PACKLIBS[ in DIR/include and DIR/lib
--without-lib$1-prefix don't search for lib$1 in includedir and libdir], --without-]]P_A_C_K[[-prefix don't search for ]PACKLIBS[ in includedir and libdir]],
[ [
if test "X$withval" = "Xno"; then if test "X$withval" = "Xno"; then
use_additional=no use_additional=no
@ -150,6 +207,10 @@ AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
else else
additional_includedir="$withval/include" additional_includedir="$withval/include"
additional_libdir="$withval/$acl_libdirstem" additional_libdir="$withval/$acl_libdirstem"
if test "$acl_libdirstem2" != "$acl_libdirstem" \
&& ! test -d "$withval/$acl_libdirstem"; then
additional_libdir="$withval/$acl_libdirstem2"
fi
fi fi
fi fi
]) ])
@ -158,6 +219,10 @@ AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
LIB[]NAME= LIB[]NAME=
LTLIB[]NAME= LTLIB[]NAME=
INC[]NAME= INC[]NAME=
LIB[]NAME[]_PREFIX=
dnl HAVE_LIB${NAME} is an indicator that LIB${NAME}, LTLIB${NAME} have been
dnl computed. So it has to be reset here.
HAVE_LIB[]NAME=
rpathdirs= rpathdirs=
ltrpathdirs= ltrpathdirs=
names_already_handled= names_already_handled=
@ -197,29 +262,55 @@ AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
found_la= found_la=
found_so= found_so=
found_a= found_a=
eval libname=\"$acl_libname_spec\" # typically: libname=lib$name
if test -n "$acl_shlibext"; then
shrext=".$acl_shlibext" # typically: shrext=.so
else
shrext=
fi
if test $use_additional = yes; then if test $use_additional = yes; then
if test -n "$shlibext" \ dir="$additional_libdir"
&& { test -f "$additional_libdir/lib$name.$shlibext" \ dnl The same code as in the loop below:
|| { test "$shlibext" = dll \ dnl First look for a shared library.
&& test -f "$additional_libdir/lib$name.dll.a"; }; }; then if test -n "$acl_shlibext"; then
found_dir="$additional_libdir" if test -f "$dir/$libname$shrext"; then
if test -f "$additional_libdir/lib$name.$shlibext"; then found_dir="$dir"
found_so="$additional_libdir/lib$name.$shlibext" found_so="$dir/$libname$shrext"
else else
found_so="$additional_libdir/lib$name.dll.a" if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
fi ver=`(cd "$dir" && \
if test -f "$additional_libdir/lib$name.la"; then for f in "$libname$shrext".*; do echo "$f"; done \
found_la="$additional_libdir/lib$name.la" | sed -e "s,^$libname$shrext\\\\.,," \
fi | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
else | sed 1q ) 2>/dev/null`
if test -f "$additional_libdir/lib$name.$libext"; then if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
found_dir="$additional_libdir" found_dir="$dir"
found_a="$additional_libdir/lib$name.$libext" found_so="$dir/$libname$shrext.$ver"
if test -f "$additional_libdir/lib$name.la"; then fi
found_la="$additional_libdir/lib$name.la" else
eval library_names=\"$acl_library_names_spec\"
for f in $library_names; do
if test -f "$dir/$f"; then
found_dir="$dir"
found_so="$dir/$f"
break
fi
done
fi fi
fi fi
fi fi
dnl Then look for a static library.
if test "X$found_dir" = "X"; then
if test -f "$dir/$libname.$acl_libext"; then
found_dir="$dir"
found_a="$dir/$libname.$acl_libext"
fi
fi
if test "X$found_dir" != "X"; then
if test -f "$dir/$libname.la"; then
found_la="$dir/$libname.la"
fi
fi
fi fi
if test "X$found_dir" = "X"; then if test "X$found_dir" = "X"; then
for x in $LDFLAGS $LTLIB[]NAME; do for x in $LDFLAGS $LTLIB[]NAME; do
@ -227,28 +318,46 @@ AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
case "$x" in case "$x" in
-L*) -L*)
dir=`echo "X$x" | sed -e 's/^X-L//'` dir=`echo "X$x" | sed -e 's/^X-L//'`
if test -n "$shlibext" \ dnl First look for a shared library.
&& { test -f "$dir/lib$name.$shlibext" \ if test -n "$acl_shlibext"; then
|| { test "$shlibext" = dll \ if test -f "$dir/$libname$shrext"; then
&& test -f "$dir/lib$name.dll.a"; }; }; then
found_dir="$dir"
if test -f "$dir/lib$name.$shlibext"; then
found_so="$dir/lib$name.$shlibext"
else
found_so="$dir/lib$name.dll.a"
fi
if test -f "$dir/lib$name.la"; then
found_la="$dir/lib$name.la"
fi
else
if test -f "$dir/lib$name.$libext"; then
found_dir="$dir" found_dir="$dir"
found_a="$dir/lib$name.$libext" found_so="$dir/$libname$shrext"
if test -f "$dir/lib$name.la"; then else
found_la="$dir/lib$name.la" if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
ver=`(cd "$dir" && \
for f in "$libname$shrext".*; do echo "$f"; done \
| sed -e "s,^$libname$shrext\\\\.,," \
| sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
| sed 1q ) 2>/dev/null`
if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
found_dir="$dir"
found_so="$dir/$libname$shrext.$ver"
fi
else
eval library_names=\"$acl_library_names_spec\"
for f in $library_names; do
if test -f "$dir/$f"; then
found_dir="$dir"
found_so="$dir/$f"
break
fi
done
fi fi
fi fi
fi fi
dnl Then look for a static library.
if test "X$found_dir" = "X"; then
if test -f "$dir/$libname.$acl_libext"; then
found_dir="$dir"
found_a="$dir/$libname.$acl_libext"
fi
fi
if test "X$found_dir" != "X"; then
if test -f "$dir/$libname.la"; then
found_la="$dir/$libname.la"
fi
fi
;; ;;
esac esac
if test "X$found_dir" != "X"; then if test "X$found_dir" != "X"; then
@ -263,7 +372,9 @@ AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
dnl Linking with a shared library. We attempt to hardcode its dnl Linking with a shared library. We attempt to hardcode its
dnl directory into the executable's runpath, unless it's the dnl directory into the executable's runpath, unless it's the
dnl standard /usr/lib. dnl standard /usr/lib.
if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then if test "$enable_rpath" = no \
|| test "X$found_dir" = "X/usr/$acl_libdirstem" \
|| test "X$found_dir" = "X/usr/$acl_libdirstem2"; then
dnl No hardcoding is needed. dnl No hardcoding is needed.
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
else else
@ -282,12 +393,12 @@ AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
ltrpathdirs="$ltrpathdirs $found_dir" ltrpathdirs="$ltrpathdirs $found_dir"
fi fi
dnl The hardcoding into $LIBNAME is system dependent. dnl The hardcoding into $LIBNAME is system dependent.
if test "$hardcode_direct" = yes; then if test "$acl_hardcode_direct" = yes; then
dnl Using DIR/libNAME.so during linking hardcodes DIR into the dnl Using DIR/libNAME.so during linking hardcodes DIR into the
dnl resulting binary. dnl resulting binary.
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
else else
if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
dnl Use an explicit option to hardcode DIR into the resulting dnl Use an explicit option to hardcode DIR into the resulting
dnl binary. dnl binary.
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
@ -318,13 +429,13 @@ AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
if test -z "$haveit"; then if test -z "$haveit"; then
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir" LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir"
fi fi
if test "$hardcode_minus_L" != no; then if test "$acl_hardcode_minus_L" != no; then
dnl FIXME: Not sure whether we should use dnl FIXME: Not sure whether we should use
dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
dnl here. dnl here.
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
else else
dnl We cannot use $hardcode_runpath_var and LD_RUN_PATH dnl We cannot use $acl_hardcode_runpath_var and LD_RUN_PATH
dnl here, because this doesn't fit in flags passed to the dnl here, because this doesn't fit in flags passed to the
dnl compiler. So give up. No hardcoding. This affects only dnl compiler. So give up. No hardcoding. This affects only
dnl very old systems. dnl very old systems.
@ -351,6 +462,16 @@ AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
case "$found_dir" in case "$found_dir" in
*/$acl_libdirstem | */$acl_libdirstem/) */$acl_libdirstem | */$acl_libdirstem/)
basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
if test "$name" = '$1'; then
LIB[]NAME[]_PREFIX="$basedir"
fi
additional_includedir="$basedir/include"
;;
*/$acl_libdirstem2 | */$acl_libdirstem2/)
basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'`
if test "$name" = '$1'; then
LIB[]NAME[]_PREFIX="$basedir"
fi
additional_includedir="$basedir/include" additional_includedir="$basedir/include"
;; ;;
esac esac
@ -411,9 +532,11 @@ AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
dnl 3. if it's already present in $LDFLAGS or the already dnl 3. if it's already present in $LDFLAGS or the already
dnl constructed $LIBNAME, dnl constructed $LIBNAME,
dnl 4. if it doesn't exist as a directory. dnl 4. if it doesn't exist as a directory.
if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \
&& test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then
haveit= haveit=
if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \
|| test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then
if test -n "$GCC"; then if test -n "$GCC"; then
case $host_os in case $host_os in
linux* | gnu* | k*bsd*-gnu) haveit=yes;; linux* | gnu* | k*bsd*-gnu) haveit=yes;;
@ -512,18 +635,18 @@ AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
done done
done done
if test "X$rpathdirs" != "X"; then if test "X$rpathdirs" != "X"; then
if test -n "$hardcode_libdir_separator"; then if test -n "$acl_hardcode_libdir_separator"; then
dnl Weird platform: only the last -rpath option counts, the user must dnl Weird platform: only the last -rpath option counts, the user must
dnl pass all path elements in one option. We can arrange that for a dnl pass all path elements in one option. We can arrange that for a
dnl single library, but not when more than one $LIBNAMEs are used. dnl single library, but not when more than one $LIBNAMEs are used.
alldirs= alldirs=
for found_dir in $rpathdirs; do for found_dir in $rpathdirs; do
alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir" alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir"
done done
dnl Note: hardcode_libdir_flag_spec uses $libdir and $wl. dnl Note: acl_hardcode_libdir_flag_spec uses $libdir and $wl.
acl_save_libdir="$libdir" acl_save_libdir="$libdir"
libdir="$alldirs" libdir="$alldirs"
eval flag=\"$hardcode_libdir_flag_spec\" eval flag=\"$acl_hardcode_libdir_flag_spec\"
libdir="$acl_save_libdir" libdir="$acl_save_libdir"
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
else else
@ -531,7 +654,7 @@ AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
for found_dir in $rpathdirs; do for found_dir in $rpathdirs; do
acl_save_libdir="$libdir" acl_save_libdir="$libdir"
libdir="$found_dir" libdir="$found_dir"
eval flag=\"$hardcode_libdir_flag_spec\" eval flag=\"$acl_hardcode_libdir_flag_spec\"
libdir="$acl_save_libdir" libdir="$acl_save_libdir"
LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
done done
@ -544,6 +667,11 @@ AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir" LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir"
done done
fi fi
popdef([P_A_C_K])
popdef([PACKLIBS])
popdef([PACKUP])
popdef([PACK])
popdef([NAME])
]) ])
dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR, dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR,
@ -580,7 +708,7 @@ AC_DEFUN([AC_LIB_LINKFLAGS_FROM_LIBS],
AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])
$1= $1=
if test "$enable_rpath" != no; then if test "$enable_rpath" != no; then
if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
dnl Use an explicit option to hardcode directories into the resulting dnl Use an explicit option to hardcode directories into the resulting
dnl binary. dnl binary.
rpathdirs= rpathdirs=
@ -589,7 +717,8 @@ AC_DEFUN([AC_LIB_LINKFLAGS_FROM_LIBS],
if test -n "$next"; then if test -n "$next"; then
dir="$next" dir="$next"
dnl No need to hardcode the standard /usr/lib. dnl No need to hardcode the standard /usr/lib.
if test "X$dir" != "X/usr/$acl_libdirstem"; then if test "X$dir" != "X/usr/$acl_libdirstem" \
&& test "X$dir" != "X/usr/$acl_libdirstem2"; then
rpathdirs="$rpathdirs $dir" rpathdirs="$rpathdirs $dir"
fi fi
next= next=
@ -598,7 +727,8 @@ AC_DEFUN([AC_LIB_LINKFLAGS_FROM_LIBS],
-L) next=yes ;; -L) next=yes ;;
-L*) dir=`echo "X$opt" | sed -e 's,^X-L,,'` -L*) dir=`echo "X$opt" | sed -e 's,^X-L,,'`
dnl No need to hardcode the standard /usr/lib. dnl No need to hardcode the standard /usr/lib.
if test "X$dir" != "X/usr/$acl_libdirstem"; then if test "X$dir" != "X/usr/$acl_libdirstem" \
&& test "X$dir" != "X/usr/$acl_libdirstem2"; then
rpathdirs="$rpathdirs $dir" rpathdirs="$rpathdirs $dir"
fi fi
next= ;; next= ;;
@ -614,16 +744,16 @@ AC_DEFUN([AC_LIB_LINKFLAGS_FROM_LIBS],
done done
else else
dnl The linker is used for linking directly. dnl The linker is used for linking directly.
if test -n "$hardcode_libdir_separator"; then if test -n "$acl_hardcode_libdir_separator"; then
dnl Weird platform: only the last -rpath option counts, the user dnl Weird platform: only the last -rpath option counts, the user
dnl must pass all path elements in one option. dnl must pass all path elements in one option.
alldirs= alldirs=
for dir in $rpathdirs; do for dir in $rpathdirs; do
alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$dir" alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$dir"
done done
acl_save_libdir="$libdir" acl_save_libdir="$libdir"
libdir="$alldirs" libdir="$alldirs"
eval flag=\"$hardcode_libdir_flag_spec\" eval flag=\"$acl_hardcode_libdir_flag_spec\"
libdir="$acl_save_libdir" libdir="$acl_save_libdir"
$1="$flag" $1="$flag"
else else
@ -631,7 +761,7 @@ AC_DEFUN([AC_LIB_LINKFLAGS_FROM_LIBS],
for dir in $rpathdirs; do for dir in $rpathdirs; do
acl_save_libdir="$libdir" acl_save_libdir="$libdir"
libdir="$dir" libdir="$dir"
eval flag=\"$hardcode_libdir_flag_spec\" eval flag=\"$acl_hardcode_libdir_flag_spec\"
libdir="$acl_save_libdir" libdir="$acl_save_libdir"
$1="${$1}${$1:+ }$flag" $1="${$1}${$1:+ }$flag"
done done

View File

@ -1,5 +1,5 @@
# lib-prefix.m4 serial 5 (gettext-0.15) # lib-prefix.m4 serial 7 (gettext-0.18)
dnl Copyright (C) 2001-2005 Free Software Foundation, Inc. dnl Copyright (C) 2001-2005, 2008-2010 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it, dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved. dnl with or without modifications, as long as this notice is preserved.
@ -153,33 +153,72 @@ AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX],
prefix="$acl_save_prefix" prefix="$acl_save_prefix"
]) ])
dnl AC_LIB_PREPARE_MULTILIB creates a variable acl_libdirstem, containing dnl AC_LIB_PREPARE_MULTILIB creates
dnl the basename of the libdir, either "lib" or "lib64". dnl - a variable acl_libdirstem, containing the basename of the libdir, either
dnl "lib" or "lib64" or "lib/64",
dnl - a variable acl_libdirstem2, as a secondary possible value for
dnl acl_libdirstem, either the same as acl_libdirstem or "lib/sparcv9" or
dnl "lib/amd64".
AC_DEFUN([AC_LIB_PREPARE_MULTILIB], AC_DEFUN([AC_LIB_PREPARE_MULTILIB],
[ [
dnl There is no formal standard regarding lib and lib64. The current dnl There is no formal standard regarding lib and lib64.
dnl practice is that on a system supporting 32-bit and 64-bit instruction dnl On glibc systems, the current practice is that on a system supporting
dnl sets or ABIs, 64-bit libraries go under $prefix/lib64 and 32-bit dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under
dnl libraries go under $prefix/lib. We determine the compiler's default dnl $prefix/lib64 and 32-bit libraries go under $prefix/lib. We determine
dnl mode by looking at the compiler's library search path. If at least dnl the compiler's default mode by looking at the compiler's library search
dnl of its elements ends in /lib64 or points to a directory whose absolute dnl path. If at least one of its elements ends in /lib64 or points to a
dnl pathname ends in /lib64, we assume a 64-bit ABI. Otherwise we use the dnl directory whose absolute pathname ends in /lib64, we assume a 64-bit ABI.
dnl default, namely "lib". dnl Otherwise we use the default, namely "lib".
dnl On Solaris systems, the current practice is that on a system supporting
dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under
dnl $prefix/lib/64 (which is a symlink to either $prefix/lib/sparcv9 or
dnl $prefix/lib/amd64) and 32-bit libraries go under $prefix/lib.
AC_REQUIRE([AC_CANONICAL_HOST])
acl_libdirstem=lib acl_libdirstem=lib
searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` acl_libdirstem2=
if test -n "$searchpath"; then case "$host_os" in
acl_save_IFS="${IFS= }"; IFS=":" solaris*)
for searchdir in $searchpath; do dnl See Solaris 10 Software Developer Collection > Solaris 64-bit Developer's Guide > The Development Environment
if test -d "$searchdir"; then dnl <http://docs.sun.com/app/docs/doc/816-5138/dev-env?l=en&a=view>.
case "$searchdir" in dnl "Portable Makefiles should refer to any library directories using the 64 symbolic link."
*/lib64/ | */lib64 ) acl_libdirstem=lib64 ;; dnl But we want to recognize the sparcv9 or amd64 subdirectory also if the
*) searchdir=`cd "$searchdir" && pwd` dnl symlink is missing, so we set acl_libdirstem2 too.
case "$searchdir" in AC_CACHE_CHECK([for 64-bit host], [gl_cv_solaris_64bit],
*/lib64 ) acl_libdirstem=lib64 ;; [AC_EGREP_CPP([sixtyfour bits], [
esac ;; #ifdef _LP64
sixtyfour bits
#endif
], [gl_cv_solaris_64bit=yes], [gl_cv_solaris_64bit=no])
])
if test $gl_cv_solaris_64bit = yes; then
acl_libdirstem=lib/64
case "$host_cpu" in
sparc*) acl_libdirstem2=lib/sparcv9 ;;
i*86 | x86_64) acl_libdirstem2=lib/amd64 ;;
esac esac
fi fi
done ;;
IFS="$acl_save_IFS" *)
fi searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'`
if test -n "$searchpath"; then
acl_save_IFS="${IFS= }"; IFS=":"
for searchdir in $searchpath; do
if test -d "$searchdir"; then
case "$searchdir" in
*/lib64/ | */lib64 ) acl_libdirstem=lib64 ;;
*/../ | */.. )
# Better ignore directories of this form. They are misleading.
;;
*) searchdir=`cd "$searchdir" && pwd`
case "$searchdir" in
*/lib64 ) acl_libdirstem=lib64 ;;
esac ;;
esac
fi
done
IFS="$acl_save_IFS"
fi
;;
esac
test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem"
]) ])

View File

@ -1,254 +1,33 @@
# lock.m4 serial 6 (gettext-0.16) # lock.m4 serial 10 (gettext-0.18)
dnl Copyright (C) 2005-2006 Free Software Foundation, Inc. dnl Copyright (C) 2005-2010 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it, dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved. dnl with or without modifications, as long as this notice is preserved.
dnl From Bruno Haible. dnl From Bruno Haible.
dnl Tests for a multithreading library to be used. AC_DEFUN([gl_LOCK],
dnl Defines at most one of the macros USE_POSIX_THREADS, USE_SOLARIS_THREADS,
dnl USE_PTH_THREADS, USE_WIN32_THREADS
dnl Sets the variables LIBTHREAD and LTLIBTHREAD to the linker options for use
dnl in a Makefile (LIBTHREAD for use without libtool, LTLIBTHREAD for use with
dnl libtool).
dnl Sets the variables LIBMULTITHREAD and LTLIBMULTITHREAD similarly, for
dnl programs that really need multithread functionality. The difference
dnl between LIBTHREAD and LIBMULTITHREAD is that on platforms supporting weak
dnl symbols, typically LIBTHREAD="" whereas LIBMULTITHREAD="-lpthread".
dnl Adds to CPPFLAGS the flag -D_REENTRANT or -D_THREAD_SAFE if needed for
dnl multithread-safe programs.
AC_DEFUN([gl_LOCK_EARLY],
[ [
AC_REQUIRE([gl_LOCK_EARLY_BODY]) AC_REQUIRE([gl_THREADLIB])
]) if test "$gl_threads_api" = posix; then
# OSF/1 4.0 and MacOS X 10.1 lack the pthread_rwlock_t type and the
dnl The guts of gl_LOCK_EARLY. Needs to be expanded only once. # pthread_rwlock_* functions.
AC_CHECK_TYPE([pthread_rwlock_t],
AC_DEFUN([gl_LOCK_EARLY_BODY], [AC_DEFINE([HAVE_PTHREAD_RWLOCK], [1],
[ [Define if the POSIX multithreading library has read/write locks.])],
dnl Ordering constraints: This macro modifies CPPFLAGS in a way that [],
dnl influences the result of the autoconf tests that test for *_unlocked [#include <pthread.h>])
dnl declarations, on AIX 5 at least. Therefore it must come early. # glibc defines PTHREAD_MUTEX_RECURSIVE as enum, not as a macro.
AC_BEFORE([$0], [gl_FUNC_GLIBC_UNLOCKED_IO])dnl AC_TRY_COMPILE([#include <pthread.h>],
AC_BEFORE([$0], [gl_ARGP])dnl [#if __FreeBSD__ == 4
AC_REQUIRE([AC_CANONICAL_HOST])
AC_REQUIRE([AC_GNU_SOURCE]) dnl needed for pthread_rwlock_t on glibc systems
dnl Check for multithreading.
AC_ARG_ENABLE(threads,
AC_HELP_STRING([--enable-threads={posix|solaris|pth|win32}], [specify multithreading API])
AC_HELP_STRING([--disable-threads], [build without multithread safety]),
[gl_use_threads=$enableval],
[case "$host_os" in
dnl Disable multithreading by default on OSF/1, because it interferes
dnl with fork()/exec(): When msgexec is linked with -lpthread, its child
dnl process gets an endless segmentation fault inside execvp().
osf*) gl_use_threads=no ;;
*) gl_use_threads=yes ;;
esac
])
if test "$gl_use_threads" = yes || test "$gl_use_threads" = posix; then
# For using <pthread.h>:
case "$host_os" in
osf*)
# On OSF/1, the compiler needs the flag -D_REENTRANT so that it
# groks <pthread.h>. cc also understands the flag -pthread, but
# we don't use it because 1. gcc-2.95 doesn't understand -pthread,
# 2. putting a flag into CPPFLAGS that has an effect on the linker
# causes the AC_TRY_LINK test below to succeed unexpectedly,
# leading to wrong values of LIBTHREAD and LTLIBTHREAD.
CPPFLAGS="$CPPFLAGS -D_REENTRANT"
;;
esac
# Some systems optimize for single-threaded programs by default, and
# need special flags to disable these optimizations. For example, the
# definition of 'errno' in <errno.h>.
case "$host_os" in
aix* | freebsd*) CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE" ;;
solaris*) CPPFLAGS="$CPPFLAGS -D_REENTRANT" ;;
esac
fi
])
dnl The guts of gl_LOCK. Needs to be expanded only once.
AC_DEFUN([gl_LOCK_BODY],
[
AC_REQUIRE([gl_LOCK_EARLY_BODY])
gl_threads_api=none
LIBTHREAD=
LTLIBTHREAD=
LIBMULTITHREAD=
LTLIBMULTITHREAD=
if test "$gl_use_threads" != no; then
dnl Check whether the compiler and linker support weak declarations.
AC_MSG_CHECKING([whether imported symbols can be declared weak])
gl_have_weak=no
AC_TRY_LINK([extern void xyzzy ();
#pragma weak xyzzy], [xyzzy();], [gl_have_weak=yes])
AC_MSG_RESULT([$gl_have_weak])
if test "$gl_use_threads" = yes || test "$gl_use_threads" = posix; then
# On OSF/1, the compiler needs the flag -pthread or -D_REENTRANT so that
# it groks <pthread.h>. It's added above, in gl_LOCK_EARLY_BODY.
AC_CHECK_HEADER(pthread.h, gl_have_pthread_h=yes, gl_have_pthread_h=no)
if test "$gl_have_pthread_h" = yes; then
# Other possible tests:
# -lpthreads (FSU threads, PCthreads)
# -lgthreads
gl_have_pthread=
# Test whether both pthread_mutex_lock and pthread_mutexattr_init exist
# in libc. IRIX 6.5 has the first one in both libc and libpthread, but
# the second one only in libpthread, and lock.c needs it.
AC_TRY_LINK([#include <pthread.h>],
[pthread_mutex_lock((pthread_mutex_t*)0);
pthread_mutexattr_init((pthread_mutexattr_t*)0);],
[gl_have_pthread=yes])
# Test for libpthread by looking for pthread_kill. (Not pthread_self,
# since it is defined as a macro on OSF/1.)
if test -n "$gl_have_pthread"; then
# The program links fine without libpthread. But it may actually
# need to link with libpthread in order to create multiple threads.
AC_CHECK_LIB(pthread, pthread_kill,
[LIBMULTITHREAD=-lpthread LTLIBMULTITHREAD=-lpthread
# On Solaris and HP-UX, most pthread functions exist also in libc.
# Therefore pthread_in_use() needs to actually try to create a
# thread: pthread_create from libc will fail, whereas
# pthread_create will actually create a thread.
case "$host_os" in
solaris* | hpux*)
AC_DEFINE([PTHREAD_IN_USE_DETECTION_HARD], 1,
[Define if the pthread_in_use() detection is hard.])
esac
])
else
# Some library is needed. Try libpthread and libc_r.
AC_CHECK_LIB(pthread, pthread_kill,
[gl_have_pthread=yes
LIBTHREAD=-lpthread LTLIBTHREAD=-lpthread
LIBMULTITHREAD=-lpthread LTLIBMULTITHREAD=-lpthread])
if test -z "$gl_have_pthread"; then
# For FreeBSD 4.
AC_CHECK_LIB(c_r, pthread_kill,
[gl_have_pthread=yes
LIBTHREAD=-lc_r LTLIBTHREAD=-lc_r
LIBMULTITHREAD=-lc_r LTLIBMULTITHREAD=-lc_r])
fi
fi
if test -n "$gl_have_pthread"; then
gl_threads_api=posix
AC_DEFINE([USE_POSIX_THREADS], 1,
[Define if the POSIX multithreading library can be used.])
if test -n "$LIBMULTITHREAD" || test -n "$LTLIBMULTITHREAD"; then
if test $gl_have_weak = yes; then
AC_DEFINE([USE_POSIX_THREADS_WEAK], 1,
[Define if references to the POSIX multithreading library should be made weak.])
LIBTHREAD=
LTLIBTHREAD=
fi
fi
# OSF/1 4.0 and MacOS X 10.1 lack the pthread_rwlock_t type and the
# pthread_rwlock_* functions.
AC_CHECK_TYPE([pthread_rwlock_t],
[AC_DEFINE([HAVE_PTHREAD_RWLOCK], 1,
[Define if the POSIX multithreading library has read/write locks.])],
[],
[#include <pthread.h>])
# glibc defines PTHREAD_MUTEX_RECURSIVE as enum, not as a macro.
AC_TRY_COMPILE([#include <pthread.h>],
[#if __FreeBSD__ == 4
error "No, in FreeBSD 4.0 recursive mutexes actually don't work." error "No, in FreeBSD 4.0 recursive mutexes actually don't work."
#else #else
int x = (int)PTHREAD_MUTEX_RECURSIVE; int x = (int)PTHREAD_MUTEX_RECURSIVE;
return !x; return !x;
#endif], #endif],
[AC_DEFINE([HAVE_PTHREAD_MUTEX_RECURSIVE], 1, [AC_DEFINE([HAVE_PTHREAD_MUTEX_RECURSIVE], [1],
[Define if the <pthread.h> defines PTHREAD_MUTEX_RECURSIVE.])]) [Define if the <pthread.h> defines PTHREAD_MUTEX_RECURSIVE.])])
fi
fi
fi
if test -z "$gl_have_pthread"; then
if test "$gl_use_threads" = yes || test "$gl_use_threads" = solaris; then
gl_have_solaristhread=
gl_save_LIBS="$LIBS"
LIBS="$LIBS -lthread"
AC_TRY_LINK([#include <thread.h>
#include <synch.h>],
[thr_self();],
[gl_have_solaristhread=yes])
LIBS="$gl_save_LIBS"
if test -n "$gl_have_solaristhread"; then
gl_threads_api=solaris
LIBTHREAD=-lthread
LTLIBTHREAD=-lthread
LIBMULTITHREAD="$LIBTHREAD"
LTLIBMULTITHREAD="$LTLIBTHREAD"
AC_DEFINE([USE_SOLARIS_THREADS], 1,
[Define if the old Solaris multithreading library can be used.])
if test $gl_have_weak = yes; then
AC_DEFINE([USE_SOLARIS_THREADS_WEAK], 1,
[Define if references to the old Solaris multithreading library should be made weak.])
LIBTHREAD=
LTLIBTHREAD=
fi
fi
fi
fi
if test "$gl_use_threads" = pth; then
gl_save_CPPFLAGS="$CPPFLAGS"
AC_LIB_LINKFLAGS(pth)
gl_have_pth=
gl_save_LIBS="$LIBS"
LIBS="$LIBS -lpth"
AC_TRY_LINK([#include <pth.h>], [pth_self();], gl_have_pth=yes)
LIBS="$gl_save_LIBS"
if test -n "$gl_have_pth"; then
gl_threads_api=pth
LIBTHREAD="$LIBPTH"
LTLIBTHREAD="$LTLIBPTH"
LIBMULTITHREAD="$LIBTHREAD"
LTLIBMULTITHREAD="$LTLIBTHREAD"
AC_DEFINE([USE_PTH_THREADS], 1,
[Define if the GNU Pth multithreading library can be used.])
if test -n "$LIBMULTITHREAD" || test -n "$LTLIBMULTITHREAD"; then
if test $gl_have_weak = yes; then
AC_DEFINE([USE_PTH_THREADS_WEAK], 1,
[Define if references to the GNU Pth multithreading library should be made weak.])
LIBTHREAD=
LTLIBTHREAD=
fi
fi
else
CPPFLAGS="$gl_save_CPPFLAGS"
fi
fi
if test -z "$gl_have_pthread"; then
if test "$gl_use_threads" = yes || test "$gl_use_threads" = win32; then
if { case "$host_os" in
mingw*) true;;
*) false;;
esac
}; then
gl_threads_api=win32
AC_DEFINE([USE_WIN32_THREADS], 1,
[Define if the Win32 multithreading API can be used.])
fi
fi
fi
fi fi
AC_MSG_CHECKING([for multithread API to use])
AC_MSG_RESULT([$gl_threads_api])
AC_SUBST(LIBTHREAD)
AC_SUBST(LTLIBTHREAD)
AC_SUBST(LIBMULTITHREAD)
AC_SUBST(LTLIBMULTITHREAD)
])
AC_DEFUN([gl_LOCK],
[
AC_REQUIRE([gl_LOCK_EARLY])
AC_REQUIRE([gl_LOCK_BODY])
gl_PREREQ_LOCK gl_PREREQ_LOCK
]) ])
@ -256,56 +35,3 @@ AC_DEFUN([gl_LOCK],
AC_DEFUN([gl_PREREQ_LOCK], [ AC_DEFUN([gl_PREREQ_LOCK], [
AC_REQUIRE([AC_C_INLINE]) AC_REQUIRE([AC_C_INLINE])
]) ])
dnl Survey of platforms:
dnl
dnl Platform Available Compiler Supports test-lock
dnl flavours option weak result
dnl --------------- --------- --------- -------- ---------
dnl Linux 2.4/glibc posix -lpthread Y OK
dnl
dnl GNU Hurd/glibc posix
dnl
dnl FreeBSD 5.3 posix -lc_r Y
dnl posix -lkse ? Y
dnl posix -lpthread ? Y
dnl posix -lthr Y
dnl
dnl FreeBSD 5.2 posix -lc_r Y
dnl posix -lkse Y
dnl posix -lthr Y
dnl
dnl FreeBSD 4.0,4.10 posix -lc_r Y OK
dnl
dnl NetBSD 1.6 --
dnl
dnl OpenBSD 3.4 posix -lpthread Y OK
dnl
dnl MacOS X 10.[123] posix -lpthread Y OK
dnl
dnl Solaris 7,8,9 posix -lpthread Y Sol 7,8: 0.0; Sol 9: OK
dnl solaris -lthread Y Sol 7,8: 0.0; Sol 9: OK
dnl
dnl HP-UX 11 posix -lpthread N (cc) OK
dnl Y (gcc)
dnl
dnl IRIX 6.5 posix -lpthread Y 0.5
dnl
dnl AIX 4.3,5.1 posix -lpthread N AIX 4: 0.5; AIX 5: OK
dnl
dnl OSF/1 4.0,5.1 posix -pthread (cc) N OK
dnl -lpthread (gcc) Y
dnl
dnl Cygwin posix -lpthread Y OK
dnl
dnl Any of the above pth -lpth 0.0
dnl
dnl Mingw win32 N OK
dnl
dnl BeOS 5 --
dnl
dnl The test-lock result shows what happens if in test-lock.c EXPLICIT_YIELD is
dnl turned off:
dnl OK if all three tests terminate OK,
dnl 0.5 if the first test terminates OK but the second one loops endlessly,
dnl 0.0 if the first test already loops endlessly.

View File

@ -1,5 +1,5 @@
# longlong.m4 serial 8 # longlong.m4 serial 14
dnl Copyright (C) 1999-2006 Free Software Foundation, Inc. dnl Copyright (C) 1999-2007, 2009-2010 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it, dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved. dnl with or without modifications, as long as this notice is preserved.
@ -7,42 +7,100 @@ dnl with or without modifications, as long as this notice is preserved.
dnl From Paul Eggert. dnl From Paul Eggert.
# Define HAVE_LONG_LONG_INT if 'long long int' works. # Define HAVE_LONG_LONG_INT if 'long long int' works.
# This fixes a bug in Autoconf 2.60, but can be removed once we # This fixes a bug in Autoconf 2.61, but can be removed once we
# assume 2.61 everywhere. # assume 2.62 everywhere.
# Note: If the type 'long long int' exists but is only 32 bits large # Note: If the type 'long long int' exists but is only 32 bits large
# (as on some very old compilers), AC_TYPE_LONG_LONG_INT will not be # (as on some very old compilers), HAVE_LONG_LONG_INT will not be
# defined. In this case you can treat 'long long int' like 'long int'. # defined. In this case you can treat 'long long int' like 'long int'.
AC_DEFUN([AC_TYPE_LONG_LONG_INT], AC_DEFUN([AC_TYPE_LONG_LONG_INT],
[ [
AC_CACHE_CHECK([for long long int], [ac_cv_type_long_long_int], AC_CACHE_CHECK([for long long int], [ac_cv_type_long_long_int],
[AC_LINK_IFELSE( [AC_LINK_IFELSE(
[AC_LANG_PROGRAM( [_AC_TYPE_LONG_LONG_SNIPPET],
[[long long int ll = 9223372036854775807ll; [dnl This catches a bug in Tandem NonStop Kernel (OSS) cc -O circa 2004.
long long int nll = -9223372036854775807LL; dnl If cross compiling, assume the bug isn't important, since
typedef int a[((-9223372036854775807LL < 0 dnl nobody cross compiles for this platform as far as we know.
&& 0 < 9223372036854775807ll) AC_RUN_IFELSE(
? 1 : -1)]; [AC_LANG_PROGRAM(
int i = 63;]], [[@%:@include <limits.h>
[[long long int llmax = 9223372036854775807ll; @%:@ifndef LLONG_MAX
return ((ll << 63) | (ll >> 63) | (ll < i) | (ll > i) @%:@ define HALF \
| (llmax / ll) | (llmax % ll));]])], (1LL << (sizeof (long long int) * CHAR_BIT - 2))
[ac_cv_type_long_long_int=yes], @%:@ define LLONG_MAX (HALF - 1 + HALF)
@%:@endif]],
[[long long int n = 1;
int i;
for (i = 0; ; i++)
{
long long int m = n << i;
if (m >> i != n)
return 1;
if (LLONG_MAX / 2 < m)
break;
}
return 0;]])],
[ac_cv_type_long_long_int=yes],
[ac_cv_type_long_long_int=no],
[ac_cv_type_long_long_int=yes])],
[ac_cv_type_long_long_int=no])]) [ac_cv_type_long_long_int=no])])
if test $ac_cv_type_long_long_int = yes; then if test $ac_cv_type_long_long_int = yes; then
AC_DEFINE([HAVE_LONG_LONG_INT], 1, AC_DEFINE([HAVE_LONG_LONG_INT], [1],
[Define to 1 if the system has the type `long long int'.]) [Define to 1 if the system has the type `long long int'.])
fi fi
]) ])
# This macro is obsolescent and should go away soon. # Define HAVE_UNSIGNED_LONG_LONG_INT if 'unsigned long long int' works.
AC_DEFUN([gl_AC_TYPE_LONG_LONG], # This fixes a bug in Autoconf 2.61, but can be removed once we
# assume 2.62 everywhere.
# Note: If the type 'unsigned long long int' exists but is only 32 bits
# large (as on some very old compilers), AC_TYPE_UNSIGNED_LONG_LONG_INT
# will not be defined. In this case you can treat 'unsigned long long int'
# like 'unsigned long int'.
AC_DEFUN([AC_TYPE_UNSIGNED_LONG_LONG_INT],
[ [
AC_REQUIRE([AC_TYPE_LONG_LONG_INT]) AC_CACHE_CHECK([for unsigned long long int],
ac_cv_type_long_long=$ac_cv_type_long_long_int [ac_cv_type_unsigned_long_long_int],
if test $ac_cv_type_long_long = yes; then [AC_LINK_IFELSE(
AC_DEFINE(HAVE_LONG_LONG, 1, [_AC_TYPE_LONG_LONG_SNIPPET],
[Define if you have the 'long long' type.]) [ac_cv_type_unsigned_long_long_int=yes],
[ac_cv_type_unsigned_long_long_int=no])])
if test $ac_cv_type_unsigned_long_long_int = yes; then
AC_DEFINE([HAVE_UNSIGNED_LONG_LONG_INT], [1],
[Define to 1 if the system has the type `unsigned long long int'.])
fi fi
]) ])
# Expands to a C program that can be used to test for simultaneous support
# of 'long long' and 'unsigned long long'. We don't want to say that
# 'long long' is available if 'unsigned long long' is not, or vice versa,
# because too many programs rely on the symmetry between signed and unsigned
# integer types (excluding 'bool').
AC_DEFUN([_AC_TYPE_LONG_LONG_SNIPPET],
[
AC_LANG_PROGRAM(
[[/* For now, do not test the preprocessor; as of 2007 there are too many
implementations with broken preprocessors. Perhaps this can
be revisited in 2012. In the meantime, code should not expect
#if to work with literals wider than 32 bits. */
/* Test literals. */
long long int ll = 9223372036854775807ll;
long long int nll = -9223372036854775807LL;
unsigned long long int ull = 18446744073709551615ULL;
/* Test constant expressions. */
typedef int a[((-9223372036854775807LL < 0 && 0 < 9223372036854775807ll)
? 1 : -1)];
typedef int b[(18446744073709551615ULL <= (unsigned long long int) -1
? 1 : -1)];
int i = 63;]],
[[/* Test availability of runtime routines for shift and division. */
long long int llmax = 9223372036854775807ll;
unsigned long long int ullmax = 18446744073709551615ull;
return ((ll << 63) | (ll >> 63) | (ll < i) | (ll > i)
| (llmax / ll) | (llmax % ll)
| (ull << 63) | (ull >> 63) | (ull << i) | (ull >> i)
| (ullmax / ull) | (ullmax % ull));]])
])

View File

@ -1,5 +1,6 @@
# nls.m4 serial 3 (gettext-0.15) # nls.m4 serial 5 (gettext-0.18)
dnl Copyright (C) 1995-2003, 2005-2006 Free Software Foundation, Inc. dnl Copyright (C) 1995-2003, 2005-2006, 2008-2010 Free Software Foundation,
dnl Inc.
dnl This file is free software; the Free Software Foundation dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it, dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved. dnl with or without modifications, as long as this notice is preserved.
@ -17,15 +18,15 @@ dnl Authors:
dnl Ulrich Drepper <drepper@cygnus.com>, 1995-2000. dnl Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
dnl Bruno Haible <haible@clisp.cons.org>, 2000-2003. dnl Bruno Haible <haible@clisp.cons.org>, 2000-2003.
AC_PREREQ(2.50) AC_PREREQ([2.50])
AC_DEFUN([AM_NLS], AC_DEFUN([AM_NLS],
[ [
AC_MSG_CHECKING([whether NLS is requested]) AC_MSG_CHECKING([whether NLS is requested])
dnl Default is enabled NLS dnl Default is enabled NLS
AC_ARG_ENABLE(nls, AC_ARG_ENABLE([nls],
[ --disable-nls do not use Native Language Support], [ --disable-nls do not use Native Language Support],
USE_NLS=$enableval, USE_NLS=yes) USE_NLS=$enableval, USE_NLS=yes)
AC_MSG_RESULT($USE_NLS) AC_MSG_RESULT([$USE_NLS])
AC_SUBST(USE_NLS) AC_SUBST([USE_NLS])
]) ])

View File

@ -1,5 +1,5 @@
# po.m4 serial 13 (gettext-0.15) # po.m4 serial 17 (gettext-0.18)
dnl Copyright (C) 1995-2006 Free Software Foundation, Inc. dnl Copyright (C) 1995-2010 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it, dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved. dnl with or without modifications, as long as this notice is preserved.
@ -17,7 +17,7 @@ dnl Authors:
dnl Ulrich Drepper <drepper@cygnus.com>, 1995-2000. dnl Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
dnl Bruno Haible <haible@clisp.cons.org>, 2000-2003. dnl Bruno Haible <haible@clisp.cons.org>, 2000-2003.
AC_PREREQ(2.50) AC_PREREQ([2.50])
dnl Checks for all prerequisites of the po subdirectory. dnl Checks for all prerequisites of the po subdirectory.
AC_DEFUN([AM_PO_SUBDIRS], AC_DEFUN([AM_PO_SUBDIRS],
@ -27,6 +27,10 @@ AC_DEFUN([AM_PO_SUBDIRS],
AC_REQUIRE([AM_PROG_MKDIR_P])dnl defined by automake AC_REQUIRE([AM_PROG_MKDIR_P])dnl defined by automake
AC_REQUIRE([AM_NLS])dnl AC_REQUIRE([AM_NLS])dnl
dnl Release version of the gettext macros. This is used to ensure that
dnl the gettext macros and po/Makefile.in.in are in sync.
AC_SUBST([GETTEXT_MACRO_VERSION], [0.18])
dnl Perform the following tests also if --disable-nls has been given, dnl Perform the following tests also if --disable-nls has been given,
dnl because they are needed for "make dist" to work. dnl because they are needed for "make dist" to work.
@ -37,7 +41,7 @@ AC_DEFUN([AM_PO_SUBDIRS],
[$ac_dir/$ac_word --statistics /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 && [$ac_dir/$ac_word --statistics /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 &&
(if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)],
:) :)
AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) AC_PATH_PROG([GMSGFMT], [gmsgfmt], [$MSGFMT])
dnl Test whether it is GNU msgfmt >= 0.15. dnl Test whether it is GNU msgfmt >= 0.15.
changequote(,)dnl changequote(,)dnl
@ -84,6 +88,10 @@ changequote([,])dnl
test -n "$localedir" || localedir='${datadir}/locale' test -n "$localedir" || localedir='${datadir}/locale'
AC_SUBST([localedir]) AC_SUBST([localedir])
dnl Support for AM_XGETTEXT_OPTION.
test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS=
AC_SUBST([XGETTEXT_EXTRA_OPTIONS])
AC_CONFIG_COMMANDS([po-directories], [[ AC_CONFIG_COMMANDS([po-directories], [[
for ac_file in $CONFIG_FILES; do for ac_file in $CONFIG_FILES; do
# Support "outfile[:infile[:infile...]]" # Support "outfile[:infile[:infile...]]"
@ -426,3 +434,16 @@ EOF
fi fi
mv "$ac_file.tmp" "$ac_file" mv "$ac_file.tmp" "$ac_file"
]) ])
dnl Initializes the accumulator used by AM_XGETTEXT_OPTION.
AC_DEFUN([AM_XGETTEXT_OPTION_INIT],
[
XGETTEXT_EXTRA_OPTIONS=
])
dnl Registers an option to be passed to xgettext in the po subdirectory.
AC_DEFUN([AM_XGETTEXT_OPTION],
[
AC_REQUIRE([AM_XGETTEXT_OPTION_INIT])
XGETTEXT_EXTRA_OPTIONS="$XGETTEXT_EXTRA_OPTIONS $1"
])

View File

@ -1,5 +1,5 @@
# printf-posix.m4 serial 2 (gettext-0.13.1) # printf-posix.m4 serial 5 (gettext-0.18)
dnl Copyright (C) 2003 Free Software Foundation, Inc. dnl Copyright (C) 2003, 2007, 2009-2010 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it, dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved. dnl with or without modifications, as long as this notice is preserved.
@ -27,17 +27,18 @@ int main ()
return (strcmp (buf, "55 33") != 0); return (strcmp (buf, "55 33") != 0);
}], gt_cv_func_printf_posix=yes, gt_cv_func_printf_posix=no, }], gt_cv_func_printf_posix=yes, gt_cv_func_printf_posix=no,
[ [
AC_EGREP_CPP(notposix, [ AC_EGREP_CPP([notposix], [
#if defined __NetBSD__ || defined _MSC_VER || defined __MINGW32__ || defined __CYGWIN__ #if defined __NetBSD__ || defined __BEOS__ || defined _MSC_VER || defined __MINGW32__ || defined __CYGWIN__
notposix notposix
#endif #endif
], gt_cv_func_printf_posix="guessing no", ],
gt_cv_func_printf_posix="guessing yes") [gt_cv_func_printf_posix="guessing no"],
[gt_cv_func_printf_posix="guessing yes"])
]) ])
]) ])
case $gt_cv_func_printf_posix in case $gt_cv_func_printf_posix in
*yes) *yes)
AC_DEFINE(HAVE_POSIX_PRINTF, 1, AC_DEFINE([HAVE_POSIX_PRINTF], [1],
[Define if your printf() function supports format strings with positions.]) [Define if your printf() function supports format strings with positions.])
;; ;;
esac esac

View File

@ -1,5 +1,5 @@
# progtest.m4 serial 4 (gettext-0.14.2) # progtest.m4 serial 6 (gettext-0.18)
dnl Copyright (C) 1996-2003, 2005 Free Software Foundation, Inc. dnl Copyright (C) 1996-2003, 2005, 2008-2010 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it, dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved. dnl with or without modifications, as long as this notice is preserved.
@ -16,7 +16,7 @@ dnl They are *not* in the public domain.
dnl Authors: dnl Authors:
dnl Ulrich Drepper <drepper@cygnus.com>, 1996. dnl Ulrich Drepper <drepper@cygnus.com>, 1996.
AC_PREREQ(2.50) AC_PREREQ([2.50])
# Search path for a program which passes the given test. # Search path for a program which passes the given test.
@ -55,7 +55,7 @@ rm -f conf$$.file
# Extract the first word of "$2", so it can be a program name with args. # Extract the first word of "$2", so it can be a program name with args.
set dummy $2; ac_word=[$]2 set dummy $2; ac_word=[$]2
AC_MSG_CHECKING([for $ac_word]) AC_MSG_CHECKING([for $ac_word])
AC_CACHE_VAL(ac_cv_path_$1, AC_CACHE_VAL([ac_cv_path_$1],
[case "[$]$1" in [case "[$]$1" in
[[\\/]]* | ?:[[\\/]]*) [[\\/]]* | ?:[[\\/]]*)
ac_cv_path_$1="[$]$1" # Let the user override the test with a path. ac_cv_path_$1="[$]$1" # Let the user override the test with a path.
@ -84,9 +84,9 @@ ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4"
esac])dnl esac])dnl
$1="$ac_cv_path_$1" $1="$ac_cv_path_$1"
if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then
AC_MSG_RESULT([$]$1) AC_MSG_RESULT([$][$1])
else else
AC_MSG_RESULT(no) AC_MSG_RESULT([no])
fi fi
AC_SUBST($1)dnl AC_SUBST([$1])dnl
]) ])

View File

@ -1,5 +1,5 @@
# size_max.m4 serial 5 # size_max.m4 serial 9
dnl Copyright (C) 2003, 2005-2006 Free Software Foundation, Inc. dnl Copyright (C) 2003, 2005-2006, 2008-2010 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it, dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved. dnl with or without modifications, as long as this notice is preserved.
@ -8,10 +8,9 @@ dnl From Bruno Haible.
AC_DEFUN([gl_SIZE_MAX], AC_DEFUN([gl_SIZE_MAX],
[ [
AC_CHECK_HEADERS(stdint.h) AC_CHECK_HEADERS([stdint.h])
dnl First test whether the system already has SIZE_MAX. dnl First test whether the system already has SIZE_MAX.
AC_MSG_CHECKING([for SIZE_MAX]) AC_CACHE_CHECK([for SIZE_MAX], [gl_cv_size_max], [
AC_CACHE_VAL([gl_cv_size_max], [
gl_cv_size_max= gl_cv_size_max=
AC_EGREP_CPP([Found it], [ AC_EGREP_CPP([Found it], [
#include <limits.h> #include <limits.h>
@ -21,16 +20,16 @@ AC_DEFUN([gl_SIZE_MAX],
#ifdef SIZE_MAX #ifdef SIZE_MAX
Found it Found it
#endif #endif
], gl_cv_size_max=yes) ], [gl_cv_size_max=yes])
if test -z "$gl_cv_size_max"; then if test -z "$gl_cv_size_max"; then
dnl Define it ourselves. Here we assume that the type 'size_t' is not wider dnl Define it ourselves. Here we assume that the type 'size_t' is not wider
dnl than the type 'unsigned long'. Try hard to find a definition that can dnl than the type 'unsigned long'. Try hard to find a definition that can
dnl be used in a preprocessor #if, i.e. doesn't contain a cast. dnl be used in a preprocessor #if, i.e. doesn't contain a cast.
_AC_COMPUTE_INT([sizeof (size_t) * CHAR_BIT - 1], size_t_bits_minus_1, AC_COMPUTE_INT([size_t_bits_minus_1], [sizeof (size_t) * CHAR_BIT - 1],
[#include <stddef.h> [#include <stddef.h>
#include <limits.h>], size_t_bits_minus_1=) #include <limits.h>], [size_t_bits_minus_1=])
_AC_COMPUTE_INT([sizeof (size_t) <= sizeof (unsigned int)], fits_in_uint, AC_COMPUTE_INT([fits_in_uint], [sizeof (size_t) <= sizeof (unsigned int)],
[#include <stddef.h>], fits_in_uint=) [#include <stddef.h>], [fits_in_uint=])
if test -n "$size_t_bits_minus_1" && test -n "$fits_in_uint"; then if test -n "$size_t_bits_minus_1" && test -n "$fits_in_uint"; then
if test $fits_in_uint = 1; then if test $fits_in_uint = 1; then
dnl Even though SIZE_MAX fits in an unsigned int, it must be of type dnl Even though SIZE_MAX fits in an unsigned int, it must be of type
@ -38,7 +37,7 @@ Found it
AC_TRY_COMPILE([#include <stddef.h> AC_TRY_COMPILE([#include <stddef.h>
extern size_t foo; extern size_t foo;
extern unsigned long foo; extern unsigned long foo;
], [], fits_in_uint=0) ], [], [fits_in_uint=0])
fi fi
dnl We cannot use 'expr' to simplify this expression, because 'expr' dnl We cannot use 'expr' to simplify this expression, because 'expr'
dnl works only with 'long' integers in the host environment, while we dnl works only with 'long' integers in the host environment, while we
@ -54,9 +53,23 @@ Found it
fi fi
fi fi
]) ])
AC_MSG_RESULT([$gl_cv_size_max])
if test "$gl_cv_size_max" != yes; then if test "$gl_cv_size_max" != yes; then
AC_DEFINE_UNQUOTED([SIZE_MAX], [$gl_cv_size_max], AC_DEFINE_UNQUOTED([SIZE_MAX], [$gl_cv_size_max],
[Define as the maximum value of type 'size_t', if the system doesn't define it.]) [Define as the maximum value of type 'size_t', if the system doesn't define it.])
fi fi
dnl Don't redefine SIZE_MAX in config.h if config.h is re-included after
dnl <stdint.h>. Remember that the #undef in AH_VERBATIM gets replaced with
dnl #define by AC_DEFINE_UNQUOTED.
AH_VERBATIM([SIZE_MAX],
[/* Define as the maximum value of type 'size_t', if the system doesn't define
it. */
#ifndef SIZE_MAX
# undef SIZE_MAX
#endif])
])
dnl Autoconf >= 2.61 has AC_COMPUTE_INT built-in.
dnl Remove this when we can assume autoconf >= 2.61.
m4_ifdef([AC_COMPUTE_INT], [], [
AC_DEFUN([AC_COMPUTE_INT], [_AC_COMPUTE_INT([$2],[$1],[$3],[$4])])
]) ])

View File

@ -1,5 +1,5 @@
# stdint_h.m4 serial 6 # stdint_h.m4 serial 8
dnl Copyright (C) 1997-2004, 2006 Free Software Foundation, Inc. dnl Copyright (C) 1997-2004, 2006, 2008-2010 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it, dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved. dnl with or without modifications, as long as this notice is preserved.
@ -11,15 +11,15 @@ dnl From Paul Eggert.
AC_DEFUN([gl_AC_HEADER_STDINT_H], AC_DEFUN([gl_AC_HEADER_STDINT_H],
[ [
AC_CACHE_CHECK([for stdint.h], gl_cv_header_stdint_h, AC_CACHE_CHECK([for stdint.h], [gl_cv_header_stdint_h],
[AC_TRY_COMPILE( [AC_TRY_COMPILE(
[#include <sys/types.h> [#include <sys/types.h>
#include <stdint.h>], #include <stdint.h>],
[uintmax_t i = (uintmax_t) -1; return !i;], [uintmax_t i = (uintmax_t) -1; return !i;],
gl_cv_header_stdint_h=yes, [gl_cv_header_stdint_h=yes],
gl_cv_header_stdint_h=no)]) [gl_cv_header_stdint_h=no])])
if test $gl_cv_header_stdint_h = yes; then if test $gl_cv_header_stdint_h = yes; then
AC_DEFINE_UNQUOTED(HAVE_STDINT_H_WITH_UINTMAX, 1, AC_DEFINE_UNQUOTED([HAVE_STDINT_H_WITH_UINTMAX], [1],
[Define if <stdint.h> exists, doesn't clash with <sys/types.h>, [Define if <stdint.h> exists, doesn't clash with <sys/types.h>,
and declares uintmax_t. ]) and declares uintmax_t. ])
fi fi

347
m4/threadlib.m4 Normal file
View File

@ -0,0 +1,347 @@
# threadlib.m4 serial 5 (gettext-0.18)
dnl Copyright (C) 2005-2010 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved.
dnl From Bruno Haible.
dnl gl_THREADLIB
dnl ------------
dnl Tests for a multithreading library to be used.
dnl Defines at most one of the macros USE_POSIX_THREADS, USE_SOLARIS_THREADS,
dnl USE_PTH_THREADS, USE_WIN32_THREADS
dnl Sets the variables LIBTHREAD and LTLIBTHREAD to the linker options for use
dnl in a Makefile (LIBTHREAD for use without libtool, LTLIBTHREAD for use with
dnl libtool).
dnl Sets the variables LIBMULTITHREAD and LTLIBMULTITHREAD similarly, for
dnl programs that really need multithread functionality. The difference
dnl between LIBTHREAD and LIBMULTITHREAD is that on platforms supporting weak
dnl symbols, typically LIBTHREAD="" whereas LIBMULTITHREAD="-lpthread".
dnl Adds to CPPFLAGS the flag -D_REENTRANT or -D_THREAD_SAFE if needed for
dnl multithread-safe programs.
AC_DEFUN([gl_THREADLIB_EARLY],
[
AC_REQUIRE([gl_THREADLIB_EARLY_BODY])
])
dnl The guts of gl_THREADLIB_EARLY. Needs to be expanded only once.
AC_DEFUN([gl_THREADLIB_EARLY_BODY],
[
dnl Ordering constraints: This macro modifies CPPFLAGS in a way that
dnl influences the result of the autoconf tests that test for *_unlocked
dnl declarations, on AIX 5 at least. Therefore it must come early.
AC_BEFORE([$0], [gl_FUNC_GLIBC_UNLOCKED_IO])dnl
AC_BEFORE([$0], [gl_ARGP])dnl
AC_REQUIRE([AC_CANONICAL_HOST])
dnl _GNU_SOURCE is needed for pthread_rwlock_t on glibc systems.
dnl AC_USE_SYSTEM_EXTENSIONS was introduced in autoconf 2.60 and obsoletes
dnl AC_GNU_SOURCE.
m4_ifdef([AC_USE_SYSTEM_EXTENSIONS],
[AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])],
[AC_REQUIRE([AC_GNU_SOURCE])])
dnl Check for multithreading.
m4_divert_text([DEFAULTS], [gl_use_threads_default=])
AC_ARG_ENABLE([threads],
AC_HELP_STRING([--enable-threads={posix|solaris|pth|win32}], [specify multithreading API])
AC_HELP_STRING([--disable-threads], [build without multithread safety]),
[gl_use_threads=$enableval],
[if test -n "$gl_use_threads_default"; then
gl_use_threads="$gl_use_threads_default"
else
changequote(,)dnl
case "$host_os" in
dnl Disable multithreading by default on OSF/1, because it interferes
dnl with fork()/exec(): When msgexec is linked with -lpthread, its
dnl child process gets an endless segmentation fault inside execvp().
dnl Disable multithreading by default on Cygwin 1.5.x, because it has
dnl bugs that lead to endless loops or crashes. See
dnl <http://cygwin.com/ml/cygwin/2009-08/msg00283.html>.
osf*) gl_use_threads=no ;;
cygwin*)
case `uname -r` in
1.[0-5].*) gl_use_threads=no ;;
*) gl_use_threads=yes ;;
esac
;;
*) gl_use_threads=yes ;;
esac
changequote([,])dnl
fi
])
if test "$gl_use_threads" = yes || test "$gl_use_threads" = posix; then
# For using <pthread.h>:
case "$host_os" in
osf*)
# On OSF/1, the compiler needs the flag -D_REENTRANT so that it
# groks <pthread.h>. cc also understands the flag -pthread, but
# we don't use it because 1. gcc-2.95 doesn't understand -pthread,
# 2. putting a flag into CPPFLAGS that has an effect on the linker
# causes the AC_TRY_LINK test below to succeed unexpectedly,
# leading to wrong values of LIBTHREAD and LTLIBTHREAD.
CPPFLAGS="$CPPFLAGS -D_REENTRANT"
;;
esac
# Some systems optimize for single-threaded programs by default, and
# need special flags to disable these optimizations. For example, the
# definition of 'errno' in <errno.h>.
case "$host_os" in
aix* | freebsd*) CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE" ;;
solaris*) CPPFLAGS="$CPPFLAGS -D_REENTRANT" ;;
esac
fi
])
dnl The guts of gl_THREADLIB. Needs to be expanded only once.
AC_DEFUN([gl_THREADLIB_BODY],
[
AC_REQUIRE([gl_THREADLIB_EARLY_BODY])
gl_threads_api=none
LIBTHREAD=
LTLIBTHREAD=
LIBMULTITHREAD=
LTLIBMULTITHREAD=
if test "$gl_use_threads" != no; then
dnl Check whether the compiler and linker support weak declarations.
AC_CACHE_CHECK([whether imported symbols can be declared weak],
[gl_cv_have_weak],
[gl_cv_have_weak=no
dnl First, test whether the compiler accepts it syntactically.
AC_TRY_LINK([extern void xyzzy ();
#pragma weak xyzzy], [xyzzy();], [gl_cv_have_weak=maybe])
if test $gl_cv_have_weak = maybe; then
dnl Second, test whether it actually works. On Cygwin 1.7.2, with
dnl gcc 4.3, symbols declared weak always evaluate to the address 0.
AC_TRY_RUN([
#include <stdio.h>
#pragma weak fputs
int main ()
{
return (fputs == NULL);
}], [gl_cv_have_weak=yes], [gl_cv_have_weak=no],
[dnl When cross-compiling, assume that only ELF platforms support
dnl weak symbols.
AC_EGREP_CPP([Extensible Linking Format],
[#ifdef __ELF__
Extensible Linking Format
#endif
],
[gl_cv_have_weak="guessing yes"],
[gl_cv_have_weak="guessing no"])
])
fi
])
if test "$gl_use_threads" = yes || test "$gl_use_threads" = posix; then
# On OSF/1, the compiler needs the flag -pthread or -D_REENTRANT so that
# it groks <pthread.h>. It's added above, in gl_THREADLIB_EARLY_BODY.
AC_CHECK_HEADER([pthread.h],
[gl_have_pthread_h=yes], [gl_have_pthread_h=no])
if test "$gl_have_pthread_h" = yes; then
# Other possible tests:
# -lpthreads (FSU threads, PCthreads)
# -lgthreads
gl_have_pthread=
# Test whether both pthread_mutex_lock and pthread_mutexattr_init exist
# in libc. IRIX 6.5 has the first one in both libc and libpthread, but
# the second one only in libpthread, and lock.c needs it.
AC_TRY_LINK([#include <pthread.h>],
[pthread_mutex_lock((pthread_mutex_t*)0);
pthread_mutexattr_init((pthread_mutexattr_t*)0);],
[gl_have_pthread=yes])
# Test for libpthread by looking for pthread_kill. (Not pthread_self,
# since it is defined as a macro on OSF/1.)
if test -n "$gl_have_pthread"; then
# The program links fine without libpthread. But it may actually
# need to link with libpthread in order to create multiple threads.
AC_CHECK_LIB([pthread], [pthread_kill],
[LIBMULTITHREAD=-lpthread LTLIBMULTITHREAD=-lpthread
# On Solaris and HP-UX, most pthread functions exist also in libc.
# Therefore pthread_in_use() needs to actually try to create a
# thread: pthread_create from libc will fail, whereas
# pthread_create will actually create a thread.
case "$host_os" in
solaris* | hpux*)
AC_DEFINE([PTHREAD_IN_USE_DETECTION_HARD], [1],
[Define if the pthread_in_use() detection is hard.])
esac
])
else
# Some library is needed. Try libpthread and libc_r.
AC_CHECK_LIB([pthread], [pthread_kill],
[gl_have_pthread=yes
LIBTHREAD=-lpthread LTLIBTHREAD=-lpthread
LIBMULTITHREAD=-lpthread LTLIBMULTITHREAD=-lpthread])
if test -z "$gl_have_pthread"; then
# For FreeBSD 4.
AC_CHECK_LIB([c_r], [pthread_kill],
[gl_have_pthread=yes
LIBTHREAD=-lc_r LTLIBTHREAD=-lc_r
LIBMULTITHREAD=-lc_r LTLIBMULTITHREAD=-lc_r])
fi
fi
if test -n "$gl_have_pthread"; then
gl_threads_api=posix
AC_DEFINE([USE_POSIX_THREADS], [1],
[Define if the POSIX multithreading library can be used.])
if test -n "$LIBMULTITHREAD" || test -n "$LTLIBMULTITHREAD"; then
if case "$gl_cv_have_weak" in *yes) true;; *) false;; esac; then
AC_DEFINE([USE_POSIX_THREADS_WEAK], [1],
[Define if references to the POSIX multithreading library should be made weak.])
LIBTHREAD=
LTLIBTHREAD=
fi
fi
fi
fi
fi
if test -z "$gl_have_pthread"; then
if test "$gl_use_threads" = yes || test "$gl_use_threads" = solaris; then
gl_have_solaristhread=
gl_save_LIBS="$LIBS"
LIBS="$LIBS -lthread"
AC_TRY_LINK([#include <thread.h>
#include <synch.h>],
[thr_self();],
[gl_have_solaristhread=yes])
LIBS="$gl_save_LIBS"
if test -n "$gl_have_solaristhread"; then
gl_threads_api=solaris
LIBTHREAD=-lthread
LTLIBTHREAD=-lthread
LIBMULTITHREAD="$LIBTHREAD"
LTLIBMULTITHREAD="$LTLIBTHREAD"
AC_DEFINE([USE_SOLARIS_THREADS], [1],
[Define if the old Solaris multithreading library can be used.])
if case "$gl_cv_have_weak" in *yes) true;; *) false;; esac; then
AC_DEFINE([USE_SOLARIS_THREADS_WEAK], [1],
[Define if references to the old Solaris multithreading library should be made weak.])
LIBTHREAD=
LTLIBTHREAD=
fi
fi
fi
fi
if test "$gl_use_threads" = pth; then
gl_save_CPPFLAGS="$CPPFLAGS"
AC_LIB_LINKFLAGS([pth])
gl_have_pth=
gl_save_LIBS="$LIBS"
LIBS="$LIBS -lpth"
AC_TRY_LINK([#include <pth.h>], [pth_self();], [gl_have_pth=yes])
LIBS="$gl_save_LIBS"
if test -n "$gl_have_pth"; then
gl_threads_api=pth
LIBTHREAD="$LIBPTH"
LTLIBTHREAD="$LTLIBPTH"
LIBMULTITHREAD="$LIBTHREAD"
LTLIBMULTITHREAD="$LTLIBTHREAD"
AC_DEFINE([USE_PTH_THREADS], [1],
[Define if the GNU Pth multithreading library can be used.])
if test -n "$LIBMULTITHREAD" || test -n "$LTLIBMULTITHREAD"; then
if case "$gl_cv_have_weak" in *yes) true;; *) false;; esac; then
AC_DEFINE([USE_PTH_THREADS_WEAK], [1],
[Define if references to the GNU Pth multithreading library should be made weak.])
LIBTHREAD=
LTLIBTHREAD=
fi
fi
else
CPPFLAGS="$gl_save_CPPFLAGS"
fi
fi
if test -z "$gl_have_pthread"; then
if test "$gl_use_threads" = yes || test "$gl_use_threads" = win32; then
if { case "$host_os" in
mingw*) true;;
*) false;;
esac
}; then
gl_threads_api=win32
AC_DEFINE([USE_WIN32_THREADS], [1],
[Define if the Win32 multithreading API can be used.])
fi
fi
fi
fi
AC_MSG_CHECKING([for multithread API to use])
AC_MSG_RESULT([$gl_threads_api])
AC_SUBST([LIBTHREAD])
AC_SUBST([LTLIBTHREAD])
AC_SUBST([LIBMULTITHREAD])
AC_SUBST([LTLIBMULTITHREAD])
])
AC_DEFUN([gl_THREADLIB],
[
AC_REQUIRE([gl_THREADLIB_EARLY])
AC_REQUIRE([gl_THREADLIB_BODY])
])
dnl gl_DISABLE_THREADS
dnl ------------------
dnl Sets the gl_THREADLIB default so that threads are not used by default.
dnl The user can still override it at installation time, by using the
dnl configure option '--enable-threads'.
AC_DEFUN([gl_DISABLE_THREADS], [
m4_divert_text([INIT_PREPARE], [gl_use_threads_default=no])
])
dnl Survey of platforms:
dnl
dnl Platform Available Compiler Supports test-lock
dnl flavours option weak result
dnl --------------- --------- --------- -------- ---------
dnl Linux 2.4/glibc posix -lpthread Y OK
dnl
dnl GNU Hurd/glibc posix
dnl
dnl FreeBSD 5.3 posix -lc_r Y
dnl posix -lkse ? Y
dnl posix -lpthread ? Y
dnl posix -lthr Y
dnl
dnl FreeBSD 5.2 posix -lc_r Y
dnl posix -lkse Y
dnl posix -lthr Y
dnl
dnl FreeBSD 4.0,4.10 posix -lc_r Y OK
dnl
dnl NetBSD 1.6 --
dnl
dnl OpenBSD 3.4 posix -lpthread Y OK
dnl
dnl MacOS X 10.[123] posix -lpthread Y OK
dnl
dnl Solaris 7,8,9 posix -lpthread Y Sol 7,8: 0.0; Sol 9: OK
dnl solaris -lthread Y Sol 7,8: 0.0; Sol 9: OK
dnl
dnl HP-UX 11 posix -lpthread N (cc) OK
dnl Y (gcc)
dnl
dnl IRIX 6.5 posix -lpthread Y 0.5
dnl
dnl AIX 4.3,5.1 posix -lpthread N AIX 4: 0.5; AIX 5: OK
dnl
dnl OSF/1 4.0,5.1 posix -pthread (cc) N OK
dnl -lpthread (gcc) Y
dnl
dnl Cygwin posix -lpthread Y OK
dnl
dnl Any of the above pth -lpth 0.0
dnl
dnl Mingw win32 N OK
dnl
dnl BeOS 5 --
dnl
dnl The test-lock result shows what happens if in test-lock.c EXPLICIT_YIELD is
dnl turned off:
dnl OK if all three tests terminate OK,
dnl 0.5 if the first test terminates OK but the second one loops endlessly,
dnl 0.0 if the first test already loops endlessly.

View File

@ -1,12 +1,12 @@
# uintmax_t.m4 serial 9 # uintmax_t.m4 serial 12
dnl Copyright (C) 1997-2004 Free Software Foundation, Inc. dnl Copyright (C) 1997-2004, 2007-2010 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it, dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved. dnl with or without modifications, as long as this notice is preserved.
dnl From Paul Eggert. dnl From Paul Eggert.
AC_PREREQ(2.13) AC_PREREQ([2.13])
# Define uintmax_t to 'unsigned long' or 'unsigned long long' # Define uintmax_t to 'unsigned long' or 'unsigned long long'
# if it is not already defined in <stdint.h> or <inttypes.h>. # if it is not already defined in <stdint.h> or <inttypes.h>.
@ -16,15 +16,15 @@ AC_DEFUN([gl_AC_TYPE_UINTMAX_T],
AC_REQUIRE([gl_AC_HEADER_INTTYPES_H]) AC_REQUIRE([gl_AC_HEADER_INTTYPES_H])
AC_REQUIRE([gl_AC_HEADER_STDINT_H]) AC_REQUIRE([gl_AC_HEADER_STDINT_H])
if test $gl_cv_header_inttypes_h = no && test $gl_cv_header_stdint_h = no; then if test $gl_cv_header_inttypes_h = no && test $gl_cv_header_stdint_h = no; then
AC_REQUIRE([gl_AC_TYPE_UNSIGNED_LONG_LONG]) AC_REQUIRE([AC_TYPE_UNSIGNED_LONG_LONG_INT])
test $ac_cv_type_unsigned_long_long = yes \ test $ac_cv_type_unsigned_long_long_int = yes \
&& ac_type='unsigned long long' \ && ac_type='unsigned long long' \
|| ac_type='unsigned long' || ac_type='unsigned long'
AC_DEFINE_UNQUOTED(uintmax_t, $ac_type, AC_DEFINE_UNQUOTED([uintmax_t], [$ac_type],
[Define to unsigned long or unsigned long long [Define to unsigned long or unsigned long long
if <stdint.h> and <inttypes.h> don't define.]) if <stdint.h> and <inttypes.h> don't define.])
else else
AC_DEFINE(HAVE_UINTMAX_T, 1, AC_DEFINE([HAVE_UINTMAX_T], [1],
[Define if you have the 'uintmax_t' type in <stdint.h> or <inttypes.h>.]) [Define if you have the 'uintmax_t' type in <stdint.h> or <inttypes.h>.])
fi fi
]) ])

View File

@ -1,5 +1,5 @@
# visibility.m4 serial 1 (gettext-0.15) # visibility.m4 serial 3 (gettext-0.18)
dnl Copyright (C) 2005 Free Software Foundation, Inc. dnl Copyright (C) 2005, 2008-2010 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it, dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved. dnl with or without modifications, as long as this notice is preserved.
@ -26,18 +26,40 @@ AC_DEFUN([gl_VISIBILITY],
CFLAG_VISIBILITY= CFLAG_VISIBILITY=
HAVE_VISIBILITY=0 HAVE_VISIBILITY=0
if test -n "$GCC"; then if test -n "$GCC"; then
dnl First, check whether -Werror can be added to the command line, or
dnl whether it leads to an error because of some other option that the
dnl user has put into $CC $CFLAGS $CPPFLAGS.
AC_MSG_CHECKING([whether the -Werror option is usable])
AC_CACHE_VAL([gl_cv_cc_vis_werror], [
gl_save_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -Werror"
AC_TRY_COMPILE([], [],
[gl_cv_cc_vis_werror=yes],
[gl_cv_cc_vis_werror=no])
CFLAGS="$gl_save_CFLAGS"])
AC_MSG_RESULT([$gl_cv_cc_vis_werror])
dnl Now check whether visibility declarations are supported.
AC_MSG_CHECKING([for simple visibility declarations]) AC_MSG_CHECKING([for simple visibility declarations])
AC_CACHE_VAL(gl_cv_cc_visibility, [ AC_CACHE_VAL([gl_cv_cc_visibility], [
gl_save_CFLAGS="$CFLAGS" gl_save_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -fvisibility=hidden" CFLAGS="$CFLAGS -fvisibility=hidden"
dnl We use the option -Werror and a function dummyfunc, because on some
dnl platforms (Cygwin 1.7) the use of -fvisibility triggers a warning
dnl "visibility attribute not supported in this configuration; ignored"
dnl at the first function definition in every compilation unit, and we
dnl don't want to use the option in this case.
if test $gl_cv_cc_vis_werror = yes; then
CFLAGS="$CFLAGS -Werror"
fi
AC_TRY_COMPILE( AC_TRY_COMPILE(
[extern __attribute__((__visibility__("hidden"))) int hiddenvar; [extern __attribute__((__visibility__("hidden"))) int hiddenvar;
extern __attribute__((__visibility__("default"))) int exportedvar; extern __attribute__((__visibility__("default"))) int exportedvar;
extern __attribute__((__visibility__("hidden"))) int hiddenfunc (void); extern __attribute__((__visibility__("hidden"))) int hiddenfunc (void);
extern __attribute__((__visibility__("default"))) int exportedfunc (void);], extern __attribute__((__visibility__("default"))) int exportedfunc (void);
void dummyfunc (void) {}],
[], [],
gl_cv_cc_visibility=yes, [gl_cv_cc_visibility=yes],
gl_cv_cc_visibility=no) [gl_cv_cc_visibility=no])
CFLAGS="$gl_save_CFLAGS"]) CFLAGS="$gl_save_CFLAGS"])
AC_MSG_RESULT([$gl_cv_cc_visibility]) AC_MSG_RESULT([$gl_cv_cc_visibility])
if test $gl_cv_cc_visibility = yes; then if test $gl_cv_cc_visibility = yes; then

View File

@ -1,5 +1,5 @@
# wchar_t.m4 serial 1 (gettext-0.12) # wchar_t.m4 serial 3 (gettext-0.18)
dnl Copyright (C) 2002-2003 Free Software Foundation, Inc. dnl Copyright (C) 2002-2003, 2008-2010 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it, dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved. dnl with or without modifications, as long as this notice is preserved.
@ -10,11 +10,11 @@ dnl Prerequisite: AC_PROG_CC
AC_DEFUN([gt_TYPE_WCHAR_T], AC_DEFUN([gt_TYPE_WCHAR_T],
[ [
AC_CACHE_CHECK([for wchar_t], gt_cv_c_wchar_t, AC_CACHE_CHECK([for wchar_t], [gt_cv_c_wchar_t],
[AC_TRY_COMPILE([#include <stddef.h> [AC_TRY_COMPILE([#include <stddef.h>
wchar_t foo = (wchar_t)'\0';], , wchar_t foo = (wchar_t)'\0';], ,
gt_cv_c_wchar_t=yes, gt_cv_c_wchar_t=no)]) [gt_cv_c_wchar_t=yes], [gt_cv_c_wchar_t=no])])
if test $gt_cv_c_wchar_t = yes; then if test $gt_cv_c_wchar_t = yes; then
AC_DEFINE(HAVE_WCHAR_T, 1, [Define if you have the 'wchar_t' type.]) AC_DEFINE([HAVE_WCHAR_T], [1], [Define if you have the 'wchar_t' type.])
fi fi
]) ])

View File

@ -1,5 +1,5 @@
# wint_t.m4 serial 1 (gettext-0.12) # wint_t.m4 serial 4 (gettext-0.18)
dnl Copyright (C) 2003 Free Software Foundation, Inc. dnl Copyright (C) 2003, 2007-2010 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it, dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved. dnl with or without modifications, as long as this notice is preserved.
@ -10,11 +10,19 @@ dnl Prerequisite: AC_PROG_CC
AC_DEFUN([gt_TYPE_WINT_T], AC_DEFUN([gt_TYPE_WINT_T],
[ [
AC_CACHE_CHECK([for wint_t], gt_cv_c_wint_t, AC_CACHE_CHECK([for wint_t], [gt_cv_c_wint_t],
[AC_TRY_COMPILE([#include <wchar.h> [AC_TRY_COMPILE([
/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
<wchar.h>.
BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be included
before <wchar.h>. */
#include <stddef.h>
#include <stdio.h>
#include <time.h>
#include <wchar.h>
wint_t foo = (wchar_t)'\0';], , wint_t foo = (wchar_t)'\0';], ,
gt_cv_c_wint_t=yes, gt_cv_c_wint_t=no)]) [gt_cv_c_wint_t=yes], [gt_cv_c_wint_t=no])])
if test $gt_cv_c_wint_t = yes; then if test $gt_cv_c_wint_t = yes; then
AC_DEFINE(HAVE_WINT_T, 1, [Define if you have the 'wint_t' type.]) AC_DEFINE([HAVE_WINT_T], [1], [Define if you have the 'wint_t' type.])
fi fi
]) ])

View File

@ -1,5 +1,5 @@
# xsize.m4 serial 3 # xsize.m4 serial 4
dnl Copyright (C) 2003-2004 Free Software Foundation, Inc. dnl Copyright (C) 2003-2004, 2008-2010 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it, dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved. dnl with or without modifications, as long as this notice is preserved.
@ -9,5 +9,5 @@ AC_DEFUN([gl_XSIZE],
dnl Prerequisites of lib/xsize.h. dnl Prerequisites of lib/xsize.h.
AC_REQUIRE([gl_SIZE_MAX]) AC_REQUIRE([gl_SIZE_MAX])
AC_REQUIRE([AC_C_INLINE]) AC_REQUIRE([AC_C_INLINE])
AC_CHECK_HEADERS(stdint.h) AC_CHECK_HEADERS([stdint.h])
]) ])

View File

@ -1,5 +1,5 @@
# Makefile for PO directory in any package using GNU gettext. # Makefile for PO directory in any package using GNU gettext.
# Copyright (C) 1995-1997, 2000-2006 by Ulrich Drepper <drepper@gnu.ai.mit.edu> # Copyright (C) 1995-1997, 2000-2007, 2009-2010 by Ulrich Drepper <drepper@gnu.ai.mit.edu>
# #
# This file can be copied and used freely without restrictions. It can # This file can be copied and used freely without restrictions. It can
# be used in projects which are not available under the GNU General Public # be used in projects which are not available under the GNU General Public
@ -8,7 +8,8 @@
# Please note that the actual code of GNU gettext is covered by the GNU # Please note that the actual code of GNU gettext is covered by the GNU
# General Public License and is *not* in the public domain. # General Public License and is *not* in the public domain.
# #
# Origin: gettext-0.16 # Origin: gettext-0.18
GETTEXT_MACRO_VERSION = 0.18
PACKAGE = @PACKAGE@ PACKAGE = @PACKAGE@
VERSION = @VERSION@ VERSION = @VERSION@
@ -87,19 +88,26 @@ CATALOGS = @CATALOGS@
.po.gmo: .po.gmo:
@lang=`echo $* | sed -e 's,.*/,,'`; \ @lang=`echo $* | sed -e 's,.*/,,'`; \
test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \
echo "$${cdcmd}rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o $${lang}.gmo $${lang}.po"; \ echo "$${cdcmd}rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics --verbose -o $${lang}.gmo $${lang}.po"; \
cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o t-$${lang}.gmo $${lang}.po && mv t-$${lang}.gmo $${lang}.gmo cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics --verbose -o t-$${lang}.gmo $${lang}.po && mv t-$${lang}.gmo $${lang}.gmo
.sin.sed: .sin.sed:
sed -e '/^#/d' $< > t-$@ sed -e '/^#/d' $< > t-$@
mv t-$@ $@ mv t-$@ $@
all: all-@USE_NLS@ all: check-macro-version all-@USE_NLS@
all-yes: stamp-po all-yes: stamp-po
all-no: all-no:
# Ensure that the gettext macros and this Makefile.in.in are in sync.
check-macro-version:
@test "$(GETTEXT_MACRO_VERSION)" = "@GETTEXT_MACRO_VERSION@" \
|| { echo "*** error: gettext infrastructure mismatch: using a Makefile.in.in from gettext version $(GETTEXT_MACRO_VERSION) but the autoconf macros are from gettext version @GETTEXT_MACRO_VERSION@" 1>&2; \
exit 1; \
}
# $(srcdir)/$(DOMAIN).pot is only created when needed. When xgettext finds no # $(srcdir)/$(DOMAIN).pot is only created when needed. When xgettext finds no
# internationalized messages, no $(srcdir)/$(DOMAIN).pot is created (because # internationalized messages, no $(srcdir)/$(DOMAIN).pot is created (because
# we don't want to bother translators with empty POT files). We assume that # we don't want to bother translators with empty POT files). We assume that
@ -130,16 +138,34 @@ stamp-po: $(srcdir)/$(DOMAIN).pot
# This target rebuilds $(DOMAIN).pot; it is an expensive operation. # This target rebuilds $(DOMAIN).pot; it is an expensive operation.
# Note that $(DOMAIN).pot is not touched if it doesn't need to be changed. # Note that $(DOMAIN).pot is not touched if it doesn't need to be changed.
$(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed $(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed
if LC_ALL=C grep 'GNU @PACKAGE@' $(top_srcdir)/* 2>/dev/null | grep -v 'libtool:' >/dev/null; then \
package_gnu='GNU '; \
else \
package_gnu=''; \
fi; \
if test -n '$(MSGID_BUGS_ADDRESS)' || test '$(PACKAGE_BUGREPORT)' = '@'PACKAGE_BUGREPORT'@'; then \ if test -n '$(MSGID_BUGS_ADDRESS)' || test '$(PACKAGE_BUGREPORT)' = '@'PACKAGE_BUGREPORT'@'; then \
msgid_bugs_address='$(MSGID_BUGS_ADDRESS)'; \ msgid_bugs_address='$(MSGID_BUGS_ADDRESS)'; \
else \ else \
msgid_bugs_address='$(PACKAGE_BUGREPORT)'; \ msgid_bugs_address='$(PACKAGE_BUGREPORT)'; \
fi; \ fi; \
$(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ case `$(XGETTEXT) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \
--add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) \ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-5] | 0.1[0-5].* | 0.16 | 0.16.[0-1]*) \
--files-from=$(srcdir)/POTFILES.in \ $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \
--copyright-holder='$(COPYRIGHT_HOLDER)' \ --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \
--msgid-bugs-address="$$msgid_bugs_address" --files-from=$(srcdir)/POTFILES.in \
--copyright-holder='$(COPYRIGHT_HOLDER)' \
--msgid-bugs-address="$$msgid_bugs_address" \
;; \
*) \
$(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \
--add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \
--files-from=$(srcdir)/POTFILES.in \
--copyright-holder='$(COPYRIGHT_HOLDER)' \
--package-name="$${package_gnu}@PACKAGE@" \
--package-version='@VERSION@' \
--msgid-bugs-address="$$msgid_bugs_address" \
;; \
esac
test ! -f $(DOMAIN).po || { \ test ! -f $(DOMAIN).po || { \
if test -f $(srcdir)/$(DOMAIN).pot; then \ if test -f $(srcdir)/$(DOMAIN).pot; then \
sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \ sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \
@ -167,8 +193,15 @@ $(POFILES): $(srcdir)/$(DOMAIN).pot
@lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \ @lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \
if test -f "$(srcdir)/$${lang}.po"; then \ if test -f "$(srcdir)/$${lang}.po"; then \
test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \
echo "$${cdcmd}$(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot"; \ echo "$${cdcmd}$(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) --lang=$${lang} $${lang}.po $(DOMAIN).pot"; \
cd $(srcdir) && $(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot; \ cd $(srcdir) \
&& { case `$(MSGMERGE_UPDATE) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \
'' | 0.[0-9] | 0.[0-9].* | 0.1[0-7] | 0.1[0-7].*) \
$(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) $${lang}.po $(DOMAIN).pot;; \
*) \
$(MSGMERGE_UPDATE) $(MSGMERGE_OPTIONS) --lang=$${lang} $${lang}.po $(DOMAIN).pot;; \
esac; \
}; \
else \ else \
$(MAKE) $${lang}.po-create; \ $(MAKE) $${lang}.po-create; \
fi fi
@ -191,7 +224,6 @@ install-data: install-data-@USE_NLS@
fi fi
install-data-no: all install-data-no: all
install-data-yes: all install-data-yes: all
$(mkdir_p) $(DESTDIR)$(datadir)
@catalogs='$(CATALOGS)'; \ @catalogs='$(CATALOGS)'; \
for cat in $$catalogs; do \ for cat in $$catalogs; do \
cat=`basename $$cat`; \ cat=`basename $$cat`; \
@ -243,7 +275,6 @@ installdirs-data: installdirs-data-@USE_NLS@
fi fi
installdirs-data-no: installdirs-data-no:
installdirs-data-yes: installdirs-data-yes:
$(mkdir_p) $(DESTDIR)$(datadir)
@catalogs='$(CATALOGS)'; \ @catalogs='$(CATALOGS)'; \
for cat in $$catalogs; do \ for cat in $$catalogs; do \
cat=`basename $$cat`; \ cat=`basename $$cat`; \
@ -369,9 +400,15 @@ update-po: Makefile
tmpdir=`pwd`; \ tmpdir=`pwd`; \
echo "$$lang:"; \ echo "$$lang:"; \
test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \
echo "$${cdcmd}$(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \ echo "$${cdcmd}$(MSGMERGE) $(MSGMERGE_OPTIONS) --lang=$$lang $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \
cd $(srcdir); \ cd $(srcdir); \
if $(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$tmpdir/$$lang.new.po; then \ if { case `$(MSGMERGE) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \
'' | 0.[0-9] | 0.[0-9].* | 0.1[0-7] | 0.1[0-7].*) \
$(MSGMERGE) $(MSGMERGE_OPTIONS) -o $$tmpdir/$$lang.new.po $$lang.po $(DOMAIN).pot;; \
*) \
$(MSGMERGE) $(MSGMERGE_OPTIONS) --lang=$$lang -o $$tmpdir/$$lang.new.po $$lang.po $(DOMAIN).pot;; \
esac; \
}; then \
if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \
rm -f $$tmpdir/$$lang.new.po; \ rm -f $$tmpdir/$$lang.new.po; \
else \ else \
@ -392,9 +429,13 @@ $(DUMMYPOFILES):
update-gmo: Makefile $(GMOFILES) update-gmo: Makefile $(GMOFILES)
@: @:
# Recreate Makefile by invoking config.status. Explicitly invoke the shell,
# because execution permission bits may not work on the current file system.
# Use @SHELL@, which is the shell determined by autoconf for the use by its
# scripts, not $(SHELL) which is hardwired to /bin/sh and may be deficient.
Makefile: Makefile.in.in Makevars $(top_builddir)/config.status @POMAKEFILEDEPS@ Makefile: Makefile.in.in Makevars $(top_builddir)/config.status @POMAKEFILEDEPS@
cd $(top_builddir) \ cd $(top_builddir) \
&& $(SHELL) ./config.status $(subdir)/$@.in po-directories && @SHELL@ ./config.status $(subdir)/$@.in po-directories
force: force:

View File

@ -20,7 +20,7 @@ en@boldquot.po-update: en@boldquot.po-update-en
ll=`echo $$lang | sed -e 's/@.*//'`; \ ll=`echo $$lang | sed -e 's/@.*//'`; \
LC_ALL=C; export LC_ALL; \ LC_ALL=C; export LC_ALL; \
cd $(srcdir); \ cd $(srcdir); \
if $(MSGINIT) -i $(DOMAIN).pot --no-translator -l $$ll -o - 2>/dev/null | sed -f $$tmpdir/$$lang.insert-header | $(MSGCONV) -t UTF-8 | $(MSGFILTER) sed -f `echo $$lang | sed -e 's/.*@//'`.sed 2>/dev/null > $$tmpdir/$$lang.new.po; then \ if $(MSGINIT) -i $(DOMAIN).pot --no-translator -l $$lang -o - 2>/dev/null | sed -f $$tmpdir/$$lang.insert-header | $(MSGCONV) -t UTF-8 | $(MSGFILTER) sed -f `echo $$lang | sed -e 's/.*@//'`.sed 2>/dev/null > $$tmpdir/$$lang.new.po; then \
if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \
rm -f $$tmpdir/$$lang.new.po; \ rm -f $$tmpdir/$$lang.new.po; \
else \ else \

View File

@ -2,7 +2,7 @@
# Output a system dependent set of variables, describing how to set the # Output a system dependent set of variables, describing how to set the
# run time search path of shared libraries in an executable. # run time search path of shared libraries in an executable.
# #
# Copyright 1996-2012 Free Software Foundation, Inc. # Copyright 1996-2010 Free Software Foundation, Inc.
# Taken from GNU libtool, 2001 # Taken from GNU libtool, 2001
# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996 # Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
# #
@ -25,7 +25,7 @@
# known workaround is to choose shorter directory names for the build # known workaround is to choose shorter directory names for the build
# directory and/or the installation directory. # directory and/or the installation directory.
# All known linkers require a '.a' archive for static linking (except MSVC, # All known linkers require a `.a' archive for static linking (except MSVC,
# which needs '.lib'). # which needs '.lib').
libext=a libext=a
shrext=.so shrext=.so
@ -57,6 +57,13 @@ else
aix*) aix*)
wl='-Wl,' wl='-Wl,'
;; ;;
darwin*)
case $cc_basename in
xlc*)
wl='-Wl,'
;;
esac
;;
mingw* | cygwin* | pw32* | os2* | cegcc*) mingw* | cygwin* | pw32* | os2* | cegcc*)
;; ;;
hpux9* | hpux10* | hpux11*) hpux9* | hpux10* | hpux11*)
@ -65,7 +72,9 @@ else
irix5* | irix6* | nonstopux*) irix5* | irix6* | nonstopux*)
wl='-Wl,' wl='-Wl,'
;; ;;
linux* | k*bsd*-gnu | kopensolaris*-gnu) newsos6)
;;
linux* | k*bsd*-gnu)
case $cc_basename in case $cc_basename in
ecc*) ecc*)
wl='-Wl,' wl='-Wl,'
@ -76,26 +85,17 @@ else
lf95*) lf95*)
wl='-Wl,' wl='-Wl,'
;; ;;
nagfor*) pgcc | pgf77 | pgf90)
wl='-Wl,-Wl,,'
;;
pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
wl='-Wl,' wl='-Wl,'
;; ;;
ccc*) ccc*)
wl='-Wl,' wl='-Wl,'
;; ;;
xl* | bgxl* | bgf* | mpixl*)
wl='-Wl,'
;;
como) como)
wl='-lopt=' wl='-lopt='
;; ;;
*) *)
case `$CC -V 2>&1 | sed 5q` in case `$CC -V 2>&1 | sed 5q` in
*Sun\ F* | *Sun*Fortran*)
wl=
;;
*Sun\ C*) *Sun\ C*)
wl='-Wl,' wl='-Wl,'
;; ;;
@ -103,24 +103,13 @@ else
;; ;;
esac esac
;; ;;
newsos6)
;;
*nto* | *qnx*)
;;
osf3* | osf4* | osf5*) osf3* | osf4* | osf5*)
wl='-Wl,' wl='-Wl,'
;; ;;
rdos*) rdos*)
;; ;;
solaris*) solaris*)
case $cc_basename in wl='-Wl,'
f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
wl='-Qoption ld '
;;
*)
wl='-Wl,'
;;
esac
;; ;;
sunos4*) sunos4*)
wl='-Qoption ld ' wl='-Qoption ld '
@ -182,14 +171,15 @@ if test "$with_gnu_ld" = yes; then
fi fi
;; ;;
amigaos*) amigaos*)
case "$host_cpu" in hardcode_libdir_flag_spec='-L$libdir'
powerpc) hardcode_minus_L=yes
;; # Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports
m68k) # that the semantics of dynamic libraries on AmigaOS, at least up
hardcode_libdir_flag_spec='-L$libdir' # to version 4, is to share data among multiple programs linked
hardcode_minus_L=yes # with the same dynamic library. Since this doesn't match the
;; # behavior of shared libraries on other platforms, we cannot use
esac # them.
ld_shlibs=no
;; ;;
beos*) beos*)
if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
@ -208,13 +198,11 @@ if test "$with_gnu_ld" = yes; then
ld_shlibs=no ld_shlibs=no
fi fi
;; ;;
haiku*)
;;
interix[3-9]*) interix[3-9]*)
hardcode_direct=no hardcode_direct=no
hardcode_libdir_flag_spec='${wl}-rpath,$libdir' hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
;; ;;
gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) gnu* | linux* | k*bsd*-gnu)
if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
: :
else else
@ -337,14 +325,10 @@ else
fi fi
;; ;;
amigaos*) amigaos*)
case "$host_cpu" in hardcode_libdir_flag_spec='-L$libdir'
powerpc) hardcode_minus_L=yes
;; # see comment about different semantics on the GNU ld section
m68k) ld_shlibs=no
hardcode_libdir_flag_spec='-L$libdir'
hardcode_minus_L=yes
;;
esac
;; ;;
bsdi[45]*) bsdi[45]*)
;; ;;
@ -358,15 +342,24 @@ else
;; ;;
darwin* | rhapsody*) darwin* | rhapsody*)
hardcode_direct=no hardcode_direct=no
if { case $cc_basename in ifort*) true;; *) test "$GCC" = yes;; esac; }; then if test "$GCC" = yes ; then
: :
else else
ld_shlibs=no case $cc_basename in
xlc*)
;;
*)
ld_shlibs=no
;;
esac
fi fi
;; ;;
dgux*) dgux*)
hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_flag_spec='-L$libdir'
;; ;;
freebsd1*)
ld_shlibs=no
;;
freebsd2.2*) freebsd2.2*)
hardcode_libdir_flag_spec='-R$libdir' hardcode_libdir_flag_spec='-R$libdir'
hardcode_direct=yes hardcode_direct=yes
@ -427,8 +420,6 @@ else
hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
hardcode_libdir_separator=: hardcode_libdir_separator=:
;; ;;
*nto* | *qnx*)
;;
openbsd*) openbsd*)
if test -f /usr/libexec/ld.so; then if test -f /usr/libexec/ld.so; then
hardcode_direct=yes hardcode_direct=yes
@ -524,12 +515,7 @@ case "$host_os" in
library_names_spec='$libname$shrext' library_names_spec='$libname$shrext'
;; ;;
amigaos*) amigaos*)
case "$host_cpu" in library_names_spec='$libname.a'
powerpc*)
library_names_spec='$libname$shrext' ;;
m68k)
library_names_spec='$libname.a' ;;
esac
;; ;;
beos*) beos*)
library_names_spec='$libname$shrext' library_names_spec='$libname$shrext'
@ -548,6 +534,8 @@ case "$host_os" in
dgux*) dgux*)
library_names_spec='$libname$shrext' library_names_spec='$libname$shrext'
;; ;;
freebsd1*)
;;
freebsd* | dragonfly*) freebsd* | dragonfly*)
case "$host_os" in case "$host_os" in
freebsd[123]*) freebsd[123]*)
@ -559,9 +547,6 @@ case "$host_os" in
gnu*) gnu*)
library_names_spec='$libname$shrext' library_names_spec='$libname$shrext'
;; ;;
haiku*)
library_names_spec='$libname$shrext'
;;
hpux9* | hpux10* | hpux11*) hpux9* | hpux10* | hpux11*)
case $host_cpu in case $host_cpu in
ia64*) ia64*)
@ -597,7 +582,7 @@ case "$host_os" in
;; ;;
linux*oldld* | linux*aout* | linux*coff*) linux*oldld* | linux*aout* | linux*coff*)
;; ;;
linux* | k*bsd*-gnu | kopensolaris*-gnu) linux* | k*bsd*-gnu)
library_names_spec='$libname$shrext' library_names_spec='$libname$shrext'
;; ;;
knetbsd*-gnu) knetbsd*-gnu)
@ -609,7 +594,7 @@ case "$host_os" in
newsos6) newsos6)
library_names_spec='$libname$shrext' library_names_spec='$libname$shrext'
;; ;;
*nto* | *qnx*) nto-qnx*)
library_names_spec='$libname$shrext' library_names_spec='$libname$shrext'
;; ;;
openbsd*) openbsd*)
@ -640,9 +625,6 @@ case "$host_os" in
sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
library_names_spec='$libname$shrext' library_names_spec='$libname$shrext'
;; ;;
tpf*)
library_names_spec='$libname$shrext'
;;
uts4*) uts4*)
library_names_spec='$libname$shrext' library_names_spec='$libname$shrext'
;; ;;