Import new gnulib.
This commit is contained in:
parent
93cd84df63
commit
053cfcddf1
255 changed files with 12578 additions and 4948 deletions
|
@ -1,3 +1,7 @@
|
||||||
|
2013-04-11 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
|
Import new gnulib.
|
||||||
|
|
||||||
2013-04-11 Vladimir Serbinenko <phcoder@gmail.com>
|
2013-04-11 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
Use ACPI shutdown intests as traditional port was removed.
|
Use ACPI shutdown intests as traditional port was removed.
|
||||||
|
|
|
@ -1,26 +0,0 @@
|
||||||
/* A C macro for declaring that specific arguments must not be NULL.
|
|
||||||
Copyright (C) 2009, 2010 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License as published
|
|
||||||
by the Free Software Foundation; either version 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
|
|
||||||
Lesser 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/>. */
|
|
||||||
|
|
||||||
/* _GL_ARG_NONNULL((n,...,m)) tells the compiler and static analyzer tools
|
|
||||||
that the values passed as arguments n, ..., m must be non-NULL pointers.
|
|
||||||
n = 1 stands for the first argument, n = 2 for the second argument etc. */
|
|
||||||
#ifndef _GL_ARG_NONNULL
|
|
||||||
# if (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) || __GNUC__ > 3
|
|
||||||
# define _GL_ARG_NONNULL(params) __attribute__ ((__nonnull__ params))
|
|
||||||
# else
|
|
||||||
# define _GL_ARG_NONNULL(params)
|
|
||||||
# endif
|
|
||||||
#endif
|
|
|
@ -1,271 +0,0 @@
|
||||||
/* C++ compatible function declaration macros.
|
|
||||||
Copyright (C) 2010 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License as published
|
|
||||||
by the Free Software Foundation; either version 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
|
|
||||||
Lesser 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 _GL_CXXDEFS_H
|
|
||||||
#define _GL_CXXDEFS_H
|
|
||||||
|
|
||||||
/* The three most frequent use cases of these macros are:
|
|
||||||
|
|
||||||
* For providing a substitute for a function that is missing on some
|
|
||||||
platforms, but is declared and works fine on the platforms on which
|
|
||||||
it exists:
|
|
||||||
|
|
||||||
#if @GNULIB_FOO@
|
|
||||||
# if !@HAVE_FOO@
|
|
||||||
_GL_FUNCDECL_SYS (foo, ...);
|
|
||||||
# endif
|
|
||||||
_GL_CXXALIAS_SYS (foo, ...);
|
|
||||||
_GL_CXXALIASWARN (foo);
|
|
||||||
#elif defined GNULIB_POSIXCHECK
|
|
||||||
...
|
|
||||||
#endif
|
|
||||||
|
|
||||||
* For providing a replacement for a function that exists on all platforms,
|
|
||||||
but is broken/insufficient and needs to be replaced on some platforms:
|
|
||||||
|
|
||||||
#if @GNULIB_FOO@
|
|
||||||
# if @REPLACE_FOO@
|
|
||||||
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
|
||||||
# undef foo
|
|
||||||
# define foo rpl_foo
|
|
||||||
# endif
|
|
||||||
_GL_FUNCDECL_RPL (foo, ...);
|
|
||||||
_GL_CXXALIAS_RPL (foo, ...);
|
|
||||||
# else
|
|
||||||
_GL_CXXALIAS_SYS (foo, ...);
|
|
||||||
# endif
|
|
||||||
_GL_CXXALIASWARN (foo);
|
|
||||||
#elif defined GNULIB_POSIXCHECK
|
|
||||||
...
|
|
||||||
#endif
|
|
||||||
|
|
||||||
* For providing a replacement for a function that exists on some platforms
|
|
||||||
but is broken/insufficient and needs to be replaced on some of them and
|
|
||||||
is additionally either missing or undeclared on some other platforms:
|
|
||||||
|
|
||||||
#if @GNULIB_FOO@
|
|
||||||
# if @REPLACE_FOO@
|
|
||||||
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
|
||||||
# undef foo
|
|
||||||
# define foo rpl_foo
|
|
||||||
# endif
|
|
||||||
_GL_FUNCDECL_RPL (foo, ...);
|
|
||||||
_GL_CXXALIAS_RPL (foo, ...);
|
|
||||||
# else
|
|
||||||
# if !@HAVE_FOO@ or if !@HAVE_DECL_FOO@
|
|
||||||
_GL_FUNCDECL_SYS (foo, ...);
|
|
||||||
# endif
|
|
||||||
_GL_CXXALIAS_SYS (foo, ...);
|
|
||||||
# endif
|
|
||||||
_GL_CXXALIASWARN (foo);
|
|
||||||
#elif defined GNULIB_POSIXCHECK
|
|
||||||
...
|
|
||||||
#endif
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* _GL_EXTERN_C declaration;
|
|
||||||
performs the declaration with C linkage. */
|
|
||||||
#if defined __cplusplus
|
|
||||||
# define _GL_EXTERN_C extern "C"
|
|
||||||
#else
|
|
||||||
# define _GL_EXTERN_C extern
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* _GL_FUNCDECL_RPL (func, rettype, parameters_and_attributes);
|
|
||||||
declares a replacement function, named rpl_func, with the given prototype,
|
|
||||||
consisting of return type, parameters, and attributes.
|
|
||||||
Example:
|
|
||||||
_GL_FUNCDECL_RPL (open, int, (const char *filename, int flags, ...)
|
|
||||||
_GL_ARG_NONNULL ((1)));
|
|
||||||
*/
|
|
||||||
#define _GL_FUNCDECL_RPL(func,rettype,parameters_and_attributes) \
|
|
||||||
_GL_FUNCDECL_RPL_1 (rpl_##func, rettype, parameters_and_attributes)
|
|
||||||
#define _GL_FUNCDECL_RPL_1(rpl_func,rettype,parameters_and_attributes) \
|
|
||||||
_GL_EXTERN_C rettype rpl_func parameters_and_attributes
|
|
||||||
|
|
||||||
/* _GL_FUNCDECL_SYS (func, rettype, parameters_and_attributes);
|
|
||||||
declares the system function, named func, with the given prototype,
|
|
||||||
consisting of return type, parameters, and attributes.
|
|
||||||
Example:
|
|
||||||
_GL_FUNCDECL_SYS (open, int, (const char *filename, int flags, ...)
|
|
||||||
_GL_ARG_NONNULL ((1)));
|
|
||||||
*/
|
|
||||||
#define _GL_FUNCDECL_SYS(func,rettype,parameters_and_attributes) \
|
|
||||||
_GL_EXTERN_C rettype func parameters_and_attributes
|
|
||||||
|
|
||||||
/* _GL_CXXALIAS_RPL (func, rettype, parameters);
|
|
||||||
declares a C++ alias called GNULIB_NAMESPACE::func
|
|
||||||
that redirects to rpl_func, if GNULIB_NAMESPACE is defined.
|
|
||||||
Example:
|
|
||||||
_GL_CXXALIAS_RPL (open, int, (const char *filename, int flags, ...));
|
|
||||||
*/
|
|
||||||
#define _GL_CXXALIAS_RPL(func,rettype,parameters) \
|
|
||||||
_GL_CXXALIAS_RPL_1 (func, rpl_##func, rettype, parameters)
|
|
||||||
#if defined __cplusplus && defined GNULIB_NAMESPACE
|
|
||||||
# define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \
|
|
||||||
namespace GNULIB_NAMESPACE \
|
|
||||||
{ \
|
|
||||||
rettype (*const func) parameters = ::rpl_func; \
|
|
||||||
} \
|
|
||||||
_GL_EXTERN_C int _gl_cxxalias_dummy
|
|
||||||
#else
|
|
||||||
# define _GL_CXXALIAS_RPL_1(func,rpl_func,rettype,parameters) \
|
|
||||||
_GL_EXTERN_C int _gl_cxxalias_dummy
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* _GL_CXXALIAS_RPL_CAST_1 (func, rpl_func, rettype, parameters);
|
|
||||||
is like _GL_CXXALIAS_RPL_1 (func, rpl_func, rettype, parameters);
|
|
||||||
except that the C function rpl_func may have a slightly different
|
|
||||||
declaration. A cast is used to silence the "invalid conversion" error
|
|
||||||
that would otherwise occur. */
|
|
||||||
#if defined __cplusplus && defined GNULIB_NAMESPACE
|
|
||||||
# define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \
|
|
||||||
namespace GNULIB_NAMESPACE \
|
|
||||||
{ \
|
|
||||||
rettype (*const func) parameters = \
|
|
||||||
reinterpret_cast<rettype(*)parameters>(::rpl_func); \
|
|
||||||
} \
|
|
||||||
_GL_EXTERN_C int _gl_cxxalias_dummy
|
|
||||||
#else
|
|
||||||
# define _GL_CXXALIAS_RPL_CAST_1(func,rpl_func,rettype,parameters) \
|
|
||||||
_GL_EXTERN_C int _gl_cxxalias_dummy
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* _GL_CXXALIAS_SYS (func, rettype, parameters);
|
|
||||||
declares a C++ alias called GNULIB_NAMESPACE::func
|
|
||||||
that redirects to the system provided function func, if GNULIB_NAMESPACE
|
|
||||||
is defined.
|
|
||||||
Example:
|
|
||||||
_GL_CXXALIAS_SYS (open, int, (const char *filename, int flags, ...));
|
|
||||||
*/
|
|
||||||
#if defined __cplusplus && defined GNULIB_NAMESPACE
|
|
||||||
/* If we were to write
|
|
||||||
rettype (*const func) parameters = ::func;
|
|
||||||
like above in _GL_CXXALIAS_RPL_1, the compiler could optimize calls
|
|
||||||
better (remove an indirection through a 'static' pointer variable),
|
|
||||||
but then the _GL_CXXALIASWARN macro below would cause a warning not only
|
|
||||||
for uses of ::func but also for uses of GNULIB_NAMESPACE::func. */
|
|
||||||
# define _GL_CXXALIAS_SYS(func,rettype,parameters) \
|
|
||||||
namespace GNULIB_NAMESPACE \
|
|
||||||
{ \
|
|
||||||
static rettype (*func) parameters = ::func; \
|
|
||||||
} \
|
|
||||||
_GL_EXTERN_C int _gl_cxxalias_dummy
|
|
||||||
#else
|
|
||||||
# define _GL_CXXALIAS_SYS(func,rettype,parameters) \
|
|
||||||
_GL_EXTERN_C int _gl_cxxalias_dummy
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* _GL_CXXALIAS_SYS_CAST (func, rettype, parameters);
|
|
||||||
is like _GL_CXXALIAS_SYS (func, rettype, parameters);
|
|
||||||
except that the C function func may have a slightly different declaration.
|
|
||||||
A cast is used to silence the "invalid conversion" error that would
|
|
||||||
otherwise occur. */
|
|
||||||
#if defined __cplusplus && defined GNULIB_NAMESPACE
|
|
||||||
# define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \
|
|
||||||
namespace GNULIB_NAMESPACE \
|
|
||||||
{ \
|
|
||||||
static rettype (*func) parameters = \
|
|
||||||
reinterpret_cast<rettype(*)parameters>(::func); \
|
|
||||||
} \
|
|
||||||
_GL_EXTERN_C int _gl_cxxalias_dummy
|
|
||||||
#else
|
|
||||||
# define _GL_CXXALIAS_SYS_CAST(func,rettype,parameters) \
|
|
||||||
_GL_EXTERN_C int _gl_cxxalias_dummy
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* _GL_CXXALIAS_SYS_CAST2 (func, rettype, parameters, rettype2, parameters2);
|
|
||||||
is like _GL_CXXALIAS_SYS (func, rettype, parameters);
|
|
||||||
except that the C function is picked among a set of overloaded functions,
|
|
||||||
namely the one with rettype2 and parameters2. Two consecutive casts
|
|
||||||
are used to silence the "cannot find a match" and "invalid conversion"
|
|
||||||
errors that would otherwise occur. */
|
|
||||||
#if defined __cplusplus && defined GNULIB_NAMESPACE
|
|
||||||
/* The outer cast must be a reinterpret_cast.
|
|
||||||
The inner cast: When the function is defined as a set of overloaded
|
|
||||||
functions, it works as a static_cast<>, choosing the designated variant.
|
|
||||||
When the function is defined as a single variant, it works as a
|
|
||||||
reinterpret_cast<>. The parenthesized cast syntax works both ways. */
|
|
||||||
# define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \
|
|
||||||
namespace GNULIB_NAMESPACE \
|
|
||||||
{ \
|
|
||||||
static rettype (*func) parameters = \
|
|
||||||
reinterpret_cast<rettype(*)parameters>( \
|
|
||||||
(rettype2(*)parameters2)(::func)); \
|
|
||||||
} \
|
|
||||||
_GL_EXTERN_C int _gl_cxxalias_dummy
|
|
||||||
#else
|
|
||||||
# define _GL_CXXALIAS_SYS_CAST2(func,rettype,parameters,rettype2,parameters2) \
|
|
||||||
_GL_EXTERN_C int _gl_cxxalias_dummy
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* _GL_CXXALIASWARN (func);
|
|
||||||
causes a warning to be emitted when ::func is used but not when
|
|
||||||
GNULIB_NAMESPACE::func is used. func must be defined without overloaded
|
|
||||||
variants. */
|
|
||||||
#if defined __cplusplus && defined GNULIB_NAMESPACE
|
|
||||||
# define _GL_CXXALIASWARN(func) \
|
|
||||||
_GL_CXXALIASWARN_1 (func, GNULIB_NAMESPACE)
|
|
||||||
# define _GL_CXXALIASWARN_1(func,namespace) \
|
|
||||||
_GL_CXXALIASWARN_2 (func, namespace)
|
|
||||||
/* To work around GCC bug <http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
|
|
||||||
we enable the warning only when not optimizing. */
|
|
||||||
# if !__OPTIMIZE__
|
|
||||||
# define _GL_CXXALIASWARN_2(func,namespace) \
|
|
||||||
_GL_WARN_ON_USE (func, \
|
|
||||||
"The symbol ::" #func " refers to the system function. " \
|
|
||||||
"Use " #namespace "::" #func " instead.")
|
|
||||||
# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
|
|
||||||
# define _GL_CXXALIASWARN_2(func,namespace) \
|
|
||||||
extern __typeof__ (func) func
|
|
||||||
# else
|
|
||||||
# define _GL_CXXALIASWARN_2(func,namespace) \
|
|
||||||
_GL_EXTERN_C int _gl_cxxalias_dummy
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
# define _GL_CXXALIASWARN(func) \
|
|
||||||
_GL_EXTERN_C int _gl_cxxalias_dummy
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* _GL_CXXALIASWARN1 (func, rettype, parameters_and_attributes);
|
|
||||||
causes a warning to be emitted when the given overloaded variant of ::func
|
|
||||||
is used but not when GNULIB_NAMESPACE::func is used. */
|
|
||||||
#if defined __cplusplus && defined GNULIB_NAMESPACE
|
|
||||||
# define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \
|
|
||||||
_GL_CXXALIASWARN1_1 (func, rettype, parameters_and_attributes, \
|
|
||||||
GNULIB_NAMESPACE)
|
|
||||||
# define _GL_CXXALIASWARN1_1(func,rettype,parameters_and_attributes,namespace) \
|
|
||||||
_GL_CXXALIASWARN1_2 (func, rettype, parameters_and_attributes, namespace)
|
|
||||||
/* To work around GCC bug <http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43881>,
|
|
||||||
we enable the warning only when not optimizing. */
|
|
||||||
# if !__OPTIMIZE__
|
|
||||||
# define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
|
|
||||||
_GL_WARN_ON_USE_CXX (func, rettype, parameters_and_attributes, \
|
|
||||||
"The symbol ::" #func " refers to the system function. " \
|
|
||||||
"Use " #namespace "::" #func " instead.")
|
|
||||||
# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
|
|
||||||
# define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
|
|
||||||
extern __typeof__ (func) func
|
|
||||||
# else
|
|
||||||
# define _GL_CXXALIASWARN1_2(func,rettype,parameters_and_attributes,namespace) \
|
|
||||||
_GL_EXTERN_C int _gl_cxxalias_dummy
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
# define _GL_CXXALIASWARN1(func,rettype,parameters_and_attributes) \
|
|
||||||
_GL_EXTERN_C int _gl_cxxalias_dummy
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* _GL_CXXDEFS_H */
|
|
|
@ -2,7 +2,7 @@
|
||||||
# Output a system dependent set of variables, describing how to set the
|
# Output a system dependent set of variables, describing how to set the
|
||||||
# run time search path of shared libraries in an executable.
|
# run time search path of shared libraries in an executable.
|
||||||
#
|
#
|
||||||
# Copyright 1996-2006 Free Software Foundation, Inc.
|
# Copyright 1996-2013 Free Software Foundation, Inc.
|
||||||
# Taken from GNU libtool, 2001
|
# Taken from GNU libtool, 2001
|
||||||
# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
|
# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
|
||||||
#
|
#
|
||||||
|
@ -25,7 +25,7 @@
|
||||||
# known workaround is to choose shorter directory names for the build
|
# known workaround is to choose shorter directory names for the build
|
||||||
# directory and/or the installation directory.
|
# directory and/or the installation directory.
|
||||||
|
|
||||||
# All known linkers require a `.a' archive for static linking (except MSVC,
|
# All known linkers require a '.a' archive for static linking (except MSVC,
|
||||||
# which needs '.lib').
|
# which needs '.lib').
|
||||||
libext=a
|
libext=a
|
||||||
shrext=.so
|
shrext=.so
|
||||||
|
@ -47,7 +47,7 @@ for cc_temp in $CC""; do
|
||||||
done
|
done
|
||||||
cc_basename=`echo "$cc_temp" | sed -e 's%^.*/%%'`
|
cc_basename=`echo "$cc_temp" | sed -e 's%^.*/%%'`
|
||||||
|
|
||||||
# Code taken from libtool.m4's AC_LIBTOOL_PROG_COMPILER_PIC.
|
# Code taken from libtool.m4's _LT_COMPILER_PIC.
|
||||||
|
|
||||||
wl=
|
wl=
|
||||||
if test "$GCC" = yes; then
|
if test "$GCC" = yes; then
|
||||||
|
@ -57,14 +57,7 @@ else
|
||||||
aix*)
|
aix*)
|
||||||
wl='-Wl,'
|
wl='-Wl,'
|
||||||
;;
|
;;
|
||||||
darwin*)
|
mingw* | cygwin* | pw32* | os2* | cegcc*)
|
||||||
case $cc_basename in
|
|
||||||
xlc*)
|
|
||||||
wl='-Wl,'
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
mingw* | pw32* | os2*)
|
|
||||||
;;
|
;;
|
||||||
hpux9* | hpux10* | hpux11*)
|
hpux9* | hpux10* | hpux11*)
|
||||||
wl='-Wl,'
|
wl='-Wl,'
|
||||||
|
@ -72,24 +65,37 @@ else
|
||||||
irix5* | irix6* | nonstopux*)
|
irix5* | irix6* | nonstopux*)
|
||||||
wl='-Wl,'
|
wl='-Wl,'
|
||||||
;;
|
;;
|
||||||
newsos6)
|
linux* | k*bsd*-gnu | kopensolaris*-gnu)
|
||||||
;;
|
|
||||||
linux*)
|
|
||||||
case $cc_basename in
|
case $cc_basename in
|
||||||
icc* | ecc*)
|
ecc*)
|
||||||
wl='-Wl,'
|
wl='-Wl,'
|
||||||
;;
|
;;
|
||||||
pgcc | pgf77 | pgf90)
|
icc* | ifort*)
|
||||||
|
wl='-Wl,'
|
||||||
|
;;
|
||||||
|
lf95*)
|
||||||
|
wl='-Wl,'
|
||||||
|
;;
|
||||||
|
nagfor*)
|
||||||
|
wl='-Wl,-Wl,,'
|
||||||
|
;;
|
||||||
|
pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
|
||||||
wl='-Wl,'
|
wl='-Wl,'
|
||||||
;;
|
;;
|
||||||
ccc*)
|
ccc*)
|
||||||
wl='-Wl,'
|
wl='-Wl,'
|
||||||
;;
|
;;
|
||||||
|
xl* | bgxl* | bgf* | mpixl*)
|
||||||
|
wl='-Wl,'
|
||||||
|
;;
|
||||||
como)
|
como)
|
||||||
wl='-lopt='
|
wl='-lopt='
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
case `$CC -V 2>&1 | sed 5q` in
|
case `$CC -V 2>&1 | sed 5q` in
|
||||||
|
*Sun\ F* | *Sun*Fortran*)
|
||||||
|
wl=
|
||||||
|
;;
|
||||||
*Sun\ C*)
|
*Sun\ C*)
|
||||||
wl='-Wl,'
|
wl='-Wl,'
|
||||||
;;
|
;;
|
||||||
|
@ -97,22 +103,36 @@ else
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
;;
|
;;
|
||||||
|
newsos6)
|
||||||
|
;;
|
||||||
|
*nto* | *qnx*)
|
||||||
|
;;
|
||||||
osf3* | osf4* | osf5*)
|
osf3* | osf4* | osf5*)
|
||||||
wl='-Wl,'
|
wl='-Wl,'
|
||||||
;;
|
;;
|
||||||
sco3.2v5*)
|
rdos*)
|
||||||
;;
|
;;
|
||||||
solaris*)
|
solaris*)
|
||||||
wl='-Wl,'
|
case $cc_basename in
|
||||||
|
f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
|
||||||
|
wl='-Qoption ld '
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
wl='-Wl,'
|
||||||
|
;;
|
||||||
|
esac
|
||||||
;;
|
;;
|
||||||
sunos4*)
|
sunos4*)
|
||||||
wl='-Qoption ld '
|
wl='-Qoption ld '
|
||||||
;;
|
;;
|
||||||
sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
|
sysv4 | sysv4.2uw2* | sysv4.3*)
|
||||||
wl='-Wl,'
|
wl='-Wl,'
|
||||||
;;
|
;;
|
||||||
sysv4*MP*)
|
sysv4*MP*)
|
||||||
;;
|
;;
|
||||||
|
sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
|
||||||
|
wl='-Wl,'
|
||||||
|
;;
|
||||||
unicos*)
|
unicos*)
|
||||||
wl='-Wl,'
|
wl='-Wl,'
|
||||||
;;
|
;;
|
||||||
|
@ -121,7 +141,7 @@ else
|
||||||
esac
|
esac
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Code taken from libtool.m4's AC_LIBTOOL_PROG_LD_SHLIBS.
|
# Code taken from libtool.m4's _LT_LINKER_SHLIBS.
|
||||||
|
|
||||||
hardcode_libdir_flag_spec=
|
hardcode_libdir_flag_spec=
|
||||||
hardcode_libdir_separator=
|
hardcode_libdir_separator=
|
||||||
|
@ -129,7 +149,7 @@ hardcode_direct=no
|
||||||
hardcode_minus_L=no
|
hardcode_minus_L=no
|
||||||
|
|
||||||
case "$host_os" in
|
case "$host_os" in
|
||||||
cygwin* | mingw* | pw32*)
|
cygwin* | mingw* | pw32* | cegcc*)
|
||||||
# FIXME: the MSVC++ port hasn't been tested in a loooong time
|
# FIXME: the MSVC++ port hasn't been tested in a loooong time
|
||||||
# When not using gcc, we currently assume that we are using
|
# When not using gcc, we currently assume that we are using
|
||||||
# Microsoft Visual C++.
|
# Microsoft Visual C++.
|
||||||
|
@ -155,22 +175,21 @@ if test "$with_gnu_ld" = yes; then
|
||||||
# option of GNU ld is called -rpath, not --rpath.
|
# option of GNU ld is called -rpath, not --rpath.
|
||||||
hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
|
hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
|
||||||
case "$host_os" in
|
case "$host_os" in
|
||||||
aix3* | aix4* | aix5*)
|
aix[3-9]*)
|
||||||
# On AIX/PPC, the GNU linker is very broken
|
# On AIX/PPC, the GNU linker is very broken
|
||||||
if test "$host_cpu" != ia64; then
|
if test "$host_cpu" != ia64; then
|
||||||
ld_shlibs=no
|
ld_shlibs=no
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
amigaos*)
|
amigaos*)
|
||||||
hardcode_libdir_flag_spec='-L$libdir'
|
case "$host_cpu" in
|
||||||
hardcode_minus_L=yes
|
powerpc)
|
||||||
# Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports
|
;;
|
||||||
# that the semantics of dynamic libraries on AmigaOS, at least up
|
m68k)
|
||||||
# to version 4, is to share data among multiple programs linked
|
hardcode_libdir_flag_spec='-L$libdir'
|
||||||
# with the same dynamic library. Since this doesn't match the
|
hardcode_minus_L=yes
|
||||||
# behavior of shared libraries on other platforms, we cannot use
|
;;
|
||||||
# them.
|
esac
|
||||||
ld_shlibs=no
|
|
||||||
;;
|
;;
|
||||||
beos*)
|
beos*)
|
||||||
if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
|
if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
|
||||||
|
@ -179,7 +198,7 @@ if test "$with_gnu_ld" = yes; then
|
||||||
ld_shlibs=no
|
ld_shlibs=no
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
cygwin* | mingw* | pw32*)
|
cygwin* | mingw* | pw32* | cegcc*)
|
||||||
# hardcode_libdir_flag_spec is actually meaningless, as there is
|
# hardcode_libdir_flag_spec is actually meaningless, as there is
|
||||||
# no search path for DLLs.
|
# no search path for DLLs.
|
||||||
hardcode_libdir_flag_spec='-L$libdir'
|
hardcode_libdir_flag_spec='-L$libdir'
|
||||||
|
@ -189,11 +208,13 @@ if test "$with_gnu_ld" = yes; then
|
||||||
ld_shlibs=no
|
ld_shlibs=no
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
interix3*)
|
haiku*)
|
||||||
|
;;
|
||||||
|
interix[3-9]*)
|
||||||
hardcode_direct=no
|
hardcode_direct=no
|
||||||
hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
|
hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
|
||||||
;;
|
;;
|
||||||
linux*)
|
gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
|
||||||
if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
|
if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
|
||||||
:
|
:
|
||||||
else
|
else
|
||||||
|
@ -251,7 +272,7 @@ else
|
||||||
hardcode_direct=unsupported
|
hardcode_direct=unsupported
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
aix4* | aix5*)
|
aix[4-9]*)
|
||||||
if test "$host_cpu" = ia64; then
|
if test "$host_cpu" = ia64; then
|
||||||
# On IA64, the linker does run time linking by default, so we don't
|
# On IA64, the linker does run time linking by default, so we don't
|
||||||
# have to do anything special.
|
# have to do anything special.
|
||||||
|
@ -261,7 +282,7 @@ else
|
||||||
# Test if we are trying to use run time linking or normal
|
# Test if we are trying to use run time linking or normal
|
||||||
# AIX style linking. If -brtl is somewhere in LDFLAGS, we
|
# AIX style linking. If -brtl is somewhere in LDFLAGS, we
|
||||||
# need to do runtime linking.
|
# need to do runtime linking.
|
||||||
case $host_os in aix4.[23]|aix4.[23].*|aix5*)
|
case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
|
||||||
for ld_flag in $LDFLAGS; do
|
for ld_flag in $LDFLAGS; do
|
||||||
if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
|
if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
|
||||||
aix_use_runtimelinking=yes
|
aix_use_runtimelinking=yes
|
||||||
|
@ -280,7 +301,7 @@ else
|
||||||
strings "$collect2name" | grep resolve_lib_name >/dev/null
|
strings "$collect2name" | grep resolve_lib_name >/dev/null
|
||||||
then
|
then
|
||||||
# We have reworked collect2
|
# We have reworked collect2
|
||||||
hardcode_direct=yes
|
:
|
||||||
else
|
else
|
||||||
# We have old collect2
|
# We have old collect2
|
||||||
hardcode_direct=unsupported
|
hardcode_direct=unsupported
|
||||||
|
@ -316,14 +337,18 @@ else
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
amigaos*)
|
amigaos*)
|
||||||
hardcode_libdir_flag_spec='-L$libdir'
|
case "$host_cpu" in
|
||||||
hardcode_minus_L=yes
|
powerpc)
|
||||||
# see comment about different semantics on the GNU ld section
|
;;
|
||||||
ld_shlibs=no
|
m68k)
|
||||||
|
hardcode_libdir_flag_spec='-L$libdir'
|
||||||
|
hardcode_minus_L=yes
|
||||||
|
;;
|
||||||
|
esac
|
||||||
;;
|
;;
|
||||||
bsdi[45]*)
|
bsdi[45]*)
|
||||||
;;
|
;;
|
||||||
cygwin* | mingw* | pw32*)
|
cygwin* | mingw* | pw32* | cegcc*)
|
||||||
# When not using gcc, we currently assume that we are using
|
# When not using gcc, we currently assume that we are using
|
||||||
# Microsoft Visual C++.
|
# Microsoft Visual C++.
|
||||||
# hardcode_libdir_flag_spec is actually meaningless, as there is
|
# hardcode_libdir_flag_spec is actually meaningless, as there is
|
||||||
|
@ -333,24 +358,15 @@ else
|
||||||
;;
|
;;
|
||||||
darwin* | rhapsody*)
|
darwin* | rhapsody*)
|
||||||
hardcode_direct=no
|
hardcode_direct=no
|
||||||
if test "$GCC" = yes ; then
|
if { case $cc_basename in ifort*) true;; *) test "$GCC" = yes;; esac; }; then
|
||||||
:
|
:
|
||||||
else
|
else
|
||||||
case $cc_basename in
|
ld_shlibs=no
|
||||||
xlc*)
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
ld_shlibs=no
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
dgux*)
|
dgux*)
|
||||||
hardcode_libdir_flag_spec='-L$libdir'
|
hardcode_libdir_flag_spec='-L$libdir'
|
||||||
;;
|
;;
|
||||||
freebsd1*)
|
|
||||||
ld_shlibs=no
|
|
||||||
;;
|
|
||||||
freebsd2.2*)
|
freebsd2.2*)
|
||||||
hardcode_libdir_flag_spec='-R$libdir'
|
hardcode_libdir_flag_spec='-R$libdir'
|
||||||
hardcode_direct=yes
|
hardcode_direct=yes
|
||||||
|
@ -359,7 +375,7 @@ else
|
||||||
hardcode_direct=yes
|
hardcode_direct=yes
|
||||||
hardcode_minus_L=yes
|
hardcode_minus_L=yes
|
||||||
;;
|
;;
|
||||||
freebsd* | kfreebsd*-gnu | dragonfly*)
|
freebsd* | dragonfly*)
|
||||||
hardcode_libdir_flag_spec='-R$libdir'
|
hardcode_libdir_flag_spec='-R$libdir'
|
||||||
hardcode_direct=yes
|
hardcode_direct=yes
|
||||||
;;
|
;;
|
||||||
|
@ -411,19 +427,25 @@ else
|
||||||
hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
|
hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
|
||||||
hardcode_libdir_separator=:
|
hardcode_libdir_separator=:
|
||||||
;;
|
;;
|
||||||
|
*nto* | *qnx*)
|
||||||
|
;;
|
||||||
openbsd*)
|
openbsd*)
|
||||||
hardcode_direct=yes
|
if test -f /usr/libexec/ld.so; then
|
||||||
if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
|
hardcode_direct=yes
|
||||||
hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
|
if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
|
||||||
|
hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
|
||||||
|
else
|
||||||
|
case "$host_os" in
|
||||||
|
openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
|
||||||
|
hardcode_libdir_flag_spec='-R$libdir'
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
else
|
else
|
||||||
case "$host_os" in
|
ld_shlibs=no
|
||||||
openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
|
|
||||||
hardcode_libdir_flag_spec='-R$libdir'
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
os2*)
|
os2*)
|
||||||
|
@ -471,7 +493,7 @@ else
|
||||||
ld_shlibs=yes
|
ld_shlibs=yes
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*)
|
sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
|
||||||
;;
|
;;
|
||||||
sysv5* | sco3.2v5* | sco5v6*)
|
sysv5* | sco3.2v5* | sco5v6*)
|
||||||
hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
|
hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
|
||||||
|
@ -487,34 +509,58 @@ else
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Check dynamic linker characteristics
|
# Check dynamic linker characteristics
|
||||||
# Code taken from libtool.m4's AC_LIBTOOL_SYS_DYNAMIC_LINKER.
|
# Code taken from libtool.m4's _LT_SYS_DYNAMIC_LINKER.
|
||||||
|
# Unlike libtool.m4, here we don't care about _all_ names of the library, but
|
||||||
|
# only about the one the linker finds when passed -lNAME. This is the last
|
||||||
|
# element of library_names_spec in libtool.m4, or possibly two of them if the
|
||||||
|
# linker has special search rules.
|
||||||
|
library_names_spec= # the last element of library_names_spec in libtool.m4
|
||||||
libname_spec='lib$name'
|
libname_spec='lib$name'
|
||||||
case "$host_os" in
|
case "$host_os" in
|
||||||
aix3*)
|
aix3*)
|
||||||
|
library_names_spec='$libname.a'
|
||||||
;;
|
;;
|
||||||
aix4* | aix5*)
|
aix[4-9]*)
|
||||||
|
library_names_spec='$libname$shrext'
|
||||||
;;
|
;;
|
||||||
amigaos*)
|
amigaos*)
|
||||||
|
case "$host_cpu" in
|
||||||
|
powerpc*)
|
||||||
|
library_names_spec='$libname$shrext' ;;
|
||||||
|
m68k)
|
||||||
|
library_names_spec='$libname.a' ;;
|
||||||
|
esac
|
||||||
;;
|
;;
|
||||||
beos*)
|
beos*)
|
||||||
|
library_names_spec='$libname$shrext'
|
||||||
;;
|
;;
|
||||||
bsdi[45]*)
|
bsdi[45]*)
|
||||||
|
library_names_spec='$libname$shrext'
|
||||||
;;
|
;;
|
||||||
cygwin* | mingw* | pw32*)
|
cygwin* | mingw* | pw32* | cegcc*)
|
||||||
shrext=.dll
|
shrext=.dll
|
||||||
|
library_names_spec='$libname.dll.a $libname.lib'
|
||||||
;;
|
;;
|
||||||
darwin* | rhapsody*)
|
darwin* | rhapsody*)
|
||||||
shrext=.dylib
|
shrext=.dylib
|
||||||
|
library_names_spec='$libname$shrext'
|
||||||
;;
|
;;
|
||||||
dgux*)
|
dgux*)
|
||||||
;;
|
library_names_spec='$libname$shrext'
|
||||||
freebsd1*)
|
|
||||||
;;
|
|
||||||
kfreebsd*-gnu)
|
|
||||||
;;
|
;;
|
||||||
freebsd* | dragonfly*)
|
freebsd* | dragonfly*)
|
||||||
|
case "$host_os" in
|
||||||
|
freebsd[123]*)
|
||||||
|
library_names_spec='$libname$shrext$versuffix' ;;
|
||||||
|
*)
|
||||||
|
library_names_spec='$libname$shrext' ;;
|
||||||
|
esac
|
||||||
;;
|
;;
|
||||||
gnu*)
|
gnu*)
|
||||||
|
library_names_spec='$libname$shrext'
|
||||||
|
;;
|
||||||
|
haiku*)
|
||||||
|
library_names_spec='$libname$shrext'
|
||||||
;;
|
;;
|
||||||
hpux9* | hpux10* | hpux11*)
|
hpux9* | hpux10* | hpux11*)
|
||||||
case $host_cpu in
|
case $host_cpu in
|
||||||
|
@ -528,10 +574,13 @@ case "$host_os" in
|
||||||
shrext=.sl
|
shrext=.sl
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
library_names_spec='$libname$shrext'
|
||||||
;;
|
;;
|
||||||
interix3*)
|
interix[3-9]*)
|
||||||
|
library_names_spec='$libname$shrext'
|
||||||
;;
|
;;
|
||||||
irix5* | irix6* | nonstopux*)
|
irix5* | irix6* | nonstopux*)
|
||||||
|
library_names_spec='$libname$shrext'
|
||||||
case "$host_os" in
|
case "$host_os" in
|
||||||
irix5* | nonstopux*)
|
irix5* | nonstopux*)
|
||||||
libsuff= shlibsuff=
|
libsuff= shlibsuff=
|
||||||
|
@ -548,41 +597,62 @@ case "$host_os" in
|
||||||
;;
|
;;
|
||||||
linux*oldld* | linux*aout* | linux*coff*)
|
linux*oldld* | linux*aout* | linux*coff*)
|
||||||
;;
|
;;
|
||||||
linux*)
|
linux* | k*bsd*-gnu | kopensolaris*-gnu)
|
||||||
|
library_names_spec='$libname$shrext'
|
||||||
;;
|
;;
|
||||||
knetbsd*-gnu)
|
knetbsd*-gnu)
|
||||||
|
library_names_spec='$libname$shrext'
|
||||||
;;
|
;;
|
||||||
netbsd*)
|
netbsd*)
|
||||||
|
library_names_spec='$libname$shrext'
|
||||||
;;
|
;;
|
||||||
newsos6)
|
newsos6)
|
||||||
|
library_names_spec='$libname$shrext'
|
||||||
;;
|
;;
|
||||||
nto-qnx*)
|
*nto* | *qnx*)
|
||||||
|
library_names_spec='$libname$shrext'
|
||||||
;;
|
;;
|
||||||
openbsd*)
|
openbsd*)
|
||||||
|
library_names_spec='$libname$shrext$versuffix'
|
||||||
;;
|
;;
|
||||||
os2*)
|
os2*)
|
||||||
libname_spec='$name'
|
libname_spec='$name'
|
||||||
shrext=.dll
|
shrext=.dll
|
||||||
|
library_names_spec='$libname.a'
|
||||||
;;
|
;;
|
||||||
osf3* | osf4* | osf5*)
|
osf3* | osf4* | osf5*)
|
||||||
|
library_names_spec='$libname$shrext'
|
||||||
|
;;
|
||||||
|
rdos*)
|
||||||
;;
|
;;
|
||||||
solaris*)
|
solaris*)
|
||||||
|
library_names_spec='$libname$shrext'
|
||||||
;;
|
;;
|
||||||
sunos4*)
|
sunos4*)
|
||||||
|
library_names_spec='$libname$shrext$versuffix'
|
||||||
;;
|
;;
|
||||||
sysv4 | sysv4.3*)
|
sysv4 | sysv4.3*)
|
||||||
|
library_names_spec='$libname$shrext'
|
||||||
;;
|
;;
|
||||||
sysv4*MP*)
|
sysv4*MP*)
|
||||||
|
library_names_spec='$libname$shrext'
|
||||||
;;
|
;;
|
||||||
sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
|
sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
|
||||||
|
library_names_spec='$libname$shrext'
|
||||||
|
;;
|
||||||
|
tpf*)
|
||||||
|
library_names_spec='$libname$shrext'
|
||||||
;;
|
;;
|
||||||
uts4*)
|
uts4*)
|
||||||
|
library_names_spec='$libname$shrext'
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
|
sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
|
||||||
escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"`
|
escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"`
|
||||||
shlibext=`echo "$shrext" | sed -e 's,^\.,,'`
|
shlibext=`echo "$shrext" | sed -e 's,^\.,,'`
|
||||||
|
escaped_libname_spec=`echo "X$libname_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
|
||||||
|
escaped_library_names_spec=`echo "X$library_names_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
|
||||||
escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
|
escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
|
||||||
|
|
||||||
LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <<EOF
|
LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <<EOF
|
||||||
|
@ -596,6 +666,12 @@ libext="$libext"
|
||||||
# Shared library suffix (normally "so").
|
# Shared library suffix (normally "so").
|
||||||
shlibext="$shlibext"
|
shlibext="$shlibext"
|
||||||
|
|
||||||
|
# Format of library name prefix.
|
||||||
|
libname_spec="$escaped_libname_spec"
|
||||||
|
|
||||||
|
# Library names that the linker finds when passed -lNAME.
|
||||||
|
library_names_spec="$escaped_library_names_spec"
|
||||||
|
|
||||||
# Flag to hardcode \$libdir into a binary during linking.
|
# Flag to hardcode \$libdir into a binary during linking.
|
||||||
# This must work even if \$libdir does not exist.
|
# This must work even if \$libdir does not exist.
|
||||||
hardcode_libdir_flag_spec="$escaped_hardcode_libdir_flag_spec"
|
hardcode_libdir_flag_spec="$escaped_hardcode_libdir_flag_spec"
|
||||||
|
|
|
@ -1,109 +0,0 @@
|
||||||
/* A C macro for emitting warnings if a function is used.
|
|
||||||
Copyright (C) 2010 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License as published
|
|
||||||
by the Free Software Foundation; either version 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
|
|
||||||
Lesser 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/>. */
|
|
||||||
|
|
||||||
/* _GL_WARN_ON_USE (function, "literal string") issues a declaration
|
|
||||||
for FUNCTION which will then trigger a compiler warning containing
|
|
||||||
the text of "literal string" anywhere that function is called, if
|
|
||||||
supported by the compiler. If the compiler does not support this
|
|
||||||
feature, the macro expands to an unused extern declaration.
|
|
||||||
|
|
||||||
This macro is useful for marking a function as a potential
|
|
||||||
portability trap, with the intent that "literal string" include
|
|
||||||
instructions on the replacement function that should be used
|
|
||||||
instead. However, one of the reasons that a function is a
|
|
||||||
portability trap is if it has the wrong signature. Declaring
|
|
||||||
FUNCTION with a different signature in C is a compilation error, so
|
|
||||||
this macro must use the same type as any existing declaration so
|
|
||||||
that programs that avoid the problematic FUNCTION do not fail to
|
|
||||||
compile merely because they included a header that poisoned the
|
|
||||||
function. But this implies that _GL_WARN_ON_USE is only safe to
|
|
||||||
use if FUNCTION is known to already have a declaration. Use of
|
|
||||||
this macro implies that there must not be any other macro hiding
|
|
||||||
the declaration of FUNCTION; but undefining FUNCTION first is part
|
|
||||||
of the poisoning process anyway (although for symbols that are
|
|
||||||
provided only via a macro, the result is a compilation error rather
|
|
||||||
than a warning containing "literal string"). Also note that in
|
|
||||||
C++, it is only safe to use if FUNCTION has no overloads.
|
|
||||||
|
|
||||||
For an example, it is possible to poison 'getline' by:
|
|
||||||
- adding a call to gl_WARN_ON_USE_PREPARE([[#include <stdio.h>]],
|
|
||||||
[getline]) in configure.ac, which potentially defines
|
|
||||||
HAVE_RAW_DECL_GETLINE
|
|
||||||
- adding this code to a header that wraps the system <stdio.h>:
|
|
||||||
#undef getline
|
|
||||||
#if HAVE_RAW_DECL_GETLINE
|
|
||||||
_GL_WARN_ON_USE (getline, "getline is required by POSIX 2008, but"
|
|
||||||
"not universally present; use the gnulib module getline");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
It is not possible to directly poison global variables. But it is
|
|
||||||
possible to write a wrapper accessor function, and poison that
|
|
||||||
(less common usage, like &environ, will cause a compilation error
|
|
||||||
rather than issue the nice warning, but the end result of informing
|
|
||||||
the developer about their portability problem is still achieved):
|
|
||||||
#if HAVE_RAW_DECL_ENVIRON
|
|
||||||
static inline char ***rpl_environ (void) { return &environ; }
|
|
||||||
_GL_WARN_ON_USE (rpl_environ, "environ is not always properly declared");
|
|
||||||
# undef environ
|
|
||||||
# define environ (*rpl_environ ())
|
|
||||||
#endif
|
|
||||||
*/
|
|
||||||
#ifndef _GL_WARN_ON_USE
|
|
||||||
|
|
||||||
# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
|
|
||||||
/* A compiler attribute is available in gcc versions 4.3.0 and later. */
|
|
||||||
# define _GL_WARN_ON_USE(function, message) \
|
|
||||||
extern __typeof__ (function) function __attribute__ ((__warning__ (message)))
|
|
||||||
# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
|
|
||||||
/* Verify the existence of the function. */
|
|
||||||
# define _GL_WARN_ON_USE(function, message) \
|
|
||||||
extern __typeof__ (function) function
|
|
||||||
# else /* Unsupported. */
|
|
||||||
# define _GL_WARN_ON_USE(function, message) \
|
|
||||||
_GL_WARN_EXTERN_C int _gl_warn_on_use
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* _GL_WARN_ON_USE_CXX (function, rettype, parameters_and_attributes, "string")
|
|
||||||
is like _GL_WARN_ON_USE (function, "string"), except that the function is
|
|
||||||
declared with the given prototype, consisting of return type, parameters,
|
|
||||||
and attributes.
|
|
||||||
This variant is useful for overloaded functions in C++. _GL_WARN_ON_USE does
|
|
||||||
not work in this case. */
|
|
||||||
#ifndef _GL_WARN_ON_USE_CXX
|
|
||||||
# if 4 < __GNUC__ || (__GNUC__ == 4 && 3 <= __GNUC_MINOR__)
|
|
||||||
# define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
|
|
||||||
extern rettype function parameters_and_attributes \
|
|
||||||
__attribute__ ((__warning__ (msg)))
|
|
||||||
# elif __GNUC__ >= 3 && GNULIB_STRICT_CHECKING
|
|
||||||
/* Verify the existence of the function. */
|
|
||||||
# define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
|
|
||||||
extern rettype function parameters_and_attributes
|
|
||||||
# else /* Unsupported. */
|
|
||||||
# define _GL_WARN_ON_USE_CXX(function,rettype,parameters_and_attributes,msg) \
|
|
||||||
_GL_WARN_EXTERN_C int _gl_warn_on_use
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* _GL_WARN_EXTERN_C declaration;
|
|
||||||
performs the declaration with C linkage. */
|
|
||||||
#ifndef _GL_WARN_EXTERN_C
|
|
||||||
# if defined __cplusplus
|
|
||||||
# define _GL_WARN_EXTERN_C extern "C"
|
|
||||||
# else
|
|
||||||
# define _GL_WARN_EXTERN_C extern
|
|
||||||
# endif
|
|
||||||
#endif
|
|
|
@ -49,4 +49,6 @@
|
||||||
|
|
||||||
#define RE_ENABLE_I18N 1
|
#define RE_ENABLE_I18N 1
|
||||||
|
|
||||||
|
#define __USE_GNU 1
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -194,7 +194,7 @@ kernel = {
|
||||||
|
|
||||||
emu = disk/host.c;
|
emu = disk/host.c;
|
||||||
emu = gnulib/progname.c;
|
emu = gnulib/progname.c;
|
||||||
emu = gnulib/error.c;
|
emu = kern/emu/error.c;
|
||||||
emu = kern/emu/cache_s.S;
|
emu = kern/emu/cache_s.S;
|
||||||
emu = kern/emu/hostdisk.c;
|
emu = kern/emu/hostdisk.c;
|
||||||
emu = kern/emu/hostfs.c;
|
emu = kern/emu/hostfs.c;
|
||||||
|
|
13
grub-core/gnulib-fix-null-deref.diff
Normal file
13
grub-core/gnulib-fix-null-deref.diff
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
=== modified file 'grub-core/gnulib/argp-parse.c'
|
||||||
|
--- grub-core/gnulib/argp-parse.c 2010-04-02 22:45:01 +0000
|
||||||
|
+++ grub-core/gnulib/argp-parse.c 2011-04-10 13:25:52 +0000
|
||||||
|
@@ -935,7 +935,7 @@
|
||||||
|
void *
|
||||||
|
__argp_input (const struct argp *argp, const struct argp_state *state)
|
||||||
|
{
|
||||||
|
- if (state)
|
||||||
|
+ if (state && state->pstate)
|
||||||
|
{
|
||||||
|
struct group *group;
|
||||||
|
struct parser *parser = state->pstate;
|
||||||
|
|
231
grub-core/gnulib-fix-width.diff
Normal file
231
grub-core/gnulib-fix-width.diff
Normal file
|
@ -0,0 +1,231 @@
|
||||||
|
diff --git a/lib/argp-fmtstream.c b/lib/argp-fmtstream.c
|
||||||
|
index 7aa317c..02406ff 100644
|
||||||
|
--- a/lib/argp-fmtstream.c
|
||||||
|
+++ b/lib/argp-fmtstream.c
|
||||||
|
@@ -29,9 +29,11 @@
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
+#include <wchar.h>
|
||||||
|
|
||||||
|
#include "argp-fmtstream.h"
|
||||||
|
#include "argp-namefrob.h"
|
||||||
|
+#include "mbswidth.h"
|
||||||
|
|
||||||
|
#ifndef ARGP_FMTSTREAM_USE_LINEWRAP
|
||||||
|
|
||||||
|
@@ -116,6 +118,51 @@ weak_alias (__argp_fmtstream_free, argp_fmtstream_free)
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+
|
||||||
|
+/* Return the pointer to the first character that doesn't fit in l columns. */
|
||||||
|
+static inline const ptrdiff_t
|
||||||
|
+add_width (const char *ptr, const char *end, size_t l)
|
||||||
|
+{
|
||||||
|
+ mbstate_t ps;
|
||||||
|
+ const char *ptr0 = ptr;
|
||||||
|
+
|
||||||
|
+ memset (&ps, 0, sizeof (ps));
|
||||||
|
+
|
||||||
|
+ while (ptr < end)
|
||||||
|
+ {
|
||||||
|
+ wchar_t wc;
|
||||||
|
+ size_t s, k;
|
||||||
|
+
|
||||||
|
+ s = mbrtowc (&wc, ptr, end - ptr, &ps);
|
||||||
|
+ if (s == (size_t) -1)
|
||||||
|
+ break;
|
||||||
|
+ if (s == (size_t) -2)
|
||||||
|
+ {
|
||||||
|
+ if (1 >= l)
|
||||||
|
+ break;
|
||||||
|
+ l--;
|
||||||
|
+ ptr++;
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (wc == '\e' && ptr + 3 < end
|
||||||
|
+ && ptr[1] == '[' && (ptr[2] == '0' || ptr[2] == '1')
|
||||||
|
+ && ptr[3] == 'm')
|
||||||
|
+ {
|
||||||
|
+ ptr += 4;
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ k = wcwidth (wc);
|
||||||
|
+
|
||||||
|
+ if (k >= l)
|
||||||
|
+ break;
|
||||||
|
+ l -= k;
|
||||||
|
+ ptr += s;
|
||||||
|
+ }
|
||||||
|
+ return ptr - ptr0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/* Process FS's buffer so that line wrapping is done from POINT_OFFS to the
|
||||||
|
end of its buffer. This code is mostly from glibc stdio/linewrap.c. */
|
||||||
|
void
|
||||||
|
@@ -168,14 +215,15 @@ __argp_fmtstream_update (argp_fmtstream_t fs)
|
||||||
|
|
||||||
|
if (!nl)
|
||||||
|
{
|
||||||
|
+ size_t display_width = mbsnwidth (buf, fs->p - buf, MBSW_STOP_AT_NUL);
|
||||||
|
/* The buffer ends in a partial line. */
|
||||||
|
|
||||||
|
- if (fs->point_col + len < fs->rmargin)
|
||||||
|
+ if (fs->point_col + display_width < fs->rmargin)
|
||||||
|
{
|
||||||
|
/* The remaining buffer text is a partial line and fits
|
||||||
|
within the maximum line width. Advance point for the
|
||||||
|
characters to be written and stop scanning. */
|
||||||
|
- fs->point_col += len;
|
||||||
|
+ fs->point_col += display_width;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
@@ -183,14 +231,18 @@ __argp_fmtstream_update (argp_fmtstream_t fs)
|
||||||
|
the end of the buffer. */
|
||||||
|
nl = fs->p;
|
||||||
|
}
|
||||||
|
- else if (fs->point_col + (nl - buf) < (ssize_t) fs->rmargin)
|
||||||
|
- {
|
||||||
|
- /* The buffer contains a full line that fits within the maximum
|
||||||
|
- line width. Reset point and scan the next line. */
|
||||||
|
- fs->point_col = 0;
|
||||||
|
- buf = nl + 1;
|
||||||
|
- continue;
|
||||||
|
- }
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ size_t display_width = mbsnwidth (buf, nl - buf, MBSW_STOP_AT_NUL);
|
||||||
|
+ if (display_width < (ssize_t) fs->rmargin)
|
||||||
|
+ {
|
||||||
|
+ /* The buffer contains a full line that fits within the maximum
|
||||||
|
+ line width. Reset point and scan the next line. */
|
||||||
|
+ fs->point_col = 0;
|
||||||
|
+ buf = nl + 1;
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
|
||||||
|
/* This line is too long. */
|
||||||
|
r = fs->rmargin - 1;
|
||||||
|
@@ -226,7 +278,7 @@ __argp_fmtstream_update (argp_fmtstream_t fs)
|
||||||
|
char *p, *nextline;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
- p = buf + (r + 1 - fs->point_col);
|
||||||
|
+ p = buf + add_width (buf, fs->p, (r + 1 - fs->point_col));
|
||||||
|
while (p >= buf && !isblank ((unsigned char) *p))
|
||||||
|
--p;
|
||||||
|
nextline = p + 1; /* This will begin the next line. */
|
||||||
|
@@ -244,7 +296,7 @@ __argp_fmtstream_update (argp_fmtstream_t fs)
|
||||||
|
{
|
||||||
|
/* A single word that is greater than the maximum line width.
|
||||||
|
Oh well. Put it on an overlong line by itself. */
|
||||||
|
- p = buf + (r + 1 - fs->point_col);
|
||||||
|
+ p = buf + add_width (buf, fs->p, (r + 1 - fs->point_col));
|
||||||
|
/* Find the end of the long word. */
|
||||||
|
if (p < nl)
|
||||||
|
do
|
||||||
|
@@ -278,7 +330,8 @@ __argp_fmtstream_update (argp_fmtstream_t fs)
|
||||||
|
&& fs->p > nextline)
|
||||||
|
{
|
||||||
|
/* The margin needs more blanks than we removed. */
|
||||||
|
- if (fs->end - fs->p > fs->wmargin + 1)
|
||||||
|
+ if (mbsnwidth (fs->p, fs->end - fs->p, MBSW_STOP_AT_NUL)
|
||||||
|
+ > fs->wmargin + 1)
|
||||||
|
/* Make some space for them. */
|
||||||
|
{
|
||||||
|
size_t mv = fs->p - nextline;
|
||||||
|
diff --git a/lib/argp-help.c b/lib/argp-help.c
|
||||||
|
index 354f1e2..2914f47 100644
|
||||||
|
--- a/lib/argp-help.c
|
||||||
|
+++ b/lib/argp-help.c
|
||||||
|
@@ -50,6 +50,7 @@
|
||||||
|
#include "argp.h"
|
||||||
|
#include "argp-fmtstream.h"
|
||||||
|
#include "argp-namefrob.h"
|
||||||
|
+#include "mbswidth.h"
|
||||||
|
|
||||||
|
#ifndef SIZE_MAX
|
||||||
|
# define SIZE_MAX ((size_t) -1)
|
||||||
|
@@ -1452,7 +1453,7 @@ argp_args_usage (const struct argp *argp, const struct argp_state *state,
|
||||||
|
|
||||||
|
/* Manually do line wrapping so that it (probably) won't get wrapped at
|
||||||
|
any embedded spaces. */
|
||||||
|
- space (stream, 1 + nl - cp);
|
||||||
|
+ space (stream, 1 + mbsnwidth (cp, nl - cp, MBSW_STOP_AT_NUL));
|
||||||
|
|
||||||
|
__argp_fmtstream_write (stream, cp, nl - cp);
|
||||||
|
}
|
||||||
|
diff --git a/lib/mbswidth.c b/lib/mbswidth.c
|
||||||
|
index 7c2dfce..baa4f27 100644
|
||||||
|
--- a/lib/mbswidth.c
|
||||||
|
+++ b/lib/mbswidth.c
|
||||||
|
@@ -90,6 +90,9 @@ mbsnwidth (const char *string, size_t nbytes, int flags)
|
||||||
|
p++;
|
||||||
|
width++;
|
||||||
|
break;
|
||||||
|
+ case '\0':
|
||||||
|
+ if (flags & MBSW_STOP_AT_NUL)
|
||||||
|
+ return width;
|
||||||
|
default:
|
||||||
|
/* If we have a multibyte sequence, scan it up to its end. */
|
||||||
|
{
|
||||||
|
@@ -168,6 +171,9 @@ mbsnwidth (const char *string, size_t nbytes, int flags)
|
||||||
|
{
|
||||||
|
unsigned char c = (unsigned char) *p++;
|
||||||
|
|
||||||
|
+ if (c == 0 && (flags & MBSW_STOP_AT_NUL))
|
||||||
|
+ return width;
|
||||||
|
+
|
||||||
|
if (isprint (c))
|
||||||
|
{
|
||||||
|
if (width == INT_MAX)
|
||||||
|
diff --git a/lib/mbswidth.h b/lib/mbswidth.h
|
||||||
|
index e9c0b03..d7207c5 100644
|
||||||
|
--- a/lib/mbswidth.h
|
||||||
|
+++ b/lib/mbswidth.h
|
||||||
|
@@ -45,6 +45,9 @@ extern "C" {
|
||||||
|
control characters and 1 otherwise. */
|
||||||
|
#define MBSW_REJECT_UNPRINTABLE 2
|
||||||
|
|
||||||
|
+/* If this bit is set \0 is treated as the end of string.
|
||||||
|
+ Otherwise it's treated as a normal one column width character. */
|
||||||
|
+#define MBSW_STOP_AT_NUL 4
|
||||||
|
|
||||||
|
/* Returns the number of screen columns needed for STRING. */
|
||||||
|
#define mbswidth gnu_mbswidth /* avoid clash with UnixWare 7.1.1 function */
|
||||||
|
diff --git a/modules/argp b/modules/argp
|
||||||
|
index 125046a..6f14d10 100644
|
||||||
|
--- a/modules/argp
|
||||||
|
+++ b/modules/argp
|
||||||
|
@@ -40,6 +40,7 @@ stdalign
|
||||||
|
strerror
|
||||||
|
memchr
|
||||||
|
memmove
|
||||||
|
+mbswidth
|
||||||
|
|
||||||
|
configure.ac:
|
||||||
|
gl_ARGP
|
||||||
|
diff --git a/modules/argp-tests b/modules/argp-tests
|
||||||
|
index 8f92a4d..0463927 100644
|
||||||
|
--- a/modules/argp-tests
|
||||||
|
+++ b/modules/argp-tests
|
||||||
|
@@ -1,11 +1,13 @@
|
||||||
|
Files:
|
||||||
|
tests/test-argp.c
|
||||||
|
tests/test-argp-2.sh
|
||||||
|
+tests/test-argp-2-utf.sh
|
||||||
|
|
||||||
|
Depends-on:
|
||||||
|
progname
|
||||||
|
|
||||||
|
Makefile.am:
|
||||||
|
TESTS += test-argp test-argp-2.sh
|
||||||
|
-check_PROGRAMS += test-argp
|
||||||
|
+TESTS += test-argp test-argp-2.sh test-argp-2-utf.sh
|
||||||
|
+check_PROGRAMS += test-argp test-argp-utf8
|
||||||
|
test_argp_LDADD = $(LDADD) @LIBINTL@
|
30
grub-core/gnulib-no-abort.diff
Normal file
30
grub-core/gnulib-no-abort.diff
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
=== modified file 'grub-core/gnulib/regcomp.c'
|
||||||
|
--- grub-core/gnulib/regcomp.c 2010-09-20 10:35:33 +0000
|
||||||
|
+++ grub-core/gnulib/regcomp.c 2012-03-10 11:31:42 +0000
|
||||||
|
@@ -549,13 +549,9 @@ regerror (int errcode, const regex_t *_R
|
||||||
|
if (BE (errcode < 0
|
||||||
|
|| errcode >= (int) (sizeof (__re_error_msgid_idx)
|
||||||
|
/ sizeof (__re_error_msgid_idx[0])), 0))
|
||||||
|
- /* Only error codes returned by the rest of the code should be passed
|
||||||
|
- to this routine. If we are given anything else, or if other regex
|
||||||
|
- code generates an invalid error code, then the program has a bug.
|
||||||
|
- Dump core so we can fix it. */
|
||||||
|
- abort ();
|
||||||
|
-
|
||||||
|
- msg = gettext (__re_error_msgid + __re_error_msgid_idx[errcode]);
|
||||||
|
+ msg = gettext ("unknown regexp error");
|
||||||
|
+ else
|
||||||
|
+ msg = gettext (__re_error_msgid + __re_error_msgid_idx[errcode]);
|
||||||
|
|
||||||
|
msg_size = strlen (msg) + 1; /* Includes the null. */
|
||||||
|
|
||||||
|
@@ -1119,7 +1119,7 @@
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
- abort ();
|
||||||
|
+ break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mb_chars || has_period)
|
||||||
|
|
10
grub-core/gnulib-no-gets.diff
Normal file
10
grub-core/gnulib-no-gets.diff
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
--- /tmp/x.diff 2013-04-11 16:51:42.777873536 +0200
|
||||||
|
+++ grub-core/gnulib/stdio.in.h 2013-04-11 16:51:49.917873298 +0200
|
||||||
|
@@ -700,7 +700,6 @@
|
||||||
|
removed it. */
|
||||||
|
#undef gets
|
||||||
|
#if HAVE_RAW_DECL_GETS
|
||||||
|
-_GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -93,26 +93,15 @@ long i00afunc ();
|
||||||
static int stack_dir; /* 1 or -1 once known. */
|
static int stack_dir; /* 1 or -1 once known. */
|
||||||
# define STACK_DIR stack_dir
|
# define STACK_DIR stack_dir
|
||||||
|
|
||||||
static void
|
static int
|
||||||
find_stack_direction (void)
|
find_stack_direction (int *addr, int depth)
|
||||||
{
|
{
|
||||||
static char *addr = NULL; /* Address of first `dummy', once known. */
|
int dir, dummy = 0;
|
||||||
auto char dummy; /* To get stack address. */
|
if (! addr)
|
||||||
|
addr = &dummy;
|
||||||
if (addr == NULL)
|
*addr = addr < &dummy ? 1 : addr == &dummy ? 0 : -1;
|
||||||
{ /* Initial entry. */
|
dir = depth ? find_stack_direction (addr, depth - 1) : 0;
|
||||||
addr = ADDRESS_FUNCTION (dummy);
|
return dir + dummy;
|
||||||
|
|
||||||
find_stack_direction (); /* Recurse once. */
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Second entry. */
|
|
||||||
if (ADDRESS_FUNCTION (dummy) > addr)
|
|
||||||
stack_dir = 1; /* Stack grew upward. */
|
|
||||||
else
|
|
||||||
stack_dir = -1; /* Stack grew downward. */
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# endif /* STACK_DIRECTION == 0 */
|
# endif /* STACK_DIRECTION == 0 */
|
||||||
|
@ -155,7 +144,7 @@ alloca (size_t size)
|
||||||
|
|
||||||
# if STACK_DIRECTION == 0
|
# if STACK_DIRECTION == 0
|
||||||
if (STACK_DIR == 0) /* Unknown growth direction. */
|
if (STACK_DIR == 0) /* Unknown growth direction. */
|
||||||
find_stack_direction ();
|
STACK_DIR = find_stack_direction (NULL, (size & 1) + 20);
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
/* Reclaim garbage, defined as all alloca'd storage that
|
/* Reclaim garbage, defined as all alloca'd storage that
|
||||||
|
@ -486,4 +475,4 @@ i00afunc (long address)
|
||||||
# endif /* CRAY */
|
# endif /* CRAY */
|
||||||
|
|
||||||
# endif /* no alloca */
|
# endif /* no alloca */
|
||||||
#endif /* not GCC version 3 */
|
#endif /* not GCC 2 */
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* Memory allocation on the stack.
|
/* Memory allocation on the stack.
|
||||||
|
|
||||||
Copyright (C) 1995, 1999, 2001-2004, 2006-2010 Free Software Foundation,
|
Copyright (C) 1995, 1999, 2001-2004, 2006-2013 Free Software Foundation,
|
||||||
Inc.
|
Inc.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it
|
This program is free software; you can redistribute it and/or modify it
|
||||||
|
@ -14,9 +14,9 @@
|
||||||
General Public License for more details.
|
General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public
|
You should have received a copy of the GNU General Public
|
||||||
License along with this program; if not, write to the Free Software
|
License along with this program; if not, see
|
||||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
<http://www.gnu.org/licenses/>.
|
||||||
USA. */
|
*/
|
||||||
|
|
||||||
/* Avoid using the symbol _ALLOCA_H here, as Bison assumes _ALLOCA_H
|
/* Avoid using the symbol _ALLOCA_H here, as Bison assumes _ALLOCA_H
|
||||||
means there is a real alloca function. */
|
means there is a real alloca function. */
|
||||||
|
@ -44,6 +44,13 @@
|
||||||
# define alloca _alloca
|
# define alloca _alloca
|
||||||
# elif defined __DECC && defined __VMS
|
# elif defined __DECC && defined __VMS
|
||||||
# define alloca __ALLOCA
|
# define alloca __ALLOCA
|
||||||
|
# elif defined __TANDEM && defined _TNS_E_TARGET
|
||||||
|
# ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
# endif
|
||||||
|
void *_alloca (unsigned short);
|
||||||
|
# pragma intrinsic (_alloca)
|
||||||
|
# define alloca _alloca
|
||||||
# else
|
# else
|
||||||
# include <stddef.h>
|
# include <stddef.h>
|
||||||
# ifdef __cplusplus
|
# ifdef __cplusplus
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* Default definition for ARGP_PROGRAM_BUG_ADDRESS.
|
/* Default definition for ARGP_PROGRAM_BUG_ADDRESS.
|
||||||
Copyright (C) 1996, 1997, 1999, 2009, 2010 Free Software Foundation, Inc.
|
Copyright (C) 1996-1997, 1999, 2009-2013 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Written by Miles Bader <miles@gnu.ai.mit.edu>.
|
Written by Miles Bader <miles@gnu.ai.mit.edu>.
|
||||||
|
|
||||||
|
@ -19,11 +19,11 @@
|
||||||
/* If set by the user program, it should point to string that is the
|
/* If set by the user program, it should point to string that is the
|
||||||
bug-reporting address for the program. It will be printed by argp_help if
|
bug-reporting address for the program. It will be printed by argp_help if
|
||||||
the ARGP_HELP_BUG_ADDR flag is set (as it is by various standard help
|
the ARGP_HELP_BUG_ADDR flag is set (as it is by various standard help
|
||||||
messages), embedded in a sentence that says something like `Report bugs to
|
messages), embedded in a sentence that says something like "Report bugs to
|
||||||
ADDR.'. */
|
ADDR." */
|
||||||
const char *argp_program_bug_address
|
const char *argp_program_bug_address
|
||||||
/* This variable should be zero-initialized. On most systems, putting it into
|
/* This variable should be zero-initialized. On most systems, putting it into
|
||||||
BSS is sufficient. Not so on MacOS X 10.3 and 10.4, see
|
BSS is sufficient. Not so on Mac OS X 10.3 and 10.4, see
|
||||||
<http://lists.gnu.org/archive/html/bug-gnulib/2009-01/msg00329.html>
|
<http://lists.gnu.org/archive/html/bug-gnulib/2009-01/msg00329.html>
|
||||||
<http://lists.gnu.org/archive/html/bug-gnulib/2009-08/msg00096.html>. */
|
<http://lists.gnu.org/archive/html/bug-gnulib/2009-08/msg00096.html>. */
|
||||||
#if defined __ELF__
|
#if defined __ELF__
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* Default definition for ARGP_ERR_EXIT_STATUS
|
/* Default definition for ARGP_ERR_EXIT_STATUS
|
||||||
Copyright (C) 1997, 2009, 2010 Free Software Foundation, Inc.
|
Copyright (C) 1997, 2009-2013 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Written by Miles Bader <miles@gnu.ai.mit.edu>.
|
Written by Miles Bader <miles@gnu.ai.mit.edu>.
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* Word-wrapping and line-truncating streams
|
/* Word-wrapping and line-truncating streams
|
||||||
Copyright (C) 1997-1999, 2001-2003, 2005, 2009-2010 Free Software
|
Copyright (C) 1997-1999, 2001-2003, 2005, 2009-2013 Free Software
|
||||||
Foundation, Inc.
|
Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Written by Miles Bader <miles@gnu.ai.mit.edu>.
|
Written by Miles Bader <miles@gnu.ai.mit.edu>.
|
||||||
|
@ -17,7 +17,7 @@
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
/* This package emulates glibc `line_wrap_stream' semantics for systems that
|
/* This package emulates glibc 'line_wrap_stream' semantics for systems that
|
||||||
don't have that. */
|
don't have that. */
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
|
@ -33,6 +33,7 @@
|
||||||
|
|
||||||
#include "argp-fmtstream.h"
|
#include "argp-fmtstream.h"
|
||||||
#include "argp-namefrob.h"
|
#include "argp-namefrob.h"
|
||||||
|
#include "mbswidth.h"
|
||||||
|
|
||||||
#ifndef ARGP_FMTSTREAM_USE_LINEWRAP
|
#ifndef ARGP_FMTSTREAM_USE_LINEWRAP
|
||||||
|
|
||||||
|
@ -118,37 +119,16 @@ weak_alias (__argp_fmtstream_free, argp_fmtstream_free)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
size_t
|
/* Return the pointer to the first character that doesn't fit in l columns. */
|
||||||
__argp_get_display_len (const char *beg, const char *end)
|
static inline const ptrdiff_t
|
||||||
|
add_width (const char *ptr, const char *end, size_t l)
|
||||||
{
|
{
|
||||||
const char *ptr;
|
|
||||||
size_t r = 0;
|
|
||||||
mbstate_t ps;
|
mbstate_t ps;
|
||||||
|
const char *ptr0 = ptr;
|
||||||
|
|
||||||
memset (&ps, 0, sizeof (ps));
|
memset (&ps, 0, sizeof (ps));
|
||||||
|
|
||||||
for (ptr = beg; ptr < end && *ptr; )
|
while (ptr < end)
|
||||||
{
|
|
||||||
wchar_t wc;
|
|
||||||
size_t s;
|
|
||||||
|
|
||||||
s = mbrtowc (&wc, ptr, end - ptr, &ps);
|
|
||||||
if (s == (size_t) -1)
|
|
||||||
break;
|
|
||||||
r += wcwidth (wc);
|
|
||||||
ptr += s;
|
|
||||||
}
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline char *
|
|
||||||
add_length (char *ptr, char *end, size_t l)
|
|
||||||
{
|
|
||||||
mbstate_t ps;
|
|
||||||
|
|
||||||
memset (&ps, 0, sizeof (ps));
|
|
||||||
|
|
||||||
while (ptr < end && *ptr)
|
|
||||||
{
|
{
|
||||||
wchar_t wc;
|
wchar_t wc;
|
||||||
size_t s, k;
|
size_t s, k;
|
||||||
|
@ -156,13 +136,31 @@ add_length (char *ptr, char *end, size_t l)
|
||||||
s = mbrtowc (&wc, ptr, end - ptr, &ps);
|
s = mbrtowc (&wc, ptr, end - ptr, &ps);
|
||||||
if (s == (size_t) -1)
|
if (s == (size_t) -1)
|
||||||
break;
|
break;
|
||||||
|
if (s == (size_t) -2)
|
||||||
|
{
|
||||||
|
if (1 >= l)
|
||||||
|
break;
|
||||||
|
l--;
|
||||||
|
ptr++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (wc == '\e' && ptr + 3 < end
|
||||||
|
&& ptr[1] == '[' && (ptr[2] == '0' || ptr[2] == '1')
|
||||||
|
&& ptr[3] == 'm')
|
||||||
|
{
|
||||||
|
ptr += 4;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
k = wcwidth (wc);
|
k = wcwidth (wc);
|
||||||
|
|
||||||
if (k >= l)
|
if (k >= l)
|
||||||
break;
|
break;
|
||||||
l -= k;
|
l -= k;
|
||||||
ptr += s;
|
ptr += s;
|
||||||
}
|
}
|
||||||
return ptr;
|
return ptr - ptr0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Process FS's buffer so that line wrapping is done from POINT_OFFS to the
|
/* Process FS's buffer so that line wrapping is done from POINT_OFFS to the
|
||||||
|
@ -217,15 +215,15 @@ __argp_fmtstream_update (argp_fmtstream_t fs)
|
||||||
|
|
||||||
if (!nl)
|
if (!nl)
|
||||||
{
|
{
|
||||||
size_t display_len = __argp_get_display_len (buf, fs->p);
|
size_t display_width = mbsnwidth (buf, fs->p - buf, MBSW_STOP_AT_NUL);
|
||||||
/* The buffer ends in a partial line. */
|
/* The buffer ends in a partial line. */
|
||||||
|
|
||||||
if (fs->point_col + display_len < fs->rmargin)
|
if (fs->point_col + display_width < fs->rmargin)
|
||||||
{
|
{
|
||||||
/* The remaining buffer text is a partial line and fits
|
/* The remaining buffer text is a partial line and fits
|
||||||
within the maximum line width. Advance point for the
|
within the maximum line width. Advance point for the
|
||||||
characters to be written and stop scanning. */
|
characters to be written and stop scanning. */
|
||||||
fs->point_col += display_len;
|
fs->point_col += display_width;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -235,8 +233,8 @@ __argp_fmtstream_update (argp_fmtstream_t fs)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
size_t display_len = __argp_get_display_len (buf, nl);
|
size_t display_width = mbsnwidth (buf, nl - buf, MBSW_STOP_AT_NUL);
|
||||||
if (display_len < (ssize_t) fs->rmargin)
|
if (display_width < (ssize_t) fs->rmargin)
|
||||||
{
|
{
|
||||||
/* The buffer contains a full line that fits within the maximum
|
/* The buffer contains a full line that fits within the maximum
|
||||||
line width. Reset point and scan the next line. */
|
line width. Reset point and scan the next line. */
|
||||||
|
@ -280,7 +278,7 @@ __argp_fmtstream_update (argp_fmtstream_t fs)
|
||||||
char *p, *nextline;
|
char *p, *nextline;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
p = add_length (buf, fs->p, (r + 1 - fs->point_col));
|
p = buf + add_width (buf, fs->p, (r + 1 - fs->point_col));
|
||||||
while (p >= buf && !isblank ((unsigned char) *p))
|
while (p >= buf && !isblank ((unsigned char) *p))
|
||||||
--p;
|
--p;
|
||||||
nextline = p + 1; /* This will begin the next line. */
|
nextline = p + 1; /* This will begin the next line. */
|
||||||
|
@ -298,7 +296,7 @@ __argp_fmtstream_update (argp_fmtstream_t fs)
|
||||||
{
|
{
|
||||||
/* A single word that is greater than the maximum line width.
|
/* A single word that is greater than the maximum line width.
|
||||||
Oh well. Put it on an overlong line by itself. */
|
Oh well. Put it on an overlong line by itself. */
|
||||||
p = add_length (buf, fs->p, (r + 1 - fs->point_col));
|
p = buf + add_width (buf, fs->p, (r + 1 - fs->point_col));
|
||||||
/* Find the end of the long word. */
|
/* Find the end of the long word. */
|
||||||
if (p < nl)
|
if (p < nl)
|
||||||
do
|
do
|
||||||
|
@ -332,7 +330,8 @@ __argp_fmtstream_update (argp_fmtstream_t fs)
|
||||||
&& fs->p > nextline)
|
&& fs->p > nextline)
|
||||||
{
|
{
|
||||||
/* The margin needs more blanks than we removed. */
|
/* The margin needs more blanks than we removed. */
|
||||||
if (__argp_get_display_len (fs->p, fs->end) > fs->wmargin + 1)
|
if (mbsnwidth (fs->p, fs->end - fs->p, MBSW_STOP_AT_NUL)
|
||||||
|
> fs->wmargin + 1)
|
||||||
/* Make some space for them. */
|
/* Make some space for them. */
|
||||||
{
|
{
|
||||||
size_t mv = fs->p - nextline;
|
size_t mv = fs->p - nextline;
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* Word-wrapping and line-truncating streams.
|
/* Word-wrapping and line-truncating streams.
|
||||||
Copyright (C) 1997, 2006-2010 Free Software Foundation, Inc.
|
Copyright (C) 1997, 2006-2013 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Written by Miles Bader <miles@gnu.ai.mit.edu>.
|
Written by Miles Bader <miles@gnu.ai.mit.edu>.
|
||||||
|
|
||||||
|
@ -16,7 +16,7 @@
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
/* This package emulates glibc `line_wrap_stream' semantics for systems that
|
/* This package emulates glibc 'line_wrap_stream' semantics for systems that
|
||||||
don't have that. If the system does have it, it is just a wrapper for
|
don't have that. If the system does have it, it is just a wrapper for
|
||||||
that. This header file is only used internally while compiling argp, and
|
that. This header file is only used internally while compiling argp, and
|
||||||
shouldn't be installed. */
|
shouldn't be installed. */
|
||||||
|
@ -28,16 +28,16 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
#ifndef __attribute__
|
|
||||||
/* The __attribute__ feature is available in gcc versions 2.5 and later.
|
/* The __attribute__ feature is available in gcc versions 2.5 and later.
|
||||||
The __-protected variants of the attributes 'format' and 'printf' are
|
The __-protected variants of the attributes 'format' and 'printf' are
|
||||||
accepted by gcc versions 2.6.4 (effectively 2.7) and later.
|
accepted by gcc versions 2.6.4 (effectively 2.7) and later.
|
||||||
We enable __attribute__ only if these are supported too, because
|
We enable _GL_ATTRIBUTE_FORMAT only if these are supported too, because
|
||||||
gnulib and libintl do '#define printf __printf__' when they override
|
gnulib and libintl do '#define printf __printf__' when they override
|
||||||
the 'printf' function. */
|
the 'printf' function. */
|
||||||
# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
|
#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
|
||||||
# define __attribute__(Spec) /* empty */
|
# define _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec))
|
||||||
# endif
|
#else
|
||||||
|
# define _GL_ATTRIBUTE_FORMAT(spec) /* empty */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (_LIBC - 0 && !defined (USE_IN_LIBIO)) \
|
#if (_LIBC - 0 && !defined (USE_IN_LIBIO)) \
|
||||||
|
@ -128,12 +128,12 @@ extern void argp_fmtstream_free (argp_fmtstream_t __fs);
|
||||||
|
|
||||||
extern ssize_t __argp_fmtstream_printf (argp_fmtstream_t __fs,
|
extern ssize_t __argp_fmtstream_printf (argp_fmtstream_t __fs,
|
||||||
const char *__fmt, ...)
|
const char *__fmt, ...)
|
||||||
__attribute__ ((__format__ (printf, 2, 3)));
|
_GL_ATTRIBUTE_FORMAT ((printf, 2, 3));
|
||||||
extern ssize_t argp_fmtstream_printf (argp_fmtstream_t __fs,
|
extern ssize_t argp_fmtstream_printf (argp_fmtstream_t __fs,
|
||||||
const char *__fmt, ...)
|
const char *__fmt, ...)
|
||||||
__attribute__ ((__format__ (printf, 2, 3)));
|
_GL_ATTRIBUTE_FORMAT ((printf, 2, 3));
|
||||||
|
|
||||||
#if _LIBC || !defined __OPTIMIZE__
|
#if _LIBC
|
||||||
extern int __argp_fmtstream_putc (argp_fmtstream_t __fs, int __ch);
|
extern int __argp_fmtstream_putc (argp_fmtstream_t __fs, int __ch);
|
||||||
extern int argp_fmtstream_putc (argp_fmtstream_t __fs, int __ch);
|
extern int argp_fmtstream_putc (argp_fmtstream_t __fs, int __ch);
|
||||||
|
|
||||||
|
@ -154,7 +154,7 @@ extern size_t argp_fmtstream_write (argp_fmtstream_t __fs,
|
||||||
#define __argp_fmtstream_rmargin argp_fmtstream_rmargin
|
#define __argp_fmtstream_rmargin argp_fmtstream_rmargin
|
||||||
#define __argp_fmtstream_wmargin argp_fmtstream_wmargin
|
#define __argp_fmtstream_wmargin argp_fmtstream_wmargin
|
||||||
|
|
||||||
#if _LIBC || !defined __OPTIMIZE__
|
#if _LIBC
|
||||||
/* Set __FS's left margin to LMARGIN and return the old value. */
|
/* Set __FS's left margin to LMARGIN and return the old value. */
|
||||||
extern size_t argp_fmtstream_set_lmargin (argp_fmtstream_t __fs,
|
extern size_t argp_fmtstream_set_lmargin (argp_fmtstream_t __fs,
|
||||||
size_t __lmargin);
|
size_t __lmargin);
|
||||||
|
@ -184,7 +184,7 @@ extern void __argp_fmtstream_update (argp_fmtstream_t __fs);
|
||||||
extern int _argp_fmtstream_ensure (argp_fmtstream_t __fs, size_t __amount);
|
extern int _argp_fmtstream_ensure (argp_fmtstream_t __fs, size_t __amount);
|
||||||
extern int __argp_fmtstream_ensure (argp_fmtstream_t __fs, size_t __amount);
|
extern int __argp_fmtstream_ensure (argp_fmtstream_t __fs, size_t __amount);
|
||||||
|
|
||||||
#ifdef __OPTIMIZE__
|
#if !_LIBC || defined __OPTIMIZE__
|
||||||
/* Inline versions of above routines. */
|
/* Inline versions of above routines. */
|
||||||
|
|
||||||
#if !_LIBC
|
#if !_LIBC
|
||||||
|
@ -197,6 +197,10 @@ extern int __argp_fmtstream_ensure (argp_fmtstream_t __fs, size_t __amount);
|
||||||
#define __argp_fmtstream_point argp_fmtstream_point
|
#define __argp_fmtstream_point argp_fmtstream_point
|
||||||
#define __argp_fmtstream_update _argp_fmtstream_update
|
#define __argp_fmtstream_update _argp_fmtstream_update
|
||||||
#define __argp_fmtstream_ensure _argp_fmtstream_ensure
|
#define __argp_fmtstream_ensure _argp_fmtstream_ensure
|
||||||
|
_GL_INLINE_HEADER_BEGIN
|
||||||
|
#ifndef ARGP_FS_EI
|
||||||
|
# define ARGP_FS_EI _GL_INLINE
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef ARGP_FS_EI
|
#ifndef ARGP_FS_EI
|
||||||
|
@ -335,9 +339,6 @@ __argp_fmtstream_point (argp_fmtstream_t __fs)
|
||||||
return __fs->point_col >= 0 ? __fs->point_col : 0;
|
return __fs->point_col >= 0 ? __fs->point_col : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t
|
|
||||||
__argp_get_display_len (const char *beg, const char *end);
|
|
||||||
|
|
||||||
#if !_LIBC
|
#if !_LIBC
|
||||||
#undef __argp_fmtstream_putc
|
#undef __argp_fmtstream_putc
|
||||||
#undef __argp_fmtstream_puts
|
#undef __argp_fmtstream_puts
|
||||||
|
@ -348,9 +349,10 @@ __argp_get_display_len (const char *beg, const char *end);
|
||||||
#undef __argp_fmtstream_point
|
#undef __argp_fmtstream_point
|
||||||
#undef __argp_fmtstream_update
|
#undef __argp_fmtstream_update
|
||||||
#undef __argp_fmtstream_ensure
|
#undef __argp_fmtstream_ensure
|
||||||
|
_GL_INLINE_HEADER_END
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* __OPTIMIZE__ */
|
#endif /* !_LIBC || __OPTIMIZE__ */
|
||||||
|
|
||||||
#endif /* ARGP_FMTSTREAM_USE_LINEWRAP */
|
#endif /* ARGP_FMTSTREAM_USE_LINEWRAP */
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* Real definitions for extern inline functions in argp-fmtstream.h
|
/* Real definitions for extern inline functions in argp-fmtstream.h
|
||||||
Copyright (C) 1997, 2003, 2004, 2009, 2010 Free Software Foundation, Inc.
|
Copyright (C) 1997, 2003-2004, 2009-2013 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Written by Miles Bader <miles@gnu.ai.mit.edu>.
|
Written by Miles Bader <miles@gnu.ai.mit.edu>.
|
||||||
|
|
||||||
|
@ -20,7 +20,11 @@
|
||||||
# include <config.h>
|
# include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define ARGP_FS_EI
|
#ifdef _LIBC
|
||||||
|
# define ARGP_FS_EI
|
||||||
|
#else
|
||||||
|
# define ARGP_FS_EI _GL_EXTERN_INLINE
|
||||||
|
#endif
|
||||||
#undef __OPTIMIZE__
|
#undef __OPTIMIZE__
|
||||||
#define __OPTIMIZE__ 1
|
#define __OPTIMIZE__ 1
|
||||||
#include "argp-fmtstream.h"
|
#include "argp-fmtstream.h"
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* Hierarchial argument parsing help output
|
/* Hierarchical argument parsing help output
|
||||||
Copyright (C) 1995-2005, 2007, 2009-2010 Free Software Foundation, Inc.
|
Copyright (C) 1995-2005, 2007, 2009-2013 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Written by Miles Bader <miles@gnu.ai.mit.edu>.
|
Written by Miles Bader <miles@gnu.ai.mit.edu>.
|
||||||
|
|
||||||
|
@ -29,6 +29,7 @@
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <strings.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
@ -49,6 +50,7 @@
|
||||||
#include "argp.h"
|
#include "argp.h"
|
||||||
#include "argp-fmtstream.h"
|
#include "argp-fmtstream.h"
|
||||||
#include "argp-namefrob.h"
|
#include "argp-namefrob.h"
|
||||||
|
#include "mbswidth.h"
|
||||||
|
|
||||||
#ifndef SIZE_MAX
|
#ifndef SIZE_MAX
|
||||||
# define SIZE_MAX ((size_t) -1)
|
# define SIZE_MAX ((size_t) -1)
|
||||||
|
@ -56,7 +58,7 @@
|
||||||
|
|
||||||
/* User-selectable (using an environment variable) formatting parameters.
|
/* User-selectable (using an environment variable) formatting parameters.
|
||||||
|
|
||||||
These may be specified in an environment variable called `ARGP_HELP_FMT',
|
These may be specified in an environment variable called 'ARGP_HELP_FMT',
|
||||||
with a contents like: VAR1=VAL1,VAR2=VAL2,BOOLVAR2,no-BOOLVAR2
|
with a contents like: VAR1=VAL1,VAR2=VAL2,BOOLVAR2,no-BOOLVAR2
|
||||||
Where VALn must be a positive integer. The list of variables is in the
|
Where VALn must be a positive integer. The list of variables is in the
|
||||||
UPARAM_NAMES vector, below. */
|
UPARAM_NAMES vector, below. */
|
||||||
|
@ -73,13 +75,13 @@
|
||||||
#define RMARGIN 79 /* right margin used for wrapping */
|
#define RMARGIN 79 /* right margin used for wrapping */
|
||||||
|
|
||||||
/* User-selectable (using an environment variable) formatting parameters.
|
/* User-selectable (using an environment variable) formatting parameters.
|
||||||
They must all be of type `int' for the parsing code to work. */
|
They must all be of type 'int' for the parsing code to work. */
|
||||||
struct uparams
|
struct uparams
|
||||||
{
|
{
|
||||||
/* If true, arguments for an option are shown with both short and long
|
/* If true, arguments for an option are shown with both short and long
|
||||||
options, even when a given option has both, e.g. `-x ARG, --longx=ARG'.
|
options, even when a given option has both, e.g. '-x ARG, --longx=ARG'.
|
||||||
If false, then if an option has both, the argument is only shown with
|
If false, then if an option has both, the argument is only shown with
|
||||||
the long one, e.g., `-x, --longx=ARG', and a message indicating that
|
the long one, e.g., '-x, --longx=ARG', and a message indicating that
|
||||||
this really means both is printed below the options. */
|
this really means both is printed below the options. */
|
||||||
int dup_args;
|
int dup_args;
|
||||||
|
|
||||||
|
@ -111,7 +113,7 @@ static struct uparams uparams = {
|
||||||
struct uparam_name
|
struct uparam_name
|
||||||
{
|
{
|
||||||
const char *name; /* User name. */
|
const char *name; /* User name. */
|
||||||
int is_bool; /* Whether it's `boolean'. */
|
int is_bool; /* Whether it's 'boolean'. */
|
||||||
size_t uparams_offs; /* Location of the (int) field in UPARAMS. */
|
size_t uparams_offs; /* Location of the (int) field in UPARAMS. */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -154,7 +156,7 @@ ARGP_HELP_FMT: %s value is less than or equal to %s"),
|
||||||
uparams.valid = 1;
|
uparams.valid = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Read user options from the environment, and fill in UPARAMS appropiately. */
|
/* Read user options from the environment, and fill in UPARAMS appropriately. */
|
||||||
static void
|
static void
|
||||||
fill_in_uparams (const struct argp_state *state)
|
fill_in_uparams (const struct argp_state *state)
|
||||||
{
|
{
|
||||||
|
@ -259,7 +261,7 @@ fill_in_uparams (const struct argp_state *state)
|
||||||
/* Returns true if OPT is an alias for an earlier option. */
|
/* Returns true if OPT is an alias for an earlier option. */
|
||||||
#define oalias(opt) ((opt)->flags & OPTION_ALIAS)
|
#define oalias(opt) ((opt)->flags & OPTION_ALIAS)
|
||||||
|
|
||||||
/* Returns true if OPT is an documentation-only entry. */
|
/* Returns true if OPT is a documentation-only entry. */
|
||||||
#define odoc(opt) ((opt)->flags & OPTION_DOC)
|
#define odoc(opt) ((opt)->flags & OPTION_DOC)
|
||||||
|
|
||||||
/* Returns true if OPT should not be translated */
|
/* Returns true if OPT should not be translated */
|
||||||
|
@ -277,11 +279,11 @@ fill_in_uparams (const struct argp_state *state)
|
||||||
-xARG, -yARG, --long1=ARG, --long2=ARG Documentation...
|
-xARG, -yARG, --long1=ARG, --long2=ARG Documentation...
|
||||||
|
|
||||||
Where ARG will be omitted if there's no argument, for this option, or
|
Where ARG will be omitted if there's no argument, for this option, or
|
||||||
will be surrounded by "[" and "]" appropiately if the argument is
|
will be surrounded by "[" and "]" appropriately if the argument is
|
||||||
optional. The documentation string is word-wrapped appropiately, and if
|
optional. The documentation string is word-wrapped appropriately, and if
|
||||||
the list of options is long enough, it will be started on a separate line.
|
the list of options is long enough, it will be started on a separate line.
|
||||||
If there are no short options for a given option, the first long option is
|
If there are no short options for a given option, the first long option is
|
||||||
indented slighly in a way that's supposed to make most long options appear
|
indented slightly in a way that's supposed to make most long options appear
|
||||||
to be in a separate column.
|
to be in a separate column.
|
||||||
|
|
||||||
For example, the following output (from ps):
|
For example, the following output (from ps):
|
||||||
|
@ -359,7 +361,7 @@ struct hol_entry
|
||||||
/* A pointers into the HOL's short_options field, to the first short option
|
/* A pointers into the HOL's short_options field, to the first short option
|
||||||
letter for this entry. The order of the characters following this point
|
letter for this entry. The order of the characters following this point
|
||||||
corresponds to the order of options pointed to by OPT, and there are at
|
corresponds to the order of options pointed to by OPT, and there are at
|
||||||
most NUM. A short option recorded in a option following OPT is only
|
most NUM. A short option recorded in an option following OPT is only
|
||||||
valid if it occurs in the right place in SHORT_OPTIONS (otherwise it's
|
valid if it occurs in the right place in SHORT_OPTIONS (otherwise it's
|
||||||
probably been shadowed by some other entry). */
|
probably been shadowed by some other entry). */
|
||||||
char *short_options;
|
char *short_options;
|
||||||
|
@ -570,7 +572,9 @@ hol_entry_short_iterate (const struct hol_entry *entry,
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
|
#if __GNUC__ >= 3
|
||||||
__attribute__ ((always_inline))
|
__attribute__ ((always_inline))
|
||||||
|
#endif
|
||||||
hol_entry_long_iterate (const struct hol_entry *entry,
|
hol_entry_long_iterate (const struct hol_entry *entry,
|
||||||
int (*func)(const struct argp_option *opt,
|
int (*func)(const struct argp_option *opt,
|
||||||
const struct argp_option *real,
|
const struct argp_option *real,
|
||||||
|
@ -711,7 +715,7 @@ hol_cluster_is_child (const struct hol_cluster *cl1,
|
||||||
return cl1 == cl2;
|
return cl1 == cl2;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Given the name of a OPTION_DOC option, modifies NAME to start at the tail
|
/* Given the name of an OPTION_DOC option, modifies NAME to start at the tail
|
||||||
that should be used for comparisons, and returns true iff it should be
|
that should be used for comparisons, and returns true iff it should be
|
||||||
treated as a non-option. */
|
treated as a non-option. */
|
||||||
static int
|
static int
|
||||||
|
@ -726,7 +730,7 @@ canon_doc_option (const char **name)
|
||||||
/* Skip initial whitespace. */
|
/* Skip initial whitespace. */
|
||||||
while (isspace ((unsigned char) **name))
|
while (isspace ((unsigned char) **name))
|
||||||
(*name)++;
|
(*name)++;
|
||||||
/* Decide whether this looks like an option (leading `-') or not. */
|
/* Decide whether this looks like an option (leading '-') or not. */
|
||||||
non_opt = (**name != '-');
|
non_opt = (**name != '-');
|
||||||
/* Skip until part of name used for sorting. */
|
/* Skip until part of name used for sorting. */
|
||||||
while (**name && !isalnum ((unsigned char) **name))
|
while (**name && !isalnum ((unsigned char) **name))
|
||||||
|
@ -751,9 +755,9 @@ hol_entry_cmp (const struct hol_entry *entry1,
|
||||||
if (entry1->cluster != entry2->cluster)
|
if (entry1->cluster != entry2->cluster)
|
||||||
{
|
{
|
||||||
/* The entries are not within the same cluster, so we can't compare them
|
/* The entries are not within the same cluster, so we can't compare them
|
||||||
directly, we have to use the appropiate clustering level too. */
|
directly, we have to use the appropriate clustering level too. */
|
||||||
if (! entry1->cluster)
|
if (! entry1->cluster)
|
||||||
/* ENTRY1 is at the `base level', not in a cluster, so we have to
|
/* ENTRY1 is at the "base level", not in a cluster, so we have to
|
||||||
compare it's group number with that of the base cluster in which
|
compare it's group number with that of the base cluster in which
|
||||||
ENTRY2 resides. Note that if they're in the same group, the
|
ENTRY2 resides. Note that if they're in the same group, the
|
||||||
clustered option always comes laster. */
|
clustered option always comes laster. */
|
||||||
|
@ -783,7 +787,7 @@ hol_entry_cmp (const struct hol_entry *entry1,
|
||||||
doc2 = canon_doc_option (&long2);
|
doc2 = canon_doc_option (&long2);
|
||||||
|
|
||||||
if (doc1 != doc2)
|
if (doc1 != doc2)
|
||||||
/* `documentation' options always follow normal options (or
|
/* "documentation" options always follow normal options (or
|
||||||
documentation options that *look* like normal options). */
|
documentation options that *look* like normal options). */
|
||||||
return doc1 - doc2;
|
return doc1 - doc2;
|
||||||
else if (!short1 && !short2 && long1 && long2)
|
else if (!short1 && !short2 && long1 && long2)
|
||||||
|
@ -889,7 +893,8 @@ hol_append (struct hol *hol, struct hol *more)
|
||||||
|
|
||||||
/* Fix up the short options pointers from HOL. */
|
/* Fix up the short options pointers from HOL. */
|
||||||
for (e = entries, left = hol->num_entries; left > 0; e++, left--)
|
for (e = entries, left = hol->num_entries; left > 0; e++, left--)
|
||||||
e->short_options += (short_options - hol->short_options);
|
e->short_options =
|
||||||
|
short_options + (e->short_options - hol->short_options);
|
||||||
|
|
||||||
/* Now add the short options from MORE, fixing up its entries
|
/* Now add the short options from MORE, fixing up its entries
|
||||||
too. */
|
too. */
|
||||||
|
@ -1020,7 +1025,7 @@ filter_doc (const char *doc, int key, const struct argp *argp,
|
||||||
return doc;
|
return doc;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Prints STR as a header line, with the margin lines set appropiately, and
|
/* Prints STR as a header line, with the margin lines set appropriately, and
|
||||||
notes the fact that groups should be separated with a blank line. ARGP is
|
notes the fact that groups should be separated with a blank line. ARGP is
|
||||||
the argp that should dictate any user doc filtering to take place. Note
|
the argp that should dictate any user doc filtering to take place. Note
|
||||||
that the previous wrap margin isn't restored, but the left margin is reset
|
that the previous wrap margin isn't restored, but the left margin is reset
|
||||||
|
@ -1142,7 +1147,7 @@ hol_entry_help (struct hol_entry *entry, const struct argp_state *state,
|
||||||
|
|
||||||
/* Now, long options. */
|
/* Now, long options. */
|
||||||
if (odoc (real))
|
if (odoc (real))
|
||||||
/* A `documentation' option. */
|
/* A "documentation" option. */
|
||||||
{
|
{
|
||||||
__argp_fmtstream_set_wmargin (stream, uparams.doc_opt_col);
|
__argp_fmtstream_set_wmargin (stream, uparams.doc_opt_col);
|
||||||
for (opt = real, num = entry->num; num > 0; opt++, num--)
|
for (opt = real, num = entry->num; num > 0; opt++, num--)
|
||||||
|
@ -1436,7 +1441,7 @@ argp_args_usage (const struct argp *argp, const struct argp_state *state,
|
||||||
const char *cp = fdoc;
|
const char *cp = fdoc;
|
||||||
nl = __strchrnul (cp, '\n');
|
nl = __strchrnul (cp, '\n');
|
||||||
if (*nl != '\0')
|
if (*nl != '\0')
|
||||||
/* This is a `multi-level' args doc; advance to the correct position
|
/* This is a "multi-level" args doc; advance to the correct position
|
||||||
as determined by our state in LEVELS, and update LEVELS. */
|
as determined by our state in LEVELS, and update LEVELS. */
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
@ -1448,7 +1453,7 @@ argp_args_usage (const struct argp *argp, const struct argp_state *state,
|
||||||
|
|
||||||
/* Manually do line wrapping so that it (probably) won't get wrapped at
|
/* Manually do line wrapping so that it (probably) won't get wrapped at
|
||||||
any embedded spaces. */
|
any embedded spaces. */
|
||||||
space (stream, 1 + __argp_get_display_len (cp, nl));
|
space (stream, 1 + mbsnwidth (cp, nl - cp, MBSW_STOP_AT_NUL));
|
||||||
|
|
||||||
__argp_fmtstream_write (stream, cp, nl - cp);
|
__argp_fmtstream_write (stream, cp, nl - cp);
|
||||||
}
|
}
|
||||||
|
@ -1477,9 +1482,9 @@ argp_args_usage (const struct argp *argp, const struct argp_state *state,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Print the documentation for ARGP to STREAM; if POST is false, then
|
/* Print the documentation for ARGP to STREAM; if POST is false, then
|
||||||
everything preceeding a `\v' character in the documentation strings (or
|
everything preceding a '\v' character in the documentation strings (or
|
||||||
the whole string, for those with none) is printed, otherwise, everything
|
the whole string, for those with none) is printed, otherwise, everything
|
||||||
following the `\v' character (nothing for strings without). Each separate
|
following the '\v' character (nothing for strings without). Each separate
|
||||||
bit of documentation is separated a blank line, and if PRE_BLANK is true,
|
bit of documentation is separated a blank line, and if PRE_BLANK is true,
|
||||||
then the first is as well. If FIRST_ONLY is true, only the first
|
then the first is as well. If FIRST_ONLY is true, only the first
|
||||||
occurrence is output. Returns true if anything was output. */
|
occurrence is output. Returns true if anything was output. */
|
||||||
|
@ -1549,7 +1554,7 @@ argp_doc (const struct argp *argp, const struct argp_state *state,
|
||||||
free ((char *) inp_text); /* We copied INP_TEXT, so free it now. */
|
free ((char *) inp_text); /* We copied INP_TEXT, so free it now. */
|
||||||
|
|
||||||
if (post && argp->help_filter)
|
if (post && argp->help_filter)
|
||||||
/* Now see if we have to output a ARGP_KEY_HELP_EXTRA text. */
|
/* Now see if we have to output an ARGP_KEY_HELP_EXTRA text. */
|
||||||
{
|
{
|
||||||
text = (*argp->help_filter) (ARGP_KEY_HELP_EXTRA, 0, input);
|
text = (*argp->help_filter) (ARGP_KEY_HELP_EXTRA, 0, input);
|
||||||
if (text)
|
if (text)
|
||||||
|
@ -1576,8 +1581,8 @@ argp_doc (const struct argp *argp, const struct argp_state *state,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Output a usage message for ARGP to STREAM. If called from
|
/* Output a usage message for ARGP to STREAM. If called from
|
||||||
argp_state_help, STATE is the relevent parsing state. FLAGS are from the
|
argp_state_help, STATE is the relevant parsing state. FLAGS are from the
|
||||||
set ARGP_HELP_*. NAME is what to use wherever a `program name' is
|
set ARGP_HELP_*. NAME is what to use wherever a "program name" is
|
||||||
needed. */
|
needed. */
|
||||||
static void
|
static void
|
||||||
_help (const struct argp *argp, const struct argp_state *state, FILE *stream,
|
_help (const struct argp *argp, const struct argp_state *state, FILE *stream,
|
||||||
|
@ -1618,7 +1623,7 @@ _help (const struct argp *argp, const struct argp_state *state, FILE *stream,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (flags & (ARGP_HELP_USAGE | ARGP_HELP_SHORT_USAGE))
|
if (flags & (ARGP_HELP_USAGE | ARGP_HELP_SHORT_USAGE))
|
||||||
/* Print a short `Usage:' message. */
|
/* Print a short "Usage:" message. */
|
||||||
{
|
{
|
||||||
int first_pattern = 1, more_patterns;
|
int first_pattern = 1, more_patterns;
|
||||||
size_t num_pattern_levels = argp_args_levels (argp);
|
size_t num_pattern_levels = argp_args_levels (argp);
|
||||||
|
@ -1678,7 +1683,7 @@ _help (const struct argp *argp, const struct argp_state *state, FILE *stream,
|
||||||
if (flags & ARGP_HELP_SEE)
|
if (flags & ARGP_HELP_SEE)
|
||||||
{
|
{
|
||||||
__argp_fmtstream_printf (fs, dgettext (argp->argp_domain, "\
|
__argp_fmtstream_printf (fs, dgettext (argp->argp_domain, "\
|
||||||
Try `%s --help' or `%s --usage' for more information.\n"),
|
Try '%s --help' or '%s --usage' for more information.\n"),
|
||||||
name, name);
|
name, name);
|
||||||
anything = 1;
|
anything = 1;
|
||||||
}
|
}
|
||||||
|
@ -1721,7 +1726,7 @@ Try `%s --help' or `%s --usage' for more information.\n"),
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Output a usage message for ARGP to STREAM. FLAGS are from the set
|
/* Output a usage message for ARGP to STREAM. FLAGS are from the set
|
||||||
ARGP_HELP_*. NAME is what to use wherever a `program name' is needed. */
|
ARGP_HELP_*. NAME is what to use wherever a "program name" is needed. */
|
||||||
void __argp_help (const struct argp *argp, FILE *stream,
|
void __argp_help (const struct argp *argp, FILE *stream,
|
||||||
unsigned flags, char *name)
|
unsigned flags, char *name)
|
||||||
{
|
{
|
||||||
|
@ -1779,7 +1784,7 @@ weak_alias (__argp_state_help, argp_state_help)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* If appropriate, print the printf string FMT and following args, preceded
|
/* If appropriate, print the printf string FMT and following args, preceded
|
||||||
by the program name and `:', to stderr, and followed by a `Try ... --help'
|
by the program name and ':', to stderr, and followed by a "Try ... --help"
|
||||||
message, then exit (1). */
|
message, then exit (1). */
|
||||||
void
|
void
|
||||||
__argp_error (const struct argp_state *state, const char *fmt, ...)
|
__argp_error (const struct argp_state *state, const char *fmt, ...)
|
||||||
|
@ -1915,7 +1920,7 @@ __argp_failure (const struct argp_state *state, int status, int errnum,
|
||||||
char const *s = NULL;
|
char const *s = NULL;
|
||||||
putc_unlocked (':', stream);
|
putc_unlocked (':', stream);
|
||||||
putc_unlocked (' ', stream);
|
putc_unlocked (' ', stream);
|
||||||
#if _LIBC || (HAVE_DECL_STRERROR_R && STRERROR_R_CHAR_P)
|
#if _LIBC || (HAVE_DECL_STRERROR_R && STRERROR_R_CHAR_P && !defined strerror_r)
|
||||||
s = __strerror_r (errnum, buf, sizeof buf);
|
s = __strerror_r (errnum, buf, sizeof buf);
|
||||||
#elif HAVE_DECL_STRERROR_R
|
#elif HAVE_DECL_STRERROR_R
|
||||||
if (__strerror_r (errnum, buf, sizeof buf) == 0)
|
if (__strerror_r (errnum, buf, sizeof buf) == 0)
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* Name frobnication for compiling argp outside of glibc
|
/* Name frobnication for compiling argp outside of glibc
|
||||||
Copyright (C) 1997, 2003, 2007, 2009, 2010 Free Software Foundation, Inc.
|
Copyright (C) 1997, 2003, 2007, 2009-2013 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Written by Miles Bader <miles@gnu.ai.mit.edu>.
|
Written by Miles Bader <miles@gnu.ai.mit.edu>.
|
||||||
|
|
||||||
|
@ -100,45 +100,45 @@
|
||||||
#endif
|
#endif
|
||||||
#if defined(HAVE_DECL_FEOF_UNLOCKED) && !HAVE_DECL_FEOF_UNLOCKED
|
#if defined(HAVE_DECL_FEOF_UNLOCKED) && !HAVE_DECL_FEOF_UNLOCKED
|
||||||
# define feof_unlocked(x) feof (x)
|
# define feof_unlocked(x) feof (x)
|
||||||
# endif
|
#endif
|
||||||
#if defined(HAVE_DECL_FERROR_UNLOCKED) && !HAVE_DECL_FERROR_UNLOCKED
|
#if defined(HAVE_DECL_FERROR_UNLOCKED) && !HAVE_DECL_FERROR_UNLOCKED
|
||||||
# define ferror_unlocked(x) ferror (x)
|
# define ferror_unlocked(x) ferror (x)
|
||||||
# endif
|
#endif
|
||||||
#if defined(HAVE_DECL_FFLUSH_UNLOCKED) && !HAVE_DECL_FFLUSH_UNLOCKED
|
#if defined(HAVE_DECL_FFLUSH_UNLOCKED) && !HAVE_DECL_FFLUSH_UNLOCKED
|
||||||
# define fflush_unlocked(x) fflush (x)
|
# define fflush_unlocked(x) fflush (x)
|
||||||
# endif
|
#endif
|
||||||
#if defined(HAVE_DECL_FGETS_UNLOCKED) && !HAVE_DECL_FGETS_UNLOCKED
|
#if defined(HAVE_DECL_FGETS_UNLOCKED) && !HAVE_DECL_FGETS_UNLOCKED
|
||||||
# define fgets_unlocked(x,y,z) fgets (x,y,z)
|
# define fgets_unlocked(x,y,z) fgets (x,y,z)
|
||||||
# endif
|
#endif
|
||||||
#if defined(HAVE_DECL_FPUTC_UNLOCKED) && !HAVE_DECL_FPUTC_UNLOCKED
|
#if defined(HAVE_DECL_FPUTC_UNLOCKED) && !HAVE_DECL_FPUTC_UNLOCKED
|
||||||
# define fputc_unlocked(x,y) fputc (x,y)
|
# define fputc_unlocked(x,y) fputc (x,y)
|
||||||
# endif
|
#endif
|
||||||
#if defined(HAVE_DECL_FPUTS_UNLOCKED) && !HAVE_DECL_FPUTS_UNLOCKED
|
#if defined(HAVE_DECL_FPUTS_UNLOCKED) && !HAVE_DECL_FPUTS_UNLOCKED
|
||||||
# define fputs_unlocked(x,y) fputs (x,y)
|
# define fputs_unlocked(x,y) fputs (x,y)
|
||||||
# endif
|
#endif
|
||||||
#if defined(HAVE_DECL_FREAD_UNLOCKED) && !HAVE_DECL_FREAD_UNLOCKED
|
#if defined(HAVE_DECL_FREAD_UNLOCKED) && !HAVE_DECL_FREAD_UNLOCKED
|
||||||
# define fread_unlocked(w,x,y,z) fread (w,x,y,z)
|
# define fread_unlocked(w,x,y,z) fread (w,x,y,z)
|
||||||
# endif
|
#endif
|
||||||
#if defined(HAVE_DECL_FWRITE_UNLOCKED) && !HAVE_DECL_FWRITE_UNLOCKED
|
#if defined(HAVE_DECL_FWRITE_UNLOCKED) && !HAVE_DECL_FWRITE_UNLOCKED
|
||||||
# define fwrite_unlocked(w,x,y,z) fwrite (w,x,y,z)
|
# define fwrite_unlocked(w,x,y,z) fwrite (w,x,y,z)
|
||||||
# endif
|
#endif
|
||||||
#if defined(HAVE_DECL_GETC_UNLOCKED) && !HAVE_DECL_GETC_UNLOCKED
|
#if defined(HAVE_DECL_GETC_UNLOCKED) && !HAVE_DECL_GETC_UNLOCKED
|
||||||
# define getc_unlocked(x) getc (x)
|
# define getc_unlocked(x) getc (x)
|
||||||
# endif
|
#endif
|
||||||
#if defined(HAVE_DECL_GETCHAR_UNLOCKED) && !HAVE_DECL_GETCHAR_UNLOCKED
|
#if defined(HAVE_DECL_GETCHAR_UNLOCKED) && !HAVE_DECL_GETCHAR_UNLOCKED
|
||||||
# define getchar_unlocked() getchar ()
|
# define getchar_unlocked() getchar ()
|
||||||
# endif
|
#endif
|
||||||
#if defined(HAVE_DECL_PUTC_UNLOCKED) && !HAVE_DECL_PUTC_UNLOCKED
|
#if defined(HAVE_DECL_PUTC_UNLOCKED) && !HAVE_DECL_PUTC_UNLOCKED
|
||||||
# define putc_unlocked(x,y) putc (x,y)
|
# define putc_unlocked(x,y) putc (x,y)
|
||||||
# endif
|
#endif
|
||||||
#if defined(HAVE_DECL_PUTCHAR_UNLOCKED) && !HAVE_DECL_PUTCHAR_UNLOCKED
|
#if defined(HAVE_DECL_PUTCHAR_UNLOCKED) && !HAVE_DECL_PUTCHAR_UNLOCKED
|
||||||
# define putchar_unlocked(x) putchar (x)
|
# define putchar_unlocked(x) putchar (x)
|
||||||
# endif
|
#endif
|
||||||
|
|
||||||
#endif /* !_LIBC */
|
#endif /* !_LIBC */
|
||||||
|
|
||||||
#ifndef __set_errno
|
#ifndef __set_errno
|
||||||
#define __set_errno(e) (errno = (e))
|
# define __set_errno(e) (errno = (e))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined GNULIB_ARGP_DISABLE_DIRNAME
|
#if defined GNULIB_ARGP_DISABLE_DIRNAME
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* Hierarchial argument parsing, layered over getopt
|
/* Hierarchical argument parsing, layered over getopt
|
||||||
Copyright (C) 1995-2000, 2002-2004, 2009-2010 Free Software Foundation, Inc.
|
Copyright (C) 1995-2000, 2002-2004, 2009-2013 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Written by Miles Bader <miles@gnu.ai.mit.edu>.
|
Written by Miles Bader <miles@gnu.ai.mit.edu>.
|
||||||
|
|
||||||
|
@ -21,6 +21,7 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <alloca.h>
|
#include <alloca.h>
|
||||||
|
#include <stdalign.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
@ -42,7 +43,6 @@
|
||||||
#include "argp.h"
|
#include "argp.h"
|
||||||
#include "argp-namefrob.h"
|
#include "argp-namefrob.h"
|
||||||
|
|
||||||
#define alignof(type) offsetof (struct { char c; type x; }, x)
|
|
||||||
#define alignto(n, d) ((((n) + (d) - 1) / (d)) * (d))
|
#define alignto(n, d) ((((n) + (d) - 1) / (d)) * (d))
|
||||||
|
|
||||||
/* Getopt return values. */
|
/* Getopt return values. */
|
||||||
|
@ -154,8 +154,9 @@ argp_version_parser (int key, char *arg, struct argp_state *state)
|
||||||
else if (argp_program_version)
|
else if (argp_program_version)
|
||||||
fprintf (state->out_stream, "%s\n", argp_program_version);
|
fprintf (state->out_stream, "%s\n", argp_program_version);
|
||||||
else
|
else
|
||||||
__argp_error (state, dgettext (state->root_argp->argp_domain,
|
__argp_error (state, "%s",
|
||||||
"(PROGRAM ERROR) No version known!?"));
|
dgettext (state->root_argp->argp_domain,
|
||||||
|
"(PROGRAM ERROR) No version known!?"));
|
||||||
if (! (state->flags & ARGP_NO_EXIT))
|
if (! (state->flags & ARGP_NO_EXIT))
|
||||||
exit (0);
|
exit (0);
|
||||||
break;
|
break;
|
||||||
|
@ -187,7 +188,7 @@ find_long_option (struct option *long_options, const char *name)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* The state of a `group' during parsing. Each group corresponds to a
|
/* The state of a "group" during parsing. Each group corresponds to a
|
||||||
particular argp structure from the tree of such descending from the top
|
particular argp structure from the tree of such descending from the top
|
||||||
level argp passed to argp_parse. */
|
level argp passed to argp_parse. */
|
||||||
struct group
|
struct group
|
||||||
|
@ -203,7 +204,7 @@ struct group
|
||||||
particular short options is from. */
|
particular short options is from. */
|
||||||
char *short_end;
|
char *short_end;
|
||||||
|
|
||||||
/* The number of non-option args sucessfully handled by this parser. */
|
/* The number of non-option args successfully handled by this parser. */
|
||||||
unsigned args_processed;
|
unsigned args_processed;
|
||||||
|
|
||||||
/* This group's parser's parent's group. */
|
/* This group's parser's parent's group. */
|
||||||
|
@ -254,7 +255,7 @@ struct parser
|
||||||
struct group *groups;
|
struct group *groups;
|
||||||
/* The end of the GROUPS array. */
|
/* The end of the GROUPS array. */
|
||||||
struct group *egroup;
|
struct group *egroup;
|
||||||
/* An vector containing storage for the CHILD_INPUTS field in all groups. */
|
/* A vector containing storage for the CHILD_INPUTS field in all groups. */
|
||||||
void **child_inputs;
|
void **child_inputs;
|
||||||
|
|
||||||
/* True if we think using getopt is still useful; if false, then
|
/* True if we think using getopt is still useful; if false, then
|
||||||
|
@ -385,7 +386,7 @@ convert_options (const struct argp *argp,
|
||||||
return group;
|
return group;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Find the merged set of getopt options, with keys appropiately prefixed. */
|
/* Find the merged set of getopt options, with keys appropriately prefixed. */
|
||||||
static void
|
static void
|
||||||
parser_convert (struct parser *parser, const struct argp *argp, int flags)
|
parser_convert (struct parser *parser, const struct argp *argp, int flags)
|
||||||
{
|
{
|
||||||
|
@ -439,7 +440,7 @@ calc_sizes (const struct argp *argp, struct parser_sizes *szs)
|
||||||
int num_opts = 0;
|
int num_opts = 0;
|
||||||
while (!__option_is_end (opt++))
|
while (!__option_is_end (opt++))
|
||||||
num_opts++;
|
num_opts++;
|
||||||
szs->short_len += num_opts * 3; /* opt + up to 2 `:'s */
|
szs->short_len += num_opts * 3; /* opt + up to 2 ':'s */
|
||||||
szs->long_len += num_opts;
|
szs->long_len += num_opts;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -781,7 +782,7 @@ parser_parse_next (struct parser *parser, int *arg_ebadkey)
|
||||||
|
|
||||||
if (parser->state.quoted && parser->state.next < parser->state.quoted)
|
if (parser->state.quoted && parser->state.next < parser->state.quoted)
|
||||||
/* The next argument pointer has been moved to before the quoted
|
/* The next argument pointer has been moved to before the quoted
|
||||||
region, so pretend we never saw the quoting `--', and give getopt
|
region, so pretend we never saw the quoting "--", and give getopt
|
||||||
another chance. If the user hasn't removed it, getopt will just
|
another chance. If the user hasn't removed it, getopt will just
|
||||||
process it again. */
|
process it again. */
|
||||||
parser->state.quoted = 0;
|
parser->state.quoted = 0;
|
||||||
|
@ -813,7 +814,7 @@ parser_parse_next (struct parser *parser, int *arg_ebadkey)
|
||||||
&& strcmp (parser->state.argv[parser->state.next - 1], QUOTE)
|
&& strcmp (parser->state.argv[parser->state.next - 1], QUOTE)
|
||||||
== 0)
|
== 0)
|
||||||
/* Not only is this the end of the options, but it's a
|
/* Not only is this the end of the options, but it's a
|
||||||
`quoted' region, which may have args that *look* like
|
"quoted" region, which may have args that *look* like
|
||||||
options, so we definitely shouldn't try to use getopt past
|
options, so we definitely shouldn't try to use getopt past
|
||||||
here, whatever happens. */
|
here, whatever happens. */
|
||||||
parser->state.quoted = parser->state.next;
|
parser->state.quoted = parser->state.next;
|
||||||
|
@ -879,11 +880,11 @@ __argp_parse (const struct argp *argp, int argc, char **argv, unsigned flags,
|
||||||
#ifndef _LIBC
|
#ifndef _LIBC
|
||||||
if (!(flags & ARGP_PARSE_ARGV0))
|
if (!(flags & ARGP_PARSE_ARGV0))
|
||||||
{
|
{
|
||||||
#ifdef HAVE_DECL_PROGRAM_INVOCATION_NAME
|
#if HAVE_DECL_PROGRAM_INVOCATION_NAME
|
||||||
if (!program_invocation_name)
|
if (!program_invocation_name)
|
||||||
program_invocation_name = argv[0];
|
program_invocation_name = argv[0];
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME
|
#if HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME
|
||||||
if (!program_invocation_short_name)
|
if (!program_invocation_short_name)
|
||||||
program_invocation_short_name = __argp_base_name (argv[0]);
|
program_invocation_short_name = __argp_base_name (argv[0]);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* Full and short program names for argp module
|
/* Full and short program names for argp module
|
||||||
Copyright (C) 2005, 2009, 2010 Free Software Foundation, Inc.
|
Copyright (C) 2005, 2009-2013 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -24,4 +24,3 @@ char *program_invocation_short_name = 0;
|
||||||
#ifndef HAVE_PROGRAM_INVOCATION_NAME
|
#ifndef HAVE_PROGRAM_INVOCATION_NAME
|
||||||
char *program_invocation_name = 0;
|
char *program_invocation_name = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* Default definition for ARGP_PROGRAM_VERSION.
|
/* Default definition for ARGP_PROGRAM_VERSION.
|
||||||
Copyright (C) 1996, 1997, 1999, 2006, 2009, 2010 Free Software Foundation,
|
Copyright (C) 1996-1997, 1999, 2006, 2009-2013 Free Software Foundation,
|
||||||
Inc.
|
Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Written by Miles Bader <miles@gnu.ai.mit.edu>.
|
Written by Miles Bader <miles@gnu.ai.mit.edu>.
|
||||||
|
@ -23,7 +23,7 @@
|
||||||
ARGP_NO_EXIT flag is used). Overridden by ARGP_PROGRAM_VERSION_HOOK. */
|
ARGP_NO_EXIT flag is used). Overridden by ARGP_PROGRAM_VERSION_HOOK. */
|
||||||
const char *argp_program_version
|
const char *argp_program_version
|
||||||
/* This variable should be zero-initialized. On most systems, putting it into
|
/* This variable should be zero-initialized. On most systems, putting it into
|
||||||
BSS is sufficient. Not so on MacOS X 10.3 and 10.4, see
|
BSS is sufficient. Not so on Mac OS X 10.3 and 10.4, see
|
||||||
<http://lists.gnu.org/archive/html/bug-gnulib/2009-01/msg00329.html>
|
<http://lists.gnu.org/archive/html/bug-gnulib/2009-01/msg00329.html>
|
||||||
<http://lists.gnu.org/archive/html/bug-gnulib/2009-08/msg00096.html>. */
|
<http://lists.gnu.org/archive/html/bug-gnulib/2009-08/msg00096.html>. */
|
||||||
#if defined __ELF__
|
#if defined __ELF__
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* Default definition for ARGP_PROGRAM_VERSION_HOOK.
|
/* Default definition for ARGP_PROGRAM_VERSION_HOOK.
|
||||||
Copyright (C) 1996, 1997, 1999, 2004, 2009, 2010 Free Software Foundation,
|
Copyright (C) 1996-1997, 1999, 2004, 2009-2013 Free Software Foundation,
|
||||||
Inc.
|
Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Written by Miles Bader <miles@gnu.ai.mit.edu>.
|
Written by Miles Bader <miles@gnu.ai.mit.edu>.
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* Real definitions for extern inline functions in argp.h
|
/* Real definitions for extern inline functions in argp.h
|
||||||
Copyright (C) 1997, 1998, 2004, 2009, 2010 Free Software Foundation, Inc.
|
Copyright (C) 1997-1998, 2004, 2009-2013 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Written by Miles Bader <miles@gnu.ai.mit.edu>.
|
Written by Miles Bader <miles@gnu.ai.mit.edu>.
|
||||||
|
|
||||||
|
@ -27,7 +27,11 @@
|
||||||
#ifndef __USE_EXTERN_INLINES
|
#ifndef __USE_EXTERN_INLINES
|
||||||
# define __USE_EXTERN_INLINES 1
|
# define __USE_EXTERN_INLINES 1
|
||||||
#endif
|
#endif
|
||||||
#define ARGP_EI
|
#ifdef _LIBC
|
||||||
|
# define ARGP_EI
|
||||||
|
#else
|
||||||
|
# define ARGP_EI _GL_EXTERN_INLINE
|
||||||
|
#endif
|
||||||
#undef __OPTIMIZE__
|
#undef __OPTIMIZE__
|
||||||
#define __OPTIMIZE__ 1
|
#define __OPTIMIZE__ 1
|
||||||
#include "argp.h"
|
#include "argp.h"
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* Hierarchial argument parsing, layered over getopt.
|
/* Hierarchical argument parsing, layered over getopt.
|
||||||
Copyright (C) 1995-1999, 2003-2010 Free Software Foundation, Inc.
|
Copyright (C) 1995-1999, 2003-2013 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Written by Miles Bader <miles@gnu.ai.mit.edu>.
|
Written by Miles Bader <miles@gnu.ai.mit.edu>.
|
||||||
|
|
||||||
|
@ -34,16 +34,16 @@
|
||||||
# define __NTH(fct) fct __THROW
|
# define __NTH(fct) fct __THROW
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __attribute__
|
|
||||||
/* The __attribute__ feature is available in gcc versions 2.5 and later.
|
/* The __attribute__ feature is available in gcc versions 2.5 and later.
|
||||||
The __-protected variants of the attributes 'format' and 'printf' are
|
The __-protected variants of the attributes 'format' and 'printf' are
|
||||||
accepted by gcc versions 2.6.4 (effectively 2.7) and later.
|
accepted by gcc versions 2.6.4 (effectively 2.7) and later.
|
||||||
We enable __attribute__ only if these are supported too, because
|
We enable _GL_ATTRIBUTE_FORMAT only if these are supported too, because
|
||||||
gnulib and libintl do '#define printf __printf__' when they override
|
gnulib and libintl do '#define printf __printf__' when they override
|
||||||
the 'printf' function. */
|
the 'printf' function. */
|
||||||
# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
|
#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
|
||||||
# define __attribute__(Spec) /* empty */
|
# define _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec))
|
||||||
# endif
|
#else
|
||||||
|
# define _GL_ATTRIBUTE_FORMAT(spec) /* empty */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* GCC 2.95 and later have "__restrict"; C99 compilers have
|
/* GCC 2.95 and later have "__restrict"; C99 compilers have
|
||||||
|
@ -94,7 +94,7 @@ struct argp_option
|
||||||
/* The doc string for this option. If both NAME and KEY are 0, This string
|
/* The doc string for this option. If both NAME and KEY are 0, This string
|
||||||
will be printed outdented from the normal option column, making it
|
will be printed outdented from the normal option column, making it
|
||||||
useful as a group header (it will be the first thing printed in its
|
useful as a group header (it will be the first thing printed in its
|
||||||
group); in this usage, it's conventional to end the string with a `:'.
|
group); in this usage, it's conventional to end the string with a ':'.
|
||||||
|
|
||||||
Write the initial value as N_("TEXT") if you want xgettext to collect
|
Write the initial value as N_("TEXT") if you want xgettext to collect
|
||||||
it into a POT file. */
|
it into a POT file. */
|
||||||
|
@ -124,21 +124,21 @@ struct argp_option
|
||||||
/* This option isn't actually an option (and so should be ignored by the
|
/* This option isn't actually an option (and so should be ignored by the
|
||||||
actual option parser), but rather an arbitrary piece of documentation that
|
actual option parser), but rather an arbitrary piece of documentation that
|
||||||
should be displayed in much the same manner as the options. If this flag
|
should be displayed in much the same manner as the options. If this flag
|
||||||
is set, then the option NAME field is displayed unmodified (e.g., no `--'
|
is set, then the option NAME field is displayed unmodified (e.g., no '--'
|
||||||
prefix is added) at the left-margin (where a *short* option would normally
|
prefix is added) at the left-margin (where a *short* option would normally
|
||||||
be displayed), and the documentation string in the normal place. The NAME
|
be displayed), and the documentation string in the normal place. The NAME
|
||||||
field will be translated using gettext, unless OPTION_NO_TRANS is set (see
|
field will be translated using gettext, unless OPTION_NO_TRANS is set (see
|
||||||
below). For purposes of sorting, any leading whitespace and punctuation is
|
below). For purposes of sorting, any leading whitespace and punctuation is
|
||||||
ignored, except that if the first non-whitespace character is not `-', this
|
ignored, except that if the first non-whitespace character is not '-', this
|
||||||
entry is displayed after all options (and OPTION_DOC entries with a leading
|
entry is displayed after all options (and OPTION_DOC entries with a leading
|
||||||
`-') in the same group. */
|
'-') in the same group. */
|
||||||
#define OPTION_DOC 0x8
|
#define OPTION_DOC 0x8
|
||||||
|
|
||||||
/* This option shouldn't be included in `long' usage messages (but is still
|
/* This option shouldn't be included in "long" usage messages (but is still
|
||||||
included in help messages). This is mainly intended for options that are
|
included in help messages). This is mainly intended for options that are
|
||||||
completely documented in an argp's ARGS_DOC field, in which case including
|
completely documented in an argp's ARGS_DOC field, in which case including
|
||||||
the option in the generic usage list would be redundant. For instance,
|
the option in the generic usage list would be redundant. For instance,
|
||||||
if ARGS_DOC is "FOO BAR\n-x BLAH", and the `-x' option's purpose is to
|
if ARGS_DOC is "FOO BAR\n-x BLAH", and the '-x' option's purpose is to
|
||||||
distinguish these two cases, -x should probably be marked
|
distinguish these two cases, -x should probably be marked
|
||||||
OPTION_NO_USAGE. */
|
OPTION_NO_USAGE. */
|
||||||
#define OPTION_NO_USAGE 0x10
|
#define OPTION_NO_USAGE 0x10
|
||||||
|
@ -167,7 +167,7 @@ typedef error_t (*argp_parser_t) (int key, char *arg,
|
||||||
ARGP_ERR_UNKNOWN should be returned if they aren't understood.
|
ARGP_ERR_UNKNOWN should be returned if they aren't understood.
|
||||||
|
|
||||||
The sequence of keys to a parsing function is either (where each
|
The sequence of keys to a parsing function is either (where each
|
||||||
uppercased word should be prefixed by `ARGP_KEY_' and opt is a user key):
|
uppercased word should be prefixed by 'ARGP_KEY_' and opt is a user key):
|
||||||
|
|
||||||
INIT opt... NO_ARGS END SUCCESS -- No non-option arguments at all
|
INIT opt... NO_ARGS END SUCCESS -- No non-option arguments at all
|
||||||
or INIT (opt | ARG)... END SUCCESS -- All non-option args parsed
|
or INIT (opt | ARG)... END SUCCESS -- All non-option args parsed
|
||||||
|
@ -238,15 +238,15 @@ struct argp
|
||||||
argp_parser_t parser;
|
argp_parser_t parser;
|
||||||
|
|
||||||
/* A string describing what other arguments are wanted by this program. It
|
/* A string describing what other arguments are wanted by this program. It
|
||||||
is only used by argp_usage to print the `Usage:' message. If it
|
is only used by argp_usage to print the "Usage:" message. If it
|
||||||
contains newlines, the strings separated by them are considered
|
contains newlines, the strings separated by them are considered
|
||||||
alternative usage patterns, and printed on separate lines (lines after
|
alternative usage patterns, and printed on separate lines (lines after
|
||||||
the first are prefix by ` or: ' instead of `Usage:'). */
|
the first are prefix by " or: " instead of "Usage:"). */
|
||||||
const char *args_doc;
|
const char *args_doc;
|
||||||
|
|
||||||
/* If non-NULL, a string containing extra text to be printed before and
|
/* If non-NULL, a string containing extra text to be printed before and
|
||||||
after the options in a long help message (separated by a vertical tab
|
after the options in a long help message (separated by a vertical tab
|
||||||
`\v' character).
|
'\v' character).
|
||||||
Write the initial value as N_("BEFORE-TEXT") "\v" N_("AFTER-TEXT") if
|
Write the initial value as N_("BEFORE-TEXT") "\v" N_("AFTER-TEXT") if
|
||||||
you want xgettext to collect the two pieces of text into a POT file. */
|
you want xgettext to collect the two pieces of text into a POT file. */
|
||||||
const char *doc;
|
const char *doc;
|
||||||
|
@ -265,7 +265,7 @@ struct argp
|
||||||
defines, below, describing which other help text TEXT is. The function
|
defines, below, describing which other help text TEXT is. The function
|
||||||
should return either TEXT, if it should be used as-is, a replacement
|
should return either TEXT, if it should be used as-is, a replacement
|
||||||
string, which should be malloced, and will be freed by argp, or NULL,
|
string, which should be malloced, and will be freed by argp, or NULL,
|
||||||
meaning `print nothing'. The value for TEXT is *after* any translation
|
meaning "print nothing". The value for TEXT is *after* any translation
|
||||||
has been done, so if any of the replacement text also needs translation,
|
has been done, so if any of the replacement text also needs translation,
|
||||||
that should be done by the filter function. INPUT is either the input
|
that should be done by the filter function. INPUT is either the input
|
||||||
supplied to argp_parse, or NULL, if argp_help was called directly. */
|
supplied to argp_parse, or NULL, if argp_help was called directly. */
|
||||||
|
@ -278,7 +278,7 @@ struct argp
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Possible KEY arguments to a help filter function. */
|
/* Possible KEY arguments to a help filter function. */
|
||||||
#define ARGP_KEY_HELP_PRE_DOC 0x2000001 /* Help text preceeding options. */
|
#define ARGP_KEY_HELP_PRE_DOC 0x2000001 /* Help text preceding options. */
|
||||||
#define ARGP_KEY_HELP_POST_DOC 0x2000002 /* Help text following options. */
|
#define ARGP_KEY_HELP_POST_DOC 0x2000002 /* Help text following options. */
|
||||||
#define ARGP_KEY_HELP_HEADER 0x2000003 /* Option header string. */
|
#define ARGP_KEY_HELP_HEADER 0x2000003 /* Option header string. */
|
||||||
#define ARGP_KEY_HELP_EXTRA 0x2000004 /* After all other documentation;
|
#define ARGP_KEY_HELP_EXTRA 0x2000004 /* After all other documentation;
|
||||||
|
@ -304,7 +304,7 @@ struct argp_child
|
||||||
printing a header string, use a value of "". */
|
printing a header string, use a value of "". */
|
||||||
const char *header;
|
const char *header;
|
||||||
|
|
||||||
/* Where to group the child options relative to the other (`consolidated')
|
/* Where to group the child options relative to the other ("consolidated")
|
||||||
options in the parent argp; the values are the same as the GROUP field
|
options in the parent argp; the values are the same as the GROUP field
|
||||||
in argp_option structs, but all child-groupings follow parent options at
|
in argp_option structs, but all child-groupings follow parent options at
|
||||||
a particular group level. If both this field and HEADER are zero, then
|
a particular group level. If both this field and HEADER are zero, then
|
||||||
|
@ -337,7 +337,7 @@ struct argp_state
|
||||||
unsigned arg_num;
|
unsigned arg_num;
|
||||||
|
|
||||||
/* If non-zero, the index in ARGV of the first argument following a special
|
/* If non-zero, the index in ARGV of the first argument following a special
|
||||||
`--' argument (which prevents anything following being interpreted as an
|
'--' argument (which prevents anything following being interpreted as an
|
||||||
option). Only set once argument parsing has proceeded past this point. */
|
option). Only set once argument parsing has proceeded past this point. */
|
||||||
int quoted;
|
int quoted;
|
||||||
|
|
||||||
|
@ -399,7 +399,7 @@ struct argp_state
|
||||||
/* Don't exit on errors (they may still result in error messages). */
|
/* Don't exit on errors (they may still result in error messages). */
|
||||||
#define ARGP_NO_EXIT 0x20
|
#define ARGP_NO_EXIT 0x20
|
||||||
|
|
||||||
/* Use the gnu getopt `long-only' rules for parsing arguments. */
|
/* Use the gnu getopt "long-only" rules for parsing arguments. */
|
||||||
#define ARGP_LONG_ONLY 0x40
|
#define ARGP_LONG_ONLY 0x40
|
||||||
|
|
||||||
/* Turns off any message-printing/exiting options. */
|
/* Turns off any message-printing/exiting options. */
|
||||||
|
@ -456,7 +456,7 @@ extern void (*argp_program_version_hook) (FILE *__restrict __stream,
|
||||||
the bug-reporting address for the program. It will be printed by
|
the bug-reporting address for the program. It will be printed by
|
||||||
argp_help if the ARGP_HELP_BUG_ADDR flag is set (as it is by various
|
argp_help if the ARGP_HELP_BUG_ADDR flag is set (as it is by various
|
||||||
standard help messages), embedded in a sentence that says something like
|
standard help messages), embedded in a sentence that says something like
|
||||||
`Report bugs to ADDR.'. */
|
"Report bugs to ADDR." */
|
||||||
extern const char *argp_program_bug_address;
|
extern const char *argp_program_bug_address;
|
||||||
|
|
||||||
/* The exit status that argp will use when exiting due to a parsing error.
|
/* The exit status that argp will use when exiting due to a parsing error.
|
||||||
|
@ -467,7 +467,7 @@ extern error_t argp_err_exit_status;
|
||||||
/* Flags for argp_help. */
|
/* Flags for argp_help. */
|
||||||
#define ARGP_HELP_USAGE 0x01 /* a Usage: message. */
|
#define ARGP_HELP_USAGE 0x01 /* a Usage: message. */
|
||||||
#define ARGP_HELP_SHORT_USAGE 0x02 /* " but don't actually print options. */
|
#define ARGP_HELP_SHORT_USAGE 0x02 /* " but don't actually print options. */
|
||||||
#define ARGP_HELP_SEE 0x04 /* a `Try ... for more help' message. */
|
#define ARGP_HELP_SEE 0x04 /* a "Try ... for more help" message. */
|
||||||
#define ARGP_HELP_LONG 0x08 /* a long help message. */
|
#define ARGP_HELP_LONG 0x08 /* a long help message. */
|
||||||
#define ARGP_HELP_PRE_DOC 0x10 /* doc string preceding long help. */
|
#define ARGP_HELP_PRE_DOC 0x10 /* doc string preceding long help. */
|
||||||
#define ARGP_HELP_POST_DOC 0x20 /* doc string following long help. */
|
#define ARGP_HELP_POST_DOC 0x20 /* doc string following long help. */
|
||||||
|
@ -506,7 +506,7 @@ extern void __argp_help (const struct argp *__restrict __argp,
|
||||||
parsing routine (thus taking an argp_state structure as the first
|
parsing routine (thus taking an argp_state structure as the first
|
||||||
argument). They may or may not print an error message and exit, depending
|
argument). They may or may not print an error message and exit, depending
|
||||||
on the flags in STATE -- in any case, the caller should be prepared for
|
on the flags in STATE -- in any case, the caller should be prepared for
|
||||||
them *not* to exit, and should return an appropiate error after calling
|
them *not* to exit, and should return an appropriate error after calling
|
||||||
them. [argp_usage & argp_error should probably be called argp_state_...,
|
them. [argp_usage & argp_error should probably be called argp_state_...,
|
||||||
but they're used often enough that they should be short] */
|
but they're used often enough that they should be short] */
|
||||||
|
|
||||||
|
@ -519,21 +519,21 @@ extern void __argp_state_help (const struct argp_state *__restrict __state,
|
||||||
FILE *__restrict __stream,
|
FILE *__restrict __stream,
|
||||||
unsigned int __flags);
|
unsigned int __flags);
|
||||||
|
|
||||||
#if _LIBC || !defined __USE_EXTERN_INLINES
|
#if _LIBC
|
||||||
/* Possibly output the standard usage message for ARGP to stderr and exit. */
|
/* Possibly output the standard usage message for ARGP to stderr and exit. */
|
||||||
extern void argp_usage (const struct argp_state *__state);
|
extern void argp_usage (const struct argp_state *__state);
|
||||||
extern void __argp_usage (const struct argp_state *__state);
|
extern void __argp_usage (const struct argp_state *__state);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* If appropriate, print the printf string FMT and following args, preceded
|
/* If appropriate, print the printf string FMT and following args, preceded
|
||||||
by the program name and `:', to stderr, and followed by a `Try ... --help'
|
by the program name and ':', to stderr, and followed by a "Try ... --help"
|
||||||
message, then exit (1). */
|
message, then exit (1). */
|
||||||
extern void argp_error (const struct argp_state *__restrict __state,
|
extern void argp_error (const struct argp_state *__restrict __state,
|
||||||
const char *__restrict __fmt, ...)
|
const char *__restrict __fmt, ...)
|
||||||
__attribute__ ((__format__ (__printf__, 2, 3)));
|
_GL_ATTRIBUTE_FORMAT ((__printf__, 2, 3));
|
||||||
extern void __argp_error (const struct argp_state *__restrict __state,
|
extern void __argp_error (const struct argp_state *__restrict __state,
|
||||||
const char *__restrict __fmt, ...)
|
const char *__restrict __fmt, ...)
|
||||||
__attribute__ ((__format__ (__printf__, 2, 3)));
|
_GL_ATTRIBUTE_FORMAT ((__printf__, 2, 3));
|
||||||
|
|
||||||
/* Similar to the standard gnu error-reporting function error(), but will
|
/* Similar to the standard gnu error-reporting function error(), but will
|
||||||
respect the ARGP_NO_EXIT and ARGP_NO_ERRS flags in STATE, and will print
|
respect the ARGP_NO_EXIT and ARGP_NO_ERRS flags in STATE, and will print
|
||||||
|
@ -546,13 +546,13 @@ extern void __argp_error (const struct argp_state *__restrict __state,
|
||||||
extern void argp_failure (const struct argp_state *__restrict __state,
|
extern void argp_failure (const struct argp_state *__restrict __state,
|
||||||
int __status, int __errnum,
|
int __status, int __errnum,
|
||||||
const char *__restrict __fmt, ...)
|
const char *__restrict __fmt, ...)
|
||||||
__attribute__ ((__format__ (__printf__, 4, 5)));
|
_GL_ATTRIBUTE_FORMAT ((__printf__, 4, 5));
|
||||||
extern void __argp_failure (const struct argp_state *__restrict __state,
|
extern void __argp_failure (const struct argp_state *__restrict __state,
|
||||||
int __status, int __errnum,
|
int __status, int __errnum,
|
||||||
const char *__restrict __fmt, ...)
|
const char *__restrict __fmt, ...)
|
||||||
__attribute__ ((__format__ (__printf__, 4, 5)));
|
_GL_ATTRIBUTE_FORMAT ((__printf__, 4, 5));
|
||||||
|
|
||||||
#if _LIBC || !defined __USE_EXTERN_INLINES
|
#if _LIBC
|
||||||
/* Returns true if the option OPT is a valid short option. */
|
/* Returns true if the option OPT is a valid short option. */
|
||||||
extern int _option_is_short (const struct argp_option *__opt) __THROW;
|
extern int _option_is_short (const struct argp_option *__opt) __THROW;
|
||||||
extern int __option_is_short (const struct argp_option *__opt) __THROW;
|
extern int __option_is_short (const struct argp_option *__opt) __THROW;
|
||||||
|
@ -572,13 +572,17 @@ extern void *__argp_input (const struct argp *__restrict __argp,
|
||||||
const struct argp_state *__restrict __state)
|
const struct argp_state *__restrict __state)
|
||||||
__THROW;
|
__THROW;
|
||||||
|
|
||||||
#ifdef __USE_EXTERN_INLINES
|
#if !_LIBC || defined __USE_EXTERN_INLINES
|
||||||
|
|
||||||
# if !_LIBC
|
# if !_LIBC
|
||||||
# define __argp_usage argp_usage
|
# define __argp_usage argp_usage
|
||||||
# define __argp_state_help argp_state_help
|
# define __argp_state_help argp_state_help
|
||||||
# define __option_is_short _option_is_short
|
# define __option_is_short _option_is_short
|
||||||
# define __option_is_end _option_is_end
|
# define __option_is_end _option_is_end
|
||||||
|
_GL_INLINE_HEADER_BEGIN
|
||||||
|
# ifndef ARGP_EI
|
||||||
|
# define ARGP_EI _GL_INLINE
|
||||||
|
# endif
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
# ifndef ARGP_EI
|
# ifndef ARGP_EI
|
||||||
|
@ -635,6 +639,7 @@ __NTH (__option_is_end (const struct argp_option *__opt))
|
||||||
# undef __argp_state_help
|
# undef __argp_state_help
|
||||||
# undef __option_is_short
|
# undef __option_is_short
|
||||||
# undef __option_is_end
|
# undef __option_is_end
|
||||||
|
_GL_INLINE_HEADER_END
|
||||||
# endif
|
# endif
|
||||||
#endif /* Use extern inlines. */
|
#endif /* Use extern inlines. */
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* Formatted output to strings.
|
/* Formatted output to strings.
|
||||||
Copyright (C) 1999, 2002, 2006, 2009, 2010 Free Software Foundation, Inc.
|
Copyright (C) 1999, 2002, 2006, 2009-2013 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -12,8 +12,7 @@
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License along
|
||||||
with this program; if not, write to the Free Software Foundation,
|
with this program; if not, see <http://www.gnu.org/licenses/>. */
|
||||||
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* basename.c -- return the last element in a file name
|
/* basename.c -- return the last element in a file name
|
||||||
|
|
||||||
Copyright (C) 1990, 1998-2001, 2003-2006, 2009-2010 Free Software
|
Copyright (C) 1990, 1998-2001, 2003-2006, 2009-2013 Free Software
|
||||||
Foundation, Inc.
|
Foundation, Inc.
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* Convert unibyte character to wide character.
|
/* Convert unibyte character to wide character.
|
||||||
Copyright (C) 2008, 2010 Free Software Foundation, Inc.
|
Copyright (C) 2008, 2010-2013 Free Software Foundation, Inc.
|
||||||
Written by Bruno Haible <bruno@clisp.org>, 2008.
|
Written by Bruno Haible <bruno@clisp.org>, 2008.
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#! /bin/sh
|
#! /bin/sh
|
||||||
# Output a system dependent table of character encoding aliases.
|
# Output a system dependent table of character encoding aliases.
|
||||||
#
|
#
|
||||||
# Copyright (C) 2000-2004, 2006-2010 Free Software Foundation, Inc.
|
# Copyright (C) 2000-2004, 2006-2013 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
@ -14,8 +14,7 @@
|
||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License along
|
# You should have received a copy of the GNU General Public License along
|
||||||
# with this program; if not, write to the Free Software Foundation,
|
# with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
||||||
#
|
#
|
||||||
# The table consists of lines of the form
|
# The table consists of lines of the form
|
||||||
# ALIAS CANONICAL
|
# ALIAS CANONICAL
|
||||||
|
@ -30,6 +29,8 @@
|
||||||
# The current list of GNU canonical charset names is as follows.
|
# The current list of GNU canonical charset names is as follows.
|
||||||
#
|
#
|
||||||
# name MIME? used by which systems
|
# name MIME? used by which systems
|
||||||
|
# (darwin = Mac OS X, woe32 = native Windows)
|
||||||
|
#
|
||||||
# ASCII, ANSI_X3.4-1968 glibc solaris freebsd netbsd darwin cygwin
|
# ASCII, ANSI_X3.4-1968 glibc solaris freebsd netbsd darwin cygwin
|
||||||
# ISO-8859-1 Y glibc aix hpux irix osf solaris freebsd netbsd openbsd darwin cygwin
|
# ISO-8859-1 Y glibc aix hpux irix osf solaris freebsd netbsd openbsd darwin cygwin
|
||||||
# ISO-8859-2 Y glibc aix hpux irix osf solaris freebsd netbsd openbsd darwin cygwin
|
# ISO-8859-2 Y glibc aix hpux irix osf solaris freebsd netbsd openbsd darwin cygwin
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* dirname.c -- return all but the last element in a file name
|
/* dirname.c -- return all but the last element in a file name
|
||||||
|
|
||||||
Copyright (C) 1990, 1998, 2000-2001, 2003-2006, 2009-2010 Free Software
|
Copyright (C) 1990, 1998, 2000-2001, 2003-2006, 2009-2013 Free Software
|
||||||
Foundation, Inc.
|
Foundation, Inc.
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
@ -25,7 +25,7 @@
|
||||||
|
|
||||||
/* Return the length of the prefix of FILE that will be used by
|
/* Return the length of the prefix of FILE that will be used by
|
||||||
dir_name. If FILE is in the working directory, this returns zero
|
dir_name. If FILE is in the working directory, this returns zero
|
||||||
even though `dir_name (FILE)' will return ".". Works properly even
|
even though 'dir_name (FILE)' will return ".". Works properly even
|
||||||
if there are trailing slashes (by effectively ignoring them). */
|
if there are trailing slashes (by effectively ignoring them). */
|
||||||
|
|
||||||
size_t
|
size_t
|
||||||
|
@ -53,9 +53,9 @@ dir_len (char const *file)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* In general, we can't use the builtin `dirname' function if available,
|
/* In general, we can't use the builtin 'dirname' function if available,
|
||||||
since it has different meanings in different environments.
|
since it has different meanings in different environments.
|
||||||
In some environments the builtin `dirname' modifies its argument.
|
In some environments the builtin 'dirname' modifies its argument.
|
||||||
|
|
||||||
Return the leading directories part of FILE, allocated with malloc.
|
Return the leading directories part of FILE, allocated with malloc.
|
||||||
Works properly even if there are trailing slashes (by effectively
|
Works properly even if there are trailing slashes (by effectively
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* Take file names apart into directory and base names.
|
/* Take file names apart into directory and base names.
|
||||||
|
|
||||||
Copyright (C) 1998, 2001, 2003-2006, 2009-2010 Free Software Foundation,
|
Copyright (C) 1998, 2001, 2003-2006, 2009-2013 Free Software Foundation,
|
||||||
Inc.
|
Inc.
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
@ -21,53 +21,25 @@
|
||||||
|
|
||||||
# include <stdbool.h>
|
# include <stdbool.h>
|
||||||
# include <stddef.h>
|
# include <stddef.h>
|
||||||
|
# include "dosname.h"
|
||||||
|
|
||||||
# ifndef DIRECTORY_SEPARATOR
|
# ifndef DIRECTORY_SEPARATOR
|
||||||
# define DIRECTORY_SEPARATOR '/'
|
# define DIRECTORY_SEPARATOR '/'
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
# ifndef ISSLASH
|
|
||||||
# define ISSLASH(C) ((C) == DIRECTORY_SEPARATOR)
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# ifndef FILE_SYSTEM_PREFIX_LEN
|
|
||||||
# if FILE_SYSTEM_ACCEPTS_DRIVE_LETTER_PREFIX
|
|
||||||
/* This internal macro assumes ASCII, but all hosts that support drive
|
|
||||||
letters use ASCII. */
|
|
||||||
# define _IS_DRIVE_LETTER(c) (((unsigned int) (c) | ('a' - 'A')) - 'a' \
|
|
||||||
<= 'z' - 'a')
|
|
||||||
# define FILE_SYSTEM_PREFIX_LEN(Filename) \
|
|
||||||
(_IS_DRIVE_LETTER ((Filename)[0]) && (Filename)[1] == ':' ? 2 : 0)
|
|
||||||
# else
|
|
||||||
# define FILE_SYSTEM_PREFIX_LEN(Filename) 0
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# ifndef FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE
|
|
||||||
# define FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE 0
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# ifndef DOUBLE_SLASH_IS_DISTINCT_ROOT
|
# ifndef DOUBLE_SLASH_IS_DISTINCT_ROOT
|
||||||
# define DOUBLE_SLASH_IS_DISTINCT_ROOT 0
|
# define DOUBLE_SLASH_IS_DISTINCT_ROOT 0
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
# if FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE
|
|
||||||
# define IS_ABSOLUTE_FILE_NAME(F) ISSLASH ((F)[FILE_SYSTEM_PREFIX_LEN (F)])
|
|
||||||
# else
|
|
||||||
# define IS_ABSOLUTE_FILE_NAME(F) \
|
|
||||||
(ISSLASH ((F)[0]) || 0 < FILE_SYSTEM_PREFIX_LEN (F))
|
|
||||||
# endif
|
|
||||||
# define IS_RELATIVE_FILE_NAME(F) (! IS_ABSOLUTE_FILE_NAME (F))
|
|
||||||
|
|
||||||
# if GNULIB_DIRNAME
|
# if GNULIB_DIRNAME
|
||||||
char *base_name (char const *file);
|
char *base_name (char const *file);
|
||||||
char *dir_name (char const *file);
|
char *dir_name (char const *file);
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
char *mdir_name (char const *file);
|
char *mdir_name (char const *file);
|
||||||
size_t base_len (char const *file);
|
size_t base_len (char const *file) _GL_ATTRIBUTE_PURE;
|
||||||
size_t dir_len (char const *file);
|
size_t dir_len (char const *file) _GL_ATTRIBUTE_PURE;
|
||||||
char *last_component (char const *file);
|
char *last_component (char const *file) _GL_ATTRIBUTE_PURE;
|
||||||
|
|
||||||
bool strip_trailing_slashes (char *file);
|
bool strip_trailing_slashes (char *file);
|
||||||
|
|
||||||
|
|
53
grub-core/gnulib/dosname.h
Normal file
53
grub-core/gnulib/dosname.h
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
/* File names on MS-DOS/Windows systems.
|
||||||
|
|
||||||
|
Copyright (C) 2000-2001, 2004-2006, 2009-2013 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/>.
|
||||||
|
|
||||||
|
From Paul Eggert and Jim Meyering. */
|
||||||
|
|
||||||
|
#ifndef _DOSNAME_H
|
||||||
|
#define _DOSNAME_H
|
||||||
|
|
||||||
|
#if (defined _WIN32 || defined __WIN32__ || \
|
||||||
|
defined __MSDOS__ || defined __CYGWIN__ || \
|
||||||
|
defined __EMX__ || defined __DJGPP__)
|
||||||
|
/* This internal macro assumes ASCII, but all hosts that support drive
|
||||||
|
letters use ASCII. */
|
||||||
|
# define _IS_DRIVE_LETTER(C) (((unsigned int) (C) | ('a' - 'A')) - 'a' \
|
||||||
|
<= 'z' - 'a')
|
||||||
|
# define FILE_SYSTEM_PREFIX_LEN(Filename) \
|
||||||
|
(_IS_DRIVE_LETTER ((Filename)[0]) && (Filename)[1] == ':' ? 2 : 0)
|
||||||
|
# ifndef __CYGWIN__
|
||||||
|
# define FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE 1
|
||||||
|
# endif
|
||||||
|
# define ISSLASH(C) ((C) == '/' || (C) == '\\')
|
||||||
|
#else
|
||||||
|
# define FILE_SYSTEM_PREFIX_LEN(Filename) 0
|
||||||
|
# define ISSLASH(C) ((C) == '/')
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE
|
||||||
|
# define FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE
|
||||||
|
# define IS_ABSOLUTE_FILE_NAME(F) ISSLASH ((F)[FILE_SYSTEM_PREFIX_LEN (F)])
|
||||||
|
# else
|
||||||
|
# define IS_ABSOLUTE_FILE_NAME(F) \
|
||||||
|
(ISSLASH ((F)[0]) || FILE_SYSTEM_PREFIX_LEN (F) != 0)
|
||||||
|
#endif
|
||||||
|
#define IS_RELATIVE_FILE_NAME(F) (! IS_ABSOLUTE_FILE_NAME (F))
|
||||||
|
|
||||||
|
#endif /* DOSNAME_H_ */
|
|
@ -1,6 +1,6 @@
|
||||||
/* A POSIX-like <errno.h>.
|
/* A POSIX-like <errno.h>.
|
||||||
|
|
||||||
Copyright (C) 2008-2010 Free Software Foundation, Inc.
|
Copyright (C) 2008-2013 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -13,69 +13,137 @@
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program; if not, write to the Free Software Foundation,
|
along with this program; if not, see <http://www.gnu.org/licenses/>. */
|
||||||
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
|
||||||
|
|
||||||
#ifndef _GL_ERRNO_H
|
#ifndef _@GUARD_PREFIX@_ERRNO_H
|
||||||
|
|
||||||
#if __GNUC__ >= 3
|
#if __GNUC__ >= 3
|
||||||
@PRAGMA_SYSTEM_HEADER@
|
@PRAGMA_SYSTEM_HEADER@
|
||||||
#endif
|
#endif
|
||||||
|
@PRAGMA_COLUMNS@
|
||||||
|
|
||||||
/* The include_next requires a split double-inclusion guard. */
|
/* The include_next requires a split double-inclusion guard. */
|
||||||
#@INCLUDE_NEXT@ @NEXT_ERRNO_H@
|
#@INCLUDE_NEXT@ @NEXT_ERRNO_H@
|
||||||
|
|
||||||
#ifndef _GL_ERRNO_H
|
#ifndef _@GUARD_PREFIX@_ERRNO_H
|
||||||
#define _GL_ERRNO_H
|
#define _@GUARD_PREFIX@_ERRNO_H
|
||||||
|
|
||||||
|
|
||||||
/* On native Windows platforms, many macros are not defined. */
|
/* On native Windows platforms, many macros are not defined. */
|
||||||
# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
|
# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
|
||||||
|
|
||||||
/* POSIX says that EAGAIN and EWOULDBLOCK may have the same value. */
|
/* These are the same values as defined by MSVC 10, for interoperability. */
|
||||||
# define EWOULDBLOCK EAGAIN
|
|
||||||
|
|
||||||
/* Values >= 100 seem safe to use. */
|
# ifndef ENOMSG
|
||||||
# define ETXTBSY 100
|
# define ENOMSG 122
|
||||||
# define GNULIB_defined_ETXTBSY 1
|
# define GNULIB_defined_ENOMSG 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef EIDRM
|
||||||
|
# define EIDRM 111
|
||||||
|
# define GNULIB_defined_EIDRM 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef ENOLINK
|
||||||
|
# define ENOLINK 121
|
||||||
|
# define GNULIB_defined_ENOLINK 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef EPROTO
|
||||||
|
# define EPROTO 134
|
||||||
|
# define GNULIB_defined_EPROTO 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef EBADMSG
|
||||||
|
# define EBADMSG 104
|
||||||
|
# define GNULIB_defined_EBADMSG 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef EOVERFLOW
|
||||||
|
# define EOVERFLOW 132
|
||||||
|
# define GNULIB_defined_EOVERFLOW 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef ENOTSUP
|
||||||
|
# define ENOTSUP 129
|
||||||
|
# define GNULIB_defined_ENOTSUP 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef ENETRESET
|
||||||
|
# define ENETRESET 117
|
||||||
|
# define GNULIB_defined_ENETRESET 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef ECONNABORTED
|
||||||
|
# define ECONNABORTED 106
|
||||||
|
# define GNULIB_defined_ECONNABORTED 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef ECANCELED
|
||||||
|
# define ECANCELED 105
|
||||||
|
# define GNULIB_defined_ECANCELED 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef EOWNERDEAD
|
||||||
|
# define EOWNERDEAD 133
|
||||||
|
# define GNULIB_defined_EOWNERDEAD 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef ENOTRECOVERABLE
|
||||||
|
# define ENOTRECOVERABLE 127
|
||||||
|
# define GNULIB_defined_ENOTRECOVERABLE 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef EINPROGRESS
|
||||||
|
# define EINPROGRESS 112
|
||||||
|
# define EALREADY 103
|
||||||
|
# define ENOTSOCK 128
|
||||||
|
# define EDESTADDRREQ 109
|
||||||
|
# define EMSGSIZE 115
|
||||||
|
# define EPROTOTYPE 136
|
||||||
|
# define ENOPROTOOPT 123
|
||||||
|
# define EPROTONOSUPPORT 135
|
||||||
|
# define EOPNOTSUPP 130
|
||||||
|
# define EAFNOSUPPORT 102
|
||||||
|
# define EADDRINUSE 100
|
||||||
|
# define EADDRNOTAVAIL 101
|
||||||
|
# define ENETDOWN 116
|
||||||
|
# define ENETUNREACH 118
|
||||||
|
# define ECONNRESET 108
|
||||||
|
# define ENOBUFS 119
|
||||||
|
# define EISCONN 113
|
||||||
|
# define ENOTCONN 126
|
||||||
|
# define ETIMEDOUT 138
|
||||||
|
# define ECONNREFUSED 107
|
||||||
|
# define ELOOP 114
|
||||||
|
# define EHOSTUNREACH 110
|
||||||
|
# define EWOULDBLOCK 140
|
||||||
|
# define GNULIB_defined_ESOCK 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef ETXTBSY
|
||||||
|
# define ETXTBSY 139
|
||||||
|
# define ENODATA 120 /* not required by POSIX */
|
||||||
|
# define ENOSR 124 /* not required by POSIX */
|
||||||
|
# define ENOSTR 125 /* not required by POSIX */
|
||||||
|
# define ETIME 137 /* not required by POSIX */
|
||||||
|
# define EOTHER 131 /* not required by POSIX */
|
||||||
|
# define GNULIB_defined_ESTREAMS 1
|
||||||
|
# endif
|
||||||
|
|
||||||
/* These are intentionally the same values as the WSA* error numbers, defined
|
/* These are intentionally the same values as the WSA* error numbers, defined
|
||||||
in <winsock2.h>. */
|
in <winsock2.h>. */
|
||||||
# define EINPROGRESS 10036
|
|
||||||
# define EALREADY 10037
|
|
||||||
# define ENOTSOCK 10038
|
|
||||||
# define EDESTADDRREQ 10039
|
|
||||||
# define EMSGSIZE 10040
|
|
||||||
# define EPROTOTYPE 10041
|
|
||||||
# define ENOPROTOOPT 10042
|
|
||||||
# define EPROTONOSUPPORT 10043
|
|
||||||
# define ESOCKTNOSUPPORT 10044 /* not required by POSIX */
|
# define ESOCKTNOSUPPORT 10044 /* not required by POSIX */
|
||||||
# define EOPNOTSUPP 10045
|
|
||||||
# define EPFNOSUPPORT 10046 /* not required by POSIX */
|
# define EPFNOSUPPORT 10046 /* not required by POSIX */
|
||||||
# define EAFNOSUPPORT 10047
|
|
||||||
# define EADDRINUSE 10048
|
|
||||||
# define EADDRNOTAVAIL 10049
|
|
||||||
# define ENETDOWN 10050
|
|
||||||
# define ENETUNREACH 10051
|
|
||||||
# define ENETRESET 10052
|
|
||||||
# define ECONNABORTED 10053
|
|
||||||
# define ECONNRESET 10054
|
|
||||||
# define ENOBUFS 10055
|
|
||||||
# define EISCONN 10056
|
|
||||||
# define ENOTCONN 10057
|
|
||||||
# define ESHUTDOWN 10058 /* not required by POSIX */
|
# define ESHUTDOWN 10058 /* not required by POSIX */
|
||||||
# define ETOOMANYREFS 10059 /* not required by POSIX */
|
# define ETOOMANYREFS 10059 /* not required by POSIX */
|
||||||
# define ETIMEDOUT 10060
|
|
||||||
# define ECONNREFUSED 10061
|
|
||||||
# define ELOOP 10062
|
|
||||||
# define EHOSTDOWN 10064 /* not required by POSIX */
|
# define EHOSTDOWN 10064 /* not required by POSIX */
|
||||||
# define EHOSTUNREACH 10065
|
|
||||||
# define EPROCLIM 10067 /* not required by POSIX */
|
# define EPROCLIM 10067 /* not required by POSIX */
|
||||||
# define EUSERS 10068 /* not required by POSIX */
|
# define EUSERS 10068 /* not required by POSIX */
|
||||||
# define EDQUOT 10069
|
# define EDQUOT 10069
|
||||||
# define ESTALE 10070
|
# define ESTALE 10070
|
||||||
# define EREMOTE 10071 /* not required by POSIX */
|
# define EREMOTE 10071 /* not required by POSIX */
|
||||||
# define GNULIB_defined_ESOCK 1
|
# define GNULIB_defined_EWINSOCK 1
|
||||||
|
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
|
@ -98,6 +166,7 @@
|
||||||
|
|
||||||
/* On OpenBSD 4.0 and on native Windows, the macros ENOMSG, EIDRM, ENOLINK,
|
/* On OpenBSD 4.0 and on native Windows, the macros ENOMSG, EIDRM, ENOLINK,
|
||||||
EPROTO, EMULTIHOP, EBADMSG, EOVERFLOW, ENOTSUP, ECANCELED are not defined.
|
EPROTO, EMULTIHOP, EBADMSG, EOVERFLOW, ENOTSUP, ECANCELED are not defined.
|
||||||
|
Likewise, on NonStop Kernel, EDQUOT is not defined.
|
||||||
Define them here. Values >= 2000 seem safe to use: Solaris ESTALE = 151,
|
Define them here. Values >= 2000 seem safe to use: Solaris ESTALE = 151,
|
||||||
HP-UX EWOULDBLOCK = 246, IRIX EDQUOT = 1133.
|
HP-UX EWOULDBLOCK = 246, IRIX EDQUOT = 1133.
|
||||||
|
|
||||||
|
@ -145,16 +214,66 @@
|
||||||
# define GNULIB_defined_ENOTSUP 1
|
# define GNULIB_defined_ENOTSUP 1
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
|
# ifndef ENETRESET
|
||||||
|
# define ENETRESET 2011
|
||||||
|
# define GNULIB_defined_ENETRESET 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef ECONNABORTED
|
||||||
|
# define ECONNABORTED 2012
|
||||||
|
# define GNULIB_defined_ECONNABORTED 1
|
||||||
|
# endif
|
||||||
|
|
||||||
# ifndef ESTALE
|
# ifndef ESTALE
|
||||||
# define ESTALE 2009
|
# define ESTALE 2009
|
||||||
# define GNULIB_defined_ESTALE 1
|
# define GNULIB_defined_ESTALE 1
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
|
# ifndef EDQUOT
|
||||||
|
# define EDQUOT 2010
|
||||||
|
# define GNULIB_defined_EDQUOT 1
|
||||||
|
# endif
|
||||||
|
|
||||||
# ifndef ECANCELED
|
# ifndef ECANCELED
|
||||||
# define ECANCELED 2008
|
# define ECANCELED 2008
|
||||||
# define GNULIB_defined_ECANCELED 1
|
# define GNULIB_defined_ECANCELED 1
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
|
/* On many platforms, the macros EOWNERDEAD and ENOTRECOVERABLE are not
|
||||||
|
defined. */
|
||||||
|
|
||||||
#endif /* _GL_ERRNO_H */
|
# ifndef EOWNERDEAD
|
||||||
#endif /* _GL_ERRNO_H */
|
# if defined __sun
|
||||||
|
/* Use the same values as defined for Solaris >= 8, for
|
||||||
|
interoperability. */
|
||||||
|
# define EOWNERDEAD 58
|
||||||
|
# define ENOTRECOVERABLE 59
|
||||||
|
# elif (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
|
||||||
|
/* We have a conflict here: pthreads-win32 defines these values
|
||||||
|
differently than MSVC 10. It's hairy to decide which one to use. */
|
||||||
|
# if defined __MINGW32__ && !defined USE_WINDOWS_THREADS
|
||||||
|
/* Use the same values as defined by pthreads-win32, for
|
||||||
|
interoperability. */
|
||||||
|
# define EOWNERDEAD 43
|
||||||
|
# define ENOTRECOVERABLE 44
|
||||||
|
# else
|
||||||
|
/* Use the same values as defined by MSVC 10, for
|
||||||
|
interoperability. */
|
||||||
|
# define EOWNERDEAD 133
|
||||||
|
# define ENOTRECOVERABLE 127
|
||||||
|
# endif
|
||||||
|
# else
|
||||||
|
# define EOWNERDEAD 2013
|
||||||
|
# define ENOTRECOVERABLE 2014
|
||||||
|
# endif
|
||||||
|
# define GNULIB_defined_EOWNERDEAD 1
|
||||||
|
# define GNULIB_defined_ENOTRECOVERABLE 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifndef EILSEQ
|
||||||
|
# define EILSEQ 2015
|
||||||
|
# define GNULIB_defined_EILSEQ 1
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#endif /* _@GUARD_PREFIX@_ERRNO_H */
|
||||||
|
#endif /* _@GUARD_PREFIX@_ERRNO_H */
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* Error handler for noninteractive utilities
|
/* Error handler for noninteractive utilities
|
||||||
Copyright (C) 1990-1998, 2000-2007, 2009-2010 Free Software Foundation, Inc.
|
Copyright (C) 1990-1998, 2000-2007, 2009-2013 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
@ -54,7 +54,7 @@
|
||||||
function without parameters instead. */
|
function without parameters instead. */
|
||||||
void (*error_print_progname) (void);
|
void (*error_print_progname) (void);
|
||||||
|
|
||||||
/* This variable is incremented each time `error' is called. */
|
/* This variable is incremented each time 'error' is called. */
|
||||||
unsigned int error_message_count;
|
unsigned int error_message_count;
|
||||||
|
|
||||||
#ifdef _LIBC
|
#ifdef _LIBC
|
||||||
|
@ -65,7 +65,7 @@ unsigned int error_message_count;
|
||||||
# include <limits.h>
|
# include <limits.h>
|
||||||
# include <libio/libioP.h>
|
# include <libio/libioP.h>
|
||||||
|
|
||||||
/* In GNU libc we want do not want to use the common name `error' directly.
|
/* In GNU libc we want do not want to use the common name 'error' directly.
|
||||||
Instead make it a weak alias. */
|
Instead make it a weak alias. */
|
||||||
extern void __error (int status, int errnum, const char *message, ...)
|
extern void __error (int status, int errnum, const char *message, ...)
|
||||||
__attribute__ ((__format__ (__printf__, 3, 4)));
|
__attribute__ ((__format__ (__printf__, 3, 4)));
|
||||||
|
@ -89,19 +89,25 @@ extern void __error_at_line (int status, int errnum, const char *file_name,
|
||||||
# include <unistd.h>
|
# include <unistd.h>
|
||||||
|
|
||||||
# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
|
# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
|
||||||
/* Get declarations of the Win32 API functions. */
|
/* Get declarations of the native Windows API functions. */
|
||||||
# define WIN32_LEAN_AND_MEAN
|
# define WIN32_LEAN_AND_MEAN
|
||||||
# include <windows.h>
|
# include <windows.h>
|
||||||
|
/* Get _get_osfhandle. */
|
||||||
|
# include "msvc-nothrow.h"
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
/* The gnulib override of fcntl is not needed in this file. */
|
/* The gnulib override of fcntl is not needed in this file. */
|
||||||
# undef fcntl
|
# undef fcntl
|
||||||
|
|
||||||
# if !HAVE_DECL_STRERROR_R && STRERROR_R_CHAR_P
|
# if !HAVE_DECL_STRERROR_R
|
||||||
# ifndef HAVE_DECL_STRERROR_R
|
# ifndef HAVE_DECL_STRERROR_R
|
||||||
"this configure-time declaration test was not run"
|
"this configure-time declaration test was not run"
|
||||||
# endif
|
# endif
|
||||||
|
# if STRERROR_R_CHAR_P
|
||||||
char *strerror_r ();
|
char *strerror_r ();
|
||||||
|
# else
|
||||||
|
int strerror_r ();
|
||||||
|
# endif
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
/* The calling program should define program_name and set it to the
|
/* The calling program should define program_name and set it to the
|
||||||
|
@ -115,13 +121,14 @@ extern char *program_name;
|
||||||
|
|
||||||
#if !_LIBC
|
#if !_LIBC
|
||||||
/* Return non-zero if FD is open. */
|
/* Return non-zero if FD is open. */
|
||||||
static inline int
|
static int
|
||||||
is_open (int fd)
|
is_open (int fd)
|
||||||
{
|
{
|
||||||
# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
|
# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
|
||||||
/* On Win32: The initial state of unassigned standard file descriptors is
|
/* On native Windows: The initial state of unassigned standard file
|
||||||
that they are open but point to an INVALID_HANDLE_VALUE. There is no
|
descriptors is that they are open but point to an INVALID_HANDLE_VALUE.
|
||||||
fcntl, and the gnulib replacement fcntl does not support F_GETFL. */
|
There is no fcntl, and the gnulib replacement fcntl does not support
|
||||||
|
F_GETFL. */
|
||||||
return (HANDLE) _get_osfhandle (fd) != INVALID_HANDLE_VALUE;
|
return (HANDLE) _get_osfhandle (fd) != INVALID_HANDLE_VALUE;
|
||||||
# else
|
# else
|
||||||
# ifndef F_GETFL
|
# ifndef F_GETFL
|
||||||
|
@ -132,7 +139,7 @@ is_open (int fd)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static inline void
|
static void
|
||||||
flush_stdout (void)
|
flush_stdout (void)
|
||||||
{
|
{
|
||||||
#if !_LIBC
|
#if !_LIBC
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* Declaration for error-reporting function
|
/* Declaration for error-reporting function
|
||||||
Copyright (C) 1995, 1996, 1997, 2003, 2006, 2008, 2009, 2010 Free Software
|
Copyright (C) 1995-1997, 2003, 2006, 2008-2013 Free Software Foundation,
|
||||||
Foundation, Inc.
|
Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
@ -19,39 +19,39 @@
|
||||||
#ifndef _ERROR_H
|
#ifndef _ERROR_H
|
||||||
#define _ERROR_H 1
|
#define _ERROR_H 1
|
||||||
|
|
||||||
#ifndef __attribute__
|
|
||||||
/* The __attribute__ feature is available in gcc versions 2.5 and later.
|
/* The __attribute__ feature is available in gcc versions 2.5 and later.
|
||||||
The __-protected variants of the attributes 'format' and 'printf' are
|
The __-protected variants of the attributes 'format' and 'printf' are
|
||||||
accepted by gcc versions 2.6.4 (effectively 2.7) and later.
|
accepted by gcc versions 2.6.4 (effectively 2.7) and later.
|
||||||
We enable __attribute__ only if these are supported too, because
|
We enable _GL_ATTRIBUTE_FORMAT only if these are supported too, because
|
||||||
gnulib and libintl do '#define printf __printf__' when they override
|
gnulib and libintl do '#define printf __printf__' when they override
|
||||||
the 'printf' function. */
|
the 'printf' function. */
|
||||||
# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
|
#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
|
||||||
# define __attribute__(Spec) /* empty */
|
# define _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec))
|
||||||
# endif
|
#else
|
||||||
|
# define _GL_ATTRIBUTE_FORMAT(spec) /* empty */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Print a message with `fprintf (stderr, FORMAT, ...)';
|
/* Print a message with 'fprintf (stderr, FORMAT, ...)';
|
||||||
if ERRNUM is nonzero, follow it with ": " and strerror (ERRNUM).
|
if ERRNUM is nonzero, follow it with ": " and strerror (ERRNUM).
|
||||||
If STATUS is nonzero, terminate the program with `exit (STATUS)'. */
|
If STATUS is nonzero, terminate the program with 'exit (STATUS)'. */
|
||||||
|
|
||||||
extern void error (int __status, int __errnum, const char *__format, ...)
|
extern void error (int __status, int __errnum, const char *__format, ...)
|
||||||
__attribute__ ((__format__ (__printf__, 3, 4)));
|
_GL_ATTRIBUTE_FORMAT ((__printf__, 3, 4));
|
||||||
|
|
||||||
extern void error_at_line (int __status, int __errnum, const char *__fname,
|
extern void error_at_line (int __status, int __errnum, const char *__fname,
|
||||||
unsigned int __lineno, const char *__format, ...)
|
unsigned int __lineno, const char *__format, ...)
|
||||||
__attribute__ ((__format__ (__printf__, 5, 6)));
|
_GL_ATTRIBUTE_FORMAT ((__printf__, 5, 6));
|
||||||
|
|
||||||
/* If NULL, error will flush stdout, then print on stderr the program
|
/* If NULL, error will flush stdout, then print on stderr the program
|
||||||
name, a colon and a space. Otherwise, error will call this
|
name, a colon and a space. Otherwise, error will call this
|
||||||
function without parameters instead. */
|
function without parameters instead. */
|
||||||
extern void (*error_print_progname) (void);
|
extern void (*error_print_progname) (void);
|
||||||
|
|
||||||
/* This variable is incremented each time `error' is called. */
|
/* This variable is incremented each time 'error' is called. */
|
||||||
extern unsigned int error_message_count;
|
extern unsigned int error_message_count;
|
||||||
|
|
||||||
/* Sometimes we want to have at most one error per line. This
|
/* Sometimes we want to have at most one error per line. This
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* Supplemental information about the floating-point formats.
|
/* Supplemental information about the floating-point formats.
|
||||||
Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc.
|
Copyright (C) 2007, 2009-2013 Free Software Foundation, Inc.
|
||||||
Written by Bruno Haible <bruno@clisp.org>, 2007.
|
Written by Bruno Haible <bruno@clisp.org>, 2007.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
@ -13,8 +13,7 @@
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program; if not, write to the Free Software Foundation,
|
along with this program; if not, see <http://www.gnu.org/licenses/>. */
|
||||||
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
|
||||||
|
|
||||||
#ifndef _FLOATPLUS_H
|
#ifndef _FLOATPLUS_H
|
||||||
#define _FLOATPLUS_H
|
#define _FLOATPLUS_H
|
||||||
|
@ -141,8 +140,8 @@
|
||||||
#define SIZEOF_LDBL ((LDBL_TOTAL_BIT + CHAR_BIT - 1) / CHAR_BIT)
|
#define SIZEOF_LDBL ((LDBL_TOTAL_BIT + CHAR_BIT - 1) / CHAR_BIT)
|
||||||
|
|
||||||
/* Verify that SIZEOF_FLT <= sizeof (float) etc. */
|
/* Verify that SIZEOF_FLT <= sizeof (float) etc. */
|
||||||
typedef int verify_sizeof_flt[2 * (SIZEOF_FLT <= sizeof (float)) - 1];
|
typedef int verify_sizeof_flt[SIZEOF_FLT <= sizeof (float) ? 1 : -1];
|
||||||
typedef int verify_sizeof_dbl[2 * (SIZEOF_DBL <= sizeof (double)) - 1];
|
typedef int verify_sizeof_dbl[SIZEOF_DBL <= sizeof (double) ? 1 : - 1];
|
||||||
typedef int verify_sizeof_ldbl[2 * (SIZEOF_LDBL <= sizeof (long double)) - 1];
|
typedef int verify_sizeof_ldbl[SIZEOF_LDBL <= sizeof (long double) ? 1 : - 1];
|
||||||
|
|
||||||
#endif /* _FLOATPLUS_H */
|
#endif /* _FLOATPLUS_H */
|
||||||
|
|
33
grub-core/gnulib/float.c
Normal file
33
grub-core/gnulib/float.c
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
/* Auxiliary definitions for <float.h>.
|
||||||
|
Copyright (C) 2011-2013 Free Software Foundation, Inc.
|
||||||
|
Written by Bruno Haible <bruno@clisp.org>, 2011.
|
||||||
|
|
||||||
|
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/>. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
/* Specification. */
|
||||||
|
#include <float.h>
|
||||||
|
|
||||||
|
#if (defined _ARCH_PPC || defined _POWER) && (defined _AIX || defined __linux__) && (LDBL_MANT_DIG == 106) && defined __GNUC__
|
||||||
|
const union gl_long_double_union gl_LDBL_MAX =
|
||||||
|
{ { DBL_MAX, DBL_MAX / (double)134217728UL / (double)134217728UL } };
|
||||||
|
#elif defined __i386__
|
||||||
|
const union gl_long_double_union gl_LDBL_MAX =
|
||||||
|
{ { 0xFFFFFFFF, 0xFFFFFFFF, 32766 } };
|
||||||
|
#else
|
||||||
|
/* This declaration is solely to ensure that after preprocessing
|
||||||
|
this file is never empty. */
|
||||||
|
typedef int dummy;
|
||||||
|
#endif
|
|
@ -1,6 +1,6 @@
|
||||||
/* A correct <float.h>.
|
/* A correct <float.h>.
|
||||||
|
|
||||||
Copyright (C) 2007-2010 Free Software Foundation, Inc.
|
Copyright (C) 2007-2013 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -15,19 +15,21 @@
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
#ifndef _GL_FLOAT_H
|
#ifndef _@GUARD_PREFIX@_FLOAT_H
|
||||||
|
|
||||||
#if __GNUC__ >= 3
|
#if __GNUC__ >= 3
|
||||||
@PRAGMA_SYSTEM_HEADER@
|
@PRAGMA_SYSTEM_HEADER@
|
||||||
#endif
|
#endif
|
||||||
|
@PRAGMA_COLUMNS@
|
||||||
|
|
||||||
/* The include_next requires a split double-inclusion guard. */
|
/* The include_next requires a split double-inclusion guard. */
|
||||||
#@INCLUDE_NEXT@ @NEXT_FLOAT_H@
|
#@INCLUDE_NEXT@ @NEXT_FLOAT_H@
|
||||||
|
|
||||||
#ifndef _GL_FLOAT_H
|
#ifndef _@GUARD_PREFIX@_FLOAT_H
|
||||||
#define _GL_FLOAT_H
|
#define _@GUARD_PREFIX@_FLOAT_H
|
||||||
|
|
||||||
/* 'long double' properties. */
|
/* 'long double' properties. */
|
||||||
|
|
||||||
#if defined __i386__ && (defined __BEOS__ || defined __OpenBSD__)
|
#if defined __i386__ && (defined __BEOS__ || defined __OpenBSD__)
|
||||||
/* Number of mantissa units, in base FLT_RADIX. */
|
/* Number of mantissa units, in base FLT_RADIX. */
|
||||||
# undef LDBL_MANT_DIG
|
# undef LDBL_MANT_DIG
|
||||||
|
@ -58,5 +60,129 @@
|
||||||
# define LDBL_MAX_10_EXP 4932
|
# define LDBL_MAX_10_EXP 4932
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* _GL_FLOAT_H */
|
/* On FreeBSD/x86 6.4, the 'long double' type really has only 53 bits of
|
||||||
#endif /* _GL_FLOAT_H */
|
precision in the compiler but 64 bits of precision at runtime. See
|
||||||
|
<http://lists.gnu.org/archive/html/bug-gnulib/2008-07/msg00063.html>. */
|
||||||
|
#if defined __i386__ && defined __FreeBSD__
|
||||||
|
/* Number of mantissa units, in base FLT_RADIX. */
|
||||||
|
# undef LDBL_MANT_DIG
|
||||||
|
# define LDBL_MANT_DIG 64
|
||||||
|
/* Number of decimal digits that is sufficient for representing a number. */
|
||||||
|
# undef LDBL_DIG
|
||||||
|
# define LDBL_DIG 18
|
||||||
|
/* x-1 where x is the smallest representable number > 1. */
|
||||||
|
# undef LDBL_EPSILON
|
||||||
|
# define LDBL_EPSILON 1.084202172485504434007452800869941711426e-19L /* 2^-63 */
|
||||||
|
/* Minimum e such that FLT_RADIX^(e-1) is a normalized number. */
|
||||||
|
# undef LDBL_MIN_EXP
|
||||||
|
# define LDBL_MIN_EXP (-16381)
|
||||||
|
/* Maximum e such that FLT_RADIX^(e-1) is a representable finite number. */
|
||||||
|
# undef LDBL_MAX_EXP
|
||||||
|
# define LDBL_MAX_EXP 16384
|
||||||
|
/* Minimum positive normalized number. */
|
||||||
|
# undef LDBL_MIN
|
||||||
|
# define LDBL_MIN 3.3621031431120935E-4932L /* = 0x1p-16382L */
|
||||||
|
/* Maximum representable finite number. */
|
||||||
|
# undef LDBL_MAX
|
||||||
|
/* LDBL_MAX is represented as { 0xFFFFFFFF, 0xFFFFFFFF, 32766 }.
|
||||||
|
But the largest literal that GCC allows us to write is
|
||||||
|
0x0.fffffffffffff8p16384L = { 0xFFFFF800, 0xFFFFFFFF, 32766 }.
|
||||||
|
So, define it like this through a reference to an external variable
|
||||||
|
|
||||||
|
const unsigned int LDBL_MAX[3] = { 0xFFFFFFFF, 0xFFFFFFFF, 32766 };
|
||||||
|
extern const long double LDBL_MAX;
|
||||||
|
|
||||||
|
Unfortunately, this is not a constant expression. */
|
||||||
|
union gl_long_double_union
|
||||||
|
{
|
||||||
|
struct { unsigned int lo; unsigned int hi; unsigned int exponent; } xd;
|
||||||
|
long double ld;
|
||||||
|
};
|
||||||
|
extern const union gl_long_double_union gl_LDBL_MAX;
|
||||||
|
# define LDBL_MAX (gl_LDBL_MAX.ld)
|
||||||
|
/* Minimum e such that 10^e is in the range of normalized numbers. */
|
||||||
|
# undef LDBL_MIN_10_EXP
|
||||||
|
# define LDBL_MIN_10_EXP (-4931)
|
||||||
|
/* Maximum e such that 10^e is in the range of representable finite numbers. */
|
||||||
|
# undef LDBL_MAX_10_EXP
|
||||||
|
# define LDBL_MAX_10_EXP 4932
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* On AIX 7.1 with gcc 4.2, the values of LDBL_MIN_EXP, LDBL_MIN, LDBL_MAX are
|
||||||
|
wrong.
|
||||||
|
On Linux/PowerPC with gcc 4.4, the value of LDBL_MAX is wrong. */
|
||||||
|
#if (defined _ARCH_PPC || defined _POWER) && defined _AIX && (LDBL_MANT_DIG == 106) && defined __GNUC__
|
||||||
|
# undef LDBL_MIN_EXP
|
||||||
|
# define LDBL_MIN_EXP DBL_MIN_EXP
|
||||||
|
# undef LDBL_MIN_10_EXP
|
||||||
|
# define LDBL_MIN_10_EXP DBL_MIN_10_EXP
|
||||||
|
# undef LDBL_MIN
|
||||||
|
# define LDBL_MIN 2.22507385850720138309023271733240406422e-308L /* DBL_MIN = 2^-1022 */
|
||||||
|
#endif
|
||||||
|
#if (defined _ARCH_PPC || defined _POWER) && (defined _AIX || defined __linux__) && (LDBL_MANT_DIG == 106) && defined __GNUC__
|
||||||
|
# undef LDBL_MAX
|
||||||
|
/* LDBL_MAX is represented as { 0x7FEFFFFF, 0xFFFFFFFF, 0x7C8FFFFF, 0xFFFFFFFF }.
|
||||||
|
It is not easy to define:
|
||||||
|
#define LDBL_MAX 1.79769313486231580793728971405302307166e308L
|
||||||
|
is too small, whereas
|
||||||
|
#define LDBL_MAX 1.79769313486231580793728971405302307167e308L
|
||||||
|
is too large. Apparently a bug in GCC decimal-to-binary conversion.
|
||||||
|
Also, I can't get values larger than
|
||||||
|
#define LDBL63 ((long double) (1ULL << 63))
|
||||||
|
#define LDBL882 (LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63)
|
||||||
|
#define LDBL945 (LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63)
|
||||||
|
#define LDBL1008 (LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63 * LDBL63)
|
||||||
|
#define LDBL_MAX (LDBL1008 * 65535.0L + LDBL945 * (long double) 9223372036821221375ULL + LDBL882 * (long double) 4611686018427387904ULL)
|
||||||
|
which is represented as { 0x7FEFFFFF, 0xFFFFFFFF, 0x7C8FFFFF, 0xF8000000 }.
|
||||||
|
So, define it like this through a reference to an external variable
|
||||||
|
|
||||||
|
const double LDBL_MAX[2] = { DBL_MAX, DBL_MAX / (double)134217728UL / (double)134217728UL };
|
||||||
|
extern const long double LDBL_MAX;
|
||||||
|
|
||||||
|
or through a pointer cast
|
||||||
|
|
||||||
|
#define LDBL_MAX \
|
||||||
|
(*(const long double *) (double[]) { DBL_MAX, DBL_MAX / (double)134217728UL / (double)134217728UL })
|
||||||
|
|
||||||
|
Unfortunately, this is not a constant expression, and the latter expression
|
||||||
|
does not work well when GCC is optimizing.. */
|
||||||
|
union gl_long_double_union
|
||||||
|
{
|
||||||
|
struct { double hi; double lo; } dd;
|
||||||
|
long double ld;
|
||||||
|
};
|
||||||
|
extern const union gl_long_double_union gl_LDBL_MAX;
|
||||||
|
# define LDBL_MAX (gl_LDBL_MAX.ld)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* On IRIX 6.5, with cc, the value of LDBL_MANT_DIG is wrong.
|
||||||
|
On IRIX 6.5, with gcc 4.2, the values of LDBL_MIN_EXP, LDBL_MIN, LDBL_EPSILON
|
||||||
|
are wrong. */
|
||||||
|
#if defined __sgi && (LDBL_MANT_DIG >= 106)
|
||||||
|
# undef LDBL_MANT_DIG
|
||||||
|
# define LDBL_MANT_DIG 106
|
||||||
|
# if defined __GNUC__
|
||||||
|
# undef LDBL_MIN_EXP
|
||||||
|
# define LDBL_MIN_EXP DBL_MIN_EXP
|
||||||
|
# undef LDBL_MIN_10_EXP
|
||||||
|
# define LDBL_MIN_10_EXP DBL_MIN_10_EXP
|
||||||
|
# undef LDBL_MIN
|
||||||
|
# define LDBL_MIN 2.22507385850720138309023271733240406422e-308L /* DBL_MIN = 2^-1022 */
|
||||||
|
# undef LDBL_EPSILON
|
||||||
|
# define LDBL_EPSILON 2.46519032881566189191165176650870696773e-32L /* 2^-105 */
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if @REPLACE_ITOLD@
|
||||||
|
/* Pull in a function that fixes the 'int' to 'long double' conversion
|
||||||
|
of glibc 2.7. */
|
||||||
|
extern
|
||||||
|
# ifdef __cplusplus
|
||||||
|
"C"
|
||||||
|
# endif
|
||||||
|
void _Qp_itoq (long double *, int);
|
||||||
|
static void (*_gl_float_fix_itold) (long double *, int) = _Qp_itoq;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _@GUARD_PREFIX@_FLOAT_H */
|
||||||
|
#endif /* _@GUARD_PREFIX@_FLOAT_H */
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
/* Copyright (C) 1991, 1992, 1993, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
|
/* Copyright (C) 1991-1993, 1996-2007, 2009-2013 Free Software Foundation, Inc.
|
||||||
2003, 2004, 2005, 2006, 2007, 2009, 2010 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -12,8 +11,7 @@
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program; if not, write to the Free Software Foundation,
|
along with this program; if not, see <http://www.gnu.org/licenses/>. */
|
||||||
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
|
||||||
|
|
||||||
#ifndef _LIBC
|
#ifndef _LIBC
|
||||||
# include <config.h>
|
# include <config.h>
|
||||||
|
@ -43,7 +41,7 @@
|
||||||
(HAVE_WCTYPE_H && HAVE_BTOWC && HAVE_ISWCTYPE \
|
(HAVE_WCTYPE_H && HAVE_BTOWC && HAVE_ISWCTYPE \
|
||||||
&& HAVE_WMEMCHR && (HAVE_WMEMCPY || HAVE_WMEMPCPY))
|
&& HAVE_WMEMCHR && (HAVE_WMEMCPY || HAVE_WMEMPCPY))
|
||||||
|
|
||||||
/* For platform which support the ISO C amendement 1 functionality we
|
/* For platform which support the ISO C amendment 1 functionality we
|
||||||
support user defined character classes. */
|
support user defined character classes. */
|
||||||
#if defined _LIBC || WIDE_CHAR_SUPPORT
|
#if defined _LIBC || WIDE_CHAR_SUPPORT
|
||||||
# include <wctype.h>
|
# include <wctype.h>
|
||||||
|
@ -79,7 +77,7 @@ extern int fnmatch (const char *pattern, const char *string, int flags);
|
||||||
Library, but also included in many other GNU distributions. Compiling
|
Library, but also included in many other GNU distributions. Compiling
|
||||||
and linking in this code is a waste when using the GNU C library
|
and linking in this code is a waste when using the GNU C library
|
||||||
(especially if it is a shared library). Rather than having every GNU
|
(especially if it is a shared library). Rather than having every GNU
|
||||||
program understand `configure --with-gnu-libc' and omit the object files,
|
program understand 'configure --with-gnu-libc' and omit the object files,
|
||||||
it is simpler to just do this in the source for each such file. */
|
it is simpler to just do this in the source for each such file. */
|
||||||
|
|
||||||
#if defined _LIBC || !defined __GNU_LIBRARY__ || !HAVE_FNMATCH_GNU
|
#if defined _LIBC || !defined __GNU_LIBRARY__ || !HAVE_FNMATCH_GNU
|
||||||
|
@ -93,7 +91,7 @@ extern int fnmatch (const char *pattern, const char *string, int flags);
|
||||||
|
|
||||||
# if defined _LIBC || WIDE_CHAR_SUPPORT
|
# if defined _LIBC || WIDE_CHAR_SUPPORT
|
||||||
/* The GNU C library provides support for user-defined character classes
|
/* The GNU C library provides support for user-defined character classes
|
||||||
and the functions from ISO C amendement 1. */
|
and the functions from ISO C amendment 1. */
|
||||||
# ifdef CHARCLASS_NAME_MAX
|
# ifdef CHARCLASS_NAME_MAX
|
||||||
# define CHAR_CLASS_MAX_LENGTH CHARCLASS_NAME_MAX
|
# define CHAR_CLASS_MAX_LENGTH CHARCLASS_NAME_MAX
|
||||||
# else
|
# else
|
||||||
|
@ -120,7 +118,7 @@ extern int fnmatch (const char *pattern, const char *string, int flags);
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
# else
|
# else
|
||||||
# define CHAR_CLASS_MAX_LENGTH 6 /* Namely, `xdigit'. */
|
# define CHAR_CLASS_MAX_LENGTH 6 /* Namely, 'xdigit'. */
|
||||||
|
|
||||||
# define IS_CHAR_CLASS(string) \
|
# define IS_CHAR_CLASS(string) \
|
||||||
(STREQ (string, "alpha") || STREQ (string, "upper") \
|
(STREQ (string, "alpha") || STREQ (string, "upper") \
|
||||||
|
@ -169,7 +167,6 @@ static int posixly_correct;
|
||||||
# endif
|
# endif
|
||||||
# endif
|
# endif
|
||||||
# define MEMCHR(S, C, N) memchr (S, C, N)
|
# define MEMCHR(S, C, N) memchr (S, C, N)
|
||||||
# define STRCOLL(S1, S2) strcoll (S1, S2)
|
|
||||||
# include "fnmatch_loop.c"
|
# include "fnmatch_loop.c"
|
||||||
|
|
||||||
|
|
||||||
|
@ -197,7 +194,6 @@ static int posixly_correct;
|
||||||
# endif
|
# endif
|
||||||
# endif
|
# endif
|
||||||
# define MEMCHR(S, C, N) wmemchr (S, C, N)
|
# define MEMCHR(S, C, N) wmemchr (S, C, N)
|
||||||
# define STRCOLL(S1, S2) wcscoll (S1, S2)
|
|
||||||
# define WIDE_CHAR_VERSION 1
|
# define WIDE_CHAR_VERSION 1
|
||||||
|
|
||||||
# undef IS_CHAR_CLASS
|
# undef IS_CHAR_CLASS
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* Copyright (C) 1991, 1992, 1993, 1996, 1997, 1998, 1999, 2001, 2002, 2003,
|
/* Copyright (C) 1991-1993, 1996-1999, 2001-2003, 2005, 2007, 2009-2013 Free
|
||||||
2005, 2007, 2009, 2010 Free Software Foundation, Inc.
|
Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
|
@ -14,8 +14,7 @@
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program; if not, write to the Free Software Foundation,
|
along with this program; if not, see <http://www.gnu.org/licenses/>. */
|
||||||
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
|
||||||
|
|
||||||
#ifndef _FNMATCH_H
|
#ifndef _FNMATCH_H
|
||||||
#define _FNMATCH_H 1
|
#define _FNMATCH_H 1
|
||||||
|
@ -32,23 +31,23 @@ extern "C" {
|
||||||
#undef FNM_NOESCAPE
|
#undef FNM_NOESCAPE
|
||||||
#undef FNM_PERIOD
|
#undef FNM_PERIOD
|
||||||
|
|
||||||
/* Bits set in the FLAGS argument to `fnmatch'. */
|
/* Bits set in the FLAGS argument to 'fnmatch'. */
|
||||||
#define FNM_PATHNAME (1 << 0) /* No wildcard can ever match `/'. */
|
#define FNM_PATHNAME (1 << 0) /* No wildcard can ever match '/'. */
|
||||||
#define FNM_NOESCAPE (1 << 1) /* Backslashes don't quote special chars. */
|
#define FNM_NOESCAPE (1 << 1) /* Backslashes don't quote special chars. */
|
||||||
#define FNM_PERIOD (1 << 2) /* Leading `.' is matched only explicitly. */
|
#define FNM_PERIOD (1 << 2) /* Leading '.' is matched only explicitly. */
|
||||||
|
|
||||||
#if !defined _POSIX_C_SOURCE || _POSIX_C_SOURCE < 2 || defined _GNU_SOURCE
|
#if !defined _POSIX_C_SOURCE || _POSIX_C_SOURCE < 2 || defined _GNU_SOURCE
|
||||||
# define FNM_FILE_NAME FNM_PATHNAME /* Preferred GNU name. */
|
# define FNM_FILE_NAME FNM_PATHNAME /* Preferred GNU name. */
|
||||||
# define FNM_LEADING_DIR (1 << 3) /* Ignore `/...' after a match. */
|
# define FNM_LEADING_DIR (1 << 3) /* Ignore '/...' after a match. */
|
||||||
# define FNM_CASEFOLD (1 << 4) /* Compare without regard to case. */
|
# define FNM_CASEFOLD (1 << 4) /* Compare without regard to case. */
|
||||||
# define FNM_EXTMATCH (1 << 5) /* Use ksh-like extended matching. */
|
# define FNM_EXTMATCH (1 << 5) /* Use ksh-like extended matching. */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Value returned by `fnmatch' if STRING does not match PATTERN. */
|
/* Value returned by 'fnmatch' if STRING does not match PATTERN. */
|
||||||
#define FNM_NOMATCH 1
|
#define FNM_NOMATCH 1
|
||||||
|
|
||||||
/* This value is returned if the implementation does not support
|
/* This value is returned if the implementation does not support
|
||||||
`fnmatch'. Since this is not the case here it will never be
|
'fnmatch'. Since this is not the case here it will never be
|
||||||
returned but the conformance test suites still require the symbol
|
returned but the conformance test suites still require the symbol
|
||||||
to be defined. */
|
to be defined. */
|
||||||
#ifdef _XOPEN_SOURCE
|
#ifdef _XOPEN_SOURCE
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
/* Copyright (C) 1991, 1992, 1993, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
|
/* Copyright (C) 1991-1993, 1996-2006, 2009-2013 Free Software Foundation, Inc.
|
||||||
2003, 2004, 2005, 2006, 2009, 2010 Free Software Foundation, Inc.
|
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
@ -13,8 +12,7 @@
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program; if not, write to the Free Software Foundation,
|
along with this program; if not, see <http://www.gnu.org/licenses/>. */
|
||||||
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
|
||||||
|
|
||||||
/* Match STRING against the file name pattern PATTERN, returning zero if
|
/* Match STRING against the file name pattern PATTERN, returning zero if
|
||||||
it matches, nonzero if not. */
|
it matches, nonzero if not. */
|
||||||
|
@ -201,6 +199,8 @@ FCT (const CHAR *pattern, const CHAR *string, const CHAR *string_end,
|
||||||
case L_('['):
|
case L_('['):
|
||||||
{
|
{
|
||||||
/* Nonzero if the sense of the character class is inverted. */
|
/* Nonzero if the sense of the character class is inverted. */
|
||||||
|
const CHAR *p_init = p;
|
||||||
|
const CHAR *n_init = n;
|
||||||
register bool not;
|
register bool not;
|
||||||
CHAR cold;
|
CHAR cold;
|
||||||
UCHAR fn;
|
UCHAR fn;
|
||||||
|
@ -215,7 +215,7 @@ FCT (const CHAR *pattern, const CHAR *string, const CHAR *string_end,
|
||||||
return FNM_NOMATCH;
|
return FNM_NOMATCH;
|
||||||
|
|
||||||
if (*n == L_('/') && (flags & FNM_FILE_NAME))
|
if (*n == L_('/') && (flags & FNM_FILE_NAME))
|
||||||
/* `/' cannot be matched. */
|
/* '/' cannot be matched. */
|
||||||
return FNM_NOMATCH;
|
return FNM_NOMATCH;
|
||||||
|
|
||||||
not = (*p == L_('!') || (posixly_correct < 0 && *p == L_('^')));
|
not = (*p == L_('!') || (posixly_correct < 0 && *p == L_('^')));
|
||||||
|
@ -381,7 +381,7 @@ FCT (const CHAR *pattern, const CHAR *string, const CHAR *string_end,
|
||||||
{
|
{
|
||||||
/* We found a table entry. Now see whether the
|
/* We found a table entry. Now see whether the
|
||||||
character we are currently at has the same
|
character we are currently at has the same
|
||||||
equivalance class value. */
|
equivalence class value. */
|
||||||
int len = weights[idx & 0xffffff];
|
int len = weights[idx & 0xffffff];
|
||||||
int32_t idx2;
|
int32_t idx2;
|
||||||
const UCHAR *np = (const UCHAR *) n;
|
const UCHAR *np = (const UCHAR *) n;
|
||||||
|
@ -411,8 +411,13 @@ FCT (const CHAR *pattern, const CHAR *string, const CHAR *string_end,
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
else if (c == L_('\0'))
|
else if (c == L_('\0'))
|
||||||
/* [ (unterminated) loses. */
|
{
|
||||||
return FNM_NOMATCH;
|
/* [ unterminated, treat as normal character. */
|
||||||
|
p = p_init;
|
||||||
|
n = n_init;
|
||||||
|
c = L_('[');
|
||||||
|
goto normal_match;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
bool is_range = false;
|
bool is_range = false;
|
||||||
|
@ -630,7 +635,7 @@ FCT (const CHAR *pattern, const CHAR *string, const CHAR *string_end,
|
||||||
UCHAR cend = *p++;
|
UCHAR cend = *p++;
|
||||||
|
|
||||||
# ifdef WIDE_CHAR_VERSION
|
# ifdef WIDE_CHAR_VERSION
|
||||||
/* Search in the `names' array for the characters. */
|
/* Search in the 'names' array for the characters. */
|
||||||
fcollseq = __collseq_table_lookup (collseq, fn);
|
fcollseq = __collseq_table_lookup (collseq, fn);
|
||||||
if (fcollseq == ~((uint32_t) 0))
|
if (fcollseq == ~((uint32_t) 0))
|
||||||
/* XXX We don't know anything about the character
|
/* XXX We don't know anything about the character
|
||||||
|
@ -833,7 +838,7 @@ FCT (const CHAR *pattern, const CHAR *string, const CHAR *string_end,
|
||||||
#else
|
#else
|
||||||
/* We use a boring value comparison of the character
|
/* We use a boring value comparison of the character
|
||||||
values. This is better than comparing using
|
values. This is better than comparing using
|
||||||
`strcoll' since the latter would have surprising
|
'strcoll' since the latter would have surprising
|
||||||
and sometimes fatal consequences. */
|
and sometimes fatal consequences. */
|
||||||
UCHAR cend = *p++;
|
UCHAR cend = *p++;
|
||||||
|
|
||||||
|
@ -1150,7 +1155,7 @@ EXT (INT opt, const CHAR *pattern, const CHAR *string, const CHAR *string_end,
|
||||||
|
|
||||||
case L_('@'):
|
case L_('@'):
|
||||||
do
|
do
|
||||||
/* I cannot believe it but `strcat' is actually acceptable
|
/* I cannot believe it but 'strcat' is actually acceptable
|
||||||
here. Match the entire string with the prefix from the
|
here. Match the entire string with the prefix from the
|
||||||
pattern list and the rest of the pattern following the
|
pattern list and the rest of the pattern following the
|
||||||
pattern list. */
|
pattern list. */
|
||||||
|
@ -1208,7 +1213,6 @@ EXT (INT opt, const CHAR *pattern, const CHAR *string, const CHAR *string_end,
|
||||||
#undef END
|
#undef END
|
||||||
#undef MEMPCPY
|
#undef MEMPCPY
|
||||||
#undef MEMCHR
|
#undef MEMCHR
|
||||||
#undef STRCOLL
|
|
||||||
#undef STRLEN
|
#undef STRLEN
|
||||||
#undef STRCAT
|
#undef STRCAT
|
||||||
#undef L_
|
#undef L_
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* getdelim.c --- Implementation of replacement getdelim function.
|
/* getdelim.c --- Implementation of replacement getdelim function.
|
||||||
Copyright (C) 1994, 1996, 1997, 1998, 2001, 2003, 2005, 2006, 2007, 2008,
|
Copyright (C) 1994, 1996-1998, 2001, 2003, 2005-2013 Free Software
|
||||||
2009, 2010 Free Software Foundation, Inc.
|
Foundation, Inc.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or
|
This program is free software; you can redistribute it and/or
|
||||||
modify it under the terms of the GNU General Public License as
|
modify it under the terms of the GNU General Public License as
|
||||||
|
@ -13,18 +13,16 @@
|
||||||
General Public License for more details.
|
General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program; if not, write to the Free Software
|
along with this program; if not, see <http://www.gnu.org/licenses/>. */
|
||||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
||||||
02110-1301, USA. */
|
|
||||||
|
|
||||||
/* Ported from glibc by Simon Josefsson. */
|
/* Ported from glibc by Simon Josefsson. */
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
/* Don't use __attribute__ __nonnull__ in this compilation unit. Otherwise gcc
|
/* Don't use __attribute__ __nonnull__ in this compilation unit. Otherwise gcc
|
||||||
optimizes away the lineptr == NULL || n == NULL || fp == NULL tests below. */
|
optimizes away the lineptr == NULL || n == NULL || fp == NULL tests below. */
|
||||||
#define _GL_ARG_NONNULL(params)
|
#define _GL_ARG_NONNULL(params)
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* getline.c --- Implementation of replacement getline function.
|
/* getline.c --- Implementation of replacement getline function.
|
||||||
Copyright (C) 2005, 2006, 2007, 2009, 2010 Free Software Foundation, Inc.
|
Copyright (C) 2005-2007, 2009-2013 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or
|
This program is free software; you can redistribute it and/or
|
||||||
modify it under the terms of the GNU General Public License as
|
modify it under the terms of the GNU General Public License as
|
||||||
|
@ -12,9 +12,7 @@
|
||||||
General Public License for more details.
|
General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program; if not, write to the Free Software
|
along with this program; if not, see <http://www.gnu.org/licenses/>. */
|
||||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
||||||
02110-1301, USA. */
|
|
||||||
|
|
||||||
/* Written by Simon Josefsson. */
|
/* Written by Simon Josefsson. */
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
NOTE: getopt is part of the C library, so if you don't know what
|
NOTE: getopt is part of the C library, so if you don't know what
|
||||||
"Keep this file name-space clean" means, talk to drepper@gnu.org
|
"Keep this file name-space clean" means, talk to drepper@gnu.org
|
||||||
before changing it!
|
before changing it!
|
||||||
Copyright (C) 1987-1996, 1998-2004, 2006, 2008-2010 Free Software
|
Copyright (C) 1987-1996, 1998-2004, 2006, 2008-2013 Free Software
|
||||||
Foundation, Inc.
|
Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
|
@ -41,15 +41,15 @@
|
||||||
# include <wchar.h>
|
# include <wchar.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* This version of `getopt' appears to the caller like standard Unix `getopt'
|
/* This version of 'getopt' appears to the caller like standard Unix 'getopt'
|
||||||
but it behaves differently for the user, since it allows the user
|
but it behaves differently for the user, since it allows the user
|
||||||
to intersperse the options with the other arguments.
|
to intersperse the options with the other arguments.
|
||||||
|
|
||||||
As `getopt_long' works, it permutes the elements of ARGV so that,
|
As 'getopt_long' works, it permutes the elements of ARGV so that,
|
||||||
when it is done, all the options precede everything else. Thus
|
when it is done, all the options precede everything else. Thus
|
||||||
all application programs are extended to handle flexible argument order.
|
all application programs are extended to handle flexible argument order.
|
||||||
|
|
||||||
Using `getopt' or setting the environment variable POSIXLY_CORRECT
|
Using 'getopt' or setting the environment variable POSIXLY_CORRECT
|
||||||
disables permutation.
|
disables permutation.
|
||||||
Then the behavior is completely standard.
|
Then the behavior is completely standard.
|
||||||
|
|
||||||
|
@ -58,24 +58,24 @@
|
||||||
|
|
||||||
#include "getopt_int.h"
|
#include "getopt_int.h"
|
||||||
|
|
||||||
/* For communication from `getopt' to the caller.
|
/* For communication from 'getopt' to the caller.
|
||||||
When `getopt' finds an option that takes an argument,
|
When 'getopt' finds an option that takes an argument,
|
||||||
the argument value is returned here.
|
the argument value is returned here.
|
||||||
Also, when `ordering' is RETURN_IN_ORDER,
|
Also, when 'ordering' is RETURN_IN_ORDER,
|
||||||
each non-option ARGV-element is returned here. */
|
each non-option ARGV-element is returned here. */
|
||||||
|
|
||||||
char *optarg;
|
char *optarg;
|
||||||
|
|
||||||
/* Index in ARGV of the next element to be scanned.
|
/* Index in ARGV of the next element to be scanned.
|
||||||
This is used for communication to and from the caller
|
This is used for communication to and from the caller
|
||||||
and for communication between successive calls to `getopt'.
|
and for communication between successive calls to 'getopt'.
|
||||||
|
|
||||||
On entry to `getopt', zero means this is the first call; initialize.
|
On entry to 'getopt', zero means this is the first call; initialize.
|
||||||
|
|
||||||
When `getopt' returns -1, this is the index of the first of the
|
When 'getopt' returns -1, this is the index of the first of the
|
||||||
non-option elements that the caller should itself scan.
|
non-option elements that the caller should itself scan.
|
||||||
|
|
||||||
Otherwise, `optind' communicates from one call to the next
|
Otherwise, 'optind' communicates from one call to the next
|
||||||
how much of ARGV has been scanned so far. */
|
how much of ARGV has been scanned so far. */
|
||||||
|
|
||||||
/* 1003.2 says this must be 1 before any call. */
|
/* 1003.2 says this must be 1 before any call. */
|
||||||
|
@ -137,7 +137,7 @@ extern char *__getopt_nonoption_flags;
|
||||||
The other is elements [last_nonopt,optind), which contains all
|
The other is elements [last_nonopt,optind), which contains all
|
||||||
the options processed since those non-options were skipped.
|
the options processed since those non-options were skipped.
|
||||||
|
|
||||||
`first_nonopt' and `last_nonopt' are relocated so that they describe
|
'first_nonopt' and 'last_nonopt' are relocated so that they describe
|
||||||
the new indices of the non-options in ARGV after they are moved. */
|
the new indices of the non-options in ARGV after they are moved. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -154,7 +154,7 @@ exchange (char **argv, struct _getopt_data *d)
|
||||||
but it consists of two parts that need to be swapped next. */
|
but it consists of two parts that need to be swapped next. */
|
||||||
|
|
||||||
#if defined _LIBC && defined USE_NONOPTION_FLAGS
|
#if defined _LIBC && defined USE_NONOPTION_FLAGS
|
||||||
/* First make sure the handling of the `__getopt_nonoption_flags'
|
/* First make sure the handling of the '__getopt_nonoption_flags'
|
||||||
string can work normally. Our top argument must be in the range
|
string can work normally. Our top argument must be in the range
|
||||||
of the string. */
|
of the string. */
|
||||||
if (d->__nonoption_flags_len > 0 && top >= d->__nonoption_flags_max_len)
|
if (d->__nonoption_flags_len > 0 && top >= d->__nonoption_flags_max_len)
|
||||||
|
@ -291,48 +291,48 @@ _getopt_initialize (int argc _GL_UNUSED,
|
||||||
|
|
||||||
If an element of ARGV starts with '-', and is not exactly "-" or "--",
|
If an element of ARGV starts with '-', and is not exactly "-" or "--",
|
||||||
then it is an option element. The characters of this element
|
then it is an option element. The characters of this element
|
||||||
(aside from the initial '-') are option characters. If `getopt'
|
(aside from the initial '-') are option characters. If 'getopt'
|
||||||
is called repeatedly, it returns successively each of the option characters
|
is called repeatedly, it returns successively each of the option characters
|
||||||
from each of the option elements.
|
from each of the option elements.
|
||||||
|
|
||||||
If `getopt' finds another option character, it returns that character,
|
If 'getopt' finds another option character, it returns that character,
|
||||||
updating `optind' and `nextchar' so that the next call to `getopt' can
|
updating 'optind' and 'nextchar' so that the next call to 'getopt' can
|
||||||
resume the scan with the following option character or ARGV-element.
|
resume the scan with the following option character or ARGV-element.
|
||||||
|
|
||||||
If there are no more option characters, `getopt' returns -1.
|
If there are no more option characters, 'getopt' returns -1.
|
||||||
Then `optind' is the index in ARGV of the first ARGV-element
|
Then 'optind' is the index in ARGV of the first ARGV-element
|
||||||
that is not an option. (The ARGV-elements have been permuted
|
that is not an option. (The ARGV-elements have been permuted
|
||||||
so that those that are not options now come last.)
|
so that those that are not options now come last.)
|
||||||
|
|
||||||
OPTSTRING is a string containing the legitimate option characters.
|
OPTSTRING is a string containing the legitimate option characters.
|
||||||
If an option character is seen that is not listed in OPTSTRING,
|
If an option character is seen that is not listed in OPTSTRING,
|
||||||
return '?' after printing an error message. If you set `opterr' to
|
return '?' after printing an error message. If you set 'opterr' to
|
||||||
zero, the error message is suppressed but we still return '?'.
|
zero, the error message is suppressed but we still return '?'.
|
||||||
|
|
||||||
If a char in OPTSTRING is followed by a colon, that means it wants an arg,
|
If a char in OPTSTRING is followed by a colon, that means it wants an arg,
|
||||||
so the following text in the same ARGV-element, or the text of the following
|
so the following text in the same ARGV-element, or the text of the following
|
||||||
ARGV-element, is returned in `optarg'. Two colons mean an option that
|
ARGV-element, is returned in 'optarg'. Two colons mean an option that
|
||||||
wants an optional arg; if there is text in the current ARGV-element,
|
wants an optional arg; if there is text in the current ARGV-element,
|
||||||
it is returned in `optarg', otherwise `optarg' is set to zero.
|
it is returned in 'optarg', otherwise 'optarg' is set to zero.
|
||||||
|
|
||||||
If OPTSTRING starts with `-' or `+', it requests different methods of
|
If OPTSTRING starts with '-' or '+', it requests different methods of
|
||||||
handling the non-option ARGV-elements.
|
handling the non-option ARGV-elements.
|
||||||
See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above.
|
See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above.
|
||||||
|
|
||||||
Long-named options begin with `--' instead of `-'.
|
Long-named options begin with '--' instead of '-'.
|
||||||
Their names may be abbreviated as long as the abbreviation is unique
|
Their names may be abbreviated as long as the abbreviation is unique
|
||||||
or is an exact match for some defined option. If they have an
|
or is an exact match for some defined option. If they have an
|
||||||
argument, it follows the option name in the same ARGV-element, separated
|
argument, it follows the option name in the same ARGV-element, separated
|
||||||
from the option name by a `=', or else the in next ARGV-element.
|
from the option name by a '=', or else the in next ARGV-element.
|
||||||
When `getopt' finds a long-named option, it returns 0 if that option's
|
When 'getopt' finds a long-named option, it returns 0 if that option's
|
||||||
`flag' field is nonzero, the value of the option's `val' field
|
'flag' field is nonzero, the value of the option's 'val' field
|
||||||
if the `flag' field is zero.
|
if the 'flag' field is zero.
|
||||||
|
|
||||||
The elements of ARGV aren't really const, because we permute them.
|
The elements of ARGV aren't really const, because we permute them.
|
||||||
But we pretend they're const in the prototype to be compatible
|
But we pretend they're const in the prototype to be compatible
|
||||||
with other systems.
|
with other systems.
|
||||||
|
|
||||||
LONGOPTS is a vector of `struct option' terminated by an
|
LONGOPTS is a vector of 'struct option' terminated by an
|
||||||
element containing a name which is zero.
|
element containing a name which is zero.
|
||||||
|
|
||||||
LONGIND returns the index in LONGOPT of the long-named option found.
|
LONGIND returns the index in LONGOPT of the long-named option found.
|
||||||
|
@ -409,7 +409,7 @@ _getopt_internal_r (int argc, char **argv, const char *optstring,
|
||||||
d->__last_nonopt = d->optind;
|
d->__last_nonopt = d->optind;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The special ARGV-element `--' means premature end of options.
|
/* The special ARGV-element '--' means premature end of options.
|
||||||
Skip it like a null option,
|
Skip it like a null option,
|
||||||
then exchange with previous non-options as if it were an option,
|
then exchange with previous non-options as if it were an option,
|
||||||
then skip everything else like a non-option. */
|
then skip everything else like a non-option. */
|
||||||
|
@ -479,23 +479,28 @@ _getopt_internal_r (int argc, char **argv, const char *optstring,
|
||||||
|| !strchr (optstring, argv[d->optind][1])))))
|
|| !strchr (optstring, argv[d->optind][1])))))
|
||||||
{
|
{
|
||||||
char *nameend;
|
char *nameend;
|
||||||
|
unsigned int namelen;
|
||||||
const struct option *p;
|
const struct option *p;
|
||||||
const struct option *pfound = NULL;
|
const struct option *pfound = NULL;
|
||||||
|
struct option_list
|
||||||
|
{
|
||||||
|
const struct option *p;
|
||||||
|
struct option_list *next;
|
||||||
|
} *ambig_list = NULL;
|
||||||
int exact = 0;
|
int exact = 0;
|
||||||
int ambig = 0;
|
|
||||||
int indfound = -1;
|
int indfound = -1;
|
||||||
int option_index;
|
int option_index;
|
||||||
|
|
||||||
for (nameend = d->__nextchar; *nameend && *nameend != '='; nameend++)
|
for (nameend = d->__nextchar; *nameend && *nameend != '='; nameend++)
|
||||||
/* Do nothing. */ ;
|
/* Do nothing. */ ;
|
||||||
|
namelen = nameend - d->__nextchar;
|
||||||
|
|
||||||
/* Test all long options for either exact match
|
/* Test all long options for either exact match
|
||||||
or abbreviated matches. */
|
or abbreviated matches. */
|
||||||
for (p = longopts, option_index = 0; p->name; p++, option_index++)
|
for (p = longopts, option_index = 0; p->name; p++, option_index++)
|
||||||
if (!strncmp (p->name, d->__nextchar, nameend - d->__nextchar))
|
if (!strncmp (p->name, d->__nextchar, namelen))
|
||||||
{
|
{
|
||||||
if ((unsigned int) (nameend - d->__nextchar)
|
if (namelen == (unsigned int) strlen (p->name))
|
||||||
== (unsigned int) strlen (p->name))
|
|
||||||
{
|
{
|
||||||
/* Exact match found. */
|
/* Exact match found. */
|
||||||
pfound = p;
|
pfound = p;
|
||||||
|
@ -513,35 +518,71 @@ _getopt_internal_r (int argc, char **argv, const char *optstring,
|
||||||
|| pfound->has_arg != p->has_arg
|
|| pfound->has_arg != p->has_arg
|
||||||
|| pfound->flag != p->flag
|
|| pfound->flag != p->flag
|
||||||
|| pfound->val != p->val)
|
|| pfound->val != p->val)
|
||||||
/* Second or later nonexact match found. */
|
{
|
||||||
ambig = 1;
|
/* Second or later nonexact match found. */
|
||||||
|
struct option_list *newp = malloc (sizeof (*newp));
|
||||||
|
newp->p = p;
|
||||||
|
newp->next = ambig_list;
|
||||||
|
ambig_list = newp;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ambig && !exact)
|
if (ambig_list != NULL && !exact)
|
||||||
{
|
{
|
||||||
if (print_errors)
|
if (print_errors)
|
||||||
{
|
{
|
||||||
|
struct option_list first;
|
||||||
|
first.p = pfound;
|
||||||
|
first.next = ambig_list;
|
||||||
|
ambig_list = &first;
|
||||||
|
|
||||||
#if defined _LIBC && defined USE_IN_LIBIO
|
#if defined _LIBC && defined USE_IN_LIBIO
|
||||||
char *buf;
|
char *buf = NULL;
|
||||||
|
size_t buflen = 0;
|
||||||
|
|
||||||
if (__asprintf (&buf, _("%s: option '%s' is ambiguous\n"),
|
FILE *fp = open_memstream (&buf, &buflen);
|
||||||
argv[0], argv[d->optind]) >= 0)
|
if (fp != NULL)
|
||||||
{
|
{
|
||||||
_IO_flockfile (stderr);
|
fprintf (fp,
|
||||||
|
_("%s: option '%s' is ambiguous; possibilities:"),
|
||||||
|
argv[0], argv[d->optind]);
|
||||||
|
|
||||||
int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
|
do
|
||||||
((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
|
{
|
||||||
|
fprintf (fp, " '--%s'", ambig_list->p->name);
|
||||||
|
ambig_list = ambig_list->next;
|
||||||
|
}
|
||||||
|
while (ambig_list != NULL);
|
||||||
|
|
||||||
__fxprintf (NULL, "%s", buf);
|
fputc_unlocked ('\n', fp);
|
||||||
|
|
||||||
((_IO_FILE *) stderr)->_flags2 = old_flags2;
|
if (__builtin_expect (fclose (fp) != EOF, 1))
|
||||||
_IO_funlockfile (stderr);
|
{
|
||||||
|
_IO_flockfile (stderr);
|
||||||
|
|
||||||
free (buf);
|
int old_flags2 = ((_IO_FILE *) stderr)->_flags2;
|
||||||
|
((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL;
|
||||||
|
|
||||||
|
__fxprintf (NULL, "%s", buf);
|
||||||
|
|
||||||
|
((_IO_FILE *) stderr)->_flags2 = old_flags2;
|
||||||
|
_IO_funlockfile (stderr);
|
||||||
|
|
||||||
|
free (buf);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
fprintf (stderr, _("%s: option '%s' is ambiguous\n"),
|
fprintf (stderr,
|
||||||
|
_("%s: option '%s' is ambiguous; possibilities:"),
|
||||||
argv[0], argv[d->optind]);
|
argv[0], argv[d->optind]);
|
||||||
|
do
|
||||||
|
{
|
||||||
|
fprintf (stderr, " '--%s'", ambig_list->p->name);
|
||||||
|
ambig_list = ambig_list->next;
|
||||||
|
}
|
||||||
|
while (ambig_list != NULL);
|
||||||
|
|
||||||
|
fputc ('\n', stderr);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
d->__nextchar += strlen (d->__nextchar);
|
d->__nextchar += strlen (d->__nextchar);
|
||||||
|
@ -550,6 +591,13 @@ _getopt_internal_r (int argc, char **argv, const char *optstring,
|
||||||
return '?';
|
return '?';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
while (ambig_list != NULL)
|
||||||
|
{
|
||||||
|
struct option_list *pn = ambig_list->next;
|
||||||
|
free (ambig_list);
|
||||||
|
ambig_list = pn;
|
||||||
|
}
|
||||||
|
|
||||||
if (pfound != NULL)
|
if (pfound != NULL)
|
||||||
{
|
{
|
||||||
option_index = indfound;
|
option_index = indfound;
|
||||||
|
@ -740,7 +788,7 @@ _getopt_internal_r (int argc, char **argv, const char *optstring,
|
||||||
char c = *d->__nextchar++;
|
char c = *d->__nextchar++;
|
||||||
const char *temp = strchr (optstring, c);
|
const char *temp = strchr (optstring, c);
|
||||||
|
|
||||||
/* Increment `optind' when we start to process its last character. */
|
/* Increment 'optind' when we start to process its last character. */
|
||||||
if (*d->__nextchar == '\0')
|
if (*d->__nextchar == '\0')
|
||||||
++d->optind;
|
++d->optind;
|
||||||
|
|
||||||
|
@ -791,6 +839,9 @@ _getopt_internal_r (int argc, char **argv, const char *optstring,
|
||||||
int indfound = 0;
|
int indfound = 0;
|
||||||
int option_index;
|
int option_index;
|
||||||
|
|
||||||
|
if (longopts == NULL)
|
||||||
|
goto no_longs;
|
||||||
|
|
||||||
/* This is an option that requires an argument. */
|
/* This is an option that requires an argument. */
|
||||||
if (*d->__nextchar != '\0')
|
if (*d->__nextchar != '\0')
|
||||||
{
|
{
|
||||||
|
@ -836,7 +887,7 @@ _getopt_internal_r (int argc, char **argv, const char *optstring,
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
/* We already incremented `d->optind' once;
|
/* We already incremented 'd->optind' once;
|
||||||
increment it again when taking next ARGV-elt as argument. */
|
increment it again when taking next ARGV-elt as argument. */
|
||||||
d->optarg = argv[d->optind++];
|
d->optarg = argv[d->optind++];
|
||||||
|
|
||||||
|
@ -998,8 +1049,10 @@ _getopt_internal_r (int argc, char **argv, const char *optstring,
|
||||||
}
|
}
|
||||||
return pfound->val;
|
return pfound->val;
|
||||||
}
|
}
|
||||||
d->__nextchar = NULL;
|
|
||||||
return 'W'; /* Let the application handle it. */
|
no_longs:
|
||||||
|
d->__nextchar = NULL;
|
||||||
|
return 'W'; /* Let the application handle it. */
|
||||||
}
|
}
|
||||||
if (temp[1] == ':')
|
if (temp[1] == ':')
|
||||||
{
|
{
|
||||||
|
@ -1061,7 +1114,7 @@ _getopt_internal_r (int argc, char **argv, const char *optstring,
|
||||||
c = '?';
|
c = '?';
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
/* We already incremented `optind' once;
|
/* We already incremented 'optind' once;
|
||||||
increment it again when taking next ARGV-elt as argument. */
|
increment it again when taking next ARGV-elt as argument. */
|
||||||
d->optarg = argv[d->optind++];
|
d->optarg = argv[d->optind++];
|
||||||
d->__nextchar = NULL;
|
d->__nextchar = NULL;
|
||||||
|
@ -1124,7 +1177,7 @@ __posix_getopt (int argc, char *const *argv, const char *optstring)
|
||||||
#ifdef TEST
|
#ifdef TEST
|
||||||
|
|
||||||
/* Compile with -DTEST to make an executable for use in testing
|
/* Compile with -DTEST to make an executable for use in testing
|
||||||
the above definition of `getopt'. */
|
the above definition of 'getopt'. */
|
||||||
|
|
||||||
int
|
int
|
||||||
main (int argc, char **argv)
|
main (int argc, char **argv)
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* Declarations for getopt.
|
/* Declarations for getopt.
|
||||||
Copyright (C) 1989-1994, 1996-1999, 2001, 2003-2007, 2009-2010 Free Software
|
Copyright (C) 1989-1994, 1996-1999, 2001, 2003-2007, 2009-2013 Free Software
|
||||||
Foundation, Inc.
|
Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
|
@ -16,11 +16,12 @@
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
#ifndef _GL_GETOPT_H
|
#ifndef _@GUARD_PREFIX@_GETOPT_H
|
||||||
|
|
||||||
#if __GNUC__ >= 3
|
#if __GNUC__ >= 3
|
||||||
@PRAGMA_SYSTEM_HEADER@
|
@PRAGMA_SYSTEM_HEADER@
|
||||||
#endif
|
#endif
|
||||||
|
@PRAGMA_COLUMNS@
|
||||||
|
|
||||||
/* The include_next requires a split double-inclusion guard. We must
|
/* The include_next requires a split double-inclusion guard. We must
|
||||||
also inform the replacement unistd.h to not recursively use
|
also inform the replacement unistd.h to not recursively use
|
||||||
|
@ -31,10 +32,10 @@
|
||||||
# undef _GL_SYSTEM_GETOPT
|
# undef _GL_SYSTEM_GETOPT
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef _GL_GETOPT_H
|
#ifndef _@GUARD_PREFIX@_GETOPT_H
|
||||||
|
|
||||||
#ifndef __need_getopt
|
#ifndef __need_getopt
|
||||||
# define _GL_GETOPT_H 1
|
# define _@GUARD_PREFIX@_GETOPT_H 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Standalone applications should #define __GETOPT_PREFIX to an
|
/* Standalone applications should #define __GETOPT_PREFIX to an
|
||||||
|
@ -48,7 +49,9 @@
|
||||||
linkers. */
|
linkers. */
|
||||||
#if defined __GETOPT_PREFIX && !defined __need_getopt
|
#if defined __GETOPT_PREFIX && !defined __need_getopt
|
||||||
# if !@HAVE_GETOPT_H@
|
# if !@HAVE_GETOPT_H@
|
||||||
|
# define __need_system_stdlib_h
|
||||||
# include <stdlib.h>
|
# include <stdlib.h>
|
||||||
|
# undef __need_system_stdlib_h
|
||||||
# include <stdio.h>
|
# include <stdio.h>
|
||||||
# include <unistd.h>
|
# include <unistd.h>
|
||||||
# endif
|
# endif
|
||||||
|
@ -81,7 +84,7 @@
|
||||||
getopt_long_only can permute argv; this is required for backward
|
getopt_long_only can permute argv; this is required for backward
|
||||||
compatibility (e.g., for LSB 2.0.1).
|
compatibility (e.g., for LSB 2.0.1).
|
||||||
|
|
||||||
This used to be `#if defined __GETOPT_PREFIX && !defined __need_getopt',
|
This used to be '#if defined __GETOPT_PREFIX && !defined __need_getopt',
|
||||||
but it caused redefinition warnings if both unistd.h and getopt.h were
|
but it caused redefinition warnings if both unistd.h and getopt.h were
|
||||||
included, since unistd.h includes getopt.h having previously defined
|
included, since unistd.h includes getopt.h having previously defined
|
||||||
__need_getopt.
|
__need_getopt.
|
||||||
|
@ -127,29 +130,29 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* For communication from `getopt' to the caller.
|
/* For communication from 'getopt' to the caller.
|
||||||
When `getopt' finds an option that takes an argument,
|
When 'getopt' finds an option that takes an argument,
|
||||||
the argument value is returned here.
|
the argument value is returned here.
|
||||||
Also, when `ordering' is RETURN_IN_ORDER,
|
Also, when 'ordering' is RETURN_IN_ORDER,
|
||||||
each non-option ARGV-element is returned here. */
|
each non-option ARGV-element is returned here. */
|
||||||
|
|
||||||
extern char *optarg;
|
extern char *optarg;
|
||||||
|
|
||||||
/* Index in ARGV of the next element to be scanned.
|
/* Index in ARGV of the next element to be scanned.
|
||||||
This is used for communication to and from the caller
|
This is used for communication to and from the caller
|
||||||
and for communication between successive calls to `getopt'.
|
and for communication between successive calls to 'getopt'.
|
||||||
|
|
||||||
On entry to `getopt', zero means this is the first call; initialize.
|
On entry to 'getopt', zero means this is the first call; initialize.
|
||||||
|
|
||||||
When `getopt' returns -1, this is the index of the first of the
|
When 'getopt' returns -1, this is the index of the first of the
|
||||||
non-option elements that the caller should itself scan.
|
non-option elements that the caller should itself scan.
|
||||||
|
|
||||||
Otherwise, `optind' communicates from one call to the next
|
Otherwise, 'optind' communicates from one call to the next
|
||||||
how much of ARGV has been scanned so far. */
|
how much of ARGV has been scanned so far. */
|
||||||
|
|
||||||
extern int optind;
|
extern int optind;
|
||||||
|
|
||||||
/* Callers store zero here to inhibit the error message `getopt' prints
|
/* Callers store zero here to inhibit the error message 'getopt' prints
|
||||||
for unrecognized options. */
|
for unrecognized options. */
|
||||||
|
|
||||||
extern int opterr;
|
extern int opterr;
|
||||||
|
@ -161,25 +164,26 @@ extern int optopt;
|
||||||
#ifndef __need_getopt
|
#ifndef __need_getopt
|
||||||
/* Describe the long-named options requested by the application.
|
/* Describe the long-named options requested by the application.
|
||||||
The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector
|
The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector
|
||||||
of `struct option' terminated by an element containing a name which is
|
of 'struct option' terminated by an element containing a name which is
|
||||||
zero.
|
zero.
|
||||||
|
|
||||||
The field `has_arg' is:
|
The field 'has_arg' is:
|
||||||
no_argument (or 0) if the option does not take an argument,
|
no_argument (or 0) if the option does not take an argument,
|
||||||
required_argument (or 1) if the option requires an argument,
|
required_argument (or 1) if the option requires an argument,
|
||||||
optional_argument (or 2) if the option takes an optional argument.
|
optional_argument (or 2) if the option takes an optional argument.
|
||||||
|
|
||||||
If the field `flag' is not NULL, it points to a variable that is set
|
If the field 'flag' is not NULL, it points to a variable that is set
|
||||||
to the value given in the field `val' when the option is found, but
|
to the value given in the field 'val' when the option is found, but
|
||||||
left unchanged if the option is not found.
|
left unchanged if the option is not found.
|
||||||
|
|
||||||
To have a long-named option do something other than set an `int' to
|
To have a long-named option do something other than set an 'int' to
|
||||||
a compiled-in constant, such as set a value from `optarg', set the
|
a compiled-in constant, such as set a value from 'optarg', set the
|
||||||
option's `flag' field to zero and its `val' field to a nonzero
|
option's 'flag' field to zero and its 'val' field to a nonzero
|
||||||
value (the equivalent single-letter option character, if there is
|
value (the equivalent single-letter option character, if there is
|
||||||
one). For long options that have a zero `flag' field, `getopt'
|
one). For long options that have a zero 'flag' field, 'getopt'
|
||||||
returns the contents of the `val' field. */
|
returns the contents of the 'val' field. */
|
||||||
|
|
||||||
|
# if !GNULIB_defined_struct_option
|
||||||
struct option
|
struct option
|
||||||
{
|
{
|
||||||
const char *name;
|
const char *name;
|
||||||
|
@ -189,8 +193,10 @@ struct option
|
||||||
int *flag;
|
int *flag;
|
||||||
int val;
|
int val;
|
||||||
};
|
};
|
||||||
|
# define GNULIB_defined_struct_option 1
|
||||||
|
# endif
|
||||||
|
|
||||||
/* Names for the values of the `has_arg' field of `struct option'. */
|
/* Names for the values of the 'has_arg' field of 'struct option'. */
|
||||||
|
|
||||||
# define no_argument 0
|
# define no_argument 0
|
||||||
# define required_argument 1
|
# define required_argument 1
|
||||||
|
@ -204,23 +210,23 @@ struct option
|
||||||
|
|
||||||
Return the option character from OPTS just read. Return -1 when
|
Return the option character from OPTS just read. Return -1 when
|
||||||
there are no more options. For unrecognized options, or options
|
there are no more options. For unrecognized options, or options
|
||||||
missing arguments, `optopt' is set to the option letter, and '?' is
|
missing arguments, 'optopt' is set to the option letter, and '?' is
|
||||||
returned.
|
returned.
|
||||||
|
|
||||||
The OPTS string is a list of characters which are recognized option
|
The OPTS string is a list of characters which are recognized option
|
||||||
letters, optionally followed by colons, specifying that that letter
|
letters, optionally followed by colons, specifying that that letter
|
||||||
takes an argument, to be placed in `optarg'.
|
takes an argument, to be placed in 'optarg'.
|
||||||
|
|
||||||
If a letter in OPTS is followed by two colons, its argument is
|
If a letter in OPTS is followed by two colons, its argument is
|
||||||
optional. This behavior is specific to the GNU `getopt'.
|
optional. This behavior is specific to the GNU 'getopt'.
|
||||||
|
|
||||||
The argument `--' causes premature termination of argument
|
The argument '--' causes premature termination of argument
|
||||||
scanning, explicitly telling `getopt' that there are no more
|
scanning, explicitly telling 'getopt' that there are no more
|
||||||
options.
|
options.
|
||||||
|
|
||||||
If OPTS begins with `-', then non-option arguments are treated as
|
If OPTS begins with '-', then non-option arguments are treated as
|
||||||
arguments to the option '\1'. This behavior is specific to the GNU
|
arguments to the option '\1'. This behavior is specific to the GNU
|
||||||
`getopt'. If OPTS begins with `+', or POSIXLY_CORRECT is set in
|
'getopt'. If OPTS begins with '+', or POSIXLY_CORRECT is set in
|
||||||
the environment, then do not permute arguments. */
|
the environment, then do not permute arguments. */
|
||||||
|
|
||||||
extern int getopt (int ___argc, char *const *___argv, const char *__shortopts)
|
extern int getopt (int ___argc, char *const *___argv, const char *__shortopts)
|
||||||
|
@ -245,5 +251,5 @@ extern int getopt_long_only (int ___argc, char *__getopt_argv_const *___argv,
|
||||||
/* Make sure we later can get all the definitions and declarations. */
|
/* Make sure we later can get all the definitions and declarations. */
|
||||||
#undef __need_getopt
|
#undef __need_getopt
|
||||||
|
|
||||||
#endif /* getopt.h */
|
#endif /* _@GUARD_PREFIX@_GETOPT_H */
|
||||||
#endif /* getopt.h */
|
#endif /* _@GUARD_PREFIX@_GETOPT_H */
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* getopt_long and getopt_long_only entry points for GNU getopt.
|
/* getopt_long and getopt_long_only entry points for GNU getopt.
|
||||||
Copyright (C) 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1996, 1997,
|
Copyright (C) 1987-1994, 1996-1998, 2004, 2006, 2009-2013 Free Software
|
||||||
1998, 2004, 2006, 2009, 2010 Free Software Foundation, Inc.
|
Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
@ -141,11 +141,11 @@ main (int argc, char **argv)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'c':
|
case 'c':
|
||||||
printf ("option c with value `%s'\n", optarg);
|
printf ("option c with value '%s'\n", optarg);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'd':
|
case 'd':
|
||||||
printf ("option d with value `%s'\n", optarg);
|
printf ("option d with value '%s'\n", optarg);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '?':
|
case '?':
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* Internal declarations for getopt.
|
/* Internal declarations for getopt.
|
||||||
Copyright (C) 1989-1994, 1996-1999, 2001, 2003-2004, 2009-2010 Free Software
|
Copyright (C) 1989-1994, 1996-1999, 2001, 2003-2004, 2009-2013 Free Software
|
||||||
Foundation, Inc.
|
Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
|
@ -40,7 +40,7 @@ extern int _getopt_internal (int ___argc, char **___argv,
|
||||||
stop option processing when the first non-option is seen.
|
stop option processing when the first non-option is seen.
|
||||||
This is what Unix does.
|
This is what Unix does.
|
||||||
This mode of operation is selected by either setting the environment
|
This mode of operation is selected by either setting the environment
|
||||||
variable POSIXLY_CORRECT, or using `+' as the first character
|
variable POSIXLY_CORRECT, or using '+' as the first character
|
||||||
of the list of option characters, or by calling getopt.
|
of the list of option characters, or by calling getopt.
|
||||||
|
|
||||||
PERMUTE is the default. We permute the contents of ARGV as we
|
PERMUTE is the default. We permute the contents of ARGV as we
|
||||||
|
@ -52,12 +52,12 @@ extern int _getopt_internal (int ___argc, char **___argv,
|
||||||
written to expect options and other ARGV-elements in any order
|
written to expect options and other ARGV-elements in any order
|
||||||
and that care about the ordering of the two. We describe each
|
and that care about the ordering of the two. We describe each
|
||||||
non-option ARGV-element as if it were the argument of an option
|
non-option ARGV-element as if it were the argument of an option
|
||||||
with character code 1. Using `-' as the first character of the
|
with character code 1. Using '-' as the first character of the
|
||||||
list of option characters selects this mode of operation.
|
list of option characters selects this mode of operation.
|
||||||
|
|
||||||
The special argument `--' forces an end of option-scanning regardless
|
The special argument '--' forces an end of option-scanning regardless
|
||||||
of the value of `ordering'. In the case of RETURN_IN_ORDER, only
|
of the value of 'ordering'. In the case of RETURN_IN_ORDER, only
|
||||||
`--' can cause `getopt' to return -1 with `optind' != ARGC. */
|
'--' can cause 'getopt' to return -1 with 'optind' != ARGC. */
|
||||||
|
|
||||||
enum __ord
|
enum __ord
|
||||||
{
|
{
|
||||||
|
@ -99,8 +99,8 @@ struct _getopt_data
|
||||||
/* Handle permutation of arguments. */
|
/* Handle permutation of arguments. */
|
||||||
|
|
||||||
/* Describe the part of ARGV that contains non-options that have
|
/* Describe the part of ARGV that contains non-options that have
|
||||||
been skipped. `first_nonopt' is the index in ARGV of the first
|
been skipped. 'first_nonopt' is the index in ARGV of the first
|
||||||
of them; `last_nonopt' is the index after the last of them. */
|
of them; 'last_nonopt' is the index after the last of them. */
|
||||||
|
|
||||||
int __first_nonopt;
|
int __first_nonopt;
|
||||||
int __last_nonopt;
|
int __last_nonopt;
|
||||||
|
@ -108,7 +108,7 @@ struct _getopt_data
|
||||||
#if defined _LIBC && defined USE_NONOPTION_FLAGS
|
#if defined _LIBC && defined USE_NONOPTION_FLAGS
|
||||||
int __nonoption_flags_max_len;
|
int __nonoption_flags_max_len;
|
||||||
int __nonoption_flags_len;
|
int __nonoption_flags_len;
|
||||||
# endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
/* The initializer is necessary to set OPTIND and OPTERR to their
|
/* The initializer is necessary to set OPTIND and OPTERR to their
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* Convenience header for conditional use of GNU <libintl.h>.
|
/* Convenience header for conditional use of GNU <libintl.h>.
|
||||||
Copyright (C) 1995-1998, 2000-2002, 2004-2006, 2009-2010 Free Software
|
Copyright (C) 1995-1998, 2000-2002, 2004-2006, 2009-2013 Free Software
|
||||||
Foundation, Inc.
|
Foundation, Inc.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
@ -13,8 +13,7 @@
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License along
|
||||||
with this program; if not, write to the Free Software Foundation,
|
with this program; if not, see <http://www.gnu.org/licenses/>. */
|
||||||
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
|
||||||
|
|
||||||
#ifndef _LIBGETTEXT_H
|
#ifndef _LIBGETTEXT_H
|
||||||
#define _LIBGETTEXT_H 1
|
#define _LIBGETTEXT_H 1
|
||||||
|
@ -54,7 +53,7 @@
|
||||||
it now, to make later inclusions of <libintl.h> a NOP. */
|
it now, to make later inclusions of <libintl.h> a NOP. */
|
||||||
#if defined(__cplusplus) && defined(__GNUG__) && (__GNUC__ >= 3)
|
#if defined(__cplusplus) && defined(__GNUG__) && (__GNUC__ >= 3)
|
||||||
# include <cstdlib>
|
# include <cstdlib>
|
||||||
# if (__GLIBC__ >= 2) || _GLIBCXX_HAVE_LIBINTL_H
|
# if (__GLIBC__ >= 2 && !defined __UCLIBC__) || _GLIBCXX_HAVE_LIBINTL_H
|
||||||
# include <libintl.h>
|
# include <libintl.h>
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
@ -93,6 +92,12 @@
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Prefer gnulib's setlocale override over libintl's setlocale override. */
|
||||||
|
#ifdef GNULIB_defined_setlocale
|
||||||
|
# undef setlocale
|
||||||
|
# define setlocale rpl_setlocale
|
||||||
|
#endif
|
||||||
|
|
||||||
/* A pseudo function call that serves as a marker for the automated
|
/* A pseudo function call that serves as a marker for the automated
|
||||||
extraction of messages, but does not call gettext(). The run-time
|
extraction of messages, but does not call gettext(). The run-time
|
||||||
translation is done at a different place in the code.
|
translation is done at a different place in the code.
|
||||||
|
@ -178,9 +183,12 @@ npgettext_aux (const char *domain,
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS \
|
#if (((__GNUC__ >= 3 || __GNUG__ >= 2) && !defined __STRICT_ANSI__) \
|
||||||
(((__GNUC__ >= 3 || __GNUG__ >= 2) && !__STRICT_ANSI__) \
|
/* || __STDC_VERSION__ >= 199901L */ )
|
||||||
/* || __STDC_VERSION__ >= 199901L */ )
|
# define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS 1
|
||||||
|
#else
|
||||||
|
# define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS 0
|
||||||
|
#endif
|
||||||
|
|
||||||
#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
|
#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
/* intprops.h -- properties of integer types
|
/* intprops.h -- properties of integer types
|
||||||
|
|
||||||
Copyright (C) 2001, 2002, 2003, 2004, 2005, 2009, 2010 Free Software
|
Copyright (C) 2001-2005, 2009-2013 Free Software Foundation, Inc.
|
||||||
Foundation, Inc.
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -18,66 +17,303 @@
|
||||||
|
|
||||||
/* Written by Paul Eggert. */
|
/* Written by Paul Eggert. */
|
||||||
|
|
||||||
#ifndef GL_INTPROPS_H
|
#ifndef _GL_INTPROPS_H
|
||||||
# define GL_INTPROPS_H
|
#define _GL_INTPROPS_H
|
||||||
|
|
||||||
# include <limits.h>
|
#include <limits.h>
|
||||||
|
|
||||||
|
/* Return an integer value, converted to the same type as the integer
|
||||||
|
expression E after integer type promotion. V is the unconverted value. */
|
||||||
|
#define _GL_INT_CONVERT(e, v) (0 * (e) + (v))
|
||||||
|
|
||||||
|
/* Act like _GL_INT_CONVERT (E, -V) but work around a bug in IRIX 6.5 cc; see
|
||||||
|
<http://lists.gnu.org/archive/html/bug-gnulib/2011-05/msg00406.html>. */
|
||||||
|
#define _GL_INT_NEGATE_CONVERT(e, v) (0 * (e) - (v))
|
||||||
|
|
||||||
/* The extra casts in the following macros work around compiler bugs,
|
/* The extra casts in the following macros work around compiler bugs,
|
||||||
e.g., in Cray C 5.0.3.0. */
|
e.g., in Cray C 5.0.3.0. */
|
||||||
|
|
||||||
/* True if the arithmetic type T is an integer type. bool counts as
|
/* True if the arithmetic type T is an integer type. bool counts as
|
||||||
an integer. */
|
an integer. */
|
||||||
# define TYPE_IS_INTEGER(t) ((t) 1.5 == 1)
|
#define TYPE_IS_INTEGER(t) ((t) 1.5 == 1)
|
||||||
|
|
||||||
/* True if negative values of the signed integer type T use two's
|
/* True if negative values of the signed integer type T use two's
|
||||||
complement, ones' complement, or signed magnitude representation,
|
complement, ones' complement, or signed magnitude representation,
|
||||||
respectively. Much GNU code assumes two's complement, but some
|
respectively. Much GNU code assumes two's complement, but some
|
||||||
people like to be portable to all possible C hosts. */
|
people like to be portable to all possible C hosts. */
|
||||||
# define TYPE_TWOS_COMPLEMENT(t) ((t) ~ (t) 0 == (t) -1)
|
#define TYPE_TWOS_COMPLEMENT(t) ((t) ~ (t) 0 == (t) -1)
|
||||||
# define TYPE_ONES_COMPLEMENT(t) ((t) ~ (t) 0 == 0)
|
#define TYPE_ONES_COMPLEMENT(t) ((t) ~ (t) 0 == 0)
|
||||||
# define TYPE_SIGNED_MAGNITUDE(t) ((t) ~ (t) 0 < (t) -1)
|
#define TYPE_SIGNED_MAGNITUDE(t) ((t) ~ (t) 0 < (t) -1)
|
||||||
|
|
||||||
|
/* True if the signed integer expression E uses two's complement. */
|
||||||
|
#define _GL_INT_TWOS_COMPLEMENT(e) (~ _GL_INT_CONVERT (e, 0) == -1)
|
||||||
|
|
||||||
/* True if the arithmetic type T is signed. */
|
/* True if the arithmetic type T is signed. */
|
||||||
# define TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
|
#define TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
|
||||||
|
|
||||||
/* The maximum and minimum values for the integer type T. These
|
/* Return 1 if the integer expression E, after integer promotion, has
|
||||||
|
a signed type. */
|
||||||
|
#define _GL_INT_SIGNED(e) (_GL_INT_NEGATE_CONVERT (e, 1) < 0)
|
||||||
|
|
||||||
|
|
||||||
|
/* Minimum and maximum values for integer types and expressions. These
|
||||||
macros have undefined behavior if T is signed and has padding bits.
|
macros have undefined behavior if T is signed and has padding bits.
|
||||||
If this is a problem for you, please let us know how to fix it for
|
If this is a problem for you, please let us know how to fix it for
|
||||||
your host. */
|
your host. */
|
||||||
# define TYPE_MINIMUM(t) \
|
|
||||||
((t) (! TYPE_SIGNED (t) \
|
|
||||||
? (t) 0 \
|
|
||||||
: TYPE_SIGNED_MAGNITUDE (t) \
|
|
||||||
? ~ (t) 0 \
|
|
||||||
: ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1)))
|
|
||||||
# define TYPE_MAXIMUM(t) \
|
|
||||||
((t) (! TYPE_SIGNED (t) \
|
|
||||||
? (t) -1 \
|
|
||||||
: ~ (~ (t) 0 << (sizeof (t) * CHAR_BIT - 1))))
|
|
||||||
|
|
||||||
/* Return zero if T can be determined to be an unsigned type.
|
/* The maximum and minimum values for the integer type T. */
|
||||||
Otherwise, return 1.
|
#define TYPE_MINIMUM(t) \
|
||||||
When compiling with GCC, INT_STRLEN_BOUND uses this macro to obtain a
|
((t) (! TYPE_SIGNED (t) \
|
||||||
tighter bound. Otherwise, it overestimates the true bound by one byte
|
? (t) 0 \
|
||||||
when applied to unsigned types of size 2, 4, 16, ... bytes.
|
: TYPE_SIGNED_MAGNITUDE (t) \
|
||||||
The symbol signed_type_or_expr__ is private to this header file. */
|
? ~ (t) 0 \
|
||||||
# if __GNUC__ >= 2
|
: ~ TYPE_MAXIMUM (t)))
|
||||||
# define signed_type_or_expr__(t) TYPE_SIGNED (__typeof__ (t))
|
#define TYPE_MAXIMUM(t) \
|
||||||
# else
|
((t) (! TYPE_SIGNED (t) \
|
||||||
# define signed_type_or_expr__(t) 1
|
? (t) -1 \
|
||||||
# endif
|
: ((((t) 1 << (sizeof (t) * CHAR_BIT - 2)) - 1) * 2 + 1)))
|
||||||
|
|
||||||
|
/* The maximum and minimum values for the type of the expression E,
|
||||||
|
after integer promotion. E should not have side effects. */
|
||||||
|
#define _GL_INT_MINIMUM(e) \
|
||||||
|
(_GL_INT_SIGNED (e) \
|
||||||
|
? - _GL_INT_TWOS_COMPLEMENT (e) - _GL_SIGNED_INT_MAXIMUM (e) \
|
||||||
|
: _GL_INT_CONVERT (e, 0))
|
||||||
|
#define _GL_INT_MAXIMUM(e) \
|
||||||
|
(_GL_INT_SIGNED (e) \
|
||||||
|
? _GL_SIGNED_INT_MAXIMUM (e) \
|
||||||
|
: _GL_INT_NEGATE_CONVERT (e, 1))
|
||||||
|
#define _GL_SIGNED_INT_MAXIMUM(e) \
|
||||||
|
(((_GL_INT_CONVERT (e, 1) << (sizeof ((e) + 0) * CHAR_BIT - 2)) - 1) * 2 + 1)
|
||||||
|
|
||||||
|
|
||||||
|
/* Return 1 if the __typeof__ keyword works. This could be done by
|
||||||
|
'configure', but for now it's easier to do it by hand. */
|
||||||
|
#if 2 <= __GNUC__ || 0x5110 <= __SUNPRO_C
|
||||||
|
# define _GL_HAVE___TYPEOF__ 1
|
||||||
|
#else
|
||||||
|
# define _GL_HAVE___TYPEOF__ 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Return 1 if the integer type or expression T might be signed. Return 0
|
||||||
|
if it is definitely unsigned. This macro does not evaluate its argument,
|
||||||
|
and expands to an integer constant expression. */
|
||||||
|
#if _GL_HAVE___TYPEOF__
|
||||||
|
# define _GL_SIGNED_TYPE_OR_EXPR(t) TYPE_SIGNED (__typeof__ (t))
|
||||||
|
#else
|
||||||
|
# define _GL_SIGNED_TYPE_OR_EXPR(t) 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Bound on length of the string representing an unsigned integer
|
||||||
|
value representable in B bits. log10 (2.0) < 146/485. The
|
||||||
|
smallest value of B where this bound is not tight is 2621. */
|
||||||
|
#define INT_BITS_STRLEN_BOUND(b) (((b) * 146 + 484) / 485)
|
||||||
|
|
||||||
/* Bound on length of the string representing an integer type or expression T.
|
/* Bound on length of the string representing an integer type or expression T.
|
||||||
Subtract 1 for the sign bit if T is signed; log10 (2.0) < 146/485;
|
Subtract 1 for the sign bit if T is signed, and then add 1 more for
|
||||||
add 1 for integer division truncation; add 1 more for a minus sign
|
a minus sign if needed.
|
||||||
if needed. */
|
|
||||||
# define INT_STRLEN_BOUND(t) \
|
Because _GL_SIGNED_TYPE_OR_EXPR sometimes returns 0 when its argument is
|
||||||
((sizeof (t) * CHAR_BIT - signed_type_or_expr__ (t)) * 146 / 485 \
|
signed, this macro may overestimate the true bound by one byte when
|
||||||
+ signed_type_or_expr__ (t) + 1)
|
applied to unsigned types of size 2, 4, 16, ... bytes. */
|
||||||
|
#define INT_STRLEN_BOUND(t) \
|
||||||
|
(INT_BITS_STRLEN_BOUND (sizeof (t) * CHAR_BIT \
|
||||||
|
- _GL_SIGNED_TYPE_OR_EXPR (t)) \
|
||||||
|
+ _GL_SIGNED_TYPE_OR_EXPR (t))
|
||||||
|
|
||||||
/* Bound on buffer size needed to represent an integer type or expression T,
|
/* Bound on buffer size needed to represent an integer type or expression T,
|
||||||
including the terminating null. */
|
including the terminating null. */
|
||||||
# define INT_BUFSIZE_BOUND(t) (INT_STRLEN_BOUND (t) + 1)
|
#define INT_BUFSIZE_BOUND(t) (INT_STRLEN_BOUND (t) + 1)
|
||||||
|
|
||||||
#endif /* GL_INTPROPS_H */
|
|
||||||
|
/* Range overflow checks.
|
||||||
|
|
||||||
|
The INT_<op>_RANGE_OVERFLOW macros return 1 if the corresponding C
|
||||||
|
operators might not yield numerically correct answers due to
|
||||||
|
arithmetic overflow. They do not rely on undefined or
|
||||||
|
implementation-defined behavior. Their implementations are simple
|
||||||
|
and straightforward, but they are a bit harder to use than the
|
||||||
|
INT_<op>_OVERFLOW macros described below.
|
||||||
|
|
||||||
|
Example usage:
|
||||||
|
|
||||||
|
long int i = ...;
|
||||||
|
long int j = ...;
|
||||||
|
if (INT_MULTIPLY_RANGE_OVERFLOW (i, j, LONG_MIN, LONG_MAX))
|
||||||
|
printf ("multiply would overflow");
|
||||||
|
else
|
||||||
|
printf ("product is %ld", i * j);
|
||||||
|
|
||||||
|
Restrictions on *_RANGE_OVERFLOW macros:
|
||||||
|
|
||||||
|
These macros do not check for all possible numerical problems or
|
||||||
|
undefined or unspecified behavior: they do not check for division
|
||||||
|
by zero, for bad shift counts, or for shifting negative numbers.
|
||||||
|
|
||||||
|
These macros may evaluate their arguments zero or multiple times,
|
||||||
|
so the arguments should not have side effects. The arithmetic
|
||||||
|
arguments (including the MIN and MAX arguments) must be of the same
|
||||||
|
integer type after the usual arithmetic conversions, and the type
|
||||||
|
must have minimum value MIN and maximum MAX. Unsigned types should
|
||||||
|
use a zero MIN of the proper type.
|
||||||
|
|
||||||
|
These macros are tuned for constant MIN and MAX. For commutative
|
||||||
|
operations such as A + B, they are also tuned for constant B. */
|
||||||
|
|
||||||
|
/* Return 1 if A + B would overflow in [MIN,MAX] arithmetic.
|
||||||
|
See above for restrictions. */
|
||||||
|
#define INT_ADD_RANGE_OVERFLOW(a, b, min, max) \
|
||||||
|
((b) < 0 \
|
||||||
|
? (a) < (min) - (b) \
|
||||||
|
: (max) - (b) < (a))
|
||||||
|
|
||||||
|
/* Return 1 if A - B would overflow in [MIN,MAX] arithmetic.
|
||||||
|
See above for restrictions. */
|
||||||
|
#define INT_SUBTRACT_RANGE_OVERFLOW(a, b, min, max) \
|
||||||
|
((b) < 0 \
|
||||||
|
? (max) + (b) < (a) \
|
||||||
|
: (a) < (min) + (b))
|
||||||
|
|
||||||
|
/* Return 1 if - A would overflow in [MIN,MAX] arithmetic.
|
||||||
|
See above for restrictions. */
|
||||||
|
#define INT_NEGATE_RANGE_OVERFLOW(a, min, max) \
|
||||||
|
((min) < 0 \
|
||||||
|
? (a) < - (max) \
|
||||||
|
: 0 < (a))
|
||||||
|
|
||||||
|
/* Return 1 if A * B would overflow in [MIN,MAX] arithmetic.
|
||||||
|
See above for restrictions. Avoid && and || as they tickle
|
||||||
|
bugs in Sun C 5.11 2010/08/13 and other compilers; see
|
||||||
|
<http://lists.gnu.org/archive/html/bug-gnulib/2011-05/msg00401.html>. */
|
||||||
|
#define INT_MULTIPLY_RANGE_OVERFLOW(a, b, min, max) \
|
||||||
|
((b) < 0 \
|
||||||
|
? ((a) < 0 \
|
||||||
|
? (a) < (max) / (b) \
|
||||||
|
: (b) == -1 \
|
||||||
|
? 0 \
|
||||||
|
: (min) / (b) < (a)) \
|
||||||
|
: (b) == 0 \
|
||||||
|
? 0 \
|
||||||
|
: ((a) < 0 \
|
||||||
|
? (a) < (min) / (b) \
|
||||||
|
: (max) / (b) < (a)))
|
||||||
|
|
||||||
|
/* Return 1 if A / B would overflow in [MIN,MAX] arithmetic.
|
||||||
|
See above for restrictions. Do not check for division by zero. */
|
||||||
|
#define INT_DIVIDE_RANGE_OVERFLOW(a, b, min, max) \
|
||||||
|
((min) < 0 && (b) == -1 && (a) < - (max))
|
||||||
|
|
||||||
|
/* Return 1 if A % B would overflow in [MIN,MAX] arithmetic.
|
||||||
|
See above for restrictions. Do not check for division by zero.
|
||||||
|
Mathematically, % should never overflow, but on x86-like hosts
|
||||||
|
INT_MIN % -1 traps, and the C standard permits this, so treat this
|
||||||
|
as an overflow too. */
|
||||||
|
#define INT_REMAINDER_RANGE_OVERFLOW(a, b, min, max) \
|
||||||
|
INT_DIVIDE_RANGE_OVERFLOW (a, b, min, max)
|
||||||
|
|
||||||
|
/* Return 1 if A << B would overflow in [MIN,MAX] arithmetic.
|
||||||
|
See above for restrictions. Here, MIN and MAX are for A only, and B need
|
||||||
|
not be of the same type as the other arguments. The C standard says that
|
||||||
|
behavior is undefined for shifts unless 0 <= B < wordwidth, and that when
|
||||||
|
A is negative then A << B has undefined behavior and A >> B has
|
||||||
|
implementation-defined behavior, but do not check these other
|
||||||
|
restrictions. */
|
||||||
|
#define INT_LEFT_SHIFT_RANGE_OVERFLOW(a, b, min, max) \
|
||||||
|
((a) < 0 \
|
||||||
|
? (a) < (min) >> (b) \
|
||||||
|
: (max) >> (b) < (a))
|
||||||
|
|
||||||
|
|
||||||
|
/* The _GL*_OVERFLOW macros have the same restrictions as the
|
||||||
|
*_RANGE_OVERFLOW macros, except that they do not assume that operands
|
||||||
|
(e.g., A and B) have the same type as MIN and MAX. Instead, they assume
|
||||||
|
that the result (e.g., A + B) has that type. */
|
||||||
|
#define _GL_ADD_OVERFLOW(a, b, min, max) \
|
||||||
|
((min) < 0 ? INT_ADD_RANGE_OVERFLOW (a, b, min, max) \
|
||||||
|
: (a) < 0 ? (b) <= (a) + (b) \
|
||||||
|
: (b) < 0 ? (a) <= (a) + (b) \
|
||||||
|
: (a) + (b) < (b))
|
||||||
|
#define _GL_SUBTRACT_OVERFLOW(a, b, min, max) \
|
||||||
|
((min) < 0 ? INT_SUBTRACT_RANGE_OVERFLOW (a, b, min, max) \
|
||||||
|
: (a) < 0 ? 1 \
|
||||||
|
: (b) < 0 ? (a) - (b) <= (a) \
|
||||||
|
: (a) < (b))
|
||||||
|
#define _GL_MULTIPLY_OVERFLOW(a, b, min, max) \
|
||||||
|
(((min) == 0 && (((a) < 0 && 0 < (b)) || ((b) < 0 && 0 < (a)))) \
|
||||||
|
|| INT_MULTIPLY_RANGE_OVERFLOW (a, b, min, max))
|
||||||
|
#define _GL_DIVIDE_OVERFLOW(a, b, min, max) \
|
||||||
|
((min) < 0 ? (b) == _GL_INT_NEGATE_CONVERT (min, 1) && (a) < - (max) \
|
||||||
|
: (a) < 0 ? (b) <= (a) + (b) - 1 \
|
||||||
|
: (b) < 0 && (a) + (b) <= (a))
|
||||||
|
#define _GL_REMAINDER_OVERFLOW(a, b, min, max) \
|
||||||
|
((min) < 0 ? (b) == _GL_INT_NEGATE_CONVERT (min, 1) && (a) < - (max) \
|
||||||
|
: (a) < 0 ? (a) % (b) != ((max) - (b) + 1) % (b) \
|
||||||
|
: (b) < 0 && ! _GL_UNSIGNED_NEG_MULTIPLE (a, b, max))
|
||||||
|
|
||||||
|
/* Return a nonzero value if A is a mathematical multiple of B, where
|
||||||
|
A is unsigned, B is negative, and MAX is the maximum value of A's
|
||||||
|
type. A's type must be the same as (A % B)'s type. Normally (A %
|
||||||
|
-B == 0) suffices, but things get tricky if -B would overflow. */
|
||||||
|
#define _GL_UNSIGNED_NEG_MULTIPLE(a, b, max) \
|
||||||
|
(((b) < -_GL_SIGNED_INT_MAXIMUM (b) \
|
||||||
|
? (_GL_SIGNED_INT_MAXIMUM (b) == (max) \
|
||||||
|
? (a) \
|
||||||
|
: (a) % (_GL_INT_CONVERT (a, _GL_SIGNED_INT_MAXIMUM (b)) + 1)) \
|
||||||
|
: (a) % - (b)) \
|
||||||
|
== 0)
|
||||||
|
|
||||||
|
|
||||||
|
/* Integer overflow checks.
|
||||||
|
|
||||||
|
The INT_<op>_OVERFLOW macros return 1 if the corresponding C operators
|
||||||
|
might not yield numerically correct answers due to arithmetic overflow.
|
||||||
|
They work correctly on all known practical hosts, and do not rely
|
||||||
|
on undefined behavior due to signed arithmetic overflow.
|
||||||
|
|
||||||
|
Example usage:
|
||||||
|
|
||||||
|
long int i = ...;
|
||||||
|
long int j = ...;
|
||||||
|
if (INT_MULTIPLY_OVERFLOW (i, j))
|
||||||
|
printf ("multiply would overflow");
|
||||||
|
else
|
||||||
|
printf ("product is %ld", i * j);
|
||||||
|
|
||||||
|
These macros do not check for all possible numerical problems or
|
||||||
|
undefined or unspecified behavior: they do not check for division
|
||||||
|
by zero, for bad shift counts, or for shifting negative numbers.
|
||||||
|
|
||||||
|
These macros may evaluate their arguments zero or multiple times, so the
|
||||||
|
arguments should not have side effects.
|
||||||
|
|
||||||
|
These macros are tuned for their last argument being a constant.
|
||||||
|
|
||||||
|
Return 1 if the integer expressions A * B, A - B, -A, A * B, A / B,
|
||||||
|
A % B, and A << B would overflow, respectively. */
|
||||||
|
|
||||||
|
#define INT_ADD_OVERFLOW(a, b) \
|
||||||
|
_GL_BINARY_OP_OVERFLOW (a, b, _GL_ADD_OVERFLOW)
|
||||||
|
#define INT_SUBTRACT_OVERFLOW(a, b) \
|
||||||
|
_GL_BINARY_OP_OVERFLOW (a, b, _GL_SUBTRACT_OVERFLOW)
|
||||||
|
#define INT_NEGATE_OVERFLOW(a) \
|
||||||
|
INT_NEGATE_RANGE_OVERFLOW (a, _GL_INT_MINIMUM (a), _GL_INT_MAXIMUM (a))
|
||||||
|
#define INT_MULTIPLY_OVERFLOW(a, b) \
|
||||||
|
_GL_BINARY_OP_OVERFLOW (a, b, _GL_MULTIPLY_OVERFLOW)
|
||||||
|
#define INT_DIVIDE_OVERFLOW(a, b) \
|
||||||
|
_GL_BINARY_OP_OVERFLOW (a, b, _GL_DIVIDE_OVERFLOW)
|
||||||
|
#define INT_REMAINDER_OVERFLOW(a, b) \
|
||||||
|
_GL_BINARY_OP_OVERFLOW (a, b, _GL_REMAINDER_OVERFLOW)
|
||||||
|
#define INT_LEFT_SHIFT_OVERFLOW(a, b) \
|
||||||
|
INT_LEFT_SHIFT_RANGE_OVERFLOW (a, b, \
|
||||||
|
_GL_INT_MINIMUM (a), _GL_INT_MAXIMUM (a))
|
||||||
|
|
||||||
|
/* Return 1 if the expression A <op> B would overflow,
|
||||||
|
where OP_RESULT_OVERFLOW (A, B, MIN, MAX) does the actual test,
|
||||||
|
assuming MIN and MAX are the minimum and maximum for the result type.
|
||||||
|
Arguments should be free of side effects. */
|
||||||
|
#define _GL_BINARY_OP_OVERFLOW(a, b, op_result_overflow) \
|
||||||
|
op_result_overflow (a, b, \
|
||||||
|
_GL_INT_MINIMUM (0 * (b) + (a)), \
|
||||||
|
_GL_INT_MAXIMUM (0 * (b) + (a)))
|
||||||
|
|
||||||
|
#endif /* _GL_INTPROPS_H */
|
||||||
|
|
28
grub-core/gnulib/itold.c
Normal file
28
grub-core/gnulib/itold.c
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
/* Replacement for 'int' to 'long double' conversion routine.
|
||||||
|
Copyright (C) 2011-2013 Free Software Foundation, Inc.
|
||||||
|
Written by Bruno Haible <bruno@clisp.org>, 2011.
|
||||||
|
|
||||||
|
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/>. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
/* Specification. */
|
||||||
|
#include <float.h>
|
||||||
|
|
||||||
|
void
|
||||||
|
_Qp_itoq (long double *result, int a)
|
||||||
|
{
|
||||||
|
/* Convert from 'int' to 'double', then from 'double' to 'long double'. */
|
||||||
|
*result = (double) a;
|
||||||
|
}
|
|
@ -1,5 +1,5 @@
|
||||||
/* Substitute for and wrapper around <langinfo.h>.
|
/* Substitute for and wrapper around <langinfo.h>.
|
||||||
Copyright (C) 2009, 2010 Free Software Foundation, Inc.
|
Copyright (C) 2009-2013 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -12,27 +12,27 @@
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program; if not, write to the Free Software Foundation,
|
along with this program; if not, see <http://www.gnu.org/licenses/>. */
|
||||||
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* POSIX <langinfo.h> for platforms that lack it or have an incomplete one.
|
* POSIX <langinfo.h> for platforms that lack it or have an incomplete one.
|
||||||
* <http://www.opengroup.org/onlinepubs/9699919799/basedefs/langinfo.h.html>
|
* <http://www.opengroup.org/onlinepubs/9699919799/basedefs/langinfo.h.html>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _GL_LANGINFO_H
|
#ifndef _@GUARD_PREFIX@_LANGINFO_H
|
||||||
|
|
||||||
#if __GNUC__ >= 3
|
#if __GNUC__ >= 3
|
||||||
@PRAGMA_SYSTEM_HEADER@
|
@PRAGMA_SYSTEM_HEADER@
|
||||||
#endif
|
#endif
|
||||||
|
@PRAGMA_COLUMNS@
|
||||||
|
|
||||||
/* The include_next requires a split double-inclusion guard. */
|
/* The include_next requires a split double-inclusion guard. */
|
||||||
#if @HAVE_LANGINFO_H@
|
#if @HAVE_LANGINFO_H@
|
||||||
# @INCLUDE_NEXT@ @NEXT_LANGINFO_H@
|
# @INCLUDE_NEXT@ @NEXT_LANGINFO_H@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef _GL_LANGINFO_H
|
#ifndef _@GUARD_PREFIX@_LANGINFO_H
|
||||||
#define _GL_LANGINFO_H
|
#define _@GUARD_PREFIX@_LANGINFO_H
|
||||||
|
|
||||||
|
|
||||||
#if !@HAVE_LANGINFO_H@
|
#if !@HAVE_LANGINFO_H@
|
||||||
|
@ -40,7 +40,10 @@
|
||||||
/* A platform that lacks <langinfo.h>. */
|
/* A platform that lacks <langinfo.h>. */
|
||||||
|
|
||||||
/* Assume that it also lacks <nl_types.h> and the nl_item type. */
|
/* Assume that it also lacks <nl_types.h> and the nl_item type. */
|
||||||
|
# if !GNULIB_defined_nl_item
|
||||||
typedef int nl_item;
|
typedef int nl_item;
|
||||||
|
# define GNULIB_defined_nl_item 1
|
||||||
|
# endif
|
||||||
|
|
||||||
/* nl_langinfo items of the LC_CTYPE category */
|
/* nl_langinfo items of the LC_CTYPE category */
|
||||||
# define CODESET 10000
|
# define CODESET 10000
|
||||||
|
@ -169,5 +172,5 @@ _GL_WARN_ON_USE (nl_langinfo, "nl_langinfo is not portable - "
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#endif /* _GL_LANGINFO_H */
|
#endif /* _@GUARD_PREFIX@_LANGINFO_H */
|
||||||
#endif /* _GL_LANGINFO_H */
|
#endif /* _@GUARD_PREFIX@_LANGINFO_H */
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* Determine a canonical name for the current locale's character encoding.
|
/* Determine a canonical name for the current locale's character encoding.
|
||||||
|
|
||||||
Copyright (C) 2000-2006, 2008-2010 Free Software Foundation, Inc.
|
Copyright (C) 2000-2006, 2008-2013 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -13,8 +13,7 @@
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License along
|
||||||
with this program; if not, write to the Free Software Foundation,
|
with this program; if not, see <http://www.gnu.org/licenses/>. */
|
||||||
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
|
||||||
|
|
||||||
/* Written by Bruno Haible <bruno@clisp.org>. */
|
/* Written by Bruno Haible <bruno@clisp.org>. */
|
||||||
|
|
||||||
|
@ -30,11 +29,11 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#if defined __APPLE__ && defined __MACH__ && HAVE_LANGINFO_CODESET
|
#if defined __APPLE__ && defined __MACH__ && HAVE_LANGINFO_CODESET
|
||||||
# define DARWIN7 /* Darwin 7 or newer, i.e. MacOS X 10.3 or newer */
|
# define DARWIN7 /* Darwin 7 or newer, i.e. Mac OS X 10.3 or newer */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined _WIN32 || defined __WIN32__
|
#if defined _WIN32 || defined __WIN32__
|
||||||
# define WIN32_NATIVE
|
# define WINDOWS_NATIVE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined __EMX__
|
#if defined __EMX__
|
||||||
|
@ -44,7 +43,7 @@
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined WIN32_NATIVE
|
#if !defined WINDOWS_NATIVE
|
||||||
# include <unistd.h>
|
# include <unistd.h>
|
||||||
# if HAVE_LANGINFO_CODESET
|
# if HAVE_LANGINFO_CODESET
|
||||||
# include <langinfo.h>
|
# include <langinfo.h>
|
||||||
|
@ -57,7 +56,7 @@
|
||||||
# define WIN32_LEAN_AND_MEAN
|
# define WIN32_LEAN_AND_MEAN
|
||||||
# include <windows.h>
|
# include <windows.h>
|
||||||
# endif
|
# endif
|
||||||
#elif defined WIN32_NATIVE
|
#elif defined WINDOWS_NATIVE
|
||||||
# define WIN32_LEAN_AND_MEAN
|
# define WIN32_LEAN_AND_MEAN
|
||||||
# include <windows.h>
|
# include <windows.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -83,7 +82,7 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__
|
#if defined _WIN32 || defined __WIN32__ || defined __CYGWIN__ || defined __EMX__ || defined __DJGPP__
|
||||||
/* Win32, Cygwin, OS/2, DOS */
|
/* Native Windows, Cygwin, OS/2, DOS */
|
||||||
# define ISSLASH(C) ((C) == '/' || (C) == '\\')
|
# define ISSLASH(C) ((C) == '/' || (C) == '\\')
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -123,7 +122,7 @@ get_charset_aliases (void)
|
||||||
cp = charset_aliases;
|
cp = charset_aliases;
|
||||||
if (cp == NULL)
|
if (cp == NULL)
|
||||||
{
|
{
|
||||||
#if !(defined DARWIN7 || defined VMS || defined WIN32_NATIVE || defined __CYGWIN__)
|
#if !(defined DARWIN7 || defined VMS || defined WINDOWS_NATIVE || defined __CYGWIN__)
|
||||||
const char *dir;
|
const char *dir;
|
||||||
const char *base = "charset.alias";
|
const char *base = "charset.alias";
|
||||||
char *file_name;
|
char *file_name;
|
||||||
|
@ -228,8 +227,7 @@ get_charset_aliases (void)
|
||||||
{
|
{
|
||||||
/* Out of memory. */
|
/* Out of memory. */
|
||||||
res_size = 0;
|
res_size = 0;
|
||||||
if (old_res_ptr != NULL)
|
free (old_res_ptr);
|
||||||
free (old_res_ptr);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
strcpy (res_ptr + res_size - (l2 + 1) - (l1 + 1), buf1);
|
strcpy (res_ptr + res_size - (l2 + 1) - (l1 + 1), buf1);
|
||||||
|
@ -309,7 +307,7 @@ get_charset_aliases (void)
|
||||||
"DECKOREAN" "\0" "EUC-KR" "\0";
|
"DECKOREAN" "\0" "EUC-KR" "\0";
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
# if defined WIN32_NATIVE || defined __CYGWIN__
|
# if defined WINDOWS_NATIVE || defined __CYGWIN__
|
||||||
/* To avoid the troubles of installing a separate file in the same
|
/* To avoid the troubles of installing a separate file in the same
|
||||||
directory as the DLL and of retrieving the DLL's directory at
|
directory as the DLL and of retrieving the DLL's directory at
|
||||||
runtime, simply inline the aliases here. */
|
runtime, simply inline the aliases here. */
|
||||||
|
@ -361,7 +359,7 @@ locale_charset (void)
|
||||||
const char *codeset;
|
const char *codeset;
|
||||||
const char *aliases;
|
const char *aliases;
|
||||||
|
|
||||||
#if !(defined WIN32_NATIVE || defined OS2)
|
#if !(defined WINDOWS_NATIVE || defined OS2)
|
||||||
|
|
||||||
# if HAVE_LANGINFO_CODESET
|
# if HAVE_LANGINFO_CODESET
|
||||||
|
|
||||||
|
@ -408,10 +406,10 @@ locale_charset (void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Woe32 has a function returning the locale's codepage as a number:
|
/* The Windows API has a function returning the locale's codepage as a
|
||||||
GetACP(). This encoding is used by Cygwin, unless the user has set
|
number: GetACP(). This encoding is used by Cygwin, unless the user
|
||||||
the environment variable CYGWIN=codepage:oem (which very few people
|
has set the environment variable CYGWIN=codepage:oem (which very few
|
||||||
do).
|
people do).
|
||||||
Output directed to console windows needs to be converted (to
|
Output directed to console windows needs to be converted (to
|
||||||
GetOEMCP() if the console is using a raster font, or to
|
GetOEMCP() if the console is using a raster font, or to
|
||||||
GetConsoleOutputCP() if it is using a TrueType font). Cygwin does
|
GetConsoleOutputCP() if it is using a TrueType font). Cygwin does
|
||||||
|
@ -454,12 +452,12 @@ locale_charset (void)
|
||||||
|
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
#elif defined WIN32_NATIVE
|
#elif defined WINDOWS_NATIVE
|
||||||
|
|
||||||
static char buf[2 + 10 + 1];
|
static char buf[2 + 10 + 1];
|
||||||
|
|
||||||
/* Woe32 has a function returning the locale's codepage as a number:
|
/* The Windows API has a function returning the locale's codepage as a
|
||||||
GetACP().
|
number: GetACP().
|
||||||
When the output goes to a console window, it needs to be provided in
|
When the output goes to a console window, it needs to be provided in
|
||||||
GetOEMCP() encoding if the console is using a raster font, or in
|
GetOEMCP() encoding if the console is using a raster font, or in
|
||||||
GetConsoleOutputCP() encoding if it is using a TrueType font.
|
GetConsoleOutputCP() encoding if it is using a TrueType font.
|
||||||
|
@ -544,5 +542,12 @@ locale_charset (void)
|
||||||
if (codeset[0] == '\0')
|
if (codeset[0] == '\0')
|
||||||
codeset = "ASCII";
|
codeset = "ASCII";
|
||||||
|
|
||||||
|
#ifdef DARWIN7
|
||||||
|
/* Mac OS X sets MB_CUR_MAX to 1 when LC_ALL=C, and "UTF-8"
|
||||||
|
(the default codeset) does not work when MB_CUR_MAX is 1. */
|
||||||
|
if (strcmp (codeset, "UTF-8") == 0 && MB_CUR_MAX <= 1)
|
||||||
|
codeset = "ASCII";
|
||||||
|
#endif
|
||||||
|
|
||||||
return codeset;
|
return codeset;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* Determine a canonical name for the current locale's character encoding.
|
/* Determine a canonical name for the current locale's character encoding.
|
||||||
Copyright (C) 2000-2003, 2009-2010 Free Software Foundation, Inc.
|
Copyright (C) 2000-2003, 2009-2013 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU CHARSET Library.
|
This file is part of the GNU CHARSET Library.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
@ -13,8 +13,7 @@
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License along
|
||||||
with this program; if not, write to the Free Software Foundation,
|
with this program; if not, see <http://www.gnu.org/licenses/>. */
|
||||||
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
|
||||||
|
|
||||||
#ifndef _LOCALCHARSET_H
|
#ifndef _LOCALCHARSET_H
|
||||||
#define _LOCALCHARSET_H
|
#define _LOCALCHARSET_H
|
||||||
|
|
216
grub-core/gnulib/locale.in.h
Normal file
216
grub-core/gnulib/locale.in.h
Normal file
|
@ -0,0 +1,216 @@
|
||||||
|
/* A POSIX <locale.h>.
|
||||||
|
Copyright (C) 2007-2013 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/>. */
|
||||||
|
|
||||||
|
#if __GNUC__ >= 3
|
||||||
|
@PRAGMA_SYSTEM_HEADER@
|
||||||
|
#endif
|
||||||
|
@PRAGMA_COLUMNS@
|
||||||
|
|
||||||
|
#ifdef _GL_ALREADY_INCLUDING_LOCALE_H
|
||||||
|
|
||||||
|
/* Special invocation conventions to handle Solaris header files
|
||||||
|
(through Solaris 10) when combined with gettext's libintl.h. */
|
||||||
|
|
||||||
|
#@INCLUDE_NEXT@ @NEXT_LOCALE_H@
|
||||||
|
|
||||||
|
#else
|
||||||
|
/* Normal invocation convention. */
|
||||||
|
|
||||||
|
#ifndef _@GUARD_PREFIX@_LOCALE_H
|
||||||
|
|
||||||
|
#define _GL_ALREADY_INCLUDING_LOCALE_H
|
||||||
|
|
||||||
|
/* The include_next requires a split double-inclusion guard. */
|
||||||
|
#@INCLUDE_NEXT@ @NEXT_LOCALE_H@
|
||||||
|
|
||||||
|
#undef _GL_ALREADY_INCLUDING_LOCALE_H
|
||||||
|
|
||||||
|
#ifndef _@GUARD_PREFIX@_LOCALE_H
|
||||||
|
#define _@GUARD_PREFIX@_LOCALE_H
|
||||||
|
|
||||||
|
/* NetBSD 5.0 mis-defines NULL. */
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
/* Mac OS X 10.5 defines the locale_t type in <xlocale.h>. */
|
||||||
|
#if @HAVE_XLOCALE_H@
|
||||||
|
# include <xlocale.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
|
||||||
|
|
||||||
|
/* The definition of _GL_ARG_NONNULL is copied here. */
|
||||||
|
|
||||||
|
/* The definition of _GL_WARN_ON_USE is copied here. */
|
||||||
|
|
||||||
|
/* The LC_MESSAGES locale category is specified in POSIX, but not in ISO C.
|
||||||
|
On systems that don't define it, use the same value as GNU libintl. */
|
||||||
|
#if !defined LC_MESSAGES
|
||||||
|
# define LC_MESSAGES 1729
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Bionic libc's 'struct lconv' is just a dummy. */
|
||||||
|
#if @REPLACE_STRUCT_LCONV@
|
||||||
|
# define lconv rpl_lconv
|
||||||
|
struct lconv
|
||||||
|
{
|
||||||
|
/* All 'char *' are actually 'const char *'. */
|
||||||
|
|
||||||
|
/* Members that depend on the LC_NUMERIC category of the locale. See
|
||||||
|
<http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap07.html#tag_07_03_04> */
|
||||||
|
|
||||||
|
/* Symbol used as decimal point. */
|
||||||
|
char *decimal_point;
|
||||||
|
/* Symbol used to separate groups of digits to the left of the decimal
|
||||||
|
point. */
|
||||||
|
char *thousands_sep;
|
||||||
|
/* Definition of the size of groups of digits to the left of the decimal
|
||||||
|
point. */
|
||||||
|
char *grouping;
|
||||||
|
|
||||||
|
/* Members that depend on the LC_MONETARY category of the locale. See
|
||||||
|
<http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap07.html#tag_07_03_03> */
|
||||||
|
|
||||||
|
/* Symbol used as decimal point. */
|
||||||
|
char *mon_decimal_point;
|
||||||
|
/* Symbol used to separate groups of digits to the left of the decimal
|
||||||
|
point. */
|
||||||
|
char *mon_thousands_sep;
|
||||||
|
/* Definition of the size of groups of digits to the left of the decimal
|
||||||
|
point. */
|
||||||
|
char *mon_grouping;
|
||||||
|
/* Sign used to indicate a value >= 0. */
|
||||||
|
char *positive_sign;
|
||||||
|
/* Sign used to indicate a value < 0. */
|
||||||
|
char *negative_sign;
|
||||||
|
|
||||||
|
/* For formatting local currency. */
|
||||||
|
/* Currency symbol (3 characters) followed by separator (1 character). */
|
||||||
|
char *currency_symbol;
|
||||||
|
/* Number of digits after the decimal point. */
|
||||||
|
char frac_digits;
|
||||||
|
/* For values >= 0: 1 if the currency symbol precedes the number, 0 if it
|
||||||
|
comes after the number. */
|
||||||
|
char p_cs_precedes;
|
||||||
|
/* For values >= 0: Position of the sign. */
|
||||||
|
char p_sign_posn;
|
||||||
|
/* For values >= 0: Placement of spaces between currency symbol, sign, and
|
||||||
|
number. */
|
||||||
|
char p_sep_by_space;
|
||||||
|
/* For values < 0: 1 if the currency symbol precedes the number, 0 if it
|
||||||
|
comes after the number. */
|
||||||
|
char n_cs_precedes;
|
||||||
|
/* For values < 0: Position of the sign. */
|
||||||
|
char n_sign_posn;
|
||||||
|
/* For values < 0: Placement of spaces between currency symbol, sign, and
|
||||||
|
number. */
|
||||||
|
char n_sep_by_space;
|
||||||
|
|
||||||
|
/* For formatting international currency. */
|
||||||
|
/* Currency symbol (3 characters) followed by separator (1 character). */
|
||||||
|
char *int_curr_symbol;
|
||||||
|
/* Number of digits after the decimal point. */
|
||||||
|
char int_frac_digits;
|
||||||
|
/* For values >= 0: 1 if the currency symbol precedes the number, 0 if it
|
||||||
|
comes after the number. */
|
||||||
|
char int_p_cs_precedes;
|
||||||
|
/* For values >= 0: Position of the sign. */
|
||||||
|
char int_p_sign_posn;
|
||||||
|
/* For values >= 0: Placement of spaces between currency symbol, sign, and
|
||||||
|
number. */
|
||||||
|
char int_p_sep_by_space;
|
||||||
|
/* For values < 0: 1 if the currency symbol precedes the number, 0 if it
|
||||||
|
comes after the number. */
|
||||||
|
char int_n_cs_precedes;
|
||||||
|
/* For values < 0: Position of the sign. */
|
||||||
|
char int_n_sign_posn;
|
||||||
|
/* For values < 0: Placement of spaces between currency symbol, sign, and
|
||||||
|
number. */
|
||||||
|
char int_n_sep_by_space;
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if @GNULIB_LOCALECONV@
|
||||||
|
# if @REPLACE_LOCALECONV@
|
||||||
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
|
# undef localeconv
|
||||||
|
# define localeconv rpl_localeconv
|
||||||
|
# endif
|
||||||
|
_GL_FUNCDECL_RPL (localeconv, struct lconv *, (void));
|
||||||
|
_GL_CXXALIAS_RPL (localeconv, struct lconv *, (void));
|
||||||
|
# else
|
||||||
|
_GL_CXXALIAS_SYS (localeconv, struct lconv *, (void));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIASWARN (localeconv);
|
||||||
|
#elif @REPLACE_STRUCT_LCONV@
|
||||||
|
# undef localeconv
|
||||||
|
# define localeconv localeconv_used_without_requesting_gnulib_module_localeconv
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef localeconv
|
||||||
|
# if HAVE_RAW_DECL_LOCALECONV
|
||||||
|
_GL_WARN_ON_USE (localeconv,
|
||||||
|
"localeconv returns too few information on some platforms - "
|
||||||
|
"use gnulib module localeconv for portability");
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if @GNULIB_SETLOCALE@
|
||||||
|
# if @REPLACE_SETLOCALE@
|
||||||
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
|
# undef setlocale
|
||||||
|
# define setlocale rpl_setlocale
|
||||||
|
# define GNULIB_defined_setlocale 1
|
||||||
|
# endif
|
||||||
|
_GL_FUNCDECL_RPL (setlocale, char *, (int category, const char *locale));
|
||||||
|
_GL_CXXALIAS_RPL (setlocale, char *, (int category, const char *locale));
|
||||||
|
# else
|
||||||
|
_GL_CXXALIAS_SYS (setlocale, char *, (int category, const char *locale));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIASWARN (setlocale);
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef setlocale
|
||||||
|
# if HAVE_RAW_DECL_SETLOCALE
|
||||||
|
_GL_WARN_ON_USE (setlocale, "setlocale works differently on native Windows - "
|
||||||
|
"use gnulib module setlocale for portability");
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if @GNULIB_DUPLOCALE@
|
||||||
|
# if @REPLACE_DUPLOCALE@
|
||||||
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
|
# undef duplocale
|
||||||
|
# define duplocale rpl_duplocale
|
||||||
|
# endif
|
||||||
|
_GL_FUNCDECL_RPL (duplocale, locale_t, (locale_t locale) _GL_ARG_NONNULL ((1)));
|
||||||
|
_GL_CXXALIAS_RPL (duplocale, locale_t, (locale_t locale));
|
||||||
|
# else
|
||||||
|
# if @HAVE_DUPLOCALE@
|
||||||
|
_GL_CXXALIAS_SYS (duplocale, locale_t, (locale_t locale));
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
# if @HAVE_DUPLOCALE@
|
||||||
|
_GL_CXXALIASWARN (duplocale);
|
||||||
|
# endif
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef duplocale
|
||||||
|
# if HAVE_RAW_DECL_DUPLOCALE
|
||||||
|
_GL_WARN_ON_USE (duplocale, "duplocale is buggy on some glibc systems - "
|
||||||
|
"use gnulib module duplocale for portability");
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _@GUARD_PREFIX@_LOCALE_H */
|
||||||
|
#endif /* ! _GL_ALREADY_INCLUDING_LOCALE_H */
|
||||||
|
#endif /* _@GUARD_PREFIX@_LOCALE_H */
|
103
grub-core/gnulib/localeconv.c
Normal file
103
grub-core/gnulib/localeconv.c
Normal file
|
@ -0,0 +1,103 @@
|
||||||
|
/* Query locale dependent information for formatting numbers.
|
||||||
|
Copyright (C) 2012-2013 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/>. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
/* Specification. */
|
||||||
|
#include <locale.h>
|
||||||
|
|
||||||
|
#if HAVE_STRUCT_LCONV_DECIMAL_POINT
|
||||||
|
|
||||||
|
/* Override for platforms where 'struct lconv' lacks the int_p_*, int_n_*
|
||||||
|
members. */
|
||||||
|
|
||||||
|
struct lconv *
|
||||||
|
localeconv (void)
|
||||||
|
{
|
||||||
|
static struct lconv result;
|
||||||
|
# undef lconv
|
||||||
|
# undef localeconv
|
||||||
|
struct lconv *sys_result = localeconv ();
|
||||||
|
|
||||||
|
result.decimal_point = sys_result->decimal_point;
|
||||||
|
result.thousands_sep = sys_result->thousands_sep;
|
||||||
|
result.grouping = sys_result->grouping;
|
||||||
|
result.mon_decimal_point = sys_result->mon_decimal_point;
|
||||||
|
result.mon_thousands_sep = sys_result->mon_thousands_sep;
|
||||||
|
result.mon_grouping = sys_result->mon_grouping;
|
||||||
|
result.positive_sign = sys_result->positive_sign;
|
||||||
|
result.negative_sign = sys_result->negative_sign;
|
||||||
|
result.currency_symbol = sys_result->currency_symbol;
|
||||||
|
result.frac_digits = sys_result->frac_digits;
|
||||||
|
result.p_cs_precedes = sys_result->p_cs_precedes;
|
||||||
|
result.p_sign_posn = sys_result->p_sign_posn;
|
||||||
|
result.p_sep_by_space = sys_result->p_sep_by_space;
|
||||||
|
result.n_cs_precedes = sys_result->n_cs_precedes;
|
||||||
|
result.n_sign_posn = sys_result->n_sign_posn;
|
||||||
|
result.n_sep_by_space = sys_result->n_sep_by_space;
|
||||||
|
result.int_curr_symbol = sys_result->int_curr_symbol;
|
||||||
|
result.int_frac_digits = sys_result->int_frac_digits;
|
||||||
|
result.int_p_cs_precedes = sys_result->p_cs_precedes;
|
||||||
|
result.int_p_sign_posn = sys_result->p_sign_posn;
|
||||||
|
result.int_p_sep_by_space = sys_result->p_sep_by_space;
|
||||||
|
result.int_n_cs_precedes = sys_result->n_cs_precedes;
|
||||||
|
result.int_n_sign_posn = sys_result->n_sign_posn;
|
||||||
|
result.int_n_sep_by_space = sys_result->n_sep_by_space;
|
||||||
|
|
||||||
|
return &result;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
/* Override for platforms where 'struct lconv' is a dummy. */
|
||||||
|
|
||||||
|
# include <limits.h>
|
||||||
|
|
||||||
|
struct lconv *
|
||||||
|
localeconv (void)
|
||||||
|
{
|
||||||
|
static /*const*/ struct lconv result =
|
||||||
|
{
|
||||||
|
/* decimal_point */ ".",
|
||||||
|
/* thousands_sep */ "",
|
||||||
|
/* grouping */ "",
|
||||||
|
/* mon_decimal_point */ "",
|
||||||
|
/* mon_thousands_sep */ "",
|
||||||
|
/* mon_grouping */ "",
|
||||||
|
/* positive_sign */ "",
|
||||||
|
/* negative_sign */ "",
|
||||||
|
/* currency_symbol */ "",
|
||||||
|
/* frac_digits */ CHAR_MAX,
|
||||||
|
/* p_cs_precedes */ CHAR_MAX,
|
||||||
|
/* p_sign_posn */ CHAR_MAX,
|
||||||
|
/* p_sep_by_space */ CHAR_MAX,
|
||||||
|
/* n_cs_precedes */ CHAR_MAX,
|
||||||
|
/* n_sign_posn */ CHAR_MAX,
|
||||||
|
/* n_sep_by_space */ CHAR_MAX,
|
||||||
|
/* int_curr_symbol */ "",
|
||||||
|
/* int_frac_digits */ CHAR_MAX,
|
||||||
|
/* int_p_cs_precedes */ CHAR_MAX,
|
||||||
|
/* int_p_sign_posn */ CHAR_MAX,
|
||||||
|
/* int_p_sep_by_space */ CHAR_MAX,
|
||||||
|
/* int_n_cs_precedes */ CHAR_MAX,
|
||||||
|
/* int_n_sign_posn */ CHAR_MAX,
|
||||||
|
/* int_n_sep_by_space */ CHAR_MAX
|
||||||
|
};
|
||||||
|
|
||||||
|
return &result;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -1,6 +1,6 @@
|
||||||
/* malloc() function that is glibc compatible.
|
/* malloc() function that is glibc compatible.
|
||||||
|
|
||||||
Copyright (C) 1997-1998, 2006-2007, 2009-2010 Free Software Foundation, Inc.
|
Copyright (C) 1997-1998, 2006-2007, 2009-2013 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -13,11 +13,11 @@
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program; if not, write to the Free Software Foundation,
|
along with this program; if not, see <http://www.gnu.org/licenses/>. */
|
||||||
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
|
||||||
|
|
||||||
/* written by Jim Meyering and Bruno Haible */
|
/* written by Jim Meyering and Bruno Haible */
|
||||||
|
|
||||||
|
#define _GL_USE_STDLIB_ALLOC 1
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
/* Only the AC_FUNC_MALLOC macro defines 'malloc' already in config.h. */
|
/* Only the AC_FUNC_MALLOC macro defines 'malloc' already in config.h. */
|
||||||
#ifdef malloc
|
#ifdef malloc
|
||||||
|
@ -28,14 +28,10 @@
|
||||||
# define NEED_MALLOC_GNU 1
|
# define NEED_MALLOC_GNU 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Specification. */
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
/* Call the system's malloc below. */
|
|
||||||
#undef malloc
|
|
||||||
|
|
||||||
/* Allocate an N-byte block of memory from the heap.
|
/* Allocate an N-byte block of memory from the heap.
|
||||||
If N is zero, allocate a 1-byte block. */
|
If N is zero, allocate a 1-byte block. */
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* Convert multibyte character to wide character.
|
/* Convert multibyte character to wide character.
|
||||||
Copyright (C) 1999-2002, 2005-2010 Free Software Foundation, Inc.
|
Copyright (C) 1999-2002, 2005-2013 Free Software Foundation, Inc.
|
||||||
Written by Bruno Haible <bruno@clisp.org>, 2008.
|
Written by Bruno Haible <bruno@clisp.org>, 2008.
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
@ -40,9 +40,6 @@ mbrtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)
|
||||||
{
|
{
|
||||||
char *pstate = (char *)ps;
|
char *pstate = (char *)ps;
|
||||||
|
|
||||||
if (pstate == NULL)
|
|
||||||
pstate = internal_state;
|
|
||||||
|
|
||||||
if (s == NULL)
|
if (s == NULL)
|
||||||
{
|
{
|
||||||
pwc = NULL;
|
pwc = NULL;
|
||||||
|
@ -54,6 +51,10 @@ mbrtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)
|
||||||
return (size_t)(-2);
|
return (size_t)(-2);
|
||||||
|
|
||||||
/* Here n > 0. */
|
/* Here n > 0. */
|
||||||
|
|
||||||
|
if (pstate == NULL)
|
||||||
|
pstate = internal_state;
|
||||||
|
|
||||||
{
|
{
|
||||||
size_t nstate = pstate[0];
|
size_t nstate = pstate[0];
|
||||||
char buf[4];
|
char buf[4];
|
||||||
|
@ -91,7 +92,7 @@ mbrtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)
|
||||||
|
|
||||||
/* Here m > 0. */
|
/* Here m > 0. */
|
||||||
|
|
||||||
# if __GLIBC__
|
# if __GLIBC__ || defined __UCLIBC__
|
||||||
/* Work around bug <http://sourceware.org/bugzilla/show_bug.cgi?id=9674> */
|
/* Work around bug <http://sourceware.org/bugzilla/show_bug.cgi?id=9674> */
|
||||||
mbtowc (NULL, NULL, 0);
|
mbtowc (NULL, NULL, 0);
|
||||||
# endif
|
# endif
|
||||||
|
@ -127,7 +128,7 @@ mbrtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)
|
||||||
{
|
{
|
||||||
const char *encoding = locale_charset ();
|
const char *encoding = locale_charset ();
|
||||||
|
|
||||||
if (STREQ (encoding, "UTF-8", 'U', 'T', 'F', '-', '8', 0, 0, 0, 0))
|
if (STREQ_OPT (encoding, "UTF-8", 'U', 'T', 'F', '-', '8', 0, 0, 0, 0))
|
||||||
{
|
{
|
||||||
/* Cf. unistr/u8-mblen.c. */
|
/* Cf. unistr/u8-mblen.c. */
|
||||||
unsigned char c = (unsigned char) p[0];
|
unsigned char c = (unsigned char) p[0];
|
||||||
|
@ -184,7 +185,8 @@ mbrtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)
|
||||||
/* As a reference for this code, you can use the GNU libiconv
|
/* As a reference for this code, you can use the GNU libiconv
|
||||||
implementation. Look for uses of the RET_TOOFEW macro. */
|
implementation. Look for uses of the RET_TOOFEW macro. */
|
||||||
|
|
||||||
if (STREQ (encoding, "EUC-JP", 'E', 'U', 'C', '-', 'J', 'P', 0, 0, 0))
|
if (STREQ_OPT (encoding,
|
||||||
|
"EUC-JP", 'E', 'U', 'C', '-', 'J', 'P', 0, 0, 0))
|
||||||
{
|
{
|
||||||
if (m == 1)
|
if (m == 1)
|
||||||
{
|
{
|
||||||
|
@ -207,9 +209,12 @@ mbrtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)
|
||||||
}
|
}
|
||||||
goto invalid;
|
goto invalid;
|
||||||
}
|
}
|
||||||
if (STREQ (encoding, "EUC-KR", 'E', 'U', 'C', '-', 'K', 'R', 0, 0, 0)
|
if (STREQ_OPT (encoding,
|
||||||
|| STREQ (encoding, "GB2312", 'G', 'B', '2', '3', '1', '2', 0, 0, 0)
|
"EUC-KR", 'E', 'U', 'C', '-', 'K', 'R', 0, 0, 0)
|
||||||
|| STREQ (encoding, "BIG5", 'B', 'I', 'G', '5', 0, 0, 0, 0, 0))
|
|| STREQ_OPT (encoding,
|
||||||
|
"GB2312", 'G', 'B', '2', '3', '1', '2', 0, 0, 0)
|
||||||
|
|| STREQ_OPT (encoding,
|
||||||
|
"BIG5", 'B', 'I', 'G', '5', 0, 0, 0, 0, 0))
|
||||||
{
|
{
|
||||||
if (m == 1)
|
if (m == 1)
|
||||||
{
|
{
|
||||||
|
@ -220,7 +225,8 @@ mbrtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)
|
||||||
}
|
}
|
||||||
goto invalid;
|
goto invalid;
|
||||||
}
|
}
|
||||||
if (STREQ (encoding, "EUC-TW", 'E', 'U', 'C', '-', 'T', 'W', 0, 0, 0))
|
if (STREQ_OPT (encoding,
|
||||||
|
"EUC-TW", 'E', 'U', 'C', '-', 'T', 'W', 0, 0, 0))
|
||||||
{
|
{
|
||||||
if (m == 1)
|
if (m == 1)
|
||||||
{
|
{
|
||||||
|
@ -238,7 +244,8 @@ mbrtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)
|
||||||
}
|
}
|
||||||
goto invalid;
|
goto invalid;
|
||||||
}
|
}
|
||||||
if (STREQ (encoding, "GB18030", 'G', 'B', '1', '8', '0', '3', '0', 0, 0))
|
if (STREQ_OPT (encoding,
|
||||||
|
"GB18030", 'G', 'B', '1', '8', '0', '3', '0', 0, 0))
|
||||||
{
|
{
|
||||||
if (m == 1)
|
if (m == 1)
|
||||||
{
|
{
|
||||||
|
@ -271,7 +278,7 @@ mbrtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)
|
||||||
}
|
}
|
||||||
goto invalid;
|
goto invalid;
|
||||||
}
|
}
|
||||||
if (STREQ (encoding, "SJIS", 'S', 'J', 'I', 'S', 0, 0, 0, 0, 0))
|
if (STREQ_OPT (encoding, "SJIS", 'S', 'J', 'I', 'S', 0, 0, 0, 0, 0))
|
||||||
{
|
{
|
||||||
if (m == 1)
|
if (m == 1)
|
||||||
{
|
{
|
||||||
|
@ -321,7 +328,7 @@ mbrtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)
|
||||||
size_t
|
size_t
|
||||||
rpl_mbrtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)
|
rpl_mbrtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)
|
||||||
{
|
{
|
||||||
# if MBRTOWC_NULL_ARG_BUG || MBRTOWC_RETVAL_BUG
|
# if MBRTOWC_NULL_ARG2_BUG || MBRTOWC_RETVAL_BUG
|
||||||
if (s == NULL)
|
if (s == NULL)
|
||||||
{
|
{
|
||||||
pwc = NULL;
|
pwc = NULL;
|
||||||
|
@ -334,7 +341,7 @@ rpl_mbrtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)
|
||||||
{
|
{
|
||||||
static mbstate_t internal_state;
|
static mbstate_t internal_state;
|
||||||
|
|
||||||
/* Override mbrtowc's internal state. We can not call mbsinit() on the
|
/* Override mbrtowc's internal state. We cannot call mbsinit() on the
|
||||||
hidden internal state, but we can call it on our variable. */
|
hidden internal state, but we can call it on our variable. */
|
||||||
if (ps == NULL)
|
if (ps == NULL)
|
||||||
ps = &internal_state;
|
ps = &internal_state;
|
||||||
|
@ -379,7 +386,16 @@ rpl_mbrtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
# else
|
# else
|
||||||
return mbrtowc (pwc, s, n, ps);
|
{
|
||||||
|
# if MBRTOWC_NULL_ARG1_BUG
|
||||||
|
wchar_t dummy;
|
||||||
|
|
||||||
|
if (pwc == NULL)
|
||||||
|
pwc = &dummy;
|
||||||
|
# endif
|
||||||
|
|
||||||
|
return mbrtowc (pwc, s, n, ps);
|
||||||
|
}
|
||||||
# endif
|
# endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* Test for initial conversion state.
|
/* Test for initial conversion state.
|
||||||
Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
|
Copyright (C) 2008-2013 Free Software Foundation, Inc.
|
||||||
Written by Bruno Haible <bruno@clisp.org>, 2008.
|
Written by Bruno Haible <bruno@clisp.org>, 2008.
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
@ -22,6 +22,18 @@
|
||||||
|
|
||||||
#include "verify.h"
|
#include "verify.h"
|
||||||
|
|
||||||
|
#if (defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__
|
||||||
|
|
||||||
|
/* On native Windows, 'mbstate_t' is defined as 'int'. */
|
||||||
|
|
||||||
|
int
|
||||||
|
mbsinit (const mbstate_t *ps)
|
||||||
|
{
|
||||||
|
return ps == NULL || *ps == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
/* Platforms that lack mbsinit() also lack mbrlen(), mbrtowc(), mbsrtowcs()
|
/* Platforms that lack mbsinit() also lack mbrlen(), mbrtowc(), mbsrtowcs()
|
||||||
and wcrtomb(), wcsrtombs().
|
and wcrtomb(), wcsrtombs().
|
||||||
We assume that
|
We assume that
|
||||||
|
@ -43,5 +55,7 @@ mbsinit (const mbstate_t *ps)
|
||||||
{
|
{
|
||||||
const char *pstate = (const char *)ps;
|
const char *pstate = (const char *)ps;
|
||||||
|
|
||||||
return pstate[0] == 0;
|
return pstate == NULL || pstate[0] == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
122
grub-core/gnulib/mbsrtowcs-impl.h
Normal file
122
grub-core/gnulib/mbsrtowcs-impl.h
Normal file
|
@ -0,0 +1,122 @@
|
||||||
|
/* Convert string to wide string.
|
||||||
|
Copyright (C) 2008-2013 Free Software Foundation, Inc.
|
||||||
|
Written by Bruno Haible <bruno@clisp.org>, 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 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/>. */
|
||||||
|
|
||||||
|
size_t
|
||||||
|
mbsrtowcs (wchar_t *dest, const char **srcp, size_t len, mbstate_t *ps)
|
||||||
|
{
|
||||||
|
if (ps == NULL)
|
||||||
|
ps = &_gl_mbsrtowcs_state;
|
||||||
|
{
|
||||||
|
const char *src = *srcp;
|
||||||
|
|
||||||
|
if (dest != NULL)
|
||||||
|
{
|
||||||
|
wchar_t *destptr = dest;
|
||||||
|
|
||||||
|
for (; len > 0; destptr++, len--)
|
||||||
|
{
|
||||||
|
size_t src_avail;
|
||||||
|
size_t ret;
|
||||||
|
|
||||||
|
/* An optimized variant of
|
||||||
|
src_avail = strnlen1 (src, MB_LEN_MAX); */
|
||||||
|
if (src[0] == '\0')
|
||||||
|
src_avail = 1;
|
||||||
|
else if (src[1] == '\0')
|
||||||
|
src_avail = 2;
|
||||||
|
else if (src[2] == '\0')
|
||||||
|
src_avail = 3;
|
||||||
|
else if (MB_LEN_MAX <= 4 || src[3] == '\0')
|
||||||
|
src_avail = 4;
|
||||||
|
else
|
||||||
|
src_avail = 4 + strnlen1 (src + 4, MB_LEN_MAX - 4);
|
||||||
|
|
||||||
|
/* Parse the next multibyte character. */
|
||||||
|
ret = mbrtowc (destptr, src, src_avail, ps);
|
||||||
|
|
||||||
|
if (ret == (size_t)(-2))
|
||||||
|
/* Encountered a multibyte character that extends past a '\0' byte
|
||||||
|
or that is longer than MB_LEN_MAX bytes. Cannot happen. */
|
||||||
|
abort ();
|
||||||
|
|
||||||
|
if (ret == (size_t)(-1))
|
||||||
|
goto bad_input;
|
||||||
|
if (ret == 0)
|
||||||
|
{
|
||||||
|
src = NULL;
|
||||||
|
/* Here mbsinit (ps). */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
src += ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
*srcp = src;
|
||||||
|
return destptr - dest;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Ignore dest and len, don't store *srcp at the end, and
|
||||||
|
don't clobber *ps. */
|
||||||
|
mbstate_t state = *ps;
|
||||||
|
size_t totalcount = 0;
|
||||||
|
|
||||||
|
for (;; totalcount++)
|
||||||
|
{
|
||||||
|
size_t src_avail;
|
||||||
|
size_t ret;
|
||||||
|
|
||||||
|
/* An optimized variant of
|
||||||
|
src_avail = strnlen1 (src, MB_LEN_MAX); */
|
||||||
|
if (src[0] == '\0')
|
||||||
|
src_avail = 1;
|
||||||
|
else if (src[1] == '\0')
|
||||||
|
src_avail = 2;
|
||||||
|
else if (src[2] == '\0')
|
||||||
|
src_avail = 3;
|
||||||
|
else if (MB_LEN_MAX <= 4 || src[3] == '\0')
|
||||||
|
src_avail = 4;
|
||||||
|
else
|
||||||
|
src_avail = 4 + strnlen1 (src + 4, MB_LEN_MAX - 4);
|
||||||
|
|
||||||
|
/* Parse the next multibyte character. */
|
||||||
|
ret = mbrtowc (NULL, src, src_avail, &state);
|
||||||
|
|
||||||
|
if (ret == (size_t)(-2))
|
||||||
|
/* Encountered a multibyte character that extends past a '\0' byte
|
||||||
|
or that is longer than MB_LEN_MAX bytes. Cannot happen. */
|
||||||
|
abort ();
|
||||||
|
|
||||||
|
if (ret == (size_t)(-1))
|
||||||
|
goto bad_input2;
|
||||||
|
if (ret == 0)
|
||||||
|
{
|
||||||
|
/* Here mbsinit (&state). */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
src += ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
return totalcount;
|
||||||
|
}
|
||||||
|
|
||||||
|
bad_input:
|
||||||
|
*srcp = src;
|
||||||
|
bad_input2:
|
||||||
|
errno = EILSEQ;
|
||||||
|
return (size_t)(-1);
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,5 +1,5 @@
|
||||||
/* Convert string to wide string.
|
/* Convert string to wide string.
|
||||||
Copyright (C) 2008-2010 Free Software Foundation, Inc.
|
Copyright (C) 2008-2013 Free Software Foundation, Inc.
|
||||||
Written by Bruno Haible <bruno@clisp.org>, 2008.
|
Written by Bruno Haible <bruno@clisp.org>, 2008.
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
@ -22,7 +22,7 @@
|
||||||
/* Internal state used by the functions mbsrtowcs() and mbsnrtowcs(). */
|
/* Internal state used by the functions mbsrtowcs() and mbsnrtowcs(). */
|
||||||
mbstate_t _gl_mbsrtowcs_state
|
mbstate_t _gl_mbsrtowcs_state
|
||||||
/* The state must initially be in the "initial state"; so, zero-initialize it.
|
/* The state must initially be in the "initial state"; so, zero-initialize it.
|
||||||
On most systems, putting it into BSS is sufficient. Not so on MacOS X 10.3,
|
On most systems, putting it into BSS is sufficient. Not so on Mac OS X 10.3,
|
||||||
see <http://lists.gnu.org/archive/html/bug-gnulib/2009-01/msg00329.html>.
|
see <http://lists.gnu.org/archive/html/bug-gnulib/2009-01/msg00329.html>.
|
||||||
When it needs an initializer, use 0 or {0} as initializer? 0 only works
|
When it needs an initializer, use 0 or {0} as initializer? 0 only works
|
||||||
when mbstate_t is a scalar type (such as when gnulib defines it, or on
|
when mbstate_t is a scalar type (such as when gnulib defines it, or on
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* Convert string to wide string.
|
/* Convert string to wide string.
|
||||||
Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
|
Copyright (C) 2008-2013 Free Software Foundation, Inc.
|
||||||
Written by Bruno Haible <bruno@clisp.org>, 2008.
|
Written by Bruno Haible <bruno@clisp.org>, 2008.
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
@ -29,108 +29,4 @@
|
||||||
|
|
||||||
extern mbstate_t _gl_mbsrtowcs_state;
|
extern mbstate_t _gl_mbsrtowcs_state;
|
||||||
|
|
||||||
size_t
|
#include "mbsrtowcs-impl.h"
|
||||||
mbsrtowcs (wchar_t *dest, const char **srcp, size_t len, mbstate_t *ps)
|
|
||||||
{
|
|
||||||
if (ps == NULL)
|
|
||||||
ps = &_gl_mbsrtowcs_state;
|
|
||||||
{
|
|
||||||
const char *src = *srcp;
|
|
||||||
|
|
||||||
if (dest != NULL)
|
|
||||||
{
|
|
||||||
wchar_t *destptr = dest;
|
|
||||||
|
|
||||||
for (; len > 0; destptr++, len--)
|
|
||||||
{
|
|
||||||
size_t src_avail;
|
|
||||||
size_t ret;
|
|
||||||
|
|
||||||
/* An optimized variant of
|
|
||||||
src_avail = strnlen1 (src, MB_LEN_MAX); */
|
|
||||||
if (src[0] == '\0')
|
|
||||||
src_avail = 1;
|
|
||||||
else if (src[1] == '\0')
|
|
||||||
src_avail = 2;
|
|
||||||
else if (src[2] == '\0')
|
|
||||||
src_avail = 3;
|
|
||||||
else if (MB_LEN_MAX <= 4 || src[3] == '\0')
|
|
||||||
src_avail = 4;
|
|
||||||
else
|
|
||||||
src_avail = 4 + strnlen1 (src + 4, MB_LEN_MAX - 4);
|
|
||||||
|
|
||||||
/* Parse the next multibyte character. */
|
|
||||||
ret = mbrtowc (destptr, src, src_avail, ps);
|
|
||||||
|
|
||||||
if (ret == (size_t)(-2))
|
|
||||||
/* Encountered a multibyte character that extends past a '\0' byte
|
|
||||||
or that is longer than MB_LEN_MAX bytes. Cannot happen. */
|
|
||||||
abort ();
|
|
||||||
|
|
||||||
if (ret == (size_t)(-1))
|
|
||||||
goto bad_input;
|
|
||||||
if (ret == 0)
|
|
||||||
{
|
|
||||||
src = NULL;
|
|
||||||
/* Here mbsinit (ps). */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
src += ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
*srcp = src;
|
|
||||||
return destptr - dest;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Ignore dest and len, don't store *srcp at the end, and
|
|
||||||
don't clobber *ps. */
|
|
||||||
mbstate_t state = *ps;
|
|
||||||
size_t totalcount = 0;
|
|
||||||
|
|
||||||
for (;; totalcount++)
|
|
||||||
{
|
|
||||||
size_t src_avail;
|
|
||||||
size_t ret;
|
|
||||||
|
|
||||||
/* An optimized variant of
|
|
||||||
src_avail = strnlen1 (src, MB_LEN_MAX); */
|
|
||||||
if (src[0] == '\0')
|
|
||||||
src_avail = 1;
|
|
||||||
else if (src[1] == '\0')
|
|
||||||
src_avail = 2;
|
|
||||||
else if (src[2] == '\0')
|
|
||||||
src_avail = 3;
|
|
||||||
else if (MB_LEN_MAX <= 4 || src[3] == '\0')
|
|
||||||
src_avail = 4;
|
|
||||||
else
|
|
||||||
src_avail = 4 + strnlen1 (src + 4, MB_LEN_MAX - 4);
|
|
||||||
|
|
||||||
/* Parse the next multibyte character. */
|
|
||||||
ret = mbrtowc (NULL, src, src_avail, &state);
|
|
||||||
|
|
||||||
if (ret == (size_t)(-2))
|
|
||||||
/* Encountered a multibyte character that extends past a '\0' byte
|
|
||||||
or that is longer than MB_LEN_MAX bytes. Cannot happen. */
|
|
||||||
abort ();
|
|
||||||
|
|
||||||
if (ret == (size_t)(-1))
|
|
||||||
goto bad_input2;
|
|
||||||
if (ret == 0)
|
|
||||||
{
|
|
||||||
/* Here mbsinit (&state). */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
src += ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
return totalcount;
|
|
||||||
}
|
|
||||||
|
|
||||||
bad_input:
|
|
||||||
*srcp = src;
|
|
||||||
bad_input2:
|
|
||||||
errno = EILSEQ;
|
|
||||||
return (size_t)(-1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
199
grub-core/gnulib/mbswidth.c
Normal file
199
grub-core/gnulib/mbswidth.c
Normal file
|
@ -0,0 +1,199 @@
|
||||||
|
/* Determine the number of screen columns needed for a string.
|
||||||
|
Copyright (C) 2000-2013 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 <haible@clisp.cons.org>. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
/* Specification. */
|
||||||
|
#include "mbswidth.h"
|
||||||
|
|
||||||
|
/* Get MB_CUR_MAX. */
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
/* Get isprint(). */
|
||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
|
/* Get mbstate_t, mbrtowc(), mbsinit(), wcwidth(). */
|
||||||
|
#include <wchar.h>
|
||||||
|
|
||||||
|
/* Get iswcntrl(). */
|
||||||
|
#include <wctype.h>
|
||||||
|
|
||||||
|
/* Get INT_MAX. */
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
|
/* Returns the number of columns needed to represent the multibyte
|
||||||
|
character string pointed to by STRING. If a non-printable character
|
||||||
|
occurs, and MBSW_REJECT_UNPRINTABLE is specified, -1 is returned.
|
||||||
|
With flags = MBSW_REJECT_INVALID | MBSW_REJECT_UNPRINTABLE, this is
|
||||||
|
the multibyte analogue of the wcswidth function. */
|
||||||
|
int
|
||||||
|
mbswidth (const char *string, int flags)
|
||||||
|
{
|
||||||
|
return mbsnwidth (string, strlen (string), flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Returns the number of columns needed to represent the multibyte
|
||||||
|
character string pointed to by STRING of length NBYTES. If a
|
||||||
|
non-printable character occurs, and MBSW_REJECT_UNPRINTABLE is
|
||||||
|
specified, -1 is returned. */
|
||||||
|
int
|
||||||
|
mbsnwidth (const char *string, size_t nbytes, int flags)
|
||||||
|
{
|
||||||
|
const char *p = string;
|
||||||
|
const char *plimit = p + nbytes;
|
||||||
|
int width;
|
||||||
|
|
||||||
|
width = 0;
|
||||||
|
if (MB_CUR_MAX > 1)
|
||||||
|
{
|
||||||
|
while (p < plimit)
|
||||||
|
switch (*p)
|
||||||
|
{
|
||||||
|
case ' ': case '!': case '"': case '#': case '%':
|
||||||
|
case '&': case '\'': case '(': case ')': case '*':
|
||||||
|
case '+': case ',': case '-': case '.': case '/':
|
||||||
|
case '0': case '1': case '2': case '3': case '4':
|
||||||
|
case '5': case '6': case '7': case '8': case '9':
|
||||||
|
case ':': case ';': case '<': case '=': case '>':
|
||||||
|
case '?':
|
||||||
|
case 'A': case 'B': case 'C': case 'D': case 'E':
|
||||||
|
case 'F': case 'G': case 'H': case 'I': case 'J':
|
||||||
|
case 'K': case 'L': case 'M': case 'N': case 'O':
|
||||||
|
case 'P': case 'Q': case 'R': case 'S': case 'T':
|
||||||
|
case 'U': case 'V': case 'W': case 'X': case 'Y':
|
||||||
|
case 'Z':
|
||||||
|
case '[': case '\\': case ']': case '^': case '_':
|
||||||
|
case 'a': case 'b': case 'c': case 'd': case 'e':
|
||||||
|
case 'f': case 'g': case 'h': case 'i': case 'j':
|
||||||
|
case 'k': case 'l': case 'm': case 'n': case 'o':
|
||||||
|
case 'p': case 'q': case 'r': case 's': case 't':
|
||||||
|
case 'u': case 'v': case 'w': case 'x': case 'y':
|
||||||
|
case 'z': case '{': case '|': case '}': case '~':
|
||||||
|
/* These characters are printable ASCII characters. */
|
||||||
|
p++;
|
||||||
|
width++;
|
||||||
|
break;
|
||||||
|
case '\0':
|
||||||
|
if (flags & MBSW_STOP_AT_NUL)
|
||||||
|
return width;
|
||||||
|
default:
|
||||||
|
/* If we have a multibyte sequence, scan it up to its end. */
|
||||||
|
{
|
||||||
|
mbstate_t mbstate;
|
||||||
|
memset (&mbstate, 0, sizeof mbstate);
|
||||||
|
do
|
||||||
|
{
|
||||||
|
wchar_t wc;
|
||||||
|
size_t bytes;
|
||||||
|
int w;
|
||||||
|
|
||||||
|
bytes = mbrtowc (&wc, p, plimit - p, &mbstate);
|
||||||
|
|
||||||
|
if (bytes == (size_t) -1)
|
||||||
|
/* An invalid multibyte sequence was encountered. */
|
||||||
|
{
|
||||||
|
if (!(flags & MBSW_REJECT_INVALID))
|
||||||
|
{
|
||||||
|
p++;
|
||||||
|
width++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bytes == (size_t) -2)
|
||||||
|
/* An incomplete multibyte character at the end. */
|
||||||
|
{
|
||||||
|
if (!(flags & MBSW_REJECT_INVALID))
|
||||||
|
{
|
||||||
|
p = plimit;
|
||||||
|
width++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bytes == 0)
|
||||||
|
/* A null wide character was encountered. */
|
||||||
|
bytes = 1;
|
||||||
|
|
||||||
|
w = wcwidth (wc);
|
||||||
|
if (w >= 0)
|
||||||
|
/* A printable multibyte character. */
|
||||||
|
{
|
||||||
|
if (w > INT_MAX - width)
|
||||||
|
goto overflow;
|
||||||
|
width += w;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
/* An unprintable multibyte character. */
|
||||||
|
if (!(flags & MBSW_REJECT_UNPRINTABLE))
|
||||||
|
{
|
||||||
|
if (!iswcntrl (wc))
|
||||||
|
{
|
||||||
|
if (width == INT_MAX)
|
||||||
|
goto overflow;
|
||||||
|
width++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
p += bytes;
|
||||||
|
}
|
||||||
|
while (! mbsinit (&mbstate));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return width;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (p < plimit)
|
||||||
|
{
|
||||||
|
unsigned char c = (unsigned char) *p++;
|
||||||
|
|
||||||
|
if (c == 0 && (flags & MBSW_STOP_AT_NUL))
|
||||||
|
return width;
|
||||||
|
|
||||||
|
if (isprint (c))
|
||||||
|
{
|
||||||
|
if (width == INT_MAX)
|
||||||
|
goto overflow;
|
||||||
|
width++;
|
||||||
|
}
|
||||||
|
else if (!(flags & MBSW_REJECT_UNPRINTABLE))
|
||||||
|
{
|
||||||
|
if (!iscntrl (c))
|
||||||
|
{
|
||||||
|
if (width == INT_MAX)
|
||||||
|
goto overflow;
|
||||||
|
width++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return width;
|
||||||
|
|
||||||
|
overflow:
|
||||||
|
return INT_MAX;
|
||||||
|
}
|
63
grub-core/gnulib/mbswidth.h
Normal file
63
grub-core/gnulib/mbswidth.h
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
/* Determine the number of screen columns needed for a string.
|
||||||
|
Copyright (C) 2000-2004, 2007, 2009-2013 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/>. */
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
/* Avoid a clash of our mbswidth() with a function of the same name defined
|
||||||
|
in UnixWare 7.1.1 <wchar.h>. We need this #include before the #define
|
||||||
|
below.
|
||||||
|
However, we don't want to #include <wchar.h> on all platforms because
|
||||||
|
- Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
|
||||||
|
<wchar.h>.
|
||||||
|
- BSD/OS 4.1 has a bug: <stdio.h> and <time.h> must be included before
|
||||||
|
<wchar.h>. */
|
||||||
|
#if HAVE_DECL_MBSWIDTH_IN_WCHAR_H
|
||||||
|
# include <wchar.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Optional flags to influence mbswidth/mbsnwidth behavior. */
|
||||||
|
|
||||||
|
/* If this bit is set, return -1 upon finding an invalid or incomplete
|
||||||
|
character. Otherwise, assume invalid characters have width 1. */
|
||||||
|
#define MBSW_REJECT_INVALID 1
|
||||||
|
|
||||||
|
/* If this bit is set, return -1 upon finding a non-printable character.
|
||||||
|
Otherwise, assume unprintable characters have width 0 if they are
|
||||||
|
control characters and 1 otherwise. */
|
||||||
|
#define MBSW_REJECT_UNPRINTABLE 2
|
||||||
|
|
||||||
|
/* If this bit is set \0 is treated as the end of string.
|
||||||
|
Otherwise it's treated as a normal one column width character. */
|
||||||
|
#define MBSW_STOP_AT_NUL 4
|
||||||
|
|
||||||
|
/* Returns the number of screen columns needed for STRING. */
|
||||||
|
#define mbswidth gnu_mbswidth /* avoid clash with UnixWare 7.1.1 function */
|
||||||
|
extern int mbswidth (const char *string, int flags);
|
||||||
|
|
||||||
|
/* Returns the number of screen columns needed for the NBYTES bytes
|
||||||
|
starting at BUF. */
|
||||||
|
extern int mbsnwidth (const char *buf, size_t nbytes, int flags);
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
44
grub-core/gnulib/mbtowc-impl.h
Normal file
44
grub-core/gnulib/mbtowc-impl.h
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
/* Convert multibyte character to wide character.
|
||||||
|
Copyright (C) 2011-2013 Free Software Foundation, Inc.
|
||||||
|
Written by Bruno Haible <bruno@clisp.org>, 2011.
|
||||||
|
|
||||||
|
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/>. */
|
||||||
|
|
||||||
|
/* We don't need a static internal state, because the encoding is not state
|
||||||
|
dependent, and when mbrtowc returns (size_t)(-2). we throw the result
|
||||||
|
away. */
|
||||||
|
|
||||||
|
int
|
||||||
|
mbtowc (wchar_t *pwc, const char *s, size_t n)
|
||||||
|
{
|
||||||
|
if (s == NULL)
|
||||||
|
return 0;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mbstate_t state;
|
||||||
|
wchar_t wc;
|
||||||
|
size_t result;
|
||||||
|
|
||||||
|
memset (&state, 0, sizeof (mbstate_t));
|
||||||
|
result = mbrtowc (&wc, s, n, &state);
|
||||||
|
if (result == (size_t)-1 || result == (size_t)-2)
|
||||||
|
{
|
||||||
|
errno = EILSEQ;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (pwc != NULL)
|
||||||
|
*pwc = wc;
|
||||||
|
return (wc == 0 ? 0 : result);
|
||||||
|
}
|
||||||
|
}
|
26
grub-core/gnulib/mbtowc.c
Normal file
26
grub-core/gnulib/mbtowc.c
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
/* Convert multibyte character to wide character.
|
||||||
|
Copyright (C) 2011-2013 Free Software Foundation, Inc.
|
||||||
|
Written by Bruno Haible <bruno@clisp.org>, 2011.
|
||||||
|
|
||||||
|
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/>. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <wchar.h>
|
||||||
|
|
||||||
|
#include "mbtowc-impl.h"
|
|
@ -1,4 +1,4 @@
|
||||||
/* Copyright (C) 1991, 1993, 1996-1997, 1999-2000, 2003-2004, 2006, 2008-2010
|
/* Copyright (C) 1991, 1993, 1996-1997, 1999-2000, 2003-2004, 2006, 2008-2013
|
||||||
Free Software Foundation, Inc.
|
Free Software Foundation, Inc.
|
||||||
|
|
||||||
Based on strlen implementation by Torbjorn Granlund (tege@sics.se),
|
Based on strlen implementation by Torbjorn Granlund (tege@sics.se),
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* Copy memory area and return pointer after last written byte.
|
/* Copy memory area and return pointer after last written byte.
|
||||||
Copyright (C) 2003, 2007, 2009, 2010 Free Software Foundation, Inc.
|
Copyright (C) 2003, 2007, 2009-2013 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -12,8 +12,7 @@
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program; if not, write to the Free Software Foundation,
|
along with this program; if not, see <http://www.gnu.org/licenses/>. */
|
||||||
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
||||||
|
|
129
grub-core/gnulib/msvc-inval.c
Normal file
129
grub-core/gnulib/msvc-inval.c
Normal file
|
@ -0,0 +1,129 @@
|
||||||
|
/* Invalid parameter handler for MSVC runtime libraries.
|
||||||
|
Copyright (C) 2011-2013 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, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
/* Specification. */
|
||||||
|
#include "msvc-inval.h"
|
||||||
|
|
||||||
|
#if HAVE_MSVC_INVALID_PARAMETER_HANDLER \
|
||||||
|
&& !(MSVC_INVALID_PARAMETER_HANDLING == SANE_LIBRARY_HANDLING)
|
||||||
|
|
||||||
|
/* Get _invalid_parameter_handler type and _set_invalid_parameter_handler
|
||||||
|
declaration. */
|
||||||
|
# include <stdlib.h>
|
||||||
|
|
||||||
|
# if MSVC_INVALID_PARAMETER_HANDLING == DEFAULT_HANDLING
|
||||||
|
|
||||||
|
static void cdecl
|
||||||
|
gl_msvc_invalid_parameter_handler (const wchar_t *expression,
|
||||||
|
const wchar_t *function,
|
||||||
|
const wchar_t *file,
|
||||||
|
unsigned int line,
|
||||||
|
uintptr_t dummy)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
# else
|
||||||
|
|
||||||
|
/* Get declarations of the native Windows API functions. */
|
||||||
|
# define WIN32_LEAN_AND_MEAN
|
||||||
|
# include <windows.h>
|
||||||
|
|
||||||
|
# if defined _MSC_VER
|
||||||
|
|
||||||
|
static void cdecl
|
||||||
|
gl_msvc_invalid_parameter_handler (const wchar_t *expression,
|
||||||
|
const wchar_t *function,
|
||||||
|
const wchar_t *file,
|
||||||
|
unsigned int line,
|
||||||
|
uintptr_t dummy)
|
||||||
|
{
|
||||||
|
RaiseException (STATUS_GNULIB_INVALID_PARAMETER, 0, 0, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
# else
|
||||||
|
|
||||||
|
/* An index to thread-local storage. */
|
||||||
|
static DWORD tls_index;
|
||||||
|
static int tls_initialized /* = 0 */;
|
||||||
|
|
||||||
|
/* Used as a fallback only. */
|
||||||
|
static struct gl_msvc_inval_per_thread not_per_thread;
|
||||||
|
|
||||||
|
struct gl_msvc_inval_per_thread *
|
||||||
|
gl_msvc_inval_current (void)
|
||||||
|
{
|
||||||
|
if (!tls_initialized)
|
||||||
|
{
|
||||||
|
tls_index = TlsAlloc ();
|
||||||
|
tls_initialized = 1;
|
||||||
|
}
|
||||||
|
if (tls_index == TLS_OUT_OF_INDEXES)
|
||||||
|
/* TlsAlloc had failed. */
|
||||||
|
return ¬_per_thread;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
struct gl_msvc_inval_per_thread *pointer =
|
||||||
|
(struct gl_msvc_inval_per_thread *) TlsGetValue (tls_index);
|
||||||
|
if (pointer == NULL)
|
||||||
|
{
|
||||||
|
/* First call. Allocate a new 'struct gl_msvc_inval_per_thread'. */
|
||||||
|
pointer =
|
||||||
|
(struct gl_msvc_inval_per_thread *)
|
||||||
|
malloc (sizeof (struct gl_msvc_inval_per_thread));
|
||||||
|
if (pointer == NULL)
|
||||||
|
/* Could not allocate memory. Use the global storage. */
|
||||||
|
pointer = ¬_per_thread;
|
||||||
|
TlsSetValue (tls_index, pointer);
|
||||||
|
}
|
||||||
|
return pointer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cdecl
|
||||||
|
gl_msvc_invalid_parameter_handler (const wchar_t *expression,
|
||||||
|
const wchar_t *function,
|
||||||
|
const wchar_t *file,
|
||||||
|
unsigned int line,
|
||||||
|
uintptr_t dummy)
|
||||||
|
{
|
||||||
|
struct gl_msvc_inval_per_thread *current = gl_msvc_inval_current ();
|
||||||
|
if (current->restart_valid)
|
||||||
|
longjmp (current->restart, 1);
|
||||||
|
else
|
||||||
|
/* An invalid parameter notification from outside the gnulib code.
|
||||||
|
Give the caller a chance to intervene. */
|
||||||
|
RaiseException (STATUS_GNULIB_INVALID_PARAMETER, 0, 0, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# endif
|
||||||
|
|
||||||
|
static int gl_msvc_inval_initialized /* = 0 */;
|
||||||
|
|
||||||
|
void
|
||||||
|
gl_msvc_inval_ensure_handler (void)
|
||||||
|
{
|
||||||
|
if (gl_msvc_inval_initialized == 0)
|
||||||
|
{
|
||||||
|
_set_invalid_parameter_handler (gl_msvc_invalid_parameter_handler);
|
||||||
|
gl_msvc_inval_initialized = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
222
grub-core/gnulib/msvc-inval.h
Normal file
222
grub-core/gnulib/msvc-inval.h
Normal file
|
@ -0,0 +1,222 @@
|
||||||
|
/* Invalid parameter handler for MSVC runtime libraries.
|
||||||
|
Copyright (C) 2011-2013 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, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#ifndef _MSVC_INVAL_H
|
||||||
|
#define _MSVC_INVAL_H
|
||||||
|
|
||||||
|
/* With MSVC runtime libraries with the "invalid parameter handler" concept,
|
||||||
|
functions like fprintf(), dup2(), or close() crash when the caller passes
|
||||||
|
an invalid argument. But POSIX wants error codes (such as EINVAL or EBADF)
|
||||||
|
instead.
|
||||||
|
This file defines macros that turn such an invalid parameter notification
|
||||||
|
into a non-local exit. An error code can then be produced at the target
|
||||||
|
of this exit. You can thus write code like
|
||||||
|
|
||||||
|
TRY_MSVC_INVAL
|
||||||
|
{
|
||||||
|
<Code that can trigger an invalid parameter notification
|
||||||
|
but does not do 'return', 'break', 'continue', nor 'goto'.>
|
||||||
|
}
|
||||||
|
CATCH_MSVC_INVAL
|
||||||
|
{
|
||||||
|
<Code that handles an invalid parameter notification
|
||||||
|
but does not do 'return', 'break', 'continue', nor 'goto'.>
|
||||||
|
}
|
||||||
|
DONE_MSVC_INVAL;
|
||||||
|
|
||||||
|
This entire block expands to a single statement.
|
||||||
|
|
||||||
|
The handling of invalid parameters can be done in three ways:
|
||||||
|
|
||||||
|
* The default way, which is reasonable for programs (not libraries):
|
||||||
|
AC_DEFINE([MSVC_INVALID_PARAMETER_HANDLING], [DEFAULT_HANDLING])
|
||||||
|
|
||||||
|
* The way for libraries that make "hairy" calls (like close(-1), or
|
||||||
|
fclose(fp) where fileno(fp) is closed, or simply getdtablesize()):
|
||||||
|
AC_DEFINE([MSVC_INVALID_PARAMETER_HANDLING], [HAIRY_LIBRARY_HANDLING])
|
||||||
|
|
||||||
|
* The way for libraries that make no "hairy" calls:
|
||||||
|
AC_DEFINE([MSVC_INVALID_PARAMETER_HANDLING], [SANE_LIBRARY_HANDLING])
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define DEFAULT_HANDLING 0
|
||||||
|
#define HAIRY_LIBRARY_HANDLING 1
|
||||||
|
#define SANE_LIBRARY_HANDLING 2
|
||||||
|
|
||||||
|
#if HAVE_MSVC_INVALID_PARAMETER_HANDLER \
|
||||||
|
&& !(MSVC_INVALID_PARAMETER_HANDLING == SANE_LIBRARY_HANDLING)
|
||||||
|
/* A native Windows platform with the "invalid parameter handler" concept,
|
||||||
|
and either DEFAULT_HANDLING or HAIRY_LIBRARY_HANDLING. */
|
||||||
|
|
||||||
|
# if MSVC_INVALID_PARAMETER_HANDLING == DEFAULT_HANDLING
|
||||||
|
/* Default handling. */
|
||||||
|
|
||||||
|
# ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
# endif
|
||||||
|
|
||||||
|
/* Ensure that the invalid parameter handler in installed that just returns.
|
||||||
|
Because we assume no other part of the program installs a different
|
||||||
|
invalid parameter handler, this solution is multithread-safe. */
|
||||||
|
extern void gl_msvc_inval_ensure_handler (void);
|
||||||
|
|
||||||
|
# ifdef __cplusplus
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# define TRY_MSVC_INVAL \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
gl_msvc_inval_ensure_handler (); \
|
||||||
|
if (1)
|
||||||
|
# define CATCH_MSVC_INVAL \
|
||||||
|
else
|
||||||
|
# define DONE_MSVC_INVAL \
|
||||||
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
|
# else
|
||||||
|
/* Handling for hairy libraries. */
|
||||||
|
|
||||||
|
# include <excpt.h>
|
||||||
|
|
||||||
|
/* Gnulib can define its own status codes, as described in the page
|
||||||
|
"Raising Software Exceptions" on microsoft.com
|
||||||
|
<http://msdn.microsoft.com/en-us/library/het71c37.aspx>.
|
||||||
|
Our status codes are composed of
|
||||||
|
- 0xE0000000, mandatory for all user-defined status codes,
|
||||||
|
- 0x474E550, a API identifier ("GNU"),
|
||||||
|
- 0, 1, 2, ..., used to distinguish different status codes from the
|
||||||
|
same API. */
|
||||||
|
# define STATUS_GNULIB_INVALID_PARAMETER (0xE0000000 + 0x474E550 + 0)
|
||||||
|
|
||||||
|
# if defined _MSC_VER
|
||||||
|
/* A compiler that supports __try/__except, as described in the page
|
||||||
|
"try-except statement" on microsoft.com
|
||||||
|
<http://msdn.microsoft.com/en-us/library/s58ftw19.aspx>.
|
||||||
|
With __try/__except, we can use the multithread-safe exception handling. */
|
||||||
|
|
||||||
|
# ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
# endif
|
||||||
|
|
||||||
|
/* Ensure that the invalid parameter handler in installed that raises a
|
||||||
|
software exception with code STATUS_GNULIB_INVALID_PARAMETER.
|
||||||
|
Because we assume no other part of the program installs a different
|
||||||
|
invalid parameter handler, this solution is multithread-safe. */
|
||||||
|
extern void gl_msvc_inval_ensure_handler (void);
|
||||||
|
|
||||||
|
# ifdef __cplusplus
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# define TRY_MSVC_INVAL \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
gl_msvc_inval_ensure_handler (); \
|
||||||
|
__try
|
||||||
|
# define CATCH_MSVC_INVAL \
|
||||||
|
__except (GetExceptionCode () == STATUS_GNULIB_INVALID_PARAMETER \
|
||||||
|
? EXCEPTION_EXECUTE_HANDLER \
|
||||||
|
: EXCEPTION_CONTINUE_SEARCH)
|
||||||
|
# define DONE_MSVC_INVAL \
|
||||||
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
|
# else
|
||||||
|
/* Any compiler.
|
||||||
|
We can only use setjmp/longjmp. */
|
||||||
|
|
||||||
|
# include <setjmp.h>
|
||||||
|
|
||||||
|
# ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
# endif
|
||||||
|
|
||||||
|
struct gl_msvc_inval_per_thread
|
||||||
|
{
|
||||||
|
/* The restart that will resume execution at the code between
|
||||||
|
CATCH_MSVC_INVAL and DONE_MSVC_INVAL. It is enabled only between
|
||||||
|
TRY_MSVC_INVAL and CATCH_MSVC_INVAL. */
|
||||||
|
jmp_buf restart;
|
||||||
|
|
||||||
|
/* Tells whether the contents of restart is valid. */
|
||||||
|
int restart_valid;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Ensure that the invalid parameter handler in installed that passes
|
||||||
|
control to the gl_msvc_inval_restart if it is valid, or raises a
|
||||||
|
software exception with code STATUS_GNULIB_INVALID_PARAMETER otherwise.
|
||||||
|
Because we assume no other part of the program installs a different
|
||||||
|
invalid parameter handler, this solution is multithread-safe. */
|
||||||
|
extern void gl_msvc_inval_ensure_handler (void);
|
||||||
|
|
||||||
|
/* Return a pointer to the per-thread data for the current thread. */
|
||||||
|
extern struct gl_msvc_inval_per_thread *gl_msvc_inval_current (void);
|
||||||
|
|
||||||
|
# ifdef __cplusplus
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# define TRY_MSVC_INVAL \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
struct gl_msvc_inval_per_thread *msvc_inval_current; \
|
||||||
|
gl_msvc_inval_ensure_handler (); \
|
||||||
|
msvc_inval_current = gl_msvc_inval_current (); \
|
||||||
|
/* First, initialize gl_msvc_inval_restart. */ \
|
||||||
|
if (setjmp (msvc_inval_current->restart) == 0) \
|
||||||
|
{ \
|
||||||
|
/* Then, mark it as valid. */ \
|
||||||
|
msvc_inval_current->restart_valid = 1;
|
||||||
|
# define CATCH_MSVC_INVAL \
|
||||||
|
/* Execution completed. \
|
||||||
|
Mark gl_msvc_inval_restart as invalid. */ \
|
||||||
|
msvc_inval_current->restart_valid = 0; \
|
||||||
|
} \
|
||||||
|
else \
|
||||||
|
{ \
|
||||||
|
/* Execution triggered an invalid parameter notification. \
|
||||||
|
Mark gl_msvc_inval_restart as invalid. */ \
|
||||||
|
msvc_inval_current->restart_valid = 0;
|
||||||
|
# define DONE_MSVC_INVAL \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#else
|
||||||
|
/* A platform that does not need to the invalid parameter handler,
|
||||||
|
or when SANE_LIBRARY_HANDLING is desired. */
|
||||||
|
|
||||||
|
/* The braces here avoid GCC warnings like
|
||||||
|
"warning: suggest explicit braces to avoid ambiguous 'else'". */
|
||||||
|
# define TRY_MSVC_INVAL \
|
||||||
|
do \
|
||||||
|
{ \
|
||||||
|
if (1)
|
||||||
|
# define CATCH_MSVC_INVAL \
|
||||||
|
else
|
||||||
|
# define DONE_MSVC_INVAL \
|
||||||
|
} \
|
||||||
|
while (0)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _MSVC_INVAL_H */
|
49
grub-core/gnulib/msvc-nothrow.c
Normal file
49
grub-core/gnulib/msvc-nothrow.c
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
/* Wrappers that don't throw invalid parameter notifications
|
||||||
|
with MSVC runtime libraries.
|
||||||
|
Copyright (C) 2011-2013 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, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
/* Specification. */
|
||||||
|
#include "msvc-nothrow.h"
|
||||||
|
|
||||||
|
/* Get declarations of the native Windows API functions. */
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
#include "msvc-inval.h"
|
||||||
|
|
||||||
|
#undef _get_osfhandle
|
||||||
|
|
||||||
|
#if HAVE_MSVC_INVALID_PARAMETER_HANDLER
|
||||||
|
intptr_t
|
||||||
|
_gl_nothrow_get_osfhandle (int fd)
|
||||||
|
{
|
||||||
|
intptr_t result;
|
||||||
|
|
||||||
|
TRY_MSVC_INVAL
|
||||||
|
{
|
||||||
|
result = _get_osfhandle (fd);
|
||||||
|
}
|
||||||
|
CATCH_MSVC_INVAL
|
||||||
|
{
|
||||||
|
result = (intptr_t) INVALID_HANDLE_VALUE;
|
||||||
|
}
|
||||||
|
DONE_MSVC_INVAL;
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
#endif
|
43
grub-core/gnulib/msvc-nothrow.h
Normal file
43
grub-core/gnulib/msvc-nothrow.h
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
/* Wrappers that don't throw invalid parameter notifications
|
||||||
|
with MSVC runtime libraries.
|
||||||
|
Copyright (C) 2011-2013 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, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#ifndef _MSVC_NOTHROW_H
|
||||||
|
#define _MSVC_NOTHROW_H
|
||||||
|
|
||||||
|
/* With MSVC runtime libraries with the "invalid parameter handler" concept,
|
||||||
|
functions like fprintf(), dup2(), or close() crash when the caller passes
|
||||||
|
an invalid argument. But POSIX wants error codes (such as EINVAL or EBADF)
|
||||||
|
instead.
|
||||||
|
This file defines wrappers that turn such an invalid parameter notification
|
||||||
|
into an error code. */
|
||||||
|
|
||||||
|
#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
|
||||||
|
|
||||||
|
/* Get original declaration of _get_osfhandle. */
|
||||||
|
# include <io.h>
|
||||||
|
|
||||||
|
# if HAVE_MSVC_INVALID_PARAMETER_HANDLER
|
||||||
|
|
||||||
|
/* Override _get_osfhandle. */
|
||||||
|
extern intptr_t _gl_nothrow_get_osfhandle (int fd);
|
||||||
|
# define _get_osfhandle _gl_nothrow_get_osfhandle
|
||||||
|
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _MSVC_NOTHROW_H */
|
|
@ -1,6 +1,6 @@
|
||||||
/* nl_langinfo() replacement: query locale dependent information.
|
/* nl_langinfo() replacement: query locale dependent information.
|
||||||
|
|
||||||
Copyright (C) 2007-2010 Free Software Foundation, Inc.
|
Copyright (C) 2007-2013 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -97,7 +97,7 @@ rpl_nl_langinfo (nl_item item)
|
||||||
strings, appended in memory. */
|
strings, appended in memory. */
|
||||||
return "\0\0\0\0\0\0\0\0\0\0";
|
return "\0\0\0\0\0\0\0\0\0\0";
|
||||||
# endif
|
# endif
|
||||||
# if GNULIB_defined_YESEXPR
|
# if GNULIB_defined_YESEXPR || !FUNC_NL_LANGINFO_YESEXPR_WORKS
|
||||||
case YESEXPR:
|
case YESEXPR:
|
||||||
return "^[yY]";
|
return "^[yY]";
|
||||||
case NOEXPR:
|
case NOEXPR:
|
||||||
|
@ -141,7 +141,8 @@ nl_langinfo (nl_item item)
|
||||||
{
|
{
|
||||||
static char buf[2 + 10 + 1];
|
static char buf[2 + 10 + 1];
|
||||||
|
|
||||||
/* Woe32 has a function returning the locale's codepage as a number. */
|
/* The Windows API has a function returning the locale's codepage as
|
||||||
|
a number. */
|
||||||
sprintf (buf, "CP%u", GetACP ());
|
sprintf (buf, "CP%u", GetACP ());
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* Decomposed printf argument list.
|
/* Decomposed printf argument list.
|
||||||
Copyright (C) 1999, 2002-2003, 2005-2007, 2009-2010 Free Software
|
Copyright (C) 1999, 2002-2003, 2005-2007, 2009-2013 Free Software
|
||||||
Foundation, Inc.
|
Foundation, Inc.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
@ -13,8 +13,7 @@
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License along
|
||||||
with this program; if not, write to the Free Software Foundation,
|
with this program; if not, see <http://www.gnu.org/licenses/>. */
|
||||||
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
|
||||||
|
|
||||||
/* This file can be parametrized with the following macros:
|
/* This file can be parametrized with the following macros:
|
||||||
ENABLE_UNISTDIO Set to 1 to enable the unistdio extensions.
|
ENABLE_UNISTDIO Set to 1 to enable the unistdio extensions.
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* Decomposed printf argument list.
|
/* Decomposed printf argument list.
|
||||||
Copyright (C) 1999, 2002-2003, 2006-2007, 2009-2010 Free Software
|
Copyright (C) 1999, 2002-2003, 2006-2007, 2011-2013 Free Software
|
||||||
Foundation, Inc.
|
Foundation, Inc.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
@ -13,8 +13,7 @@
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License along
|
||||||
with this program; if not, write to the Free Software Foundation,
|
with this program; if not, see <http://www.gnu.org/licenses/>. */
|
||||||
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
|
||||||
|
|
||||||
#ifndef _PRINTF_ARGS_H
|
#ifndef _PRINTF_ARGS_H
|
||||||
#define _PRINTF_ARGS_H
|
#define _PRINTF_ARGS_H
|
||||||
|
@ -136,10 +135,14 @@ typedef struct
|
||||||
}
|
}
|
||||||
argument;
|
argument;
|
||||||
|
|
||||||
|
/* Number of directly allocated arguments (no malloc() needed). */
|
||||||
|
#define N_DIRECT_ALLOC_ARGUMENTS 7
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
size_t count;
|
size_t count;
|
||||||
argument *arg;
|
argument *arg;
|
||||||
|
argument direct_alloc_arg[N_DIRECT_ALLOC_ARGUMENTS];
|
||||||
}
|
}
|
||||||
arguments;
|
arguments;
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* Formatted output to strings.
|
/* Formatted output to strings.
|
||||||
Copyright (C) 1999-2000, 2002-2003, 2006-2010 Free Software Foundation, Inc.
|
Copyright (C) 1999-2000, 2002-2003, 2006-2013 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -12,8 +12,7 @@
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License along
|
||||||
with this program; if not, write to the Free Software Foundation,
|
with this program; if not, see <http://www.gnu.org/licenses/>. */
|
||||||
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
|
||||||
|
|
||||||
/* This file can be parametrized with the following macros:
|
/* This file can be parametrized with the following macros:
|
||||||
CHAR_T The element type of the format string.
|
CHAR_T The element type of the format string.
|
||||||
|
@ -63,6 +62,9 @@
|
||||||
/* malloc(), realloc(), free(). */
|
/* malloc(), realloc(), free(). */
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
/* memcpy(). */
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
/* errno. */
|
/* errno. */
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
|
@ -80,23 +82,20 @@ STATIC
|
||||||
int
|
int
|
||||||
PRINTF_PARSE (const CHAR_T *format, DIRECTIVES *d, arguments *a)
|
PRINTF_PARSE (const CHAR_T *format, DIRECTIVES *d, arguments *a)
|
||||||
{
|
{
|
||||||
const CHAR_T *cp = format; /* pointer into format */
|
const CHAR_T *cp = format; /* pointer into format */
|
||||||
size_t arg_posn = 0; /* number of regular arguments consumed */
|
size_t arg_posn = 0; /* number of regular arguments consumed */
|
||||||
size_t d_allocated; /* allocated elements of d->dir */
|
size_t d_allocated; /* allocated elements of d->dir */
|
||||||
size_t a_allocated; /* allocated elements of a->arg */
|
size_t a_allocated; /* allocated elements of a->arg */
|
||||||
size_t max_width_length = 0;
|
size_t max_width_length = 0;
|
||||||
size_t max_precision_length = 0;
|
size_t max_precision_length = 0;
|
||||||
|
|
||||||
d->count = 0;
|
d->count = 0;
|
||||||
d_allocated = 1;
|
d_allocated = N_DIRECT_ALLOC_DIRECTIVES;
|
||||||
d->dir = (DIRECTIVE *) malloc (d_allocated * sizeof (DIRECTIVE));
|
d->dir = d->direct_alloc_dir;
|
||||||
if (d->dir == NULL)
|
|
||||||
/* Out of memory. */
|
|
||||||
goto out_of_memory_1;
|
|
||||||
|
|
||||||
a->count = 0;
|
a->count = 0;
|
||||||
a_allocated = 0;
|
a_allocated = N_DIRECT_ALLOC_ARGUMENTS;
|
||||||
a->arg = NULL;
|
a->arg = a->direct_alloc_arg;
|
||||||
|
|
||||||
#define REGISTER_ARG(_index_,_type_) \
|
#define REGISTER_ARG(_index_,_type_) \
|
||||||
{ \
|
{ \
|
||||||
|
@ -113,12 +112,14 @@ PRINTF_PARSE (const CHAR_T *format, DIRECTIVES *d, arguments *a)
|
||||||
if (size_overflow_p (memory_size)) \
|
if (size_overflow_p (memory_size)) \
|
||||||
/* Overflow, would lead to out of memory. */ \
|
/* Overflow, would lead to out of memory. */ \
|
||||||
goto out_of_memory; \
|
goto out_of_memory; \
|
||||||
memory = (argument *) (a->arg \
|
memory = (argument *) (a->arg != a->direct_alloc_arg \
|
||||||
? realloc (a->arg, memory_size) \
|
? realloc (a->arg, memory_size) \
|
||||||
: malloc (memory_size)); \
|
: malloc (memory_size)); \
|
||||||
if (memory == NULL) \
|
if (memory == NULL) \
|
||||||
/* Out of memory. */ \
|
/* Out of memory. */ \
|
||||||
goto out_of_memory; \
|
goto out_of_memory; \
|
||||||
|
if (a->arg == a->direct_alloc_arg) \
|
||||||
|
memcpy (memory, a->arg, a->count * sizeof (argument)); \
|
||||||
a->arg = memory; \
|
a->arg = memory; \
|
||||||
} \
|
} \
|
||||||
while (a->count <= n) \
|
while (a->count <= n) \
|
||||||
|
@ -206,6 +207,13 @@ PRINTF_PARSE (const CHAR_T *format, DIRECTIVES *d, arguments *a)
|
||||||
dp->flags |= FLAG_ZERO;
|
dp->flags |= FLAG_ZERO;
|
||||||
cp++;
|
cp++;
|
||||||
}
|
}
|
||||||
|
#if __GLIBC__ >= 2 && !defined __UCLIBC__
|
||||||
|
else if (*cp == 'I')
|
||||||
|
{
|
||||||
|
dp->flags |= FLAG_LOCALIZED;
|
||||||
|
cp++;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
else
|
else
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -393,7 +401,7 @@ PRINTF_PARSE (const CHAR_T *format, DIRECTIVES *d, arguments *a)
|
||||||
cp++;
|
cp++;
|
||||||
}
|
}
|
||||||
#if defined __APPLE__ && defined __MACH__
|
#if defined __APPLE__ && defined __MACH__
|
||||||
/* On MacOS X 10.3, PRIdMAX is defined as "qd".
|
/* On Mac OS X 10.3, PRIdMAX is defined as "qd".
|
||||||
We cannot change it to "lld" because PRIdMAX must also
|
We cannot change it to "lld" because PRIdMAX must also
|
||||||
be understood by the system's printf routines. */
|
be understood by the system's printf routines. */
|
||||||
else if (*cp == 'q')
|
else if (*cp == 'q')
|
||||||
|
@ -412,7 +420,7 @@ PRINTF_PARSE (const CHAR_T *format, DIRECTIVES *d, arguments *a)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
|
#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
|
||||||
/* On native Win32, PRIdMAX is defined as "I64d".
|
/* On native Windows, PRIdMAX is defined as "I64d".
|
||||||
We cannot change it to "lld" because PRIdMAX must also
|
We cannot change it to "lld" because PRIdMAX must also
|
||||||
be understood by the system's printf routines. */
|
be understood by the system's printf routines. */
|
||||||
else if (*cp == 'I' && cp[1] == '6' && cp[2] == '4')
|
else if (*cp == 'I' && cp[1] == '6' && cp[2] == '4')
|
||||||
|
@ -581,10 +589,14 @@ PRINTF_PARSE (const CHAR_T *format, DIRECTIVES *d, arguments *a)
|
||||||
if (size_overflow_p (memory_size))
|
if (size_overflow_p (memory_size))
|
||||||
/* Overflow, would lead to out of memory. */
|
/* Overflow, would lead to out of memory. */
|
||||||
goto out_of_memory;
|
goto out_of_memory;
|
||||||
memory = (DIRECTIVE *) realloc (d->dir, memory_size);
|
memory = (DIRECTIVE *) (d->dir != d->direct_alloc_dir
|
||||||
|
? realloc (d->dir, memory_size)
|
||||||
|
: malloc (memory_size));
|
||||||
if (memory == NULL)
|
if (memory == NULL)
|
||||||
/* Out of memory. */
|
/* Out of memory. */
|
||||||
goto out_of_memory;
|
goto out_of_memory;
|
||||||
|
if (d->dir == d->direct_alloc_dir)
|
||||||
|
memcpy (memory, d->dir, d->count * sizeof (DIRECTIVE));
|
||||||
d->dir = memory;
|
d->dir = memory;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -603,19 +615,18 @@ PRINTF_PARSE (const CHAR_T *format, DIRECTIVES *d, arguments *a)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
error:
|
error:
|
||||||
if (a->arg)
|
if (a->arg != a->direct_alloc_arg)
|
||||||
free (a->arg);
|
free (a->arg);
|
||||||
if (d->dir)
|
if (d->dir != d->direct_alloc_dir)
|
||||||
free (d->dir);
|
free (d->dir);
|
||||||
errno = EINVAL;
|
errno = EINVAL;
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
out_of_memory:
|
out_of_memory:
|
||||||
if (a->arg)
|
if (a->arg != a->direct_alloc_arg)
|
||||||
free (a->arg);
|
free (a->arg);
|
||||||
if (d->dir)
|
if (d->dir != d->direct_alloc_dir)
|
||||||
free (d->dir);
|
free (d->dir);
|
||||||
out_of_memory_1:
|
|
||||||
errno = ENOMEM;
|
errno = ENOMEM;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* Parse printf format string.
|
/* Parse printf format string.
|
||||||
Copyright (C) 1999, 2002-2003, 2005, 2007, 2009-2010 Free Software
|
Copyright (C) 1999, 2002-2003, 2005, 2007, 2010-2013 Free Software
|
||||||
Foundation, Inc.
|
Foundation, Inc.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
@ -13,8 +13,7 @@
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License along
|
||||||
with this program; if not, write to the Free Software Foundation,
|
with this program; if not, see <http://www.gnu.org/licenses/>. */
|
||||||
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
|
||||||
|
|
||||||
#ifndef _PRINTF_PARSE_H
|
#ifndef _PRINTF_PARSE_H
|
||||||
#define _PRINTF_PARSE_H
|
#define _PRINTF_PARSE_H
|
||||||
|
@ -23,6 +22,10 @@
|
||||||
ENABLE_UNISTDIO Set to 1 to enable the unistdio extensions.
|
ENABLE_UNISTDIO Set to 1 to enable the unistdio extensions.
|
||||||
STATIC Set to 'static' to declare the function static. */
|
STATIC Set to 'static' to declare the function static. */
|
||||||
|
|
||||||
|
#if HAVE_FEATURES_H
|
||||||
|
# include <features.h> /* for __GLIBC__, __UCLIBC__ */
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "printf-args.h"
|
#include "printf-args.h"
|
||||||
|
|
||||||
|
|
||||||
|
@ -33,6 +36,9 @@
|
||||||
#define FLAG_SPACE 8 /* space flag */
|
#define FLAG_SPACE 8 /* space flag */
|
||||||
#define FLAG_ALT 16 /* # flag */
|
#define FLAG_ALT 16 /* # flag */
|
||||||
#define FLAG_ZERO 32
|
#define FLAG_ZERO 32
|
||||||
|
#if __GLIBC__ >= 2 && !defined __UCLIBC__
|
||||||
|
# define FLAG_LOCALIZED 64 /* I flag, uses localized digits */
|
||||||
|
#endif
|
||||||
|
|
||||||
/* arg_index value indicating that no argument is consumed. */
|
/* arg_index value indicating that no argument is consumed. */
|
||||||
#define ARG_NONE (~(size_t)0)
|
#define ARG_NONE (~(size_t)0)
|
||||||
|
@ -40,6 +46,9 @@
|
||||||
/* xxx_directive: A parsed directive.
|
/* xxx_directive: A parsed directive.
|
||||||
xxx_directives: A parsed format string. */
|
xxx_directives: A parsed format string. */
|
||||||
|
|
||||||
|
/* Number of directly allocated directives (no malloc() needed). */
|
||||||
|
#define N_DIRECT_ALLOC_DIRECTIVES 7
|
||||||
|
|
||||||
/* A parsed directive. */
|
/* A parsed directive. */
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
|
@ -64,6 +73,7 @@ typedef struct
|
||||||
char_directive *dir;
|
char_directive *dir;
|
||||||
size_t max_width_length;
|
size_t max_width_length;
|
||||||
size_t max_precision_length;
|
size_t max_precision_length;
|
||||||
|
char_directive direct_alloc_dir[N_DIRECT_ALLOC_DIRECTIVES];
|
||||||
}
|
}
|
||||||
char_directives;
|
char_directives;
|
||||||
|
|
||||||
|
@ -93,6 +103,7 @@ typedef struct
|
||||||
u8_directive *dir;
|
u8_directive *dir;
|
||||||
size_t max_width_length;
|
size_t max_width_length;
|
||||||
size_t max_precision_length;
|
size_t max_precision_length;
|
||||||
|
u8_directive direct_alloc_dir[N_DIRECT_ALLOC_DIRECTIVES];
|
||||||
}
|
}
|
||||||
u8_directives;
|
u8_directives;
|
||||||
|
|
||||||
|
@ -120,6 +131,7 @@ typedef struct
|
||||||
u16_directive *dir;
|
u16_directive *dir;
|
||||||
size_t max_width_length;
|
size_t max_width_length;
|
||||||
size_t max_precision_length;
|
size_t max_precision_length;
|
||||||
|
u16_directive direct_alloc_dir[N_DIRECT_ALLOC_DIRECTIVES];
|
||||||
}
|
}
|
||||||
u16_directives;
|
u16_directives;
|
||||||
|
|
||||||
|
@ -147,6 +159,7 @@ typedef struct
|
||||||
u32_directive *dir;
|
u32_directive *dir;
|
||||||
size_t max_width_length;
|
size_t max_width_length;
|
||||||
size_t max_precision_length;
|
size_t max_precision_length;
|
||||||
|
u32_directive direct_alloc_dir[N_DIRECT_ALLOC_DIRECTIVES];
|
||||||
}
|
}
|
||||||
u32_directives;
|
u32_directives;
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* Program name management.
|
/* Program name management.
|
||||||
Copyright (C) 2001-2003, 2005-2010 Free Software Foundation, Inc.
|
Copyright (C) 2001-2003, 2005-2013 Free Software Foundation, Inc.
|
||||||
Written by Bruno Haible <bruno@clisp.org>, 2001.
|
Written by Bruno Haible <bruno@clisp.org>, 2001.
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* Program name management.
|
/* Program name management.
|
||||||
Copyright (C) 2001-2004, 2006, 2009-2010 Free Software Foundation, Inc.
|
Copyright (C) 2001-2004, 2006, 2009-2013 Free Software Foundation, Inc.
|
||||||
Written by Bruno Haible <bruno@clisp.org>, 2001.
|
Written by Bruno Haible <bruno@clisp.org>, 2001.
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* Searching in a string.
|
/* Searching in a string.
|
||||||
Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
|
Copyright (C) 2008-2013 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* realloc() function that is glibc compatible.
|
/* realloc() function that is glibc compatible.
|
||||||
|
|
||||||
Copyright (C) 1997, 2003-2004, 2006-2007, 2009-2010 Free Software
|
Copyright (C) 1997, 2003-2004, 2006-2007, 2009-2013 Free Software
|
||||||
Foundation, Inc.
|
Foundation, Inc.
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
@ -18,6 +18,7 @@
|
||||||
|
|
||||||
/* written by Jim Meyering and Bruno Haible */
|
/* written by Jim Meyering and Bruno Haible */
|
||||||
|
|
||||||
|
#define _GL_USE_STDLIB_ALLOC 1
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
||||||
/* Only the AC_FUNC_REALLOC macro defines 'realloc' already in config.h. */
|
/* Only the AC_FUNC_REALLOC macro defines 'realloc' already in config.h. */
|
||||||
|
@ -34,23 +35,10 @@
|
||||||
# define SYSTEM_MALLOC_GLIBC_COMPATIBLE 1
|
# define SYSTEM_MALLOC_GLIBC_COMPATIBLE 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Below we want to call the system's malloc and realloc.
|
|
||||||
Undefine the symbols here so that including <stdlib.h> provides a
|
|
||||||
declaration of malloc(), not of rpl_malloc(), and likewise for realloc. */
|
|
||||||
#undef malloc
|
|
||||||
#undef realloc
|
|
||||||
|
|
||||||
/* Specification. */
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
/* Below we want to call the system's malloc and realloc.
|
|
||||||
Undefine the symbols, if they were defined by gnulib's <stdlib.h>
|
|
||||||
replacement. */
|
|
||||||
#undef malloc
|
|
||||||
#undef realloc
|
|
||||||
|
|
||||||
/* Change the size of an allocated block of memory P to N bytes,
|
/* Change the size of an allocated block of memory P to N bytes,
|
||||||
with error checking. If N is zero, change it to 1. If P is NULL,
|
with error checking. If N is zero, change it to 1. If P is NULL,
|
||||||
use malloc. */
|
use malloc. */
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
# Add this package to a list of references stored in a text file.
|
# Add this package to a list of references stored in a text file.
|
||||||
#
|
#
|
||||||
# Copyright (C) 2000, 2009, 2010 Free Software Foundation, Inc.
|
# Copyright (C) 2000, 2009-2013 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
@ -13,8 +13,7 @@
|
||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License along
|
# You should have received a copy of the GNU General Public License along
|
||||||
# with this program; if not, write to the Free Software Foundation,
|
# with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
||||||
#
|
#
|
||||||
# Written by Bruno Haible <haible@clisp.cons.org>.
|
# Written by Bruno Haible <haible@clisp.cons.org>.
|
||||||
#
|
#
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
# Remove this package from a list of references stored in a text file.
|
# Remove this package from a list of references stored in a text file.
|
||||||
#
|
#
|
||||||
# Copyright (C) 2000, 2009, 2010 Free Software Foundation, Inc.
|
# Copyright (C) 2000, 2009-2013 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
@ -13,8 +13,7 @@
|
||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License along
|
# You should have received a copy of the GNU General Public License along
|
||||||
# with this program; if not, write to the Free Software Foundation,
|
# with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
||||||
#
|
#
|
||||||
# Written by Bruno Haible <haible@clisp.cons.org>.
|
# Written by Bruno Haible <haible@clisp.cons.org>.
|
||||||
#
|
#
|
||||||
|
|
|
@ -1,22 +1,21 @@
|
||||||
/* Extended regular expression matching and search library.
|
/* Extended regular expression matching and search library.
|
||||||
Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free
|
Copyright (C) 2002-2013 Free Software Foundation, Inc.
|
||||||
Software Foundation, Inc.
|
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>.
|
Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
it under the terms of the GNU General Public License as published by
|
modify it under the terms of the GNU General Public
|
||||||
the Free Software Foundation; either version 3, or (at your option)
|
License as published by the Free Software Foundation; either
|
||||||
any later version.
|
version 3 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
GNU General Public License for more details.
|
General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public
|
||||||
with this program; if not, write to the Free Software Foundation,
|
License along with the GNU C Library; if not, see
|
||||||
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
static reg_errcode_t re_compile_internal (regex_t *preg, const char * pattern,
|
static reg_errcode_t re_compile_internal (regex_t *preg, const char * pattern,
|
||||||
size_t length, reg_syntax_t syntax);
|
size_t length, reg_syntax_t syntax);
|
||||||
|
@ -95,20 +94,20 @@ static reg_errcode_t build_charclass (RE_TRANSLATE_TYPE trans,
|
||||||
bitset_t sbcset,
|
bitset_t sbcset,
|
||||||
re_charset_t *mbcset,
|
re_charset_t *mbcset,
|
||||||
Idx *char_class_alloc,
|
Idx *char_class_alloc,
|
||||||
const unsigned char *class_name,
|
const char *class_name,
|
||||||
reg_syntax_t syntax);
|
reg_syntax_t syntax);
|
||||||
#else /* not RE_ENABLE_I18N */
|
#else /* not RE_ENABLE_I18N */
|
||||||
static reg_errcode_t build_equiv_class (bitset_t sbcset,
|
static reg_errcode_t build_equiv_class (bitset_t sbcset,
|
||||||
const unsigned char *name);
|
const unsigned char *name);
|
||||||
static reg_errcode_t build_charclass (RE_TRANSLATE_TYPE trans,
|
static reg_errcode_t build_charclass (RE_TRANSLATE_TYPE trans,
|
||||||
bitset_t sbcset,
|
bitset_t sbcset,
|
||||||
const unsigned char *class_name,
|
const char *class_name,
|
||||||
reg_syntax_t syntax);
|
reg_syntax_t syntax);
|
||||||
#endif /* not RE_ENABLE_I18N */
|
#endif /* not RE_ENABLE_I18N */
|
||||||
static bin_tree_t *build_charclass_op (re_dfa_t *dfa,
|
static bin_tree_t *build_charclass_op (re_dfa_t *dfa,
|
||||||
RE_TRANSLATE_TYPE trans,
|
RE_TRANSLATE_TYPE trans,
|
||||||
const unsigned char *class_name,
|
const char *class_name,
|
||||||
const unsigned char *extra,
|
const char *extra,
|
||||||
bool non_match, reg_errcode_t *err);
|
bool non_match, reg_errcode_t *err);
|
||||||
static bin_tree_t *create_tree (re_dfa_t *dfa,
|
static bin_tree_t *create_tree (re_dfa_t *dfa,
|
||||||
bin_tree_t *left, bin_tree_t *right,
|
bin_tree_t *left, bin_tree_t *right,
|
||||||
|
@ -207,7 +206,7 @@ static const size_t __re_error_msgid_idx[] =
|
||||||
compiles PATTERN (of length LENGTH) and puts the result in BUFP.
|
compiles PATTERN (of length LENGTH) and puts the result in BUFP.
|
||||||
Returns 0 if the pattern was valid, otherwise an error string.
|
Returns 0 if the pattern was valid, otherwise an error string.
|
||||||
|
|
||||||
Assumes the `allocated' (and perhaps `buffer') and `translate' fields
|
Assumes the 'allocated' (and perhaps 'buffer') and 'translate' fields
|
||||||
are set in BUFP on entry. */
|
are set in BUFP on entry. */
|
||||||
|
|
||||||
#ifdef _LIBC
|
#ifdef _LIBC
|
||||||
|
@ -242,7 +241,7 @@ re_compile_pattern (const char *pattern, size_t length,
|
||||||
weak_alias (__re_compile_pattern, re_compile_pattern)
|
weak_alias (__re_compile_pattern, re_compile_pattern)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Set by `re_set_syntax' to the current regexp syntax to recognize. Can
|
/* Set by 're_set_syntax' to the current regexp syntax to recognize. Can
|
||||||
also be assigned to arbitrarily: each pattern buffer stores its own
|
also be assigned to arbitrarily: each pattern buffer stores its own
|
||||||
syntax, so it can be changed between regex compilations. */
|
syntax, so it can be changed between regex compilations. */
|
||||||
/* This has no initializer because initialized variables in Emacs
|
/* This has no initializer because initialized variables in Emacs
|
||||||
|
@ -274,7 +273,7 @@ int
|
||||||
re_compile_fastmap (bufp)
|
re_compile_fastmap (bufp)
|
||||||
struct re_pattern_buffer *bufp;
|
struct re_pattern_buffer *bufp;
|
||||||
{
|
{
|
||||||
re_dfa_t *dfa = (re_dfa_t *) bufp->buffer;
|
re_dfa_t *dfa = bufp->buffer;
|
||||||
char *fastmap = bufp->fastmap;
|
char *fastmap = bufp->fastmap;
|
||||||
|
|
||||||
memset (fastmap, '\0', sizeof (char) * SBC_MAX);
|
memset (fastmap, '\0', sizeof (char) * SBC_MAX);
|
||||||
|
@ -293,7 +292,7 @@ weak_alias (__re_compile_fastmap, re_compile_fastmap)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
__attribute ((always_inline))
|
__attribute__ ((always_inline))
|
||||||
re_set_fastmap (char *fastmap, bool icase, int ch)
|
re_set_fastmap (char *fastmap, bool icase, int ch)
|
||||||
{
|
{
|
||||||
fastmap[ch] = 1;
|
fastmap[ch] = 1;
|
||||||
|
@ -308,7 +307,7 @@ static void
|
||||||
re_compile_fastmap_iter (regex_t *bufp, const re_dfastate_t *init_state,
|
re_compile_fastmap_iter (regex_t *bufp, const re_dfastate_t *init_state,
|
||||||
char *fastmap)
|
char *fastmap)
|
||||||
{
|
{
|
||||||
re_dfa_t *dfa = (re_dfa_t *) bufp->buffer;
|
re_dfa_t *dfa = bufp->buffer;
|
||||||
Idx node_cnt;
|
Idx node_cnt;
|
||||||
bool icase = (dfa->mb_cur_max == 1 && (bufp->syntax & RE_ICASE));
|
bool icase = (dfa->mb_cur_max == 1 && (bufp->syntax & RE_ICASE));
|
||||||
for (node_cnt = 0; node_cnt < init_state->nodes.nelem; ++node_cnt)
|
for (node_cnt = 0; node_cnt < init_state->nodes.nelem; ++node_cnt)
|
||||||
|
@ -440,15 +439,15 @@ re_compile_fastmap_iter (regex_t *bufp, const re_dfastate_t *init_state,
|
||||||
PREG is a regex_t *. We do not expect any fields to be initialized,
|
PREG is a regex_t *. We do not expect any fields to be initialized,
|
||||||
since POSIX says we shouldn't. Thus, we set
|
since POSIX says we shouldn't. Thus, we set
|
||||||
|
|
||||||
`buffer' to the compiled pattern;
|
'buffer' to the compiled pattern;
|
||||||
`used' to the length of the compiled pattern;
|
'used' to the length of the compiled pattern;
|
||||||
`syntax' to RE_SYNTAX_POSIX_EXTENDED if the
|
'syntax' to RE_SYNTAX_POSIX_EXTENDED if the
|
||||||
REG_EXTENDED bit in CFLAGS is set; otherwise, to
|
REG_EXTENDED bit in CFLAGS is set; otherwise, to
|
||||||
RE_SYNTAX_POSIX_BASIC;
|
RE_SYNTAX_POSIX_BASIC;
|
||||||
`newline_anchor' to REG_NEWLINE being set in CFLAGS;
|
'newline_anchor' to REG_NEWLINE being set in CFLAGS;
|
||||||
`fastmap' to an allocated space for the fastmap;
|
'fastmap' to an allocated space for the fastmap;
|
||||||
`fastmap_accurate' to zero;
|
'fastmap_accurate' to zero;
|
||||||
`re_nsub' to the number of subexpressions in PATTERN.
|
're_nsub' to the number of subexpressions in PATTERN.
|
||||||
|
|
||||||
PATTERN is the address of the pattern string.
|
PATTERN is the address of the pattern string.
|
||||||
|
|
||||||
|
@ -551,10 +550,6 @@ regerror (int errcode, const regex_t *_Restrict_ preg,
|
||||||
if (BE (errcode < 0
|
if (BE (errcode < 0
|
||||||
|| errcode >= (int) (sizeof (__re_error_msgid_idx)
|
|| errcode >= (int) (sizeof (__re_error_msgid_idx)
|
||||||
/ sizeof (__re_error_msgid_idx[0])), 0))
|
/ sizeof (__re_error_msgid_idx[0])), 0))
|
||||||
/* Only error codes returned by the rest of the code should be passed
|
|
||||||
to this routine. If we are given anything else, or if other regex
|
|
||||||
code generates an invalid error code, then the program has a bug.
|
|
||||||
Dump core so we can fix it. */
|
|
||||||
msg = gettext ("unknown regexp error");
|
msg = gettext ("unknown regexp error");
|
||||||
else
|
else
|
||||||
msg = gettext (__re_error_msgid + __re_error_msgid_idx[errcode]);
|
msg = gettext (__re_error_msgid + __re_error_msgid_idx[errcode]);
|
||||||
|
@ -587,19 +582,23 @@ weak_alias (__regerror, regerror)
|
||||||
static const bitset_t utf8_sb_map =
|
static const bitset_t utf8_sb_map =
|
||||||
{
|
{
|
||||||
/* Set the first 128 bits. */
|
/* Set the first 128 bits. */
|
||||||
# if 4 * BITSET_WORD_BITS < ASCII_CHARS
|
# ifdef __GNUC__
|
||||||
# error "bitset_word_t is narrower than 32 bits"
|
[0 ... 0x80 / BITSET_WORD_BITS - 1] = BITSET_WORD_MAX
|
||||||
# elif 3 * BITSET_WORD_BITS < ASCII_CHARS
|
# else
|
||||||
|
# if 4 * BITSET_WORD_BITS < ASCII_CHARS
|
||||||
|
# error "bitset_word_t is narrower than 32 bits"
|
||||||
|
# elif 3 * BITSET_WORD_BITS < ASCII_CHARS
|
||||||
BITSET_WORD_MAX, BITSET_WORD_MAX, BITSET_WORD_MAX,
|
BITSET_WORD_MAX, BITSET_WORD_MAX, BITSET_WORD_MAX,
|
||||||
# elif 2 * BITSET_WORD_BITS < ASCII_CHARS
|
# elif 2 * BITSET_WORD_BITS < ASCII_CHARS
|
||||||
BITSET_WORD_MAX, BITSET_WORD_MAX,
|
BITSET_WORD_MAX, BITSET_WORD_MAX,
|
||||||
# elif 1 * BITSET_WORD_BITS < ASCII_CHARS
|
# elif 1 * BITSET_WORD_BITS < ASCII_CHARS
|
||||||
BITSET_WORD_MAX,
|
BITSET_WORD_MAX,
|
||||||
# endif
|
# endif
|
||||||
(BITSET_WORD_MAX
|
(BITSET_WORD_MAX
|
||||||
>> (SBC_MAX % BITSET_WORD_BITS == 0
|
>> (SBC_MAX % BITSET_WORD_BITS == 0
|
||||||
? 0
|
? 0
|
||||||
: BITSET_WORD_BITS - SBC_MAX % BITSET_WORD_BITS))
|
: BITSET_WORD_BITS - SBC_MAX % BITSET_WORD_BITS))
|
||||||
|
# endif
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -658,7 +657,7 @@ void
|
||||||
regfree (preg)
|
regfree (preg)
|
||||||
regex_t *preg;
|
regex_t *preg;
|
||||||
{
|
{
|
||||||
re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
|
re_dfa_t *dfa = preg->buffer;
|
||||||
if (BE (dfa != NULL, 1))
|
if (BE (dfa != NULL, 1))
|
||||||
free_dfa_content (dfa);
|
free_dfa_content (dfa);
|
||||||
preg->buffer = NULL;
|
preg->buffer = NULL;
|
||||||
|
@ -719,7 +718,7 @@ re_comp (s)
|
||||||
+ __re_error_msgid_idx[(int) REG_ESPACE]);
|
+ __re_error_msgid_idx[(int) REG_ESPACE]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Since `re_exec' always passes NULL for the `regs' argument, we
|
/* Since 're_exec' always passes NULL for the 'regs' argument, we
|
||||||
don't need to initialize the pattern buffer fields which affect it. */
|
don't need to initialize the pattern buffer fields which affect it. */
|
||||||
|
|
||||||
/* Match anchors at newlines. */
|
/* Match anchors at newlines. */
|
||||||
|
@ -730,7 +729,7 @@ re_comp (s)
|
||||||
if (!ret)
|
if (!ret)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
/* Yes, we're discarding `const' here if !HAVE_LIBINTL. */
|
/* Yes, we're discarding 'const' here if !HAVE_LIBINTL. */
|
||||||
return (char *) gettext (__re_error_msgid + __re_error_msgid_idx[(int) ret]);
|
return (char *) gettext (__re_error_msgid + __re_error_msgid_idx[(int) ret]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -765,7 +764,7 @@ re_compile_internal (regex_t *preg, const char * pattern, size_t length,
|
||||||
preg->regs_allocated = REGS_UNALLOCATED;
|
preg->regs_allocated = REGS_UNALLOCATED;
|
||||||
|
|
||||||
/* Initialize the dfa. */
|
/* Initialize the dfa. */
|
||||||
dfa = (re_dfa_t *) preg->buffer;
|
dfa = preg->buffer;
|
||||||
if (BE (preg->allocated < sizeof (re_dfa_t), 0))
|
if (BE (preg->allocated < sizeof (re_dfa_t), 0))
|
||||||
{
|
{
|
||||||
/* If zero allocated, but buffer is non-null, try to realloc
|
/* If zero allocated, but buffer is non-null, try to realloc
|
||||||
|
@ -874,7 +873,7 @@ init_dfa (re_dfa_t *dfa, size_t pat_len)
|
||||||
calculation below, and for similar doubling calculations
|
calculation below, and for similar doubling calculations
|
||||||
elsewhere. And it's <= rather than <, because some of the
|
elsewhere. And it's <= rather than <, because some of the
|
||||||
doubling calculations add 1 afterwards. */
|
doubling calculations add 1 afterwards. */
|
||||||
if (BE (SIZE_MAX / max_object_size / 2 <= pat_len, 0))
|
if (BE (MIN (IDX_MAX, SIZE_MAX / max_object_size) / 2 <= pat_len, 0))
|
||||||
return REG_ESPACE;
|
return REG_ESPACE;
|
||||||
|
|
||||||
dfa->nodes_alloc = pat_len + 1;
|
dfa->nodes_alloc = pat_len + 1;
|
||||||
|
@ -897,8 +896,10 @@ init_dfa (re_dfa_t *dfa, size_t pat_len)
|
||||||
!= 0);
|
!= 0);
|
||||||
#else
|
#else
|
||||||
codeset_name = nl_langinfo (CODESET);
|
codeset_name = nl_langinfo (CODESET);
|
||||||
if (strcasecmp (codeset_name, "UTF-8") == 0
|
if ((codeset_name[0] == 'U' || codeset_name[0] == 'u')
|
||||||
|| strcasecmp (codeset_name, "UTF8") == 0)
|
&& (codeset_name[1] == 'T' || codeset_name[1] == 't')
|
||||||
|
&& (codeset_name[2] == 'F' || codeset_name[2] == 'f')
|
||||||
|
&& strcmp (codeset_name + 3 + (codeset_name[3] == '-'), "8") == 0)
|
||||||
dfa->is_utf8 = 1;
|
dfa->is_utf8 = 1;
|
||||||
|
|
||||||
/* We check exhaustively in the loop below if this charset is a
|
/* We check exhaustively in the loop below if this charset is a
|
||||||
|
@ -948,9 +949,43 @@ static void
|
||||||
internal_function
|
internal_function
|
||||||
init_word_char (re_dfa_t *dfa)
|
init_word_char (re_dfa_t *dfa)
|
||||||
{
|
{
|
||||||
int i, j, ch;
|
int i = 0;
|
||||||
|
int j;
|
||||||
|
int ch = 0;
|
||||||
dfa->word_ops_used = 1;
|
dfa->word_ops_used = 1;
|
||||||
for (i = 0, ch = 0; i < BITSET_WORDS; ++i)
|
if (BE (dfa->map_notascii == 0, 1))
|
||||||
|
{
|
||||||
|
bitset_word_t bits0 = 0x00000000;
|
||||||
|
bitset_word_t bits1 = 0x03ff0000;
|
||||||
|
bitset_word_t bits2 = 0x87fffffe;
|
||||||
|
bitset_word_t bits3 = 0x07fffffe;
|
||||||
|
if (BITSET_WORD_BITS == 64)
|
||||||
|
{
|
||||||
|
dfa->word_char[0] = bits1 << 31 << 1 | bits0;
|
||||||
|
dfa->word_char[1] = bits3 << 31 << 1 | bits2;
|
||||||
|
i = 2;
|
||||||
|
}
|
||||||
|
else if (BITSET_WORD_BITS == 32)
|
||||||
|
{
|
||||||
|
dfa->word_char[0] = bits0;
|
||||||
|
dfa->word_char[1] = bits1;
|
||||||
|
dfa->word_char[2] = bits2;
|
||||||
|
dfa->word_char[3] = bits3;
|
||||||
|
i = 4;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
goto general_case;
|
||||||
|
ch = 128;
|
||||||
|
|
||||||
|
if (BE (dfa->is_utf8, 1))
|
||||||
|
{
|
||||||
|
memset (&dfa->word_char[i], '\0', (SBC_MAX - ch) / 8);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
general_case:
|
||||||
|
for (; i < BITSET_WORDS; ++i)
|
||||||
for (j = 0; j < BITSET_WORD_BITS; ++j, ++ch)
|
for (j = 0; j < BITSET_WORD_BITS; ++j, ++ch)
|
||||||
if (isalnum (ch) || ch == '_')
|
if (isalnum (ch) || ch == '_')
|
||||||
dfa->word_char[i] |= (bitset_word_t) 1 << j;
|
dfa->word_char[i] |= (bitset_word_t) 1 << j;
|
||||||
|
@ -961,7 +996,7 @@ init_word_char (re_dfa_t *dfa)
|
||||||
static void
|
static void
|
||||||
free_workarea_compile (regex_t *preg)
|
free_workarea_compile (regex_t *preg)
|
||||||
{
|
{
|
||||||
re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
|
re_dfa_t *dfa = preg->buffer;
|
||||||
bin_tree_storage_t *storage, *next;
|
bin_tree_storage_t *storage, *next;
|
||||||
for (storage = dfa->str_tree_storage; storage; storage = next)
|
for (storage = dfa->str_tree_storage; storage; storage = next)
|
||||||
{
|
{
|
||||||
|
@ -1145,7 +1180,7 @@ optimize_utf8 (re_dfa_t *dfa)
|
||||||
static reg_errcode_t
|
static reg_errcode_t
|
||||||
analyze (regex_t *preg)
|
analyze (regex_t *preg)
|
||||||
{
|
{
|
||||||
re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
|
re_dfa_t *dfa = preg->buffer;
|
||||||
reg_errcode_t ret;
|
reg_errcode_t ret;
|
||||||
|
|
||||||
/* Allocate arrays. */
|
/* Allocate arrays. */
|
||||||
|
@ -1326,7 +1361,7 @@ lower_subexps (void *extra, bin_tree_t *node)
|
||||||
static bin_tree_t *
|
static bin_tree_t *
|
||||||
lower_subexp (reg_errcode_t *err, regex_t *preg, bin_tree_t *node)
|
lower_subexp (reg_errcode_t *err, regex_t *preg, bin_tree_t *node)
|
||||||
{
|
{
|
||||||
re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
|
re_dfa_t *dfa = preg->buffer;
|
||||||
bin_tree_t *body = node->left;
|
bin_tree_t *body = node->left;
|
||||||
bin_tree_t *op, *cls, *tree1, *tree;
|
bin_tree_t *op, *cls, *tree1, *tree;
|
||||||
|
|
||||||
|
@ -1660,7 +1695,7 @@ calc_eclosure (re_dfa_t *dfa)
|
||||||
/* If we have already calculated, skip it. */
|
/* If we have already calculated, skip it. */
|
||||||
if (dfa->eclosures[node_idx].nelem != 0)
|
if (dfa->eclosures[node_idx].nelem != 0)
|
||||||
continue;
|
continue;
|
||||||
/* Calculate epsilon closure of `node_idx'. */
|
/* Calculate epsilon closure of 'node_idx'. */
|
||||||
err = calc_eclosure_iter (&eclosure_elem, dfa, node_idx, true);
|
err = calc_eclosure_iter (&eclosure_elem, dfa, node_idx, true);
|
||||||
if (BE (err != REG_NOERROR, 0))
|
if (BE (err != REG_NOERROR, 0))
|
||||||
return err;
|
return err;
|
||||||
|
@ -1710,14 +1745,14 @@ calc_eclosure_iter (re_node_set *new_set, re_dfa_t *dfa, Idx node, bool root)
|
||||||
{
|
{
|
||||||
re_node_set eclosure_elem;
|
re_node_set eclosure_elem;
|
||||||
Idx edest = dfa->edests[node].elems[i];
|
Idx edest = dfa->edests[node].elems[i];
|
||||||
/* If calculating the epsilon closure of `edest' is in progress,
|
/* If calculating the epsilon closure of 'edest' is in progress,
|
||||||
return intermediate result. */
|
return intermediate result. */
|
||||||
if (dfa->eclosures[edest].nelem == REG_MISSING)
|
if (dfa->eclosures[edest].nelem == REG_MISSING)
|
||||||
{
|
{
|
||||||
incomplete = true;
|
incomplete = true;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
/* If we haven't calculated the epsilon closure of `edest' yet,
|
/* If we haven't calculated the epsilon closure of 'edest' yet,
|
||||||
calculate now. Otherwise use calculated epsilon closure. */
|
calculate now. Otherwise use calculated epsilon closure. */
|
||||||
if (dfa->eclosures[edest].nelem == 0)
|
if (dfa->eclosures[edest].nelem == 0)
|
||||||
{
|
{
|
||||||
|
@ -1727,11 +1762,11 @@ calc_eclosure_iter (re_node_set *new_set, re_dfa_t *dfa, Idx node, bool root)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
eclosure_elem = dfa->eclosures[edest];
|
eclosure_elem = dfa->eclosures[edest];
|
||||||
/* Merge the epsilon closure of `edest'. */
|
/* Merge the epsilon closure of 'edest'. */
|
||||||
err = re_node_set_merge (&eclosure, &eclosure_elem);
|
err = re_node_set_merge (&eclosure, &eclosure_elem);
|
||||||
if (BE (err != REG_NOERROR, 0))
|
if (BE (err != REG_NOERROR, 0))
|
||||||
return err;
|
return err;
|
||||||
/* If the epsilon closure of `edest' is incomplete,
|
/* If the epsilon closure of 'edest' is incomplete,
|
||||||
the epsilon closure of this node is also incomplete. */
|
the epsilon closure of this node is also incomplete. */
|
||||||
if (dfa->eclosures[edest].nelem == 0)
|
if (dfa->eclosures[edest].nelem == 0)
|
||||||
{
|
{
|
||||||
|
@ -2093,7 +2128,7 @@ peek_token_bracket (re_token_t *token, re_string_t *input, reg_syntax_t syntax)
|
||||||
|
|
||||||
/* Entry point of the parser.
|
/* Entry point of the parser.
|
||||||
Parse the regular expression REGEXP and return the structure tree.
|
Parse the regular expression REGEXP and return the structure tree.
|
||||||
If an error is occured, ERR is set by error code, and return NULL.
|
If an error occurs, ERR is set by error code, and return NULL.
|
||||||
This function build the following tree, from regular expression <reg_exp>:
|
This function build the following tree, from regular expression <reg_exp>:
|
||||||
CAT
|
CAT
|
||||||
/ \
|
/ \
|
||||||
|
@ -2107,7 +2142,7 @@ static bin_tree_t *
|
||||||
parse (re_string_t *regexp, regex_t *preg, reg_syntax_t syntax,
|
parse (re_string_t *regexp, regex_t *preg, reg_syntax_t syntax,
|
||||||
reg_errcode_t *err)
|
reg_errcode_t *err)
|
||||||
{
|
{
|
||||||
re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
|
re_dfa_t *dfa = preg->buffer;
|
||||||
bin_tree_t *tree, *eor, *root;
|
bin_tree_t *tree, *eor, *root;
|
||||||
re_token_t current_token;
|
re_token_t current_token;
|
||||||
dfa->syntax = syntax;
|
dfa->syntax = syntax;
|
||||||
|
@ -2135,13 +2170,13 @@ parse (re_string_t *regexp, regex_t *preg, reg_syntax_t syntax,
|
||||||
/ \
|
/ \
|
||||||
<branch1> <branch2>
|
<branch1> <branch2>
|
||||||
|
|
||||||
ALT means alternative, which represents the operator `|'. */
|
ALT means alternative, which represents the operator '|'. */
|
||||||
|
|
||||||
static bin_tree_t *
|
static bin_tree_t *
|
||||||
parse_reg_exp (re_string_t *regexp, regex_t *preg, re_token_t *token,
|
parse_reg_exp (re_string_t *regexp, regex_t *preg, re_token_t *token,
|
||||||
reg_syntax_t syntax, Idx nest, reg_errcode_t *err)
|
reg_syntax_t syntax, Idx nest, reg_errcode_t *err)
|
||||||
{
|
{
|
||||||
re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
|
re_dfa_t *dfa = preg->buffer;
|
||||||
bin_tree_t *tree, *branch = NULL;
|
bin_tree_t *tree, *branch = NULL;
|
||||||
tree = parse_branch (regexp, preg, token, syntax, nest, err);
|
tree = parse_branch (regexp, preg, token, syntax, nest, err);
|
||||||
if (BE (*err != REG_NOERROR && tree == NULL, 0))
|
if (BE (*err != REG_NOERROR && tree == NULL, 0))
|
||||||
|
@ -2183,7 +2218,7 @@ parse_branch (re_string_t *regexp, regex_t *preg, re_token_t *token,
|
||||||
reg_syntax_t syntax, Idx nest, reg_errcode_t *err)
|
reg_syntax_t syntax, Idx nest, reg_errcode_t *err)
|
||||||
{
|
{
|
||||||
bin_tree_t *tree, *expr;
|
bin_tree_t *tree, *expr;
|
||||||
re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
|
re_dfa_t *dfa = preg->buffer;
|
||||||
tree = parse_expression (regexp, preg, token, syntax, nest, err);
|
tree = parse_expression (regexp, preg, token, syntax, nest, err);
|
||||||
if (BE (*err != REG_NOERROR && tree == NULL, 0))
|
if (BE (*err != REG_NOERROR && tree == NULL, 0))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -2194,16 +2229,21 @@ parse_branch (re_string_t *regexp, regex_t *preg, re_token_t *token,
|
||||||
expr = parse_expression (regexp, preg, token, syntax, nest, err);
|
expr = parse_expression (regexp, preg, token, syntax, nest, err);
|
||||||
if (BE (*err != REG_NOERROR && expr == NULL, 0))
|
if (BE (*err != REG_NOERROR && expr == NULL, 0))
|
||||||
{
|
{
|
||||||
|
if (tree != NULL)
|
||||||
|
postorder (tree, free_tree, NULL);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (tree != NULL && expr != NULL)
|
if (tree != NULL && expr != NULL)
|
||||||
{
|
{
|
||||||
tree = create_tree (dfa, tree, expr, CONCAT);
|
bin_tree_t *newtree = create_tree (dfa, tree, expr, CONCAT);
|
||||||
if (tree == NULL)
|
if (newtree == NULL)
|
||||||
{
|
{
|
||||||
|
postorder (expr, free_tree, NULL);
|
||||||
|
postorder (tree, free_tree, NULL);
|
||||||
*err = REG_ESPACE;
|
*err = REG_ESPACE;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
tree = newtree;
|
||||||
}
|
}
|
||||||
else if (tree == NULL)
|
else if (tree == NULL)
|
||||||
tree = expr;
|
tree = expr;
|
||||||
|
@ -2222,7 +2262,7 @@ static bin_tree_t *
|
||||||
parse_expression (re_string_t *regexp, regex_t *preg, re_token_t *token,
|
parse_expression (re_string_t *regexp, regex_t *preg, re_token_t *token,
|
||||||
reg_syntax_t syntax, Idx nest, reg_errcode_t *err)
|
reg_syntax_t syntax, Idx nest, reg_errcode_t *err)
|
||||||
{
|
{
|
||||||
re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
|
re_dfa_t *dfa = preg->buffer;
|
||||||
bin_tree_t *tree;
|
bin_tree_t *tree;
|
||||||
switch (token->type)
|
switch (token->type)
|
||||||
{
|
{
|
||||||
|
@ -2378,8 +2418,8 @@ parse_expression (re_string_t *regexp, regex_t *preg, re_token_t *token,
|
||||||
case OP_WORD:
|
case OP_WORD:
|
||||||
case OP_NOTWORD:
|
case OP_NOTWORD:
|
||||||
tree = build_charclass_op (dfa, regexp->trans,
|
tree = build_charclass_op (dfa, regexp->trans,
|
||||||
(const unsigned char *) "alnum",
|
"alnum",
|
||||||
(const unsigned char *) "_",
|
"_",
|
||||||
token->type == OP_NOTWORD, err);
|
token->type == OP_NOTWORD, err);
|
||||||
if (BE (*err != REG_NOERROR && tree == NULL, 0))
|
if (BE (*err != REG_NOERROR && tree == NULL, 0))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -2387,8 +2427,8 @@ parse_expression (re_string_t *regexp, regex_t *preg, re_token_t *token,
|
||||||
case OP_SPACE:
|
case OP_SPACE:
|
||||||
case OP_NOTSPACE:
|
case OP_NOTSPACE:
|
||||||
tree = build_charclass_op (dfa, regexp->trans,
|
tree = build_charclass_op (dfa, regexp->trans,
|
||||||
(const unsigned char *) "space",
|
"space",
|
||||||
(const unsigned char *) "",
|
"",
|
||||||
token->type == OP_NOTSPACE, err);
|
token->type == OP_NOTSPACE, err);
|
||||||
if (BE (*err != REG_NOERROR && tree == NULL, 0))
|
if (BE (*err != REG_NOERROR && tree == NULL, 0))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -2438,7 +2478,7 @@ static bin_tree_t *
|
||||||
parse_sub_exp (re_string_t *regexp, regex_t *preg, re_token_t *token,
|
parse_sub_exp (re_string_t *regexp, regex_t *preg, re_token_t *token,
|
||||||
reg_syntax_t syntax, Idx nest, reg_errcode_t *err)
|
reg_syntax_t syntax, Idx nest, reg_errcode_t *err)
|
||||||
{
|
{
|
||||||
re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
|
re_dfa_t *dfa = preg->buffer;
|
||||||
bin_tree_t *tree;
|
bin_tree_t *tree;
|
||||||
size_t cur_nsub;
|
size_t cur_nsub;
|
||||||
cur_nsub = preg->re_nsub++;
|
cur_nsub = preg->re_nsub++;
|
||||||
|
@ -2452,7 +2492,11 @@ parse_sub_exp (re_string_t *regexp, regex_t *preg, re_token_t *token,
|
||||||
{
|
{
|
||||||
tree = parse_reg_exp (regexp, preg, token, syntax, nest, err);
|
tree = parse_reg_exp (regexp, preg, token, syntax, nest, err);
|
||||||
if (BE (*err == REG_NOERROR && token->type != OP_CLOSE_SUBEXP, 0))
|
if (BE (*err == REG_NOERROR && token->type != OP_CLOSE_SUBEXP, 0))
|
||||||
*err = REG_EPAREN;
|
{
|
||||||
|
if (tree != NULL)
|
||||||
|
postorder (tree, free_tree, NULL);
|
||||||
|
*err = REG_EPAREN;
|
||||||
|
}
|
||||||
if (BE (*err != REG_NOERROR, 0))
|
if (BE (*err != REG_NOERROR, 0))
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -2530,6 +2574,12 @@ parse_dup_op (bin_tree_t *elem, re_string_t *regexp, re_dfa_t *dfa,
|
||||||
*err = REG_BADBR;
|
*err = REG_BADBR;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (BE (RE_DUP_MAX < (end == REG_MISSING ? start : end), 0))
|
||||||
|
{
|
||||||
|
*err = REG_ESIZE;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -2570,7 +2620,10 @@ parse_dup_op (bin_tree_t *elem, re_string_t *regexp, re_dfa_t *dfa,
|
||||||
old_tree = NULL;
|
old_tree = NULL;
|
||||||
|
|
||||||
if (elem->token.type == SUBEXP)
|
if (elem->token.type == SUBEXP)
|
||||||
postorder (elem, mark_opt_subexp, (void *) (long) elem->token.opr.idx);
|
{
|
||||||
|
uintptr_t subidx = elem->token.opr.idx;
|
||||||
|
postorder (elem, mark_opt_subexp, (void *) subidx);
|
||||||
|
}
|
||||||
|
|
||||||
tree = create_tree (dfa, elem, NULL,
|
tree = create_tree (dfa, elem, NULL,
|
||||||
(end == REG_MISSING ? OP_DUP_ASTERISK : OP_ALT));
|
(end == REG_MISSING ? OP_DUP_ASTERISK : OP_ALT));
|
||||||
|
@ -2616,7 +2669,7 @@ parse_dup_op (bin_tree_t *elem, re_string_t *regexp, re_dfa_t *dfa,
|
||||||
Build the range expression which starts from START_ELEM, and ends
|
Build the range expression which starts from START_ELEM, and ends
|
||||||
at END_ELEM. The result are written to MBCSET and SBCSET.
|
at END_ELEM. The result are written to MBCSET and SBCSET.
|
||||||
RANGE_ALLOC is the allocated size of mbcset->range_starts, and
|
RANGE_ALLOC is the allocated size of mbcset->range_starts, and
|
||||||
mbcset->range_ends, is a pointer argument sinse we may
|
mbcset->range_ends, is a pointer argument since we may
|
||||||
update it. */
|
update it. */
|
||||||
|
|
||||||
static reg_errcode_t
|
static reg_errcode_t
|
||||||
|
@ -2655,7 +2708,6 @@ build_range_exp (const reg_syntax_t syntax,
|
||||||
wchar_t wc;
|
wchar_t wc;
|
||||||
wint_t start_wc;
|
wint_t start_wc;
|
||||||
wint_t end_wc;
|
wint_t end_wc;
|
||||||
wchar_t cmp_buf[6] = {L'\0', L'\0', L'\0', L'\0', L'\0', L'\0'};
|
|
||||||
|
|
||||||
start_ch = ((start_elem->type == SB_CHAR) ? start_elem->opr.ch
|
start_ch = ((start_elem->type == SB_CHAR) ? start_elem->opr.ch
|
||||||
: ((start_elem->type == COLL_SYM) ? start_elem->opr.name[0]
|
: ((start_elem->type == COLL_SYM) ? start_elem->opr.name[0]
|
||||||
|
@ -2669,11 +2721,7 @@ build_range_exp (const reg_syntax_t syntax,
|
||||||
? __btowc (end_ch) : end_elem->opr.wch);
|
? __btowc (end_ch) : end_elem->opr.wch);
|
||||||
if (start_wc == WEOF || end_wc == WEOF)
|
if (start_wc == WEOF || end_wc == WEOF)
|
||||||
return REG_ECOLLATE;
|
return REG_ECOLLATE;
|
||||||
cmp_buf[0] = start_wc;
|
else if (BE ((syntax & RE_NO_EMPTY_RANGES) && start_wc > end_wc, 0))
|
||||||
cmp_buf[4] = end_wc;
|
|
||||||
|
|
||||||
if (BE ((syntax & RE_NO_EMPTY_RANGES)
|
|
||||||
&& wcscoll (cmp_buf, cmp_buf + 4) > 0, 0))
|
|
||||||
return REG_ERANGE;
|
return REG_ERANGE;
|
||||||
|
|
||||||
/* Got valid collation sequence values, add them as a new entry.
|
/* Got valid collation sequence values, add them as a new entry.
|
||||||
|
@ -2714,9 +2762,7 @@ build_range_exp (const reg_syntax_t syntax,
|
||||||
/* Build the table for single byte characters. */
|
/* Build the table for single byte characters. */
|
||||||
for (wc = 0; wc < SBC_MAX; ++wc)
|
for (wc = 0; wc < SBC_MAX; ++wc)
|
||||||
{
|
{
|
||||||
cmp_buf[2] = wc;
|
if (start_wc <= wc && wc <= end_wc)
|
||||||
if (wcscoll (cmp_buf, cmp_buf + 2) <= 0
|
|
||||||
&& wcscoll (cmp_buf + 2, cmp_buf + 4) <= 0)
|
|
||||||
bitset_set (sbcset, wc);
|
bitset_set (sbcset, wc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2750,11 +2796,12 @@ build_range_exp (const reg_syntax_t syntax,
|
||||||
|
|
||||||
static reg_errcode_t
|
static reg_errcode_t
|
||||||
internal_function
|
internal_function
|
||||||
build_collating_symbol (bitset_t sbcset,
|
|
||||||
# ifdef RE_ENABLE_I18N
|
# ifdef RE_ENABLE_I18N
|
||||||
re_charset_t *mbcset, Idx *coll_sym_alloc,
|
build_collating_symbol (bitset_t sbcset, re_charset_t *mbcset,
|
||||||
# endif
|
Idx *coll_sym_alloc, const unsigned char *name)
|
||||||
const unsigned char *name)
|
# else /* not RE_ENABLE_I18N */
|
||||||
|
build_collating_symbol (bitset_t sbcset, const unsigned char *name)
|
||||||
|
# endif /* not RE_ENABLE_I18N */
|
||||||
{
|
{
|
||||||
size_t name_len = strlen ((const char *) name);
|
size_t name_len = strlen ((const char *) name);
|
||||||
if (BE (name_len != 1, 0))
|
if (BE (name_len != 1, 0))
|
||||||
|
@ -2782,42 +2829,31 @@ parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, re_token_t *token,
|
||||||
const int32_t *symb_table;
|
const int32_t *symb_table;
|
||||||
const unsigned char *extra;
|
const unsigned char *extra;
|
||||||
|
|
||||||
/* Local function for parse_bracket_exp used in _LIBC environement.
|
/* Local function for parse_bracket_exp used in _LIBC environment.
|
||||||
Seek the collating symbol entry correspondings to NAME.
|
Seek the collating symbol entry corresponding to NAME.
|
||||||
Return the index of the symbol in the SYMB_TABLE. */
|
Return the index of the symbol in the SYMB_TABLE,
|
||||||
|
or -1 if not found. */
|
||||||
|
|
||||||
auto inline int32_t
|
auto inline int32_t
|
||||||
__attribute ((always_inline))
|
__attribute__ ((always_inline))
|
||||||
seek_collating_symbol_entry (name, name_len)
|
seek_collating_symbol_entry (const unsigned char *name, size_t name_len)
|
||||||
const unsigned char *name;
|
|
||||||
size_t name_len;
|
|
||||||
{
|
{
|
||||||
int32_t hash = elem_hash ((const char *) name, name_len);
|
int32_t elem;
|
||||||
int32_t elem = hash % table_size;
|
|
||||||
if (symb_table[2 * elem] != 0)
|
|
||||||
{
|
|
||||||
int32_t second = hash % (table_size - 2) + 1;
|
|
||||||
|
|
||||||
do
|
for (elem = 0; elem < table_size; elem++)
|
||||||
{
|
if (symb_table[2 * elem] != 0)
|
||||||
/* First compare the hashing value. */
|
{
|
||||||
if (symb_table[2 * elem] == hash
|
int32_t idx = symb_table[2 * elem + 1];
|
||||||
/* Compare the length of the name. */
|
/* Skip the name of collating element name. */
|
||||||
&& name_len == extra[symb_table[2 * elem + 1]]
|
idx += 1 + extra[idx];
|
||||||
/* Compare the name. */
|
if (/* Compare the length of the name. */
|
||||||
&& memcmp (name, &extra[symb_table[2 * elem + 1] + 1],
|
name_len == extra[idx]
|
||||||
name_len) == 0)
|
/* Compare the name. */
|
||||||
{
|
&& memcmp (name, &extra[idx + 1], name_len) == 0)
|
||||||
/* Yep, this is the entry. */
|
/* Yep, this is the entry. */
|
||||||
break;
|
return elem;
|
||||||
}
|
}
|
||||||
|
return -1;
|
||||||
/* Next entry. */
|
|
||||||
elem += second;
|
|
||||||
}
|
|
||||||
while (symb_table[2 * elem] != 0);
|
|
||||||
}
|
|
||||||
return elem;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Local function for parse_bracket_exp used in _LIBC environment.
|
/* Local function for parse_bracket_exp used in _LIBC environment.
|
||||||
|
@ -2825,9 +2861,8 @@ parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, re_token_t *token,
|
||||||
Return the value if succeeded, UINT_MAX otherwise. */
|
Return the value if succeeded, UINT_MAX otherwise. */
|
||||||
|
|
||||||
auto inline unsigned int
|
auto inline unsigned int
|
||||||
__attribute ((always_inline))
|
__attribute__ ((always_inline))
|
||||||
lookup_collation_sequence_value (br_elem)
|
lookup_collation_sequence_value (bracket_elem_t *br_elem)
|
||||||
bracket_elem_t *br_elem;
|
|
||||||
{
|
{
|
||||||
if (br_elem->type == SB_CHAR)
|
if (br_elem->type == SB_CHAR)
|
||||||
{
|
{
|
||||||
|
@ -2855,7 +2890,7 @@ parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, re_token_t *token,
|
||||||
int32_t elem, idx;
|
int32_t elem, idx;
|
||||||
elem = seek_collating_symbol_entry (br_elem->opr.name,
|
elem = seek_collating_symbol_entry (br_elem->opr.name,
|
||||||
sym_name_len);
|
sym_name_len);
|
||||||
if (symb_table[2 * elem] != 0)
|
if (elem != -1)
|
||||||
{
|
{
|
||||||
/* We found the entry. */
|
/* We found the entry. */
|
||||||
idx = symb_table[2 * elem + 1];
|
idx = symb_table[2 * elem + 1];
|
||||||
|
@ -2873,7 +2908,7 @@ parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, re_token_t *token,
|
||||||
/* Return the collation sequence value. */
|
/* Return the collation sequence value. */
|
||||||
return *(unsigned int *) (extra + idx);
|
return *(unsigned int *) (extra + idx);
|
||||||
}
|
}
|
||||||
else if (symb_table[2 * elem] == 0 && sym_name_len == 1)
|
else if (sym_name_len == 1)
|
||||||
{
|
{
|
||||||
/* No valid character. Match it as a single byte
|
/* No valid character. Match it as a single byte
|
||||||
character. */
|
character. */
|
||||||
|
@ -2886,20 +2921,17 @@ parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, re_token_t *token,
|
||||||
return UINT_MAX;
|
return UINT_MAX;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Local function for parse_bracket_exp used in _LIBC environement.
|
/* Local function for parse_bracket_exp used in _LIBC environment.
|
||||||
Build the range expression which starts from START_ELEM, and ends
|
Build the range expression which starts from START_ELEM, and ends
|
||||||
at END_ELEM. The result are written to MBCSET and SBCSET.
|
at END_ELEM. The result are written to MBCSET and SBCSET.
|
||||||
RANGE_ALLOC is the allocated size of mbcset->range_starts, and
|
RANGE_ALLOC is the allocated size of mbcset->range_starts, and
|
||||||
mbcset->range_ends, is a pointer argument sinse we may
|
mbcset->range_ends, is a pointer argument since we may
|
||||||
update it. */
|
update it. */
|
||||||
|
|
||||||
auto inline reg_errcode_t
|
auto inline reg_errcode_t
|
||||||
__attribute ((always_inline))
|
__attribute__ ((always_inline))
|
||||||
build_range_exp (sbcset, mbcset, range_alloc, start_elem, end_elem)
|
build_range_exp (bitset_t sbcset, re_charset_t *mbcset, int *range_alloc,
|
||||||
re_charset_t *mbcset;
|
bracket_elem_t *start_elem, bracket_elem_t *end_elem)
|
||||||
Idx *range_alloc;
|
|
||||||
bitset_t sbcset;
|
|
||||||
bracket_elem_t *start_elem, *end_elem;
|
|
||||||
{
|
{
|
||||||
unsigned int ch;
|
unsigned int ch;
|
||||||
uint32_t start_collseq;
|
uint32_t start_collseq;
|
||||||
|
@ -2912,6 +2944,7 @@ parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, re_token_t *token,
|
||||||
0))
|
0))
|
||||||
return REG_ERANGE;
|
return REG_ERANGE;
|
||||||
|
|
||||||
|
/* FIXME: Implement rational ranges here, too. */
|
||||||
start_collseq = lookup_collation_sequence_value (start_elem);
|
start_collseq = lookup_collation_sequence_value (start_elem);
|
||||||
end_collseq = lookup_collation_sequence_value (end_elem);
|
end_collseq = lookup_collation_sequence_value (end_elem);
|
||||||
/* Check start/end collation sequence values. */
|
/* Check start/end collation sequence values. */
|
||||||
|
@ -2970,33 +3003,30 @@ parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, re_token_t *token,
|
||||||
return REG_NOERROR;
|
return REG_NOERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Local function for parse_bracket_exp used in _LIBC environement.
|
/* Local function for parse_bracket_exp used in _LIBC environment.
|
||||||
Build the collating element which is represented by NAME.
|
Build the collating element which is represented by NAME.
|
||||||
The result are written to MBCSET and SBCSET.
|
The result are written to MBCSET and SBCSET.
|
||||||
COLL_SYM_ALLOC is the allocated size of mbcset->coll_sym, is a
|
COLL_SYM_ALLOC is the allocated size of mbcset->coll_sym, is a
|
||||||
pointer argument sinse we may update it. */
|
pointer argument since we may update it. */
|
||||||
|
|
||||||
auto inline reg_errcode_t
|
auto inline reg_errcode_t
|
||||||
__attribute ((always_inline))
|
__attribute__ ((always_inline))
|
||||||
build_collating_symbol (sbcset, mbcset, coll_sym_alloc, name)
|
build_collating_symbol (bitset_t sbcset, re_charset_t *mbcset,
|
||||||
re_charset_t *mbcset;
|
Idx *coll_sym_alloc, const unsigned char *name)
|
||||||
Idx *coll_sym_alloc;
|
|
||||||
bitset_t sbcset;
|
|
||||||
const unsigned char *name;
|
|
||||||
{
|
{
|
||||||
int32_t elem, idx;
|
int32_t elem, idx;
|
||||||
size_t name_len = strlen ((const char *) name);
|
size_t name_len = strlen ((const char *) name);
|
||||||
if (nrules != 0)
|
if (nrules != 0)
|
||||||
{
|
{
|
||||||
elem = seek_collating_symbol_entry (name, name_len);
|
elem = seek_collating_symbol_entry (name, name_len);
|
||||||
if (symb_table[2 * elem] != 0)
|
if (elem != -1)
|
||||||
{
|
{
|
||||||
/* We found the entry. */
|
/* We found the entry. */
|
||||||
idx = symb_table[2 * elem + 1];
|
idx = symb_table[2 * elem + 1];
|
||||||
/* Skip the name of collating element name. */
|
/* Skip the name of collating element name. */
|
||||||
idx += 1 + extra[idx];
|
idx += 1 + extra[idx];
|
||||||
}
|
}
|
||||||
else if (symb_table[2 * elem] == 0 && name_len == 1)
|
else if (name_len == 1)
|
||||||
{
|
{
|
||||||
/* No valid character, treat it as a normal
|
/* No valid character, treat it as a normal
|
||||||
character. */
|
character. */
|
||||||
|
@ -3076,6 +3106,10 @@ parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, re_token_t *token,
|
||||||
if (BE (sbcset == NULL, 0))
|
if (BE (sbcset == NULL, 0))
|
||||||
#endif /* RE_ENABLE_I18N */
|
#endif /* RE_ENABLE_I18N */
|
||||||
{
|
{
|
||||||
|
re_free (sbcset);
|
||||||
|
#ifdef RE_ENABLE_I18N
|
||||||
|
re_free (mbcset);
|
||||||
|
#endif
|
||||||
*err = REG_ESPACE;
|
*err = REG_ESPACE;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -3235,7 +3269,8 @@ parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, re_token_t *token,
|
||||||
#ifdef RE_ENABLE_I18N
|
#ifdef RE_ENABLE_I18N
|
||||||
mbcset, &char_class_alloc,
|
mbcset, &char_class_alloc,
|
||||||
#endif /* RE_ENABLE_I18N */
|
#endif /* RE_ENABLE_I18N */
|
||||||
start_elem.opr.name, syntax);
|
(const char *) start_elem.opr.name,
|
||||||
|
syntax);
|
||||||
if (BE (*err != REG_NOERROR, 0))
|
if (BE (*err != REG_NOERROR, 0))
|
||||||
goto parse_bracket_exp_free_return;
|
goto parse_bracket_exp_free_return;
|
||||||
break;
|
break;
|
||||||
|
@ -3414,7 +3449,7 @@ parse_bracket_symbol (bracket_elem_t *elem, re_string_t *regexp,
|
||||||
Build the equivalence class which is represented by NAME.
|
Build the equivalence class which is represented by NAME.
|
||||||
The result are written to MBCSET and SBCSET.
|
The result are written to MBCSET and SBCSET.
|
||||||
EQUIV_CLASS_ALLOC is the allocated size of mbcset->equiv_classes,
|
EQUIV_CLASS_ALLOC is the allocated size of mbcset->equiv_classes,
|
||||||
is a pointer argument sinse we may update it. */
|
is a pointer argument since we may update it. */
|
||||||
|
|
||||||
static reg_errcode_t
|
static reg_errcode_t
|
||||||
#ifdef RE_ENABLE_I18N
|
#ifdef RE_ENABLE_I18N
|
||||||
|
@ -3445,19 +3480,18 @@ build_equiv_class (bitset_t sbcset, const unsigned char *name)
|
||||||
_NL_COLLATE_EXTRAMB);
|
_NL_COLLATE_EXTRAMB);
|
||||||
indirect = (const int32_t *) _NL_CURRENT (LC_COLLATE,
|
indirect = (const int32_t *) _NL_CURRENT (LC_COLLATE,
|
||||||
_NL_COLLATE_INDIRECTMB);
|
_NL_COLLATE_INDIRECTMB);
|
||||||
idx1 = findidx (&cp);
|
idx1 = findidx (&cp, -1);
|
||||||
if (BE (idx1 == 0 || cp < name + strlen ((const char *) name), 0))
|
if (BE (idx1 == 0 || *cp != '\0', 0))
|
||||||
/* This isn't a valid character. */
|
/* This isn't a valid character. */
|
||||||
return REG_ECOLLATE;
|
return REG_ECOLLATE;
|
||||||
|
|
||||||
/* Build single byte matcing table for this equivalence class. */
|
/* Build single byte matching table for this equivalence class. */
|
||||||
char_buf[1] = (unsigned char) '\0';
|
|
||||||
len = weights[idx1 & 0xffffff];
|
len = weights[idx1 & 0xffffff];
|
||||||
for (ch = 0; ch < SBC_MAX; ++ch)
|
for (ch = 0; ch < SBC_MAX; ++ch)
|
||||||
{
|
{
|
||||||
char_buf[0] = ch;
|
char_buf[0] = ch;
|
||||||
cp = char_buf;
|
cp = char_buf;
|
||||||
idx2 = findidx (&cp);
|
idx2 = findidx (&cp, 1);
|
||||||
/*
|
/*
|
||||||
idx2 = table[ch];
|
idx2 = table[ch];
|
||||||
*/
|
*/
|
||||||
|
@ -3510,20 +3544,20 @@ build_equiv_class (bitset_t sbcset, const unsigned char *name)
|
||||||
Build the character class which is represented by NAME.
|
Build the character class which is represented by NAME.
|
||||||
The result are written to MBCSET and SBCSET.
|
The result are written to MBCSET and SBCSET.
|
||||||
CHAR_CLASS_ALLOC is the allocated size of mbcset->char_classes,
|
CHAR_CLASS_ALLOC is the allocated size of mbcset->char_classes,
|
||||||
is a pointer argument sinse we may update it. */
|
is a pointer argument since we may update it. */
|
||||||
|
|
||||||
static reg_errcode_t
|
static reg_errcode_t
|
||||||
#ifdef RE_ENABLE_I18N
|
#ifdef RE_ENABLE_I18N
|
||||||
build_charclass (RE_TRANSLATE_TYPE trans, bitset_t sbcset,
|
build_charclass (RE_TRANSLATE_TYPE trans, bitset_t sbcset,
|
||||||
re_charset_t *mbcset, Idx *char_class_alloc,
|
re_charset_t *mbcset, Idx *char_class_alloc,
|
||||||
const unsigned char *class_name, reg_syntax_t syntax)
|
const char *class_name, reg_syntax_t syntax)
|
||||||
#else /* not RE_ENABLE_I18N */
|
#else /* not RE_ENABLE_I18N */
|
||||||
build_charclass (RE_TRANSLATE_TYPE trans, bitset_t sbcset,
|
build_charclass (RE_TRANSLATE_TYPE trans, bitset_t sbcset,
|
||||||
const unsigned char *class_name, reg_syntax_t syntax)
|
const char *class_name, reg_syntax_t syntax)
|
||||||
#endif /* not RE_ENABLE_I18N */
|
#endif /* not RE_ENABLE_I18N */
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
const char *name = (const char *) class_name;
|
const char *name = class_name;
|
||||||
|
|
||||||
/* In case of REG_ICASE "upper" and "lower" match the both of
|
/* In case of REG_ICASE "upper" and "lower" match the both of
|
||||||
upper and lower cases. */
|
upper and lower cases. */
|
||||||
|
@ -3597,8 +3631,8 @@ build_charclass (RE_TRANSLATE_TYPE trans, bitset_t sbcset,
|
||||||
|
|
||||||
static bin_tree_t *
|
static bin_tree_t *
|
||||||
build_charclass_op (re_dfa_t *dfa, RE_TRANSLATE_TYPE trans,
|
build_charclass_op (re_dfa_t *dfa, RE_TRANSLATE_TYPE trans,
|
||||||
const unsigned char *class_name,
|
const char *class_name,
|
||||||
const unsigned char *extra, bool non_match,
|
const char *extra, bool non_match,
|
||||||
reg_errcode_t *err)
|
reg_errcode_t *err)
|
||||||
{
|
{
|
||||||
re_bitset_ptr_t sbcset;
|
re_bitset_ptr_t sbcset;
|
||||||
|
@ -3704,8 +3738,9 @@ build_charclass_op (re_dfa_t *dfa, RE_TRANSLATE_TYPE trans,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This is intended for the expressions like "a{1,3}".
|
/* This is intended for the expressions like "a{1,3}".
|
||||||
Fetch a number from `input', and return the number.
|
Fetch a number from 'input', and return the number.
|
||||||
Return REG_MISSING if the number field is empty like "{,1}".
|
Return REG_MISSING if the number field is empty like "{,1}".
|
||||||
|
Return RE_DUP_MAX + 1 if the number field is too large.
|
||||||
Return REG_ERROR if an error occurred. */
|
Return REG_ERROR if an error occurred. */
|
||||||
|
|
||||||
static Idx
|
static Idx
|
||||||
|
@ -3724,8 +3759,9 @@ fetch_number (re_string_t *input, re_token_t *token, reg_syntax_t syntax)
|
||||||
num = ((token->type != CHARACTER || c < '0' || '9' < c
|
num = ((token->type != CHARACTER || c < '0' || '9' < c
|
||||||
|| num == REG_ERROR)
|
|| num == REG_ERROR)
|
||||||
? REG_ERROR
|
? REG_ERROR
|
||||||
: ((num == REG_MISSING) ? c - '0' : num * 10 + c - '0'));
|
: num == REG_MISSING
|
||||||
num = (num > RE_DUP_MAX) ? REG_ERROR : num;
|
? c - '0'
|
||||||
|
: MIN (RE_DUP_MAX + 1, num * 10 + c - '0'));
|
||||||
}
|
}
|
||||||
return num;
|
return num;
|
||||||
}
|
}
|
||||||
|
@ -3799,7 +3835,7 @@ create_token_tree (re_dfa_t *dfa, bin_tree_t *left, bin_tree_t *right,
|
||||||
static reg_errcode_t
|
static reg_errcode_t
|
||||||
mark_opt_subexp (void *extra, bin_tree_t *node)
|
mark_opt_subexp (void *extra, bin_tree_t *node)
|
||||||
{
|
{
|
||||||
Idx idx = (Idx) (long) extra;
|
Idx idx = (uintptr_t) extra;
|
||||||
if (node->token.type == SUBEXP && node->token.opr.idx == idx)
|
if (node->token.type == SUBEXP && node->token.opr.idx == idx)
|
||||||
node->token.opt_subexp = 1;
|
node->token.opt_subexp = 1;
|
||||||
|
|
||||||
|
|
|
@ -1,26 +1,35 @@
|
||||||
/* Extended regular expression matching and search library.
|
/* Extended regular expression matching and search library.
|
||||||
Copyright (C) 2002, 2003, 2005, 2006, 2009, 2010 Free Software Foundation,
|
Copyright (C) 2002-2013 Free Software Foundation, Inc.
|
||||||
Inc.
|
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>.
|
Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
it under the terms of the GNU General Public License as published by
|
modify it under the terms of the GNU General Public
|
||||||
the Free Software Foundation; either version 3, or (at your option)
|
License as published by the Free Software Foundation; either
|
||||||
any later version.
|
version 3 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
GNU General Public License for more details.
|
General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public
|
||||||
with this program; if not, write to the Free Software Foundation,
|
License along with the GNU C Library; if not, see
|
||||||
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
#include <config.h>
|
#ifndef _LIBC
|
||||||
|
# include <config.h>
|
||||||
|
|
||||||
/* Make sure noone compiles this code with a C++ compiler. */
|
# if (__GNUC__ == 4 && 6 <= __GNUC_MINOR__) || 4 < __GNUC__
|
||||||
|
# pragma GCC diagnostic ignored "-Wsuggest-attribute=pure"
|
||||||
|
# endif
|
||||||
|
# if (__GNUC__ == 4 && 3 <= __GNUC_MINOR__) || 4 < __GNUC__
|
||||||
|
# pragma GCC diagnostic ignored "-Wold-style-definition"
|
||||||
|
# pragma GCC diagnostic ignored "-Wtype-limits"
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Make sure no one compiles this code with a C++ compiler. */
|
||||||
#if defined __cplusplus && defined _LIBC
|
#if defined __cplusplus && defined _LIBC
|
||||||
# error "This is C code, use a C compiler"
|
# error "This is C code, use a C compiler"
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,23 +1,22 @@
|
||||||
/* Definitions for data structures and routines for the regular
|
/* Definitions for data structures and routines for the regular
|
||||||
expression library.
|
expression library.
|
||||||
Copyright (C) 1985, 1989, 1990, 1991, 1992, 1993, 1995, 1996, 1997, 1998,
|
Copyright (C) 1985, 1989-1993, 1995-1998, 2000-2003, 2005-2013 Free Software
|
||||||
2000, 2001, 2002, 2003, 2005, 2006, 2009, 2010 Free Software Foundation,
|
Foundation, Inc.
|
||||||
Inc.
|
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
it under the terms of the GNU General Public License as published by
|
modify it under the terms of the GNU General Public
|
||||||
the Free Software Foundation; either version 3, or (at your option)
|
License as published by the Free Software Foundation; either
|
||||||
any later version.
|
version 3 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
GNU General Public License for more details.
|
General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public
|
||||||
with this program; if not, write to the Free Software Foundation,
|
License along with the GNU C Library; if not, see
|
||||||
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
#ifndef _REGEX_H
|
#ifndef _REGEX_H
|
||||||
#define _REGEX_H 1
|
#define _REGEX_H 1
|
||||||
|
@ -29,13 +28,10 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Define __USE_GNU_REGEX to declare GNU extensions that violate the
|
/* Define __USE_GNU to declare GNU extensions that violate the
|
||||||
POSIX name space rules. */
|
POSIX name space rules. */
|
||||||
#undef __USE_GNU_REGEX
|
#ifdef _GNU_SOURCE
|
||||||
#if (defined _GNU_SOURCE \
|
# define __USE_GNU 1
|
||||||
|| (!defined _POSIX_C_SOURCE && !defined _POSIX_SOURCE \
|
|
||||||
&& !defined _XOPEN_SOURCE))
|
|
||||||
# define __USE_GNU_REGEX 1
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef _REGEX_LARGE_OFFSETS
|
#ifdef _REGEX_LARGE_OFFSETS
|
||||||
|
@ -46,16 +42,6 @@ extern "C" {
|
||||||
supported within glibc itself, and glibc users should not define
|
supported within glibc itself, and glibc users should not define
|
||||||
_REGEX_LARGE_OFFSETS. */
|
_REGEX_LARGE_OFFSETS. */
|
||||||
|
|
||||||
/* The type of the offset of a byte within a string.
|
|
||||||
For historical reasons POSIX 1003.1-2004 requires that regoff_t be
|
|
||||||
at least as wide as off_t. However, many common POSIX platforms set
|
|
||||||
regoff_t to the more-sensible ssize_t and the Open Group has
|
|
||||||
signalled its intention to change the requirement to be that
|
|
||||||
regoff_t be at least as wide as ptrdiff_t and ssize_t; see XBD ERN
|
|
||||||
60 (2005-08-25). We don't know of any hosts where ssize_t or
|
|
||||||
ptrdiff_t is wider than ssize_t, so ssize_t is safe. */
|
|
||||||
typedef ssize_t regoff_t;
|
|
||||||
|
|
||||||
/* The type of nonnegative object indexes. Traditionally, GNU regex
|
/* The type of nonnegative object indexes. Traditionally, GNU regex
|
||||||
uses 'int' for these. Code that uses __re_idx_t should work
|
uses 'int' for these. Code that uses __re_idx_t should work
|
||||||
regardless of whether the type is signed. */
|
regardless of whether the type is signed. */
|
||||||
|
@ -70,10 +56,8 @@ typedef size_t __re_long_size_t;
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
/* Use types that are binary-compatible with the traditional GNU regex
|
/* The traditional GNU regex implementation mishandles strings longer
|
||||||
implementation, which mishandles strings longer than INT_MAX. */
|
than INT_MAX. */
|
||||||
|
|
||||||
typedef int regoff_t;
|
|
||||||
typedef int __re_idx_t;
|
typedef int __re_idx_t;
|
||||||
typedef unsigned int __re_size_t;
|
typedef unsigned int __re_size_t;
|
||||||
typedef unsigned long int __re_long_size_t;
|
typedef unsigned long int __re_long_size_t;
|
||||||
|
@ -94,8 +78,7 @@ typedef unsigned long int active_reg_t;
|
||||||
add or remove a bit, only one other definition need change. */
|
add or remove a bit, only one other definition need change. */
|
||||||
typedef unsigned long int reg_syntax_t;
|
typedef unsigned long int reg_syntax_t;
|
||||||
|
|
||||||
#ifdef __USE_GNU_REGEX
|
#ifdef __USE_GNU
|
||||||
|
|
||||||
/* If this bit is not set, then \ inside a bracket expression is literal.
|
/* If this bit is not set, then \ inside a bracket expression is literal.
|
||||||
If set, then such a \ quotes the following character. */
|
If set, then such a \ quotes the following character. */
|
||||||
# define RE_BACKSLASH_ESCAPE_IN_LISTS ((unsigned long int) 1)
|
# define RE_BACKSLASH_ESCAPE_IN_LISTS ((unsigned long int) 1)
|
||||||
|
@ -162,9 +145,9 @@ typedef unsigned long int reg_syntax_t;
|
||||||
If not set, newline is literal. */
|
If not set, newline is literal. */
|
||||||
# define RE_NEWLINE_ALT (RE_LIMITED_OPS << 1)
|
# define RE_NEWLINE_ALT (RE_LIMITED_OPS << 1)
|
||||||
|
|
||||||
/* If this bit is set, then `{...}' defines an interval, and \{ and \}
|
/* If this bit is set, then '{...}' defines an interval, and \{ and \}
|
||||||
are literals.
|
are literals.
|
||||||
If not set, then `\{...\}' defines an interval. */
|
If not set, then '\{...\}' defines an interval. */
|
||||||
# define RE_NO_BK_BRACES (RE_NEWLINE_ALT << 1)
|
# define RE_NO_BK_BRACES (RE_NEWLINE_ALT << 1)
|
||||||
|
|
||||||
/* If this bit is set, (...) defines a group, and \( and \) are literals.
|
/* If this bit is set, (...) defines a group, and \( and \) are literals.
|
||||||
|
@ -226,8 +209,7 @@ typedef unsigned long int reg_syntax_t;
|
||||||
/* If this bit is set, then no_sub will be set to 1 during
|
/* If this bit is set, then no_sub will be set to 1 during
|
||||||
re_compile_pattern. */
|
re_compile_pattern. */
|
||||||
# define RE_NO_SUB (RE_CONTEXT_INVALID_DUP << 1)
|
# define RE_NO_SUB (RE_CONTEXT_INVALID_DUP << 1)
|
||||||
|
#endif
|
||||||
#endif /* defined __USE_GNU_REGEX */
|
|
||||||
|
|
||||||
/* This global variable defines the particular regexp syntax to use (for
|
/* This global variable defines the particular regexp syntax to use (for
|
||||||
some interfaces). When a regexp is compiled, the syntax used is
|
some interfaces). When a regexp is compiled, the syntax used is
|
||||||
|
@ -235,7 +217,7 @@ typedef unsigned long int reg_syntax_t;
|
||||||
already-compiled regexps. */
|
already-compiled regexps. */
|
||||||
extern reg_syntax_t re_syntax_options;
|
extern reg_syntax_t re_syntax_options;
|
||||||
|
|
||||||
#ifdef __USE_GNU_REGEX
|
#ifdef __USE_GNU
|
||||||
/* Define combinations of the above bits for the standard possibilities.
|
/* Define combinations of the above bits for the standard possibilities.
|
||||||
(The [[[ comments delimit what gets put into the Texinfo file, so
|
(The [[[ comments delimit what gets put into the Texinfo file, so
|
||||||
don't delete them!) */
|
don't delete them!) */
|
||||||
|
@ -247,16 +229,19 @@ extern reg_syntax_t re_syntax_options;
|
||||||
| RE_NO_BK_PARENS | RE_NO_BK_REFS \
|
| RE_NO_BK_PARENS | RE_NO_BK_REFS \
|
||||||
| RE_NO_BK_VBAR | RE_NO_EMPTY_RANGES \
|
| RE_NO_BK_VBAR | RE_NO_EMPTY_RANGES \
|
||||||
| RE_DOT_NEWLINE | RE_CONTEXT_INDEP_ANCHORS \
|
| RE_DOT_NEWLINE | RE_CONTEXT_INDEP_ANCHORS \
|
||||||
|
| RE_CHAR_CLASSES \
|
||||||
| RE_UNMATCHED_RIGHT_PAREN_ORD | RE_NO_GNU_OPS)
|
| RE_UNMATCHED_RIGHT_PAREN_ORD | RE_NO_GNU_OPS)
|
||||||
|
|
||||||
# define RE_SYNTAX_GNU_AWK \
|
# define RE_SYNTAX_GNU_AWK \
|
||||||
((RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS | RE_DEBUG) \
|
((RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS \
|
||||||
& ~(RE_DOT_NOT_NULL | RE_INTERVALS | RE_CONTEXT_INDEP_OPS \
|
| RE_INVALID_INTERVAL_ORD) \
|
||||||
| RE_CONTEXT_INVALID_OPS ))
|
& ~(RE_DOT_NOT_NULL | RE_CONTEXT_INDEP_OPS \
|
||||||
|
| RE_CONTEXT_INVALID_OPS ))
|
||||||
|
|
||||||
# define RE_SYNTAX_POSIX_AWK \
|
# define RE_SYNTAX_POSIX_AWK \
|
||||||
(RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS \
|
(RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS \
|
||||||
| RE_INTERVALS | RE_NO_GNU_OPS)
|
| RE_INTERVALS | RE_NO_GNU_OPS \
|
||||||
|
| RE_INVALID_INTERVAL_ORD)
|
||||||
|
|
||||||
# define RE_SYNTAX_GREP \
|
# define RE_SYNTAX_GREP \
|
||||||
(RE_BK_PLUS_QM | RE_CHAR_CLASSES \
|
(RE_BK_PLUS_QM | RE_CHAR_CLASSES \
|
||||||
|
@ -307,13 +292,12 @@ extern reg_syntax_t re_syntax_options;
|
||||||
| RE_NO_BK_VBAR | RE_UNMATCHED_RIGHT_PAREN_ORD)
|
| RE_NO_BK_VBAR | RE_UNMATCHED_RIGHT_PAREN_ORD)
|
||||||
/* [[[end syntaxes]]] */
|
/* [[[end syntaxes]]] */
|
||||||
|
|
||||||
#endif /* defined __USE_GNU_REGEX */
|
|
||||||
|
|
||||||
#ifdef __USE_GNU_REGEX
|
|
||||||
|
|
||||||
/* Maximum number of duplicates an interval can allow. POSIX-conforming
|
/* Maximum number of duplicates an interval can allow. POSIX-conforming
|
||||||
systems might define this in <limits.h>, but we want our
|
systems might define this in <limits.h>, but we want our
|
||||||
value, so remove any previous define. */
|
value, so remove any previous define. */
|
||||||
|
# ifdef _REGEX_INCLUDE_LIMITS_H
|
||||||
|
# include <limits.h>
|
||||||
|
# endif
|
||||||
# ifdef RE_DUP_MAX
|
# ifdef RE_DUP_MAX
|
||||||
# undef RE_DUP_MAX
|
# undef RE_DUP_MAX
|
||||||
# endif
|
# endif
|
||||||
|
@ -321,16 +305,15 @@ extern reg_syntax_t re_syntax_options;
|
||||||
/* RE_DUP_MAX is 2**15 - 1 because an earlier implementation stored
|
/* RE_DUP_MAX is 2**15 - 1 because an earlier implementation stored
|
||||||
the counter as a 2-byte signed integer. This is no longer true, so
|
the counter as a 2-byte signed integer. This is no longer true, so
|
||||||
RE_DUP_MAX could be increased to (INT_MAX / 10 - 1), or to
|
RE_DUP_MAX could be increased to (INT_MAX / 10 - 1), or to
|
||||||
((SIZE_MAX - 2) / 10 - 1) if _REGEX_LARGE_OFFSETS is defined.
|
((SIZE_MAX - 9) / 10) if _REGEX_LARGE_OFFSETS is defined.
|
||||||
However, there would be a huge performance problem if someone
|
However, there would be a huge performance problem if someone
|
||||||
actually used a pattern like a\{214748363\}, so RE_DUP_MAX retains
|
actually used a pattern like a\{214748363\}, so RE_DUP_MAX retains
|
||||||
its historical value. */
|
its historical value. */
|
||||||
# define RE_DUP_MAX (0x7fff)
|
# define RE_DUP_MAX (0x7fff)
|
||||||
|
#endif
|
||||||
#endif /* defined __USE_GNU_REGEX */
|
|
||||||
|
|
||||||
|
|
||||||
/* POSIX `cflags' bits (i.e., information for `regcomp'). */
|
/* POSIX 'cflags' bits (i.e., information for 'regcomp'). */
|
||||||
|
|
||||||
/* If this bit is set, then use extended regular expression syntax.
|
/* If this bit is set, then use extended regular expression syntax.
|
||||||
If not set, then use basic regular expression syntax. */
|
If not set, then use basic regular expression syntax. */
|
||||||
|
@ -350,7 +333,7 @@ extern reg_syntax_t re_syntax_options;
|
||||||
#define REG_NOSUB (1 << 3)
|
#define REG_NOSUB (1 << 3)
|
||||||
|
|
||||||
|
|
||||||
/* POSIX `eflags' bits (i.e., information for regexec). */
|
/* POSIX 'eflags' bits (i.e., information for regexec). */
|
||||||
|
|
||||||
/* If this bit is set, then the beginning-of-line operator doesn't match
|
/* If this bit is set, then the beginning-of-line operator doesn't match
|
||||||
the beginning of the string (presumably because it's not the
|
the beginning of the string (presumably because it's not the
|
||||||
|
@ -368,7 +351,7 @@ extern reg_syntax_t re_syntax_options;
|
||||||
|
|
||||||
|
|
||||||
/* If any error codes are removed, changed, or added, update the
|
/* If any error codes are removed, changed, or added, update the
|
||||||
`__re_error_msgid' table in regcomp.c. */
|
'__re_error_msgid' table in regcomp.c. */
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
|
@ -393,11 +376,11 @@ typedef enum
|
||||||
|
|
||||||
/* Error codes we've added. */
|
/* Error codes we've added. */
|
||||||
_REG_EEND, /* Premature end. */
|
_REG_EEND, /* Premature end. */
|
||||||
_REG_ESIZE, /* Compiled pattern bigger than 2^16 bytes. */
|
_REG_ESIZE, /* Too large (e.g., repeat count too large). */
|
||||||
_REG_ERPAREN /* Unmatched ) or \); not returned from regcomp. */
|
_REG_ERPAREN /* Unmatched ) or \); not returned from regcomp. */
|
||||||
} reg_errcode_t;
|
} reg_errcode_t;
|
||||||
|
|
||||||
#ifdef _XOPEN_SOURCE
|
#if defined _XOPEN_SOURCE || defined __USE_XOPEN2K
|
||||||
# define REG_ENOSYS _REG_ENOSYS
|
# define REG_ENOSYS _REG_ENOSYS
|
||||||
#endif
|
#endif
|
||||||
#define REG_NOERROR _REG_NOERROR
|
#define REG_NOERROR _REG_NOERROR
|
||||||
|
@ -418,129 +401,127 @@ typedef enum
|
||||||
#define REG_ESIZE _REG_ESIZE
|
#define REG_ESIZE _REG_ESIZE
|
||||||
#define REG_ERPAREN _REG_ERPAREN
|
#define REG_ERPAREN _REG_ERPAREN
|
||||||
|
|
||||||
/* struct re_pattern_buffer normally uses member names like `buffer'
|
|
||||||
that POSIX does not allow. In POSIX mode these members have names
|
|
||||||
with leading `re_' (e.g., `re_buffer'). */
|
|
||||||
#ifdef __USE_GNU_REGEX
|
|
||||||
# define _REG_RE_NAME(id) id
|
|
||||||
# define _REG_RM_NAME(id) id
|
|
||||||
#else
|
|
||||||
# define _REG_RE_NAME(id) re_##id
|
|
||||||
# define _REG_RM_NAME(id) rm_##id
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* The user can specify the type of the re_translate member by
|
|
||||||
defining the macro RE_TRANSLATE_TYPE, which defaults to unsigned
|
|
||||||
char *. This pollutes the POSIX name space, so in POSIX mode just
|
|
||||||
use unsigned char *. */
|
|
||||||
#ifdef __USE_GNU_REGEX
|
|
||||||
# ifndef RE_TRANSLATE_TYPE
|
|
||||||
# define RE_TRANSLATE_TYPE unsigned char *
|
|
||||||
# endif
|
|
||||||
# define REG_TRANSLATE_TYPE RE_TRANSLATE_TYPE
|
|
||||||
#else
|
|
||||||
# define REG_TRANSLATE_TYPE unsigned char *
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* This data structure represents a compiled pattern. Before calling
|
/* This data structure represents a compiled pattern. Before calling
|
||||||
the pattern compiler, the fields `buffer', `allocated', `fastmap',
|
the pattern compiler, the fields 'buffer', 'allocated', 'fastmap',
|
||||||
`translate', and `no_sub' can be set. After the pattern has been
|
and 'translate' can be set. After the pattern has been compiled,
|
||||||
compiled, the `re_nsub' field is available. All other fields are
|
the fields 're_nsub', 'not_bol' and 'not_eol' are available. All
|
||||||
private to the regex routines. */
|
other fields are private to the regex routines. */
|
||||||
|
|
||||||
struct re_dfa_t;
|
#ifndef RE_TRANSLATE_TYPE
|
||||||
typedef struct re_dfa_t re_dfa_t;
|
# define __RE_TRANSLATE_TYPE unsigned char *
|
||||||
|
# ifdef __USE_GNU
|
||||||
|
# define RE_TRANSLATE_TYPE __RE_TRANSLATE_TYPE
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __USE_GNU
|
||||||
|
# define __REPB_PREFIX(name) name
|
||||||
|
#else
|
||||||
|
# define __REPB_PREFIX(name) __##name
|
||||||
|
#endif
|
||||||
|
|
||||||
struct re_pattern_buffer
|
struct re_pattern_buffer
|
||||||
{
|
{
|
||||||
/* Space that holds the compiled pattern. It is declared as
|
/* Space that holds the compiled pattern. The type
|
||||||
`unsigned char *' because its elements are sometimes used as
|
'struct re_dfa_t' is private and is not declared here. */
|
||||||
array indexes. */
|
struct re_dfa_t *__REPB_PREFIX(buffer);
|
||||||
re_dfa_t *_REG_RE_NAME (buffer);
|
|
||||||
|
|
||||||
/* Number of bytes to which `buffer' points. */
|
/* Number of bytes to which 'buffer' points. */
|
||||||
__re_long_size_t _REG_RE_NAME (allocated);
|
__re_long_size_t __REPB_PREFIX(allocated);
|
||||||
|
|
||||||
/* Number of bytes actually used in `buffer'. */
|
/* Number of bytes actually used in 'buffer'. */
|
||||||
__re_long_size_t _REG_RE_NAME (used);
|
__re_long_size_t __REPB_PREFIX(used);
|
||||||
|
|
||||||
/* Syntax setting with which the pattern was compiled. */
|
/* Syntax setting with which the pattern was compiled. */
|
||||||
reg_syntax_t _REG_RE_NAME (syntax);
|
reg_syntax_t __REPB_PREFIX(syntax);
|
||||||
|
|
||||||
/* Pointer to a fastmap, if any, otherwise zero. re_search uses the
|
/* Pointer to a fastmap, if any, otherwise zero. re_search uses the
|
||||||
fastmap, if there is one, to skip over impossible starting points
|
fastmap, if there is one, to skip over impossible starting points
|
||||||
for matches. */
|
for matches. */
|
||||||
char *_REG_RE_NAME (fastmap);
|
char *__REPB_PREFIX(fastmap);
|
||||||
|
|
||||||
/* Either a translate table to apply to all characters before
|
/* Either a translate table to apply to all characters before
|
||||||
comparing them, or zero for no translation. The translation is
|
comparing them, or zero for no translation. The translation is
|
||||||
applied to a pattern when it is compiled and to a string when it
|
applied to a pattern when it is compiled and to a string when it
|
||||||
is matched. */
|
is matched. */
|
||||||
REG_TRANSLATE_TYPE _REG_RE_NAME (translate);
|
__RE_TRANSLATE_TYPE __REPB_PREFIX(translate);
|
||||||
|
|
||||||
/* Number of subexpressions found by the compiler. */
|
/* Number of subexpressions found by the compiler. */
|
||||||
size_t re_nsub;
|
size_t re_nsub;
|
||||||
|
|
||||||
/* Zero if this pattern cannot match the empty string, one else.
|
/* Zero if this pattern cannot match the empty string, one else.
|
||||||
Well, in truth it's used only in `re_search_2', to see whether or
|
Well, in truth it's used only in 're_search_2', to see whether or
|
||||||
not we should use the fastmap, so we don't set this absolutely
|
not we should use the fastmap, so we don't set this absolutely
|
||||||
perfectly; see `re_compile_fastmap' (the `duplicate' case). */
|
perfectly; see 're_compile_fastmap' (the "duplicate" case). */
|
||||||
unsigned int _REG_RE_NAME (can_be_null) : 1;
|
unsigned __REPB_PREFIX(can_be_null) : 1;
|
||||||
|
|
||||||
/* If REGS_UNALLOCATED, allocate space in the `regs' structure
|
/* If REGS_UNALLOCATED, allocate space in the 'regs' structure
|
||||||
for `max (RE_NREGS, re_nsub + 1)' groups.
|
for 'max (RE_NREGS, re_nsub + 1)' groups.
|
||||||
If REGS_REALLOCATE, reallocate space if necessary.
|
If REGS_REALLOCATE, reallocate space if necessary.
|
||||||
If REGS_FIXED, use what's there. */
|
If REGS_FIXED, use what's there. */
|
||||||
#ifdef __USE_GNU_REGEX
|
#ifdef __USE_GNU
|
||||||
# define REGS_UNALLOCATED 0
|
# define REGS_UNALLOCATED 0
|
||||||
# define REGS_REALLOCATE 1
|
# define REGS_REALLOCATE 1
|
||||||
# define REGS_FIXED 2
|
# define REGS_FIXED 2
|
||||||
#endif
|
#endif
|
||||||
unsigned int _REG_RE_NAME (regs_allocated) : 2;
|
unsigned __REPB_PREFIX(regs_allocated) : 2;
|
||||||
|
|
||||||
/* Set to zero when `re_compile_pattern' compiles a pattern; set to
|
/* Set to zero when 're_compile_pattern' compiles a pattern; set to
|
||||||
one by `re_compile_fastmap' if it updates the fastmap. */
|
one by 're_compile_fastmap' if it updates the fastmap. */
|
||||||
unsigned int _REG_RE_NAME (fastmap_accurate) : 1;
|
unsigned __REPB_PREFIX(fastmap_accurate) : 1;
|
||||||
|
|
||||||
/* If set, `re_match_2' does not return information about
|
/* If set, 're_match_2' does not return information about
|
||||||
subexpressions. */
|
subexpressions. */
|
||||||
unsigned int _REG_RE_NAME (no_sub) : 1;
|
unsigned __REPB_PREFIX(no_sub) : 1;
|
||||||
|
|
||||||
/* If set, a beginning-of-line anchor doesn't match at the beginning
|
/* If set, a beginning-of-line anchor doesn't match at the beginning
|
||||||
of the string. */
|
of the string. */
|
||||||
unsigned int _REG_RE_NAME (not_bol) : 1;
|
unsigned __REPB_PREFIX(not_bol) : 1;
|
||||||
|
|
||||||
/* Similarly for an end-of-line anchor. */
|
/* Similarly for an end-of-line anchor. */
|
||||||
unsigned int _REG_RE_NAME (not_eol) : 1;
|
unsigned __REPB_PREFIX(not_eol) : 1;
|
||||||
|
|
||||||
/* If true, an anchor at a newline matches. */
|
/* If true, an anchor at a newline matches. */
|
||||||
unsigned int _REG_RE_NAME (newline_anchor) : 1;
|
unsigned __REPB_PREFIX(newline_anchor) : 1;
|
||||||
|
|
||||||
/* [[[end pattern_buffer]]] */
|
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct re_pattern_buffer regex_t;
|
typedef struct re_pattern_buffer regex_t;
|
||||||
|
|
||||||
|
/* Type for byte offsets within the string. POSIX mandates this. */
|
||||||
|
#ifdef _REGEX_LARGE_OFFSETS
|
||||||
|
/* POSIX 1003.1-2008 requires that regoff_t be at least as wide as
|
||||||
|
ptrdiff_t and ssize_t. We don't know of any hosts where ptrdiff_t
|
||||||
|
is wider than ssize_t, so ssize_t is safe. */
|
||||||
|
typedef ssize_t regoff_t;
|
||||||
|
#else
|
||||||
|
/* The traditional GNU regex implementation mishandles strings longer
|
||||||
|
than INT_MAX. */
|
||||||
|
typedef int regoff_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __USE_GNU
|
||||||
/* This is the structure we store register match data in. See
|
/* This is the structure we store register match data in. See
|
||||||
regex.texinfo for a full description of what registers match. */
|
regex.texinfo for a full description of what registers match. */
|
||||||
struct re_registers
|
struct re_registers
|
||||||
{
|
{
|
||||||
__re_size_t _REG_RM_NAME (num_regs);
|
__re_size_t num_regs;
|
||||||
regoff_t *_REG_RM_NAME (start);
|
regoff_t *start;
|
||||||
regoff_t *_REG_RM_NAME (end);
|
regoff_t *end;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/* If `regs_allocated' is REGS_UNALLOCATED in the pattern buffer,
|
/* If 'regs_allocated' is REGS_UNALLOCATED in the pattern buffer,
|
||||||
`re_match_2' returns information about at least this many registers
|
're_match_2' returns information about at least this many registers
|
||||||
the first time a `regs' structure is passed. */
|
the first time a 'regs' structure is passed. */
|
||||||
#if !defined RE_NREGS && defined __USE_GNU_REGEX
|
# ifndef RE_NREGS
|
||||||
# define RE_NREGS 30
|
# define RE_NREGS 30
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* POSIX specification for registers. Aside from the different names than
|
/* POSIX specification for registers. Aside from the different names than
|
||||||
`re_registers', POSIX uses an array of structures, instead of a
|
're_registers', POSIX uses an array of structures, instead of a
|
||||||
structure of arrays. */
|
structure of arrays. */
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
|
@ -550,13 +531,19 @@ typedef struct
|
||||||
|
|
||||||
/* Declarations for routines. */
|
/* Declarations for routines. */
|
||||||
|
|
||||||
|
#ifdef __USE_GNU
|
||||||
/* Sets the current default syntax to SYNTAX, and return the old syntax.
|
/* Sets the current default syntax to SYNTAX, and return the old syntax.
|
||||||
You can also simply assign to the `re_syntax_options' variable. */
|
You can also simply assign to the 're_syntax_options' variable. */
|
||||||
extern reg_syntax_t re_set_syntax (reg_syntax_t __syntax);
|
extern reg_syntax_t re_set_syntax (reg_syntax_t __syntax);
|
||||||
|
|
||||||
/* Compile the regular expression PATTERN, with length LENGTH
|
/* Compile the regular expression PATTERN, with length LENGTH
|
||||||
and syntax given by the global `re_syntax_options', into the buffer
|
and syntax given by the global 're_syntax_options', into the buffer
|
||||||
BUFFER. Return NULL if successful, and an error string if not. */
|
BUFFER. Return NULL if successful, and an error string if not.
|
||||||
|
|
||||||
|
To free the allocated storage, you must call 'regfree' on BUFFER.
|
||||||
|
Note that the translate table must either have been initialised by
|
||||||
|
'regcomp', with a malloc'ed value, or set to NULL before calling
|
||||||
|
'regfree'. */
|
||||||
extern const char *re_compile_pattern (const char *__pattern, size_t __length,
|
extern const char *re_compile_pattern (const char *__pattern, size_t __length,
|
||||||
struct re_pattern_buffer *__buffer);
|
struct re_pattern_buffer *__buffer);
|
||||||
|
|
||||||
|
@ -578,7 +565,7 @@ extern regoff_t re_search (struct re_pattern_buffer *__buffer,
|
||||||
struct re_registers *__regs);
|
struct re_registers *__regs);
|
||||||
|
|
||||||
|
|
||||||
/* Like `re_search', but search in the concatenation of STRING1 and
|
/* Like 're_search', but search in the concatenation of STRING1 and
|
||||||
STRING2. Also, stop searching at index START + STOP. */
|
STRING2. Also, stop searching at index START + STOP. */
|
||||||
extern regoff_t re_search_2 (struct re_pattern_buffer *__buffer,
|
extern regoff_t re_search_2 (struct re_pattern_buffer *__buffer,
|
||||||
const char *__string1, __re_idx_t __length1,
|
const char *__string1, __re_idx_t __length1,
|
||||||
|
@ -588,14 +575,14 @@ extern regoff_t re_search_2 (struct re_pattern_buffer *__buffer,
|
||||||
__re_idx_t __stop);
|
__re_idx_t __stop);
|
||||||
|
|
||||||
|
|
||||||
/* Like `re_search', but return how many characters in STRING the regexp
|
/* Like 're_search', but return how many characters in STRING the regexp
|
||||||
in BUFFER matched, starting at position START. */
|
in BUFFER matched, starting at position START. */
|
||||||
extern regoff_t re_match (struct re_pattern_buffer *__buffer,
|
extern regoff_t re_match (struct re_pattern_buffer *__buffer,
|
||||||
const char *__string, __re_idx_t __length,
|
const char *__string, __re_idx_t __length,
|
||||||
__re_idx_t __start, struct re_registers *__regs);
|
__re_idx_t __start, struct re_registers *__regs);
|
||||||
|
|
||||||
|
|
||||||
/* Relates to `re_match' as `re_search_2' relates to `re_search'. */
|
/* Relates to 're_match' as 're_search_2' relates to 're_search'. */
|
||||||
extern regoff_t re_match_2 (struct re_pattern_buffer *__buffer,
|
extern regoff_t re_match_2 (struct re_pattern_buffer *__buffer,
|
||||||
const char *__string1, __re_idx_t __length1,
|
const char *__string1, __re_idx_t __length1,
|
||||||
const char *__string2, __re_idx_t __length2,
|
const char *__string2, __re_idx_t __length2,
|
||||||
|
@ -606,21 +593,22 @@ extern regoff_t re_match_2 (struct re_pattern_buffer *__buffer,
|
||||||
/* Set REGS to hold NUM_REGS registers, storing them in STARTS and
|
/* Set REGS to hold NUM_REGS registers, storing them in STARTS and
|
||||||
ENDS. Subsequent matches using BUFFER and REGS will use this memory
|
ENDS. Subsequent matches using BUFFER and REGS will use this memory
|
||||||
for recording register information. STARTS and ENDS must be
|
for recording register information. STARTS and ENDS must be
|
||||||
allocated with malloc, and must each be at least `NUM_REGS * sizeof
|
allocated with malloc, and must each be at least 'NUM_REGS * sizeof
|
||||||
(regoff_t)' bytes long.
|
(regoff_t)' bytes long.
|
||||||
|
|
||||||
If NUM_REGS == 0, then subsequent matches should allocate their own
|
If NUM_REGS == 0, then subsequent matches should allocate their own
|
||||||
register data.
|
register data.
|
||||||
|
|
||||||
Unless this function is called, the first search or match using
|
Unless this function is called, the first search or match using
|
||||||
BUFFER will allocate its own register data, without freeing the old
|
BUFFER will allocate its own register data, without
|
||||||
data. */
|
freeing the old data. */
|
||||||
extern void re_set_registers (struct re_pattern_buffer *__buffer,
|
extern void re_set_registers (struct re_pattern_buffer *__buffer,
|
||||||
struct re_registers *__regs,
|
struct re_registers *__regs,
|
||||||
__re_size_t __num_regs,
|
__re_size_t __num_regs,
|
||||||
regoff_t *__starts, regoff_t *__ends);
|
regoff_t *__starts, regoff_t *__ends);
|
||||||
|
#endif /* Use GNU */
|
||||||
|
|
||||||
#if defined _REGEX_RE_COMP || defined _LIBC
|
#if defined _REGEX_RE_COMP || (defined _LIBC && defined __USE_BSD)
|
||||||
# ifndef _CRAY
|
# ifndef _CRAY
|
||||||
/* 4.2 bsd compatibility. */
|
/* 4.2 bsd compatibility. */
|
||||||
extern char *re_comp (const char *);
|
extern char *re_comp (const char *);
|
||||||
|
@ -648,7 +636,7 @@ extern int re_exec (const char *);
|
||||||
#ifndef _Restrict_arr_
|
#ifndef _Restrict_arr_
|
||||||
# if ((199901L <= __STDC_VERSION__ \
|
# if ((199901L <= __STDC_VERSION__ \
|
||||||
|| ((3 < __GNUC__ || (3 == __GNUC__ && 1 <= __GNUC_MINOR__)) \
|
|| ((3 < __GNUC__ || (3 == __GNUC__ && 1 <= __GNUC_MINOR__)) \
|
||||||
&& !__STRICT_ANSI__)) \
|
&& !defined __STRICT_ANSI__)) \
|
||||||
&& !defined __GNUG__)
|
&& !defined __GNUG__)
|
||||||
# define _Restrict_arr_ _Restrict_
|
# define _Restrict_arr_ _Restrict_
|
||||||
# else
|
# else
|
||||||
|
|
|
@ -1,22 +1,21 @@
|
||||||
/* Extended regular expression matching and search library.
|
/* Extended regular expression matching and search library.
|
||||||
Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free
|
Copyright (C) 2002-2013 Free Software Foundation, Inc.
|
||||||
Software Foundation, Inc.
|
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>.
|
Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
it under the terms of the GNU General Public License as published by
|
modify it under the terms of the GNU General Public
|
||||||
the Free Software Foundation; either version 3, or (at your option)
|
License as published by the Free Software Foundation; either
|
||||||
any later version.
|
version 3 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
GNU General Public License for more details.
|
General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public
|
||||||
with this program; if not, write to the Free Software Foundation,
|
License along with the GNU C Library; if not, see
|
||||||
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
static void re_string_construct_common (const char *str, Idx len,
|
static void re_string_construct_common (const char *str, Idx len,
|
||||||
re_string_t *pstr,
|
re_string_t *pstr,
|
||||||
|
@ -135,9 +134,9 @@ re_string_realloc_buffers (re_string_t *pstr, Idx new_buf_len)
|
||||||
{
|
{
|
||||||
wint_t *new_wcs;
|
wint_t *new_wcs;
|
||||||
|
|
||||||
/* Avoid overflow. */
|
/* Avoid overflow in realloc. */
|
||||||
size_t max_object_size = MAX (sizeof (wint_t), sizeof (Idx));
|
const size_t max_object_size = MAX (sizeof (wint_t), sizeof (Idx));
|
||||||
if (BE (SIZE_MAX / max_object_size < new_buf_len, 0))
|
if (BE (MIN (IDX_MAX, SIZE_MAX / max_object_size) < new_buf_len, 0))
|
||||||
return REG_ESPACE;
|
return REG_ESPACE;
|
||||||
|
|
||||||
new_wcs = re_realloc (pstr->wcs, wint_t, new_buf_len);
|
new_wcs = re_realloc (pstr->wcs, wint_t, new_buf_len);
|
||||||
|
@ -237,13 +236,8 @@ build_wcs_buffer (re_string_t *pstr)
|
||||||
else
|
else
|
||||||
p = (const char *) pstr->raw_mbs + pstr->raw_mbs_idx + byte_idx;
|
p = (const char *) pstr->raw_mbs + pstr->raw_mbs_idx + byte_idx;
|
||||||
mbclen = __mbrtowc (&wc, p, remain_len, &pstr->cur_state);
|
mbclen = __mbrtowc (&wc, p, remain_len, &pstr->cur_state);
|
||||||
if (BE (mbclen == (size_t) -2, 0))
|
if (BE (mbclen == (size_t) -1 || mbclen == 0
|
||||||
{
|
|| (mbclen == (size_t) -2 && pstr->bufs_len >= pstr->len), 0))
|
||||||
/* The buffer doesn't have enough space, finish to build. */
|
|
||||||
pstr->cur_state = prev_st;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else if (BE (mbclen == (size_t) -1 || mbclen == 0, 0))
|
|
||||||
{
|
{
|
||||||
/* We treat these cases as a singlebyte character. */
|
/* We treat these cases as a singlebyte character. */
|
||||||
mbclen = 1;
|
mbclen = 1;
|
||||||
|
@ -252,6 +246,12 @@ build_wcs_buffer (re_string_t *pstr)
|
||||||
wc = pstr->trans[wc];
|
wc = pstr->trans[wc];
|
||||||
pstr->cur_state = prev_st;
|
pstr->cur_state = prev_st;
|
||||||
}
|
}
|
||||||
|
else if (BE (mbclen == (size_t) -2, 0))
|
||||||
|
{
|
||||||
|
/* The buffer doesn't have enough space, finish to build. */
|
||||||
|
pstr->cur_state = prev_st;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
/* Write wide character and padding. */
|
/* Write wide character and padding. */
|
||||||
pstr->wcs[byte_idx++] = wc;
|
pstr->wcs[byte_idx++] = wc;
|
||||||
|
@ -334,9 +334,11 @@ build_wcs_upper_buffer (re_string_t *pstr)
|
||||||
for (remain_len = byte_idx + mbclen - 1; byte_idx < remain_len ;)
|
for (remain_len = byte_idx + mbclen - 1; byte_idx < remain_len ;)
|
||||||
pstr->wcs[byte_idx++] = WEOF;
|
pstr->wcs[byte_idx++] = WEOF;
|
||||||
}
|
}
|
||||||
else if (mbclen == (size_t) -1 || mbclen == 0)
|
else if (mbclen == (size_t) -1 || mbclen == 0
|
||||||
|
|| (mbclen == (size_t) -2 && pstr->bufs_len >= pstr->len))
|
||||||
{
|
{
|
||||||
/* It is an invalid character or '\0'. Just use the byte. */
|
/* It is an invalid character, an incomplete character
|
||||||
|
at the end of the string, or '\0'. Just use the byte. */
|
||||||
int ch = pstr->raw_mbs[pstr->raw_mbs_idx + byte_idx];
|
int ch = pstr->raw_mbs[pstr->raw_mbs_idx + byte_idx];
|
||||||
pstr->mbs[byte_idx] = ch;
|
pstr->mbs[byte_idx] = ch;
|
||||||
/* And also cast it to wide char. */
|
/* And also cast it to wide char. */
|
||||||
|
@ -449,7 +451,8 @@ build_wcs_upper_buffer (re_string_t *pstr)
|
||||||
for (remain_len = byte_idx + mbclen - 1; byte_idx < remain_len ;)
|
for (remain_len = byte_idx + mbclen - 1; byte_idx < remain_len ;)
|
||||||
pstr->wcs[byte_idx++] = WEOF;
|
pstr->wcs[byte_idx++] = WEOF;
|
||||||
}
|
}
|
||||||
else if (mbclen == (size_t) -1 || mbclen == 0)
|
else if (mbclen == (size_t) -1 || mbclen == 0
|
||||||
|
|| (mbclen == (size_t) -2 && pstr->bufs_len >= pstr->len))
|
||||||
{
|
{
|
||||||
/* It is an invalid character or '\0'. Just use the byte. */
|
/* It is an invalid character or '\0'. Just use the byte. */
|
||||||
int ch = pstr->raw_mbs[pstr->raw_mbs_idx + src_idx];
|
int ch = pstr->raw_mbs[pstr->raw_mbs_idx + src_idx];
|
||||||
|
@ -496,8 +499,7 @@ re_string_skip_chars (re_string_t *pstr, Idx new_raw_idx, wint_t *last_wc)
|
||||||
rawbuf_idx < new_raw_idx;)
|
rawbuf_idx < new_raw_idx;)
|
||||||
{
|
{
|
||||||
wchar_t wc2;
|
wchar_t wc2;
|
||||||
Idx remain_len;
|
Idx remain_len = pstr->raw_len - rawbuf_idx;
|
||||||
remain_len = pstr->len - rawbuf_idx;
|
|
||||||
prev_st = pstr->cur_state;
|
prev_st = pstr->cur_state;
|
||||||
mbclen = __mbrtowc (&wc2, (const char *) pstr->raw_mbs + rawbuf_idx,
|
mbclen = __mbrtowc (&wc2, (const char *) pstr->raw_mbs + rawbuf_idx,
|
||||||
remain_len, &pstr->cur_state);
|
remain_len, &pstr->cur_state);
|
||||||
|
@ -733,21 +735,21 @@ re_string_reconstruct (re_string_t *pstr, Idx idx, int eflags)
|
||||||
mbstate_t cur_state;
|
mbstate_t cur_state;
|
||||||
wchar_t wc2;
|
wchar_t wc2;
|
||||||
Idx mlen = raw + pstr->len - p;
|
Idx mlen = raw + pstr->len - p;
|
||||||
|
unsigned char buf[6];
|
||||||
size_t mbclen;
|
size_t mbclen;
|
||||||
|
|
||||||
#if 0 /* dead code: buf is set but never used */
|
const unsigned char *pp = p;
|
||||||
unsigned char buf[6];
|
|
||||||
if (BE (pstr->trans != NULL, 0))
|
if (BE (pstr->trans != NULL, 0))
|
||||||
{
|
{
|
||||||
int i = mlen < 6 ? mlen : 6;
|
int i = mlen < 6 ? mlen : 6;
|
||||||
while (--i >= 0)
|
while (--i >= 0)
|
||||||
buf[i] = pstr->trans[p[i]];
|
buf[i] = pstr->trans[p[i]];
|
||||||
|
pp = buf;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
/* XXX Don't use mbrtowc, we know which conversion
|
/* XXX Don't use mbrtowc, we know which conversion
|
||||||
to use (UTF-8 -> UCS4). */
|
to use (UTF-8 -> UCS4). */
|
||||||
memset (&cur_state, 0, sizeof (cur_state));
|
memset (&cur_state, 0, sizeof (cur_state));
|
||||||
mbclen = __mbrtowc (&wc2, (const char *) p, mlen,
|
mbclen = __mbrtowc (&wc2, (const char *) pp, mlen,
|
||||||
&cur_state);
|
&cur_state);
|
||||||
if (raw + offset - p <= mbclen
|
if (raw + offset - p <= mbclen
|
||||||
&& mbclen < (size_t) -2)
|
&& mbclen < (size_t) -2)
|
||||||
|
@ -832,7 +834,7 @@ re_string_reconstruct (re_string_t *pstr, Idx idx, int eflags)
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned char
|
static unsigned char
|
||||||
internal_function __attribute ((pure))
|
internal_function __attribute__ ((pure))
|
||||||
re_string_peek_byte_case (const re_string_t *pstr, Idx idx)
|
re_string_peek_byte_case (const re_string_t *pstr, Idx idx)
|
||||||
{
|
{
|
||||||
int ch;
|
int ch;
|
||||||
|
@ -869,7 +871,7 @@ re_string_peek_byte_case (const re_string_t *pstr, Idx idx)
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned char
|
static unsigned char
|
||||||
internal_function __attribute ((pure))
|
internal_function
|
||||||
re_string_fetch_byte_case (re_string_t *pstr)
|
re_string_fetch_byte_case (re_string_t *pstr)
|
||||||
{
|
{
|
||||||
if (BE (!pstr->mbs_allocated, 1))
|
if (BE (!pstr->mbs_allocated, 1))
|
||||||
|
@ -972,7 +974,7 @@ re_node_set_alloc (re_node_set *set, Idx size)
|
||||||
set->alloc = size;
|
set->alloc = size;
|
||||||
set->nelem = 0;
|
set->nelem = 0;
|
||||||
set->elems = re_malloc (Idx, size);
|
set->elems = re_malloc (Idx, size);
|
||||||
if (BE (set->elems == NULL, 0))
|
if (BE (set->elems == NULL, 0) && (MALLOC_0_IS_NONNULL || size != 0))
|
||||||
return REG_ESPACE;
|
return REG_ESPACE;
|
||||||
return REG_NOERROR;
|
return REG_NOERROR;
|
||||||
}
|
}
|
||||||
|
@ -1352,7 +1354,7 @@ re_node_set_insert_last (re_node_set *set, Idx elem)
|
||||||
Return true if SET1 and SET2 are equivalent. */
|
Return true if SET1 and SET2 are equivalent. */
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
internal_function __attribute ((pure))
|
internal_function __attribute__ ((pure))
|
||||||
re_node_set_compare (const re_node_set *set1, const re_node_set *set2)
|
re_node_set_compare (const re_node_set *set1, const re_node_set *set2)
|
||||||
{
|
{
|
||||||
Idx i;
|
Idx i;
|
||||||
|
@ -1367,7 +1369,7 @@ re_node_set_compare (const re_node_set *set1, const re_node_set *set2)
|
||||||
/* Return (idx + 1) if SET contains the element ELEM, return 0 otherwise. */
|
/* Return (idx + 1) if SET contains the element ELEM, return 0 otherwise. */
|
||||||
|
|
||||||
static Idx
|
static Idx
|
||||||
internal_function __attribute ((pure))
|
internal_function __attribute__ ((pure))
|
||||||
re_node_set_contains (const re_node_set *set, Idx elem)
|
re_node_set_contains (const re_node_set *set, Idx elem)
|
||||||
{
|
{
|
||||||
__re_size_t idx, right, mid;
|
__re_size_t idx, right, mid;
|
||||||
|
@ -1413,13 +1415,12 @@ re_dfa_add_node (re_dfa_t *dfa, re_token_t token)
|
||||||
Idx *new_nexts, *new_indices;
|
Idx *new_nexts, *new_indices;
|
||||||
re_node_set *new_edests, *new_eclosures;
|
re_node_set *new_edests, *new_eclosures;
|
||||||
re_token_t *new_nodes;
|
re_token_t *new_nodes;
|
||||||
size_t max_object_size =
|
|
||||||
MAX (sizeof (re_token_t),
|
|
||||||
MAX (sizeof (re_node_set),
|
|
||||||
sizeof (Idx)));
|
|
||||||
|
|
||||||
/* Avoid overflows. */
|
/* Avoid overflows in realloc. */
|
||||||
if (BE (SIZE_MAX / 2 / max_object_size < dfa->nodes_alloc, 0))
|
const size_t max_object_size = MAX (sizeof (re_token_t),
|
||||||
|
MAX (sizeof (re_node_set),
|
||||||
|
sizeof (Idx)));
|
||||||
|
if (BE (MIN (IDX_MAX, SIZE_MAX / max_object_size) < new_nodes_alloc, 0))
|
||||||
return REG_MISSING;
|
return REG_MISSING;
|
||||||
|
|
||||||
new_nodes = re_realloc (dfa->nodes, re_token_t, new_nodes_alloc);
|
new_nodes = re_realloc (dfa->nodes, re_token_t, new_nodes_alloc);
|
||||||
|
@ -1442,11 +1443,9 @@ re_dfa_add_node (re_dfa_t *dfa, re_token_t token)
|
||||||
dfa->nodes[dfa->nodes_len] = token;
|
dfa->nodes[dfa->nodes_len] = token;
|
||||||
dfa->nodes[dfa->nodes_len].constraint = 0;
|
dfa->nodes[dfa->nodes_len].constraint = 0;
|
||||||
#ifdef RE_ENABLE_I18N
|
#ifdef RE_ENABLE_I18N
|
||||||
{
|
|
||||||
int type = token.type;
|
|
||||||
dfa->nodes[dfa->nodes_len].accept_mb =
|
dfa->nodes[dfa->nodes_len].accept_mb =
|
||||||
(type == OP_PERIOD && dfa->mb_cur_max > 1) || type == COMPLEX_BRACKET;
|
((token.type == OP_PERIOD && dfa->mb_cur_max > 1)
|
||||||
}
|
|| token.type == COMPLEX_BRACKET);
|
||||||
#endif
|
#endif
|
||||||
dfa->nexts[dfa->nodes_len] = REG_MISSING;
|
dfa->nexts[dfa->nodes_len] = REG_MISSING;
|
||||||
re_node_set_init_empty (dfa->edests + dfa->nodes_len);
|
re_node_set_init_empty (dfa->edests + dfa->nodes_len);
|
||||||
|
@ -1454,7 +1453,7 @@ re_dfa_add_node (re_dfa_t *dfa, re_token_t token)
|
||||||
return dfa->nodes_len++;
|
return dfa->nodes_len++;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline re_hashval_t
|
static re_hashval_t
|
||||||
internal_function
|
internal_function
|
||||||
calc_state_hash (const re_node_set *nodes, unsigned int context)
|
calc_state_hash (const re_node_set *nodes, unsigned int context)
|
||||||
{
|
{
|
||||||
|
@ -1551,7 +1550,7 @@ re_acquire_state_context (reg_errcode_t *err, const re_dfa_t *dfa,
|
||||||
&& re_node_set_compare (state->entrance_nodes, nodes))
|
&& re_node_set_compare (state->entrance_nodes, nodes))
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
/* There are no appropriate state in `dfa', create the new one. */
|
/* There are no appropriate state in 'dfa', create the new one. */
|
||||||
new_state = create_cd_newstate (dfa, nodes, context, hash);
|
new_state = create_cd_newstate (dfa, nodes, context, hash);
|
||||||
if (BE (new_state == NULL, 0))
|
if (BE (new_state == NULL, 0))
|
||||||
*err = REG_ESPACE;
|
*err = REG_ESPACE;
|
||||||
|
@ -1580,7 +1579,7 @@ register_state (const re_dfa_t *dfa, re_dfastate_t *newstate,
|
||||||
{
|
{
|
||||||
Idx elem = newstate->nodes.elems[i];
|
Idx elem = newstate->nodes.elems[i];
|
||||||
if (!IS_EPSILON_NODE (dfa->nodes[elem].type))
|
if (!IS_EPSILON_NODE (dfa->nodes[elem].type))
|
||||||
if (BE (! re_node_set_insert_last (&newstate->non_eps_nodes, elem), 0))
|
if (! re_node_set_insert_last (&newstate->non_eps_nodes, elem))
|
||||||
return REG_ESPACE;
|
return REG_ESPACE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1615,7 +1614,7 @@ free_state (re_dfastate_t *state)
|
||||||
re_free (state);
|
re_free (state);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Create the new state which is independ of contexts.
|
/* Create the new state which is independent of contexts.
|
||||||
Return the new state if succeeded, otherwise return NULL. */
|
Return the new state if succeeded, otherwise return NULL. */
|
||||||
|
|
||||||
static re_dfastate_t *
|
static re_dfastate_t *
|
||||||
|
|
|
@ -1,43 +1,36 @@
|
||||||
/* Extended regular expression matching and search library.
|
/* Extended regular expression matching and search library.
|
||||||
Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free
|
Copyright (C) 2002-2013 Free Software Foundation, Inc.
|
||||||
Software Foundation, Inc.
|
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>.
|
Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
it under the terms of the GNU General Public License as published by
|
modify it under the terms of the GNU General Public
|
||||||
the Free Software Foundation; either version 3, or (at your option)
|
License as published by the Free Software Foundation; either
|
||||||
any later version.
|
version 3 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
GNU General Public License for more details.
|
General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public
|
||||||
with this program; if not, write to the Free Software Foundation,
|
License along with the GNU C Library; if not, see
|
||||||
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
#ifndef _REGEX_INTERNAL_H
|
#ifndef _REGEX_INTERNAL_H
|
||||||
#define _REGEX_INTERNAL_H 1
|
#define _REGEX_INTERNAL_H 1
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include <langinfo.h>
|
#include <langinfo.h>
|
||||||
#ifndef _LIBC
|
#include <locale.h>
|
||||||
# include "localcharset.h"
|
|
||||||
#endif
|
|
||||||
#if defined HAVE_LOCALE_H || defined _LIBC
|
|
||||||
# include <locale.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <wchar.h>
|
#include <wchar.h>
|
||||||
#include <wctype.h>
|
#include <wctype.h>
|
||||||
|
#include <stdbool.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#if defined _LIBC
|
#if defined _LIBC
|
||||||
# include <bits/libc-lock.h>
|
# include <bits/libc-lock.h>
|
||||||
|
@ -67,7 +60,7 @@
|
||||||
# ifdef _LIBC
|
# ifdef _LIBC
|
||||||
# undef gettext
|
# undef gettext
|
||||||
# define gettext(msgid) \
|
# define gettext(msgid) \
|
||||||
INTUSE(__dcgettext) (_libc_intl_domainname, msgid, LC_MESSAGES)
|
__dcgettext (_libc_intl_domainname, msgid, LC_MESSAGES)
|
||||||
# endif
|
# endif
|
||||||
#else
|
#else
|
||||||
# define gettext(msgid) (msgid)
|
# define gettext(msgid) (msgid)
|
||||||
|
@ -79,12 +72,7 @@
|
||||||
# define gettext_noop(String) String
|
# define gettext_noop(String) String
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* For loser systems without the definition. */
|
#if (defined MB_CUR_MAX && HAVE_WCTYPE_H && HAVE_ISWCTYPE && HAVE_WCSCOLL) || _LIBC
|
||||||
#ifndef SIZE_MAX
|
|
||||||
# define SIZE_MAX ((size_t) -1)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if (defined MB_CUR_MAX && HAVE_LOCALE_H && HAVE_WCTYPE_H && HAVE_ISWCTYPE && HAVE_WCSCOLL) || _LIBC
|
|
||||||
# define RE_ENABLE_I18N
|
# define RE_ENABLE_I18N
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -92,9 +80,6 @@
|
||||||
# define BE(expr, val) __builtin_expect (expr, val)
|
# define BE(expr, val) __builtin_expect (expr, val)
|
||||||
#else
|
#else
|
||||||
# define BE(expr, val) (expr)
|
# define BE(expr, val) (expr)
|
||||||
# ifdef _LIBC
|
|
||||||
# define inline
|
|
||||||
# endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Number of ASCII characters. */
|
/* Number of ASCII characters. */
|
||||||
|
@ -111,22 +96,27 @@
|
||||||
|
|
||||||
/* Rename to standard API for using out of glibc. */
|
/* Rename to standard API for using out of glibc. */
|
||||||
#ifndef _LIBC
|
#ifndef _LIBC
|
||||||
|
# undef __wctype
|
||||||
|
# undef __iswctype
|
||||||
# define __wctype wctype
|
# define __wctype wctype
|
||||||
# define __iswctype iswctype
|
# define __iswctype iswctype
|
||||||
# define __btowc btowc
|
# define __btowc btowc
|
||||||
# define __wcrtomb wcrtomb
|
|
||||||
# define __mbrtowc mbrtowc
|
# define __mbrtowc mbrtowc
|
||||||
|
# define __wcrtomb wcrtomb
|
||||||
# define __regfree regfree
|
# define __regfree regfree
|
||||||
# define attribute_hidden
|
# define attribute_hidden
|
||||||
#endif /* not _LIBC */
|
#endif /* not _LIBC */
|
||||||
|
|
||||||
#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)
|
#if __GNUC__ < 3 + (__GNUC_MINOR__ < 1)
|
||||||
# define __attribute(arg) __attribute__ (arg)
|
# define __attribute__(arg)
|
||||||
#else
|
|
||||||
# define __attribute(arg)
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef __re_idx_t Idx;
|
typedef __re_idx_t Idx;
|
||||||
|
#ifdef _REGEX_LARGE_OFFSETS
|
||||||
|
# define IDX_MAX (SIZE_MAX - 2)
|
||||||
|
#else
|
||||||
|
# define IDX_MAX INT_MAX
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Special return value for failure to match. */
|
/* Special return value for failure to match. */
|
||||||
#define REG_MISSING ((Idx) -1)
|
#define REG_MISSING ((Idx) -1)
|
||||||
|
@ -337,7 +327,7 @@ typedef struct
|
||||||
Idx idx; /* for BACK_REF */
|
Idx idx; /* for BACK_REF */
|
||||||
re_context_type ctx_type; /* for ANCHOR */
|
re_context_type ctx_type; /* for ANCHOR */
|
||||||
} opr;
|
} opr;
|
||||||
#if __GNUC__ >= 2 && !__STRICT_ANSI__
|
#if __GNUC__ >= 2 && !defined __STRICT_ANSI__
|
||||||
re_token_type_t type : 8;
|
re_token_type_t type : 8;
|
||||||
#else
|
#else
|
||||||
re_token_type_t type;
|
re_token_type_t type;
|
||||||
|
@ -413,27 +403,29 @@ struct re_string_t
|
||||||
};
|
};
|
||||||
typedef struct re_string_t re_string_t;
|
typedef struct re_string_t re_string_t;
|
||||||
|
|
||||||
|
|
||||||
|
struct re_dfa_t;
|
||||||
|
typedef struct re_dfa_t re_dfa_t;
|
||||||
|
|
||||||
#ifndef _LIBC
|
#ifndef _LIBC
|
||||||
# if defined __i386__ && !defined __EMX__
|
# define internal_function
|
||||||
# define internal_function __attribute ((regparm (3), stdcall))
|
|
||||||
# else
|
|
||||||
# define internal_function
|
|
||||||
# endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef NOT_IN_libc
|
||||||
static reg_errcode_t re_string_realloc_buffers (re_string_t *pstr,
|
static reg_errcode_t re_string_realloc_buffers (re_string_t *pstr,
|
||||||
Idx new_buf_len)
|
Idx new_buf_len)
|
||||||
internal_function;
|
internal_function;
|
||||||
#ifdef RE_ENABLE_I18N
|
# ifdef RE_ENABLE_I18N
|
||||||
static void build_wcs_buffer (re_string_t *pstr) internal_function;
|
static void build_wcs_buffer (re_string_t *pstr) internal_function;
|
||||||
static reg_errcode_t build_wcs_upper_buffer (re_string_t *pstr)
|
static reg_errcode_t build_wcs_upper_buffer (re_string_t *pstr)
|
||||||
internal_function;
|
internal_function;
|
||||||
#endif /* RE_ENABLE_I18N */
|
# endif /* RE_ENABLE_I18N */
|
||||||
static void build_upper_buffer (re_string_t *pstr) internal_function;
|
static void build_upper_buffer (re_string_t *pstr) internal_function;
|
||||||
static void re_string_translate_buffer (re_string_t *pstr) internal_function;
|
static void re_string_translate_buffer (re_string_t *pstr) internal_function;
|
||||||
static unsigned int re_string_context_at (const re_string_t *input, Idx idx,
|
static unsigned int re_string_context_at (const re_string_t *input, Idx idx,
|
||||||
int eflags)
|
int eflags)
|
||||||
internal_function __attribute ((pure));
|
internal_function __attribute__ ((pure));
|
||||||
|
#endif
|
||||||
#define re_string_peek_byte(pstr, offset) \
|
#define re_string_peek_byte(pstr, offset) \
|
||||||
((pstr)->mbs[(pstr)->cur_idx + offset])
|
((pstr)->mbs[(pstr)->cur_idx + offset])
|
||||||
#define re_string_fetch_byte(pstr) \
|
#define re_string_fetch_byte(pstr) \
|
||||||
|
@ -451,7 +443,9 @@ static unsigned int re_string_context_at (const re_string_t *input, Idx idx,
|
||||||
#define re_string_skip_bytes(pstr,idx) ((pstr)->cur_idx += (idx))
|
#define re_string_skip_bytes(pstr,idx) ((pstr)->cur_idx += (idx))
|
||||||
#define re_string_set_index(pstr,idx) ((pstr)->cur_idx = (idx))
|
#define re_string_set_index(pstr,idx) ((pstr)->cur_idx = (idx))
|
||||||
|
|
||||||
#include <alloca.h>
|
#if defined _LIBC || HAVE_ALLOCA
|
||||||
|
# include <alloca.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef _LIBC
|
#ifndef _LIBC
|
||||||
# if HAVE_ALLOCA
|
# if HAVE_ALLOCA
|
||||||
|
@ -468,9 +462,18 @@ static unsigned int re_string_context_at (const re_string_t *input, Idx idx,
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef _LIBC
|
||||||
|
# define MALLOC_0_IS_NONNULL 1
|
||||||
|
#elif !defined MALLOC_0_IS_NONNULL
|
||||||
|
# define MALLOC_0_IS_NONNULL 0
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef MAX
|
#ifndef MAX
|
||||||
# define MAX(a,b) ((a) < (b) ? (b) : (a))
|
# define MAX(a,b) ((a) < (b) ? (b) : (a))
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef MIN
|
||||||
|
# define MIN(a,b) ((a) < (b) ? (a) : (b))
|
||||||
|
#endif
|
||||||
|
|
||||||
#define re_malloc(t,n) ((t *) malloc ((n) * sizeof (t)))
|
#define re_malloc(t,n) ((t *) malloc ((n) * sizeof (t)))
|
||||||
#define re_realloc(p,t,n) ((t *) realloc (p, (n) * sizeof (t)))
|
#define re_realloc(p,t,n) ((t *) realloc (p, (n) * sizeof (t)))
|
||||||
|
@ -486,8 +489,8 @@ struct bin_tree_t
|
||||||
|
|
||||||
re_token_t token;
|
re_token_t token;
|
||||||
|
|
||||||
/* `node_idx' is the index in dfa->nodes, if `type' == 0.
|
/* 'node_idx' is the index in dfa->nodes, if 'type' == 0.
|
||||||
Otherwise `type' indicate the type of this node. */
|
Otherwise 'type' indicate the type of this node. */
|
||||||
Idx node_idx;
|
Idx node_idx;
|
||||||
};
|
};
|
||||||
typedef struct bin_tree_t bin_tree_t;
|
typedef struct bin_tree_t bin_tree_t;
|
||||||
|
@ -540,9 +543,9 @@ struct re_dfastate_t
|
||||||
struct re_dfastate_t **trtable, **word_trtable;
|
struct re_dfastate_t **trtable, **word_trtable;
|
||||||
unsigned int context : 4;
|
unsigned int context : 4;
|
||||||
unsigned int halt : 1;
|
unsigned int halt : 1;
|
||||||
/* If this state can accept `multi byte'.
|
/* If this state can accept "multi byte".
|
||||||
Note that we refer to multibyte characters, and multi character
|
Note that we refer to multibyte characters, and multi character
|
||||||
collating elements as `multi byte'. */
|
collating elements as "multi byte". */
|
||||||
unsigned int accept_mb : 1;
|
unsigned int accept_mb : 1;
|
||||||
/* If this state has backreference node(s). */
|
/* If this state has backreference node(s). */
|
||||||
unsigned int has_backref : 1;
|
unsigned int has_backref : 1;
|
||||||
|
@ -671,7 +674,7 @@ struct re_dfa_t
|
||||||
re_bitset_ptr_t sb_char;
|
re_bitset_ptr_t sb_char;
|
||||||
int str_tree_storage_idx;
|
int str_tree_storage_idx;
|
||||||
|
|
||||||
/* number of subexpressions `re_nsub' is in regex_t. */
|
/* number of subexpressions 're_nsub' is in regex_t. */
|
||||||
re_hashval_t state_hash_mask;
|
re_hashval_t state_hash_mask;
|
||||||
Idx init_node;
|
Idx init_node;
|
||||||
Idx nbackref; /* The number of backreference in this dfa. */
|
Idx nbackref; /* The number of backreference in this dfa. */
|
||||||
|
@ -728,33 +731,33 @@ typedef struct
|
||||||
} bracket_elem_t;
|
} bracket_elem_t;
|
||||||
|
|
||||||
|
|
||||||
/* Inline functions for bitset_t operation. */
|
/* Functions for bitset_t operation. */
|
||||||
|
|
||||||
static inline void
|
static void
|
||||||
bitset_set (bitset_t set, Idx i)
|
bitset_set (bitset_t set, Idx i)
|
||||||
{
|
{
|
||||||
set[i / BITSET_WORD_BITS] |= (bitset_word_t) 1 << i % BITSET_WORD_BITS;
|
set[i / BITSET_WORD_BITS] |= (bitset_word_t) 1 << i % BITSET_WORD_BITS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static void
|
||||||
bitset_clear (bitset_t set, Idx i)
|
bitset_clear (bitset_t set, Idx i)
|
||||||
{
|
{
|
||||||
set[i / BITSET_WORD_BITS] &= ~ ((bitset_word_t) 1 << i % BITSET_WORD_BITS);
|
set[i / BITSET_WORD_BITS] &= ~ ((bitset_word_t) 1 << i % BITSET_WORD_BITS);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool
|
static bool
|
||||||
bitset_contain (const bitset_t set, Idx i)
|
bitset_contain (const bitset_t set, Idx i)
|
||||||
{
|
{
|
||||||
return (set[i / BITSET_WORD_BITS] >> i % BITSET_WORD_BITS) & 1;
|
return (set[i / BITSET_WORD_BITS] >> i % BITSET_WORD_BITS) & 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static void
|
||||||
bitset_empty (bitset_t set)
|
bitset_empty (bitset_t set)
|
||||||
{
|
{
|
||||||
memset (set, '\0', sizeof (bitset_t));
|
memset (set, '\0', sizeof (bitset_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static void
|
||||||
bitset_set_all (bitset_t set)
|
bitset_set_all (bitset_t set)
|
||||||
{
|
{
|
||||||
memset (set, -1, sizeof (bitset_word_t) * (SBC_MAX / BITSET_WORD_BITS));
|
memset (set, -1, sizeof (bitset_word_t) * (SBC_MAX / BITSET_WORD_BITS));
|
||||||
|
@ -763,13 +766,13 @@ bitset_set_all (bitset_t set)
|
||||||
((bitset_word_t) 1 << SBC_MAX % BITSET_WORD_BITS) - 1;
|
((bitset_word_t) 1 << SBC_MAX % BITSET_WORD_BITS) - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static void
|
||||||
bitset_copy (bitset_t dest, const bitset_t src)
|
bitset_copy (bitset_t dest, const bitset_t src)
|
||||||
{
|
{
|
||||||
memcpy (dest, src, sizeof (bitset_t));
|
memcpy (dest, src, sizeof (bitset_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static void __attribute__ ((unused))
|
||||||
bitset_not (bitset_t set)
|
bitset_not (bitset_t set)
|
||||||
{
|
{
|
||||||
int bitset_i;
|
int bitset_i;
|
||||||
|
@ -781,7 +784,7 @@ bitset_not (bitset_t set)
|
||||||
& ~set[BITSET_WORDS - 1]);
|
& ~set[BITSET_WORDS - 1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static void __attribute__ ((unused))
|
||||||
bitset_merge (bitset_t dest, const bitset_t src)
|
bitset_merge (bitset_t dest, const bitset_t src)
|
||||||
{
|
{
|
||||||
int bitset_i;
|
int bitset_i;
|
||||||
|
@ -789,7 +792,7 @@ bitset_merge (bitset_t dest, const bitset_t src)
|
||||||
dest[bitset_i] |= src[bitset_i];
|
dest[bitset_i] |= src[bitset_i];
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static void __attribute__ ((unused))
|
||||||
bitset_mask (bitset_t dest, const bitset_t src)
|
bitset_mask (bitset_t dest, const bitset_t src)
|
||||||
{
|
{
|
||||||
int bitset_i;
|
int bitset_i;
|
||||||
|
@ -798,9 +801,9 @@ bitset_mask (bitset_t dest, const bitset_t src)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef RE_ENABLE_I18N
|
#ifdef RE_ENABLE_I18N
|
||||||
/* Inline functions for re_string. */
|
/* Functions for re_string. */
|
||||||
static inline int
|
static int
|
||||||
internal_function __attribute ((pure))
|
internal_function __attribute__ ((pure, unused))
|
||||||
re_string_char_size_at (const re_string_t *pstr, Idx idx)
|
re_string_char_size_at (const re_string_t *pstr, Idx idx)
|
||||||
{
|
{
|
||||||
int byte_idx;
|
int byte_idx;
|
||||||
|
@ -812,8 +815,8 @@ re_string_char_size_at (const re_string_t *pstr, Idx idx)
|
||||||
return byte_idx;
|
return byte_idx;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline wint_t
|
static wint_t
|
||||||
internal_function __attribute ((pure))
|
internal_function __attribute__ ((pure, unused))
|
||||||
re_string_wchar_at (const re_string_t *pstr, Idx idx)
|
re_string_wchar_at (const re_string_t *pstr, Idx idx)
|
||||||
{
|
{
|
||||||
if (pstr->mb_cur_max == 1)
|
if (pstr->mb_cur_max == 1)
|
||||||
|
@ -821,15 +824,15 @@ re_string_wchar_at (const re_string_t *pstr, Idx idx)
|
||||||
return (wint_t) pstr->wcs[idx];
|
return (wint_t) pstr->wcs[idx];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# ifndef NOT_IN_libc
|
||||||
static int
|
static int
|
||||||
internal_function __attribute ((pure))
|
internal_function __attribute__ ((pure, unused))
|
||||||
re_string_elem_size_at (const re_string_t *pstr, Idx idx)
|
re_string_elem_size_at (const re_string_t *pstr, Idx idx)
|
||||||
{
|
{
|
||||||
# ifdef _LIBC
|
# ifdef _LIBC
|
||||||
const unsigned char *p, *extra;
|
const unsigned char *p, *extra;
|
||||||
const int32_t *table, *indirect;
|
const int32_t *table, *indirect;
|
||||||
int32_t tmp;
|
# include <locale/weight.h>
|
||||||
# include <locale/weight.h>
|
|
||||||
uint_fast32_t nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
|
uint_fast32_t nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
|
||||||
|
|
||||||
if (nrules != 0)
|
if (nrules != 0)
|
||||||
|
@ -840,13 +843,14 @@ re_string_elem_size_at (const re_string_t *pstr, Idx idx)
|
||||||
indirect = (const int32_t *) _NL_CURRENT (LC_COLLATE,
|
indirect = (const int32_t *) _NL_CURRENT (LC_COLLATE,
|
||||||
_NL_COLLATE_INDIRECTMB);
|
_NL_COLLATE_INDIRECTMB);
|
||||||
p = pstr->mbs + idx;
|
p = pstr->mbs + idx;
|
||||||
tmp = findidx (&p);
|
findidx (&p, pstr->len - idx);
|
||||||
return p - pstr->mbs - idx;
|
return p - pstr->mbs - idx;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
# endif /* _LIBC */
|
# endif /* _LIBC */
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
# endif
|
||||||
#endif /* RE_ENABLE_I18N */
|
#endif /* RE_ENABLE_I18N */
|
||||||
|
|
||||||
#ifndef __GNUC_PREREQ
|
#ifndef __GNUC_PREREQ
|
||||||
|
|
|
@ -1,22 +1,21 @@
|
||||||
/* Extended regular expression matching and search library.
|
/* Extended regular expression matching and search library.
|
||||||
Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free
|
Copyright (C) 2002-2013 Free Software Foundation, Inc.
|
||||||
Software Foundation, Inc.
|
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>.
|
Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
it under the terms of the GNU General Public License as published by
|
modify it under the terms of the GNU General Public
|
||||||
the Free Software Foundation; either version 3, or (at your option)
|
License as published by the Free Software Foundation; either
|
||||||
any later version.
|
version 3 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
GNU General Public License for more details.
|
General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public
|
||||||
with this program; if not, write to the Free Software Foundation,
|
License along with the GNU C Library; if not, see
|
||||||
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
<http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
static reg_errcode_t match_ctx_init (re_match_context_t *cache, int eflags,
|
static reg_errcode_t match_ctx_init (re_match_context_t *cache, int eflags,
|
||||||
Idx n) internal_function;
|
Idx n) internal_function;
|
||||||
|
@ -52,9 +51,8 @@ static regoff_t re_search_stub (struct re_pattern_buffer *bufp,
|
||||||
regoff_t range, Idx stop,
|
regoff_t range, Idx stop,
|
||||||
struct re_registers *regs,
|
struct re_registers *regs,
|
||||||
bool ret_len) internal_function;
|
bool ret_len) internal_function;
|
||||||
static unsigned int re_copy_regs (struct re_registers *regs, regmatch_t *pmatch,
|
static unsigned re_copy_regs (struct re_registers *regs, regmatch_t *pmatch,
|
||||||
Idx nregs, int regs_allocated)
|
Idx nregs, int regs_allocated) internal_function;
|
||||||
internal_function;
|
|
||||||
static reg_errcode_t prune_impossible_nodes (re_match_context_t *mctx)
|
static reg_errcode_t prune_impossible_nodes (re_match_context_t *mctx)
|
||||||
internal_function;
|
internal_function;
|
||||||
static Idx check_matching (re_match_context_t *mctx, bool fl_longest_match,
|
static Idx check_matching (re_match_context_t *mctx, bool fl_longest_match,
|
||||||
|
@ -201,7 +199,7 @@ static Idx group_nodes_into_DFAstates (const re_dfa_t *dfa,
|
||||||
static bool check_node_accept (const re_match_context_t *mctx,
|
static bool check_node_accept (const re_match_context_t *mctx,
|
||||||
const re_token_t *node, Idx idx)
|
const re_token_t *node, Idx idx)
|
||||||
internal_function;
|
internal_function;
|
||||||
static reg_errcode_t extend_buffers (re_match_context_t *mctx)
|
static reg_errcode_t extend_buffers (re_match_context_t *mctx, int min_len)
|
||||||
internal_function;
|
internal_function;
|
||||||
|
|
||||||
/* Entry point for POSIX code. */
|
/* Entry point for POSIX code. */
|
||||||
|
@ -210,11 +208,11 @@ static reg_errcode_t extend_buffers (re_match_context_t *mctx)
|
||||||
string STRING.
|
string STRING.
|
||||||
|
|
||||||
If NMATCH is zero or REG_NOSUB was set in the cflags argument to
|
If NMATCH is zero or REG_NOSUB was set in the cflags argument to
|
||||||
`regcomp', we ignore PMATCH. Otherwise, we assume PMATCH has at
|
'regcomp', we ignore PMATCH. Otherwise, we assume PMATCH has at
|
||||||
least NMATCH elements, and we set them to the offsets of the
|
least NMATCH elements, and we set them to the offsets of the
|
||||||
corresponding matched substrings.
|
corresponding matched substrings.
|
||||||
|
|
||||||
EFLAGS specifies `execution flags' which affect matching: if
|
EFLAGS specifies "execution flags" which affect matching: if
|
||||||
REG_NOTBOL is set, then ^ does not match at the beginning of the
|
REG_NOTBOL is set, then ^ does not match at the beginning of the
|
||||||
string; if REG_NOTEOL is set, then $ does not match at the end.
|
string; if REG_NOTEOL is set, then $ does not match at the end.
|
||||||
|
|
||||||
|
@ -231,7 +229,7 @@ regexec (preg, string, nmatch, pmatch, eflags)
|
||||||
reg_errcode_t err;
|
reg_errcode_t err;
|
||||||
Idx start, length;
|
Idx start, length;
|
||||||
#ifdef _LIBC
|
#ifdef _LIBC
|
||||||
re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
|
re_dfa_t *dfa = preg->buffer;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (eflags & ~(REG_NOTBOL | REG_NOTEOL | REG_STARTEND))
|
if (eflags & ~(REG_NOTBOL | REG_NOTEOL | REG_STARTEND))
|
||||||
|
@ -366,7 +364,6 @@ weak_alias (__re_search_2, re_search_2)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static regoff_t
|
static regoff_t
|
||||||
internal_function
|
|
||||||
re_search_2_stub (struct re_pattern_buffer *bufp,
|
re_search_2_stub (struct re_pattern_buffer *bufp,
|
||||||
const char *string1, Idx length1,
|
const char *string1, Idx length1,
|
||||||
const char *string2, Idx length2,
|
const char *string2, Idx length2,
|
||||||
|
@ -414,7 +411,6 @@ re_search_2_stub (struct re_pattern_buffer *bufp,
|
||||||
otherwise the position of the match is returned. */
|
otherwise the position of the match is returned. */
|
||||||
|
|
||||||
static regoff_t
|
static regoff_t
|
||||||
internal_function
|
|
||||||
re_search_stub (struct re_pattern_buffer *bufp,
|
re_search_stub (struct re_pattern_buffer *bufp,
|
||||||
const char *string, Idx length,
|
const char *string, Idx length,
|
||||||
Idx start, regoff_t range, Idx stop, struct re_registers *regs,
|
Idx start, regoff_t range, Idx stop, struct re_registers *regs,
|
||||||
|
@ -426,7 +422,7 @@ re_search_stub (struct re_pattern_buffer *bufp,
|
||||||
regoff_t rval;
|
regoff_t rval;
|
||||||
int eflags = 0;
|
int eflags = 0;
|
||||||
#ifdef _LIBC
|
#ifdef _LIBC
|
||||||
re_dfa_t *dfa = (re_dfa_t *) bufp->buffer;
|
re_dfa_t *dfa = bufp->buffer;
|
||||||
#endif
|
#endif
|
||||||
Idx last_start = start + range;
|
Idx last_start = start + range;
|
||||||
|
|
||||||
|
@ -478,9 +474,9 @@ re_search_stub (struct re_pattern_buffer *bufp,
|
||||||
|
|
||||||
rval = 0;
|
rval = 0;
|
||||||
|
|
||||||
/* I hope we needn't fill ther regs with -1's when no match was found. */
|
/* I hope we needn't fill their regs with -1's when no match was found. */
|
||||||
if (result != REG_NOERROR)
|
if (result != REG_NOERROR)
|
||||||
rval = -1;
|
rval = result == REG_NOMATCH ? -1 : -2;
|
||||||
else if (regs != NULL)
|
else if (regs != NULL)
|
||||||
{
|
{
|
||||||
/* If caller wants register contents data back, copy them. */
|
/* If caller wants register contents data back, copy them. */
|
||||||
|
@ -506,15 +502,14 @@ re_search_stub (struct re_pattern_buffer *bufp,
|
||||||
return rval;
|
return rval;
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned int
|
static unsigned
|
||||||
internal_function
|
|
||||||
re_copy_regs (struct re_registers *regs, regmatch_t *pmatch, Idx nregs,
|
re_copy_regs (struct re_registers *regs, regmatch_t *pmatch, Idx nregs,
|
||||||
int regs_allocated)
|
int regs_allocated)
|
||||||
{
|
{
|
||||||
int rval = REGS_REALLOCATE;
|
int rval = REGS_REALLOCATE;
|
||||||
Idx i;
|
Idx i;
|
||||||
Idx need_regs = nregs + 1;
|
Idx need_regs = nregs + 1;
|
||||||
/* We need one extra element beyond `num_regs' for the `-1' marker GNU code
|
/* We need one extra element beyond 'num_regs' for the '-1' marker GNU code
|
||||||
uses. */
|
uses. */
|
||||||
|
|
||||||
/* Have the register data arrays been allocated? */
|
/* Have the register data arrays been allocated? */
|
||||||
|
@ -637,7 +632,7 @@ re_exec (s)
|
||||||
(0 <= LAST_START && LAST_START <= LENGTH) */
|
(0 <= LAST_START && LAST_START <= LENGTH) */
|
||||||
|
|
||||||
static reg_errcode_t
|
static reg_errcode_t
|
||||||
internal_function __attribute_warn_unused_result__
|
__attribute_warn_unused_result__
|
||||||
re_search_internal (const regex_t *preg,
|
re_search_internal (const regex_t *preg,
|
||||||
const char *string, Idx length,
|
const char *string, Idx length,
|
||||||
Idx start, Idx last_start, Idx stop,
|
Idx start, Idx last_start, Idx stop,
|
||||||
|
@ -645,7 +640,7 @@ re_search_internal (const regex_t *preg,
|
||||||
int eflags)
|
int eflags)
|
||||||
{
|
{
|
||||||
reg_errcode_t err;
|
reg_errcode_t err;
|
||||||
const re_dfa_t *dfa = (const re_dfa_t *) preg->buffer;
|
const re_dfa_t *dfa = preg->buffer;
|
||||||
Idx left_lim, right_lim;
|
Idx left_lim, right_lim;
|
||||||
int incr;
|
int incr;
|
||||||
bool fl_longest_match;
|
bool fl_longest_match;
|
||||||
|
@ -720,7 +715,8 @@ re_search_internal (const regex_t *preg,
|
||||||
if (nmatch > 1 || dfa->has_mb_node)
|
if (nmatch > 1 || dfa->has_mb_node)
|
||||||
{
|
{
|
||||||
/* Avoid overflow. */
|
/* Avoid overflow. */
|
||||||
if (BE (SIZE_MAX / sizeof (re_dfastate_t *) <= mctx.input.bufs_len, 0))
|
if (BE ((MIN (IDX_MAX, SIZE_MAX / sizeof (re_dfastate_t *))
|
||||||
|
<= mctx.input.bufs_len), 0))
|
||||||
{
|
{
|
||||||
err = REG_ESPACE;
|
err = REG_ESPACE;
|
||||||
goto free_return;
|
goto free_return;
|
||||||
|
@ -740,7 +736,7 @@ re_search_internal (const regex_t *preg,
|
||||||
mctx.input.tip_context = (eflags & REG_NOTBOL) ? CONTEXT_BEGBUF
|
mctx.input.tip_context = (eflags & REG_NOTBOL) ? CONTEXT_BEGBUF
|
||||||
: CONTEXT_NEWLINE | CONTEXT_BEGBUF;
|
: CONTEXT_NEWLINE | CONTEXT_BEGBUF;
|
||||||
|
|
||||||
/* Check incrementally whether of not the input string match. */
|
/* Check incrementally whether the input string matches. */
|
||||||
incr = (last_start < start) ? -1 : 1;
|
incr = (last_start < start) ? -1 : 1;
|
||||||
left_lim = (last_start < start) ? last_start : start;
|
left_lim = (last_start < start) ? last_start : start;
|
||||||
right_lim = (last_start < start) ? start : last_start;
|
right_lim = (last_start < start) ? start : last_start;
|
||||||
|
@ -922,7 +918,7 @@ re_search_internal (const regex_t *preg,
|
||||||
goto free_return;
|
goto free_return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* At last, add the offset to the each registers, since we slided
|
/* At last, add the offset to each register, since we slid
|
||||||
the buffers so that we could assume that the matching starts
|
the buffers so that we could assume that the matching starts
|
||||||
from 0. */
|
from 0. */
|
||||||
for (reg_idx = 0; reg_idx < nmatch; ++reg_idx)
|
for (reg_idx = 0; reg_idx < nmatch; ++reg_idx)
|
||||||
|
@ -972,7 +968,7 @@ re_search_internal (const regex_t *preg,
|
||||||
}
|
}
|
||||||
|
|
||||||
static reg_errcode_t
|
static reg_errcode_t
|
||||||
internal_function __attribute_warn_unused_result__
|
__attribute_warn_unused_result__
|
||||||
prune_impossible_nodes (re_match_context_t *mctx)
|
prune_impossible_nodes (re_match_context_t *mctx)
|
||||||
{
|
{
|
||||||
const re_dfa_t *const dfa = mctx->dfa;
|
const re_dfa_t *const dfa = mctx->dfa;
|
||||||
|
@ -988,7 +984,7 @@ prune_impossible_nodes (re_match_context_t *mctx)
|
||||||
halt_node = mctx->last_node;
|
halt_node = mctx->last_node;
|
||||||
|
|
||||||
/* Avoid overflow. */
|
/* Avoid overflow. */
|
||||||
if (BE (SIZE_MAX / sizeof (re_dfastate_t *) <= match_last, 0))
|
if (BE (MIN (IDX_MAX, SIZE_MAX / sizeof (re_dfastate_t *)) <= match_last, 0))
|
||||||
return REG_ESPACE;
|
return REG_ESPACE;
|
||||||
|
|
||||||
sifted_states = re_malloc (re_dfastate_t *, match_last + 1);
|
sifted_states = re_malloc (re_dfastate_t *, match_last + 1);
|
||||||
|
@ -1068,7 +1064,7 @@ prune_impossible_nodes (re_match_context_t *mctx)
|
||||||
since initial states may have constraints like "\<", "^", etc.. */
|
since initial states may have constraints like "\<", "^", etc.. */
|
||||||
|
|
||||||
static inline re_dfastate_t *
|
static inline re_dfastate_t *
|
||||||
__attribute ((always_inline)) internal_function
|
__attribute__ ((always_inline)) internal_function
|
||||||
acquire_init_state_context (reg_errcode_t *err, const re_match_context_t *mctx,
|
acquire_init_state_context (reg_errcode_t *err, const re_match_context_t *mctx,
|
||||||
Idx idx)
|
Idx idx)
|
||||||
{
|
{
|
||||||
|
@ -1106,7 +1102,7 @@ acquire_init_state_context (reg_errcode_t *err, const re_match_context_t *mctx,
|
||||||
FL_LONGEST_MATCH means we want the POSIX longest matching.
|
FL_LONGEST_MATCH means we want the POSIX longest matching.
|
||||||
If P_MATCH_FIRST is not NULL, and the match fails, it is set to the
|
If P_MATCH_FIRST is not NULL, and the match fails, it is set to the
|
||||||
next place where we may want to try matching.
|
next place where we may want to try matching.
|
||||||
Note that the matcher assume that the maching starts from the current
|
Note that the matcher assumes that the matching starts from the current
|
||||||
index of the buffer. */
|
index of the buffer. */
|
||||||
|
|
||||||
static Idx
|
static Idx
|
||||||
|
@ -1175,11 +1171,12 @@ check_matching (re_match_context_t *mctx, bool fl_longest_match,
|
||||||
re_dfastate_t *old_state = cur_state;
|
re_dfastate_t *old_state = cur_state;
|
||||||
Idx next_char_idx = re_string_cur_idx (&mctx->input) + 1;
|
Idx next_char_idx = re_string_cur_idx (&mctx->input) + 1;
|
||||||
|
|
||||||
if (BE (next_char_idx >= mctx->input.bufs_len, 0)
|
if ((BE (next_char_idx >= mctx->input.bufs_len, 0)
|
||||||
|
&& mctx->input.bufs_len < mctx->input.len)
|
||||||
|| (BE (next_char_idx >= mctx->input.valid_len, 0)
|
|| (BE (next_char_idx >= mctx->input.valid_len, 0)
|
||||||
&& mctx->input.valid_len < mctx->input.len))
|
&& mctx->input.valid_len < mctx->input.len))
|
||||||
{
|
{
|
||||||
err = extend_buffers (mctx);
|
err = extend_buffers (mctx, next_char_idx + 1);
|
||||||
if (BE (err != REG_NOERROR, 0))
|
if (BE (err != REG_NOERROR, 0))
|
||||||
{
|
{
|
||||||
assert (err == REG_ESPACE);
|
assert (err == REG_ESPACE);
|
||||||
|
@ -1436,7 +1433,7 @@ internal_function __attribute_warn_unused_result__
|
||||||
set_regs (const regex_t *preg, const re_match_context_t *mctx, size_t nmatch,
|
set_regs (const regex_t *preg, const re_match_context_t *mctx, size_t nmatch,
|
||||||
regmatch_t *pmatch, bool fl_backtrack)
|
regmatch_t *pmatch, bool fl_backtrack)
|
||||||
{
|
{
|
||||||
const re_dfa_t *dfa = (const re_dfa_t *) preg->buffer;
|
const re_dfa_t *dfa = preg->buffer;
|
||||||
Idx idx, cur_node;
|
Idx idx, cur_node;
|
||||||
re_node_set eps_via_nodes;
|
re_node_set eps_via_nodes;
|
||||||
struct re_fail_stack_t *fs;
|
struct re_fail_stack_t *fs;
|
||||||
|
@ -1608,21 +1605,21 @@ update_regs (const re_dfa_t *dfa, regmatch_t *pmatch,
|
||||||
and sift the nodes in each states according to the following rules.
|
and sift the nodes in each states according to the following rules.
|
||||||
Updated state_log will be wrote to STATE_LOG.
|
Updated state_log will be wrote to STATE_LOG.
|
||||||
|
|
||||||
Rules: We throw away the Node `a' in the STATE_LOG[STR_IDX] if...
|
Rules: We throw away the Node 'a' in the STATE_LOG[STR_IDX] if...
|
||||||
1. When STR_IDX == MATCH_LAST(the last index in the state_log):
|
1. When STR_IDX == MATCH_LAST(the last index in the state_log):
|
||||||
If `a' isn't the LAST_NODE and `a' can't epsilon transit to
|
If 'a' isn't the LAST_NODE and 'a' can't epsilon transit to
|
||||||
the LAST_NODE, we throw away the node `a'.
|
the LAST_NODE, we throw away the node 'a'.
|
||||||
2. When 0 <= STR_IDX < MATCH_LAST and `a' accepts
|
2. When 0 <= STR_IDX < MATCH_LAST and 'a' accepts
|
||||||
string `s' and transit to `b':
|
string 's' and transit to 'b':
|
||||||
i. If 'b' isn't in the STATE_LOG[STR_IDX+strlen('s')], we throw
|
i. If 'b' isn't in the STATE_LOG[STR_IDX+strlen('s')], we throw
|
||||||
away the node `a'.
|
away the node 'a'.
|
||||||
ii. If 'b' is in the STATE_LOG[STR_IDX+strlen('s')] but 'b' is
|
ii. If 'b' is in the STATE_LOG[STR_IDX+strlen('s')] but 'b' is
|
||||||
thrown away, we throw away the node `a'.
|
thrown away, we throw away the node 'a'.
|
||||||
3. When 0 <= STR_IDX < MATCH_LAST and 'a' epsilon transit to 'b':
|
3. When 0 <= STR_IDX < MATCH_LAST and 'a' epsilon transit to 'b':
|
||||||
i. If 'b' isn't in the STATE_LOG[STR_IDX], we throw away the
|
i. If 'b' isn't in the STATE_LOG[STR_IDX], we throw away the
|
||||||
node `a'.
|
node 'a'.
|
||||||
ii. If 'b' is in the STATE_LOG[STR_IDX] but 'b' is thrown away,
|
ii. If 'b' is in the STATE_LOG[STR_IDX] but 'b' is thrown away,
|
||||||
we throw away the node `a'. */
|
we throw away the node 'a'. */
|
||||||
|
|
||||||
#define STATE_NODE_CONTAINS(state,node) \
|
#define STATE_NODE_CONTAINS(state,node) \
|
||||||
((state) != NULL && re_node_set_contains (&(state)->nodes, node))
|
((state) != NULL && re_node_set_contains (&(state)->nodes, node))
|
||||||
|
@ -1695,11 +1692,11 @@ build_sifted_states (const re_match_context_t *mctx, re_sift_context_t *sctx,
|
||||||
Idx i;
|
Idx i;
|
||||||
|
|
||||||
/* Then build the next sifted state.
|
/* Then build the next sifted state.
|
||||||
We build the next sifted state on `cur_dest', and update
|
We build the next sifted state on 'cur_dest', and update
|
||||||
`sifted_states[str_idx]' with `cur_dest'.
|
'sifted_states[str_idx]' with 'cur_dest'.
|
||||||
Note:
|
Note:
|
||||||
`cur_dest' is the sifted state from `state_log[str_idx + 1]'.
|
'cur_dest' is the sifted state from 'state_log[str_idx + 1]'.
|
||||||
`cur_src' points the node_set of the old `state_log[str_idx]'
|
'cur_src' points the node_set of the old 'state_log[str_idx]'
|
||||||
(with the epsilon nodes pre-filtered out). */
|
(with the epsilon nodes pre-filtered out). */
|
||||||
for (i = 0; i < cur_src->nelem; i++)
|
for (i = 0; i < cur_src->nelem; i++)
|
||||||
{
|
{
|
||||||
|
@ -1712,7 +1709,7 @@ build_sifted_states (const re_match_context_t *mctx, re_sift_context_t *sctx,
|
||||||
assert (!IS_EPSILON_NODE (type));
|
assert (!IS_EPSILON_NODE (type));
|
||||||
#endif
|
#endif
|
||||||
#ifdef RE_ENABLE_I18N
|
#ifdef RE_ENABLE_I18N
|
||||||
/* If the node may accept `multi byte'. */
|
/* If the node may accept "multi byte". */
|
||||||
if (dfa->nodes[prev_node].accept_mb)
|
if (dfa->nodes[prev_node].accept_mb)
|
||||||
naccepted = sift_states_iter_mb (mctx, sctx, prev_node,
|
naccepted = sift_states_iter_mb (mctx, sctx, prev_node,
|
||||||
str_idx, sctx->last_str_idx);
|
str_idx, sctx->last_str_idx);
|
||||||
|
@ -1753,12 +1750,13 @@ clean_state_log_if_needed (re_match_context_t *mctx, Idx next_state_log_idx)
|
||||||
{
|
{
|
||||||
Idx top = mctx->state_log_top;
|
Idx top = mctx->state_log_top;
|
||||||
|
|
||||||
if (next_state_log_idx >= mctx->input.bufs_len
|
if ((next_state_log_idx >= mctx->input.bufs_len
|
||||||
|
&& mctx->input.bufs_len < mctx->input.len)
|
||||||
|| (next_state_log_idx >= mctx->input.valid_len
|
|| (next_state_log_idx >= mctx->input.valid_len
|
||||||
&& mctx->input.valid_len < mctx->input.len))
|
&& mctx->input.valid_len < mctx->input.len))
|
||||||
{
|
{
|
||||||
reg_errcode_t err;
|
reg_errcode_t err;
|
||||||
err = extend_buffers (mctx);
|
err = extend_buffers (mctx, next_state_log_idx + 1);
|
||||||
if (BE (err != REG_NOERROR, 0))
|
if (BE (err != REG_NOERROR, 0))
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
@ -2268,17 +2266,17 @@ sift_states_iter_mb (const re_match_context_t *mctx, re_sift_context_t *sctx,
|
||||||
{
|
{
|
||||||
const re_dfa_t *const dfa = mctx->dfa;
|
const re_dfa_t *const dfa = mctx->dfa;
|
||||||
int naccepted;
|
int naccepted;
|
||||||
/* Check the node can accept `multi byte'. */
|
/* Check the node can accept "multi byte". */
|
||||||
naccepted = check_node_accept_bytes (dfa, node_idx, &mctx->input, str_idx);
|
naccepted = check_node_accept_bytes (dfa, node_idx, &mctx->input, str_idx);
|
||||||
if (naccepted > 0 && str_idx + naccepted <= max_str_idx &&
|
if (naccepted > 0 && str_idx + naccepted <= max_str_idx &&
|
||||||
!STATE_NODE_CONTAINS (sctx->sifted_states[str_idx + naccepted],
|
!STATE_NODE_CONTAINS (sctx->sifted_states[str_idx + naccepted],
|
||||||
dfa->nexts[node_idx]))
|
dfa->nexts[node_idx]))
|
||||||
/* The node can't accept the `multi byte', or the
|
/* The node can't accept the "multi byte", or the
|
||||||
destination was already thrown away, then the node
|
destination was already thrown away, then the node
|
||||||
could't accept the current input `multi byte'. */
|
could't accept the current input "multi byte". */
|
||||||
naccepted = 0;
|
naccepted = 0;
|
||||||
/* Otherwise, it is sure that the node could accept
|
/* Otherwise, it is sure that the node could accept
|
||||||
`naccepted' bytes input. */
|
'naccepted' bytes input. */
|
||||||
return naccepted;
|
return naccepted;
|
||||||
}
|
}
|
||||||
#endif /* RE_ENABLE_I18N */
|
#endif /* RE_ENABLE_I18N */
|
||||||
|
@ -2457,7 +2455,7 @@ find_recover_state (reg_errcode_t *err, re_match_context_t *mctx)
|
||||||
/* From the node set CUR_NODES, pick up the nodes whose types are
|
/* From the node set CUR_NODES, pick up the nodes whose types are
|
||||||
OP_OPEN_SUBEXP and which have corresponding back references in the regular
|
OP_OPEN_SUBEXP and which have corresponding back references in the regular
|
||||||
expression. And register them to use them later for evaluating the
|
expression. And register them to use them later for evaluating the
|
||||||
correspoding back references. */
|
corresponding back references. */
|
||||||
|
|
||||||
static reg_errcode_t
|
static reg_errcode_t
|
||||||
internal_function
|
internal_function
|
||||||
|
@ -2568,7 +2566,7 @@ transit_state_mb (re_match_context_t *mctx, re_dfastate_t *pstate)
|
||||||
if (naccepted == 0)
|
if (naccepted == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* The node can accepts `naccepted' bytes. */
|
/* The node can accepts 'naccepted' bytes. */
|
||||||
dest_idx = re_string_cur_idx (&mctx->input) + naccepted;
|
dest_idx = re_string_cur_idx (&mctx->input) + naccepted;
|
||||||
mctx->max_mb_elem_len = ((mctx->max_mb_elem_len < naccepted) ? naccepted
|
mctx->max_mb_elem_len = ((mctx->max_mb_elem_len < naccepted) ? naccepted
|
||||||
: mctx->max_mb_elem_len);
|
: mctx->max_mb_elem_len);
|
||||||
|
@ -2620,7 +2618,7 @@ transit_state_bkref (re_match_context_t *mctx, const re_node_set *nodes)
|
||||||
const re_token_t *node = dfa->nodes + node_idx;
|
const re_token_t *node = dfa->nodes + node_idx;
|
||||||
re_node_set *new_dest_nodes;
|
re_node_set *new_dest_nodes;
|
||||||
|
|
||||||
/* Check whether `node' is a backreference or not. */
|
/* Check whether 'node' is a backreference or not. */
|
||||||
if (node->type != OP_BACK_REF)
|
if (node->type != OP_BACK_REF)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -2632,14 +2630,14 @@ transit_state_bkref (re_match_context_t *mctx, const re_node_set *nodes)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* `node' is a backreference.
|
/* 'node' is a backreference.
|
||||||
Check the substring which the substring matched. */
|
Check the substring which the substring matched. */
|
||||||
bkc_idx = mctx->nbkref_ents;
|
bkc_idx = mctx->nbkref_ents;
|
||||||
err = get_subexp (mctx, node_idx, cur_str_idx);
|
err = get_subexp (mctx, node_idx, cur_str_idx);
|
||||||
if (BE (err != REG_NOERROR, 0))
|
if (BE (err != REG_NOERROR, 0))
|
||||||
goto free_return;
|
goto free_return;
|
||||||
|
|
||||||
/* And add the epsilon closures (which is `new_dest_nodes') of
|
/* And add the epsilon closures (which is 'new_dest_nodes') of
|
||||||
the backreference to appropriate state_log. */
|
the backreference to appropriate state_log. */
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
assert (dfa->nexts[node_idx] != REG_MISSING);
|
assert (dfa->nexts[node_idx] != REG_MISSING);
|
||||||
|
@ -2663,7 +2661,7 @@ transit_state_bkref (re_match_context_t *mctx, const re_node_set *nodes)
|
||||||
dest_state = mctx->state_log[dest_str_idx];
|
dest_state = mctx->state_log[dest_str_idx];
|
||||||
prev_nelem = ((mctx->state_log[cur_str_idx] == NULL) ? 0
|
prev_nelem = ((mctx->state_log[cur_str_idx] == NULL) ? 0
|
||||||
: mctx->state_log[cur_str_idx]->nodes.nelem);
|
: mctx->state_log[cur_str_idx]->nodes.nelem);
|
||||||
/* Add `new_dest_node' to state_log. */
|
/* Add 'new_dest_node' to state_log. */
|
||||||
if (dest_state == NULL)
|
if (dest_state == NULL)
|
||||||
{
|
{
|
||||||
mctx->state_log[dest_str_idx]
|
mctx->state_log[dest_str_idx]
|
||||||
|
@ -2815,7 +2813,7 @@ get_subexp (re_match_context_t *mctx, Idx bkref_node, Idx bkref_str_idx)
|
||||||
if (bkref_str_off >= mctx->input.len)
|
if (bkref_str_off >= mctx->input.len)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
err = extend_buffers (mctx);
|
err = extend_buffers (mctx, bkref_str_off + 1);
|
||||||
if (BE (err != REG_NOERROR, 0))
|
if (BE (err != REG_NOERROR, 0))
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
|
@ -2937,9 +2935,12 @@ check_arrival (re_match_context_t *mctx, state_array_t *path, Idx top_node,
|
||||||
{
|
{
|
||||||
re_dfastate_t **new_array;
|
re_dfastate_t **new_array;
|
||||||
Idx old_alloc = path->alloc;
|
Idx old_alloc = path->alloc;
|
||||||
Idx new_alloc = old_alloc + last_str + mctx->max_mb_elem_len + 1;
|
Idx incr_alloc = last_str + mctx->max_mb_elem_len + 1;
|
||||||
if (BE (new_alloc < old_alloc, 0)
|
Idx new_alloc;
|
||||||
|| BE (SIZE_MAX / sizeof (re_dfastate_t *) < new_alloc, 0))
|
if (BE (IDX_MAX - old_alloc < incr_alloc, 0))
|
||||||
|
return REG_ESPACE;
|
||||||
|
new_alloc = old_alloc + incr_alloc;
|
||||||
|
if (BE (SIZE_MAX / sizeof (re_dfastate_t *) < new_alloc, 0))
|
||||||
return REG_ESPACE;
|
return REG_ESPACE;
|
||||||
new_array = re_realloc (path->array, re_dfastate_t *, new_alloc);
|
new_array = re_realloc (path->array, re_dfastate_t *, new_alloc);
|
||||||
if (BE (new_array == NULL, 0))
|
if (BE (new_array == NULL, 0))
|
||||||
|
@ -3102,7 +3103,7 @@ check_arrival_add_next_nodes (re_match_context_t *mctx, Idx str_idx,
|
||||||
assert (!IS_EPSILON_NODE (type));
|
assert (!IS_EPSILON_NODE (type));
|
||||||
#endif
|
#endif
|
||||||
#ifdef RE_ENABLE_I18N
|
#ifdef RE_ENABLE_I18N
|
||||||
/* If the node may accept `multi byte'. */
|
/* If the node may accept "multi byte". */
|
||||||
if (dfa->nodes[cur_node].accept_mb)
|
if (dfa->nodes[cur_node].accept_mb)
|
||||||
{
|
{
|
||||||
naccepted = check_node_accept_bytes (dfa, cur_node, &mctx->input,
|
naccepted = check_node_accept_bytes (dfa, cur_node, &mctx->input,
|
||||||
|
@ -3359,7 +3360,7 @@ build_trtable (const re_dfa_t *dfa, re_dfastate_t *state)
|
||||||
bitset_word_t elem, mask;
|
bitset_word_t elem, mask;
|
||||||
bool dests_node_malloced = false;
|
bool dests_node_malloced = false;
|
||||||
bool dest_states_malloced = false;
|
bool dest_states_malloced = false;
|
||||||
Idx ndests; /* Number of the destination states from `state'. */
|
Idx ndests; /* Number of the destination states from 'state'. */
|
||||||
re_dfastate_t **trtable;
|
re_dfastate_t **trtable;
|
||||||
re_dfastate_t **dest_states = NULL, **dest_states_word, **dest_states_nl;
|
re_dfastate_t **dest_states = NULL, **dest_states_word, **dest_states_nl;
|
||||||
re_node_set follows, *dests_node;
|
re_node_set follows, *dests_node;
|
||||||
|
@ -3373,8 +3374,8 @@ build_trtable (const re_dfa_t *dfa, re_dfastate_t *state)
|
||||||
} *dests_alloc;
|
} *dests_alloc;
|
||||||
|
|
||||||
/* We build DFA states which corresponds to the destination nodes
|
/* We build DFA states which corresponds to the destination nodes
|
||||||
from `state'. `dests_node[i]' represents the nodes which i-th
|
from 'state'. 'dests_node[i]' represents the nodes which i-th
|
||||||
destination state contains, and `dests_ch[i]' represents the
|
destination state contains, and 'dests_ch[i]' represents the
|
||||||
characters which i-th destination state accepts. */
|
characters which i-th destination state accepts. */
|
||||||
if (__libc_use_alloca (sizeof (struct dests_alloc)))
|
if (__libc_use_alloca (sizeof (struct dests_alloc)))
|
||||||
dests_alloc = (struct dests_alloc *) alloca (sizeof (struct dests_alloc));
|
dests_alloc = (struct dests_alloc *) alloca (sizeof (struct dests_alloc));
|
||||||
|
@ -3388,20 +3389,23 @@ build_trtable (const re_dfa_t *dfa, re_dfastate_t *state)
|
||||||
dests_node = dests_alloc->dests_node;
|
dests_node = dests_alloc->dests_node;
|
||||||
dests_ch = dests_alloc->dests_ch;
|
dests_ch = dests_alloc->dests_ch;
|
||||||
|
|
||||||
/* Initialize transiton table. */
|
/* Initialize transition table. */
|
||||||
state->word_trtable = state->trtable = NULL;
|
state->word_trtable = state->trtable = NULL;
|
||||||
|
|
||||||
/* At first, group all nodes belonging to `state' into several
|
/* At first, group all nodes belonging to 'state' into several
|
||||||
destinations. */
|
destinations. */
|
||||||
ndests = group_nodes_into_DFAstates (dfa, state, dests_node, dests_ch);
|
ndests = group_nodes_into_DFAstates (dfa, state, dests_node, dests_ch);
|
||||||
if (BE (! REG_VALID_NONZERO_INDEX (ndests), 0))
|
if (BE (! REG_VALID_NONZERO_INDEX (ndests), 0))
|
||||||
{
|
{
|
||||||
if (dests_node_malloced)
|
if (dests_node_malloced)
|
||||||
free (dests_alloc);
|
free (dests_alloc);
|
||||||
|
/* Return false in case of an error, true otherwise. */
|
||||||
if (ndests == 0)
|
if (ndests == 0)
|
||||||
{
|
{
|
||||||
state->trtable = (re_dfastate_t **)
|
state->trtable = (re_dfastate_t **)
|
||||||
calloc (sizeof (re_dfastate_t *), SBC_MAX);
|
calloc (sizeof (re_dfastate_t *), SBC_MAX);
|
||||||
|
if (BE (state->trtable == NULL, 0))
|
||||||
|
return false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
@ -3591,13 +3595,13 @@ group_nodes_into_DFAstates (const re_dfa_t *dfa, const re_dfastate_t *state,
|
||||||
reg_errcode_t err;
|
reg_errcode_t err;
|
||||||
bool ok;
|
bool ok;
|
||||||
Idx i, j, k;
|
Idx i, j, k;
|
||||||
Idx ndests; /* Number of the destinations from `state'. */
|
Idx ndests; /* Number of the destinations from 'state'. */
|
||||||
bitset_t accepts; /* Characters a node can accept. */
|
bitset_t accepts; /* Characters a node can accept. */
|
||||||
const re_node_set *cur_nodes = &state->nodes;
|
const re_node_set *cur_nodes = &state->nodes;
|
||||||
bitset_empty (accepts);
|
bitset_empty (accepts);
|
||||||
ndests = 0;
|
ndests = 0;
|
||||||
|
|
||||||
/* For all the nodes belonging to `state', */
|
/* For all the nodes belonging to 'state', */
|
||||||
for (i = 0; i < cur_nodes->nelem; ++i)
|
for (i = 0; i < cur_nodes->nelem; ++i)
|
||||||
{
|
{
|
||||||
re_token_t *node = &dfa->nodes[cur_nodes->elems[i]];
|
re_token_t *node = &dfa->nodes[cur_nodes->elems[i]];
|
||||||
|
@ -3640,7 +3644,7 @@ group_nodes_into_DFAstates (const re_dfa_t *dfa, const re_dfastate_t *state,
|
||||||
else
|
else
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* Check the `accepts' and sift the characters which are not
|
/* Check the 'accepts' and sift the characters which are not
|
||||||
match it the context. */
|
match it the context. */
|
||||||
if (constraint)
|
if (constraint)
|
||||||
{
|
{
|
||||||
|
@ -3699,7 +3703,7 @@ group_nodes_into_DFAstates (const re_dfa_t *dfa, const re_dfastate_t *state,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Then divide `accepts' into DFA states, or create a new
|
/* Then divide 'accepts' into DFA states, or create a new
|
||||||
state. Above, we make sure that accepts is not empty. */
|
state. Above, we make sure that accepts is not empty. */
|
||||||
for (j = 0; j < ndests; ++j)
|
for (j = 0; j < ndests; ++j)
|
||||||
{
|
{
|
||||||
|
@ -3712,7 +3716,7 @@ group_nodes_into_DFAstates (const re_dfa_t *dfa, const re_dfastate_t *state,
|
||||||
if (type == CHARACTER && !bitset_contain (dests_ch[j], node->opr.c))
|
if (type == CHARACTER && !bitset_contain (dests_ch[j], node->opr.c))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* Enumerate the intersection set of this state and `accepts'. */
|
/* Enumerate the intersection set of this state and 'accepts'. */
|
||||||
has_intersec = 0;
|
has_intersec = 0;
|
||||||
for (k = 0; k < BITSET_WORDS; ++k)
|
for (k = 0; k < BITSET_WORDS; ++k)
|
||||||
has_intersec |= intersec[k] = accepts[k] & dests_ch[j][k];
|
has_intersec |= intersec[k] = accepts[k] & dests_ch[j][k];
|
||||||
|
@ -3720,7 +3724,7 @@ group_nodes_into_DFAstates (const re_dfa_t *dfa, const re_dfastate_t *state,
|
||||||
if (!has_intersec)
|
if (!has_intersec)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* Then check if this state is a subset of `accepts'. */
|
/* Then check if this state is a subset of 'accepts'. */
|
||||||
not_subset = not_consumed = 0;
|
not_subset = not_consumed = 0;
|
||||||
for (k = 0; k < BITSET_WORDS; ++k)
|
for (k = 0; k < BITSET_WORDS; ++k)
|
||||||
{
|
{
|
||||||
|
@ -3728,8 +3732,8 @@ group_nodes_into_DFAstates (const re_dfa_t *dfa, const re_dfastate_t *state,
|
||||||
not_consumed |= accepts[k] = accepts[k] & ~dests_ch[j][k];
|
not_consumed |= accepts[k] = accepts[k] & ~dests_ch[j][k];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If this state isn't a subset of `accepts', create a
|
/* If this state isn't a subset of 'accepts', create a
|
||||||
new group state, which has the `remains'. */
|
new group state, which has the 'remains'. */
|
||||||
if (not_subset)
|
if (not_subset)
|
||||||
{
|
{
|
||||||
bitset_copy (dests_ch[ndests], remains);
|
bitset_copy (dests_ch[ndests], remains);
|
||||||
|
@ -3768,7 +3772,7 @@ group_nodes_into_DFAstates (const re_dfa_t *dfa, const re_dfastate_t *state,
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef RE_ENABLE_I18N
|
#ifdef RE_ENABLE_I18N
|
||||||
/* Check how many bytes the node `dfa->nodes[node_idx]' accepts.
|
/* Check how many bytes the node 'dfa->nodes[node_idx]' accepts.
|
||||||
Return the number of the bytes the node accepts.
|
Return the number of the bytes the node accepts.
|
||||||
STR_IDX is the current index of the input string.
|
STR_IDX is the current index of the input string.
|
||||||
|
|
||||||
|
@ -3895,7 +3899,6 @@ check_node_accept_bytes (const re_dfa_t *dfa, Idx node_idx,
|
||||||
const int32_t *table, *indirect;
|
const int32_t *table, *indirect;
|
||||||
const unsigned char *weights, *extra;
|
const unsigned char *weights, *extra;
|
||||||
const char *collseqwc;
|
const char *collseqwc;
|
||||||
int32_t idx;
|
|
||||||
/* This #include defines a local function! */
|
/* This #include defines a local function! */
|
||||||
# include <locale/weight.h>
|
# include <locale/weight.h>
|
||||||
|
|
||||||
|
@ -3933,6 +3936,7 @@ check_node_accept_bytes (const re_dfa_t *dfa, Idx node_idx,
|
||||||
in_collseq = find_collation_sequence_value (pin, elem_len);
|
in_collseq = find_collation_sequence_value (pin, elem_len);
|
||||||
}
|
}
|
||||||
/* match with range expression? */
|
/* match with range expression? */
|
||||||
|
/* FIXME: Implement rational ranges here, too. */
|
||||||
for (i = 0; i < cset->nranges; ++i)
|
for (i = 0; i < cset->nranges; ++i)
|
||||||
if (cset->range_starts[i] <= in_collseq
|
if (cset->range_starts[i] <= in_collseq
|
||||||
&& in_collseq <= cset->range_ends[i])
|
&& in_collseq <= cset->range_ends[i])
|
||||||
|
@ -3953,7 +3957,7 @@ check_node_accept_bytes (const re_dfa_t *dfa, Idx node_idx,
|
||||||
_NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAMB);
|
_NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAMB);
|
||||||
indirect = (const int32_t *)
|
indirect = (const int32_t *)
|
||||||
_NL_CURRENT (LC_COLLATE, _NL_COLLATE_INDIRECTMB);
|
_NL_CURRENT (LC_COLLATE, _NL_COLLATE_INDIRECTMB);
|
||||||
int32_t idx = findidx (&cp);
|
int32_t idx = findidx (&cp, elem_len);
|
||||||
if (idx > 0)
|
if (idx > 0)
|
||||||
for (i = 0; i < cset->nequiv_classes; ++i)
|
for (i = 0; i < cset->nequiv_classes; ++i)
|
||||||
{
|
{
|
||||||
|
@ -3984,18 +3988,9 @@ check_node_accept_bytes (const re_dfa_t *dfa, Idx node_idx,
|
||||||
# endif /* _LIBC */
|
# endif /* _LIBC */
|
||||||
{
|
{
|
||||||
/* match with range expression? */
|
/* match with range expression? */
|
||||||
#if __GNUC__ >= 2 && ! (__STDC_VERSION__ < 199901L && __STRICT_ANSI__)
|
|
||||||
wchar_t cmp_buf[] = {L'\0', L'\0', wc, L'\0', L'\0', L'\0'};
|
|
||||||
#else
|
|
||||||
wchar_t cmp_buf[] = {L'\0', L'\0', L'\0', L'\0', L'\0', L'\0'};
|
|
||||||
cmp_buf[2] = wc;
|
|
||||||
#endif
|
|
||||||
for (i = 0; i < cset->nranges; ++i)
|
for (i = 0; i < cset->nranges; ++i)
|
||||||
{
|
{
|
||||||
cmp_buf[0] = cset->range_starts[i];
|
if (cset->range_starts[i] <= wc && wc <= cset->range_ends[i])
|
||||||
cmp_buf[4] = cset->range_ends[i];
|
|
||||||
if (wcscoll (cmp_buf, cmp_buf + 2) <= 0
|
|
||||||
&& wcscoll (cmp_buf + 2, cmp_buf + 4) <= 0)
|
|
||||||
{
|
{
|
||||||
match_len = char_len;
|
match_len = char_len;
|
||||||
goto check_node_accept_bytes_match;
|
goto check_node_accept_bytes_match;
|
||||||
|
@ -4065,7 +4060,7 @@ find_collation_sequence_value (const unsigned char *mbs, size_t mbs_len)
|
||||||
/* Skip the collation sequence value. */
|
/* Skip the collation sequence value. */
|
||||||
idx += sizeof (uint32_t);
|
idx += sizeof (uint32_t);
|
||||||
/* Skip the wide char sequence of the collating element. */
|
/* Skip the wide char sequence of the collating element. */
|
||||||
idx = idx + sizeof (uint32_t) * (extra[idx] + 1);
|
idx = idx + sizeof (uint32_t) * (*(int32_t *) (extra + idx) + 1);
|
||||||
/* If we found the entry, return the sequence value. */
|
/* If we found the entry, return the sequence value. */
|
||||||
if (found)
|
if (found)
|
||||||
return *(uint32_t *) (extra + idx);
|
return *(uint32_t *) (extra + idx);
|
||||||
|
@ -4133,17 +4128,20 @@ check_node_accept (const re_match_context_t *mctx, const re_token_t *node,
|
||||||
|
|
||||||
static reg_errcode_t
|
static reg_errcode_t
|
||||||
internal_function __attribute_warn_unused_result__
|
internal_function __attribute_warn_unused_result__
|
||||||
extend_buffers (re_match_context_t *mctx)
|
extend_buffers (re_match_context_t *mctx, int min_len)
|
||||||
{
|
{
|
||||||
reg_errcode_t ret;
|
reg_errcode_t ret;
|
||||||
re_string_t *pstr = &mctx->input;
|
re_string_t *pstr = &mctx->input;
|
||||||
|
|
||||||
/* Avoid overflow. */
|
/* Avoid overflow. */
|
||||||
if (BE (SIZE_MAX / 2 / sizeof (re_dfastate_t *) <= pstr->bufs_len, 0))
|
if (BE (MIN (IDX_MAX, SIZE_MAX / sizeof (re_dfastate_t *)) / 2
|
||||||
|
<= pstr->bufs_len, 0))
|
||||||
return REG_ESPACE;
|
return REG_ESPACE;
|
||||||
|
|
||||||
/* Double the lengthes of the buffers. */
|
/* Double the lengths of the buffers, but allocate at least MIN_LEN. */
|
||||||
ret = re_string_realloc_buffers (pstr, pstr->bufs_len * 2);
|
ret = re_string_realloc_buffers (pstr,
|
||||||
|
MAX (min_len,
|
||||||
|
MIN (pstr->len, pstr->bufs_len * 2)));
|
||||||
if (BE (ret != REG_NOERROR, 0))
|
if (BE (ret != REG_NOERROR, 0))
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
@ -4206,7 +4204,7 @@ match_ctx_init (re_match_context_t *mctx, int eflags, Idx n)
|
||||||
size_t max_object_size =
|
size_t max_object_size =
|
||||||
MAX (sizeof (struct re_backref_cache_entry),
|
MAX (sizeof (struct re_backref_cache_entry),
|
||||||
sizeof (re_sub_match_top_t *));
|
sizeof (re_sub_match_top_t *));
|
||||||
if (BE (SIZE_MAX / max_object_size < n, 0))
|
if (BE (MIN (IDX_MAX, SIZE_MAX / max_object_size) < n, 0))
|
||||||
return REG_ESPACE;
|
return REG_ESPACE;
|
||||||
|
|
||||||
mctx->bkref_ents = re_malloc (struct re_backref_cache_entry, n);
|
mctx->bkref_ents = re_malloc (struct re_backref_cache_entry, n);
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* size_max.h -- declare SIZE_MAX through system headers
|
/* size_max.h -- declare SIZE_MAX through system headers
|
||||||
Copyright (C) 2005-2006, 2009-2010 Free Software Foundation, Inc.
|
Copyright (C) 2005-2006, 2009-2013 Free Software Foundation, Inc.
|
||||||
Written by Simon Josefsson.
|
Written by Simon Josefsson.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
@ -13,8 +13,7 @@
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program; if not, write to the Free Software Foundation,
|
along with this program; if not, see <http://www.gnu.org/licenses/>. */
|
||||||
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
|
||||||
|
|
||||||
#ifndef GNULIB_SIZE_MAX_H
|
#ifndef GNULIB_SIZE_MAX_H
|
||||||
#define GNULIB_SIZE_MAX_H
|
#define GNULIB_SIZE_MAX_H
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* Pausing execution of the current thread.
|
/* Pausing execution of the current thread.
|
||||||
Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc.
|
Copyright (C) 2007, 2009-2013 Free Software Foundation, Inc.
|
||||||
Written by Bruno Haible <bruno@clisp.org>, 2007.
|
Written by Bruno Haible <bruno@clisp.org>, 2007.
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
@ -35,7 +35,7 @@ sleep (unsigned int seconds)
|
||||||
unsigned int remaining;
|
unsigned int remaining;
|
||||||
|
|
||||||
/* Sleep for 1 second many times, because
|
/* Sleep for 1 second many times, because
|
||||||
1. Sleep is not interruptiple by Ctrl-C,
|
1. Sleep is not interruptible by Ctrl-C,
|
||||||
2. we want to avoid arithmetic overflow while multiplying with 1000. */
|
2. we want to avoid arithmetic overflow while multiplying with 1000. */
|
||||||
for (remaining = seconds; remaining > 0; remaining--)
|
for (remaining = seconds; remaining > 0; remaining--)
|
||||||
Sleep (1000);
|
Sleep (1000);
|
||||||
|
@ -50,13 +50,14 @@ sleep (unsigned int seconds)
|
||||||
/* Guarantee unlimited sleep and a reasonable return value. Cygwin
|
/* Guarantee unlimited sleep and a reasonable return value. Cygwin
|
||||||
1.5.x rejects attempts to sleep more than 49.7 days (2**32
|
1.5.x rejects attempts to sleep more than 49.7 days (2**32
|
||||||
milliseconds), but uses uninitialized memory which results in a
|
milliseconds), but uses uninitialized memory which results in a
|
||||||
garbage answer. */
|
garbage answer. Similarly, Linux 2.6.9 with glibc 2.3.4 has a too
|
||||||
|
small return value when asked to sleep more than 24.85 days. */
|
||||||
unsigned int
|
unsigned int
|
||||||
rpl_sleep (unsigned int seconds)
|
rpl_sleep (unsigned int seconds)
|
||||||
{
|
{
|
||||||
/* This requires int larger than 16 bits. */
|
/* This requires int larger than 16 bits. */
|
||||||
verify (UINT_MAX / 49 / 24 / 60 / 60);
|
verify (UINT_MAX / 24 / 24 / 60 / 60);
|
||||||
const unsigned int limit = 49 * 24 * 60 * 60;
|
const unsigned int limit = 24 * 24 * 60 * 60;
|
||||||
while (limit < seconds)
|
while (limit < seconds)
|
||||||
{
|
{
|
||||||
unsigned int result;
|
unsigned int result;
|
||||||
|
|
90
grub-core/gnulib/stdalign.in.h
Normal file
90
grub-core/gnulib/stdalign.in.h
Normal file
|
@ -0,0 +1,90 @@
|
||||||
|
/* A substitute for ISO C11 <stdalign.h>.
|
||||||
|
|
||||||
|
Copyright 2011-2013 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, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
/* Written by Paul Eggert and Bruno Haible. */
|
||||||
|
|
||||||
|
#ifndef _GL_STDALIGN_H
|
||||||
|
#define _GL_STDALIGN_H
|
||||||
|
|
||||||
|
/* ISO C11 <stdalign.h> for platforms that lack it.
|
||||||
|
|
||||||
|
References:
|
||||||
|
ISO C11 (latest free draft
|
||||||
|
<http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf>)
|
||||||
|
sections 6.5.3.4, 6.7.5, 7.15.
|
||||||
|
C++11 (latest free draft
|
||||||
|
<http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf>)
|
||||||
|
section 18.10. */
|
||||||
|
|
||||||
|
/* alignof (TYPE), also known as _Alignof (TYPE), yields the alignment
|
||||||
|
requirement of a structure member (i.e., slot or field) that is of
|
||||||
|
type TYPE, as an integer constant expression.
|
||||||
|
|
||||||
|
This differs from GCC's __alignof__ operator, which can yield a
|
||||||
|
better-performing alignment for an object of that type. For
|
||||||
|
example, on x86 with GCC, __alignof__ (double) and __alignof__
|
||||||
|
(long long) are 8, whereas alignof (double) and alignof (long long)
|
||||||
|
are 4 unless the option '-malign-double' is used.
|
||||||
|
|
||||||
|
The result cannot be used as a value for an 'enum' constant, if you
|
||||||
|
want to be portable to HP-UX 10.20 cc and AIX 3.2.5 xlc. */
|
||||||
|
#include <stddef.h>
|
||||||
|
#if defined __cplusplus
|
||||||
|
template <class __t> struct __alignof_helper { char __a; __t __b; };
|
||||||
|
# define _Alignof(type) offsetof (__alignof_helper<type>, __b)
|
||||||
|
#else
|
||||||
|
# define _Alignof(type) offsetof (struct { char __a; type __b; }, __b)
|
||||||
|
#endif
|
||||||
|
#define alignof _Alignof
|
||||||
|
#define __alignof_is_defined 1
|
||||||
|
|
||||||
|
/* alignas (A), also known as _Alignas (A), aligns a variable or type
|
||||||
|
to the alignment A, where A is an integer constant expression. For
|
||||||
|
example:
|
||||||
|
|
||||||
|
int alignas (8) foo;
|
||||||
|
struct s { int a; int alignas (8) bar; };
|
||||||
|
|
||||||
|
aligns the address of FOO and the offset of BAR to be multiples of 8.
|
||||||
|
|
||||||
|
A should be a power of two that is at least the type's alignment
|
||||||
|
and at most the implementation's alignment limit. This limit is
|
||||||
|
2**28 on typical GNUish hosts, and 2**13 on MSVC. To be portable
|
||||||
|
to MSVC through at least version 10.0, A should be an integer
|
||||||
|
constant, as MSVC does not support expressions such as 1 << 3.
|
||||||
|
To be portable to Sun C 5.11, do not align auto variables to
|
||||||
|
anything stricter than their default alignment.
|
||||||
|
|
||||||
|
The following C11 requirements are not supported here:
|
||||||
|
|
||||||
|
- If A is zero, alignas has no effect.
|
||||||
|
- alignas can be used multiple times; the strictest one wins.
|
||||||
|
- alignas (TYPE) is equivalent to alignas (alignof (TYPE)).
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if __GNUC__ || __IBMC__ || __IBMCPP__ || 0x5110 <= __SUNPRO_C
|
||||||
|
# define _Alignas(a) __attribute__ ((__aligned__ (a)))
|
||||||
|
#elif 1300 <= _MSC_VER
|
||||||
|
# define _Alignas(a) __declspec (align (a))
|
||||||
|
#endif
|
||||||
|
#ifdef _Alignas
|
||||||
|
# define alignas _Alignas
|
||||||
|
# define __alignas_is_defined 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _GL_STDALIGN_H */
|
|
@ -1,4 +1,4 @@
|
||||||
/* Copyright (C) 2001-2003, 2006-2010 Free Software Foundation, Inc.
|
/* Copyright (C) 2001-2003, 2006-2013 Free Software Foundation, Inc.
|
||||||
Written by Bruno Haible <haible@clisp.cons.org>, 2001.
|
Written by Bruno Haible <haible@clisp.cons.org>, 2001.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
@ -12,8 +12,7 @@
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program; if not, write to the Free Software Foundation,
|
along with this program; if not, see <http://www.gnu.org/licenses/>. */
|
||||||
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
|
||||||
|
|
||||||
#ifndef _GL_STDBOOL_H
|
#ifndef _GL_STDBOOL_H
|
||||||
#define _GL_STDBOOL_H
|
#define _GL_STDBOOL_H
|
||||||
|
@ -67,24 +66,19 @@
|
||||||
# undef true
|
# undef true
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* For the sake of symbolic names in gdb, we define true and false as
|
#ifdef __cplusplus
|
||||||
enum constants, not only as macros.
|
# define _Bool bool
|
||||||
It is tempting to write
|
# define bool bool
|
||||||
typedef enum { false = 0, true = 1 } _Bool;
|
#else
|
||||||
so that gdb prints values of type 'bool' symbolically. But if we do
|
# if defined __BEOS__ && !defined __HAIKU__
|
||||||
this, values of type '_Bool' may promote to 'int' or 'unsigned int'
|
|
||||||
(see ISO C 99 6.7.2.2.(4)); however, '_Bool' must promote to 'int'
|
|
||||||
(see ISO C 99 6.3.1.1.(2)). So we add a negative value to the
|
|
||||||
enum; this ensures that '_Bool' promotes to 'int'. */
|
|
||||||
#if defined __cplusplus || (defined __BEOS__ && !defined __HAIKU__)
|
|
||||||
/* A compiler known to have 'bool'. */
|
/* A compiler known to have 'bool'. */
|
||||||
/* If the compiler already has both 'bool' and '_Bool', we can assume they
|
/* If the compiler already has both 'bool' and '_Bool', we can assume they
|
||||||
are the same types. */
|
are the same types. */
|
||||||
# if !@HAVE__BOOL@
|
# if !@HAVE__BOOL@
|
||||||
typedef bool _Bool;
|
typedef bool _Bool;
|
||||||
# endif
|
# endif
|
||||||
#else
|
# else
|
||||||
# if !defined __GNUC__
|
# if !defined __GNUC__
|
||||||
/* If @HAVE__BOOL@:
|
/* If @HAVE__BOOL@:
|
||||||
Some HP-UX cc and AIX IBM C compiler versions have compiler bugs when
|
Some HP-UX cc and AIX IBM C compiler versions have compiler bugs when
|
||||||
the built-in _Bool type is used. See
|
the built-in _Bool type is used. See
|
||||||
|
@ -104,19 +98,35 @@ typedef bool _Bool;
|
||||||
"Invalid enumerator. (badenum)" with HP-UX cc on Tru64.
|
"Invalid enumerator. (badenum)" with HP-UX cc on Tru64.
|
||||||
The only benefit of the enum, debuggability, is not important
|
The only benefit of the enum, debuggability, is not important
|
||||||
with these compilers. So use 'signed char' and no enum. */
|
with these compilers. So use 'signed char' and no enum. */
|
||||||
# define _Bool signed char
|
# define _Bool signed char
|
||||||
# else
|
# else
|
||||||
/* With this compiler, trust the _Bool type if the compiler has it. */
|
/* With this compiler, trust the _Bool type if the compiler has it. */
|
||||||
# if !@HAVE__BOOL@
|
# if !@HAVE__BOOL@
|
||||||
|
/* For the sake of symbolic names in gdb, define true and false as
|
||||||
|
enum constants, not only as macros.
|
||||||
|
It is tempting to write
|
||||||
|
typedef enum { false = 0, true = 1 } _Bool;
|
||||||
|
so that gdb prints values of type 'bool' symbolically. But then
|
||||||
|
values of type '_Bool' might promote to 'int' or 'unsigned int'
|
||||||
|
(see ISO C 99 6.7.2.2.(4)); however, '_Bool' must promote to 'int'
|
||||||
|
(see ISO C 99 6.3.1.1.(2)). So add a negative value to the
|
||||||
|
enum; this ensures that '_Bool' promotes to 'int'. */
|
||||||
typedef enum { _Bool_must_promote_to_int = -1, false = 0, true = 1 } _Bool;
|
typedef enum { _Bool_must_promote_to_int = -1, false = 0, true = 1 } _Bool;
|
||||||
|
# endif
|
||||||
# endif
|
# endif
|
||||||
# endif
|
# endif
|
||||||
|
# define bool _Bool
|
||||||
#endif
|
#endif
|
||||||
#define bool _Bool
|
|
||||||
|
|
||||||
/* The other macros must be usable in preprocessor directives. */
|
/* The other macros must be usable in preprocessor directives. */
|
||||||
#define false 0
|
#ifdef __cplusplus
|
||||||
#define true 1
|
# define false false
|
||||||
|
# define true true
|
||||||
|
#else
|
||||||
|
# define false 0
|
||||||
|
# define true 1
|
||||||
|
#endif
|
||||||
|
|
||||||
#define __bool_true_false_are_defined 1
|
#define __bool_true_false_are_defined 1
|
||||||
|
|
||||||
#endif /* _GL_STDBOOL_H */
|
#endif /* _GL_STDBOOL_H */
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* A substitute for POSIX 2008 <stddef.h>, for platforms that have issues.
|
/* A substitute for POSIX 2008 <stddef.h>, for platforms that have issues.
|
||||||
|
|
||||||
Copyright (C) 2009, 2010 Free Software Foundation, Inc.
|
Copyright (C) 2009-2013 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -13,8 +13,7 @@
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program; if not, write to the Free Software Foundation,
|
along with this program; if not, see <http://www.gnu.org/licenses/>. */
|
||||||
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
|
||||||
|
|
||||||
/* Written by Eric Blake. */
|
/* Written by Eric Blake. */
|
||||||
|
|
||||||
|
@ -26,6 +25,7 @@
|
||||||
#if __GNUC__ >= 3
|
#if __GNUC__ >= 3
|
||||||
@PRAGMA_SYSTEM_HEADER@
|
@PRAGMA_SYSTEM_HEADER@
|
||||||
#endif
|
#endif
|
||||||
|
@PRAGMA_COLUMNS@
|
||||||
|
|
||||||
#if defined __need_wchar_t || defined __need_size_t \
|
#if defined __need_wchar_t || defined __need_size_t \
|
||||||
|| defined __need_ptrdiff_t || defined __need_NULL \
|
|| defined __need_ptrdiff_t || defined __need_NULL \
|
||||||
|
@ -37,9 +37,9 @@
|
||||||
remember if special invocation has ever been used to obtain wint_t,
|
remember if special invocation has ever been used to obtain wint_t,
|
||||||
in which case we need to clean up NULL yet again. */
|
in which case we need to clean up NULL yet again. */
|
||||||
|
|
||||||
# if !(defined _GL_STDDEF_H && defined _GL_STDDEF_WINT_T)
|
# if !(defined _@GUARD_PREFIX@_STDDEF_H && defined _GL_STDDEF_WINT_T)
|
||||||
# ifdef __need_wint_t
|
# ifdef __need_wint_t
|
||||||
# undef _GL_STDDEF_H
|
# undef _@GUARD_PREFIX@_STDDEF_H
|
||||||
# define _GL_STDDEF_WINT_T
|
# define _GL_STDDEF_WINT_T
|
||||||
# endif
|
# endif
|
||||||
# @INCLUDE_NEXT@ @NEXT_STDDEF_H@
|
# @INCLUDE_NEXT@ @NEXT_STDDEF_H@
|
||||||
|
@ -48,14 +48,14 @@
|
||||||
#else
|
#else
|
||||||
/* Normal invocation convention. */
|
/* Normal invocation convention. */
|
||||||
|
|
||||||
# ifndef _GL_STDDEF_H
|
# ifndef _@GUARD_PREFIX@_STDDEF_H
|
||||||
|
|
||||||
/* The include_next requires a split double-inclusion guard. */
|
/* The include_next requires a split double-inclusion guard. */
|
||||||
|
|
||||||
# @INCLUDE_NEXT@ @NEXT_STDDEF_H@
|
# @INCLUDE_NEXT@ @NEXT_STDDEF_H@
|
||||||
|
|
||||||
# ifndef _GL_STDDEF_H
|
# ifndef _@GUARD_PREFIX@_STDDEF_H
|
||||||
# define _GL_STDDEF_H
|
# define _@GUARD_PREFIX@_STDDEF_H
|
||||||
|
|
||||||
/* On NetBSD 5.0, the definition of NULL lacks proper parentheses. */
|
/* On NetBSD 5.0, the definition of NULL lacks proper parentheses. */
|
||||||
#if @REPLACE_NULL@
|
#if @REPLACE_NULL@
|
||||||
|
@ -81,6 +81,6 @@
|
||||||
# define wchar_t int
|
# define wchar_t int
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# endif /* _GL_STDDEF_H */
|
# endif /* _@GUARD_PREFIX@_STDDEF_H */
|
||||||
# endif /* _GL_STDDEF_H */
|
# endif /* _@GUARD_PREFIX@_STDDEF_H */
|
||||||
#endif /* __need_XXX */
|
#endif /* __need_XXX */
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* Copyright (C) 2001-2002, 2004-2010 Free Software Foundation, Inc.
|
/* Copyright (C) 2001-2002, 2004-2013 Free Software Foundation, Inc.
|
||||||
Written by Paul Eggert, Bruno Haible, Sam Steingold, Peter Burwood.
|
Written by Paul Eggert, Bruno Haible, Sam Steingold, Peter Burwood.
|
||||||
This file is part of gnulib.
|
This file is part of gnulib.
|
||||||
|
|
||||||
|
@ -13,19 +13,19 @@
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program; if not, write to the Free Software Foundation,
|
along with this program; if not, see <http://www.gnu.org/licenses/>. */
|
||||||
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ISO C 99 <stdint.h> for platforms that lack it.
|
* ISO C 99 <stdint.h> for platforms that lack it.
|
||||||
* <http://www.opengroup.org/susv3xbd/stdint.h.html>
|
* <http://www.opengroup.org/susv3xbd/stdint.h.html>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _GL_STDINT_H
|
#ifndef _@GUARD_PREFIX@_STDINT_H
|
||||||
|
|
||||||
#if __GNUC__ >= 3
|
#if __GNUC__ >= 3
|
||||||
@PRAGMA_SYSTEM_HEADER@
|
@PRAGMA_SYSTEM_HEADER@
|
||||||
#endif
|
#endif
|
||||||
|
@PRAGMA_COLUMNS@
|
||||||
|
|
||||||
/* When including a system file that in turn includes <inttypes.h>,
|
/* When including a system file that in turn includes <inttypes.h>,
|
||||||
use the system <inttypes.h>, not our substitute. This avoids
|
use the system <inttypes.h>, not our substitute. This avoids
|
||||||
|
@ -33,6 +33,16 @@
|
||||||
<inttypes.h>. */
|
<inttypes.h>. */
|
||||||
#define _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H
|
#define _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H
|
||||||
|
|
||||||
|
/* On Android (Bionic libc), <sys/types.h> includes this file before
|
||||||
|
having defined 'time_t'. Therefore in this case avoid including
|
||||||
|
other system header files; just include the system's <stdint.h>.
|
||||||
|
Ideally we should test __BIONIC__ here, but it is only defined after
|
||||||
|
<sys/cdefs.h> has been included; hence test __ANDROID__ instead. */
|
||||||
|
#if defined __ANDROID__ \
|
||||||
|
&& defined _SYS_TYPES_H_ && !defined __need_size_t
|
||||||
|
# @INCLUDE_NEXT@ @NEXT_STDINT_H@
|
||||||
|
#else
|
||||||
|
|
||||||
/* Get those types that are already defined in other system include
|
/* Get those types that are already defined in other system include
|
||||||
files, so that we can "#define int8_t signed char" below without
|
files, so that we can "#define int8_t signed char" below without
|
||||||
worrying about a later system include file containing a "typedef
|
worrying about a later system include file containing a "typedef
|
||||||
|
@ -48,28 +58,40 @@
|
||||||
diagnostics. */
|
diagnostics. */
|
||||||
# define __STDINT_H__
|
# define __STDINT_H__
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
|
/* Some pre-C++11 <stdint.h> implementations need this. */
|
||||||
|
# ifdef __cplusplus
|
||||||
|
# ifndef __STDC_CONSTANT_MACROS
|
||||||
|
# define __STDC_CONSTANT_MACROS 1
|
||||||
|
# endif
|
||||||
|
# ifndef __STDC_LIMIT_MACROS
|
||||||
|
# define __STDC_LIMIT_MACROS 1
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
|
||||||
/* Other systems may have an incomplete or buggy <stdint.h>.
|
/* Other systems may have an incomplete or buggy <stdint.h>.
|
||||||
Include it before <inttypes.h>, since any "#include <stdint.h>"
|
Include it before <inttypes.h>, since any "#include <stdint.h>"
|
||||||
in <inttypes.h> would reinclude us, skipping our contents because
|
in <inttypes.h> would reinclude us, skipping our contents because
|
||||||
_GL_STDINT_H is defined.
|
_@GUARD_PREFIX@_STDINT_H is defined.
|
||||||
The include_next requires a split double-inclusion guard. */
|
The include_next requires a split double-inclusion guard. */
|
||||||
# @INCLUDE_NEXT@ @NEXT_STDINT_H@
|
# @INCLUDE_NEXT@ @NEXT_STDINT_H@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if ! defined _GL_STDINT_H && ! defined _GL_JUST_INCLUDE_SYSTEM_STDINT_H
|
#if ! defined _@GUARD_PREFIX@_STDINT_H && ! defined _GL_JUST_INCLUDE_SYSTEM_STDINT_H
|
||||||
#define _GL_STDINT_H
|
#define _@GUARD_PREFIX@_STDINT_H
|
||||||
|
|
||||||
/* <sys/types.h> defines some of the stdint.h types as well, on glibc,
|
/* <sys/types.h> defines some of the stdint.h types as well, on glibc,
|
||||||
IRIX 6.5, and OpenBSD 3.8 (via <machine/types.h>).
|
IRIX 6.5, and OpenBSD 3.8 (via <machine/types.h>).
|
||||||
AIX 5.2 <sys/types.h> isn't needed and causes troubles.
|
AIX 5.2 <sys/types.h> isn't needed and causes troubles.
|
||||||
MacOS X 10.4.6 <sys/types.h> includes <stdint.h> (which is us), but
|
Mac OS X 10.4.6 <sys/types.h> includes <stdint.h> (which is us), but
|
||||||
relies on the system <stdint.h> definitions, so include
|
relies on the system <stdint.h> definitions, so include
|
||||||
<sys/types.h> after @NEXT_STDINT_H@. */
|
<sys/types.h> after @NEXT_STDINT_H@. */
|
||||||
#if @HAVE_SYS_TYPES_H@ && ! defined _AIX
|
#if @HAVE_SYS_TYPES_H@ && ! defined _AIX
|
||||||
# include <sys/types.h>
|
# include <sys/types.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Get LONG_MIN, LONG_MAX, ULONG_MAX. */
|
/* Get SCHAR_MIN, SCHAR_MAX, UCHAR_MAX, INT_MIN, INT_MAX,
|
||||||
|
LONG_MIN, LONG_MAX, ULONG_MAX. */
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
|
|
||||||
#if @HAVE_INTTYPES_H@
|
#if @HAVE_INTTYPES_H@
|
||||||
|
@ -92,7 +114,7 @@
|
||||||
|
|
||||||
#undef _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H
|
#undef _GL_JUST_INCLUDE_SYSTEM_INTTYPES_H
|
||||||
|
|
||||||
/* Minimum and maximum values for a integer type under the usual assumption.
|
/* Minimum and maximum values for an integer type under the usual assumption.
|
||||||
Return an unspecified value if BITS == 0, adding a check to pacify
|
Return an unspecified value if BITS == 0, adding a check to pacify
|
||||||
picky compilers. */
|
picky compilers. */
|
||||||
|
|
||||||
|
@ -107,6 +129,8 @@
|
||||||
warnings in the signed case. */ \
|
warnings in the signed case. */ \
|
||||||
((((zero) + 1) << ((bits) ? (bits) - 1 - (signed) : 0)) - 1) * 2 + 1)
|
((((zero) + 1) << ((bits) ? (bits) - 1 - (signed) : 0)) - 1) * 2 + 1)
|
||||||
|
|
||||||
|
#if !GNULIB_defined_stdint_types
|
||||||
|
|
||||||
/* 7.18.1.1. Exact-width integer types */
|
/* 7.18.1.1. Exact-width integer types */
|
||||||
|
|
||||||
/* Here we assume a standard architecture where the hardware integer
|
/* Here we assume a standard architecture where the hardware integer
|
||||||
|
@ -133,40 +157,54 @@ typedef unsigned int gl_uint32_t;
|
||||||
#define int32_t gl_int32_t
|
#define int32_t gl_int32_t
|
||||||
#define uint32_t gl_uint32_t
|
#define uint32_t gl_uint32_t
|
||||||
|
|
||||||
|
/* If the system defines INT64_MAX, assume int64_t works. That way,
|
||||||
|
if the underlying platform defines int64_t to be a 64-bit long long
|
||||||
|
int, the code below won't mistakenly define it to be a 64-bit long
|
||||||
|
int, which would mess up C++ name mangling. We must use #ifdef
|
||||||
|
rather than #if, to avoid an error with HP-UX 10.20 cc. */
|
||||||
|
|
||||||
|
#ifdef INT64_MAX
|
||||||
|
# define GL_INT64_T
|
||||||
|
#else
|
||||||
/* Do not undefine int64_t if gnulib is not being used with 64-bit
|
/* Do not undefine int64_t if gnulib is not being used with 64-bit
|
||||||
types, since otherwise it breaks platforms like Tandem/NSK. */
|
types, since otherwise it breaks platforms like Tandem/NSK. */
|
||||||
#if LONG_MAX >> 31 >> 31 == 1
|
# if LONG_MAX >> 31 >> 31 == 1
|
||||||
# undef int64_t
|
# undef int64_t
|
||||||
typedef long int gl_int64_t;
|
typedef long int gl_int64_t;
|
||||||
# define int64_t gl_int64_t
|
# define int64_t gl_int64_t
|
||||||
# define GL_INT64_T
|
# define GL_INT64_T
|
||||||
#elif defined _MSC_VER
|
# elif defined _MSC_VER
|
||||||
# undef int64_t
|
# undef int64_t
|
||||||
typedef __int64 gl_int64_t;
|
typedef __int64 gl_int64_t;
|
||||||
# define int64_t gl_int64_t
|
# define int64_t gl_int64_t
|
||||||
# define GL_INT64_T
|
# define GL_INT64_T
|
||||||
#elif @HAVE_LONG_LONG_INT@
|
# elif @HAVE_LONG_LONG_INT@
|
||||||
# undef int64_t
|
# undef int64_t
|
||||||
typedef long long int gl_int64_t;
|
typedef long long int gl_int64_t;
|
||||||
# define int64_t gl_int64_t
|
# define int64_t gl_int64_t
|
||||||
# define GL_INT64_T
|
# define GL_INT64_T
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if ULONG_MAX >> 31 >> 31 >> 1 == 1
|
#ifdef UINT64_MAX
|
||||||
# undef uint64_t
|
# define GL_UINT64_T
|
||||||
|
#else
|
||||||
|
# if ULONG_MAX >> 31 >> 31 >> 1 == 1
|
||||||
|
# undef uint64_t
|
||||||
typedef unsigned long int gl_uint64_t;
|
typedef unsigned long int gl_uint64_t;
|
||||||
# define uint64_t gl_uint64_t
|
# define uint64_t gl_uint64_t
|
||||||
# define GL_UINT64_T
|
# define GL_UINT64_T
|
||||||
#elif defined _MSC_VER
|
# elif defined _MSC_VER
|
||||||
# undef uint64_t
|
# undef uint64_t
|
||||||
typedef unsigned __int64 gl_uint64_t;
|
typedef unsigned __int64 gl_uint64_t;
|
||||||
# define uint64_t gl_uint64_t
|
# define uint64_t gl_uint64_t
|
||||||
# define GL_UINT64_T
|
# define GL_UINT64_T
|
||||||
#elif @HAVE_UNSIGNED_LONG_LONG_INT@
|
# elif @HAVE_UNSIGNED_LONG_LONG_INT@
|
||||||
# undef uint64_t
|
# undef uint64_t
|
||||||
typedef unsigned long long int gl_uint64_t;
|
typedef unsigned long long int gl_uint64_t;
|
||||||
# define uint64_t gl_uint64_t
|
# define uint64_t gl_uint64_t
|
||||||
# define GL_UINT64_T
|
# define GL_UINT64_T
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Avoid collision with Solaris 2.5.1 <pthread.h> etc. */
|
/* Avoid collision with Solaris 2.5.1 <pthread.h> etc. */
|
||||||
|
@ -209,8 +247,9 @@ typedef unsigned long long int gl_uint64_t;
|
||||||
|
|
||||||
/* Here we assume a standard architecture where the hardware integer
|
/* Here we assume a standard architecture where the hardware integer
|
||||||
types have 8, 16, 32, optionally 64 bits. Therefore the fastN_t types
|
types have 8, 16, 32, optionally 64 bits. Therefore the fastN_t types
|
||||||
are taken from the same list of types. Assume that 'long int'
|
are taken from the same list of types. The following code normally
|
||||||
is fast enough for all narrower integers. */
|
uses types consistent with glibc, as that lessens the chance of
|
||||||
|
incompatibility with older GNU hosts. */
|
||||||
|
|
||||||
#undef int_fast8_t
|
#undef int_fast8_t
|
||||||
#undef uint_fast8_t
|
#undef uint_fast8_t
|
||||||
|
@ -220,12 +259,21 @@ typedef unsigned long long int gl_uint64_t;
|
||||||
#undef uint_fast32_t
|
#undef uint_fast32_t
|
||||||
#undef int_fast64_t
|
#undef int_fast64_t
|
||||||
#undef uint_fast64_t
|
#undef uint_fast64_t
|
||||||
typedef long int gl_int_fast8_t;
|
typedef signed char gl_int_fast8_t;
|
||||||
typedef unsigned long int gl_uint_fast8_t;
|
typedef unsigned char gl_uint_fast8_t;
|
||||||
typedef long int gl_int_fast16_t;
|
|
||||||
typedef unsigned long int gl_uint_fast16_t;
|
#ifdef __sun
|
||||||
|
/* Define types compatible with SunOS 5.10, so that code compiled under
|
||||||
|
earlier SunOS versions works with code compiled under SunOS 5.10. */
|
||||||
|
typedef int gl_int_fast32_t;
|
||||||
|
typedef unsigned int gl_uint_fast32_t;
|
||||||
|
#else
|
||||||
typedef long int gl_int_fast32_t;
|
typedef long int gl_int_fast32_t;
|
||||||
typedef unsigned long int gl_uint_fast32_t;
|
typedef unsigned long int gl_uint_fast32_t;
|
||||||
|
#endif
|
||||||
|
typedef gl_int_fast32_t gl_int_fast16_t;
|
||||||
|
typedef gl_uint_fast32_t gl_uint_fast16_t;
|
||||||
|
|
||||||
#define int_fast8_t gl_int_fast8_t
|
#define int_fast8_t gl_int_fast8_t
|
||||||
#define uint_fast8_t gl_uint_fast8_t
|
#define uint_fast8_t gl_uint_fast8_t
|
||||||
#define int_fast16_t gl_int_fast16_t
|
#define int_fast16_t gl_int_fast16_t
|
||||||
|
@ -253,37 +301,49 @@ typedef unsigned long int gl_uintptr_t;
|
||||||
/* Note: These types are compiler dependent. It may be unwise to use them in
|
/* Note: These types are compiler dependent. It may be unwise to use them in
|
||||||
public header files. */
|
public header files. */
|
||||||
|
|
||||||
#undef intmax_t
|
/* If the system defines INTMAX_MAX, assume that intmax_t works, and
|
||||||
#if @HAVE_LONG_LONG_INT@ && LONG_MAX >> 30 == 1
|
similarly for UINTMAX_MAX and uintmax_t. This avoids problems with
|
||||||
|
assuming one type where another is used by the system. */
|
||||||
|
|
||||||
|
#ifndef INTMAX_MAX
|
||||||
|
# undef INTMAX_C
|
||||||
|
# undef intmax_t
|
||||||
|
# if @HAVE_LONG_LONG_INT@ && LONG_MAX >> 30 == 1
|
||||||
typedef long long int gl_intmax_t;
|
typedef long long int gl_intmax_t;
|
||||||
# define intmax_t gl_intmax_t
|
# define intmax_t gl_intmax_t
|
||||||
#elif defined GL_INT64_T
|
# elif defined GL_INT64_T
|
||||||
# define intmax_t int64_t
|
# define intmax_t int64_t
|
||||||
#else
|
# else
|
||||||
typedef long int gl_intmax_t;
|
typedef long int gl_intmax_t;
|
||||||
# define intmax_t gl_intmax_t
|
# define intmax_t gl_intmax_t
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#undef uintmax_t
|
#ifndef UINTMAX_MAX
|
||||||
#if @HAVE_UNSIGNED_LONG_LONG_INT@ && ULONG_MAX >> 31 == 1
|
# undef UINTMAX_C
|
||||||
|
# undef uintmax_t
|
||||||
|
# if @HAVE_UNSIGNED_LONG_LONG_INT@ && ULONG_MAX >> 31 == 1
|
||||||
typedef unsigned long long int gl_uintmax_t;
|
typedef unsigned long long int gl_uintmax_t;
|
||||||
# define uintmax_t gl_uintmax_t
|
# define uintmax_t gl_uintmax_t
|
||||||
#elif defined GL_UINT64_T
|
# elif defined GL_UINT64_T
|
||||||
# define uintmax_t uint64_t
|
# define uintmax_t uint64_t
|
||||||
#else
|
# else
|
||||||
typedef unsigned long int gl_uintmax_t;
|
typedef unsigned long int gl_uintmax_t;
|
||||||
# define uintmax_t gl_uintmax_t
|
# define uintmax_t gl_uintmax_t
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Verify that intmax_t and uintmax_t have the same size. Too much code
|
/* Verify that intmax_t and uintmax_t have the same size. Too much code
|
||||||
breaks if this is not the case. If this check fails, the reason is likely
|
breaks if this is not the case. If this check fails, the reason is likely
|
||||||
to be found in the autoconf macros. */
|
to be found in the autoconf macros. */
|
||||||
typedef int _verify_intmax_size[2 * (sizeof (intmax_t) == sizeof (uintmax_t)) - 1];
|
typedef int _verify_intmax_size[sizeof (intmax_t) == sizeof (uintmax_t)
|
||||||
|
? 1 : -1];
|
||||||
|
|
||||||
|
#define GNULIB_defined_stdint_types 1
|
||||||
|
#endif /* !GNULIB_defined_stdint_types */
|
||||||
|
|
||||||
/* 7.18.2. Limits of specified-width integer types */
|
/* 7.18.2. Limits of specified-width integer types */
|
||||||
|
|
||||||
#if ! defined __cplusplus || defined __STDC_LIMIT_MACROS
|
|
||||||
|
|
||||||
/* 7.18.2.1. Limits of exact-width integer types */
|
/* 7.18.2.1. Limits of exact-width integer types */
|
||||||
|
|
||||||
/* Here we assume a standard architecture where the hardware integer
|
/* Here we assume a standard architecture where the hardware integer
|
||||||
|
@ -310,17 +370,14 @@ typedef int _verify_intmax_size[2 * (sizeof (intmax_t) == sizeof (uintmax_t)) -
|
||||||
#define INT32_MAX 2147483647
|
#define INT32_MAX 2147483647
|
||||||
#define UINT32_MAX 4294967295U
|
#define UINT32_MAX 4294967295U
|
||||||
|
|
||||||
#undef INT64_MIN
|
#if defined GL_INT64_T && ! defined INT64_MAX
|
||||||
#undef INT64_MAX
|
|
||||||
#ifdef GL_INT64_T
|
|
||||||
/* Prefer (- INTMAX_C (1) << 63) over (~ INT64_MAX) because SunPRO C 5.0
|
/* Prefer (- INTMAX_C (1) << 63) over (~ INT64_MAX) because SunPRO C 5.0
|
||||||
evaluates the latter incorrectly in preprocessor expressions. */
|
evaluates the latter incorrectly in preprocessor expressions. */
|
||||||
# define INT64_MIN (- INTMAX_C (1) << 63)
|
# define INT64_MIN (- INTMAX_C (1) << 63)
|
||||||
# define INT64_MAX INTMAX_C (9223372036854775807)
|
# define INT64_MAX INTMAX_C (9223372036854775807)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#undef UINT64_MAX
|
#if defined GL_UINT64_T && ! defined UINT64_MAX
|
||||||
#ifdef GL_UINT64_T
|
|
||||||
# define UINT64_MAX UINTMAX_C (18446744073709551615)
|
# define UINT64_MAX UINTMAX_C (18446744073709551615)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -372,23 +429,29 @@ typedef int _verify_intmax_size[2 * (sizeof (intmax_t) == sizeof (uintmax_t)) -
|
||||||
#undef INT_FAST8_MIN
|
#undef INT_FAST8_MIN
|
||||||
#undef INT_FAST8_MAX
|
#undef INT_FAST8_MAX
|
||||||
#undef UINT_FAST8_MAX
|
#undef UINT_FAST8_MAX
|
||||||
#define INT_FAST8_MIN LONG_MIN
|
#define INT_FAST8_MIN SCHAR_MIN
|
||||||
#define INT_FAST8_MAX LONG_MAX
|
#define INT_FAST8_MAX SCHAR_MAX
|
||||||
#define UINT_FAST8_MAX ULONG_MAX
|
#define UINT_FAST8_MAX UCHAR_MAX
|
||||||
|
|
||||||
#undef INT_FAST16_MIN
|
#undef INT_FAST16_MIN
|
||||||
#undef INT_FAST16_MAX
|
#undef INT_FAST16_MAX
|
||||||
#undef UINT_FAST16_MAX
|
#undef UINT_FAST16_MAX
|
||||||
#define INT_FAST16_MIN LONG_MIN
|
#define INT_FAST16_MIN INT_FAST32_MIN
|
||||||
#define INT_FAST16_MAX LONG_MAX
|
#define INT_FAST16_MAX INT_FAST32_MAX
|
||||||
#define UINT_FAST16_MAX ULONG_MAX
|
#define UINT_FAST16_MAX UINT_FAST32_MAX
|
||||||
|
|
||||||
#undef INT_FAST32_MIN
|
#undef INT_FAST32_MIN
|
||||||
#undef INT_FAST32_MAX
|
#undef INT_FAST32_MAX
|
||||||
#undef UINT_FAST32_MAX
|
#undef UINT_FAST32_MAX
|
||||||
#define INT_FAST32_MIN LONG_MIN
|
#ifdef __sun
|
||||||
#define INT_FAST32_MAX LONG_MAX
|
# define INT_FAST32_MIN INT_MIN
|
||||||
#define UINT_FAST32_MAX ULONG_MAX
|
# define INT_FAST32_MAX INT_MAX
|
||||||
|
# define UINT_FAST32_MAX UINT_MAX
|
||||||
|
#else
|
||||||
|
# define INT_FAST32_MIN LONG_MIN
|
||||||
|
# define INT_FAST32_MAX LONG_MAX
|
||||||
|
# define UINT_FAST32_MAX ULONG_MAX
|
||||||
|
#endif
|
||||||
|
|
||||||
#undef INT_FAST64_MIN
|
#undef INT_FAST64_MIN
|
||||||
#undef INT_FAST64_MAX
|
#undef INT_FAST64_MAX
|
||||||
|
@ -413,21 +476,23 @@ typedef int _verify_intmax_size[2 * (sizeof (intmax_t) == sizeof (uintmax_t)) -
|
||||||
|
|
||||||
/* 7.18.2.5. Limits of greatest-width integer types */
|
/* 7.18.2.5. Limits of greatest-width integer types */
|
||||||
|
|
||||||
#undef INTMAX_MIN
|
#ifndef INTMAX_MAX
|
||||||
#undef INTMAX_MAX
|
# undef INTMAX_MIN
|
||||||
#ifdef INT64_MAX
|
# ifdef INT64_MAX
|
||||||
# define INTMAX_MIN INT64_MIN
|
# define INTMAX_MIN INT64_MIN
|
||||||
# define INTMAX_MAX INT64_MAX
|
# define INTMAX_MAX INT64_MAX
|
||||||
#else
|
# else
|
||||||
# define INTMAX_MIN INT32_MIN
|
# define INTMAX_MIN INT32_MIN
|
||||||
# define INTMAX_MAX INT32_MAX
|
# define INTMAX_MAX INT32_MAX
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#undef UINTMAX_MAX
|
#ifndef UINTMAX_MAX
|
||||||
#ifdef UINT64_MAX
|
# ifdef UINT64_MAX
|
||||||
# define UINTMAX_MAX UINT64_MAX
|
# define UINTMAX_MAX UINT64_MAX
|
||||||
#else
|
# else
|
||||||
# define UINTMAX_MAX UINT32_MAX
|
# define UINTMAX_MAX UINT32_MAX
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* 7.18.3. Limits of other integer types */
|
/* 7.18.3. Limits of other integer types */
|
||||||
|
@ -475,10 +540,16 @@ typedef int _verify_intmax_size[2 * (sizeof (intmax_t) == sizeof (uintmax_t)) -
|
||||||
|
|
||||||
/* wchar_t limits */
|
/* wchar_t limits */
|
||||||
/* Get WCHAR_MIN, WCHAR_MAX.
|
/* Get WCHAR_MIN, WCHAR_MAX.
|
||||||
This include is not on the top, above, because on OSF/1 4.0 we have a sequence of nested
|
This include is not on the top, above, because on OSF/1 4.0 we have a
|
||||||
includes <wchar.h> -> <stdio.h> -> <getopt.h> -> <stdlib.h>, and the latter includes
|
sequence of nested includes
|
||||||
|
<wchar.h> -> <stdio.h> -> <getopt.h> -> <stdlib.h>, and the latter includes
|
||||||
<stdint.h> and assumes its types are already defined. */
|
<stdint.h> and assumes its types are already defined. */
|
||||||
#if ! (defined WCHAR_MIN && defined WCHAR_MAX)
|
#if @HAVE_WCHAR_H@ && ! (defined WCHAR_MIN && defined WCHAR_MAX)
|
||||||
|
/* BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
|
||||||
|
included before <wchar.h>. */
|
||||||
|
# include <stddef.h>
|
||||||
|
# include <stdio.h>
|
||||||
|
# include <time.h>
|
||||||
# define _GL_JUST_INCLUDE_SYSTEM_WCHAR_H
|
# define _GL_JUST_INCLUDE_SYSTEM_WCHAR_H
|
||||||
# include <wchar.h>
|
# include <wchar.h>
|
||||||
# undef _GL_JUST_INCLUDE_SYSTEM_WCHAR_H
|
# undef _GL_JUST_INCLUDE_SYSTEM_WCHAR_H
|
||||||
|
@ -498,12 +569,8 @@ typedef int _verify_intmax_size[2 * (sizeof (intmax_t) == sizeof (uintmax_t)) -
|
||||||
#define WINT_MAX \
|
#define WINT_MAX \
|
||||||
_STDINT_MAX (@HAVE_SIGNED_WINT_T@, @BITSIZEOF_WINT_T@, 0@WINT_T_SUFFIX@)
|
_STDINT_MAX (@HAVE_SIGNED_WINT_T@, @BITSIZEOF_WINT_T@, 0@WINT_T_SUFFIX@)
|
||||||
|
|
||||||
#endif /* !defined __cplusplus || defined __STDC_LIMIT_MACROS */
|
|
||||||
|
|
||||||
/* 7.18.4. Macros for integer constants */
|
/* 7.18.4. Macros for integer constants */
|
||||||
|
|
||||||
#if ! defined __cplusplus || defined __STDC_CONSTANT_MACROS
|
|
||||||
|
|
||||||
/* 7.18.4.1. Macros for minimum-width integer constants */
|
/* 7.18.4.1. Macros for minimum-width integer constants */
|
||||||
/* According to ISO C 99 Technical Corrigendum 1 */
|
/* According to ISO C 99 Technical Corrigendum 1 */
|
||||||
|
|
||||||
|
@ -544,25 +611,26 @@ typedef int _verify_intmax_size[2 * (sizeof (intmax_t) == sizeof (uintmax_t)) -
|
||||||
|
|
||||||
/* 7.18.4.2. Macros for greatest-width integer constants */
|
/* 7.18.4.2. Macros for greatest-width integer constants */
|
||||||
|
|
||||||
#undef INTMAX_C
|
#ifndef INTMAX_C
|
||||||
#if @HAVE_LONG_LONG_INT@ && LONG_MAX >> 30 == 1
|
# if @HAVE_LONG_LONG_INT@ && LONG_MAX >> 30 == 1
|
||||||
# define INTMAX_C(x) x##LL
|
# define INTMAX_C(x) x##LL
|
||||||
#elif defined GL_INT64_T
|
# elif defined GL_INT64_T
|
||||||
# define INTMAX_C(x) INT64_C(x)
|
# define INTMAX_C(x) INT64_C(x)
|
||||||
#else
|
# else
|
||||||
# define INTMAX_C(x) x##L
|
# define INTMAX_C(x) x##L
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#undef UINTMAX_C
|
#ifndef UINTMAX_C
|
||||||
#if @HAVE_UNSIGNED_LONG_LONG_INT@ && ULONG_MAX >> 31 == 1
|
# if @HAVE_UNSIGNED_LONG_LONG_INT@ && ULONG_MAX >> 31 == 1
|
||||||
# define UINTMAX_C(x) x##ULL
|
# define UINTMAX_C(x) x##ULL
|
||||||
#elif defined GL_UINT64_T
|
# elif defined GL_UINT64_T
|
||||||
# define UINTMAX_C(x) UINT64_C(x)
|
# define UINTMAX_C(x) UINT64_C(x)
|
||||||
#else
|
# else
|
||||||
# define UINTMAX_C(x) x##UL
|
# define UINTMAX_C(x) x##UL
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* !defined __cplusplus || defined __STDC_CONSTANT_MACROS */
|
#endif /* _@GUARD_PREFIX@_STDINT_H */
|
||||||
|
#endif /* !(defined __ANDROID__ && ...) */
|
||||||
#endif /* _GL_STDINT_H */
|
#endif /* !defined _@GUARD_PREFIX@_STDINT_H && !defined _GL_JUST_INCLUDE_SYSTEM_STDINT_H */
|
||||||
#endif /* !defined _GL_STDINT_H && !defined _GL_JUST_INCLUDE_SYSTEM_STDINT_H */
|
|
||||||
|
|
|
@ -1,148 +0,0 @@
|
||||||
/* POSIX compatible FILE stream write function.
|
|
||||||
Copyright (C) 2008-2010 Free Software Foundation, Inc.
|
|
||||||
Written by Bruno Haible <bruno@clisp.org>, 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 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/>. */
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
/* Specification. */
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
/* Replace these functions only if module 'sigpipe' is requested. */
|
|
||||||
#if GNULIB_SIGPIPE
|
|
||||||
|
|
||||||
/* On native Windows platforms, SIGPIPE does not exist. When write() is
|
|
||||||
called on a pipe with no readers, WriteFile() fails with error
|
|
||||||
GetLastError() = ERROR_NO_DATA, and write() in consequence fails with
|
|
||||||
error EINVAL. This write() function is at the basis of the function
|
|
||||||
which flushes the buffer of a FILE stream. */
|
|
||||||
|
|
||||||
# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
|
|
||||||
|
|
||||||
# include <errno.h>
|
|
||||||
# include <signal.h>
|
|
||||||
# include <io.h>
|
|
||||||
|
|
||||||
# define WIN32_LEAN_AND_MEAN /* avoid including junk */
|
|
||||||
# include <windows.h>
|
|
||||||
|
|
||||||
# define CALL_WITH_SIGPIPE_EMULATION(RETTYPE, EXPRESSION, FAILED) \
|
|
||||||
if (ferror (stream)) \
|
|
||||||
return (EXPRESSION); \
|
|
||||||
else \
|
|
||||||
{ \
|
|
||||||
RETTYPE ret; \
|
|
||||||
SetLastError (0); \
|
|
||||||
ret = (EXPRESSION); \
|
|
||||||
if (FAILED && GetLastError () == ERROR_NO_DATA && ferror (stream)) \
|
|
||||||
{ \
|
|
||||||
int fd = fileno (stream); \
|
|
||||||
if (fd >= 0 \
|
|
||||||
&& GetFileType ((HANDLE) _get_osfhandle (fd)) == FILE_TYPE_PIPE)\
|
|
||||||
{ \
|
|
||||||
/* Try to raise signal SIGPIPE. */ \
|
|
||||||
raise (SIGPIPE); \
|
|
||||||
/* If it is currently blocked or ignored, change errno from \
|
|
||||||
EINVAL to EPIPE. */ \
|
|
||||||
errno = EPIPE; \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
return ret; \
|
|
||||||
}
|
|
||||||
|
|
||||||
# if !REPLACE_PRINTF_POSIX /* avoid collision with printf.c */
|
|
||||||
int
|
|
||||||
printf (const char *format, ...)
|
|
||||||
{
|
|
||||||
int retval;
|
|
||||||
va_list args;
|
|
||||||
|
|
||||||
va_start (args, format);
|
|
||||||
retval = vfprintf (stdout, format, args);
|
|
||||||
va_end (args);
|
|
||||||
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# if !REPLACE_FPRINTF_POSIX /* avoid collision with fprintf.c */
|
|
||||||
int
|
|
||||||
fprintf (FILE *stream, const char *format, ...)
|
|
||||||
{
|
|
||||||
int retval;
|
|
||||||
va_list args;
|
|
||||||
|
|
||||||
va_start (args, format);
|
|
||||||
retval = vfprintf (stream, format, args);
|
|
||||||
va_end (args);
|
|
||||||
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# if !REPLACE_VPRINTF_POSIX /* avoid collision with vprintf.c */
|
|
||||||
int
|
|
||||||
vprintf (const char *format, va_list args)
|
|
||||||
{
|
|
||||||
return vfprintf (stdout, format, args);
|
|
||||||
}
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# if !REPLACE_VFPRINTF_POSIX /* avoid collision with vfprintf.c */
|
|
||||||
int
|
|
||||||
vfprintf (FILE *stream, const char *format, va_list args)
|
|
||||||
#undef vfprintf
|
|
||||||
{
|
|
||||||
CALL_WITH_SIGPIPE_EMULATION (int, vfprintf (stream, format, args), ret == EOF)
|
|
||||||
}
|
|
||||||
# endif
|
|
||||||
|
|
||||||
int
|
|
||||||
putchar (int c)
|
|
||||||
{
|
|
||||||
return fputc (c, stdout);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
fputc (int c, FILE *stream)
|
|
||||||
#undef fputc
|
|
||||||
{
|
|
||||||
CALL_WITH_SIGPIPE_EMULATION (int, fputc (c, stream), ret == EOF)
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
fputs (const char *string, FILE *stream)
|
|
||||||
#undef fputs
|
|
||||||
{
|
|
||||||
CALL_WITH_SIGPIPE_EMULATION (int, fputs (string, stream), ret == EOF)
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
puts (const char *string)
|
|
||||||
#undef puts
|
|
||||||
{
|
|
||||||
FILE *stream = stdout;
|
|
||||||
CALL_WITH_SIGPIPE_EMULATION (int, puts (string), ret == EOF)
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t
|
|
||||||
fwrite (const void *ptr, size_t s, size_t n, FILE *stream)
|
|
||||||
#undef fwrite
|
|
||||||
{
|
|
||||||
CALL_WITH_SIGPIPE_EMULATION (size_t, fwrite (ptr, s, n, stream), ret < n)
|
|
||||||
}
|
|
||||||
|
|
||||||
# endif
|
|
||||||
#endif
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* A GNU-like <stdio.h>.
|
/* A GNU-like <stdio.h>.
|
||||||
|
|
||||||
Copyright (C) 2004, 2007-2010 Free Software Foundation, Inc.
|
Copyright (C) 2004, 2007-2013 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -13,47 +13,104 @@
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program; if not, write to the Free Software Foundation,
|
along with this program; if not, see <http://www.gnu.org/licenses/>. */
|
||||||
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
|
||||||
|
|
||||||
#if __GNUC__ >= 3
|
#if __GNUC__ >= 3
|
||||||
@PRAGMA_SYSTEM_HEADER@
|
@PRAGMA_SYSTEM_HEADER@
|
||||||
#endif
|
#endif
|
||||||
|
@PRAGMA_COLUMNS@
|
||||||
|
|
||||||
#if defined __need_FILE || defined __need___FILE
|
#if defined __need_FILE || defined __need___FILE || defined _GL_ALREADY_INCLUDING_STDIO_H
|
||||||
/* Special invocation convention inside glibc header files. */
|
/* Special invocation convention:
|
||||||
|
- Inside glibc header files.
|
||||||
|
- On OSF/1 5.1 we have a sequence of nested includes
|
||||||
|
<stdio.h> -> <getopt.h> -> <ctype.h> -> <sys/localedef.h> ->
|
||||||
|
<sys/lc_core.h> -> <nl_types.h> -> <mesg.h> -> <stdio.h>.
|
||||||
|
In this situation, the functions are not yet declared, therefore we cannot
|
||||||
|
provide the C++ aliases. */
|
||||||
|
|
||||||
#@INCLUDE_NEXT@ @NEXT_STDIO_H@
|
#@INCLUDE_NEXT@ @NEXT_STDIO_H@
|
||||||
|
|
||||||
#else
|
#else
|
||||||
/* Normal invocation convention. */
|
/* Normal invocation convention. */
|
||||||
|
|
||||||
#ifndef _GL_STDIO_H
|
#ifndef _@GUARD_PREFIX@_STDIO_H
|
||||||
|
|
||||||
|
#define _GL_ALREADY_INCLUDING_STDIO_H
|
||||||
|
|
||||||
/* The include_next requires a split double-inclusion guard. */
|
/* The include_next requires a split double-inclusion guard. */
|
||||||
#@INCLUDE_NEXT@ @NEXT_STDIO_H@
|
#@INCLUDE_NEXT@ @NEXT_STDIO_H@
|
||||||
|
|
||||||
#ifndef _GL_STDIO_H
|
#undef _GL_ALREADY_INCLUDING_STDIO_H
|
||||||
#define _GL_STDIO_H
|
|
||||||
|
#ifndef _@GUARD_PREFIX@_STDIO_H
|
||||||
|
#define _@GUARD_PREFIX@_STDIO_H
|
||||||
|
|
||||||
/* Get va_list. Needed on many systems, including glibc 2.8. */
|
/* Get va_list. Needed on many systems, including glibc 2.8. */
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
/* Get off_t and ssize_t. Needed on many systems, including glibc 2.8. */
|
/* Get off_t and ssize_t. Needed on many systems, including glibc 2.8
|
||||||
|
and eglibc 2.11.2.
|
||||||
|
May also define off_t to a 64-bit type on native Windows. */
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
#ifndef __attribute__
|
|
||||||
/* The __attribute__ feature is available in gcc versions 2.5 and later.
|
/* The __attribute__ feature is available in gcc versions 2.5 and later.
|
||||||
The __-protected variants of the attributes 'format' and 'printf' are
|
The __-protected variants of the attributes 'format' and 'printf' are
|
||||||
accepted by gcc versions 2.6.4 (effectively 2.7) and later.
|
accepted by gcc versions 2.6.4 (effectively 2.7) and later.
|
||||||
We enable __attribute__ only if these are supported too, because
|
We enable _GL_ATTRIBUTE_FORMAT only if these are supported too, because
|
||||||
gnulib and libintl do '#define printf __printf__' when they override
|
gnulib and libintl do '#define printf __printf__' when they override
|
||||||
the 'printf' function. */
|
the 'printf' function. */
|
||||||
# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
|
#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
|
||||||
# define __attribute__(Spec) /* empty */
|
# define _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec))
|
||||||
# endif
|
#else
|
||||||
|
# define _GL_ATTRIBUTE_FORMAT(spec) /* empty */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* _GL_ATTRIBUTE_FORMAT_PRINTF
|
||||||
|
indicates to GCC that the function takes a format string and arguments,
|
||||||
|
where the format string directives are the ones standardized by ISO C99
|
||||||
|
and POSIX. */
|
||||||
|
#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)
|
||||||
|
# define _GL_ATTRIBUTE_FORMAT_PRINTF(formatstring_parameter, first_argument) \
|
||||||
|
_GL_ATTRIBUTE_FORMAT ((__gnu_printf__, formatstring_parameter, first_argument))
|
||||||
|
#else
|
||||||
|
# define _GL_ATTRIBUTE_FORMAT_PRINTF(formatstring_parameter, first_argument) \
|
||||||
|
_GL_ATTRIBUTE_FORMAT ((__printf__, formatstring_parameter, first_argument))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM is like _GL_ATTRIBUTE_FORMAT_PRINTF,
|
||||||
|
except that it indicates to GCC that the supported format string directives
|
||||||
|
are the ones of the system printf(), rather than the ones standardized by
|
||||||
|
ISO C99 and POSIX. */
|
||||||
|
#define _GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM(formatstring_parameter, first_argument) \
|
||||||
|
_GL_ATTRIBUTE_FORMAT ((__printf__, formatstring_parameter, first_argument))
|
||||||
|
|
||||||
|
/* _GL_ATTRIBUTE_FORMAT_SCANF
|
||||||
|
indicates to GCC that the function takes a format string and arguments,
|
||||||
|
where the format string directives are the ones standardized by ISO C99
|
||||||
|
and POSIX. */
|
||||||
|
#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)
|
||||||
|
# define _GL_ATTRIBUTE_FORMAT_SCANF(formatstring_parameter, first_argument) \
|
||||||
|
_GL_ATTRIBUTE_FORMAT ((__gnu_scanf__, formatstring_parameter, first_argument))
|
||||||
|
#else
|
||||||
|
# define _GL_ATTRIBUTE_FORMAT_SCANF(formatstring_parameter, first_argument) \
|
||||||
|
_GL_ATTRIBUTE_FORMAT ((__scanf__, formatstring_parameter, first_argument))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM is like _GL_ATTRIBUTE_FORMAT_SCANF,
|
||||||
|
except that it indicates to GCC that the supported format string directives
|
||||||
|
are the ones of the system scanf(), rather than the ones standardized by
|
||||||
|
ISO C99 and POSIX. */
|
||||||
|
#define _GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM(formatstring_parameter, first_argument) \
|
||||||
|
_GL_ATTRIBUTE_FORMAT ((__scanf__, formatstring_parameter, first_argument))
|
||||||
|
|
||||||
|
/* Solaris 10 declares renameat in <unistd.h>, not in <stdio.h>. */
|
||||||
|
/* But in any case avoid namespace pollution on glibc systems. */
|
||||||
|
#if (@GNULIB_RENAMEAT@ || defined GNULIB_POSIXCHECK) && defined __sun \
|
||||||
|
&& ! defined __GLIBC__
|
||||||
|
# include <unistd.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
@ -74,13 +131,13 @@
|
||||||
# define dprintf rpl_dprintf
|
# define dprintf rpl_dprintf
|
||||||
# endif
|
# endif
|
||||||
_GL_FUNCDECL_RPL (dprintf, int, (int fd, const char *format, ...)
|
_GL_FUNCDECL_RPL (dprintf, int, (int fd, const char *format, ...)
|
||||||
__attribute__ ((__format__ (__printf__, 2, 3)))
|
_GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
|
||||||
_GL_ARG_NONNULL ((2)));
|
_GL_ARG_NONNULL ((2)));
|
||||||
_GL_CXXALIAS_RPL (dprintf, int, (int fd, const char *format, ...));
|
_GL_CXXALIAS_RPL (dprintf, int, (int fd, const char *format, ...));
|
||||||
# else
|
# else
|
||||||
# if !@HAVE_DPRINTF@
|
# if !@HAVE_DPRINTF@
|
||||||
_GL_FUNCDECL_SYS (dprintf, int, (int fd, const char *format, ...)
|
_GL_FUNCDECL_SYS (dprintf, int, (int fd, const char *format, ...)
|
||||||
__attribute__ ((__format__ (__printf__, 2, 3)))
|
_GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
|
||||||
_GL_ARG_NONNULL ((2)));
|
_GL_ARG_NONNULL ((2)));
|
||||||
# endif
|
# endif
|
||||||
_GL_CXXALIAS_SYS (dprintf, int, (int fd, const char *format, ...));
|
_GL_CXXALIAS_SYS (dprintf, int, (int fd, const char *format, ...));
|
||||||
|
@ -113,6 +170,26 @@ _GL_WARN_ON_USE (fclose, "fclose is not always POSIX compliant - "
|
||||||
"use gnulib module fclose for portable POSIX compliance");
|
"use gnulib module fclose for portable POSIX compliance");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if @GNULIB_FDOPEN@
|
||||||
|
# if @REPLACE_FDOPEN@
|
||||||
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
|
# undef fdopen
|
||||||
|
# define fdopen rpl_fdopen
|
||||||
|
# endif
|
||||||
|
_GL_FUNCDECL_RPL (fdopen, FILE *, (int fd, const char *mode)
|
||||||
|
_GL_ARG_NONNULL ((2)));
|
||||||
|
_GL_CXXALIAS_RPL (fdopen, FILE *, (int fd, const char *mode));
|
||||||
|
# else
|
||||||
|
_GL_CXXALIAS_SYS (fdopen, FILE *, (int fd, const char *mode));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIASWARN (fdopen);
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef fdopen
|
||||||
|
/* Assume fdopen is always declared. */
|
||||||
|
_GL_WARN_ON_USE (fdopen, "fdopen on native Windows platforms is not POSIX compliant - "
|
||||||
|
"use gnulib module fdopen for portability");
|
||||||
|
#endif
|
||||||
|
|
||||||
#if @GNULIB_FFLUSH@
|
#if @GNULIB_FFLUSH@
|
||||||
/* Flush all pending data on STREAM according to POSIX rules. Both
|
/* Flush all pending data on STREAM according to POSIX rules. Both
|
||||||
output and seekable input streams are supported.
|
output and seekable input streams are supported.
|
||||||
|
@ -137,12 +214,33 @@ _GL_WARN_ON_USE (fflush, "fflush is not always POSIX compliant - "
|
||||||
"use gnulib module fflush for portable POSIX compliance");
|
"use gnulib module fflush for portable POSIX compliance");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* It is very rare that the developer ever has full control of stdin,
|
#if @GNULIB_FGETC@
|
||||||
so any use of gets warrants an unconditional warning; besides, C11
|
# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@
|
||||||
removed it. */
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
#undef gets
|
# undef fgetc
|
||||||
#if HAVE_RAW_DECL_GETS
|
# define fgetc rpl_fgetc
|
||||||
_GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");
|
# endif
|
||||||
|
_GL_FUNCDECL_RPL (fgetc, int, (FILE *stream) _GL_ARG_NONNULL ((1)));
|
||||||
|
_GL_CXXALIAS_RPL (fgetc, int, (FILE *stream));
|
||||||
|
# else
|
||||||
|
_GL_CXXALIAS_SYS (fgetc, int, (FILE *stream));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIASWARN (fgetc);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if @GNULIB_FGETS@
|
||||||
|
# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@
|
||||||
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
|
# undef fgets
|
||||||
|
# define fgets rpl_fgets
|
||||||
|
# endif
|
||||||
|
_GL_FUNCDECL_RPL (fgets, char *, (char *s, int n, FILE *stream)
|
||||||
|
_GL_ARG_NONNULL ((1, 3)));
|
||||||
|
_GL_CXXALIAS_RPL (fgets, char *, (char *s, int n, FILE *stream));
|
||||||
|
# else
|
||||||
|
_GL_CXXALIAS_SYS (fgets, char *, (char *s, int n, FILE *stream));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIASWARN (fgets);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if @GNULIB_FOPEN@
|
#if @GNULIB_FOPEN@
|
||||||
|
@ -161,20 +259,26 @@ _GL_CXXALIASWARN (fopen);
|
||||||
#elif defined GNULIB_POSIXCHECK
|
#elif defined GNULIB_POSIXCHECK
|
||||||
# undef fopen
|
# undef fopen
|
||||||
/* Assume fopen is always declared. */
|
/* Assume fopen is always declared. */
|
||||||
_GL_WARN_ON_USE (fopen, "fopen on Win32 platforms is not POSIX compatible - "
|
_GL_WARN_ON_USE (fopen, "fopen on native Windows platforms is not POSIX compliant - "
|
||||||
"use gnulib module fopen for portability");
|
"use gnulib module fopen for portability");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if @GNULIB_FPRINTF_POSIX@ || @GNULIB_FPRINTF@
|
#if @GNULIB_FPRINTF_POSIX@ || @GNULIB_FPRINTF@
|
||||||
# if (@GNULIB_FPRINTF_POSIX@ && @REPLACE_FPRINTF@) \
|
# if (@GNULIB_FPRINTF_POSIX@ && @REPLACE_FPRINTF@) \
|
||||||
|| (@GNULIB_FPRINTF@ && @REPLACE_STDIO_WRITE_FUNCS@ && @GNULIB_STDIO_H_SIGPIPE@)
|
|| (@GNULIB_FPRINTF@ && @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@))
|
||||||
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
# define fprintf rpl_fprintf
|
# define fprintf rpl_fprintf
|
||||||
# endif
|
# endif
|
||||||
# define GNULIB_overrides_fprintf 1
|
# define GNULIB_overrides_fprintf 1
|
||||||
|
# if @GNULIB_FPRINTF_POSIX@ || @GNULIB_VFPRINTF_POSIX@
|
||||||
_GL_FUNCDECL_RPL (fprintf, int, (FILE *fp, const char *format, ...)
|
_GL_FUNCDECL_RPL (fprintf, int, (FILE *fp, const char *format, ...)
|
||||||
__attribute__ ((__format__ (__printf__, 2, 3)))
|
_GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
|
||||||
_GL_ARG_NONNULL ((1, 2)));
|
_GL_ARG_NONNULL ((1, 2)));
|
||||||
|
# else
|
||||||
|
_GL_FUNCDECL_RPL (fprintf, int, (FILE *fp, const char *format, ...)
|
||||||
|
_GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (2, 3)
|
||||||
|
_GL_ARG_NONNULL ((1, 2)));
|
||||||
|
# endif
|
||||||
_GL_CXXALIAS_RPL (fprintf, int, (FILE *fp, const char *format, ...));
|
_GL_CXXALIAS_RPL (fprintf, int, (FILE *fp, const char *format, ...));
|
||||||
# else
|
# else
|
||||||
_GL_CXXALIAS_SYS (fprintf, int, (FILE *fp, const char *format, ...));
|
_GL_CXXALIAS_SYS (fprintf, int, (FILE *fp, const char *format, ...));
|
||||||
|
@ -220,7 +324,7 @@ _GL_WARN_ON_USE (fpurge, "fpurge is not always present - "
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if @GNULIB_FPUTC@
|
#if @GNULIB_FPUTC@
|
||||||
# if @REPLACE_STDIO_WRITE_FUNCS@ && @GNULIB_STDIO_H_SIGPIPE@
|
# if @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@)
|
||||||
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
# undef fputc
|
# undef fputc
|
||||||
# define fputc rpl_fputc
|
# define fputc rpl_fputc
|
||||||
|
@ -234,7 +338,7 @@ _GL_CXXALIASWARN (fputc);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if @GNULIB_FPUTS@
|
#if @GNULIB_FPUTS@
|
||||||
# if @REPLACE_STDIO_WRITE_FUNCS@ && @GNULIB_STDIO_H_SIGPIPE@
|
# if @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@)
|
||||||
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
# undef fputs
|
# undef fputs
|
||||||
# define fputs rpl_fputs
|
# define fputs rpl_fputs
|
||||||
|
@ -248,6 +352,21 @@ _GL_CXXALIAS_SYS (fputs, int, (const char *string, FILE *stream));
|
||||||
_GL_CXXALIASWARN (fputs);
|
_GL_CXXALIASWARN (fputs);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if @GNULIB_FREAD@
|
||||||
|
# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@
|
||||||
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
|
# undef fread
|
||||||
|
# define fread rpl_fread
|
||||||
|
# endif
|
||||||
|
_GL_FUNCDECL_RPL (fread, size_t, (void *ptr, size_t s, size_t n, FILE *stream)
|
||||||
|
_GL_ARG_NONNULL ((4)));
|
||||||
|
_GL_CXXALIAS_RPL (fread, size_t, (void *ptr, size_t s, size_t n, FILE *stream));
|
||||||
|
# else
|
||||||
|
_GL_CXXALIAS_SYS (fread, size_t, (void *ptr, size_t s, size_t n, FILE *stream));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIASWARN (fread);
|
||||||
|
#endif
|
||||||
|
|
||||||
#if @GNULIB_FREOPEN@
|
#if @GNULIB_FREOPEN@
|
||||||
# if @REPLACE_FREOPEN@
|
# if @REPLACE_FREOPEN@
|
||||||
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
|
@ -267,10 +386,27 @@ _GL_CXXALIASWARN (freopen);
|
||||||
#elif defined GNULIB_POSIXCHECK
|
#elif defined GNULIB_POSIXCHECK
|
||||||
# undef freopen
|
# undef freopen
|
||||||
/* Assume freopen is always declared. */
|
/* Assume freopen is always declared. */
|
||||||
_GL_WARN_ON_USE (freopen, "freopen on Win32 platforms is not POSIX compatible - "
|
_GL_WARN_ON_USE (freopen,
|
||||||
|
"freopen on native Windows platforms is not POSIX compliant - "
|
||||||
"use gnulib module freopen for portability");
|
"use gnulib module freopen for portability");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if @GNULIB_FSCANF@
|
||||||
|
# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@
|
||||||
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
|
# undef fscanf
|
||||||
|
# define fscanf rpl_fscanf
|
||||||
|
# endif
|
||||||
|
_GL_FUNCDECL_RPL (fscanf, int, (FILE *stream, const char *format, ...)
|
||||||
|
_GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (2, 3)
|
||||||
|
_GL_ARG_NONNULL ((1, 2)));
|
||||||
|
_GL_CXXALIAS_RPL (fscanf, int, (FILE *stream, const char *format, ...));
|
||||||
|
# else
|
||||||
|
_GL_CXXALIAS_SYS (fscanf, int, (FILE *stream, const char *format, ...));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIASWARN (fscanf);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* Set up the following warnings, based on which modules are in use.
|
/* Set up the following warnings, based on which modules are in use.
|
||||||
GNU Coding Standards discourage the use of fseek, since it imposes
|
GNU Coding Standards discourage the use of fseek, since it imposes
|
||||||
|
@ -338,29 +474,13 @@ _GL_FUNCDECL_RPL (fseeko, int, (FILE *fp, off_t offset, int whence)
|
||||||
_GL_ARG_NONNULL ((1)));
|
_GL_ARG_NONNULL ((1)));
|
||||||
_GL_CXXALIAS_RPL (fseeko, int, (FILE *fp, off_t offset, int whence));
|
_GL_CXXALIAS_RPL (fseeko, int, (FILE *fp, off_t offset, int whence));
|
||||||
# else
|
# else
|
||||||
# if ! @HAVE_FSEEKO@
|
# if ! @HAVE_DECL_FSEEKO@
|
||||||
_GL_FUNCDECL_SYS (fseeko, int, (FILE *fp, off_t offset, int whence)
|
_GL_FUNCDECL_SYS (fseeko, int, (FILE *fp, off_t offset, int whence)
|
||||||
_GL_ARG_NONNULL ((1)));
|
_GL_ARG_NONNULL ((1)));
|
||||||
# endif
|
# endif
|
||||||
_GL_CXXALIAS_SYS (fseeko, int, (FILE *fp, off_t offset, int whence));
|
_GL_CXXALIAS_SYS (fseeko, int, (FILE *fp, off_t offset, int whence));
|
||||||
# endif
|
# endif
|
||||||
_GL_CXXALIASWARN (fseeko);
|
_GL_CXXALIASWARN (fseeko);
|
||||||
# if (@REPLACE_FSEEKO@ || !@HAVE_FSEEKO@) && !@GNULIB_FSEEK@
|
|
||||||
/* Provide an fseek function that is consistent with fseeko. */
|
|
||||||
/* In order to avoid that fseek gets defined as a macro here, the
|
|
||||||
developer can request the 'fseek' module. */
|
|
||||||
# undef fseek
|
|
||||||
# define fseek rpl_fseek
|
|
||||||
static inline int _GL_ARG_NONNULL ((1))
|
|
||||||
rpl_fseek (FILE *fp, long offset, int whence)
|
|
||||||
{
|
|
||||||
# if @REPLACE_FSEEKO@
|
|
||||||
return rpl_fseeko (fp, offset, whence);
|
|
||||||
# else
|
|
||||||
return fseeko (fp, offset, whence);
|
|
||||||
# endif
|
|
||||||
}
|
|
||||||
# endif
|
|
||||||
#elif defined GNULIB_POSIXCHECK
|
#elif defined GNULIB_POSIXCHECK
|
||||||
# define _GL_FSEEK_WARN /* Category 1, above. */
|
# define _GL_FSEEK_WARN /* Category 1, above. */
|
||||||
# undef fseek
|
# undef fseek
|
||||||
|
@ -414,28 +534,12 @@ _GL_CXXALIASWARN (ftell);
|
||||||
_GL_FUNCDECL_RPL (ftello, off_t, (FILE *fp) _GL_ARG_NONNULL ((1)));
|
_GL_FUNCDECL_RPL (ftello, off_t, (FILE *fp) _GL_ARG_NONNULL ((1)));
|
||||||
_GL_CXXALIAS_RPL (ftello, off_t, (FILE *fp));
|
_GL_CXXALIAS_RPL (ftello, off_t, (FILE *fp));
|
||||||
# else
|
# else
|
||||||
# if ! @HAVE_FTELLO@
|
# if ! @HAVE_DECL_FTELLO@
|
||||||
_GL_FUNCDECL_SYS (ftello, off_t, (FILE *fp) _GL_ARG_NONNULL ((1)));
|
_GL_FUNCDECL_SYS (ftello, off_t, (FILE *fp) _GL_ARG_NONNULL ((1)));
|
||||||
# endif
|
# endif
|
||||||
_GL_CXXALIAS_SYS (ftello, off_t, (FILE *fp));
|
_GL_CXXALIAS_SYS (ftello, off_t, (FILE *fp));
|
||||||
# endif
|
# endif
|
||||||
_GL_CXXALIASWARN (ftello);
|
_GL_CXXALIASWARN (ftello);
|
||||||
# if (@REPLACE_FTELLO@ || !@HAVE_FTELLO@) && !@GNULIB_FTELL@
|
|
||||||
/* Provide an ftell function that is consistent with ftello. */
|
|
||||||
/* In order to avoid that ftell gets defined as a macro here, the
|
|
||||||
developer can request the 'ftell' module. */
|
|
||||||
# undef ftell
|
|
||||||
# define ftell rpl_ftell
|
|
||||||
static inline long _GL_ARG_NONNULL ((1))
|
|
||||||
rpl_ftell (FILE *f)
|
|
||||||
{
|
|
||||||
# if @REPLACE_FTELLO@
|
|
||||||
return rpl_ftello (f);
|
|
||||||
# else
|
|
||||||
return ftello (f);
|
|
||||||
# endif
|
|
||||||
}
|
|
||||||
# endif
|
|
||||||
#elif defined GNULIB_POSIXCHECK
|
#elif defined GNULIB_POSIXCHECK
|
||||||
# define _GL_FTELL_WARN /* Category 1, above. */
|
# define _GL_FTELL_WARN /* Category 1, above. */
|
||||||
# undef ftell
|
# undef ftell
|
||||||
|
@ -457,7 +561,7 @@ _GL_WARN_ON_USE (ftell, "ftell cannot handle files larger than 4 GB "
|
||||||
|
|
||||||
|
|
||||||
#if @GNULIB_FWRITE@
|
#if @GNULIB_FWRITE@
|
||||||
# if @REPLACE_STDIO_WRITE_FUNCS@ && @GNULIB_STDIO_H_SIGPIPE@
|
# if @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@)
|
||||||
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
# undef fwrite
|
# undef fwrite
|
||||||
# define fwrite rpl_fwrite
|
# define fwrite rpl_fwrite
|
||||||
|
@ -470,10 +574,51 @@ _GL_CXXALIAS_RPL (fwrite, size_t,
|
||||||
# else
|
# else
|
||||||
_GL_CXXALIAS_SYS (fwrite, size_t,
|
_GL_CXXALIAS_SYS (fwrite, size_t,
|
||||||
(const void *ptr, size_t s, size_t n, FILE *stream));
|
(const void *ptr, size_t s, size_t n, FILE *stream));
|
||||||
|
|
||||||
|
/* Work around bug 11959 when fortifying glibc 2.4 through 2.15
|
||||||
|
<http://sources.redhat.com/bugzilla/show_bug.cgi?id=11959>,
|
||||||
|
which sometimes causes an unwanted diagnostic for fwrite calls.
|
||||||
|
This affects only function declaration attributes under certain
|
||||||
|
versions of gcc, and is not needed for C++. */
|
||||||
|
# if (0 < __USE_FORTIFY_LEVEL \
|
||||||
|
&& __GLIBC__ == 2 && 4 <= __GLIBC_MINOR__ && __GLIBC_MINOR__ <= 15 \
|
||||||
|
&& 3 < __GNUC__ + (4 <= __GNUC_MINOR__) \
|
||||||
|
&& !defined __cplusplus)
|
||||||
|
# undef fwrite
|
||||||
|
# define fwrite(a, b, c, d) ({size_t __r = fwrite (a, b, c, d); __r; })
|
||||||
|
# endif
|
||||||
# endif
|
# endif
|
||||||
_GL_CXXALIASWARN (fwrite);
|
_GL_CXXALIASWARN (fwrite);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if @GNULIB_GETC@
|
||||||
|
# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@
|
||||||
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
|
# undef getc
|
||||||
|
# define getc rpl_fgetc
|
||||||
|
# endif
|
||||||
|
_GL_FUNCDECL_RPL (fgetc, int, (FILE *stream) _GL_ARG_NONNULL ((1)));
|
||||||
|
_GL_CXXALIAS_RPL_1 (getc, rpl_fgetc, int, (FILE *stream));
|
||||||
|
# else
|
||||||
|
_GL_CXXALIAS_SYS (getc, int, (FILE *stream));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIASWARN (getc);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if @GNULIB_GETCHAR@
|
||||||
|
# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@
|
||||||
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
|
# undef getchar
|
||||||
|
# define getchar rpl_getchar
|
||||||
|
# endif
|
||||||
|
_GL_FUNCDECL_RPL (getchar, int, (void));
|
||||||
|
_GL_CXXALIAS_RPL (getchar, int, (void));
|
||||||
|
# else
|
||||||
|
_GL_CXXALIAS_SYS (getchar, int, (void));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIASWARN (getchar);
|
||||||
|
#endif
|
||||||
|
|
||||||
#if @GNULIB_GETDELIM@
|
#if @GNULIB_GETDELIM@
|
||||||
/* Read input, up to (and including) the next occurrence of DELIMITER, from
|
/* Read input, up to (and including) the next occurrence of DELIMITER, from
|
||||||
STREAM, store it in *LINEPTR (and NUL-terminate it).
|
STREAM, store it in *LINEPTR (and NUL-terminate it).
|
||||||
|
@ -550,6 +695,14 @@ _GL_WARN_ON_USE (getline, "getline is unportable - "
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* It is very rare that the developer ever has full control of stdin,
|
||||||
|
so any use of gets warrants an unconditional warning; besides, C11
|
||||||
|
removed it. */
|
||||||
|
#undef gets
|
||||||
|
#if HAVE_RAW_DECL_GETS
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#if @GNULIB_OBSTACK_PRINTF@ || @GNULIB_OBSTACK_PRINTF_POSIX@
|
#if @GNULIB_OBSTACK_PRINTF@ || @GNULIB_OBSTACK_PRINTF_POSIX@
|
||||||
struct obstack;
|
struct obstack;
|
||||||
/* Grow an obstack with formatted output. Return the number of
|
/* Grow an obstack with formatted output. Return the number of
|
||||||
|
@ -563,7 +716,7 @@ struct obstack;
|
||||||
# endif
|
# endif
|
||||||
_GL_FUNCDECL_RPL (obstack_printf, int,
|
_GL_FUNCDECL_RPL (obstack_printf, int,
|
||||||
(struct obstack *obs, const char *format, ...)
|
(struct obstack *obs, const char *format, ...)
|
||||||
__attribute__ ((__format__ (__printf__, 2, 3)))
|
_GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
|
||||||
_GL_ARG_NONNULL ((1, 2)));
|
_GL_ARG_NONNULL ((1, 2)));
|
||||||
_GL_CXXALIAS_RPL (obstack_printf, int,
|
_GL_CXXALIAS_RPL (obstack_printf, int,
|
||||||
(struct obstack *obs, const char *format, ...));
|
(struct obstack *obs, const char *format, ...));
|
||||||
|
@ -571,7 +724,7 @@ _GL_CXXALIAS_RPL (obstack_printf, int,
|
||||||
# if !@HAVE_DECL_OBSTACK_PRINTF@
|
# if !@HAVE_DECL_OBSTACK_PRINTF@
|
||||||
_GL_FUNCDECL_SYS (obstack_printf, int,
|
_GL_FUNCDECL_SYS (obstack_printf, int,
|
||||||
(struct obstack *obs, const char *format, ...)
|
(struct obstack *obs, const char *format, ...)
|
||||||
__attribute__ ((__format__ (__printf__, 2, 3)))
|
_GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
|
||||||
_GL_ARG_NONNULL ((1, 2)));
|
_GL_ARG_NONNULL ((1, 2)));
|
||||||
# endif
|
# endif
|
||||||
_GL_CXXALIAS_SYS (obstack_printf, int,
|
_GL_CXXALIAS_SYS (obstack_printf, int,
|
||||||
|
@ -584,7 +737,7 @@ _GL_CXXALIASWARN (obstack_printf);
|
||||||
# endif
|
# endif
|
||||||
_GL_FUNCDECL_RPL (obstack_vprintf, int,
|
_GL_FUNCDECL_RPL (obstack_vprintf, int,
|
||||||
(struct obstack *obs, const char *format, va_list args)
|
(struct obstack *obs, const char *format, va_list args)
|
||||||
__attribute__ ((__format__ (__printf__, 2, 0)))
|
_GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
|
||||||
_GL_ARG_NONNULL ((1, 2)));
|
_GL_ARG_NONNULL ((1, 2)));
|
||||||
_GL_CXXALIAS_RPL (obstack_vprintf, int,
|
_GL_CXXALIAS_RPL (obstack_vprintf, int,
|
||||||
(struct obstack *obs, const char *format, va_list args));
|
(struct obstack *obs, const char *format, va_list args));
|
||||||
|
@ -592,7 +745,7 @@ _GL_CXXALIAS_RPL (obstack_vprintf, int,
|
||||||
# if !@HAVE_DECL_OBSTACK_PRINTF@
|
# if !@HAVE_DECL_OBSTACK_PRINTF@
|
||||||
_GL_FUNCDECL_SYS (obstack_vprintf, int,
|
_GL_FUNCDECL_SYS (obstack_vprintf, int,
|
||||||
(struct obstack *obs, const char *format, va_list args)
|
(struct obstack *obs, const char *format, va_list args)
|
||||||
__attribute__ ((__format__ (__printf__, 2, 0)))
|
_GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
|
||||||
_GL_ARG_NONNULL ((1, 2)));
|
_GL_ARG_NONNULL ((1, 2)));
|
||||||
# endif
|
# endif
|
||||||
_GL_CXXALIAS_SYS (obstack_vprintf, int,
|
_GL_CXXALIAS_SYS (obstack_vprintf, int,
|
||||||
|
@ -601,6 +754,20 @@ _GL_CXXALIAS_SYS (obstack_vprintf, int,
|
||||||
_GL_CXXALIASWARN (obstack_vprintf);
|
_GL_CXXALIASWARN (obstack_vprintf);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if @GNULIB_PCLOSE@
|
||||||
|
# if !@HAVE_PCLOSE@
|
||||||
|
_GL_FUNCDECL_SYS (pclose, int, (FILE *stream) _GL_ARG_NONNULL ((1)));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIAS_SYS (pclose, int, (FILE *stream));
|
||||||
|
_GL_CXXALIASWARN (pclose);
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef pclose
|
||||||
|
# if HAVE_RAW_DECL_PCLOSE
|
||||||
|
_GL_WARN_ON_USE (pclose, "pclose is unportable - "
|
||||||
|
"use gnulib module pclose for more portability");
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#if @GNULIB_PERROR@
|
#if @GNULIB_PERROR@
|
||||||
/* Print a message to standard error, describing the value of ERRNO,
|
/* Print a message to standard error, describing the value of ERRNO,
|
||||||
(if STRING is not NULL and not empty) prefixed with STRING and ": ",
|
(if STRING is not NULL and not empty) prefixed with STRING and ": ",
|
||||||
|
@ -632,6 +799,10 @@ _GL_FUNCDECL_RPL (popen, FILE *, (const char *cmd, const char *mode)
|
||||||
_GL_ARG_NONNULL ((1, 2)));
|
_GL_ARG_NONNULL ((1, 2)));
|
||||||
_GL_CXXALIAS_RPL (popen, FILE *, (const char *cmd, const char *mode));
|
_GL_CXXALIAS_RPL (popen, FILE *, (const char *cmd, const char *mode));
|
||||||
# else
|
# else
|
||||||
|
# if !@HAVE_POPEN@
|
||||||
|
_GL_FUNCDECL_SYS (popen, FILE *, (const char *cmd, const char *mode)
|
||||||
|
_GL_ARG_NONNULL ((1, 2)));
|
||||||
|
# endif
|
||||||
_GL_CXXALIAS_SYS (popen, FILE *, (const char *cmd, const char *mode));
|
_GL_CXXALIAS_SYS (popen, FILE *, (const char *cmd, const char *mode));
|
||||||
# endif
|
# endif
|
||||||
_GL_CXXALIASWARN (popen);
|
_GL_CXXALIASWARN (popen);
|
||||||
|
@ -645,23 +816,35 @@ _GL_WARN_ON_USE (popen, "popen is buggy on some platforms - "
|
||||||
|
|
||||||
#if @GNULIB_PRINTF_POSIX@ || @GNULIB_PRINTF@
|
#if @GNULIB_PRINTF_POSIX@ || @GNULIB_PRINTF@
|
||||||
# if (@GNULIB_PRINTF_POSIX@ && @REPLACE_PRINTF@) \
|
# if (@GNULIB_PRINTF_POSIX@ && @REPLACE_PRINTF@) \
|
||||||
|| (@GNULIB_PRINTF@ && @REPLACE_STDIO_WRITE_FUNCS@ && @GNULIB_STDIO_H_SIGPIPE@)
|
|| (@GNULIB_PRINTF@ && @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@))
|
||||||
# if defined __GNUC__
|
# if defined __GNUC__
|
||||||
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
/* Don't break __attribute__((format(printf,M,N))). */
|
/* Don't break __attribute__((format(printf,M,N))). */
|
||||||
# define printf __printf__
|
# define printf __printf__
|
||||||
# endif
|
# endif
|
||||||
|
# if @GNULIB_PRINTF_POSIX@ || @GNULIB_VFPRINTF_POSIX@
|
||||||
_GL_FUNCDECL_RPL_1 (__printf__, int,
|
_GL_FUNCDECL_RPL_1 (__printf__, int,
|
||||||
(const char *format, ...)
|
(const char *format, ...)
|
||||||
__asm__ (@ASM_SYMBOL_PREFIX@
|
__asm__ (@ASM_SYMBOL_PREFIX@
|
||||||
_GL_STDIO_MACROEXPAND_AND_STRINGIZE(rpl_printf))
|
_GL_STDIO_MACROEXPAND_AND_STRINGIZE(rpl_printf))
|
||||||
__attribute__ ((__format__ (__printf__, 1, 2)))
|
_GL_ATTRIBUTE_FORMAT_PRINTF (1, 2)
|
||||||
_GL_ARG_NONNULL ((1)));
|
_GL_ARG_NONNULL ((1)));
|
||||||
|
# else
|
||||||
|
_GL_FUNCDECL_RPL_1 (__printf__, int,
|
||||||
|
(const char *format, ...)
|
||||||
|
__asm__ (@ASM_SYMBOL_PREFIX@
|
||||||
|
_GL_STDIO_MACROEXPAND_AND_STRINGIZE(rpl_printf))
|
||||||
|
_GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (1, 2)
|
||||||
|
_GL_ARG_NONNULL ((1)));
|
||||||
|
# endif
|
||||||
_GL_CXXALIAS_RPL_1 (printf, __printf__, int, (const char *format, ...));
|
_GL_CXXALIAS_RPL_1 (printf, __printf__, int, (const char *format, ...));
|
||||||
# else
|
# else
|
||||||
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
|
# define printf rpl_printf
|
||||||
|
# endif
|
||||||
_GL_FUNCDECL_RPL (printf, int,
|
_GL_FUNCDECL_RPL (printf, int,
|
||||||
(const char *format, ...)
|
(const char *format, ...)
|
||||||
__attribute__ ((__format__ (__printf__, 1, 2)))
|
_GL_ATTRIBUTE_FORMAT_PRINTF (1, 2)
|
||||||
_GL_ARG_NONNULL ((1)));
|
_GL_ARG_NONNULL ((1)));
|
||||||
_GL_CXXALIAS_RPL (printf, int, (const char *format, ...));
|
_GL_CXXALIAS_RPL (printf, int, (const char *format, ...));
|
||||||
# endif
|
# endif
|
||||||
|
@ -682,7 +865,7 @@ _GL_WARN_ON_USE (printf, "printf is not always POSIX compliant - "
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if @GNULIB_PUTC@
|
#if @GNULIB_PUTC@
|
||||||
# if @REPLACE_STDIO_WRITE_FUNCS@ && @GNULIB_STDIO_H_SIGPIPE@
|
# if @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@)
|
||||||
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
# undef putc
|
# undef putc
|
||||||
# define putc rpl_fputc
|
# define putc rpl_fputc
|
||||||
|
@ -696,7 +879,7 @@ _GL_CXXALIASWARN (putc);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if @GNULIB_PUTCHAR@
|
#if @GNULIB_PUTCHAR@
|
||||||
# if @REPLACE_STDIO_WRITE_FUNCS@ && @GNULIB_STDIO_H_SIGPIPE@
|
# if @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@)
|
||||||
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
# undef putchar
|
# undef putchar
|
||||||
# define putchar rpl_putchar
|
# define putchar rpl_putchar
|
||||||
|
@ -710,7 +893,7 @@ _GL_CXXALIASWARN (putchar);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if @GNULIB_PUTS@
|
#if @GNULIB_PUTS@
|
||||||
# if @REPLACE_STDIO_WRITE_FUNCS@ && @GNULIB_STDIO_H_SIGPIPE@
|
# if @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@)
|
||||||
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
# undef puts
|
# undef puts
|
||||||
# define puts rpl_puts
|
# define puts rpl_puts
|
||||||
|
@ -794,6 +977,37 @@ _GL_WARN_ON_USE (renameat, "renameat is not portable - "
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if @GNULIB_SCANF@
|
||||||
|
# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@
|
||||||
|
# if defined __GNUC__
|
||||||
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
|
# undef scanf
|
||||||
|
/* Don't break __attribute__((format(scanf,M,N))). */
|
||||||
|
# define scanf __scanf__
|
||||||
|
# endif
|
||||||
|
_GL_FUNCDECL_RPL_1 (__scanf__, int,
|
||||||
|
(const char *format, ...)
|
||||||
|
__asm__ (@ASM_SYMBOL_PREFIX@
|
||||||
|
_GL_STDIO_MACROEXPAND_AND_STRINGIZE(rpl_scanf))
|
||||||
|
_GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (1, 2)
|
||||||
|
_GL_ARG_NONNULL ((1)));
|
||||||
|
_GL_CXXALIAS_RPL_1 (scanf, __scanf__, int, (const char *format, ...));
|
||||||
|
# else
|
||||||
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
|
# undef scanf
|
||||||
|
# define scanf rpl_scanf
|
||||||
|
# endif
|
||||||
|
_GL_FUNCDECL_RPL (scanf, int, (const char *format, ...)
|
||||||
|
_GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (1, 2)
|
||||||
|
_GL_ARG_NONNULL ((1)));
|
||||||
|
_GL_CXXALIAS_RPL (scanf, int, (const char *format, ...));
|
||||||
|
# endif
|
||||||
|
# else
|
||||||
|
_GL_CXXALIAS_SYS (scanf, int, (const char *format, ...));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIASWARN (scanf);
|
||||||
|
#endif
|
||||||
|
|
||||||
#if @GNULIB_SNPRINTF@
|
#if @GNULIB_SNPRINTF@
|
||||||
# if @REPLACE_SNPRINTF@
|
# if @REPLACE_SNPRINTF@
|
||||||
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
|
@ -801,7 +1015,7 @@ _GL_WARN_ON_USE (renameat, "renameat is not portable - "
|
||||||
# endif
|
# endif
|
||||||
_GL_FUNCDECL_RPL (snprintf, int,
|
_GL_FUNCDECL_RPL (snprintf, int,
|
||||||
(char *str, size_t size, const char *format, ...)
|
(char *str, size_t size, const char *format, ...)
|
||||||
__attribute__ ((__format__ (__printf__, 3, 4)))
|
_GL_ATTRIBUTE_FORMAT_PRINTF (3, 4)
|
||||||
_GL_ARG_NONNULL ((3)));
|
_GL_ARG_NONNULL ((3)));
|
||||||
_GL_CXXALIAS_RPL (snprintf, int,
|
_GL_CXXALIAS_RPL (snprintf, int,
|
||||||
(char *str, size_t size, const char *format, ...));
|
(char *str, size_t size, const char *format, ...));
|
||||||
|
@ -809,7 +1023,7 @@ _GL_CXXALIAS_RPL (snprintf, int,
|
||||||
# if !@HAVE_DECL_SNPRINTF@
|
# if !@HAVE_DECL_SNPRINTF@
|
||||||
_GL_FUNCDECL_SYS (snprintf, int,
|
_GL_FUNCDECL_SYS (snprintf, int,
|
||||||
(char *str, size_t size, const char *format, ...)
|
(char *str, size_t size, const char *format, ...)
|
||||||
__attribute__ ((__format__ (__printf__, 3, 4)))
|
_GL_ATTRIBUTE_FORMAT_PRINTF (3, 4)
|
||||||
_GL_ARG_NONNULL ((3)));
|
_GL_ARG_NONNULL ((3)));
|
||||||
# endif
|
# endif
|
||||||
_GL_CXXALIAS_SYS (snprintf, int,
|
_GL_CXXALIAS_SYS (snprintf, int,
|
||||||
|
@ -824,9 +1038,9 @@ _GL_WARN_ON_USE (snprintf, "snprintf is unportable - "
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Some people would argue that sprintf should be handled like gets
|
/* Some people would argue that all sprintf uses should be warned about
|
||||||
(for example, OpenBSD issues a link warning for both functions),
|
(for example, OpenBSD issues a link warning for it),
|
||||||
since both can cause security holes due to buffer overruns.
|
since it can cause security holes due to buffer overruns.
|
||||||
However, we believe that sprintf can be used safely, and is more
|
However, we believe that sprintf can be used safely, and is more
|
||||||
efficient than snprintf in those safe cases; and as proof of our
|
efficient than snprintf in those safe cases; and as proof of our
|
||||||
belief, we use sprintf in several gnulib modules. So this header
|
belief, we use sprintf in several gnulib modules. So this header
|
||||||
|
@ -839,7 +1053,7 @@ _GL_WARN_ON_USE (snprintf, "snprintf is unportable - "
|
||||||
# define sprintf rpl_sprintf
|
# define sprintf rpl_sprintf
|
||||||
# endif
|
# endif
|
||||||
_GL_FUNCDECL_RPL (sprintf, int, (char *str, const char *format, ...)
|
_GL_FUNCDECL_RPL (sprintf, int, (char *str, const char *format, ...)
|
||||||
__attribute__ ((__format__ (__printf__, 2, 3)))
|
_GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
|
||||||
_GL_ARG_NONNULL ((1, 2)));
|
_GL_ARG_NONNULL ((1, 2)));
|
||||||
_GL_CXXALIAS_RPL (sprintf, int, (char *str, const char *format, ...));
|
_GL_CXXALIAS_RPL (sprintf, int, (char *str, const char *format, ...));
|
||||||
# else
|
# else
|
||||||
|
@ -884,7 +1098,7 @@ _GL_WARN_ON_USE (tmpfile, "tmpfile is not usable on mingw - "
|
||||||
# endif
|
# endif
|
||||||
_GL_FUNCDECL_RPL (asprintf, int,
|
_GL_FUNCDECL_RPL (asprintf, int,
|
||||||
(char **result, const char *format, ...)
|
(char **result, const char *format, ...)
|
||||||
__attribute__ ((__format__ (__printf__, 2, 3)))
|
_GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
|
||||||
_GL_ARG_NONNULL ((1, 2)));
|
_GL_ARG_NONNULL ((1, 2)));
|
||||||
_GL_CXXALIAS_RPL (asprintf, int,
|
_GL_CXXALIAS_RPL (asprintf, int,
|
||||||
(char **result, const char *format, ...));
|
(char **result, const char *format, ...));
|
||||||
|
@ -892,7 +1106,7 @@ _GL_CXXALIAS_RPL (asprintf, int,
|
||||||
# if !@HAVE_VASPRINTF@
|
# if !@HAVE_VASPRINTF@
|
||||||
_GL_FUNCDECL_SYS (asprintf, int,
|
_GL_FUNCDECL_SYS (asprintf, int,
|
||||||
(char **result, const char *format, ...)
|
(char **result, const char *format, ...)
|
||||||
__attribute__ ((__format__ (__printf__, 2, 3)))
|
_GL_ATTRIBUTE_FORMAT_PRINTF (2, 3)
|
||||||
_GL_ARG_NONNULL ((1, 2)));
|
_GL_ARG_NONNULL ((1, 2)));
|
||||||
# endif
|
# endif
|
||||||
_GL_CXXALIAS_SYS (asprintf, int,
|
_GL_CXXALIAS_SYS (asprintf, int,
|
||||||
|
@ -905,7 +1119,7 @@ _GL_CXXALIASWARN (asprintf);
|
||||||
# endif
|
# endif
|
||||||
_GL_FUNCDECL_RPL (vasprintf, int,
|
_GL_FUNCDECL_RPL (vasprintf, int,
|
||||||
(char **result, const char *format, va_list args)
|
(char **result, const char *format, va_list args)
|
||||||
__attribute__ ((__format__ (__printf__, 2, 0)))
|
_GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
|
||||||
_GL_ARG_NONNULL ((1, 2)));
|
_GL_ARG_NONNULL ((1, 2)));
|
||||||
_GL_CXXALIAS_RPL (vasprintf, int,
|
_GL_CXXALIAS_RPL (vasprintf, int,
|
||||||
(char **result, const char *format, va_list args));
|
(char **result, const char *format, va_list args));
|
||||||
|
@ -913,7 +1127,7 @@ _GL_CXXALIAS_RPL (vasprintf, int,
|
||||||
# if !@HAVE_VASPRINTF@
|
# if !@HAVE_VASPRINTF@
|
||||||
_GL_FUNCDECL_SYS (vasprintf, int,
|
_GL_FUNCDECL_SYS (vasprintf, int,
|
||||||
(char **result, const char *format, va_list args)
|
(char **result, const char *format, va_list args)
|
||||||
__attribute__ ((__format__ (__printf__, 2, 0)))
|
_GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
|
||||||
_GL_ARG_NONNULL ((1, 2)));
|
_GL_ARG_NONNULL ((1, 2)));
|
||||||
# endif
|
# endif
|
||||||
_GL_CXXALIAS_SYS (vasprintf, int,
|
_GL_CXXALIAS_SYS (vasprintf, int,
|
||||||
|
@ -928,13 +1142,13 @@ _GL_CXXALIASWARN (vasprintf);
|
||||||
# define vdprintf rpl_vdprintf
|
# define vdprintf rpl_vdprintf
|
||||||
# endif
|
# endif
|
||||||
_GL_FUNCDECL_RPL (vdprintf, int, (int fd, const char *format, va_list args)
|
_GL_FUNCDECL_RPL (vdprintf, int, (int fd, const char *format, va_list args)
|
||||||
__attribute__ ((__format__ (__printf__, 2, 0)))
|
_GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
|
||||||
_GL_ARG_NONNULL ((2)));
|
_GL_ARG_NONNULL ((2)));
|
||||||
_GL_CXXALIAS_RPL (vdprintf, int, (int fd, const char *format, va_list args));
|
_GL_CXXALIAS_RPL (vdprintf, int, (int fd, const char *format, va_list args));
|
||||||
# else
|
# else
|
||||||
# if !@HAVE_VDPRINTF@
|
# if !@HAVE_VDPRINTF@
|
||||||
_GL_FUNCDECL_SYS (vdprintf, int, (int fd, const char *format, va_list args)
|
_GL_FUNCDECL_SYS (vdprintf, int, (int fd, const char *format, va_list args)
|
||||||
__attribute__ ((__format__ (__printf__, 2, 0)))
|
_GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
|
||||||
_GL_ARG_NONNULL ((2)));
|
_GL_ARG_NONNULL ((2)));
|
||||||
# endif
|
# endif
|
||||||
/* Need to cast, because on Solaris, the third parameter will likely be
|
/* Need to cast, because on Solaris, the third parameter will likely be
|
||||||
|
@ -953,14 +1167,20 @@ _GL_WARN_ON_USE (vdprintf, "vdprintf is unportable - "
|
||||||
|
|
||||||
#if @GNULIB_VFPRINTF_POSIX@ || @GNULIB_VFPRINTF@
|
#if @GNULIB_VFPRINTF_POSIX@ || @GNULIB_VFPRINTF@
|
||||||
# if (@GNULIB_VFPRINTF_POSIX@ && @REPLACE_VFPRINTF@) \
|
# if (@GNULIB_VFPRINTF_POSIX@ && @REPLACE_VFPRINTF@) \
|
||||||
|| (@GNULIB_VFPRINTF@ && @REPLACE_STDIO_WRITE_FUNCS@ && @GNULIB_STDIO_H_SIGPIPE@)
|
|| (@GNULIB_VFPRINTF@ && @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@))
|
||||||
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
# define vfprintf rpl_vfprintf
|
# define vfprintf rpl_vfprintf
|
||||||
# endif
|
# endif
|
||||||
# define GNULIB_overrides_vfprintf 1
|
# define GNULIB_overrides_vfprintf 1
|
||||||
|
# if @GNULIB_VFPRINTF_POSIX@
|
||||||
_GL_FUNCDECL_RPL (vfprintf, int, (FILE *fp, const char *format, va_list args)
|
_GL_FUNCDECL_RPL (vfprintf, int, (FILE *fp, const char *format, va_list args)
|
||||||
__attribute__ ((__format__ (__printf__, 2, 0)))
|
_GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
|
||||||
_GL_ARG_NONNULL ((1, 2)));
|
_GL_ARG_NONNULL ((1, 2)));
|
||||||
|
# else
|
||||||
|
_GL_FUNCDECL_RPL (vfprintf, int, (FILE *fp, const char *format, va_list args)
|
||||||
|
_GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (2, 0)
|
||||||
|
_GL_ARG_NONNULL ((1, 2)));
|
||||||
|
# endif
|
||||||
_GL_CXXALIAS_RPL (vfprintf, int, (FILE *fp, const char *format, va_list args));
|
_GL_CXXALIAS_RPL (vfprintf, int, (FILE *fp, const char *format, va_list args));
|
||||||
# else
|
# else
|
||||||
/* Need to cast, because on Solaris, the third parameter is
|
/* Need to cast, because on Solaris, the third parameter is
|
||||||
|
@ -981,16 +1201,41 @@ _GL_WARN_ON_USE (vfprintf, "vfprintf is not always POSIX compliant - "
|
||||||
"POSIX compliance");
|
"POSIX compliance");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if @GNULIB_VFSCANF@
|
||||||
|
# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@
|
||||||
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
|
# undef vfscanf
|
||||||
|
# define vfscanf rpl_vfscanf
|
||||||
|
# endif
|
||||||
|
_GL_FUNCDECL_RPL (vfscanf, int,
|
||||||
|
(FILE *stream, const char *format, va_list args)
|
||||||
|
_GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (2, 0)
|
||||||
|
_GL_ARG_NONNULL ((1, 2)));
|
||||||
|
_GL_CXXALIAS_RPL (vfscanf, int,
|
||||||
|
(FILE *stream, const char *format, va_list args));
|
||||||
|
# else
|
||||||
|
_GL_CXXALIAS_SYS (vfscanf, int,
|
||||||
|
(FILE *stream, const char *format, va_list args));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIASWARN (vfscanf);
|
||||||
|
#endif
|
||||||
|
|
||||||
#if @GNULIB_VPRINTF_POSIX@ || @GNULIB_VPRINTF@
|
#if @GNULIB_VPRINTF_POSIX@ || @GNULIB_VPRINTF@
|
||||||
# if (@GNULIB_VPRINTF_POSIX@ && @REPLACE_VPRINTF@) \
|
# if (@GNULIB_VPRINTF_POSIX@ && @REPLACE_VPRINTF@) \
|
||||||
|| (@GNULIB_VPRINTF@ && @REPLACE_STDIO_WRITE_FUNCS@ && @GNULIB_STDIO_H_SIGPIPE@)
|
|| (@GNULIB_VPRINTF@ && @REPLACE_STDIO_WRITE_FUNCS@ && (@GNULIB_STDIO_H_NONBLOCKING@ || @GNULIB_STDIO_H_SIGPIPE@))
|
||||||
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
# define vprintf rpl_vprintf
|
# define vprintf rpl_vprintf
|
||||||
# endif
|
# endif
|
||||||
# define GNULIB_overrides_vprintf 1
|
# define GNULIB_overrides_vprintf 1
|
||||||
|
# if @GNULIB_VPRINTF_POSIX@ || @GNULIB_VFPRINTF_POSIX@
|
||||||
_GL_FUNCDECL_RPL (vprintf, int, (const char *format, va_list args)
|
_GL_FUNCDECL_RPL (vprintf, int, (const char *format, va_list args)
|
||||||
__attribute__ ((__format__ (__printf__, 1, 0)))
|
_GL_ATTRIBUTE_FORMAT_PRINTF (1, 0)
|
||||||
_GL_ARG_NONNULL ((1)));
|
_GL_ARG_NONNULL ((1)));
|
||||||
|
# else
|
||||||
|
_GL_FUNCDECL_RPL (vprintf, int, (const char *format, va_list args)
|
||||||
|
_GL_ATTRIBUTE_FORMAT_PRINTF_SYSTEM (1, 0)
|
||||||
|
_GL_ARG_NONNULL ((1)));
|
||||||
|
# endif
|
||||||
_GL_CXXALIAS_RPL (vprintf, int, (const char *format, va_list args));
|
_GL_CXXALIAS_RPL (vprintf, int, (const char *format, va_list args));
|
||||||
# else
|
# else
|
||||||
/* Need to cast, because on Solaris, the second parameter is
|
/* Need to cast, because on Solaris, the second parameter is
|
||||||
|
@ -1010,6 +1255,22 @@ _GL_WARN_ON_USE (vprintf, "vprintf is not always POSIX compliant - "
|
||||||
"POSIX compliance");
|
"POSIX compliance");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if @GNULIB_VSCANF@
|
||||||
|
# if @REPLACE_STDIO_READ_FUNCS@ && @GNULIB_STDIO_H_NONBLOCKING@
|
||||||
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
|
# undef vscanf
|
||||||
|
# define vscanf rpl_vscanf
|
||||||
|
# endif
|
||||||
|
_GL_FUNCDECL_RPL (vscanf, int, (const char *format, va_list args)
|
||||||
|
_GL_ATTRIBUTE_FORMAT_SCANF_SYSTEM (1, 0)
|
||||||
|
_GL_ARG_NONNULL ((1)));
|
||||||
|
_GL_CXXALIAS_RPL (vscanf, int, (const char *format, va_list args));
|
||||||
|
# else
|
||||||
|
_GL_CXXALIAS_SYS (vscanf, int, (const char *format, va_list args));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIASWARN (vscanf);
|
||||||
|
#endif
|
||||||
|
|
||||||
#if @GNULIB_VSNPRINTF@
|
#if @GNULIB_VSNPRINTF@
|
||||||
# if @REPLACE_VSNPRINTF@
|
# if @REPLACE_VSNPRINTF@
|
||||||
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
|
@ -1017,7 +1278,7 @@ _GL_WARN_ON_USE (vprintf, "vprintf is not always POSIX compliant - "
|
||||||
# endif
|
# endif
|
||||||
_GL_FUNCDECL_RPL (vsnprintf, int,
|
_GL_FUNCDECL_RPL (vsnprintf, int,
|
||||||
(char *str, size_t size, const char *format, va_list args)
|
(char *str, size_t size, const char *format, va_list args)
|
||||||
__attribute__ ((__format__ (__printf__, 3, 0)))
|
_GL_ATTRIBUTE_FORMAT_PRINTF (3, 0)
|
||||||
_GL_ARG_NONNULL ((3)));
|
_GL_ARG_NONNULL ((3)));
|
||||||
_GL_CXXALIAS_RPL (vsnprintf, int,
|
_GL_CXXALIAS_RPL (vsnprintf, int,
|
||||||
(char *str, size_t size, const char *format, va_list args));
|
(char *str, size_t size, const char *format, va_list args));
|
||||||
|
@ -1025,7 +1286,7 @@ _GL_CXXALIAS_RPL (vsnprintf, int,
|
||||||
# if !@HAVE_DECL_VSNPRINTF@
|
# if !@HAVE_DECL_VSNPRINTF@
|
||||||
_GL_FUNCDECL_SYS (vsnprintf, int,
|
_GL_FUNCDECL_SYS (vsnprintf, int,
|
||||||
(char *str, size_t size, const char *format, va_list args)
|
(char *str, size_t size, const char *format, va_list args)
|
||||||
__attribute__ ((__format__ (__printf__, 3, 0)))
|
_GL_ATTRIBUTE_FORMAT_PRINTF (3, 0)
|
||||||
_GL_ARG_NONNULL ((3)));
|
_GL_ARG_NONNULL ((3)));
|
||||||
# endif
|
# endif
|
||||||
_GL_CXXALIAS_SYS (vsnprintf, int,
|
_GL_CXXALIAS_SYS (vsnprintf, int,
|
||||||
|
@ -1047,7 +1308,7 @@ _GL_WARN_ON_USE (vsnprintf, "vsnprintf is unportable - "
|
||||||
# endif
|
# endif
|
||||||
_GL_FUNCDECL_RPL (vsprintf, int,
|
_GL_FUNCDECL_RPL (vsprintf, int,
|
||||||
(char *str, const char *format, va_list args)
|
(char *str, const char *format, va_list args)
|
||||||
__attribute__ ((__format__ (__printf__, 2, 0)))
|
_GL_ATTRIBUTE_FORMAT_PRINTF (2, 0)
|
||||||
_GL_ARG_NONNULL ((1, 2)));
|
_GL_ARG_NONNULL ((1, 2)));
|
||||||
_GL_CXXALIAS_RPL (vsprintf, int,
|
_GL_CXXALIAS_RPL (vsprintf, int,
|
||||||
(char *str, const char *format, va_list args));
|
(char *str, const char *format, va_list args));
|
||||||
|
@ -1067,7 +1328,6 @@ _GL_WARN_ON_USE (vsprintf, "vsprintf is not always POSIX compliant - "
|
||||||
"POSIX compliance");
|
"POSIX compliance");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#endif /* _@GUARD_PREFIX@_STDIO_H */
|
||||||
#endif /* _GL_STDIO_H */
|
#endif /* _@GUARD_PREFIX@_STDIO_H */
|
||||||
#endif /* _GL_STDIO_H */
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* A GNU-like <stdlib.h>.
|
/* A GNU-like <stdlib.h>.
|
||||||
|
|
||||||
Copyright (C) 1995, 2001-2004, 2006-2010 Free Software Foundation, Inc.
|
Copyright (C) 1995, 2001-2004, 2006-2013 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -18,28 +18,30 @@
|
||||||
#if __GNUC__ >= 3
|
#if __GNUC__ >= 3
|
||||||
@PRAGMA_SYSTEM_HEADER@
|
@PRAGMA_SYSTEM_HEADER@
|
||||||
#endif
|
#endif
|
||||||
|
@PRAGMA_COLUMNS@
|
||||||
|
|
||||||
#if defined __need_malloc_and_calloc
|
#if defined __need_system_stdlib_h || defined __need_malloc_and_calloc
|
||||||
/* Special invocation convention inside glibc header files. */
|
/* Special invocation conventions inside some gnulib header files,
|
||||||
|
and inside some glibc header files, respectively. */
|
||||||
|
|
||||||
#@INCLUDE_NEXT@ @NEXT_STDLIB_H@
|
#@INCLUDE_NEXT@ @NEXT_STDLIB_H@
|
||||||
|
|
||||||
#else
|
#else
|
||||||
/* Normal invocation convention. */
|
/* Normal invocation convention. */
|
||||||
|
|
||||||
#ifndef _GL_STDLIB_H
|
#ifndef _@GUARD_PREFIX@_STDLIB_H
|
||||||
|
|
||||||
/* The include_next requires a split double-inclusion guard. */
|
/* The include_next requires a split double-inclusion guard. */
|
||||||
#@INCLUDE_NEXT@ @NEXT_STDLIB_H@
|
#@INCLUDE_NEXT@ @NEXT_STDLIB_H@
|
||||||
|
|
||||||
#ifndef _GL_STDLIB_H
|
#ifndef _@GUARD_PREFIX@_STDLIB_H
|
||||||
#define _GL_STDLIB_H
|
#define _@GUARD_PREFIX@_STDLIB_H
|
||||||
|
|
||||||
/* NetBSD 5.0 mis-defines NULL. */
|
/* NetBSD 5.0 mis-defines NULL. */
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
/* MirBSD 10 defines WEXITSTATUS in <sys/wait.h>, not in <stdlib.h>. */
|
/* MirBSD 10 defines WEXITSTATUS in <sys/wait.h>, not in <stdlib.h>. */
|
||||||
#ifndef WEXITSTATUS
|
#if @GNULIB_SYSTEM_POSIX@ && !defined WEXITSTATUS
|
||||||
# include <sys/wait.h>
|
# include <sys/wait.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -48,18 +50,28 @@
|
||||||
# include <sys/loadavg.h>
|
# include <sys/loadavg.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Native Windows platforms declare mktemp() in <io.h>. */
|
||||||
|
#if 0 && ((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__)
|
||||||
|
# include <io.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if @GNULIB_RANDOM_R@
|
||||||
|
|
||||||
/* OSF/1 5.1 declares 'struct random_data' in <random.h>, which is included
|
/* OSF/1 5.1 declares 'struct random_data' in <random.h>, which is included
|
||||||
from <stdlib.h> if _REENTRANT is defined. Include it always. */
|
from <stdlib.h> if _REENTRANT is defined. Include it whenever we need
|
||||||
#if @HAVE_RANDOM_H@
|
'struct random_data'. */
|
||||||
# include <random.h>
|
# if @HAVE_RANDOM_H@
|
||||||
#endif
|
# include <random.h>
|
||||||
|
# endif
|
||||||
|
|
||||||
#if !@HAVE_STRUCT_RANDOM_DATA@ || (@GNULIB_RANDOM_R@ && !@HAVE_RANDOM_R@) \
|
# if !@HAVE_STRUCT_RANDOM_DATA@ || @REPLACE_RANDOM_R@ || !@HAVE_RANDOM_R@
|
||||||
|| defined GNULIB_POSIXCHECK
|
# include <stdint.h>
|
||||||
# include <stdint.h>
|
# endif
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !@HAVE_STRUCT_RANDOM_DATA@
|
# if !@HAVE_STRUCT_RANDOM_DATA@
|
||||||
|
/* Define 'struct random_data'.
|
||||||
|
But allow multiple gnulib generated <stdlib.h> replacements to coexist. */
|
||||||
|
# if !GNULIB_defined_struct_random_data
|
||||||
struct random_data
|
struct random_data
|
||||||
{
|
{
|
||||||
int32_t *fptr; /* Front pointer. */
|
int32_t *fptr; /* Front pointer. */
|
||||||
|
@ -70,21 +82,29 @@ struct random_data
|
||||||
int rand_sep; /* Distance between front and rear. */
|
int rand_sep; /* Distance between front and rear. */
|
||||||
int32_t *end_ptr; /* Pointer behind state table. */
|
int32_t *end_ptr; /* Pointer behind state table. */
|
||||||
};
|
};
|
||||||
|
# define GNULIB_defined_struct_random_data 1
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (@GNULIB_MKSTEMP@ || @GNULIB_GETSUBOPT@ || defined GNULIB_POSIXCHECK) && ! defined __GLIBC__ && !((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__)
|
#if (@GNULIB_MKSTEMP@ || @GNULIB_MKSTEMPS@ || @GNULIB_GETSUBOPT@ || defined GNULIB_POSIXCHECK) && ! defined __GLIBC__ && !((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__)
|
||||||
/* On MacOS X 10.3, only <unistd.h> declares mkstemp. */
|
/* On Mac OS X 10.3, only <unistd.h> declares mkstemp. */
|
||||||
|
/* On Mac OS X 10.5, only <unistd.h> declares mkstemps. */
|
||||||
/* On Cygwin 1.7.1, only <unistd.h> declares getsubopt. */
|
/* On Cygwin 1.7.1, only <unistd.h> declares getsubopt. */
|
||||||
/* But avoid namespace pollution on glibc systems and native Windows. */
|
/* But avoid namespace pollution on glibc systems and native Windows. */
|
||||||
# include <unistd.h>
|
# include <unistd.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __attribute__
|
/* The __attribute__ feature is available in gcc versions 2.5 and later.
|
||||||
# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8)
|
The attribute __pure__ was added in gcc 2.96. */
|
||||||
# define __attribute__(Spec) /* empty */
|
#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
|
||||||
# endif
|
# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
|
||||||
|
#else
|
||||||
|
# define _GL_ATTRIBUTE_PURE /* empty */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* The definition of _Noreturn is copied here. */
|
||||||
|
|
||||||
/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
|
/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */
|
||||||
|
|
||||||
/* The definition of _GL_ARG_NONNULL is copied here. */
|
/* The definition of _GL_ARG_NONNULL is copied here. */
|
||||||
|
@ -110,7 +130,7 @@ struct random_data
|
||||||
/* Terminate the current process with the given return code, without running
|
/* Terminate the current process with the given return code, without running
|
||||||
the 'atexit' handlers. */
|
the 'atexit' handlers. */
|
||||||
# if !@HAVE__EXIT@
|
# if !@HAVE__EXIT@
|
||||||
_GL_FUNCDECL_SYS (_Exit, void, (int status) __attribute__ ((__noreturn__)));
|
_GL_FUNCDECL_SYS (_Exit, _Noreturn void, (int status));
|
||||||
# endif
|
# endif
|
||||||
_GL_CXXALIAS_SYS (_Exit, void, (int status));
|
_GL_CXXALIAS_SYS (_Exit, void, (int status));
|
||||||
_GL_CXXALIASWARN (_Exit);
|
_GL_CXXALIASWARN (_Exit);
|
||||||
|
@ -127,7 +147,9 @@ _GL_WARN_ON_USE (_Exit, "_Exit is unportable - "
|
||||||
/* Parse a signed decimal integer.
|
/* Parse a signed decimal integer.
|
||||||
Returns the value of the integer. Errors are not detected. */
|
Returns the value of the integer. Errors are not detected. */
|
||||||
# if !@HAVE_ATOLL@
|
# if !@HAVE_ATOLL@
|
||||||
_GL_FUNCDECL_SYS (atoll, long long, (const char *string) _GL_ARG_NONNULL ((1)));
|
_GL_FUNCDECL_SYS (atoll, long long, (const char *string)
|
||||||
|
_GL_ATTRIBUTE_PURE
|
||||||
|
_GL_ARG_NONNULL ((1)));
|
||||||
# endif
|
# endif
|
||||||
_GL_CXXALIAS_SYS (atoll, long long, (const char *string));
|
_GL_CXXALIAS_SYS (atoll, long long, (const char *string));
|
||||||
_GL_CXXALIASWARN (atoll);
|
_GL_CXXALIASWARN (atoll);
|
||||||
|
@ -177,7 +199,8 @@ _GL_CXXALIASWARN (canonicalize_file_name);
|
||||||
#elif defined GNULIB_POSIXCHECK
|
#elif defined GNULIB_POSIXCHECK
|
||||||
# undef canonicalize_file_name
|
# undef canonicalize_file_name
|
||||||
# if HAVE_RAW_DECL_CANONICALIZE_FILE_NAME
|
# if HAVE_RAW_DECL_CANONICALIZE_FILE_NAME
|
||||||
_GL_WARN_ON_USE (canonicalize_file_name, "canonicalize_file_name is unportable - "
|
_GL_WARN_ON_USE (canonicalize_file_name,
|
||||||
|
"canonicalize_file_name is unportable - "
|
||||||
"use gnulib module canonicalize-lgpl for portability");
|
"use gnulib module canonicalize-lgpl for portability");
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
@ -240,14 +263,19 @@ _GL_CXXALIASWARN (grantpt);
|
||||||
#elif defined GNULIB_POSIXCHECK
|
#elif defined GNULIB_POSIXCHECK
|
||||||
# undef grantpt
|
# undef grantpt
|
||||||
# if HAVE_RAW_DECL_GRANTPT
|
# if HAVE_RAW_DECL_GRANTPT
|
||||||
_GL_WARN_ON_USE (ptsname, "grantpt is not portable - "
|
_GL_WARN_ON_USE (grantpt, "grantpt is not portable - "
|
||||||
"use gnulib module grantpt for portability");
|
"use gnulib module grantpt for portability");
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* If _GL_USE_STDLIB_ALLOC is nonzero, the including module does not
|
||||||
|
rely on GNU or POSIX semantics for malloc and realloc (for example,
|
||||||
|
by never specifying a zero size), so it does not need malloc or
|
||||||
|
realloc to be redefined. */
|
||||||
#if @GNULIB_MALLOC_POSIX@
|
#if @GNULIB_MALLOC_POSIX@
|
||||||
# if @REPLACE_MALLOC@
|
# if @REPLACE_MALLOC@
|
||||||
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
# if !((defined __cplusplus && defined GNULIB_NAMESPACE) \
|
||||||
|
|| _GL_USE_STDLIB_ALLOC)
|
||||||
# undef malloc
|
# undef malloc
|
||||||
# define malloc rpl_malloc
|
# define malloc rpl_malloc
|
||||||
# endif
|
# endif
|
||||||
|
@ -257,13 +285,28 @@ _GL_CXXALIAS_RPL (malloc, void *, (size_t size));
|
||||||
_GL_CXXALIAS_SYS (malloc, void *, (size_t size));
|
_GL_CXXALIAS_SYS (malloc, void *, (size_t size));
|
||||||
# endif
|
# endif
|
||||||
_GL_CXXALIASWARN (malloc);
|
_GL_CXXALIASWARN (malloc);
|
||||||
#elif defined GNULIB_POSIXCHECK
|
#elif defined GNULIB_POSIXCHECK && !_GL_USE_STDLIB_ALLOC
|
||||||
# undef malloc
|
# undef malloc
|
||||||
/* Assume malloc is always declared. */
|
/* Assume malloc is always declared. */
|
||||||
_GL_WARN_ON_USE (malloc, "malloc is not POSIX compliant everywhere - "
|
_GL_WARN_ON_USE (malloc, "malloc is not POSIX compliant everywhere - "
|
||||||
"use gnulib module malloc-posix for portability");
|
"use gnulib module malloc-posix for portability");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Convert a multibyte character to a wide character. */
|
||||||
|
#if @GNULIB_MBTOWC@
|
||||||
|
# if @REPLACE_MBTOWC@
|
||||||
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
|
# undef mbtowc
|
||||||
|
# define mbtowc rpl_mbtowc
|
||||||
|
# endif
|
||||||
|
_GL_FUNCDECL_RPL (mbtowc, int, (wchar_t *pwc, const char *s, size_t n));
|
||||||
|
_GL_CXXALIAS_RPL (mbtowc, int, (wchar_t *pwc, const char *s, size_t n));
|
||||||
|
# else
|
||||||
|
_GL_CXXALIAS_SYS (mbtowc, int, (wchar_t *pwc, const char *s, size_t n));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIASWARN (mbtowc);
|
||||||
|
#endif
|
||||||
|
|
||||||
#if @GNULIB_MKDTEMP@
|
#if @GNULIB_MKDTEMP@
|
||||||
/* Create a unique temporary directory from TEMPLATE.
|
/* Create a unique temporary directory from TEMPLATE.
|
||||||
The last six characters of TEMPLATE must be "XXXXXX";
|
The last six characters of TEMPLATE must be "XXXXXX";
|
||||||
|
@ -396,13 +439,38 @@ _GL_WARN_ON_USE (mkstemps, "mkstemps is unportable - "
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if @GNULIB_POSIX_OPENPT@
|
||||||
|
/* Return an FD open to the master side of a pseudo-terminal. Flags should
|
||||||
|
include O_RDWR, and may also include O_NOCTTY. */
|
||||||
|
# if !@HAVE_POSIX_OPENPT@
|
||||||
|
_GL_FUNCDECL_SYS (posix_openpt, int, (int flags));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIAS_SYS (posix_openpt, int, (int flags));
|
||||||
|
_GL_CXXALIASWARN (posix_openpt);
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef posix_openpt
|
||||||
|
# if HAVE_RAW_DECL_POSIX_OPENPT
|
||||||
|
_GL_WARN_ON_USE (posix_openpt, "posix_openpt is not portable - "
|
||||||
|
"use gnulib module posix_openpt for portability");
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#if @GNULIB_PTSNAME@
|
#if @GNULIB_PTSNAME@
|
||||||
/* Return the pathname of the pseudo-terminal slave associated with
|
/* Return the pathname of the pseudo-terminal slave associated with
|
||||||
the master FD is open on, or NULL on errors. */
|
the master FD is open on, or NULL on errors. */
|
||||||
# if !@HAVE_PTSNAME@
|
# if @REPLACE_PTSNAME@
|
||||||
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
|
# undef ptsname
|
||||||
|
# define ptsname rpl_ptsname
|
||||||
|
# endif
|
||||||
|
_GL_FUNCDECL_RPL (ptsname, char *, (int fd));
|
||||||
|
_GL_CXXALIAS_RPL (ptsname, char *, (int fd));
|
||||||
|
# else
|
||||||
|
# if !@HAVE_PTSNAME@
|
||||||
_GL_FUNCDECL_SYS (ptsname, char *, (int fd));
|
_GL_FUNCDECL_SYS (ptsname, char *, (int fd));
|
||||||
# endif
|
# endif
|
||||||
_GL_CXXALIAS_SYS (ptsname, char *, (int fd));
|
_GL_CXXALIAS_SYS (ptsname, char *, (int fd));
|
||||||
|
# endif
|
||||||
_GL_CXXALIASWARN (ptsname);
|
_GL_CXXALIASWARN (ptsname);
|
||||||
#elif defined GNULIB_POSIXCHECK
|
#elif defined GNULIB_POSIXCHECK
|
||||||
# undef ptsname
|
# undef ptsname
|
||||||
|
@ -412,6 +480,32 @@ _GL_WARN_ON_USE (ptsname, "ptsname is not portable - "
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if @GNULIB_PTSNAME_R@
|
||||||
|
/* Set the pathname of the pseudo-terminal slave associated with
|
||||||
|
the master FD is open on and return 0, or set errno and return
|
||||||
|
non-zero on errors. */
|
||||||
|
# if @REPLACE_PTSNAME_R@
|
||||||
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
|
# undef ptsname_r
|
||||||
|
# define ptsname_r rpl_ptsname_r
|
||||||
|
# endif
|
||||||
|
_GL_FUNCDECL_RPL (ptsname_r, int, (int fd, char *buf, size_t len));
|
||||||
|
_GL_CXXALIAS_RPL (ptsname_r, int, (int fd, char *buf, size_t len));
|
||||||
|
# else
|
||||||
|
# if !@HAVE_PTSNAME_R@
|
||||||
|
_GL_FUNCDECL_SYS (ptsname_r, int, (int fd, char *buf, size_t len));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIAS_SYS (ptsname_r, int, (int fd, char *buf, size_t len));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIASWARN (ptsname_r);
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef ptsname_r
|
||||||
|
# if HAVE_RAW_DECL_PTSNAME_R
|
||||||
|
_GL_WARN_ON_USE (ptsname_r, "ptsname_r is not portable - "
|
||||||
|
"use gnulib module ptsname_r for portability");
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#if @GNULIB_PUTENV@
|
#if @GNULIB_PUTENV@
|
||||||
# if @REPLACE_PUTENV@
|
# if @REPLACE_PUTENV@
|
||||||
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
|
@ -435,12 +529,83 @@ _GL_CXXALIASWARN (putenv);
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if @GNULIB_RANDOM@
|
||||||
|
# if !@HAVE_RANDOM@
|
||||||
|
_GL_FUNCDECL_SYS (random, long, (void));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIAS_SYS (random, long, (void));
|
||||||
|
_GL_CXXALIASWARN (random);
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef random
|
||||||
|
# if HAVE_RAW_DECL_RANDOM
|
||||||
|
_GL_WARN_ON_USE (random, "random is unportable - "
|
||||||
|
"use gnulib module random for portability");
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if @GNULIB_RANDOM@
|
||||||
|
# if !@HAVE_RANDOM@
|
||||||
|
_GL_FUNCDECL_SYS (srandom, void, (unsigned int seed));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIAS_SYS (srandom, void, (unsigned int seed));
|
||||||
|
_GL_CXXALIASWARN (srandom);
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef srandom
|
||||||
|
# if HAVE_RAW_DECL_SRANDOM
|
||||||
|
_GL_WARN_ON_USE (srandom, "srandom is unportable - "
|
||||||
|
"use gnulib module random for portability");
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if @GNULIB_RANDOM@
|
||||||
|
# if !@HAVE_RANDOM@
|
||||||
|
_GL_FUNCDECL_SYS (initstate, char *,
|
||||||
|
(unsigned int seed, char *buf, size_t buf_size)
|
||||||
|
_GL_ARG_NONNULL ((2)));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIAS_SYS (initstate, char *,
|
||||||
|
(unsigned int seed, char *buf, size_t buf_size));
|
||||||
|
_GL_CXXALIASWARN (initstate);
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef initstate
|
||||||
|
# if HAVE_RAW_DECL_INITSTATE_R
|
||||||
|
_GL_WARN_ON_USE (initstate, "initstate is unportable - "
|
||||||
|
"use gnulib module random for portability");
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if @GNULIB_RANDOM@
|
||||||
|
# if !@HAVE_RANDOM@
|
||||||
|
_GL_FUNCDECL_SYS (setstate, char *, (char *arg_state) _GL_ARG_NONNULL ((1)));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIAS_SYS (setstate, char *, (char *arg_state));
|
||||||
|
_GL_CXXALIASWARN (setstate);
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef setstate
|
||||||
|
# if HAVE_RAW_DECL_SETSTATE_R
|
||||||
|
_GL_WARN_ON_USE (setstate, "setstate is unportable - "
|
||||||
|
"use gnulib module random for portability");
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#if @GNULIB_RANDOM_R@
|
#if @GNULIB_RANDOM_R@
|
||||||
# if !@HAVE_RANDOM_R@
|
# if @REPLACE_RANDOM_R@
|
||||||
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
|
# undef random_r
|
||||||
|
# define random_r rpl_random_r
|
||||||
|
# endif
|
||||||
|
_GL_FUNCDECL_RPL (random_r, int, (struct random_data *buf, int32_t *result)
|
||||||
|
_GL_ARG_NONNULL ((1, 2)));
|
||||||
|
_GL_CXXALIAS_RPL (random_r, int, (struct random_data *buf, int32_t *result));
|
||||||
|
# else
|
||||||
|
# if !@HAVE_RANDOM_R@
|
||||||
_GL_FUNCDECL_SYS (random_r, int, (struct random_data *buf, int32_t *result)
|
_GL_FUNCDECL_SYS (random_r, int, (struct random_data *buf, int32_t *result)
|
||||||
_GL_ARG_NONNULL ((1, 2)));
|
_GL_ARG_NONNULL ((1, 2)));
|
||||||
# endif
|
# endif
|
||||||
_GL_CXXALIAS_SYS (random_r, int, (struct random_data *buf, int32_t *result));
|
_GL_CXXALIAS_SYS (random_r, int, (struct random_data *buf, int32_t *result));
|
||||||
|
# endif
|
||||||
_GL_CXXALIASWARN (random_r);
|
_GL_CXXALIASWARN (random_r);
|
||||||
#elif defined GNULIB_POSIXCHECK
|
#elif defined GNULIB_POSIXCHECK
|
||||||
# undef random_r
|
# undef random_r
|
||||||
|
@ -451,13 +616,25 @@ _GL_WARN_ON_USE (random_r, "random_r is unportable - "
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if @GNULIB_RANDOM_R@
|
#if @GNULIB_RANDOM_R@
|
||||||
# if !@HAVE_RANDOM_R@
|
# if @REPLACE_RANDOM_R@
|
||||||
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
|
# undef srandom_r
|
||||||
|
# define srandom_r rpl_srandom_r
|
||||||
|
# endif
|
||||||
|
_GL_FUNCDECL_RPL (srandom_r, int,
|
||||||
|
(unsigned int seed, struct random_data *rand_state)
|
||||||
|
_GL_ARG_NONNULL ((2)));
|
||||||
|
_GL_CXXALIAS_RPL (srandom_r, int,
|
||||||
|
(unsigned int seed, struct random_data *rand_state));
|
||||||
|
# else
|
||||||
|
# if !@HAVE_RANDOM_R@
|
||||||
_GL_FUNCDECL_SYS (srandom_r, int,
|
_GL_FUNCDECL_SYS (srandom_r, int,
|
||||||
(unsigned int seed, struct random_data *rand_state)
|
(unsigned int seed, struct random_data *rand_state)
|
||||||
_GL_ARG_NONNULL ((2)));
|
_GL_ARG_NONNULL ((2)));
|
||||||
# endif
|
# endif
|
||||||
_GL_CXXALIAS_SYS (srandom_r, int,
|
_GL_CXXALIAS_SYS (srandom_r, int,
|
||||||
(unsigned int seed, struct random_data *rand_state));
|
(unsigned int seed, struct random_data *rand_state));
|
||||||
|
# endif
|
||||||
_GL_CXXALIASWARN (srandom_r);
|
_GL_CXXALIASWARN (srandom_r);
|
||||||
#elif defined GNULIB_POSIXCHECK
|
#elif defined GNULIB_POSIXCHECK
|
||||||
# undef srandom_r
|
# undef srandom_r
|
||||||
|
@ -468,15 +645,29 @@ _GL_WARN_ON_USE (srandom_r, "srandom_r is unportable - "
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if @GNULIB_RANDOM_R@
|
#if @GNULIB_RANDOM_R@
|
||||||
# if !@HAVE_RANDOM_R@
|
# if @REPLACE_RANDOM_R@
|
||||||
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
|
# undef initstate_r
|
||||||
|
# define initstate_r rpl_initstate_r
|
||||||
|
# endif
|
||||||
|
_GL_FUNCDECL_RPL (initstate_r, int,
|
||||||
|
(unsigned int seed, char *buf, size_t buf_size,
|
||||||
|
struct random_data *rand_state)
|
||||||
|
_GL_ARG_NONNULL ((2, 4)));
|
||||||
|
_GL_CXXALIAS_RPL (initstate_r, int,
|
||||||
|
(unsigned int seed, char *buf, size_t buf_size,
|
||||||
|
struct random_data *rand_state));
|
||||||
|
# else
|
||||||
|
# if !@HAVE_RANDOM_R@
|
||||||
_GL_FUNCDECL_SYS (initstate_r, int,
|
_GL_FUNCDECL_SYS (initstate_r, int,
|
||||||
(unsigned int seed, char *buf, size_t buf_size,
|
(unsigned int seed, char *buf, size_t buf_size,
|
||||||
struct random_data *rand_state)
|
struct random_data *rand_state)
|
||||||
_GL_ARG_NONNULL ((2, 4)));
|
_GL_ARG_NONNULL ((2, 4)));
|
||||||
# endif
|
# endif
|
||||||
_GL_CXXALIAS_SYS (initstate_r, int,
|
_GL_CXXALIAS_SYS (initstate_r, int,
|
||||||
(unsigned int seed, char *buf, size_t buf_size,
|
(unsigned int seed, char *buf, size_t buf_size,
|
||||||
struct random_data *rand_state));
|
struct random_data *rand_state));
|
||||||
|
# endif
|
||||||
_GL_CXXALIASWARN (initstate_r);
|
_GL_CXXALIASWARN (initstate_r);
|
||||||
#elif defined GNULIB_POSIXCHECK
|
#elif defined GNULIB_POSIXCHECK
|
||||||
# undef initstate_r
|
# undef initstate_r
|
||||||
|
@ -487,13 +678,25 @@ _GL_WARN_ON_USE (initstate_r, "initstate_r is unportable - "
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if @GNULIB_RANDOM_R@
|
#if @GNULIB_RANDOM_R@
|
||||||
# if !@HAVE_RANDOM_R@
|
# if @REPLACE_RANDOM_R@
|
||||||
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
|
# undef setstate_r
|
||||||
|
# define setstate_r rpl_setstate_r
|
||||||
|
# endif
|
||||||
|
_GL_FUNCDECL_RPL (setstate_r, int,
|
||||||
|
(char *arg_state, struct random_data *rand_state)
|
||||||
|
_GL_ARG_NONNULL ((1, 2)));
|
||||||
|
_GL_CXXALIAS_RPL (setstate_r, int,
|
||||||
|
(char *arg_state, struct random_data *rand_state));
|
||||||
|
# else
|
||||||
|
# if !@HAVE_RANDOM_R@
|
||||||
_GL_FUNCDECL_SYS (setstate_r, int,
|
_GL_FUNCDECL_SYS (setstate_r, int,
|
||||||
(char *arg_state, struct random_data *rand_state)
|
(char *arg_state, struct random_data *rand_state)
|
||||||
_GL_ARG_NONNULL ((1, 2)));
|
_GL_ARG_NONNULL ((1, 2)));
|
||||||
# endif
|
# endif
|
||||||
_GL_CXXALIAS_SYS (setstate_r, int,
|
_GL_CXXALIAS_SYS (setstate_r, int,
|
||||||
(char *arg_state, struct random_data *rand_state));
|
(char *arg_state, struct random_data *rand_state));
|
||||||
|
# endif
|
||||||
_GL_CXXALIASWARN (setstate_r);
|
_GL_CXXALIASWARN (setstate_r);
|
||||||
#elif defined GNULIB_POSIXCHECK
|
#elif defined GNULIB_POSIXCHECK
|
||||||
# undef setstate_r
|
# undef setstate_r
|
||||||
|
@ -506,7 +709,8 @@ _GL_WARN_ON_USE (setstate_r, "setstate_r is unportable - "
|
||||||
|
|
||||||
#if @GNULIB_REALLOC_POSIX@
|
#if @GNULIB_REALLOC_POSIX@
|
||||||
# if @REPLACE_REALLOC@
|
# if @REPLACE_REALLOC@
|
||||||
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
# if !((defined __cplusplus && defined GNULIB_NAMESPACE) \
|
||||||
|
|| _GL_USE_STDLIB_ALLOC)
|
||||||
# undef realloc
|
# undef realloc
|
||||||
# define realloc rpl_realloc
|
# define realloc rpl_realloc
|
||||||
# endif
|
# endif
|
||||||
|
@ -516,7 +720,7 @@ _GL_CXXALIAS_RPL (realloc, void *, (void *ptr, size_t size));
|
||||||
_GL_CXXALIAS_SYS (realloc, void *, (void *ptr, size_t size));
|
_GL_CXXALIAS_SYS (realloc, void *, (void *ptr, size_t size));
|
||||||
# endif
|
# endif
|
||||||
_GL_CXXALIASWARN (realloc);
|
_GL_CXXALIASWARN (realloc);
|
||||||
#elif defined GNULIB_POSIXCHECK
|
#elif defined GNULIB_POSIXCHECK && !_GL_USE_STDLIB_ALLOC
|
||||||
# undef realloc
|
# undef realloc
|
||||||
/* Assume realloc is always declared. */
|
/* Assume realloc is always declared. */
|
||||||
_GL_WARN_ON_USE (realloc, "realloc is not POSIX compliant everywhere - "
|
_GL_WARN_ON_USE (realloc, "realloc is not POSIX compliant everywhere - "
|
||||||
|
@ -563,6 +767,22 @@ _GL_WARN_ON_USE (rpmatch, "rpmatch is unportable - "
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if @GNULIB_SECURE_GETENV@
|
||||||
|
/* Look up NAME in the environment, returning 0 in insecure situations. */
|
||||||
|
# if !@HAVE_SECURE_GETENV@
|
||||||
|
_GL_FUNCDECL_SYS (secure_getenv, char *,
|
||||||
|
(char const *name) _GL_ARG_NONNULL ((1)));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIAS_SYS (secure_getenv, char *, (char const *name));
|
||||||
|
_GL_CXXALIASWARN (secure_getenv);
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef secure_getenv
|
||||||
|
# if HAVE_RAW_DECL_SECURE_GETENV
|
||||||
|
_GL_WARN_ON_USE (secure_getenv, "secure_getenv is unportable - "
|
||||||
|
"use gnulib module secure_getenv for portability");
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#if @GNULIB_SETENV@
|
#if @GNULIB_SETENV@
|
||||||
/* Set NAME to VALUE in the environment.
|
/* Set NAME to VALUE in the environment.
|
||||||
If REPLACE is nonzero, overwrite an existing value. */
|
If REPLACE is nonzero, overwrite an existing value. */
|
||||||
|
@ -577,7 +797,7 @@ _GL_FUNCDECL_RPL (setenv, int,
|
||||||
_GL_CXXALIAS_RPL (setenv, int,
|
_GL_CXXALIAS_RPL (setenv, int,
|
||||||
(const char *name, const char *value, int replace));
|
(const char *name, const char *value, int replace));
|
||||||
# else
|
# else
|
||||||
# if !@HAVE_SETENV@
|
# if !@HAVE_DECL_SETENV@
|
||||||
_GL_FUNCDECL_SYS (setenv, int,
|
_GL_FUNCDECL_SYS (setenv, int,
|
||||||
(const char *name, const char *value, int replace)
|
(const char *name, const char *value, int replace)
|
||||||
_GL_ARG_NONNULL ((1)));
|
_GL_ARG_NONNULL ((1)));
|
||||||
|
@ -585,7 +805,9 @@ _GL_FUNCDECL_SYS (setenv, int,
|
||||||
_GL_CXXALIAS_SYS (setenv, int,
|
_GL_CXXALIAS_SYS (setenv, int,
|
||||||
(const char *name, const char *value, int replace));
|
(const char *name, const char *value, int replace));
|
||||||
# endif
|
# endif
|
||||||
|
# if !(@REPLACE_SETENV@ && !@HAVE_DECL_SETENV@)
|
||||||
_GL_CXXALIASWARN (setenv);
|
_GL_CXXALIASWARN (setenv);
|
||||||
|
# endif
|
||||||
#elif defined GNULIB_POSIXCHECK
|
#elif defined GNULIB_POSIXCHECK
|
||||||
# undef setenv
|
# undef setenv
|
||||||
# if HAVE_RAW_DECL_SETENV
|
# if HAVE_RAW_DECL_SETENV
|
||||||
|
@ -695,12 +917,14 @@ _GL_WARN_ON_USE (unlockpt, "unlockpt is not portable - "
|
||||||
_GL_FUNCDECL_RPL (unsetenv, int, (const char *name) _GL_ARG_NONNULL ((1)));
|
_GL_FUNCDECL_RPL (unsetenv, int, (const char *name) _GL_ARG_NONNULL ((1)));
|
||||||
_GL_CXXALIAS_RPL (unsetenv, int, (const char *name));
|
_GL_CXXALIAS_RPL (unsetenv, int, (const char *name));
|
||||||
# else
|
# else
|
||||||
# if !@HAVE_UNSETENV@
|
# if !@HAVE_DECL_UNSETENV@
|
||||||
_GL_FUNCDECL_SYS (unsetenv, int, (const char *name) _GL_ARG_NONNULL ((1)));
|
_GL_FUNCDECL_SYS (unsetenv, int, (const char *name) _GL_ARG_NONNULL ((1)));
|
||||||
# endif
|
# endif
|
||||||
_GL_CXXALIAS_SYS (unsetenv, int, (const char *name));
|
_GL_CXXALIAS_SYS (unsetenv, int, (const char *name));
|
||||||
# endif
|
# endif
|
||||||
|
# if !(@REPLACE_UNSETENV@ && !@HAVE_DECL_UNSETENV@)
|
||||||
_GL_CXXALIASWARN (unsetenv);
|
_GL_CXXALIASWARN (unsetenv);
|
||||||
|
# endif
|
||||||
#elif defined GNULIB_POSIXCHECK
|
#elif defined GNULIB_POSIXCHECK
|
||||||
# undef unsetenv
|
# undef unsetenv
|
||||||
# if HAVE_RAW_DECL_UNSETENV
|
# if HAVE_RAW_DECL_UNSETENV
|
||||||
|
@ -709,7 +933,22 @@ _GL_WARN_ON_USE (unsetenv, "unsetenv is unportable - "
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Convert a wide character to a multibyte character. */
|
||||||
#endif /* _GL_STDLIB_H */
|
#if @GNULIB_WCTOMB@
|
||||||
#endif /* _GL_STDLIB_H */
|
# if @REPLACE_WCTOMB@
|
||||||
|
# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
|
||||||
|
# undef wctomb
|
||||||
|
# define wctomb rpl_wctomb
|
||||||
|
# endif
|
||||||
|
_GL_FUNCDECL_RPL (wctomb, int, (char *s, wchar_t wc));
|
||||||
|
_GL_CXXALIAS_RPL (wctomb, int, (char *s, wchar_t wc));
|
||||||
|
# else
|
||||||
|
_GL_CXXALIAS_SYS (wctomb, int, (char *s, wchar_t wc));
|
||||||
|
# endif
|
||||||
|
_GL_CXXALIASWARN (wctomb);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* _@GUARD_PREFIX@_STDLIB_H */
|
||||||
|
#endif /* _@GUARD_PREFIX@_STDLIB_H */
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* Case-insensitive string comparison function.
|
/* Case-insensitive string comparison function.
|
||||||
Copyright (C) 1998-1999, 2005-2007, 2009-2010 Free Software Foundation, Inc.
|
Copyright (C) 1998-1999, 2005-2007, 2009-2013 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -12,8 +12,7 @@
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program; if not, write to the Free Software Foundation,
|
along with this program; if not, see <http://www.gnu.org/licenses/>. */
|
||||||
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue