mirror of
https://github.com/mirror/wget.git
synced 2024-12-28 05:40:08 +08:00
Import gnulib strcasestr.
This commit is contained in:
parent
227daa7415
commit
cff51866dd
@ -24,6 +24,7 @@ lib/stdint.h
|
||||
lib/stdio.h
|
||||
lib/stdlib.h
|
||||
lib/string.h
|
||||
lib/strings.h
|
||||
lib/wchar.h
|
||||
lib/charset.alias
|
||||
lib/configmake.h
|
||||
|
@ -1,5 +1,14 @@
|
||||
2009-09-03 Micah Cowan <micah@cowan.name>
|
||||
|
||||
* lib/*, m4/*: Updated gnulib.
|
||||
* lib/getpagesize.c, lib/memchr.c, lib/memchr.valgrind,
|
||||
lib/stddef.in.h, lib/str-two-way.h, lib/strcasecmp.c,
|
||||
lib/strcasestr.c, lib/strings.in.h, lib/strncasecmp.c,
|
||||
m4/getpagesize.m4, m4/memchr.m4, m4/mmap-anon.m4,
|
||||
m4/stddef_h.m3, m4/strcase.m4, m4/strcasestr.m4,
|
||||
m4/strings_h.m4, m4/wchar_t.m4: Added, via gnulib --import
|
||||
strcasestr.
|
||||
|
||||
* configure.ac: Move AM_GNU_GETTEXT below AC_AIX, to shut up
|
||||
autoconf warnings.
|
||||
|
||||
|
154
lib/Makefile.am
154
lib/Makefile.am
@ -9,7 +9,7 @@
|
||||
# the same distribution terms as the rest of that program.
|
||||
#
|
||||
# Generated by gnulib-tool.
|
||||
# Reproduce by: gnulib-tool --import --dir=. --lib=libgnu --source-base=lib --m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=. --no-libtool --macro-prefix=gl alloca c-ctype getopt getpass-gnu maintainer-makefile quote quotearg
|
||||
# Reproduce by: gnulib-tool --import --dir=. --lib=libgnu --source-base=lib --m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=. --no-libtool --macro-prefix=gl alloca c-ctype getopt getpass-gnu maintainer-makefile quote quotearg strcasestr
|
||||
|
||||
AUTOMAKE_OPTIONS = 1.5 gnits
|
||||
|
||||
@ -54,9 +54,10 @@ BUILT_SOURCES += $(ALLOCA_H)
|
||||
# We need the following in order to create <alloca.h> when the system
|
||||
# doesn't have one that works with the given compiler.
|
||||
alloca.h: alloca.in.h
|
||||
$(AM_V_GEN)rm -f $@-t $@ && \
|
||||
{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
|
||||
cat $(srcdir)/alloca.in.h; \
|
||||
} > $@-t
|
||||
} > $@-t && \
|
||||
mv -f $@-t $@
|
||||
MOSTLYCLEANFILES += alloca.h alloca.h-t
|
||||
|
||||
@ -90,7 +91,7 @@ libgnu_a_SOURCES += c-ctype.h c-ctype.c
|
||||
# The Automake-defined pkg* macros are appended, in the order
|
||||
# listed in the Automake 1.10a+ documentation.
|
||||
configmake.h: Makefile
|
||||
rm -f $@-t
|
||||
$(AM_V_GEN)rm -f $@-t && \
|
||||
{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
|
||||
echo '#define PREFIX "$(prefix)"'; \
|
||||
echo '#define EXEC_PREFIX "$(exec_prefix)"'; \
|
||||
@ -119,7 +120,7 @@ configmake.h: Makefile
|
||||
echo '#define PKGINCLUDEDIR "$(pkgincludedir)"'; \
|
||||
echo '#define PKGLIBDIR "$(pkglibdir)"'; \
|
||||
echo '#define PKGLIBEXECDIR "$(pkglibexecdir)"'; \
|
||||
} | sed '/""/d' > $@-t
|
||||
} | sed '/""/d' > $@-t && \
|
||||
if test -f $@ && cmp $@-t $@ > /dev/null; then \
|
||||
rm -f $@-t; \
|
||||
else \
|
||||
@ -138,7 +139,7 @@ BUILT_SOURCES += $(ERRNO_H)
|
||||
# We need the following in order to create <errno.h> when the system
|
||||
# doesn't have one that is POSIX compliant.
|
||||
errno.h: errno.in.h
|
||||
rm -f $@-t $@
|
||||
$(AM_V_GEN)rm -f $@-t $@ && \
|
||||
{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
|
||||
sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
|
||||
-e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
|
||||
@ -150,7 +151,7 @@ errno.h: errno.in.h
|
||||
-e 's|@''EOVERFLOW_HIDDEN''@|$(EOVERFLOW_HIDDEN)|g' \
|
||||
-e 's|@''EOVERFLOW_VALUE''@|$(EOVERFLOW_VALUE)|g' \
|
||||
< $(srcdir)/errno.in.h; \
|
||||
} > $@-t
|
||||
} > $@-t && \
|
||||
mv $@-t $@
|
||||
MOSTLYCLEANFILES += errno.h errno.h-t
|
||||
|
||||
@ -203,16 +204,17 @@ EXTRA_libgnu_a_SOURCES += getline.c
|
||||
|
||||
## end gnulib module getline
|
||||
|
||||
## begin gnulib module getopt
|
||||
## begin gnulib module getopt-posix
|
||||
|
||||
BUILT_SOURCES += $(GETOPT_H)
|
||||
|
||||
# We need the following in order to create <getopt.h> when the system
|
||||
# doesn't have one that works with the given compiler.
|
||||
getopt.h: getopt.in.h
|
||||
$(AM_V_GEN)rm -f $@-t $@ && \
|
||||
{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
|
||||
cat $(srcdir)/getopt.in.h; \
|
||||
} > $@-t
|
||||
} > $@-t && \
|
||||
mv -f $@-t $@
|
||||
MOSTLYCLEANFILES += getopt.h getopt.h-t
|
||||
|
||||
@ -220,7 +222,16 @@ EXTRA_DIST += getopt.c getopt.in.h getopt1.c getopt_int.h
|
||||
|
||||
EXTRA_libgnu_a_SOURCES += getopt.c getopt1.c
|
||||
|
||||
## end gnulib module getopt
|
||||
## end gnulib module getopt-posix
|
||||
|
||||
## begin gnulib module getpagesize
|
||||
|
||||
|
||||
EXTRA_DIST += getpagesize.c
|
||||
|
||||
EXTRA_libgnu_a_SOURCES += getpagesize.c
|
||||
|
||||
## end gnulib module getpagesize
|
||||
|
||||
## begin gnulib module getpass-gnu
|
||||
|
||||
@ -320,14 +331,14 @@ uninstall-localcharset: all-local
|
||||
fi
|
||||
|
||||
charset.alias: config.charset
|
||||
rm -f t-$@ $@
|
||||
$(SHELL) $(srcdir)/config.charset '$(host)' > t-$@
|
||||
$(AM_V_GEN)rm -f t-$@ $@ && \
|
||||
$(SHELL) $(srcdir)/config.charset '$(host)' > t-$@ && \
|
||||
mv t-$@ $@
|
||||
|
||||
SUFFIXES += .sed .sin
|
||||
.sin.sed:
|
||||
rm -f t-$@ $@
|
||||
sed -e '/^#/d' -e 's/@''PACKAGE''@/$(PACKAGE)/g' $< > t-$@
|
||||
$(AM_V_GEN)rm -f t-$@ $@ && \
|
||||
sed -e '/^#/d' -e 's/@''PACKAGE''@/$(PACKAGE)/g' $< > t-$@ && \
|
||||
mv t-$@ $@
|
||||
|
||||
CLEANFILES += charset.alias ref-add.sed ref-del.sed
|
||||
@ -369,6 +380,15 @@ EXTRA_libgnu_a_SOURCES += mbsinit.c
|
||||
|
||||
## end gnulib module mbsinit
|
||||
|
||||
## begin gnulib module memchr
|
||||
|
||||
|
||||
EXTRA_DIST += memchr.c memchr.valgrind
|
||||
|
||||
EXTRA_libgnu_a_SOURCES += memchr.c
|
||||
|
||||
## end gnulib module memchr
|
||||
|
||||
## begin gnulib module quote
|
||||
|
||||
|
||||
@ -403,10 +423,10 @@ BUILT_SOURCES += $(STDBOOL_H)
|
||||
# We need the following in order to create <stdbool.h> when the system
|
||||
# doesn't have one that works.
|
||||
stdbool.h: stdbool.in.h
|
||||
rm -f $@-t $@
|
||||
$(AM_V_GEN)rm -f $@-t $@ && \
|
||||
{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
|
||||
sed -e 's/@''HAVE__BOOL''@/$(HAVE__BOOL)/g' < $(srcdir)/stdbool.in.h; \
|
||||
} > $@-t
|
||||
} > $@-t && \
|
||||
mv $@-t $@
|
||||
MOSTLYCLEANFILES += stdbool.h stdbool.h-t
|
||||
|
||||
@ -414,6 +434,29 @@ EXTRA_DIST += stdbool.in.h
|
||||
|
||||
## end gnulib module stdbool
|
||||
|
||||
## begin gnulib module stddef
|
||||
|
||||
BUILT_SOURCES += $(STDDEF_H)
|
||||
|
||||
# We need the following in order to create <stddef.h> when the system
|
||||
# doesn't have one that works with the given compiler.
|
||||
stddef.h: stddef.in.h
|
||||
$(AM_V_GEN)rm -f $@-t $@ && \
|
||||
{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
|
||||
sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
|
||||
-e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
|
||||
-e 's|@''NEXT_STDDEF_H''@|$(NEXT_STDDEF_H)|g' \
|
||||
-e 's|@''HAVE_WCHAR_T''@|$(HAVE_WCHAR_T)|g' \
|
||||
-e 's|@''REPLACE_NULL''@|$(REPLACE_NULL)|g' \
|
||||
< $(srcdir)/stddef.in.h; \
|
||||
} > $@-t && \
|
||||
mv $@-t $@
|
||||
MOSTLYCLEANFILES += stddef.h stddef.h-t
|
||||
|
||||
EXTRA_DIST += stddef.in.h
|
||||
|
||||
## end gnulib module stddef
|
||||
|
||||
## begin gnulib module stdint
|
||||
|
||||
BUILT_SOURCES += $(STDINT_H)
|
||||
@ -421,7 +464,7 @@ BUILT_SOURCES += $(STDINT_H)
|
||||
# We need the following in order to create <stdint.h> when the system
|
||||
# doesn't have one that works with the given compiler.
|
||||
stdint.h: stdint.in.h
|
||||
rm -f $@-t $@
|
||||
$(AM_V_GEN)rm -f $@-t $@ && \
|
||||
{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
|
||||
sed -e 's/@''HAVE_STDINT_H''@/$(HAVE_STDINT_H)/g' \
|
||||
-e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
|
||||
@ -448,7 +491,7 @@ stdint.h: stdint.in.h
|
||||
-e 's/@''HAVE_SIGNED_WINT_T''@/$(HAVE_SIGNED_WINT_T)/g' \
|
||||
-e 's/@''WINT_T_SUFFIX''@/$(WINT_T_SUFFIX)/g' \
|
||||
< $(srcdir)/stdint.in.h; \
|
||||
} > $@-t
|
||||
} > $@-t && \
|
||||
mv $@-t $@
|
||||
MOSTLYCLEANFILES += stdint.h stdint.h-t
|
||||
|
||||
@ -463,7 +506,7 @@ BUILT_SOURCES += stdio.h
|
||||
# We need the following in order to create <stdio.h> when the system
|
||||
# doesn't have one that works with the given compiler.
|
||||
stdio.h: stdio.in.h
|
||||
rm -f $@-t $@
|
||||
$(AM_V_GEN)rm -f $@-t $@ && \
|
||||
{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
|
||||
sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
|
||||
-e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
|
||||
@ -500,6 +543,7 @@ stdio.h: stdio.in.h
|
||||
-e 's|@''GNULIB_FPUTS''@|$(GNULIB_FPUTS)|g' \
|
||||
-e 's|@''GNULIB_PUTS''@|$(GNULIB_PUTS)|g' \
|
||||
-e 's|@''GNULIB_FWRITE''@|$(GNULIB_FWRITE)|g' \
|
||||
-e 's|@''GNULIB_POPEN''@|$(GNULIB_POPEN)|g' \
|
||||
-e 's|@''GNULIB_GETDELIM''@|$(GNULIB_GETDELIM)|g' \
|
||||
-e 's|@''GNULIB_GETLINE''@|$(GNULIB_GETLINE)|g' \
|
||||
-e 's|@''GNULIB_PERROR''@|$(GNULIB_PERROR)|g' \
|
||||
@ -533,13 +577,14 @@ stdio.h: stdio.in.h
|
||||
-e 's|@''REPLACE_FPURGE''@|$(REPLACE_FPURGE)|g' \
|
||||
-e 's|@''HAVE_DECL_FPURGE''@|$(HAVE_DECL_FPURGE)|g' \
|
||||
-e 's|@''REPLACE_FCLOSE''@|$(REPLACE_FCLOSE)|g' \
|
||||
-e 's|@''REPLACE_POPEN''@|$(REPLACE_POPEN)|g' \
|
||||
-e 's|@''HAVE_DECL_GETDELIM''@|$(HAVE_DECL_GETDELIM)|g' \
|
||||
-e 's|@''HAVE_DECL_GETLINE''@|$(HAVE_DECL_GETLINE)|g' \
|
||||
-e 's|@''REPLACE_GETLINE''@|$(REPLACE_GETLINE)|g' \
|
||||
-e 's|@''REPLACE_PERROR''@|$(REPLACE_PERROR)|g' \
|
||||
-e '/definition of GL_LINK_WARNING/r $(LINK_WARNING_H)' \
|
||||
< $(srcdir)/stdio.in.h; \
|
||||
} > $@-t
|
||||
} > $@-t && \
|
||||
mv $@-t $@
|
||||
MOSTLYCLEANFILES += stdio.h stdio.h-t
|
||||
|
||||
@ -556,7 +601,7 @@ BUILT_SOURCES += stdlib.h
|
||||
# We need the following in order to create <stdlib.h> when the system
|
||||
# doesn't have one that works with the given compiler.
|
||||
stdlib.h: stdlib.in.h
|
||||
rm -f $@-t $@
|
||||
$(AM_V_GEN)rm -f $@-t $@ && \
|
||||
{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
|
||||
sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
|
||||
-e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
|
||||
@ -569,6 +614,7 @@ stdlib.h: stdlib.in.h
|
||||
-e 's|@''GNULIB_GETLOADAVG''@|$(GNULIB_GETLOADAVG)|g' \
|
||||
-e 's|@''GNULIB_GETSUBOPT''@|$(GNULIB_GETSUBOPT)|g' \
|
||||
-e 's|@''GNULIB_MKDTEMP''@|$(GNULIB_MKDTEMP)|g' \
|
||||
-e 's|@''GNULIB_MKOSTEMP''@|$(GNULIB_MKOSTEMP)|g' \
|
||||
-e 's|@''GNULIB_MKSTEMP''@|$(GNULIB_MKSTEMP)|g' \
|
||||
-e 's|@''GNULIB_PUTENV''@|$(GNULIB_PUTENV)|g' \
|
||||
-e 's|@''GNULIB_RANDOM_R''@|$(GNULIB_RANDOM_R)|g' \
|
||||
@ -583,6 +629,7 @@ stdlib.h: stdlib.in.h
|
||||
-e 's|@''HAVE_GETSUBOPT''@|$(HAVE_GETSUBOPT)|g' \
|
||||
-e 's|@''HAVE_MALLOC_POSIX''@|$(HAVE_MALLOC_POSIX)|g' \
|
||||
-e 's|@''HAVE_MKDTEMP''@|$(HAVE_MKDTEMP)|g' \
|
||||
-e 's|@''HAVE_MKOSTEMP''@|$(HAVE_MKOSTEMP)|g' \
|
||||
-e 's|@''HAVE_REALLOC_POSIX''@|$(HAVE_REALLOC_POSIX)|g' \
|
||||
-e 's|@''HAVE_RANDOM_R''@|$(HAVE_RANDOM_R)|g' \
|
||||
-e 's|@''HAVE_RPMATCH''@|$(HAVE_RPMATCH)|g' \
|
||||
@ -600,7 +647,7 @@ stdlib.h: stdlib.in.h
|
||||
-e 's|@''VOID_UNSETENV''@|$(VOID_UNSETENV)|g' \
|
||||
-e '/definition of GL_LINK_WARNING/r $(LINK_WARNING_H)' \
|
||||
< $(srcdir)/stdlib.in.h; \
|
||||
} > $@-t
|
||||
} > $@-t && \
|
||||
mv $@-t $@
|
||||
MOSTLYCLEANFILES += stdlib.h stdlib.h-t
|
||||
|
||||
@ -608,6 +655,24 @@ EXTRA_DIST += stdlib.in.h
|
||||
|
||||
## end gnulib module stdlib
|
||||
|
||||
## begin gnulib module strcase
|
||||
|
||||
|
||||
EXTRA_DIST += strcasecmp.c strncasecmp.c
|
||||
|
||||
EXTRA_libgnu_a_SOURCES += strcasecmp.c strncasecmp.c
|
||||
|
||||
## end gnulib module strcase
|
||||
|
||||
## begin gnulib module strcasestr-simple
|
||||
|
||||
|
||||
EXTRA_DIST += str-two-way.h strcasestr.c
|
||||
|
||||
EXTRA_libgnu_a_SOURCES += strcasestr.c
|
||||
|
||||
## end gnulib module strcasestr-simple
|
||||
|
||||
## begin gnulib module streq
|
||||
|
||||
|
||||
@ -631,7 +696,7 @@ BUILT_SOURCES += string.h
|
||||
# We need the following in order to create <string.h> when the system
|
||||
# doesn't have one that works with the given compiler.
|
||||
string.h: string.in.h
|
||||
rm -f $@-t $@
|
||||
$(AM_V_GEN)rm -f $@-t $@ && \
|
||||
{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
|
||||
sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
|
||||
-e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
|
||||
@ -696,7 +761,7 @@ string.h: string.in.h
|
||||
-e 's|@''REPLACE_STRSIGNAL''@|$(REPLACE_STRSIGNAL)|g' \
|
||||
-e '/definition of GL_LINK_WARNING/r $(LINK_WARNING_H)' \
|
||||
< $(srcdir)/string.in.h; \
|
||||
} > $@-t
|
||||
} > $@-t && \
|
||||
mv $@-t $@
|
||||
MOSTLYCLEANFILES += string.h string.h-t
|
||||
|
||||
@ -704,6 +769,30 @@ EXTRA_DIST += string.in.h
|
||||
|
||||
## end gnulib module string
|
||||
|
||||
## begin gnulib module strings
|
||||
|
||||
BUILT_SOURCES += strings.h
|
||||
|
||||
# We need the following in order to create <strings.h> when the system
|
||||
# doesn't have one that works with the given compiler.
|
||||
strings.h: strings.in.h
|
||||
$(AM_V_GEN)rm -f $@-t $@ && \
|
||||
{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
|
||||
sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
|
||||
-e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
|
||||
-e 's|@''NEXT_STRINGS_H''@|$(NEXT_STRINGS_H)|g' \
|
||||
-e 's|@''HAVE_STRCASECMP''@|$(HAVE_STRCASECMP)|g' \
|
||||
-e 's|@''HAVE_DECL_STRNCASECMP''@|$(HAVE_DECL_STRNCASECMP)|g' \
|
||||
-e '/definition of GL_LINK_WARNING/r $(LINK_WARNING_H)' \
|
||||
< $(srcdir)/strings.in.h; \
|
||||
} > $@-t && \
|
||||
mv $@-t $@
|
||||
MOSTLYCLEANFILES += strings.h strings.h-t
|
||||
|
||||
EXTRA_DIST += strings.in.h
|
||||
|
||||
## end gnulib module strings
|
||||
|
||||
## begin gnulib module unistd
|
||||
|
||||
BUILT_SOURCES += unistd.h
|
||||
@ -711,7 +800,7 @@ BUILT_SOURCES += unistd.h
|
||||
# We need the following in order to create an empty placeholder for
|
||||
# <unistd.h> when the system doesn't have one.
|
||||
unistd.h: unistd.in.h
|
||||
rm -f $@-t $@
|
||||
$(AM_V_GEN)rm -f $@-t $@ && \
|
||||
{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
|
||||
sed -e 's|@''HAVE_UNISTD_H''@|$(HAVE_UNISTD_H)|g' \
|
||||
-e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
|
||||
@ -720,6 +809,7 @@ unistd.h: unistd.in.h
|
||||
-e 's|@''GNULIB_CHOWN''@|$(GNULIB_CHOWN)|g' \
|
||||
-e 's|@''GNULIB_CLOSE''@|$(GNULIB_CLOSE)|g' \
|
||||
-e 's|@''GNULIB_DUP2''@|$(GNULIB_DUP2)|g' \
|
||||
-e 's|@''GNULIB_DUP3''@|$(GNULIB_DUP3)|g' \
|
||||
-e 's|@''GNULIB_ENVIRON''@|$(GNULIB_ENVIRON)|g' \
|
||||
-e 's|@''GNULIB_EUIDACCESS''@|$(GNULIB_EUIDACCESS)|g' \
|
||||
-e 's|@''GNULIB_FCHDIR''@|$(GNULIB_FCHDIR)|g' \
|
||||
@ -735,11 +825,14 @@ unistd.h: unistd.in.h
|
||||
-e 's|@''GNULIB_LCHOWN''@|$(GNULIB_LCHOWN)|g' \
|
||||
-e 's|@''GNULIB_LINK''@|$(GNULIB_LINK)|g' \
|
||||
-e 's|@''GNULIB_LSEEK''@|$(GNULIB_LSEEK)|g' \
|
||||
-e 's|@''GNULIB_PIPE2''@|$(GNULIB_PIPE2)|g' \
|
||||
-e 's|@''GNULIB_READLINK''@|$(GNULIB_READLINK)|g' \
|
||||
-e 's|@''GNULIB_SLEEP''@|$(GNULIB_SLEEP)|g' \
|
||||
-e 's|@''GNULIB_UNISTD_H_GETOPT''@|$(GNULIB_UNISTD_H_GETOPT)|g' \
|
||||
-e 's|@''GNULIB_UNISTD_H_SIGPIPE''@|$(GNULIB_UNISTD_H_SIGPIPE)|g' \
|
||||
-e 's|@''GNULIB_WRITE''@|$(GNULIB_WRITE)|g' \
|
||||
-e 's|@''HAVE_DUP2''@|$(HAVE_DUP2)|g' \
|
||||
-e 's|@''HAVE_DUP3''@|$(HAVE_DUP3)|g' \
|
||||
-e 's|@''HAVE_EUIDACCESS''@|$(HAVE_EUIDACCESS)|g' \
|
||||
-e 's|@''HAVE_FSYNC''@|$(HAVE_FSYNC)|g' \
|
||||
-e 's|@''HAVE_FTRUNCATE''@|$(HAVE_FTRUNCATE)|g' \
|
||||
@ -749,6 +842,7 @@ unistd.h: unistd.in.h
|
||||
-e 's|@''HAVE_GETPAGESIZE''@|$(HAVE_GETPAGESIZE)|g' \
|
||||
-e 's|@''HAVE_GETUSERSHELL''@|$(HAVE_GETUSERSHELL)|g' \
|
||||
-e 's|@''HAVE_LINK''@|$(HAVE_LINK)|g' \
|
||||
-e 's|@''HAVE_PIPE2''@|$(HAVE_PIPE2)|g' \
|
||||
-e 's|@''HAVE_READLINK''@|$(HAVE_READLINK)|g' \
|
||||
-e 's|@''HAVE_SLEEP''@|$(HAVE_SLEEP)|g' \
|
||||
-e 's|@''HAVE_DECL_ENVIRON''@|$(HAVE_DECL_ENVIRON)|g' \
|
||||
@ -757,6 +851,7 @@ unistd.h: unistd.in.h
|
||||
-e 's|@''HAVE_SYS_PARAM_H''@|$(HAVE_SYS_PARAM_H)|g' \
|
||||
-e 's|@''REPLACE_CHOWN''@|$(REPLACE_CHOWN)|g' \
|
||||
-e 's|@''REPLACE_CLOSE''@|$(REPLACE_CLOSE)|g' \
|
||||
-e 's|@''REPLACE_DUP2''@|$(REPLACE_DUP2)|g' \
|
||||
-e 's|@''REPLACE_FCHDIR''@|$(REPLACE_FCHDIR)|g' \
|
||||
-e 's|@''REPLACE_GETCWD''@|$(REPLACE_GETCWD)|g' \
|
||||
-e 's|@''REPLACE_GETPAGESIZE''@|$(REPLACE_GETPAGESIZE)|g' \
|
||||
@ -764,9 +859,10 @@ unistd.h: unistd.in.h
|
||||
-e 's|@''REPLACE_LSEEK''@|$(REPLACE_LSEEK)|g' \
|
||||
-e 's|@''REPLACE_WRITE''@|$(REPLACE_WRITE)|g' \
|
||||
-e 's|@''UNISTD_H_HAVE_WINSOCK2_H''@|$(UNISTD_H_HAVE_WINSOCK2_H)|g' \
|
||||
-e 's|@''UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS''@|$(UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS)|g' \
|
||||
-e '/definition of GL_LINK_WARNING/r $(LINK_WARNING_H)' \
|
||||
< $(srcdir)/unistd.in.h; \
|
||||
} > $@-t
|
||||
} > $@-t && \
|
||||
mv $@-t $@
|
||||
MOSTLYCLEANFILES += unistd.h unistd.h-t
|
||||
|
||||
@ -801,7 +897,7 @@ BUILT_SOURCES += $(WCHAR_H)
|
||||
# We need the following in order to create <wchar.h> when the system
|
||||
# version does not work standalone.
|
||||
wchar.h: wchar.in.h
|
||||
rm -f $@-t $@
|
||||
$(AM_V_GEN)rm -f $@-t $@ && \
|
||||
{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
|
||||
sed -e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
|
||||
-e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
|
||||
@ -844,7 +940,7 @@ wchar.h: wchar.in.h
|
||||
-e 's|@''REPLACE_WCWIDTH''@|$(REPLACE_WCWIDTH)|g' \
|
||||
-e '/definition of GL_LINK_WARNING/r $(LINK_WARNING_H)' \
|
||||
< $(srcdir)/wchar.in.h; \
|
||||
} > $@-t
|
||||
} > $@-t && \
|
||||
mv $@-t $@
|
||||
MOSTLYCLEANFILES += wchar.h wchar.h-t
|
||||
|
||||
@ -859,7 +955,7 @@ BUILT_SOURCES += $(WCTYPE_H)
|
||||
# We need the following in order to create <wctype.h> when the system
|
||||
# doesn't have one that works with the given compiler.
|
||||
wctype.h: wctype.in.h
|
||||
rm -f $@-t $@
|
||||
$(AM_V_GEN)rm -f $@-t $@ && \
|
||||
{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
|
||||
sed -e 's/@''HAVE_WCTYPE_H''@/$(HAVE_WCTYPE_H)/g' \
|
||||
-e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
|
||||
@ -869,7 +965,7 @@ wctype.h: wctype.in.h
|
||||
-e 's/@''HAVE_WINT_T''@/$(HAVE_WINT_T)/g' \
|
||||
-e 's/@''REPLACE_ISWCNTRL''@/$(REPLACE_ISWCNTRL)/g' \
|
||||
< $(srcdir)/wctype.in.h; \
|
||||
} > $@-t
|
||||
} > $@-t && \
|
||||
mv $@-t $@
|
||||
MOSTLYCLEANFILES += wctype.h wctype.h-t
|
||||
|
||||
|
16
lib/error.c
16
lib/error.c
@ -1,5 +1,5 @@
|
||||
/* Error handler for noninteractive utilities
|
||||
Copyright (C) 1990-1998, 2000-2007 Free Software Foundation, Inc.
|
||||
Copyright (C) 1990-1998, 2000-2007, 2009 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
@ -85,6 +85,8 @@ extern void __error_at_line (int status, int errnum, const char *file_name,
|
||||
|
||||
#else /* not _LIBC */
|
||||
|
||||
# include <fcntl.h>
|
||||
|
||||
# if !HAVE_DECL_STRERROR_R && STRERROR_R_CHAR_P
|
||||
# ifndef HAVE_DECL_STRERROR_R
|
||||
"this configure-time declaration test was not run"
|
||||
@ -236,6 +238,12 @@ error (int status, int errnum, const char *message, ...)
|
||||
0);
|
||||
#endif
|
||||
|
||||
#if !_LIBC && defined F_GETFL
|
||||
/* POSIX states that fflush (stdout) after fclose is unspecified; it
|
||||
is safe in glibc, but not on all other platforms. fflush (NULL)
|
||||
is always defined, but too draconian. */
|
||||
if (0 <= fcntl (1, F_GETFL))
|
||||
#endif
|
||||
fflush (stdout);
|
||||
#ifdef _LIBC
|
||||
_IO_flockfile (stderr);
|
||||
@ -295,6 +303,12 @@ error_at_line (int status, int errnum, const char *file_name,
|
||||
0);
|
||||
#endif
|
||||
|
||||
#if !_LIBC && defined F_GETFL
|
||||
/* POSIX states that fflush (stdout) after fclose is unspecified; it
|
||||
is safe in glibc, but not on all other platforms. fflush (NULL)
|
||||
is always defined, but too draconian. */
|
||||
if (0 <= fcntl (1, F_GETFL))
|
||||
#endif
|
||||
fflush (stdout);
|
||||
#ifdef _LIBC
|
||||
_IO_flockfile (stderr);
|
||||
|
@ -79,7 +79,7 @@ rpl_fseeko (FILE *fp, off_t offset, int whence)
|
||||
&& ((fp->__modeflags & (__FLAG_READONLY | __FLAG_READING)) == 0
|
||||
|| fp->__bufpos == fp->__bufread))
|
||||
#elif defined __QNX__ /* QNX */
|
||||
if ((fp->_Mode & _MWRITE ? fp->_Next == fp->_Buf : fp->_Next == fp->_Rend)
|
||||
if ((fp->_Mode & 0x2000 /* _MWRITE */ ? fp->_Next == fp->_Buf : fp->_Next == fp->_Rend)
|
||||
&& fp->_Rback == fp->_Back + sizeof (fp->_Back)
|
||||
&& fp->_Rsave == NULL)
|
||||
#elif defined __MINT__ /* Atari FreeMiNT */
|
||||
|
39
lib/getpagesize.c
Normal file
39
lib/getpagesize.c
Normal file
@ -0,0 +1,39 @@
|
||||
/* getpagesize emulation for systems where it cannot be done in a C macro.
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Written by Bruno Haible and Martin Lambers. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
/* Specification. */
|
||||
#include <unistd.h>
|
||||
|
||||
/* This implementation is only for native Win32 systems. */
|
||||
#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
|
||||
|
||||
# define WIN32_LEAN_AND_MEAN
|
||||
# include <windows.h>
|
||||
|
||||
int
|
||||
getpagesize (void)
|
||||
{
|
||||
SYSTEM_INFO system_info;
|
||||
GetSystemInfo (&system_info);
|
||||
return system_info.dwPageSize;
|
||||
}
|
||||
|
||||
#endif
|
172
lib/memchr.c
Normal file
172
lib/memchr.c
Normal file
@ -0,0 +1,172 @@
|
||||
/* Copyright (C) 1991, 1993, 1996, 1997, 1999, 2000, 2003, 2004, 2006, 2008
|
||||
Free Software Foundation, Inc.
|
||||
|
||||
Based on strlen implementation by Torbjorn Granlund (tege@sics.se),
|
||||
with help from Dan Sahlin (dan@sics.se) and
|
||||
commentary by Jim Blandy (jimb@ai.mit.edu);
|
||||
adaptation to memchr suggested by Dick Karpinski (dick@cca.ucsf.edu),
|
||||
and implemented by Roland McGrath (roland@ai.mit.edu).
|
||||
|
||||
NOTE: The canonical source of this file is maintained with the GNU C Library.
|
||||
Bugs can be reported to bug-glibc@prep.ai.mit.edu.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 3 of the License, or any
|
||||
later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef _LIBC
|
||||
# include <config.h>
|
||||
#endif
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
#if defined _LIBC
|
||||
# include <memcopy.h>
|
||||
#else
|
||||
# define reg_char char
|
||||
#endif
|
||||
|
||||
#include <limits.h>
|
||||
|
||||
#if HAVE_BP_SYM_H || defined _LIBC
|
||||
# include <bp-sym.h>
|
||||
#else
|
||||
# define BP_SYM(sym) sym
|
||||
#endif
|
||||
|
||||
#undef __memchr
|
||||
#ifdef _LIBC
|
||||
# undef memchr
|
||||
#endif
|
||||
|
||||
#ifndef weak_alias
|
||||
# define __memchr memchr
|
||||
#endif
|
||||
|
||||
/* Search no more than N bytes of S for C. */
|
||||
void *
|
||||
__memchr (void const *s, int c_in, size_t n)
|
||||
{
|
||||
/* On 32-bit hardware, choosing longword to be a 32-bit unsigned
|
||||
long instead of a 64-bit uintmax_t tends to give better
|
||||
performance. On 64-bit hardware, unsigned long is generally 64
|
||||
bits already. Change this typedef to experiment with
|
||||
performance. */
|
||||
typedef unsigned long int longword;
|
||||
|
||||
const unsigned char *char_ptr;
|
||||
const longword *longword_ptr;
|
||||
longword repeated_one;
|
||||
longword repeated_c;
|
||||
unsigned reg_char c;
|
||||
|
||||
c = (unsigned char) c_in;
|
||||
|
||||
/* Handle the first few bytes by reading one byte at a time.
|
||||
Do this until CHAR_PTR is aligned on a longword boundary. */
|
||||
for (char_ptr = (const unsigned char *) s;
|
||||
n > 0 && (size_t) char_ptr % sizeof (longword) != 0;
|
||||
--n, ++char_ptr)
|
||||
if (*char_ptr == c)
|
||||
return (void *) char_ptr;
|
||||
|
||||
longword_ptr = (const longword *) char_ptr;
|
||||
|
||||
/* All these elucidatory comments refer to 4-byte longwords,
|
||||
but the theory applies equally well to any size longwords. */
|
||||
|
||||
/* Compute auxiliary longword values:
|
||||
repeated_one is a value which has a 1 in every byte.
|
||||
repeated_c has c in every byte. */
|
||||
repeated_one = 0x01010101;
|
||||
repeated_c = c | (c << 8);
|
||||
repeated_c |= repeated_c << 16;
|
||||
if (0xffffffffU < (longword) -1)
|
||||
{
|
||||
repeated_one |= repeated_one << 31 << 1;
|
||||
repeated_c |= repeated_c << 31 << 1;
|
||||
if (8 < sizeof (longword))
|
||||
{
|
||||
size_t i;
|
||||
|
||||
for (i = 64; i < sizeof (longword) * 8; i *= 2)
|
||||
{
|
||||
repeated_one |= repeated_one << i;
|
||||
repeated_c |= repeated_c << i;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Instead of the traditional loop which tests each byte, we will test a
|
||||
longword at a time. The tricky part is testing if *any of the four*
|
||||
bytes in the longword in question are equal to c. We first use an xor
|
||||
with repeated_c. This reduces the task to testing whether *any of the
|
||||
four* bytes in longword1 is zero.
|
||||
|
||||
We compute tmp =
|
||||
((longword1 - repeated_one) & ~longword1) & (repeated_one << 7).
|
||||
That is, we perform the following operations:
|
||||
1. Subtract repeated_one.
|
||||
2. & ~longword1.
|
||||
3. & a mask consisting of 0x80 in every byte.
|
||||
Consider what happens in each byte:
|
||||
- If a byte of longword1 is zero, step 1 and 2 transform it into 0xff,
|
||||
and step 3 transforms it into 0x80. A carry can also be propagated
|
||||
to more significant bytes.
|
||||
- If a byte of longword1 is nonzero, let its lowest 1 bit be at
|
||||
position k (0 <= k <= 7); so the lowest k bits are 0. After step 1,
|
||||
the byte ends in a single bit of value 0 and k bits of value 1.
|
||||
After step 2, the result is just k bits of value 1: 2^k - 1. After
|
||||
step 3, the result is 0. And no carry is produced.
|
||||
So, if longword1 has only non-zero bytes, tmp is zero.
|
||||
Whereas if longword1 has a zero byte, call j the position of the least
|
||||
significant zero byte. Then the result has a zero at positions 0, ...,
|
||||
j-1 and a 0x80 at position j. We cannot predict the result at the more
|
||||
significant bytes (positions j+1..3), but it does not matter since we
|
||||
already have a non-zero bit at position 8*j+7.
|
||||
|
||||
So, the test whether any byte in longword1 is zero is equivalent to
|
||||
testing whether tmp is nonzero. */
|
||||
|
||||
while (n >= sizeof (longword))
|
||||
{
|
||||
longword longword1 = *longword_ptr ^ repeated_c;
|
||||
|
||||
if ((((longword1 - repeated_one) & ~longword1)
|
||||
& (repeated_one << 7)) != 0)
|
||||
break;
|
||||
longword_ptr++;
|
||||
n -= sizeof (longword);
|
||||
}
|
||||
|
||||
char_ptr = (const unsigned char *) longword_ptr;
|
||||
|
||||
/* At this point, we know that either n < sizeof (longword), or one of the
|
||||
sizeof (longword) bytes starting at char_ptr is == c. On little-endian
|
||||
machines, we could determine the first such byte without any further
|
||||
memory accesses, just by looking at the tmp result from the last loop
|
||||
iteration. But this does not work on big-endian machines. Choose code
|
||||
that works in both cases. */
|
||||
|
||||
for (; n > 0; --n, ++char_ptr)
|
||||
{
|
||||
if (*char_ptr == c)
|
||||
return (void *) char_ptr;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
#ifdef weak_alias
|
||||
weak_alias (__memchr, BP_SYM (memchr))
|
||||
#endif
|
14
lib/memchr.valgrind
Normal file
14
lib/memchr.valgrind
Normal file
@ -0,0 +1,14 @@
|
||||
# Suppress a valgrind message about use of uninitialized memory in memchr().
|
||||
# POSIX states that when the character is found, memchr must not read extra
|
||||
# bytes in an overestimated length (for example, where memchr is used to
|
||||
# implement strnlen). However, we use a safe word read to provide a speedup.
|
||||
{
|
||||
memchr-value4
|
||||
Memcheck:Value4
|
||||
fun:rpl_memchr
|
||||
}
|
||||
{
|
||||
memchr-value8
|
||||
Memcheck:Value8
|
||||
fun:rpl_memchr
|
||||
}
|
152
lib/quotearg.c
152
lib/quotearg.c
@ -54,6 +54,12 @@ struct quoting_options
|
||||
/* Quote the characters indicated by this bit vector even if the
|
||||
quoting style would not normally require them to be quoted. */
|
||||
unsigned int quote_these_too[(UCHAR_MAX / INT_BITS) + 1];
|
||||
|
||||
/* The left quote for custom_quoting_style. */
|
||||
char const *left_quote;
|
||||
|
||||
/* The right quote for custom_quoting_style. */
|
||||
char const *right_quote;
|
||||
};
|
||||
|
||||
/* Names of quoting styles. */
|
||||
@ -146,6 +152,19 @@ set_quoting_flags (struct quoting_options *o, int i)
|
||||
return r;
|
||||
}
|
||||
|
||||
void
|
||||
set_custom_quoting (struct quoting_options *o,
|
||||
char const *left_quote, char const *right_quote)
|
||||
{
|
||||
if (!o)
|
||||
o = &default_quoting_options;
|
||||
o->style = custom_quoting_style;
|
||||
if (!left_quote || !right_quote)
|
||||
abort ();
|
||||
o->left_quote = left_quote;
|
||||
o->right_quote = right_quote;
|
||||
}
|
||||
|
||||
/* Return quoting options for STYLE, with no extra quoting. */
|
||||
static struct quoting_options
|
||||
quoting_options_from_style (enum quoting_style style)
|
||||
@ -185,7 +204,9 @@ static size_t
|
||||
quotearg_buffer_restyled (char *buffer, size_t buffersize,
|
||||
char const *arg, size_t argsize,
|
||||
enum quoting_style quoting_style, int flags,
|
||||
unsigned int const *quote_these_too)
|
||||
unsigned int const *quote_these_too,
|
||||
char const *left_quote,
|
||||
char const *right_quote)
|
||||
{
|
||||
size_t i;
|
||||
size_t len = 0;
|
||||
@ -225,34 +246,37 @@ quotearg_buffer_restyled (char *buffer, size_t buffersize,
|
||||
|
||||
case locale_quoting_style:
|
||||
case clocale_quoting_style:
|
||||
case custom_quoting_style:
|
||||
{
|
||||
/* TRANSLATORS:
|
||||
Get translations for open and closing quotation marks.
|
||||
if (quoting_style != custom_quoting_style)
|
||||
{
|
||||
/* TRANSLATORS:
|
||||
Get translations for open and closing quotation marks.
|
||||
|
||||
The message catalog should translate "`" to a left
|
||||
quotation mark suitable for the locale, and similarly for
|
||||
"'". If the catalog has no translation,
|
||||
locale_quoting_style quotes `like this', and
|
||||
clocale_quoting_style quotes "like this".
|
||||
The message catalog should translate "`" to a left
|
||||
quotation mark suitable for the locale, and similarly for
|
||||
"'". If the catalog has no translation,
|
||||
locale_quoting_style quotes `like this', and
|
||||
clocale_quoting_style quotes "like this".
|
||||
|
||||
For example, an American English Unicode locale should
|
||||
translate "`" to U+201C (LEFT DOUBLE QUOTATION MARK), and
|
||||
should translate "'" to U+201D (RIGHT DOUBLE QUOTATION
|
||||
MARK). A British English Unicode locale should instead
|
||||
translate these to U+2018 (LEFT SINGLE QUOTATION MARK) and
|
||||
U+2019 (RIGHT SINGLE QUOTATION MARK), respectively.
|
||||
For example, an American English Unicode locale should
|
||||
translate "`" to U+201C (LEFT DOUBLE QUOTATION MARK), and
|
||||
should translate "'" to U+201D (RIGHT DOUBLE QUOTATION
|
||||
MARK). A British English Unicode locale should instead
|
||||
translate these to U+2018 (LEFT SINGLE QUOTATION MARK)
|
||||
and U+2019 (RIGHT SINGLE QUOTATION MARK), respectively.
|
||||
|
||||
If you don't know what to put here, please see
|
||||
<http://en.wikipedia.org/wiki/Quotation_mark#Glyphs>
|
||||
and use glyphs suitable for your language. */
|
||||
|
||||
char const *left = gettext_quote (N_("`"), quoting_style);
|
||||
char const *right = gettext_quote (N_("'"), quoting_style);
|
||||
If you don't know what to put here, please see
|
||||
<http://en.wikipedia.org/wiki/Quotation_mark#Glyphs>
|
||||
and use glyphs suitable for your language. */
|
||||
left_quote = gettext_quote (N_("`"), quoting_style);
|
||||
right_quote = gettext_quote (N_("'"), quoting_style);
|
||||
}
|
||||
if (!elide_outer_quotes)
|
||||
for (quote_string = left; *quote_string; quote_string++)
|
||||
for (quote_string = left_quote; *quote_string; quote_string++)
|
||||
STORE (*quote_string);
|
||||
backslash_escapes = true;
|
||||
quote_string = right;
|
||||
quote_string = right_quote;
|
||||
quote_string_len = strlen (quote_string);
|
||||
}
|
||||
break;
|
||||
@ -280,6 +304,7 @@ quotearg_buffer_restyled (char *buffer, size_t buffersize,
|
||||
{
|
||||
unsigned char c;
|
||||
unsigned char esc;
|
||||
bool is_right_quote = false;
|
||||
|
||||
if (backslash_escapes
|
||||
&& quote_string_len
|
||||
@ -288,7 +313,7 @@ quotearg_buffer_restyled (char *buffer, size_t buffersize,
|
||||
{
|
||||
if (elide_outer_quotes)
|
||||
goto force_outer_quoting_style;
|
||||
STORE ('\\');
|
||||
is_right_quote = true;
|
||||
}
|
||||
|
||||
c = arg[i];
|
||||
@ -300,12 +325,21 @@ quotearg_buffer_restyled (char *buffer, size_t buffersize,
|
||||
if (elide_outer_quotes)
|
||||
goto force_outer_quoting_style;
|
||||
STORE ('\\');
|
||||
/* If quote_string were to begin with digits, we'd need to
|
||||
test for the end of the arg as well. However, it's
|
||||
hard to imagine any locale that would use digits in
|
||||
quotes, and set_custom_quoting is documented not to
|
||||
accept them. */
|
||||
if (i + 1 < argsize && '0' <= arg[i + 1] && arg[i + 1] <= '9')
|
||||
{
|
||||
STORE ('0');
|
||||
STORE ('0');
|
||||
}
|
||||
c = '0';
|
||||
/* We don't have to worry that this last '0' will be
|
||||
backslash-escaped because, again, quote_string should
|
||||
not start with it and because quote_these_too is
|
||||
documented as not accepting it. */
|
||||
}
|
||||
else if (flags & QA_ELIDE_NULL_BYTES)
|
||||
continue;
|
||||
@ -425,7 +459,15 @@ quotearg_buffer_restyled (char *buffer, size_t buffersize,
|
||||
case 'o': case 'p': case 'q': case 'r': case 's': case 't':
|
||||
case 'u': case 'v': case 'w': case 'x': case 'y': case 'z':
|
||||
/* These characters don't cause problems, no matter what the
|
||||
quoting style is. They cannot start multibyte sequences. */
|
||||
quoting style is. They cannot start multibyte sequences.
|
||||
A digit or a special letter would cause trouble if it
|
||||
appeared at the beginning of quote_string because we'd then
|
||||
escape by prepending a backslash. However, it's hard to
|
||||
imagine any locale that would use digits or letters as
|
||||
quotes, and set_custom_quoting is documented not to accept
|
||||
them. Also, a digit or a special letter would cause
|
||||
trouble if it appeared in quote_these_too, but that's also
|
||||
documented as not accepting them. */
|
||||
break;
|
||||
|
||||
default:
|
||||
@ -521,6 +563,11 @@ quotearg_buffer_restyled (char *buffer, size_t buffersize,
|
||||
STORE ('0' + ((c >> 3) & 7));
|
||||
c = '0' + (c & 7);
|
||||
}
|
||||
else if (is_right_quote)
|
||||
{
|
||||
STORE ('\\');
|
||||
is_right_quote = false;
|
||||
}
|
||||
if (ilim <= i + 1)
|
||||
break;
|
||||
STORE (c);
|
||||
@ -534,7 +581,8 @@ quotearg_buffer_restyled (char *buffer, size_t buffersize,
|
||||
|
||||
if (! ((backslash_escapes || elide_outer_quotes)
|
||||
&& quote_these_too
|
||||
&& quote_these_too[c / INT_BITS] & (1 << (c % INT_BITS))))
|
||||
&& quote_these_too[c / INT_BITS] & (1 << (c % INT_BITS)))
|
||||
&& !is_right_quote)
|
||||
goto store_c;
|
||||
|
||||
store_escape:
|
||||
@ -563,7 +611,8 @@ quotearg_buffer_restyled (char *buffer, size_t buffersize,
|
||||
sufficiently quotes the specified characters. */
|
||||
return quotearg_buffer_restyled (buffer, buffersize, arg, argsize,
|
||||
quoting_style,
|
||||
flags & ~QA_ELIDE_OUTER_QUOTES, NULL);
|
||||
flags & ~QA_ELIDE_OUTER_QUOTES, NULL,
|
||||
left_quote, right_quote);
|
||||
}
|
||||
|
||||
/* Place into buffer BUFFER (of size BUFFERSIZE) a quoted version of
|
||||
@ -583,7 +632,8 @@ quotearg_buffer (char *buffer, size_t buffersize,
|
||||
struct quoting_options const *p = o ? o : &default_quoting_options;
|
||||
int e = errno;
|
||||
size_t r = quotearg_buffer_restyled (buffer, buffersize, arg, argsize,
|
||||
p->style, p->flags, p->quote_these_too);
|
||||
p->style, p->flags, p->quote_these_too,
|
||||
p->left_quote, p->right_quote);
|
||||
errno = e;
|
||||
return r;
|
||||
}
|
||||
@ -611,10 +661,13 @@ quotearg_alloc_mem (char const *arg, size_t argsize, size_t *size,
|
||||
/* Elide embedded null bytes if we can't return a size. */
|
||||
int flags = p->flags | (size ? 0 : QA_ELIDE_NULL_BYTES);
|
||||
size_t bufsize = quotearg_buffer_restyled (0, 0, arg, argsize, p->style,
|
||||
flags, p->quote_these_too) + 1;
|
||||
flags, p->quote_these_too,
|
||||
p->left_quote,
|
||||
p->right_quote) + 1;
|
||||
char *buf = xcharalloc (bufsize);
|
||||
quotearg_buffer_restyled (buf, bufsize, arg, argsize, p->style, flags,
|
||||
p->quote_these_too);
|
||||
p->quote_these_too,
|
||||
p->left_quote, p->right_quote);
|
||||
errno = e;
|
||||
if (size)
|
||||
*size = bufsize - 1;
|
||||
@ -703,7 +756,9 @@ quotearg_n_options (int n, char const *arg, size_t argsize,
|
||||
int flags = options->flags | QA_ELIDE_NULL_BYTES;
|
||||
size_t qsize = quotearg_buffer_restyled (val, size, arg, argsize,
|
||||
options->style, flags,
|
||||
options->quote_these_too);
|
||||
options->quote_these_too,
|
||||
options->left_quote,
|
||||
options->right_quote);
|
||||
|
||||
if (size <= qsize)
|
||||
{
|
||||
@ -712,7 +767,9 @@ quotearg_n_options (int n, char const *arg, size_t argsize,
|
||||
free (val);
|
||||
sv[n].val = val = xcharalloc (size);
|
||||
quotearg_buffer_restyled (val, size, arg, argsize, options->style,
|
||||
flags, options->quote_these_too);
|
||||
flags, options->quote_these_too,
|
||||
options->left_quote,
|
||||
options->right_quote);
|
||||
}
|
||||
|
||||
errno = e;
|
||||
@ -797,3 +854,36 @@ quotearg_colon_mem (char const *arg, size_t argsize)
|
||||
{
|
||||
return quotearg_char_mem (arg, argsize, ':');
|
||||
}
|
||||
|
||||
char *
|
||||
quotearg_n_custom (int n, char const *left_quote,
|
||||
char const *right_quote, char const *arg)
|
||||
{
|
||||
return quotearg_n_custom_mem (n, left_quote, right_quote, arg,
|
||||
SIZE_MAX);
|
||||
}
|
||||
|
||||
char *
|
||||
quotearg_n_custom_mem (int n, char const *left_quote,
|
||||
char const *right_quote,
|
||||
char const *arg, size_t argsize)
|
||||
{
|
||||
struct quoting_options o = default_quoting_options;
|
||||
set_custom_quoting (&o, left_quote, right_quote);
|
||||
return quotearg_n_options (n, arg, argsize, &o);
|
||||
}
|
||||
|
||||
char *
|
||||
quotearg_custom (char const *left_quote, char const *right_quote,
|
||||
char const *arg)
|
||||
{
|
||||
return quotearg_n_custom (0, left_quote, right_quote, arg);
|
||||
}
|
||||
|
||||
char *
|
||||
quotearg_custom_mem (char const *left_quote, char const *right_quote,
|
||||
char const *arg, size_t argsize)
|
||||
{
|
||||
return quotearg_n_custom_mem (0, left_quote, right_quote, arg,
|
||||
argsize);
|
||||
}
|
||||
|
@ -100,7 +100,8 @@ enum quoting_style
|
||||
c_maybe_quoting_style,
|
||||
|
||||
/* Like c_quoting_style except always omit the surrounding
|
||||
double-quote characters (ls --quoting-style=escape).
|
||||
double-quote characters and ignore QA_SPLIT_TRIGRAPHS
|
||||
(ls --quoting-style=escape).
|
||||
|
||||
quotearg_buffer:
|
||||
"simple", "\\0 \\t\\n'\"\\033??/\\\\", "a:b"
|
||||
@ -136,7 +137,8 @@ enum quoting_style
|
||||
locale_quoting_style,
|
||||
|
||||
/* Like c_quoting_style except use quotation marks appropriate for
|
||||
the locale (ls --quoting-style=clocale).
|
||||
the locale and ignore QA_SPLIT_TRIGRAPHS
|
||||
(ls --quoting-style=clocale).
|
||||
|
||||
LC_MESSAGES=C
|
||||
quotearg_buffer:
|
||||
@ -157,7 +159,50 @@ enum quoting_style
|
||||
"\302\253simple\302\273",
|
||||
"\302\253\\0 \\t\\n'\"\\033??/\\\\\302\253", "\302\253a\\:b\302\273"
|
||||
*/
|
||||
clocale_quoting_style
|
||||
clocale_quoting_style,
|
||||
|
||||
/* Like clocale_quoting_style except use the custom quotation marks
|
||||
set by set_custom_quoting. If custom quotation marks are not
|
||||
set, the behavior is undefined.
|
||||
|
||||
left_quote = right_quote = "'"
|
||||
quotearg_buffer:
|
||||
"'simple'", "'\\0 \\t\\n\\'\"\\033??/\\\\'", "'a:b'"
|
||||
quotearg:
|
||||
"'simple'", "'\\0 \\t\\n\\'\"\\033??/\\\\'", "'a:b'"
|
||||
quotearg_colon:
|
||||
"'simple'", "'\\0 \\t\\n\\'\"\\033??/\\\\'", "'a\\:b'"
|
||||
|
||||
left_quote = "(" and right_quote = ")"
|
||||
quotearg_buffer:
|
||||
"(simple)", "(\\0 \\t\\n'\"\\033??/\\\\)", "(a:b)"
|
||||
quotearg:
|
||||
"(simple)", "(\\0 \\t\\n'\"\\033??/\\\\)", "(a:b)"
|
||||
quotearg_colon:
|
||||
"(simple)", "(\\0 \\t\\n'\"\\033??/\\\\)", "(a\\:b)"
|
||||
|
||||
left_quote = ":" and right_quote = " "
|
||||
quotearg_buffer:
|
||||
":simple ", ":\\0\\ \\t\\n'\"\\033??/\\\\ ", ":a:b "
|
||||
quotearg:
|
||||
":simple ", ":\\0\\ \\t\\n'\"\\033??/\\\\ ", ":a:b "
|
||||
quotearg_colon:
|
||||
":simple ", ":\\0\\ \\t\\n'\"\\033??/\\\\ ", ":a\\:b "
|
||||
|
||||
left_quote = "\"'" and right_quote = "'\""
|
||||
Notice that this is treated as a single level of quotes or two
|
||||
levels where the outer quote need not be escaped within the inner
|
||||
quotes. For two levels where the outer quote must be escaped
|
||||
within the inner quotes, you must use separate quotearg
|
||||
invocations.
|
||||
quotearg_buffer:
|
||||
"\"'simple'\"", "\"'\\0 \\t\\n\\'\"\\033??/\\\\'\"", "\"'a:b'\""
|
||||
quotearg:
|
||||
"\"'simple'\"", "\"'\\0 \\t\\n\\'\"\\033??/\\\\'\"", "\"'a:b'\""
|
||||
quotearg_colon:
|
||||
"\"'simple'\"", "\"'\\0 \\t\\n\\'\"\\033??/\\\\'\"", "\"'a\\:b'\""
|
||||
*/
|
||||
custom_quoting_style
|
||||
};
|
||||
|
||||
/* Flags for use in set_quoting_flags. */
|
||||
@ -210,7 +255,9 @@ void set_quoting_style (struct quoting_options *o, enum quoting_style s);
|
||||
set the value of the quoting options for character C to I.
|
||||
Return the old value. Currently, the only values defined for I are
|
||||
0 (the default) and 1 (which means to quote the character even if
|
||||
it would not otherwise be quoted). */
|
||||
it would not otherwise be quoted). C must never be a digit or a
|
||||
letter that has special meaning after a backslash (for example, "\t"
|
||||
for tab). */
|
||||
int set_char_quoting (struct quoting_options *o, char c, int i);
|
||||
|
||||
/* In O (or in the default if O is null),
|
||||
@ -219,6 +266,19 @@ int set_char_quoting (struct quoting_options *o, char c, int i);
|
||||
behavior. Return the old value. */
|
||||
int set_quoting_flags (struct quoting_options *o, int i);
|
||||
|
||||
/* In O (or in the default if O is null),
|
||||
set the value of the quoting style to custom_quoting_style,
|
||||
set the left quote to LEFT_QUOTE, and set the right quote to
|
||||
RIGHT_QUOTE. Each of LEFT_QUOTE and RIGHT_QUOTE must be
|
||||
null-terminated and can be the empty string. Because backslashes are
|
||||
used for escaping, it does not make sense for RIGHT_QUOTE to contain
|
||||
a backslash. RIGHT_QUOTE must not begin with a digit or a letter
|
||||
that has special meaning after a backslash (for example, "\t" for
|
||||
tab). */
|
||||
void set_custom_quoting (struct quoting_options *o,
|
||||
char const *left_quote,
|
||||
char const *right_quote);
|
||||
|
||||
/* Place into buffer BUFFER (of size BUFFERSIZE) a quoted version of
|
||||
argument ARG (of size ARGSIZE), using O to control quoting.
|
||||
If O is null, use the default.
|
||||
@ -287,7 +347,8 @@ char *quotearg_style (enum quoting_style s, char const *arg);
|
||||
char *quotearg_style_mem (enum quoting_style s,
|
||||
char const *arg, size_t argsize);
|
||||
|
||||
/* Like quotearg (ARG), except also quote any instances of CH. */
|
||||
/* Like quotearg (ARG), except also quote any instances of CH.
|
||||
See set_char_quoting for a description of acceptable CH values. */
|
||||
char *quotearg_char (char const *arg, char ch);
|
||||
|
||||
/* Like quotearg_char (ARG, CH), except it can quote null bytes. */
|
||||
@ -299,6 +360,29 @@ char *quotearg_colon (char const *arg);
|
||||
/* Like quotearg_colon (ARG), except it can quote null bytes. */
|
||||
char *quotearg_colon_mem (char const *arg, size_t argsize);
|
||||
|
||||
/* Like quotearg_n_style (N, S, ARG) but with S as custom_quoting_style
|
||||
with left quote as LEFT_QUOTE and right quote as RIGHT_QUOTE. See
|
||||
set_custom_quoting for a description of acceptable LEFT_QUOTE and
|
||||
RIGHT_QUOTE values. */
|
||||
char *quotearg_n_custom (int n, char const *left_quote,
|
||||
char const *right_quote, char const *arg);
|
||||
|
||||
/* Like quotearg_n_custom (N, LEFT_QUOTE, RIGHT_QUOTE, ARG) except it
|
||||
can quote null bytes. */
|
||||
char *quotearg_n_custom_mem (int n, char const *left_quote,
|
||||
char const *right_quote,
|
||||
char const *arg, size_t argsize);
|
||||
|
||||
/* Equivalent to quotearg_n_custom (0, LEFT_QUOTE, RIGHT_QUOTE, ARG). */
|
||||
char *quotearg_custom (char const *left_quote, char const *right_quote,
|
||||
char const *arg);
|
||||
|
||||
/* Equivalent to quotearg_n_custom_mem (0, LEFT_QUOTE, RIGHT_QUOTE, ARG,
|
||||
ARGSIZE). */
|
||||
char *quotearg_custom_mem (char const *left_quote,
|
||||
char const *right_quote,
|
||||
char const *arg, size_t argsize);
|
||||
|
||||
/* Free any dynamically allocated memory. */
|
||||
void quotearg_free (void);
|
||||
|
||||
|
86
lib/stddef.in.h
Normal file
86
lib/stddef.in.h
Normal file
@ -0,0 +1,86 @@
|
||||
/* A substitute for POSIX 2008 <stddef.h>, for platforms that have issues.
|
||||
|
||||
Copyright (C) 2009 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
||||
|
||||
/* Written by Eric Blake. */
|
||||
|
||||
/*
|
||||
* POSIX 2008 <stddef.h> for platforms that have issues.
|
||||
* <http://www.opengroup.org/susv3xbd/stddef.h.html>
|
||||
*/
|
||||
|
||||
#if __GNUC__ >= 3
|
||||
@PRAGMA_SYSTEM_HEADER@
|
||||
#endif
|
||||
|
||||
#if defined __need_wchar_t || defined __need_size_t \
|
||||
|| defined __need_ptrdiff_t || defined __need_NULL \
|
||||
|| defined __need_wint_t
|
||||
/* Special invocation convention inside gcc header files. In
|
||||
particular, gcc provides a version of <stddef.h> that blindly
|
||||
redefines NULL even when __need_wint_t was defined, even though
|
||||
wint_t is not normally provided by <stddef.h>. Hence, we must
|
||||
remember if special invocation has ever been used to obtain wint_t,
|
||||
in which case we need to clean up NULL yet again. */
|
||||
|
||||
# if !(defined _GL_STDDEF_H && defined _GL_STDDEF_WINT_T)
|
||||
# ifdef __need_wint_t
|
||||
# undef _GL_STDDEF_H
|
||||
# define _GL_STDDEF_WINT_T
|
||||
# endif
|
||||
# @INCLUDE_NEXT@ @NEXT_STDDEF_H@
|
||||
# endif
|
||||
|
||||
#else
|
||||
/* Normal invocation convention. */
|
||||
|
||||
# ifndef _GL_STDDEF_H
|
||||
|
||||
/* The include_next requires a split double-inclusion guard. */
|
||||
|
||||
# @INCLUDE_NEXT@ @NEXT_STDDEF_H@
|
||||
|
||||
# ifndef _GL_STDDEF_H
|
||||
# define _GL_STDDEF_H
|
||||
|
||||
/* On NetBSD 5.0, the definition of NULL lacks proper parentheses. */
|
||||
#if @REPLACE_NULL@
|
||||
# undef NULL
|
||||
# ifdef __cplusplus
|
||||
/* ISO C++ says that the macro NULL must expand to an integer constant
|
||||
expression, hence '((void *) 0)' is not allowed in C++. */
|
||||
# if __GNUG__ >= 3
|
||||
/* GNU C++ has a __null macro that behaves like an integer ('int' or
|
||||
'long') but has the same size as a pointer. Use that, to avoid
|
||||
warnings. */
|
||||
# define NULL __null
|
||||
# else
|
||||
# define NULL 0L
|
||||
# endif
|
||||
# else
|
||||
# define NULL ((void *) 0)
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* Some platforms lack wchar_t. */
|
||||
#if !@HAVE_WCHAR_T@
|
||||
# define wchar_t int
|
||||
#endif
|
||||
|
||||
# endif /* _GL_STDDEF_H */
|
||||
# endif /* _GL_STDDEF_H */
|
||||
#endif /* __need_XXX */
|
@ -1,5 +1,5 @@
|
||||
/* POSIX compatible FILE stream write function.
|
||||
Copyright (C) 2008 Free Software Foundation, Inc.
|
||||
Copyright (C) 2008-2009 Free Software Foundation, Inc.
|
||||
Written by Bruno Haible <bruno@clisp.org>, 2008.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
@ -63,6 +63,7 @@
|
||||
}
|
||||
|
||||
# if !REPLACE_PRINTF_POSIX /* avoid collision with printf.c */
|
||||
# if !DEPENDS_ON_LIBINTL /* avoid collision with intl/printf.c */
|
||||
int
|
||||
printf (const char *format, ...)
|
||||
{
|
||||
@ -75,6 +76,7 @@ printf (const char *format, ...)
|
||||
|
||||
return retval;
|
||||
}
|
||||
# endif
|
||||
# endif
|
||||
|
||||
# if !REPLACE_FPRINTF_POSIX /* avoid collision with fprintf.c */
|
||||
@ -92,7 +94,7 @@ fprintf (FILE *stream, const char *format, ...)
|
||||
}
|
||||
# endif
|
||||
|
||||
# if !REPLACE_VFPRINTF_POSIX /* avoid collision with vprintf.c */
|
||||
# if !REPLACE_VPRINTF_POSIX /* avoid collision with vprintf.c */
|
||||
int
|
||||
vprintf (const char *format, va_list args)
|
||||
{
|
||||
@ -100,7 +102,7 @@ vprintf (const char *format, va_list args)
|
||||
}
|
||||
# endif
|
||||
|
||||
# if !REPLACE_VPRINTF_POSIX /* avoid collision with vfprintf.c */
|
||||
# if !REPLACE_VFPRINTF_POSIX /* avoid collision with vfprintf.c */
|
||||
int
|
||||
vfprintf (FILE *stream, const char *format, va_list args)
|
||||
#undef vfprintf
|
||||
|
@ -414,6 +414,9 @@ extern long rpl_ftell (FILE *fp);
|
||||
# if @REPLACE_FPURGE@ || !@HAVE_DECL_FPURGE@
|
||||
/* Discard all pending buffered I/O data on STREAM.
|
||||
STREAM must not be wide-character oriented.
|
||||
When discarding pending output, the file position is set back to where it
|
||||
was before the write calls. When discarding pending input, the file
|
||||
position is advanced to match the end of the previously read input.
|
||||
Return 0 if successful. Upon error, return -1 and set errno. */
|
||||
extern int fpurge (FILE *gl_stream);
|
||||
# endif
|
||||
@ -476,6 +479,20 @@ extern int puts (const char *string);
|
||||
extern size_t fwrite (const void *ptr, size_t s, size_t n, FILE *stream);
|
||||
#endif
|
||||
|
||||
#if @GNULIB_POPEN@
|
||||
# if @REPLACE_POPEN@
|
||||
# undef popen
|
||||
# define popen rpl_popen
|
||||
extern FILE *popen (const char *cmd, const char *mode);
|
||||
# endif
|
||||
#elif defined GNULIB_POSIXCHECK
|
||||
# undef popen
|
||||
# define popen(c,m) \
|
||||
(GL_LINK_WARNING ("popen is buggy on some platforms - " \
|
||||
"use gnulib module popen or pipe for more portability"), \
|
||||
popen (c, m))
|
||||
#endif
|
||||
|
||||
#if @GNULIB_GETDELIM@
|
||||
# if !@HAVE_DECL_GETDELIM@
|
||||
/* Read input, up to (and including) the next occurrence of DELIMITER, from
|
||||
|
@ -35,6 +35,8 @@
|
||||
#ifndef _GL_STDLIB_H
|
||||
#define _GL_STDLIB_H
|
||||
|
||||
/* NetBSD 5.0 mis-defines NULL. */
|
||||
#include <stddef.h>
|
||||
|
||||
/* Solaris declares getloadavg() in <sys/loadavg.h>. */
|
||||
#if @GNULIB_GETLOADAVG@ && @HAVE_SYS_LOADAVG_H@
|
||||
@ -205,6 +207,31 @@ extern char * mkdtemp (char * /*template*/);
|
||||
#endif
|
||||
|
||||
|
||||
#if @GNULIB_MKOSTEMP@
|
||||
# if !@HAVE_MKOSTEMP@
|
||||
/* Create a unique temporary file from TEMPLATE.
|
||||
The last six characters of TEMPLATE must be "XXXXXX";
|
||||
they are replaced with a string that makes the file name unique.
|
||||
The flags are a bitmask, possibly including O_CLOEXEC (defined in <fcntl.h>)
|
||||
and O_TEXT, O_BINARY (defined in "binary-io.h").
|
||||
The file is then created, with the specified flags, ensuring it didn't exist
|
||||
before.
|
||||
The file is created read-write (mask at least 0600 & ~umask), but it may be
|
||||
world-readable and world-writable (mask 0666 & ~umask), depending on the
|
||||
implementation.
|
||||
Returns the open file descriptor if successful, otherwise -1 and errno
|
||||
set. */
|
||||
extern int mkostemp (char * /*template*/, int /*flags*/);
|
||||
# endif
|
||||
#elif defined GNULIB_POSIXCHECK
|
||||
# undef mkostemp
|
||||
# define mkostemp(t,f) \
|
||||
(GL_LINK_WARNING ("mkostemp is unportable - " \
|
||||
"use gnulib module mkostemp for portability"), \
|
||||
mkostemp (t, f))
|
||||
#endif
|
||||
|
||||
|
||||
#if @GNULIB_MKSTEMP@
|
||||
# if @REPLACE_MKSTEMP@
|
||||
/* Create a unique temporary file from TEMPLATE.
|
||||
|
429
lib/str-two-way.h
Normal file
429
lib/str-two-way.h
Normal file
@ -0,0 +1,429 @@
|
||||
/* Byte-wise substring search, using the Two-Way algorithm.
|
||||
Copyright (C) 2008 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Written by Eric Blake <ebb9@byu.net>, 2008.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
||||
|
||||
/* Before including this file, you need to include <config.h> and
|
||||
<string.h>, and define:
|
||||
RESULT_TYPE A macro that expands to the return type.
|
||||
AVAILABLE(h, h_l, j, n_l)
|
||||
A macro that returns nonzero if there are
|
||||
at least N_L bytes left starting at H[J].
|
||||
H is 'unsigned char *', H_L, J, and N_L
|
||||
are 'size_t'; H_L is an lvalue. For
|
||||
NUL-terminated searches, H_L can be
|
||||
modified each iteration to avoid having
|
||||
to compute the end of H up front.
|
||||
|
||||
For case-insensitivity, you may optionally define:
|
||||
CMP_FUNC(p1, p2, l) A macro that returns 0 iff the first L
|
||||
characters of P1 and P2 are equal.
|
||||
CANON_ELEMENT(c) A macro that canonicalizes an element right after
|
||||
it has been fetched from one of the two strings.
|
||||
The argument is an 'unsigned char'; the result
|
||||
must be an 'unsigned char' as well.
|
||||
|
||||
This file undefines the macros documented above, and defines
|
||||
LONG_NEEDLE_THRESHOLD.
|
||||
*/
|
||||
|
||||
#include <limits.h>
|
||||
#include <stdint.h>
|
||||
|
||||
/* We use the Two-Way string matching algorithm, which guarantees
|
||||
linear complexity with constant space. Additionally, for long
|
||||
needles, we also use a bad character shift table similar to the
|
||||
Boyer-Moore algorithm to achieve improved (potentially sub-linear)
|
||||
performance.
|
||||
|
||||
See http://www-igm.univ-mlv.fr/~lecroq/string/node26.html#SECTION00260
|
||||
and http://en.wikipedia.org/wiki/Boyer-Moore_string_search_algorithm
|
||||
*/
|
||||
|
||||
/* Point at which computing a bad-byte shift table is likely to be
|
||||
worthwhile. Small needles should not compute a table, since it
|
||||
adds (1 << CHAR_BIT) + NEEDLE_LEN computations of preparation for a
|
||||
speedup no greater than a factor of NEEDLE_LEN. The larger the
|
||||
needle, the better the potential performance gain. On the other
|
||||
hand, on non-POSIX systems with CHAR_BIT larger than eight, the
|
||||
memory required for the table is prohibitive. */
|
||||
#if CHAR_BIT < 10
|
||||
# define LONG_NEEDLE_THRESHOLD 32U
|
||||
#else
|
||||
# define LONG_NEEDLE_THRESHOLD SIZE_MAX
|
||||
#endif
|
||||
|
||||
#ifndef MAX
|
||||
# define MAX(a, b) ((a < b) ? (b) : (a))
|
||||
#endif
|
||||
|
||||
#ifndef CANON_ELEMENT
|
||||
# define CANON_ELEMENT(c) c
|
||||
#endif
|
||||
#ifndef CMP_FUNC
|
||||
# define CMP_FUNC memcmp
|
||||
#endif
|
||||
|
||||
/* Perform a critical factorization of NEEDLE, of length NEEDLE_LEN.
|
||||
Return the index of the first byte in the right half, and set
|
||||
*PERIOD to the global period of the right half.
|
||||
|
||||
The global period of a string is the smallest index (possibly its
|
||||
length) at which all remaining bytes in the string are repetitions
|
||||
of the prefix (the last repetition may be a subset of the prefix).
|
||||
|
||||
When NEEDLE is factored into two halves, a local period is the
|
||||
length of the smallest word that shares a suffix with the left half
|
||||
and shares a prefix with the right half. All factorizations of a
|
||||
non-empty NEEDLE have a local period of at least 1 and no greater
|
||||
than NEEDLE_LEN.
|
||||
|
||||
A critical factorization has the property that the local period
|
||||
equals the global period. All strings have at least one critical
|
||||
factorization with the left half smaller than the global period.
|
||||
|
||||
Given an ordered alphabet, a critical factorization can be computed
|
||||
in linear time, with 2 * NEEDLE_LEN comparisons, by computing the
|
||||
larger of two ordered maximal suffixes. The ordered maximal
|
||||
suffixes are determined by lexicographic comparison of
|
||||
periodicity. */
|
||||
static size_t
|
||||
critical_factorization (const unsigned char *needle, size_t needle_len,
|
||||
size_t *period)
|
||||
{
|
||||
/* Index of last byte of left half, or SIZE_MAX. */
|
||||
size_t max_suffix, max_suffix_rev;
|
||||
size_t j; /* Index into NEEDLE for current candidate suffix. */
|
||||
size_t k; /* Offset into current period. */
|
||||
size_t p; /* Intermediate period. */
|
||||
unsigned char a, b; /* Current comparison bytes. */
|
||||
|
||||
/* Invariants:
|
||||
0 <= j < NEEDLE_LEN - 1
|
||||
-1 <= max_suffix{,_rev} < j (treating SIZE_MAX as if it were signed)
|
||||
min(max_suffix, max_suffix_rev) < global period of NEEDLE
|
||||
1 <= p <= global period of NEEDLE
|
||||
p == global period of the substring NEEDLE[max_suffix{,_rev}+1...j]
|
||||
1 <= k <= p
|
||||
*/
|
||||
|
||||
/* Perform lexicographic search. */
|
||||
max_suffix = SIZE_MAX;
|
||||
j = 0;
|
||||
k = p = 1;
|
||||
while (j + k < needle_len)
|
||||
{
|
||||
a = CANON_ELEMENT (needle[j + k]);
|
||||
b = CANON_ELEMENT (needle[max_suffix + k]);
|
||||
if (a < b)
|
||||
{
|
||||
/* Suffix is smaller, period is entire prefix so far. */
|
||||
j += k;
|
||||
k = 1;
|
||||
p = j - max_suffix;
|
||||
}
|
||||
else if (a == b)
|
||||
{
|
||||
/* Advance through repetition of the current period. */
|
||||
if (k != p)
|
||||
++k;
|
||||
else
|
||||
{
|
||||
j += p;
|
||||
k = 1;
|
||||
}
|
||||
}
|
||||
else /* b < a */
|
||||
{
|
||||
/* Suffix is larger, start over from current location. */
|
||||
max_suffix = j++;
|
||||
k = p = 1;
|
||||
}
|
||||
}
|
||||
*period = p;
|
||||
|
||||
/* Perform reverse lexicographic search. */
|
||||
max_suffix_rev = SIZE_MAX;
|
||||
j = 0;
|
||||
k = p = 1;
|
||||
while (j + k < needle_len)
|
||||
{
|
||||
a = CANON_ELEMENT (needle[j + k]);
|
||||
b = CANON_ELEMENT (needle[max_suffix_rev + k]);
|
||||
if (b < a)
|
||||
{
|
||||
/* Suffix is smaller, period is entire prefix so far. */
|
||||
j += k;
|
||||
k = 1;
|
||||
p = j - max_suffix_rev;
|
||||
}
|
||||
else if (a == b)
|
||||
{
|
||||
/* Advance through repetition of the current period. */
|
||||
if (k != p)
|
||||
++k;
|
||||
else
|
||||
{
|
||||
j += p;
|
||||
k = 1;
|
||||
}
|
||||
}
|
||||
else /* a < b */
|
||||
{
|
||||
/* Suffix is larger, start over from current location. */
|
||||
max_suffix_rev = j++;
|
||||
k = p = 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* Choose the longer suffix. Return the first byte of the right
|
||||
half, rather than the last byte of the left half. */
|
||||
if (max_suffix_rev + 1 < max_suffix + 1)
|
||||
return max_suffix + 1;
|
||||
*period = p;
|
||||
return max_suffix_rev + 1;
|
||||
}
|
||||
|
||||
/* Return the first location of non-empty NEEDLE within HAYSTACK, or
|
||||
NULL. HAYSTACK_LEN is the minimum known length of HAYSTACK. This
|
||||
method is optimized for NEEDLE_LEN < LONG_NEEDLE_THRESHOLD.
|
||||
Performance is guaranteed to be linear, with an initialization cost
|
||||
of 2 * NEEDLE_LEN comparisons.
|
||||
|
||||
If AVAILABLE does not modify HAYSTACK_LEN (as in memmem), then at
|
||||
most 2 * HAYSTACK_LEN - NEEDLE_LEN comparisons occur in searching.
|
||||
If AVAILABLE modifies HAYSTACK_LEN (as in strstr), then at most 3 *
|
||||
HAYSTACK_LEN - NEEDLE_LEN comparisons occur in searching. */
|
||||
static RETURN_TYPE
|
||||
two_way_short_needle (const unsigned char *haystack, size_t haystack_len,
|
||||
const unsigned char *needle, size_t needle_len)
|
||||
{
|
||||
size_t i; /* Index into current byte of NEEDLE. */
|
||||
size_t j; /* Index into current window of HAYSTACK. */
|
||||
size_t period; /* The period of the right half of needle. */
|
||||
size_t suffix; /* The index of the right half of needle. */
|
||||
|
||||
/* Factor the needle into two halves, such that the left half is
|
||||
smaller than the global period, and the right half is
|
||||
periodic (with a period as large as NEEDLE_LEN - suffix). */
|
||||
suffix = critical_factorization (needle, needle_len, &period);
|
||||
|
||||
/* Perform the search. Each iteration compares the right half
|
||||
first. */
|
||||
if (CMP_FUNC (needle, needle + period, suffix) == 0)
|
||||
{
|
||||
/* Entire needle is periodic; a mismatch can only advance by the
|
||||
period, so use memory to avoid rescanning known occurrences
|
||||
of the period. */
|
||||
size_t memory = 0;
|
||||
j = 0;
|
||||
while (AVAILABLE (haystack, haystack_len, j, needle_len))
|
||||
{
|
||||
/* Scan for matches in right half. */
|
||||
i = MAX (suffix, memory);
|
||||
while (i < needle_len && (CANON_ELEMENT (needle[i])
|
||||
== CANON_ELEMENT (haystack[i + j])))
|
||||
++i;
|
||||
if (needle_len <= i)
|
||||
{
|
||||
/* Scan for matches in left half. */
|
||||
i = suffix - 1;
|
||||
while (memory < i + 1 && (CANON_ELEMENT (needle[i])
|
||||
== CANON_ELEMENT (haystack[i + j])))
|
||||
--i;
|
||||
if (i + 1 < memory + 1)
|
||||
return (RETURN_TYPE) (haystack + j);
|
||||
/* No match, so remember how many repetitions of period
|
||||
on the right half were scanned. */
|
||||
j += period;
|
||||
memory = needle_len - period;
|
||||
}
|
||||
else
|
||||
{
|
||||
j += i - suffix + 1;
|
||||
memory = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* The two halves of needle are distinct; no extra memory is
|
||||
required, and any mismatch results in a maximal shift. */
|
||||
period = MAX (suffix, needle_len - suffix) + 1;
|
||||
j = 0;
|
||||
while (AVAILABLE (haystack, haystack_len, j, needle_len))
|
||||
{
|
||||
/* Scan for matches in right half. */
|
||||
i = suffix;
|
||||
while (i < needle_len && (CANON_ELEMENT (needle[i])
|
||||
== CANON_ELEMENT (haystack[i + j])))
|
||||
++i;
|
||||
if (needle_len <= i)
|
||||
{
|
||||
/* Scan for matches in left half. */
|
||||
i = suffix - 1;
|
||||
while (i != SIZE_MAX && (CANON_ELEMENT (needle[i])
|
||||
== CANON_ELEMENT (haystack[i + j])))
|
||||
--i;
|
||||
if (i == SIZE_MAX)
|
||||
return (RETURN_TYPE) (haystack + j);
|
||||
j += period;
|
||||
}
|
||||
else
|
||||
j += i - suffix + 1;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Return the first location of non-empty NEEDLE within HAYSTACK, or
|
||||
NULL. HAYSTACK_LEN is the minimum known length of HAYSTACK. This
|
||||
method is optimized for LONG_NEEDLE_THRESHOLD <= NEEDLE_LEN.
|
||||
Performance is guaranteed to be linear, with an initialization cost
|
||||
of 3 * NEEDLE_LEN + (1 << CHAR_BIT) operations.
|
||||
|
||||
If AVAILABLE does not modify HAYSTACK_LEN (as in memmem), then at
|
||||
most 2 * HAYSTACK_LEN - NEEDLE_LEN comparisons occur in searching,
|
||||
and sublinear performance O(HAYSTACK_LEN / NEEDLE_LEN) is possible.
|
||||
If AVAILABLE modifies HAYSTACK_LEN (as in strstr), then at most 3 *
|
||||
HAYSTACK_LEN - NEEDLE_LEN comparisons occur in searching, and
|
||||
sublinear performance is not possible. */
|
||||
static RETURN_TYPE
|
||||
two_way_long_needle (const unsigned char *haystack, size_t haystack_len,
|
||||
const unsigned char *needle, size_t needle_len)
|
||||
{
|
||||
size_t i; /* Index into current byte of NEEDLE. */
|
||||
size_t j; /* Index into current window of HAYSTACK. */
|
||||
size_t period; /* The period of the right half of needle. */
|
||||
size_t suffix; /* The index of the right half of needle. */
|
||||
size_t shift_table[1U << CHAR_BIT]; /* See below. */
|
||||
|
||||
/* Factor the needle into two halves, such that the left half is
|
||||
smaller than the global period, and the right half is
|
||||
periodic (with a period as large as NEEDLE_LEN - suffix). */
|
||||
suffix = critical_factorization (needle, needle_len, &period);
|
||||
|
||||
/* Populate shift_table. For each possible byte value c,
|
||||
shift_table[c] is the distance from the last occurrence of c to
|
||||
the end of NEEDLE, or NEEDLE_LEN if c is absent from the NEEDLE.
|
||||
shift_table[NEEDLE[NEEDLE_LEN - 1]] contains the only 0. */
|
||||
for (i = 0; i < 1U << CHAR_BIT; i++)
|
||||
shift_table[i] = needle_len;
|
||||
for (i = 0; i < needle_len; i++)
|
||||
shift_table[CANON_ELEMENT (needle[i])] = needle_len - i - 1;
|
||||
|
||||
/* Perform the search. Each iteration compares the right half
|
||||
first. */
|
||||
if (CMP_FUNC (needle, needle + period, suffix) == 0)
|
||||
{
|
||||
/* Entire needle is periodic; a mismatch can only advance by the
|
||||
period, so use memory to avoid rescanning known occurrences
|
||||
of the period. */
|
||||
size_t memory = 0;
|
||||
size_t shift;
|
||||
j = 0;
|
||||
while (AVAILABLE (haystack, haystack_len, j, needle_len))
|
||||
{
|
||||
/* Check the last byte first; if it does not match, then
|
||||
shift to the next possible match location. */
|
||||
shift = shift_table[CANON_ELEMENT (haystack[j + needle_len - 1])];
|
||||
if (0 < shift)
|
||||
{
|
||||
if (memory && shift < period)
|
||||
{
|
||||
/* Since needle is periodic, but the last period has
|
||||
a byte out of place, there can be no match until
|
||||
after the mismatch. */
|
||||
shift = needle_len - period;
|
||||
memory = 0;
|
||||
}
|
||||
j += shift;
|
||||
continue;
|
||||
}
|
||||
/* Scan for matches in right half. The last byte has
|
||||
already been matched, by virtue of the shift table. */
|
||||
i = MAX (suffix, memory);
|
||||
while (i < needle_len - 1 && (CANON_ELEMENT (needle[i])
|
||||
== CANON_ELEMENT (haystack[i + j])))
|
||||
++i;
|
||||
if (needle_len - 1 <= i)
|
||||
{
|
||||
/* Scan for matches in left half. */
|
||||
i = suffix - 1;
|
||||
while (memory < i + 1 && (CANON_ELEMENT (needle[i])
|
||||
== CANON_ELEMENT (haystack[i + j])))
|
||||
--i;
|
||||
if (i + 1 < memory + 1)
|
||||
return (RETURN_TYPE) (haystack + j);
|
||||
/* No match, so remember how many repetitions of period
|
||||
on the right half were scanned. */
|
||||
j += period;
|
||||
memory = needle_len - period;
|
||||
}
|
||||
else
|
||||
{
|
||||
j += i - suffix + 1;
|
||||
memory = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* The two halves of needle are distinct; no extra memory is
|
||||
required, and any mismatch results in a maximal shift. */
|
||||
size_t shift;
|
||||
period = MAX (suffix, needle_len - suffix) + 1;
|
||||
j = 0;
|
||||
while (AVAILABLE (haystack, haystack_len, j, needle_len))
|
||||
{
|
||||
/* Check the last byte first; if it does not match, then
|
||||
shift to the next possible match location. */
|
||||
shift = shift_table[CANON_ELEMENT (haystack[j + needle_len - 1])];
|
||||
if (0 < shift)
|
||||
{
|
||||
j += shift;
|
||||
continue;
|
||||
}
|
||||
/* Scan for matches in right half. The last byte has
|
||||
already been matched, by virtue of the shift table. */
|
||||
i = suffix;
|
||||
while (i < needle_len - 1 && (CANON_ELEMENT (needle[i])
|
||||
== CANON_ELEMENT (haystack[i + j])))
|
||||
++i;
|
||||
if (needle_len - 1 <= i)
|
||||
{
|
||||
/* Scan for matches in left half. */
|
||||
i = suffix - 1;
|
||||
while (i != SIZE_MAX && (CANON_ELEMENT (needle[i])
|
||||
== CANON_ELEMENT (haystack[i + j])))
|
||||
--i;
|
||||
if (i == SIZE_MAX)
|
||||
return (RETURN_TYPE) (haystack + j);
|
||||
j += period;
|
||||
}
|
||||
else
|
||||
j += i - suffix + 1;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#undef AVAILABLE
|
||||
#undef CANON_ELEMENT
|
||||
#undef CMP_FUNC
|
||||
#undef MAX
|
||||
#undef RETURN_TYPE
|
63
lib/strcasecmp.c
Normal file
63
lib/strcasecmp.c
Normal file
@ -0,0 +1,63 @@
|
||||
/* Case-insensitive string comparison function.
|
||||
Copyright (C) 1998-1999, 2005-2007 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
/* Specification. */
|
||||
#include <string.h>
|
||||
|
||||
#include <ctype.h>
|
||||
#include <limits.h>
|
||||
|
||||
#define TOLOWER(Ch) (isupper (Ch) ? tolower (Ch) : (Ch))
|
||||
|
||||
/* Compare strings S1 and S2, ignoring case, returning less than, equal to or
|
||||
greater than zero if S1 is lexicographically less than, equal to or greater
|
||||
than S2.
|
||||
Note: This function does not work with multibyte strings! */
|
||||
|
||||
int
|
||||
strcasecmp (const char *s1, const char *s2)
|
||||
{
|
||||
const unsigned char *p1 = (const unsigned char *) s1;
|
||||
const unsigned char *p2 = (const unsigned char *) s2;
|
||||
unsigned char c1, c2;
|
||||
|
||||
if (p1 == p2)
|
||||
return 0;
|
||||
|
||||
do
|
||||
{
|
||||
c1 = TOLOWER (*p1);
|
||||
c2 = TOLOWER (*p2);
|
||||
|
||||
if (c1 == '\0')
|
||||
break;
|
||||
|
||||
++p1;
|
||||
++p2;
|
||||
}
|
||||
while (c1 == c2);
|
||||
|
||||
if (UCHAR_MAX <= INT_MAX)
|
||||
return c1 - c2;
|
||||
else
|
||||
/* On machines where 'char' and 'int' are types of the same size, the
|
||||
difference of two 'unsigned char' values - including the sign bit -
|
||||
doesn't fit in an 'int'. */
|
||||
return (c1 > c2 ? 1 : c1 < c2 ? -1 : 0);
|
||||
}
|
83
lib/strcasestr.c
Normal file
83
lib/strcasestr.c
Normal file
@ -0,0 +1,83 @@
|
||||
/* Case-insensitive searching in a string.
|
||||
Copyright (C) 2005-2008 Free Software Foundation, Inc.
|
||||
Written by Bruno Haible <bruno@clisp.org>, 2005.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
/* Specification. */
|
||||
#include <string.h>
|
||||
|
||||
#include <ctype.h>
|
||||
#include <stdbool.h>
|
||||
#include <strings.h>
|
||||
|
||||
#define TOLOWER(Ch) (isupper (Ch) ? tolower (Ch) : (Ch))
|
||||
|
||||
/* Two-Way algorithm. */
|
||||
#define RETURN_TYPE char *
|
||||
#define AVAILABLE(h, h_l, j, n_l) \
|
||||
(!memchr ((h) + (h_l), '\0', (j) + (n_l) - (h_l)) \
|
||||
&& ((h_l) = (j) + (n_l)))
|
||||
#define CANON_ELEMENT(c) TOLOWER (c)
|
||||
#define CMP_FUNC(p1, p2, l) \
|
||||
strncasecmp ((const char *) (p1), (const char *) (p2), l)
|
||||
#include "str-two-way.h"
|
||||
|
||||
/* Find the first occurrence of NEEDLE in HAYSTACK, using
|
||||
case-insensitive comparison. This function gives unspecified
|
||||
results in multibyte locales. */
|
||||
char *
|
||||
strcasestr (const char *haystack_start, const char *needle_start)
|
||||
{
|
||||
const char *haystack = haystack_start;
|
||||
const char *needle = needle_start;
|
||||
size_t needle_len; /* Length of NEEDLE. */
|
||||
size_t haystack_len; /* Known minimum length of HAYSTACK. */
|
||||
bool ok = true; /* True if NEEDLE is prefix of HAYSTACK. */
|
||||
|
||||
/* Determine length of NEEDLE, and in the process, make sure
|
||||
HAYSTACK is at least as long (no point processing all of a long
|
||||
NEEDLE if HAYSTACK is too short). */
|
||||
while (*haystack && *needle)
|
||||
{
|
||||
ok &= (TOLOWER ((unsigned char) *haystack)
|
||||
== TOLOWER ((unsigned char) *needle));
|
||||
haystack++;
|
||||
needle++;
|
||||
}
|
||||
if (*needle)
|
||||
return NULL;
|
||||
if (ok)
|
||||
return (char *) haystack_start;
|
||||
needle_len = needle - needle_start;
|
||||
haystack = haystack_start + 1;
|
||||
haystack_len = needle_len - 1;
|
||||
|
||||
/* Perform the search. Abstract memory is considered to be an array
|
||||
of 'unsigned char' values, not an array of 'char' values. See
|
||||
ISO C 99 section 6.2.6.1. */
|
||||
if (needle_len < LONG_NEEDLE_THRESHOLD)
|
||||
return two_way_short_needle ((const unsigned char *) haystack,
|
||||
haystack_len,
|
||||
(const unsigned char *) needle_start,
|
||||
needle_len);
|
||||
return two_way_long_needle ((const unsigned char *) haystack, haystack_len,
|
||||
(const unsigned char *) needle_start,
|
||||
needle_len);
|
||||
}
|
||||
|
||||
#undef LONG_NEEDLE_THRESHOLD
|
@ -28,6 +28,8 @@
|
||||
#ifndef _GL_STRING_H
|
||||
#define _GL_STRING_H
|
||||
|
||||
/* NetBSD 5.0 mis-defines NULL. */
|
||||
#include <stddef.h>
|
||||
|
||||
#ifndef __attribute__
|
||||
/* This feature is available in gcc versions 2.5 and later. */
|
||||
|
90
lib/strings.in.h
Normal file
90
lib/strings.in.h
Normal file
@ -0,0 +1,90 @@
|
||||
/* A substitute <strings.h>.
|
||||
|
||||
Copyright (C) 2007-2008 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
||||
|
||||
#ifndef _GL_STRINGS_H
|
||||
|
||||
#if __GNUC__ >= 3
|
||||
@PRAGMA_SYSTEM_HEADER@
|
||||
#endif
|
||||
|
||||
/* The include_next requires a split double-inclusion guard. */
|
||||
#@INCLUDE_NEXT@ @NEXT_STRINGS_H@
|
||||
|
||||
#ifndef _GL_STRINGS_H
|
||||
#define _GL_STRINGS_H
|
||||
|
||||
|
||||
/* The definition of GL_LINK_WARNING is copied here. */
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
/* Compare strings S1 and S2, ignoring case, returning less than, equal to or
|
||||
greater than zero if S1 is lexicographically less than, equal to or greater
|
||||
than S2.
|
||||
Note: This function does not work in multibyte locales. */
|
||||
#if ! @HAVE_STRCASECMP@
|
||||
extern int strcasecmp (char const *s1, char const *s2);
|
||||
#endif
|
||||
#if defined GNULIB_POSIXCHECK
|
||||
/* strcasecmp() does not work with multibyte strings:
|
||||
POSIX says that it operates on "strings", and "string" in POSIX is defined
|
||||
as a sequence of bytes, not of characters. */
|
||||
# undef strcasecmp
|
||||
# define strcasecmp(a,b) \
|
||||
(GL_LINK_WARNING ("strcasecmp cannot work correctly on character strings " \
|
||||
"in multibyte locales - " \
|
||||
"use mbscasecmp if you care about " \
|
||||
"internationalization, or use c_strcasecmp (from " \
|
||||
"gnulib module c-strcase) if you want a locale " \
|
||||
"independent function"), \
|
||||
strcasecmp (a, b))
|
||||
#endif
|
||||
|
||||
/* Compare no more than N bytes of strings S1 and S2, ignoring case,
|
||||
returning less than, equal to or greater than zero if S1 is
|
||||
lexicographically less than, equal to or greater than S2.
|
||||
Note: This function cannot work correctly in multibyte locales. */
|
||||
#if ! @HAVE_DECL_STRNCASECMP@
|
||||
extern int strncasecmp (char const *s1, char const *s2, size_t n);
|
||||
#endif
|
||||
#if defined GNULIB_POSIXCHECK
|
||||
/* strncasecmp() does not work with multibyte strings:
|
||||
POSIX says that it operates on "strings", and "string" in POSIX is defined
|
||||
as a sequence of bytes, not of characters. */
|
||||
# undef strncasecmp
|
||||
# define strncasecmp(a,b,n) \
|
||||
(GL_LINK_WARNING ("strncasecmp cannot work correctly on character " \
|
||||
"strings in multibyte locales - " \
|
||||
"use mbsncasecmp or mbspcasecmp if you care about " \
|
||||
"internationalization, or use c_strncasecmp (from " \
|
||||
"gnulib module c-strcase) if you want a locale " \
|
||||
"independent function"), \
|
||||
strncasecmp (a, b, n))
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _GL_STRING_H */
|
||||
#endif /* _GL_STRING_H */
|
63
lib/strncasecmp.c
Normal file
63
lib/strncasecmp.c
Normal file
@ -0,0 +1,63 @@
|
||||
/* strncasecmp.c -- case insensitive string comparator
|
||||
Copyright (C) 1998-1999, 2005-2007 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
/* Specification. */
|
||||
#include <string.h>
|
||||
|
||||
#include <ctype.h>
|
||||
#include <limits.h>
|
||||
|
||||
#define TOLOWER(Ch) (isupper (Ch) ? tolower (Ch) : (Ch))
|
||||
|
||||
/* Compare no more than N bytes of strings S1 and S2, ignoring case,
|
||||
returning less than, equal to or greater than zero if S1 is
|
||||
lexicographically less than, equal to or greater than S2.
|
||||
Note: This function cannot work correctly in multibyte locales. */
|
||||
|
||||
int
|
||||
strncasecmp (const char *s1, const char *s2, size_t n)
|
||||
{
|
||||
register const unsigned char *p1 = (const unsigned char *) s1;
|
||||
register const unsigned char *p2 = (const unsigned char *) s2;
|
||||
unsigned char c1, c2;
|
||||
|
||||
if (p1 == p2 || n == 0)
|
||||
return 0;
|
||||
|
||||
do
|
||||
{
|
||||
c1 = TOLOWER (*p1);
|
||||
c2 = TOLOWER (*p2);
|
||||
|
||||
if (--n == 0 || c1 == '\0')
|
||||
break;
|
||||
|
||||
++p1;
|
||||
++p2;
|
||||
}
|
||||
while (c1 == c2);
|
||||
|
||||
if (UCHAR_MAX <= INT_MAX)
|
||||
return c1 - c2;
|
||||
else
|
||||
/* On machines where 'char' and 'int' are types of the same size, the
|
||||
difference of two 'unsigned char' values - including the sign bit -
|
||||
doesn't fit in an 'int'. */
|
||||
return (c1 > c2 ? 1 : c1 < c2 ? -1 : 0);
|
||||
}
|
@ -29,6 +29,9 @@
|
||||
#ifndef _GL_UNISTD_H
|
||||
#define _GL_UNISTD_H
|
||||
|
||||
/* NetBSD 5.0 mis-defines NULL. Also get size_t. */
|
||||
#include <stddef.h>
|
||||
|
||||
/* mingw doesn't define the SEEK_* or *_FILENO macros in <unistd.h>. */
|
||||
#if !(defined SEEK_CUR && defined SEEK_END && defined SEEK_SET)
|
||||
# include <stdio.h>
|
||||
@ -43,6 +46,11 @@
|
||||
# include <sys/types.h>
|
||||
#endif
|
||||
|
||||
/* Get getopt(), optarg, optind, opterr, optopt. */
|
||||
#if @GNULIB_UNISTD_H_GETOPT@
|
||||
# include <getopt.h>
|
||||
#endif
|
||||
|
||||
#if @GNULIB_GETHOSTNAME@
|
||||
/* Get all possible declarations of gethostname(). */
|
||||
# if @UNISTD_H_HAVE_WINSOCK2_H@
|
||||
@ -137,7 +145,7 @@ extern int chown (const char *file, uid_t uid, gid_t gid);
|
||||
# define close rpl_close
|
||||
extern int close (int);
|
||||
# endif
|
||||
#elif @UNISTD_H_HAVE_WINSOCK2_H@
|
||||
#elif @UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS@
|
||||
# undef close
|
||||
# define close close_used_without_requesting_gnulib_module_close
|
||||
#elif defined GNULIB_POSIXCHECK
|
||||
@ -150,10 +158,13 @@ extern int close (int);
|
||||
|
||||
|
||||
#if @GNULIB_DUP2@
|
||||
# if !@HAVE_DUP2@
|
||||
# if @REPLACE_DUP2@
|
||||
# define dup2 rpl_dup2
|
||||
# endif
|
||||
# if !@HAVE_DUP2@ || @REPLACE_DUP2@
|
||||
/* Copy the file descriptor OLDFD into file descriptor NEWFD. Do nothing if
|
||||
NEWFD = OLDFD, otherwise close NEWFD first if it is open.
|
||||
Return 0 if successful, otherwise -1 and errno set.
|
||||
Return newfd if successful, otherwise -1 and errno set.
|
||||
See the POSIX:2001 specification
|
||||
<http://www.opengroup.org/susv3xsh/dup2.html>. */
|
||||
extern int dup2 (int oldfd, int newfd);
|
||||
@ -167,6 +178,28 @@ extern int dup2 (int oldfd, int newfd);
|
||||
#endif
|
||||
|
||||
|
||||
#if @GNULIB_DUP3@
|
||||
/* Copy the file descriptor OLDFD into file descriptor NEWFD, with the
|
||||
specified flags.
|
||||
The flags are a bitmask, possibly including O_CLOEXEC (defined in <fcntl.h>)
|
||||
and O_TEXT, O_BINARY (defined in "binary-io.h").
|
||||
Close NEWFD first if it is open.
|
||||
Return newfd if successful, otherwise -1 and errno set.
|
||||
See the Linux man page at
|
||||
<http://www.kernel.org/doc/man-pages/online/pages/man2/dup3.2.html>. */
|
||||
# if @HAVE_DUP3@
|
||||
# define dup3 rpl_dup3
|
||||
# endif
|
||||
extern int dup3 (int oldfd, int newfd, int flags);
|
||||
#elif defined GNULIB_POSIXCHECK
|
||||
# undef dup3
|
||||
# define dup3(o,n,f) \
|
||||
(GL_LINK_WARNING ("dup3 is unportable - " \
|
||||
"use gnulib module dup3 for portability"), \
|
||||
dup3 (o, n, f))
|
||||
#endif
|
||||
|
||||
|
||||
#if @GNULIB_ENVIRON@
|
||||
# if !@HAVE_DECL_ENVIRON@
|
||||
/* Set of environment variables and values. An array of strings of the form
|
||||
@ -214,8 +247,12 @@ extern int fchdir (int /*fd*/);
|
||||
|
||||
# define dup rpl_dup
|
||||
extern int dup (int);
|
||||
# define dup2 rpl_dup2
|
||||
extern int dup2 (int, int);
|
||||
|
||||
/* Gnulib internal hooks needed to maintain the fchdir metadata. */
|
||||
extern int _gl_register_fd (int fd, const char *filename);
|
||||
extern void _gl_unregister_fd (int fd);
|
||||
extern int _gl_register_dup (int oldfd, int newfd);
|
||||
extern const char *_gl_directory_name (int fd);
|
||||
|
||||
# endif
|
||||
#elif defined GNULIB_POSIXCHECK
|
||||
@ -313,7 +350,8 @@ extern int getdomainname(char *name, size_t len);
|
||||
|
||||
#if @GNULIB_GETDTABLESIZE@
|
||||
# if !@HAVE_GETDTABLESIZE@
|
||||
/* Return the maximum number of file descriptors in the current process. */
|
||||
/* Return the maximum number of file descriptors in the current process.
|
||||
In POSIX, this is same as sysconf (_SC_OPEN_MAX). */
|
||||
extern int getdtablesize (void);
|
||||
# endif
|
||||
#elif defined GNULIB_POSIXCHECK
|
||||
@ -363,7 +401,6 @@ extern int gethostname(char *name, size_t len);
|
||||
See <http://www.opengroup.org/susv3xsh/getlogin.html>.
|
||||
*/
|
||||
# if !@HAVE_DECL_GETLOGIN_R@
|
||||
# include <stddef.h>
|
||||
extern int getlogin_r (char *name, size_t size);
|
||||
# endif
|
||||
#elif defined GNULIB_POSIXCHECK
|
||||
@ -517,6 +554,28 @@ extern int link (const char *path1, const char *path2);
|
||||
#endif
|
||||
|
||||
|
||||
#if @GNULIB_PIPE2@
|
||||
/* Create a pipe, applying the given flags when opening the read-end of the
|
||||
pipe and the write-end of the pipe.
|
||||
The flags are a bitmask, possibly including O_CLOEXEC (defined in <fcntl.h>)
|
||||
and O_TEXT, O_BINARY (defined in "binary-io.h").
|
||||
Store the read-end as fd[0] and the write-end as fd[1].
|
||||
Return 0 upon success, or -1 with errno set upon failure.
|
||||
See also the Linux man page at
|
||||
<http://www.kernel.org/doc/man-pages/online/pages/man2/pipe2.2.html>. */
|
||||
# if @HAVE_PIPE2@
|
||||
# define pipe2 rpl_pipe2
|
||||
# endif
|
||||
extern int pipe2 (int fd[2], int flags);
|
||||
#elif defined GNULIB_POSIXCHECK
|
||||
# undef pipe2
|
||||
# define pipe2(f,o) \
|
||||
(GL_LINK_WARNING ("pipe2 is unportable - " \
|
||||
"use gnulib module pipe2 for portability"), \
|
||||
pipe2 (f, o))
|
||||
#endif
|
||||
|
||||
|
||||
#if @GNULIB_READLINK@
|
||||
/* Read the contents of the symbolic link FILE and place the first BUFSIZE
|
||||
bytes of it into BUF. Return the number of bytes placed into BUF if
|
||||
@ -524,7 +583,6 @@ extern int link (const char *path1, const char *path2);
|
||||
See the POSIX:2001 specification
|
||||
<http://www.opengroup.org/susv3xsh/readlink.html>. */
|
||||
# if !@HAVE_READLINK@
|
||||
# include <stddef.h>
|
||||
extern int readlink (const char *file, char *buf, size_t bufsize);
|
||||
# endif
|
||||
#elif defined GNULIB_POSIXCHECK
|
||||
@ -563,12 +621,6 @@ extern ssize_t write (int fd, const void *buf, size_t count);
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef FCHDIR_REPLACEMENT
|
||||
/* gnulib internal function. */
|
||||
extern void _gl_unregister_fd (int fd);
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
276
m4/getopt.m4
276
m4/getopt.m4
@ -1,21 +1,229 @@
|
||||
# getopt.m4 serial 14
|
||||
dnl Copyright (C) 2002-2006, 2008 Free Software Foundation, Inc.
|
||||
# getopt.m4 serial 21
|
||||
dnl Copyright (C) 2002-2006, 2008-2009 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.
|
||||
|
||||
# The getopt module assume you want GNU getopt, with getopt_long etc,
|
||||
# rather than vanilla POSIX getopt. This means your code should
|
||||
# always include <getopt.h> for the getopt prototypes.
|
||||
|
||||
AC_DEFUN([gl_GETOPT_SUBSTITUTE],
|
||||
# Request a POSIX compliant getopt function.
|
||||
AC_DEFUN([gl_FUNC_GETOPT_POSIX],
|
||||
[
|
||||
m4_divert_text([DEFAULTS], [gl_getopt_required=POSIX])
|
||||
AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
|
||||
gl_GETOPT_IFELSE([
|
||||
gl_REPLACE_GETOPT
|
||||
],
|
||||
[])
|
||||
])
|
||||
|
||||
# Request a POSIX compliant getopt function with GNU extensions (such as
|
||||
# options with optional arguments) and the functions getopt_long,
|
||||
# getopt_long_only.
|
||||
AC_DEFUN([gl_FUNC_GETOPT_GNU],
|
||||
[
|
||||
m4_divert_text([INIT_PREPARE], [gl_getopt_required=GNU])
|
||||
|
||||
AC_REQUIRE([gl_FUNC_GETOPT_POSIX])
|
||||
])
|
||||
|
||||
# Request the gnulib implementation of the getopt functions unconditionally.
|
||||
# argp.m4 uses this.
|
||||
AC_DEFUN([gl_REPLACE_GETOPT],
|
||||
[
|
||||
dnl Arrange for getopt.h to be created.
|
||||
gl_GETOPT_SUBSTITUTE_HEADER
|
||||
dnl Arrange for unistd.h to include getopt.h.
|
||||
GNULIB_UNISTD_H_GETOPT=1
|
||||
dnl Arrange to compile the getopt implementation.
|
||||
AC_LIBOBJ([getopt])
|
||||
AC_LIBOBJ([getopt1])
|
||||
gl_GETOPT_SUBSTITUTE_HEADER
|
||||
gl_PREREQ_GETOPT
|
||||
])
|
||||
|
||||
# emacs' configure.in uses this.
|
||||
AC_DEFUN([gl_GETOPT_IFELSE],
|
||||
[
|
||||
AC_REQUIRE([gl_GETOPT_CHECK_HEADERS])
|
||||
AS_IF([test -n "$gl_replace_getopt"], [$1], [$2])
|
||||
])
|
||||
|
||||
# Determine whether to replace the entire getopt facility.
|
||||
AC_DEFUN([gl_GETOPT_CHECK_HEADERS],
|
||||
[
|
||||
AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
|
||||
|
||||
dnl Persuade Solaris <unistd.h> to declare optarg, optind, opterr, optopt.
|
||||
AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
|
||||
|
||||
gl_replace_getopt=
|
||||
|
||||
dnl Test whether <getopt.h> is available.
|
||||
if test -z "$gl_replace_getopt" && test $gl_getopt_required = GNU; then
|
||||
AC_CHECK_HEADERS([getopt.h], [], [gl_replace_getopt=yes])
|
||||
fi
|
||||
|
||||
dnl Test whether the function getopt_long is available.
|
||||
if test -z "$gl_replace_getopt" && test $gl_getopt_required = GNU; then
|
||||
AC_CHECK_FUNCS([getopt_long_only], [], [gl_replace_getopt=yes])
|
||||
fi
|
||||
|
||||
dnl BSD getopt_long uses an incompatible method to reset option processing,
|
||||
dnl but the testsuite does not show a need to use this 'optreset' variable.
|
||||
if false && test -z "$gl_replace_getopt" && test $gl_getopt_required = GNU; then
|
||||
AC_CHECK_DECL([optreset], [gl_replace_getopt=yes], [],
|
||||
[#include <getopt.h>])
|
||||
fi
|
||||
|
||||
dnl mingw's getopt (in libmingwex.a) does weird things when the options
|
||||
dnl strings starts with '+' and it's not the first call. Some internal state
|
||||
dnl is left over from earlier calls, and neither setting optind = 0 nor
|
||||
dnl setting optreset = 1 get rid of this internal state.
|
||||
if test -z "$gl_replace_getopt"; then
|
||||
AC_CACHE_CHECK([whether getopt is POSIX compatible],
|
||||
[gl_cv_func_getopt_posix],
|
||||
[
|
||||
dnl This test fails on mingw and succeeds on all other platforms.
|
||||
AC_TRY_RUN([
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/* The glibc implementation of getopt supports setting optind = 0 as a means
|
||||
of clearing the internal state, but other implementations don't. */
|
||||
#if (__GLIBC__ >= 2)
|
||||
# define OPTIND_MIN 0
|
||||
#else
|
||||
# define OPTIND_MIN 1
|
||||
#endif
|
||||
|
||||
int
|
||||
main ()
|
||||
{
|
||||
{
|
||||
int argc = 0;
|
||||
char *argv[10];
|
||||
int c;
|
||||
|
||||
argv[argc++] = "program";
|
||||
argv[argc++] = "-a";
|
||||
argv[argc++] = "foo";
|
||||
argv[argc++] = "bar";
|
||||
optind = OPTIND_MIN;
|
||||
opterr = 0;
|
||||
|
||||
c = getopt (argc, argv, "ab");
|
||||
if (!(c == 'a'))
|
||||
return 1;
|
||||
c = getopt (argc, argv, "ab");
|
||||
if (!(c == -1))
|
||||
return 2;
|
||||
if (!(optind == 2))
|
||||
return 3;
|
||||
}
|
||||
/* Some internal state exists at this point. */
|
||||
{
|
||||
int argc = 0;
|
||||
char *argv[10];
|
||||
int c;
|
||||
|
||||
argv[argc++] = "program";
|
||||
argv[argc++] = "donald";
|
||||
argv[argc++] = "-p";
|
||||
argv[argc++] = "billy";
|
||||
argv[argc++] = "duck";
|
||||
argv[argc++] = "-a";
|
||||
argv[argc++] = "bar";
|
||||
optind = OPTIND_MIN;
|
||||
opterr = 0;
|
||||
|
||||
c = getopt (argc, argv, "+abp:q:");
|
||||
if (!(c == -1))
|
||||
return 4;
|
||||
if (!(strcmp (argv[0], "program") == 0))
|
||||
return 5;
|
||||
if (!(strcmp (argv[1], "donald") == 0))
|
||||
return 6;
|
||||
if (!(strcmp (argv[2], "-p") == 0))
|
||||
return 7;
|
||||
if (!(strcmp (argv[3], "billy") == 0))
|
||||
return 8;
|
||||
if (!(strcmp (argv[4], "duck") == 0))
|
||||
return 9;
|
||||
if (!(strcmp (argv[5], "-a") == 0))
|
||||
return 10;
|
||||
if (!(strcmp (argv[6], "bar") == 0))
|
||||
return 11;
|
||||
if (!(optind == 1))
|
||||
return 12;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
],
|
||||
[gl_cv_func_getopt_posix=yes], [gl_cv_func_getopt_posix=no],
|
||||
[case "$host_os" in
|
||||
mingw*) gl_cv_func_getopt_posix="guessing no";;
|
||||
*) gl_cv_func_getopt_posix="guessing yes";;
|
||||
esac
|
||||
])
|
||||
])
|
||||
case "$gl_cv_func_getopt_posix" in
|
||||
*no) gl_replace_getopt=yes ;;
|
||||
esac
|
||||
fi
|
||||
|
||||
if test -z "$gl_replace_getopt" && test $gl_getopt_required = GNU; then
|
||||
AC_CACHE_CHECK([for working GNU getopt function], [gl_cv_func_getopt_gnu],
|
||||
[AC_RUN_IFELSE(
|
||||
[AC_LANG_PROGRAM([[#include <getopt.h>
|
||||
#include <stddef.h>
|
||||
#include <string.h>]],
|
||||
[[
|
||||
/* This code succeeds on glibc 2.8, OpenBSD 4.0, Cygwin, mingw,
|
||||
and fails on MacOS X 10.5, AIX 5.2, HP-UX 11, IRIX 6.5,
|
||||
OSF/1 5.1, Solaris 10. */
|
||||
{
|
||||
char *myargv[3];
|
||||
myargv[0] = "conftest";
|
||||
myargv[1] = "-+";
|
||||
myargv[2] = 0;
|
||||
opterr = 0;
|
||||
if (getopt (2, myargv, "+a") != '?')
|
||||
return 1;
|
||||
}
|
||||
/* This code succeeds on glibc 2.8, mingw,
|
||||
and fails on MacOS X 10.5, OpenBSD 4.0, AIX 5.2, HP-UX 11,
|
||||
IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin. */
|
||||
{
|
||||
char *argv[] = { "program", "-p", "foo", "bar" };
|
||||
|
||||
optind = 1;
|
||||
if (getopt (4, argv, "p::") != 'p')
|
||||
return 2;
|
||||
if (optarg != NULL)
|
||||
return 3;
|
||||
if (getopt (4, argv, "p::") != -1)
|
||||
return 4;
|
||||
if (optind != 2)
|
||||
return 5;
|
||||
}
|
||||
return 0;
|
||||
]])],
|
||||
[gl_cv_func_getopt_gnu=yes],
|
||||
[gl_cv_func_getopt_gnu=no],
|
||||
[dnl Cross compiling. Guess based on host and declarations.
|
||||
case "$host_os" in
|
||||
*-gnu* | mingw*) gl_cv_func_getopt_gnu=no;;
|
||||
*) gl_cv_func_getopt_gnu=yes;;
|
||||
esac
|
||||
])
|
||||
])
|
||||
if test "$gl_cv_func_getopt_gnu" = "no"; then
|
||||
gl_replace_getopt=yes
|
||||
fi
|
||||
fi
|
||||
])
|
||||
|
||||
# emacs' configure.in uses this.
|
||||
AC_DEFUN([gl_GETOPT_SUBSTITUTE_HEADER],
|
||||
[
|
||||
GETOPT_H=getopt.h
|
||||
@ -25,58 +233,8 @@ AC_DEFUN([gl_GETOPT_SUBSTITUTE_HEADER],
|
||||
AC_SUBST([GETOPT_H])
|
||||
])
|
||||
|
||||
AC_DEFUN([gl_GETOPT_CHECK_HEADERS],
|
||||
[
|
||||
if test -z "$GETOPT_H"; then
|
||||
AC_CHECK_HEADERS([getopt.h], [], [GETOPT_H=getopt.h])
|
||||
fi
|
||||
|
||||
if test -z "$GETOPT_H"; then
|
||||
AC_CHECK_FUNCS([getopt_long_only], [], [GETOPT_H=getopt.h])
|
||||
fi
|
||||
|
||||
dnl BSD getopt_long uses an incompatible method to reset option processing,
|
||||
dnl and (as of 2004-10-15) mishandles optional option-arguments.
|
||||
if test -z "$GETOPT_H"; then
|
||||
AC_CHECK_DECL([optreset], [GETOPT_H=getopt.h], [], [#include <getopt.h>])
|
||||
fi
|
||||
|
||||
dnl Solaris 10 getopt doesn't handle `+' as a leading character in an
|
||||
dnl option string (as of 2005-05-05).
|
||||
if test -z "$GETOPT_H"; then
|
||||
AC_CACHE_CHECK([for working GNU getopt function], [gl_cv_func_gnu_getopt],
|
||||
[AC_RUN_IFELSE(
|
||||
[AC_LANG_PROGRAM([[#include <getopt.h>]],
|
||||
[[
|
||||
char *myargv[3];
|
||||
myargv[0] = "conftest";
|
||||
myargv[1] = "-+";
|
||||
myargv[2] = 0;
|
||||
return getopt (2, myargv, "+a") != '?';
|
||||
]])],
|
||||
[gl_cv_func_gnu_getopt=yes],
|
||||
[gl_cv_func_gnu_getopt=no],
|
||||
[dnl cross compiling - pessimistically guess based on decls
|
||||
dnl Solaris 10 getopt doesn't handle `+' as a leading character in an
|
||||
dnl option string (as of 2005-05-05).
|
||||
AC_CHECK_DECL([getopt_clip],
|
||||
[gl_cv_func_gnu_getopt=no], [gl_cv_func_gnu_getopt=yes],
|
||||
[#include <getopt.h>])])])
|
||||
if test "$gl_cv_func_gnu_getopt" = "no"; then
|
||||
GETOPT_H=getopt.h
|
||||
fi
|
||||
fi
|
||||
])
|
||||
|
||||
AC_DEFUN([gl_GETOPT_IFELSE],
|
||||
[
|
||||
AC_REQUIRE([gl_GETOPT_CHECK_HEADERS])
|
||||
AS_IF([test -n "$GETOPT_H"], [$1], [$2])
|
||||
])
|
||||
|
||||
AC_DEFUN([gl_GETOPT], [gl_GETOPT_IFELSE([gl_GETOPT_SUBSTITUTE])])
|
||||
|
||||
# Prerequisites of lib/getopt*.
|
||||
# emacs' configure.in uses this.
|
||||
AC_DEFUN([gl_PREREQ_GETOPT],
|
||||
[
|
||||
AC_CHECK_DECLS_ONCE([getenv])
|
||||
|
29
m4/getpagesize.m4
Normal file
29
m4/getpagesize.m4
Normal file
@ -0,0 +1,29 @@
|
||||
# getpagesize.m4 serial 7
|
||||
dnl Copyright (C) 2002, 2004-2005, 2007 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.
|
||||
|
||||
AC_DEFUN([gl_FUNC_GETPAGESIZE],
|
||||
[
|
||||
AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
|
||||
AC_REQUIRE([AC_CANONICAL_HOST])
|
||||
AC_CHECK_FUNCS([getpagesize])
|
||||
if test $ac_cv_func_getpagesize = no; then
|
||||
HAVE_GETPAGESIZE=0
|
||||
AC_CHECK_HEADERS([OS.h])
|
||||
if test $ac_cv_header_OS_h = yes; then
|
||||
HAVE_OS_H=1
|
||||
fi
|
||||
AC_CHECK_HEADERS([sys/param.h])
|
||||
if test $ac_cv_header_sys_param_h = yes; then
|
||||
HAVE_SYS_PARAM_H=1
|
||||
fi
|
||||
fi
|
||||
case "$host_os" in
|
||||
mingw*)
|
||||
REPLACE_GETPAGESIZE=1
|
||||
AC_LIBOBJ([getpagesize])
|
||||
;;
|
||||
esac
|
||||
])
|
@ -15,7 +15,7 @@
|
||||
|
||||
|
||||
# Specification in the form of a command-line invocation:
|
||||
# gnulib-tool --import --dir=. --lib=libgnu --source-base=lib --m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=. --no-libtool --macro-prefix=gl alloca c-ctype getopt getpass-gnu maintainer-makefile quote quotearg
|
||||
# gnulib-tool --import --dir=. --lib=libgnu --source-base=lib --m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=. --no-libtool --macro-prefix=gl alloca c-ctype getopt getpass-gnu maintainer-makefile quote quotearg strcasestr
|
||||
|
||||
# Specification in the form of a few gnulib-tool.m4 macro invocations:
|
||||
gl_LOCAL_DIR([])
|
||||
@ -27,6 +27,7 @@ gl_MODULES([
|
||||
maintainer-makefile
|
||||
quote
|
||||
quotearg
|
||||
strcasestr
|
||||
])
|
||||
gl_AVOID([])
|
||||
gl_SOURCE_BASE([lib])
|
||||
|
@ -48,8 +48,8 @@ AC_DEFUN([gl_INIT],
|
||||
gl_HEADER_ERRNO_H
|
||||
gl_ERROR
|
||||
m4_ifdef([AM_XGETTEXT_OPTION],
|
||||
[AM_XGETTEXT_OPTION([--flag=error:3:c-format])
|
||||
AM_XGETTEXT_OPTION([--flag=error_at_line:5:c-format])])
|
||||
[AM_][XGETTEXT_OPTION([--flag=error:3:c-format])
|
||||
AM_][XGETTEXT_OPTION([--flag=error_at_line:5:c-format])])
|
||||
gl_EXITFAIL
|
||||
gl_FUNC_FSEEKO
|
||||
gl_STDIO_MODULE_INDICATOR([fseeko])
|
||||
@ -57,7 +57,11 @@ AC_DEFUN([gl_INIT],
|
||||
gl_STDIO_MODULE_INDICATOR([getdelim])
|
||||
gl_FUNC_GETLINE
|
||||
gl_STDIO_MODULE_INDICATOR([getline])
|
||||
gl_GETOPT
|
||||
gl_FUNC_GETOPT_GNU
|
||||
gl_MODULE_INDICATOR([getopt-gnu])
|
||||
gl_FUNC_GETOPT_POSIX
|
||||
gl_FUNC_GETPAGESIZE
|
||||
gl_UNISTD_MODULE_INDICATOR([getpagesize])
|
||||
gl_FUNC_GETPASS_GNU
|
||||
AC_SUBST([LIBINTL])
|
||||
AC_SUBST([LTLIBINTL])
|
||||
@ -81,18 +85,26 @@ AC_DEFUN([gl_INIT],
|
||||
gl_WCHAR_MODULE_INDICATOR([mbrtowc])
|
||||
gl_FUNC_MBSINIT
|
||||
gl_WCHAR_MODULE_INDICATOR([mbsinit])
|
||||
gl_FUNC_MEMCHR
|
||||
gl_STRING_MODULE_INDICATOR([memchr])
|
||||
gl_MULTIARCH
|
||||
gl_QUOTE
|
||||
gl_QUOTEARG
|
||||
gl_FUNC_REALLOC_POSIX
|
||||
gl_STDLIB_MODULE_INDICATOR([realloc-posix])
|
||||
AM_STDBOOL_H
|
||||
gl_STDDEF_H
|
||||
gl_STDINT_H
|
||||
gl_STDIO_H
|
||||
gl_STDLIB_H
|
||||
gl_STRCASE
|
||||
gl_FUNC_STRCASESTR
|
||||
gl_FUNC_STRCASESTR_SIMPLE
|
||||
gl_STRING_MODULE_INDICATOR([strcasestr])
|
||||
gl_FUNC_STRERROR
|
||||
gl_STRING_MODULE_INDICATOR([strerror])
|
||||
gl_HEADER_STRING_H
|
||||
gl_HEADER_STRINGS_H
|
||||
gl_UNISTD_H
|
||||
gl_WCHAR_H
|
||||
gl_WCTYPE_H
|
||||
@ -249,6 +261,7 @@ AC_DEFUN([gl_FILE_LIST], [
|
||||
lib/getopt.in.h
|
||||
lib/getopt1.c
|
||||
lib/getopt_int.h
|
||||
lib/getpagesize.c
|
||||
lib/getpass.c
|
||||
lib/getpass.h
|
||||
lib/gettext.h
|
||||
@ -258,6 +271,8 @@ AC_DEFUN([gl_FILE_LIST], [
|
||||
lib/lseek.c
|
||||
lib/mbrtowc.c
|
||||
lib/mbsinit.c
|
||||
lib/memchr.c
|
||||
lib/memchr.valgrind
|
||||
lib/quote.c
|
||||
lib/quote.h
|
||||
lib/quotearg.c
|
||||
@ -266,14 +281,20 @@ AC_DEFUN([gl_FILE_LIST], [
|
||||
lib/ref-add.sin
|
||||
lib/ref-del.sin
|
||||
lib/stdbool.in.h
|
||||
lib/stddef.in.h
|
||||
lib/stdint.in.h
|
||||
lib/stdio-impl.h
|
||||
lib/stdio-write.c
|
||||
lib/stdio.in.h
|
||||
lib/stdlib.in.h
|
||||
lib/str-two-way.h
|
||||
lib/strcasecmp.c
|
||||
lib/strcasestr.c
|
||||
lib/streq.h
|
||||
lib/strerror.c
|
||||
lib/string.in.h
|
||||
lib/strings.in.h
|
||||
lib/strncasecmp.c
|
||||
lib/unistd.in.h
|
||||
lib/verify.h
|
||||
lib/wchar.in.h
|
||||
@ -292,6 +313,7 @@ AC_DEFUN([gl_FILE_LIST], [
|
||||
m4/getdelim.m4
|
||||
m4/getline.m4
|
||||
m4/getopt.m4
|
||||
m4/getpagesize.m4
|
||||
m4/getpass.m4
|
||||
m4/glibc21.m4
|
||||
m4/gnulib-common.m4
|
||||
@ -307,18 +329,25 @@ AC_DEFUN([gl_FILE_LIST], [
|
||||
m4/mbrtowc.m4
|
||||
m4/mbsinit.m4
|
||||
m4/mbstate_t.m4
|
||||
m4/memchr.m4
|
||||
m4/mmap-anon.m4
|
||||
m4/multiarch.m4
|
||||
m4/quote.m4
|
||||
m4/quotearg.m4
|
||||
m4/realloc.m4
|
||||
m4/stdbool.m4
|
||||
m4/stddef_h.m4
|
||||
m4/stdint.m4
|
||||
m4/stdio_h.m4
|
||||
m4/stdlib_h.m4
|
||||
m4/strcase.m4
|
||||
m4/strcasestr.m4
|
||||
m4/strerror.m4
|
||||
m4/string_h.m4
|
||||
m4/strings_h.m4
|
||||
m4/unistd_h.m4
|
||||
m4/wchar.m4
|
||||
m4/wchar_t.m4
|
||||
m4/wctype.m4
|
||||
m4/wint_t.m4
|
||||
m4/xalloc.m4
|
||||
|
86
m4/memchr.m4
Normal file
86
m4/memchr.m4
Normal file
@ -0,0 +1,86 @@
|
||||
# memchr.m4 serial 7
|
||||
dnl Copyright (C) 2002, 2003, 2004, 2009 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.
|
||||
|
||||
AC_DEFUN_ONCE([gl_FUNC_MEMCHR],
|
||||
[
|
||||
dnl Check for prerequisites for memory fence checks.
|
||||
gl_FUNC_MMAP_ANON
|
||||
AC_CHECK_HEADERS_ONCE([sys/mman.h])
|
||||
AC_CHECK_FUNCS_ONCE([mprotect])
|
||||
|
||||
dnl These days, we assume memchr is present. But just in case...
|
||||
AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
|
||||
AC_REPLACE_FUNCS([memchr])
|
||||
if test $ac_cv_func_memchr = no; then
|
||||
gl_PREREQ_MEMCHR
|
||||
REPLACE_MEMCHR=1
|
||||
fi
|
||||
|
||||
if test $ac_cv_func_memchr = yes; then
|
||||
# Detect platform-specific bugs in some versions of glibc:
|
||||
# memchr should not dereference anything with length 0
|
||||
# http://bugzilla.redhat.com/499689
|
||||
# memchr should not dereference overestimated length after a match
|
||||
# http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=521737
|
||||
# http://sourceware.org/bugzilla/show_bug.cgi?id=10162
|
||||
# Assume that memchr works on platforms that lack mprotect.
|
||||
AC_CACHE_CHECK([whether memchr works], [gl_cv_func_memchr_works],
|
||||
[AC_RUN_IFELSE([AC_LANG_PROGRAM([[
|
||||
#include <string.h>
|
||||
#if HAVE_SYS_MMAN_H
|
||||
# include <fcntl.h>
|
||||
# include <unistd.h>
|
||||
# include <sys/types.h>
|
||||
# include <sys/mman.h>
|
||||
# ifndef MAP_FILE
|
||||
# define MAP_FILE 0
|
||||
# endif
|
||||
#endif
|
||||
]], [[
|
||||
char *fence = NULL;
|
||||
#if HAVE_SYS_MMAN_H && HAVE_MPROTECT
|
||||
# if HAVE_MAP_ANONYMOUS
|
||||
const int flags = MAP_ANONYMOUS | MAP_PRIVATE;
|
||||
const int fd = -1;
|
||||
# else /* !HAVE_MAP_ANONYMOUS */
|
||||
const int flags = MAP_FILE | MAP_PRIVATE;
|
||||
int fd = open ("/dev/zero", O_RDONLY, 0666);
|
||||
if (fd >= 0)
|
||||
# endif
|
||||
{
|
||||
int pagesize = getpagesize ();
|
||||
char *two_pages =
|
||||
(char *) mmap (NULL, 2 * pagesize, PROT_READ | PROT_WRITE,
|
||||
flags, fd, 0);
|
||||
if (two_pages != (char *)(-1)
|
||||
&& mprotect (two_pages + pagesize, pagesize, PROT_NONE) == 0)
|
||||
fence = two_pages + pagesize;
|
||||
}
|
||||
#endif
|
||||
if (fence)
|
||||
{
|
||||
if (memchr (fence, 0, 0))
|
||||
return 1;
|
||||
strcpy (fence - 9, "12345678");
|
||||
if (memchr (fence - 9, 0, 79) != fence - 1)
|
||||
return 2;
|
||||
}
|
||||
return 0;
|
||||
]])], [gl_cv_func_memchr_works=yes], [gl_cv_func_memchr_works=no],
|
||||
[dnl Be pessimistic for now.
|
||||
gl_cv_func_memchr_works="guessing no"])])
|
||||
if test "$gl_cv_func_memchr_works" != yes; then
|
||||
gl_PREREQ_MEMCHR
|
||||
REPLACE_MEMCHR=1
|
||||
AC_LIBOBJ([memchr])
|
||||
fi
|
||||
fi
|
||||
])
|
||||
|
||||
# Prerequisites of lib/memchr.c.
|
||||
AC_DEFUN([gl_PREREQ_MEMCHR], [
|
||||
AC_CHECK_HEADERS([bp-sym.h])
|
||||
])
|
59
m4/mmap-anon.m4
Normal file
59
m4/mmap-anon.m4
Normal file
@ -0,0 +1,59 @@
|
||||
# mmap-anon.m4 serial 8
|
||||
dnl Copyright (C) 2005, 2007, 2009 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.
|
||||
|
||||
# Detect how mmap can be used to create anonymous (not file-backed) memory
|
||||
# mappings.
|
||||
# - On Linux, AIX, OSF/1, Solaris, Cygwin, Interix, Haiku, both MAP_ANONYMOUS
|
||||
# and MAP_ANON exist and have the same value.
|
||||
# - On HP-UX, only MAP_ANONYMOUS exists.
|
||||
# - On MacOS X, FreeBSD, NetBSD, OpenBSD, only MAP_ANON exists.
|
||||
# - On IRIX, neither exists, and a file descriptor opened to /dev/zero must be
|
||||
# used.
|
||||
|
||||
AC_DEFUN([gl_FUNC_MMAP_ANON],
|
||||
[
|
||||
dnl Work around a bug of AC_EGREP_CPP in autoconf-2.57.
|
||||
AC_REQUIRE([AC_PROG_CPP])
|
||||
AC_REQUIRE([AC_PROG_EGREP])
|
||||
|
||||
dnl Persuade glibc <sys/mman.h> to define MAP_ANONYMOUS.
|
||||
AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
|
||||
|
||||
# Check for mmap(). Don't use AC_FUNC_MMAP, because it checks too much: it
|
||||
# fails on HP-UX 11, because MAP_FIXED mappings do not work. But this is
|
||||
# irrelevant for anonymous mappings.
|
||||
AC_CHECK_FUNC([mmap], [gl_have_mmap=yes], [gl_have_mmap=no])
|
||||
|
||||
# Try to allow MAP_ANONYMOUS.
|
||||
gl_have_mmap_anonymous=no
|
||||
if test $gl_have_mmap = yes; then
|
||||
AC_MSG_CHECKING([for MAP_ANONYMOUS])
|
||||
AC_EGREP_CPP([I cant identify this map.], [
|
||||
#include <sys/mman.h>
|
||||
#ifdef MAP_ANONYMOUS
|
||||
I cant identify this map.
|
||||
#endif
|
||||
],
|
||||
[gl_have_mmap_anonymous=yes])
|
||||
if test $gl_have_mmap_anonymous != yes; then
|
||||
AC_EGREP_CPP([I cant identify this map.], [
|
||||
#include <sys/mman.h>
|
||||
#ifdef MAP_ANON
|
||||
I cant identify this map.
|
||||
#endif
|
||||
],
|
||||
[AC_DEFINE([MAP_ANONYMOUS], [MAP_ANON],
|
||||
[Define to a substitute value for mmap()'s MAP_ANONYMOUS flag.])
|
||||
gl_have_mmap_anonymous=yes])
|
||||
fi
|
||||
AC_MSG_RESULT([$gl_have_mmap_anonymous])
|
||||
if test $gl_have_mmap_anonymous = yes; then
|
||||
AC_DEFINE([HAVE_MAP_ANONYMOUS], [1],
|
||||
[Define to 1 if mmap()'s MAP_ANONYMOUS flag is available after including
|
||||
config.h and <sys/mman.h>.])
|
||||
fi
|
||||
fi
|
||||
])
|
45
m4/stddef_h.m4
Normal file
45
m4/stddef_h.m4
Normal file
@ -0,0 +1,45 @@
|
||||
dnl A placeholder for POSIX 2008 <stddef.h>, for platforms that have issues.
|
||||
# stddef_h.m4 serial 1
|
||||
dnl Copyright (C) 2009 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.
|
||||
|
||||
AC_DEFUN([gl_STDDEF_H],
|
||||
[
|
||||
AC_REQUIRE([gl_STDDEF_H_DEFAULTS])
|
||||
AC_REQUIRE([gt_TYPE_WCHAR_T])
|
||||
if test $gt_cv_c_wchar_t = no; then
|
||||
HAVE_WCHAR_T=0
|
||||
STDDEF_H=stddef.h
|
||||
fi
|
||||
AC_CACHE_CHECK([whether NULL can be used in arbitrary expressions],
|
||||
[gl_cv_decl_null_works],
|
||||
[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <stddef.h>
|
||||
int test[2 * (sizeof NULL == sizeof (void *)) -1];
|
||||
]])],
|
||||
[gl_cv_decl_null_works=yes],
|
||||
[gl_cv_decl_null_works=no])])
|
||||
if test $gl_cv_decl_null_works = no; then
|
||||
REPLACE_NULL=1
|
||||
STDDEF_H=stddef.h
|
||||
fi
|
||||
if test -n "$STDDEF_H"; then
|
||||
gl_CHECK_NEXT_HEADERS([stddef.h])
|
||||
fi
|
||||
])
|
||||
|
||||
AC_DEFUN([gl_STDDEF_MODULE_INDICATOR],
|
||||
[
|
||||
dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
|
||||
AC_REQUIRE([gl_STDDEF_H_DEFAULTS])
|
||||
GNULIB_[]m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./-],[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])=1
|
||||
])
|
||||
|
||||
AC_DEFUN([gl_STDDEF_H_DEFAULTS],
|
||||
[
|
||||
dnl Assume proper GNU behavior unless another module says otherwise.
|
||||
REPLACE_NULL=0; AC_SUBST([REPLACE_NULL])
|
||||
HAVE_WCHAR_T=1; AC_SUBST([HAVE_WCHAR_T])
|
||||
STDDEF_H=''; AC_SUBST([STDDEF_H])
|
||||
])
|
@ -1,4 +1,4 @@
|
||||
# stdio_h.m4 serial 16
|
||||
# stdio_h.m4 serial 17
|
||||
dnl Copyright (C) 2007-2009 Free Software Foundation, Inc.
|
||||
dnl This file is free software; the Free Software Foundation
|
||||
dnl gives unlimited permission to copy and/or distribute it,
|
||||
@ -73,6 +73,7 @@ AC_DEFUN([gl_STDIO_H_DEFAULTS],
|
||||
GNULIB_FPUTS=0; AC_SUBST([GNULIB_FPUTS])
|
||||
GNULIB_PUTS=0; AC_SUBST([GNULIB_PUTS])
|
||||
GNULIB_FWRITE=0; AC_SUBST([GNULIB_FWRITE])
|
||||
GNULIB_POPEN=0; AC_SUBST([GNULIB_POPEN])
|
||||
GNULIB_GETDELIM=0; AC_SUBST([GNULIB_GETDELIM])
|
||||
GNULIB_GETLINE=0; AC_SUBST([GNULIB_GETLINE])
|
||||
GNULIB_PERROR=0; AC_SUBST([GNULIB_PERROR])
|
||||
@ -109,6 +110,7 @@ AC_DEFUN([gl_STDIO_H_DEFAULTS],
|
||||
REPLACE_FPURGE=0; AC_SUBST([REPLACE_FPURGE])
|
||||
HAVE_DECL_FPURGE=1; AC_SUBST([HAVE_DECL_FPURGE])
|
||||
REPLACE_FCLOSE=0; AC_SUBST([REPLACE_FCLOSE])
|
||||
REPLACE_POPEN=0; AC_SUBST([REPLACE_POPEN])
|
||||
HAVE_DECL_GETDELIM=1; AC_SUBST([HAVE_DECL_GETDELIM])
|
||||
HAVE_DECL_GETLINE=1; AC_SUBST([HAVE_DECL_GETLINE])
|
||||
REPLACE_GETLINE=0; AC_SUBST([REPLACE_GETLINE])
|
||||
|
@ -1,4 +1,4 @@
|
||||
# stdlib_h.m4 serial 15
|
||||
# stdlib_h.m4 serial 16
|
||||
dnl Copyright (C) 2007-2009 Free Software Foundation, Inc.
|
||||
dnl This file is free software; the Free Software Foundation
|
||||
dnl gives unlimited permission to copy and/or distribute it,
|
||||
@ -40,6 +40,7 @@ AC_DEFUN([gl_STDLIB_H_DEFAULTS],
|
||||
GNULIB_GETLOADAVG=0; AC_SUBST([GNULIB_GETLOADAVG])
|
||||
GNULIB_GETSUBOPT=0; AC_SUBST([GNULIB_GETSUBOPT])
|
||||
GNULIB_MKDTEMP=0; AC_SUBST([GNULIB_MKDTEMP])
|
||||
GNULIB_MKOSTEMP=0; AC_SUBST([GNULIB_MKOSTEMP])
|
||||
GNULIB_MKSTEMP=0; AC_SUBST([GNULIB_MKSTEMP])
|
||||
GNULIB_PUTENV=0; AC_SUBST([GNULIB_PUTENV])
|
||||
GNULIB_RANDOM_R=0; AC_SUBST([GNULIB_RANDOM_R])
|
||||
@ -55,6 +56,7 @@ AC_DEFUN([gl_STDLIB_H_DEFAULTS],
|
||||
HAVE_GETSUBOPT=1; AC_SUBST([HAVE_GETSUBOPT])
|
||||
HAVE_MALLOC_POSIX=1; AC_SUBST([HAVE_MALLOC_POSIX])
|
||||
HAVE_MKDTEMP=1; AC_SUBST([HAVE_MKDTEMP])
|
||||
HAVE_MKOSTEMP=1; AC_SUBST([HAVE_MKOSTEMP])
|
||||
HAVE_REALLOC_POSIX=1; AC_SUBST([HAVE_REALLOC_POSIX])
|
||||
HAVE_RANDOM_R=1; AC_SUBST([HAVE_RANDOM_R])
|
||||
HAVE_RPMATCH=1; AC_SUBST([HAVE_RPMATCH])
|
||||
|
44
m4/strcase.m4
Normal file
44
m4/strcase.m4
Normal file
@ -0,0 +1,44 @@
|
||||
# strcase.m4 serial 10
|
||||
dnl Copyright (C) 2002, 2005-2009 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.
|
||||
|
||||
AC_DEFUN([gl_STRCASE],
|
||||
[
|
||||
gl_FUNC_STRCASECMP
|
||||
gl_FUNC_STRNCASECMP
|
||||
])
|
||||
|
||||
AC_DEFUN([gl_FUNC_STRCASECMP],
|
||||
[
|
||||
AC_REQUIRE([gl_HEADER_STRINGS_H_DEFAULTS])
|
||||
AC_REPLACE_FUNCS([strcasecmp])
|
||||
if test $ac_cv_func_strcasecmp = no; then
|
||||
HAVE_STRCASECMP=0
|
||||
gl_PREREQ_STRCASECMP
|
||||
fi
|
||||
])
|
||||
|
||||
AC_DEFUN([gl_FUNC_STRNCASECMP],
|
||||
[
|
||||
AC_REQUIRE([gl_HEADER_STRINGS_H_DEFAULTS])
|
||||
AC_REPLACE_FUNCS([strncasecmp])
|
||||
if test $ac_cv_func_strncasecmp = no; then
|
||||
gl_PREREQ_STRNCASECMP
|
||||
fi
|
||||
AC_CHECK_DECLS([strncasecmp])
|
||||
if test $ac_cv_have_decl_strncasecmp = no; then
|
||||
HAVE_DECL_STRNCASECMP=0
|
||||
fi
|
||||
])
|
||||
|
||||
# Prerequisites of lib/strcasecmp.c.
|
||||
AC_DEFUN([gl_PREREQ_STRCASECMP], [
|
||||
:
|
||||
])
|
||||
|
||||
# Prerequisites of lib/strncasecmp.c.
|
||||
AC_DEFUN([gl_PREREQ_STRNCASECMP], [
|
||||
:
|
||||
])
|
95
m4/strcasestr.m4
Normal file
95
m4/strcasestr.m4
Normal file
@ -0,0 +1,95 @@
|
||||
# strcasestr.m4 serial 13
|
||||
dnl Copyright (C) 2005, 2007, 2008, 2009 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 Check that strcasestr is present and works.
|
||||
AC_DEFUN([gl_FUNC_STRCASESTR_SIMPLE],
|
||||
[
|
||||
AC_REQUIRE([gl_HEADER_STRING_H_DEFAULTS])
|
||||
|
||||
dnl Persuade glibc <string.h> to declare strcasestr().
|
||||
AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
|
||||
|
||||
AC_REQUIRE([gl_FUNC_MEMCHR])
|
||||
AC_CHECK_FUNCS([strcasestr])
|
||||
if test $ac_cv_func_strcasestr = no; then
|
||||
HAVE_STRCASESTR=0
|
||||
else
|
||||
if test "$gl_cv_func_memchr_works" != yes; then
|
||||
REPLACE_STRCASESTR=1
|
||||
fi
|
||||
fi
|
||||
if test $HAVE_STRCASESTR = 0 || test $REPLACE_STRCASESTR = 1; then
|
||||
AC_LIBOBJ([strcasestr])
|
||||
gl_PREREQ_STRCASESTR
|
||||
fi
|
||||
]) # gl_FUNC_STRCASESTR_SIMPLE
|
||||
|
||||
dnl Additionally, check that strcasestr is efficient.
|
||||
AC_DEFUN([gl_FUNC_STRCASESTR],
|
||||
[
|
||||
AC_REQUIRE([gl_FUNC_STRCASESTR_SIMPLE])
|
||||
if test $HAVE_STRCASESTR = 1 && test $REPLACE_STRCASESTR = 0; then
|
||||
AC_CACHE_CHECK([whether strcasestr works in linear time],
|
||||
[gl_cv_func_strcasestr_linear],
|
||||
[AC_RUN_IFELSE([AC_LANG_PROGRAM([[
|
||||
#include <signal.h> /* for signal */
|
||||
#include <string.h> /* for memmem */
|
||||
#include <stdlib.h> /* for malloc */
|
||||
#include <unistd.h> /* for alarm */
|
||||
]], [[size_t m = 1000000;
|
||||
char *haystack = (char *) malloc (2 * m + 2);
|
||||
char *needle = (char *) malloc (m + 2);
|
||||
void *result = 0;
|
||||
/* Failure to compile this test due to missing alarm is okay,
|
||||
since all such platforms (mingw) also lack strcasestr. */
|
||||
signal (SIGALRM, SIG_DFL);
|
||||
alarm (5);
|
||||
/* Check for quadratic performance. */
|
||||
if (haystack && needle)
|
||||
{
|
||||
memset (haystack, 'A', 2 * m);
|
||||
haystack[2 * m] = 'B';
|
||||
haystack[2 * m + 1] = 0;
|
||||
memset (needle, 'A', m);
|
||||
needle[m] = 'B';
|
||||
needle[m + 1] = 0;
|
||||
result = strcasestr (haystack, needle);
|
||||
}
|
||||
return !result;]])],
|
||||
[gl_cv_func_strcasestr_linear=yes], [gl_cv_func_strcasestr_linear=no],
|
||||
[dnl Only glibc >= 2.9 and cygwin >= 1.7.0 are known to have a
|
||||
dnl strcasestr that works in linear time.
|
||||
AC_EGREP_CPP([Lucky user],
|
||||
[
|
||||
#include <features.h>
|
||||
#ifdef __GNU_LIBRARY__
|
||||
#if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 9) || (__GLIBC__ > 2)
|
||||
Lucky user
|
||||
#endif
|
||||
#endif
|
||||
#ifdef __CYGWIN__
|
||||
#include <cygwin/version.h>
|
||||
#if CYGWIN_VERSION_DLL_MAJOR >= 1007
|
||||
Lucky user
|
||||
#endif
|
||||
#endif
|
||||
],
|
||||
[gl_cv_func_strcasestr_linear=yes],
|
||||
[gl_cv_func_strcasestr_linear="guessing no"])
|
||||
])
|
||||
])
|
||||
if test "$gl_cv_func_strcasestr_linear" != yes; then
|
||||
REPLACE_STRCASESTR=1
|
||||
AC_LIBOBJ([strcasestr])
|
||||
gl_PREREQ_STRCASESTR
|
||||
fi
|
||||
fi
|
||||
]) # gl_FUNC_STRCASESTR
|
||||
|
||||
# Prerequisites of lib/strcasestr.c.
|
||||
AC_DEFUN([gl_PREREQ_STRCASESTR], [
|
||||
:
|
||||
])
|
33
m4/strings_h.m4
Normal file
33
m4/strings_h.m4
Normal file
@ -0,0 +1,33 @@
|
||||
# Configure a replacement for <string.h>.
|
||||
|
||||
# Copyright (C) 2007 Free Software Foundation, Inc.
|
||||
# This file is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
AC_DEFUN([gl_HEADER_STRINGS_H],
|
||||
[
|
||||
dnl Use AC_REQUIRE here, so that the default behavior below is expanded
|
||||
dnl once only, before all statements that occur in other macros.
|
||||
AC_REQUIRE([gl_HEADER_STRINGS_H_BODY])
|
||||
])
|
||||
|
||||
AC_DEFUN([gl_HEADER_STRINGS_H_BODY],
|
||||
[
|
||||
AC_REQUIRE([gl_HEADER_STRINGS_H_DEFAULTS])
|
||||
gl_CHECK_NEXT_HEADERS([strings.h])
|
||||
])
|
||||
|
||||
AC_DEFUN([gl_STRINGS_MODULE_INDICATOR],
|
||||
[
|
||||
dnl Use AC_REQUIRE here, so that the default settings are expanded once only.
|
||||
AC_REQUIRE([gl_HEADER_STRINGS_H_DEFAULTS])
|
||||
GNULIB_[]m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./-],[ABCDEFGHIJKLMNOPQRSTUVWXYZ___])=1
|
||||
])
|
||||
|
||||
AC_DEFUN([gl_HEADER_STRINGS_H_DEFAULTS],
|
||||
[
|
||||
dnl Assume proper GNU behavior unless another module says otherwise.
|
||||
HAVE_STRCASECMP=1; AC_SUBST([HAVE_STRCASECMP])
|
||||
HAVE_DECL_STRNCASECMP=1; AC_SUBST([HAVE_DECL_STRNCASECMP])
|
||||
])
|
@ -1,4 +1,4 @@
|
||||
# unistd_h.m4 serial 17
|
||||
# unistd_h.m4 serial 21
|
||||
dnl Copyright (C) 2006-2009 Free Software Foundation, Inc.
|
||||
dnl This file is free software; the Free Software Foundation
|
||||
dnl gives unlimited permission to copy and/or distribute it,
|
||||
@ -35,6 +35,7 @@ AC_DEFUN([gl_UNISTD_H_DEFAULTS],
|
||||
GNULIB_CHOWN=0; AC_SUBST([GNULIB_CHOWN])
|
||||
GNULIB_CLOSE=0; AC_SUBST([GNULIB_CLOSE])
|
||||
GNULIB_DUP2=0; AC_SUBST([GNULIB_DUP2])
|
||||
GNULIB_DUP3=0; AC_SUBST([GNULIB_DUP3])
|
||||
GNULIB_ENVIRON=0; AC_SUBST([GNULIB_ENVIRON])
|
||||
GNULIB_EUIDACCESS=0; AC_SUBST([GNULIB_EUIDACCESS])
|
||||
GNULIB_FCHDIR=0; AC_SUBST([GNULIB_FCHDIR])
|
||||
@ -50,12 +51,15 @@ AC_DEFUN([gl_UNISTD_H_DEFAULTS],
|
||||
GNULIB_LCHOWN=0; AC_SUBST([GNULIB_LCHOWN])
|
||||
GNULIB_LINK=0; AC_SUBST([GNULIB_LINK])
|
||||
GNULIB_LSEEK=0; AC_SUBST([GNULIB_LSEEK])
|
||||
GNULIB_PIPE2=0; AC_SUBST([GNULIB_PIPE2])
|
||||
GNULIB_READLINK=0; AC_SUBST([GNULIB_READLINK])
|
||||
GNULIB_SLEEP=0; AC_SUBST([GNULIB_SLEEP])
|
||||
GNULIB_UNISTD_H_GETOPT=0; AC_SUBST([GNULIB_UNISTD_H_GETOPT])
|
||||
GNULIB_UNISTD_H_SIGPIPE=0; AC_SUBST([GNULIB_UNISTD_H_SIGPIPE])
|
||||
GNULIB_WRITE=0; AC_SUBST([GNULIB_WRITE])
|
||||
dnl Assume proper GNU behavior unless another module says otherwise.
|
||||
HAVE_DUP2=1; AC_SUBST([HAVE_DUP2])
|
||||
HAVE_DUP3=1; AC_SUBST([HAVE_DUP3])
|
||||
HAVE_EUIDACCESS=1; AC_SUBST([HAVE_EUIDACCESS])
|
||||
HAVE_FSYNC=1; AC_SUBST([HAVE_FSYNC])
|
||||
HAVE_FTRUNCATE=1; AC_SUBST([HAVE_FTRUNCATE])
|
||||
@ -65,6 +69,7 @@ AC_DEFUN([gl_UNISTD_H_DEFAULTS],
|
||||
HAVE_GETPAGESIZE=1; AC_SUBST([HAVE_GETPAGESIZE])
|
||||
HAVE_GETUSERSHELL=1; AC_SUBST([HAVE_GETUSERSHELL])
|
||||
HAVE_LINK=1; AC_SUBST([HAVE_LINK])
|
||||
HAVE_PIPE2=1; AC_SUBST([HAVE_PIPE2])
|
||||
HAVE_READLINK=1; AC_SUBST([HAVE_READLINK])
|
||||
HAVE_SLEEP=1; AC_SUBST([HAVE_SLEEP])
|
||||
HAVE_DECL_ENVIRON=1; AC_SUBST([HAVE_DECL_ENVIRON])
|
||||
@ -73,6 +78,7 @@ AC_DEFUN([gl_UNISTD_H_DEFAULTS],
|
||||
HAVE_SYS_PARAM_H=0; AC_SUBST([HAVE_SYS_PARAM_H])
|
||||
REPLACE_CHOWN=0; AC_SUBST([REPLACE_CHOWN])
|
||||
REPLACE_CLOSE=0; AC_SUBST([REPLACE_CLOSE])
|
||||
REPLACE_DUP2=0; AC_SUBST([REPLACE_DUP2])
|
||||
REPLACE_FCHDIR=0; AC_SUBST([REPLACE_FCHDIR])
|
||||
REPLACE_GETCWD=0; AC_SUBST([REPLACE_GETCWD])
|
||||
REPLACE_GETPAGESIZE=0; AC_SUBST([REPLACE_GETPAGESIZE])
|
||||
@ -80,4 +86,6 @@ AC_DEFUN([gl_UNISTD_H_DEFAULTS],
|
||||
REPLACE_LSEEK=0; AC_SUBST([REPLACE_LSEEK])
|
||||
REPLACE_WRITE=0; AC_SUBST([REPLACE_WRITE])
|
||||
UNISTD_H_HAVE_WINSOCK2_H=0; AC_SUBST([UNISTD_H_HAVE_WINSOCK2_H])
|
||||
UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS=0;
|
||||
AC_SUBST([UNISTD_H_HAVE_WINSOCK2_H_AND_USE_SOCKETS])
|
||||
])
|
||||
|
@ -7,7 +7,7 @@ dnl with or without modifications, as long as this notice is preserved.
|
||||
|
||||
dnl Written by Eric Blake.
|
||||
|
||||
# wchar.m4 serial 23
|
||||
# wchar.m4 serial 25
|
||||
|
||||
AC_DEFUN([gl_WCHAR_H],
|
||||
[
|
||||
@ -27,7 +27,10 @@ wchar_t w;]],
|
||||
fi
|
||||
AC_SUBST([HAVE_WINT_T])
|
||||
|
||||
if test $gl_cv_header_wchar_h_standalone != yes || test $gt_cv_c_wint_t != yes; then
|
||||
dnl If <stddef.h> is replaced, then <wchar.h> must also be replaced.
|
||||
AC_REQUIRE([gl_STDDEF_H])
|
||||
|
||||
if test $gl_cv_header_wchar_h_standalone != yes || test $gt_cv_c_wint_t != yes || test -n "$STDDEF_H"; then
|
||||
WCHAR_H=wchar.h
|
||||
fi
|
||||
|
||||
|
20
m4/wchar_t.m4
Normal file
20
m4/wchar_t.m4
Normal file
@ -0,0 +1,20 @@
|
||||
# wchar_t.m4 serial 3 (gettext-0.18)
|
||||
dnl Copyright (C) 2002-2003, 2008, 2009 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 Test whether <stddef.h> has the 'wchar_t' type.
|
||||
dnl Prerequisite: AC_PROG_CC
|
||||
|
||||
AC_DEFUN([gt_TYPE_WCHAR_T],
|
||||
[
|
||||
AC_CACHE_CHECK([for wchar_t], [gt_cv_c_wchar_t],
|
||||
[AC_TRY_COMPILE([#include <stddef.h>
|
||||
wchar_t foo = (wchar_t)'\0';], ,
|
||||
[gt_cv_c_wchar_t=yes], [gt_cv_c_wchar_t=no])])
|
||||
if test $gt_cv_c_wchar_t = yes; then
|
||||
AC_DEFINE([HAVE_WCHAR_T], [1], [Define if you have the 'wchar_t' type.])
|
||||
fi
|
||||
])
|
53
maint.mk
53
maint.mk
@ -38,13 +38,14 @@ VC-tag = git tag -s -m '$(VERSION)' -u '$(gpg_key_ID)'
|
||||
VC_LIST = $(build_aux)/vc-list-files -C $(srcdir)
|
||||
|
||||
VC_LIST_EXCEPT = \
|
||||
$(VC_LIST) | if test -f $(srcdir)/.x-$@; then grep -vEf $(srcdir)/.x-$@; else grep -v ChangeLog; fi
|
||||
$(VC_LIST) | if test -f $(srcdir)/.x-$@; then grep -vEf $(srcdir)/.x-$@; \
|
||||
else grep -Ev "$${VC_LIST_EXCEPT_DEFAULT-ChangeLog}"; fi
|
||||
|
||||
ifeq ($(origin prev_version_file), undefined)
|
||||
prev_version_file = $(srcdir)/.prev-version
|
||||
endif
|
||||
|
||||
PREV_VERSION := $(shell cat $(prev_version_file))
|
||||
PREV_VERSION := $(shell cat $(prev_version_file) 2>/dev/null)
|
||||
VERSION_REGEXP = $(subst .,\.,$(VERSION))
|
||||
PREV_VERSION_REGEXP = $(subst .,\.,$(PREV_VERSION))
|
||||
|
||||
@ -70,9 +71,11 @@ export LC_ALL = C
|
||||
## Sanity checks. ##
|
||||
## --------------- ##
|
||||
|
||||
_cfg_mk := $(shell test -f $(srcdir)/cfg.mk && echo '$(srcdir)/cfg.mk')
|
||||
|
||||
# Collect the names of rules starting with `sc_'.
|
||||
syntax-check-rules := $(shell sed -n 's/^\(sc_[a-zA-Z0-9_-]*\):.*/\1/p' \
|
||||
$(srcdir)/$(ME) $(srcdir)/cfg.mk)
|
||||
syntax-check-rules := $(sort $(shell sed -n 's/^\(sc_[a-zA-Z0-9_-]*\):.*/\1/p' \
|
||||
$(srcdir)/$(ME) $(_cfg_mk)))
|
||||
.PHONY: $(syntax-check-rules)
|
||||
|
||||
local-checks-available = \
|
||||
@ -232,7 +235,8 @@ sc_prohibit_HAVE_MBRTOWC:
|
||||
# h: the header, enclosed in <> or ""
|
||||
# re: a regular expression that matches IFF something provided by $h is used.
|
||||
define _header_without_use
|
||||
h_esc=`echo "$$h"|sed 's/\./\\./g'`; \
|
||||
dummy=; : so we do not need a semicolon before each use; \
|
||||
h_esc=`echo "$$h"|sed 's/\./\\\\./g'`; \
|
||||
if $(VC_LIST_EXCEPT) | grep -l '\.c$$' > /dev/null; then \
|
||||
files=$$(grep -l '^# *include '"$$h_esc" \
|
||||
$$($(VC_LIST_EXCEPT) | grep '\.c$$')) && \
|
||||
@ -490,7 +494,7 @@ sc_immutable_NEWS:
|
||||
# Update the hash stored above. Do this after each release and
|
||||
# for any corrections to old entries.
|
||||
update-NEWS-hash: NEWS
|
||||
perl -pi -e 's/^(old_NEWS_hash = ).*/$${1}'"$(NEWS_hash)/" \
|
||||
perl -pi -e 's/^(old_NEWS_hash[ \t]+:?=[ \t]+).*/$${1}'"$(NEWS_hash)/" \
|
||||
$(srcdir)/cfg.mk
|
||||
|
||||
# Ensure that we use only the standard $(VAR) notation,
|
||||
@ -540,6 +544,7 @@ sc_po_check:
|
||||
for file in $$($(VC_LIST_EXCEPT)) lib/*.[ch]; do \
|
||||
test -r $$file || continue; \
|
||||
case $$file in \
|
||||
*.m4|*.mk) continue ;; \
|
||||
*.?|*.??) ;; \
|
||||
*) continue;; \
|
||||
esac; \
|
||||
@ -613,21 +618,6 @@ vc-diff-check:
|
||||
rm vc-diffs; \
|
||||
fi
|
||||
|
||||
cvs-check: vc-diff-check
|
||||
|
||||
ALL_RECURSIVE_TARGETS += maintainer-distcheck
|
||||
maintainer-distcheck:
|
||||
$(MAKE) distcheck
|
||||
$(MAKE) taint-distcheck
|
||||
$(MAKE) my-distcheck
|
||||
|
||||
|
||||
# Don't make a distribution if checks fail.
|
||||
# Also, make sure the NEWS file is up-to-date.
|
||||
ALL_RECURSIVE_TARGETS += vc-dist
|
||||
vc-dist: $(local-check) cvs-check maintainer-distcheck
|
||||
XZ_OPT=-9ev $(MAKE) dist
|
||||
|
||||
# Use this to make sure we don't run these programs when building
|
||||
# from a virgin tgz file, below.
|
||||
null_AM_MAKEFLAGS = \
|
||||
@ -703,8 +693,10 @@ alpha beta major: $(local-check) writable-files no-submodule-changes
|
||||
&& { echo $(VERSION) | grep -E '^[0-9]+(\.[0-9]+)+$$' \
|
||||
|| { echo "invalid version string: $(VERSION)" 1>&2; exit 1;};}\
|
||||
|| :
|
||||
$(MAKE) vc-dist
|
||||
$(MAKE) vc-diff-check
|
||||
$(MAKE) news-date-check
|
||||
$(MAKE) distcheck
|
||||
$(MAKE) dist XZ_OPT=-9ev
|
||||
$(MAKE) -s announcement RELEASE_TYPE=$@ > /tmp/announce-$(my_distdir)
|
||||
if test -d $(release_archive_dir); then \
|
||||
ln $(rel-files) $(release_archive_dir); \
|
||||
@ -768,3 +760,20 @@ INDENT_SOURCES ?= $(C_SOURCES)
|
||||
.PHONY: indent
|
||||
indent:
|
||||
indent $(INDENT_SOURCES)
|
||||
|
||||
# If you want to set UPDATE_COPYRIGHT_* environment variables,
|
||||
# put the assignments in this variable.
|
||||
update-copyright-env ?=
|
||||
|
||||
# Run this rule once per year (usually early in January)
|
||||
# to update all FSF copyright year lists in your project.
|
||||
# If you have an additional project-specific rule,
|
||||
# add it in cfg.mk along with a line 'update-copyright: prereq'.
|
||||
# By default, exclude all variants of COPYING; you can also
|
||||
# add exemptions (such as ChangeLog..* for rotated change logs)
|
||||
# in the file .x-update-copyright.
|
||||
.PHONY: update-copyright
|
||||
update-copyright:
|
||||
grep -l -w Copyright \
|
||||
$$(export VC_LIST_EXCEPT_DEFAULT=COPYING && $(VC_LIST_EXCEPT)) \
|
||||
| $(update-copyright-env) xargs $(build_aux)/$@
|
||||
|
@ -2,7 +2,7 @@
|
||||
# List version-controlled file names.
|
||||
|
||||
# Print a version string.
|
||||
scriptversion=2009-04-25.13; # UTC
|
||||
scriptversion=2009-07-21.16; # UTC
|
||||
|
||||
# Copyright (C) 2006-2009 Free Software Foundation, Inc.
|
||||
|
||||
@ -74,7 +74,7 @@ test "x$dir" = x && dir=.
|
||||
if test -d .git; then
|
||||
test "x$dir" = x. \
|
||||
&& dir= sed_esc= \
|
||||
|| dir="$dir/" sed_esc=`echo "$dir"|sed 's,\([\\/]\),\\\\\1,g'`
|
||||
|| { dir="$dir/"; sed_esc=`echo "$dir"|env sed 's,\([\\/]\),\\\\\1,g'`; }
|
||||
# Ignore git symlinks - either they point into the tree, in which case
|
||||
# we don't need to visit the target twice, or they point somewhere
|
||||
# else (often into a submodule), in which case the content does not
|
||||
|
Loading…
Reference in New Issue
Block a user