| These changes are mostly inherited from previous iterations | |
| of gnulib-printf-in-glib. | |
| Here are explanations for some of them: | |
| * g-gnulib.h is a minimal replacement for gnulib config.h | |
| * gnulib_math.h is a processed copy of gnulib math.in.h | |
| We can't keep it named math.h, since we need to include | |
| both the system math.h and this header in some places. | |
| * gnulib_math.h needs _GL_ATTRIBUTE_CONST, put it directly | |
| there instead of getting it from config.h | |
| Also, instead of copying _GL_FUNCDECL_RPL and _GL_WARN_ON_USE | |
| we simply include headers where these macros are defined. | |
| * isnan source files get extra includes, in gnulib these | |
| were probably handled by makefiles and/or configure scripts | |
| * glib has a test result named HAVE_LONG_LONG instead of HAVE_LONG_LONG_INT, | |
| so make the code use that | |
| * One of the goals of using this gnulib implementation in glib is | |
| to have C99-compliant 3-digit exponent, therefore gnulib | |
| ifdefs that *disable* that behaviour are altered to keep it enabled. | |
| Another possible location for such a change is where %n use is | |
| being enabled or disabled. That, however, is not activated anyway, | |
| because this code is made not to use snprintf | |
| * glib has G_MAXSIZE instead of SIZE_MAX, so use that | |
| * The code is made to use glib alloca header | |
| --- glib-82c3e92/glib/gnulib/asnprintf.c 2019-02-09 09:44:55.013866300 +0000 | |
| +++ glib-82c3e92/glib/gnulib/asnprintf.c 2019-02-09 10:08:46.444859600 +0000 | |
| @@ -16,6 +16,8 @@ | |
| #include <config.h> | |
| +#include "g-gnulib.h" | |
| + | |
| /* Specification. */ | |
| #include "vasnprintf.h" | |
| --- glib-82c3e92/glib/gnulib/isnand.c 2019-02-09 09:44:56.075691800 +0000 | |
| +++ glib-82c3e92/glib/gnulib/isnand.c 2019-02-09 10:09:35.443191100 +0000 | |
| @@ -16,4 +16,7 @@ | |
| /* Written by Bruno Haible <bruno@clisp.org>, 2008. */ | |
| +#include <config.h> | |
| +#include "gnulib_math.h" | |
| +#include "isnand-nolibm.h" | |
| #include "isnan.c" | |
| --- glib-82c3e92/glib/gnulib/isnand-nolibm.h 2019-02-09 09:44:55.973651800 +0000 | |
| +++ glib-82c3e92/glib/gnulib/isnand-nolibm.h 2019-02-09 10:09:17.089604000 +0000 | |
| @@ -16,7 +16,7 @@ | |
| #if HAVE_ISNAND_IN_LIBC | |
| /* Get declaration of isnan macro. */ | |
| -# include <math.h> | |
| +# include <gnulib_math.h> | |
| # if __GNUC__ >= 4 | |
| /* GCC 4.0 and newer provides three built-ins for isnan. */ | |
| # undef isnand | |
| --- glib-82c3e92/glib/gnulib/isnanl.c 2019-02-09 09:44:56.285650400 +0000 | |
| +++ glib-82c3e92/glib/gnulib/isnanl.c 2019-02-09 10:10:00.060305200 +0000 | |
| @@ -17,4 +17,7 @@ | |
| /* Written by Bruno Haible <bruno@clisp.org>, 2007. */ | |
| #define USE_LONG_DOUBLE | |
| +#include <config.h> | |
| +#include "gnulib_math.h" | |
| +#include "isnanl-nolibm.h" | |
| #include "isnan.c" | |
| --- glib-82c3e92/glib/gnulib/isnanl-nolibm.h 2019-02-09 09:44:56.181628200 +0000 | |
| +++ glib-82c3e92/glib/gnulib/isnanl-nolibm.h 2019-02-09 10:09:45.731187400 +0000 | |
| @@ -16,7 +16,7 @@ | |
| #if HAVE_ISNANL_IN_LIBC | |
| /* Get declaration of isnan macro or (older) isnanl function. */ | |
| -# include <math.h> | |
| +# include <gnulib_math.h> | |
| # if __GNUC__ >= 4 | |
| /* GCC 4.0 and newer provides three built-ins for isnan. */ | |
| # undef isnanl | |
| --- glib-82c3e92/glib/gnulib/printf-args.c 2019-02-09 09:44:57.147081400 +0000 | |
| +++ glib-82c3e92/glib/gnulib/printf-args.c 2019-02-09 10:10:45.869597700 +0000 | |
| @@ -24,6 +24,8 @@ | |
| # include <config.h> | |
| #endif | |
| +#include "g-gnulib.h" | |
| + | |
| /* Specification. */ | |
| #ifndef PRINTF_FETCHARGS | |
| # include "printf-args.h" | |
| @@ -65,7 +67,7 @@ | |
| case TYPE_ULONGINT: | |
| ap->a.a_ulongint = va_arg (args, unsigned long int); | |
| break; | |
| -#if HAVE_LONG_LONG_INT | |
| +#if HAVE_LONG_LONG | |
| case TYPE_LONGLONGINT: | |
| ap->a.a_longlongint = va_arg (args, long long int); | |
| break; | |
| @@ -135,7 +137,7 @@ | |
| case TYPE_COUNT_LONGINT_POINTER: | |
| ap->a.a_count_longint_pointer = va_arg (args, long int *); | |
| break; | |
| -#if HAVE_LONG_LONG_INT | |
| +#if HAVE_LONG_LONG | |
| case TYPE_COUNT_LONGLONGINT_POINTER: | |
| ap->a.a_count_longlongint_pointer = va_arg (args, long long int *); | |
| break; | |
| --- glib-82c3e92/glib/gnulib/printf-args.h 2019-02-09 09:44:57.245167700 +0000 | |
| +++ glib-82c3e92/glib/gnulib/printf-args.h 2019-02-09 10:10:55.543592500 +0000 | |
| @@ -57,7 +57,7 @@ | |
| TYPE_UINT, | |
| TYPE_LONGINT, | |
| TYPE_ULONGINT, | |
| -#if HAVE_LONG_LONG_INT | |
| +#if HAVE_LONG_LONG | |
| TYPE_LONGLONGINT, | |
| TYPE_ULONGLONGINT, | |
| #endif | |
| @@ -76,7 +76,7 @@ | |
| TYPE_COUNT_SHORT_POINTER, | |
| TYPE_COUNT_INT_POINTER, | |
| TYPE_COUNT_LONGINT_POINTER | |
| -#if HAVE_LONG_LONG_INT | |
| +#if HAVE_LONG_LONG | |
| , TYPE_COUNT_LONGLONGINT_POINTER | |
| #endif | |
| #if ENABLE_UNISTDIO | |
| @@ -101,7 +101,7 @@ | |
| unsigned int a_uint; | |
| long int a_longint; | |
| unsigned long int a_ulongint; | |
| -#if HAVE_LONG_LONG_INT | |
| +#if HAVE_LONG_LONG | |
| long long int a_longlongint; | |
| unsigned long long int a_ulonglongint; | |
| #endif | |
| @@ -121,7 +121,7 @@ | |
| short * a_count_short_pointer; | |
| int * a_count_int_pointer; | |
| long int * a_count_longint_pointer; | |
| -#if HAVE_LONG_LONG_INT | |
| +#if HAVE_LONG_LONG | |
| long long int * a_count_longlongint_pointer; | |
| #endif | |
| #if ENABLE_UNISTDIO | |
| --- glib-82c3e92/glib/gnulib/printf-frexp.c 2019-02-09 09:44:57.355099800 +0000 | |
| +++ glib-82c3e92/glib/gnulib/printf-frexp.c 2019-02-09 10:11:15.476905600 +0000 | |
| @@ -26,7 +26,7 @@ | |
| #endif | |
| #include <float.h> | |
| -#include <math.h> | |
| +#include <gnulib_math.h> | |
| #ifdef USE_LONG_DOUBLE | |
| # include "fpucw.h" | |
| #endif | |
| --- glib-82c3e92/glib/gnulib/printf-parse.c 2019-02-09 09:44:57.790835100 +0000 | |
| +++ glib-82c3e92/glib/gnulib/printf-parse.c 2019-02-09 10:11:32.783744500 +0000 | |
| @@ -31,6 +31,8 @@ | |
| # include <config.h> | |
| #endif | |
| +#include "g-gnulib.h" | |
| + | |
| /* Specification. */ | |
| #ifndef PRINTF_PARSE | |
| # include "printf-parse.h" | |
| @@ -447,7 +449,7 @@ | |
| switch (c) | |
| { | |
| case 'd': case 'i': | |
| -#if HAVE_LONG_LONG_INT | |
| +#if HAVE_LONG_LONG | |
| /* If 'long long' exists and is larger than 'long': */ | |
| if (flags >= 16 || (flags & 4)) | |
| type = TYPE_LONGLONGINT; | |
| @@ -465,7 +467,7 @@ | |
| type = TYPE_INT; | |
| break; | |
| case 'o': case 'u': case 'x': case 'X': | |
| -#if HAVE_LONG_LONG_INT | |
| +#if HAVE_LONG_LONG | |
| /* If 'long long' exists and is larger than 'long': */ | |
| if (flags >= 16 || (flags & 4)) | |
| type = TYPE_ULONGLONGINT; | |
| @@ -525,7 +527,7 @@ | |
| type = TYPE_POINTER; | |
| break; | |
| case 'n': | |
| -#if HAVE_LONG_LONG_INT | |
| +#if HAVE_LONG_LONG | |
| /* If 'long long' exists and is larger than 'long': */ | |
| if (flags >= 16 || (flags & 4)) | |
| type = TYPE_COUNT_LONGLONGINT_POINTER; | |
| --- glib-82c3e92/glib/gnulib/vasnprintf.c 2019-02-09 09:44:58.585342000 +0000 | |
| +++ glib-82c3e92/glib/gnulib/vasnprintf.c 2019-02-09 10:22:13.196848200 +0000 | |
| @@ -43,19 +43,21 @@ | |
| DCHAR_IS_UINT16_T Set to 1 if DCHAR_T is uint16_t. | |
| DCHAR_IS_UINT32_T Set to 1 if DCHAR_T is uint32_t. */ | |
| +#ifndef _WIN32 | |
| /* Tell glibc's <stdio.h> to provide a prototype for snprintf(). | |
| This must come before <config.h> because <config.h> may include | |
| <features.h>, and once <features.h> has been included, it's too late. */ | |
| #ifndef _GNU_SOURCE | |
| # define _GNU_SOURCE 1 | |
| #endif | |
| +#endif | |
| #ifndef VASNPRINTF | |
| # include <config.h> | |
| #endif | |
| -#ifndef IN_LIBINTL | |
| -# include <alloca.h> | |
| -#endif | |
| +#include "glib/galloca.h" | |
| + | |
| +#include "g-gnulib.h" | |
| /* Specification. */ | |
| #ifndef VASNPRINTF | |
| @@ -90,29 +92,29 @@ | |
| #include "verify.h" | |
| #if (NEED_PRINTF_DOUBLE || NEED_PRINTF_LONG_DOUBLE) && !defined IN_LIBINTL | |
| -# include <math.h> | |
| +# include <gnulib_math.h> | |
| # include "float+.h" | |
| #endif | |
| #if (NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_DOUBLE) && !defined IN_LIBINTL | |
| -# include <math.h> | |
| +# include <gnulib_math.h> | |
| # include "isnand-nolibm.h" | |
| #endif | |
| #if (NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE) && !defined IN_LIBINTL | |
| -# include <math.h> | |
| +# include <gnulib_math.h> | |
| # include "isnanl-nolibm.h" | |
| # include "fpucw.h" | |
| #endif | |
| #if (NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_DOUBLE) && !defined IN_LIBINTL | |
| -# include <math.h> | |
| +# include <gnulib_math.h> | |
| # include "isnand-nolibm.h" | |
| # include "printf-frexp.h" | |
| #endif | |
| #if (NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_LONG_DOUBLE) && !defined IN_LIBINTL | |
| -# include <math.h> | |
| +# include <gnulib_math.h> | |
| # include "isnanl-nolibm.h" | |
| # include "printf-frexpl.h" | |
| # include "fpucw.h" | |
| @@ -1553,7 +1555,7 @@ | |
| switch (conversion) | |
| { | |
| case 'd': case 'i': case 'u': | |
| -# if HAVE_LONG_LONG_INT | |
| +# if HAVE_LONG_LONG | |
| if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT) | |
| tmp_length = | |
| (unsigned int) (sizeof (unsigned long long) * CHAR_BIT | |
| @@ -1583,7 +1585,7 @@ | |
| break; | |
| case 'o': | |
| -# if HAVE_LONG_LONG_INT | |
| +# if HAVE_LONG_LONG | |
| if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT) | |
| tmp_length = | |
| (unsigned int) (sizeof (unsigned long long) * CHAR_BIT | |
| @@ -1611,7 +1613,7 @@ | |
| break; | |
| case 'x': case 'X': | |
| -# if HAVE_LONG_LONG_INT | |
| +# if HAVE_LONG_LONG | |
| if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT) | |
| tmp_length = | |
| (unsigned int) (sizeof (unsigned long long) * CHAR_BIT | |
| @@ -1939,7 +1941,7 @@ | |
| case TYPE_COUNT_LONGINT_POINTER: | |
| *a.arg[dp->arg_index].a.a_count_longint_pointer = length; | |
| break; | |
| -#if HAVE_LONG_LONG_INT | |
| +#if HAVE_LONG_LONG | |
| case TYPE_COUNT_LONGLONGINT_POINTER: | |
| *a.arg[dp->arg_index].a.a_count_longlongint_pointer = length; | |
| break; | |
| @@ -4245,7 +4247,7 @@ | |
| static const wchar_t decimal_format[] = | |
| /* Produce the same number of exponent digits | |
| as the native printf implementation. */ | |
| -# if defined _WIN32 && ! defined __CYGWIN__ | |
| +# if (defined _WIN32 && FALSE) && ! defined __CYGWIN__ | |
| { '%', '+', '.', '3', 'd', '\0' }; | |
| # else | |
| { '%', '+', '.', '2', 'd', '\0' }; | |
| @@ -4259,7 +4261,7 @@ | |
| static const char decimal_format[] = | |
| /* Produce the same number of exponent digits | |
| as the native printf implementation. */ | |
| -# if defined _WIN32 && ! defined __CYGWIN__ | |
| +# if (defined _WIN32 && FALSE) && ! defined __CYGWIN__ | |
| "%+.3d"; | |
| # else | |
| "%+.2d"; | |
| @@ -4438,7 +4440,7 @@ | |
| static const wchar_t decimal_format[] = | |
| /* Produce the same number of exponent digits | |
| as the native printf implementation. */ | |
| -# if defined _WIN32 && ! defined __CYGWIN__ | |
| +# if (defined _WIN32 && FALSE) && ! defined __CYGWIN__ | |
| { '%', '+', '.', '3', 'd', '\0' }; | |
| # else | |
| { '%', '+', '.', '2', 'd', '\0' }; | |
| @@ -4452,7 +4454,7 @@ | |
| static const char decimal_format[] = | |
| /* Produce the same number of exponent digits | |
| as the native printf implementation. */ | |
| -# if defined _WIN32 && ! defined __CYGWIN__ | |
| +# if (defined _WIN32 && FALSE) && ! defined __CYGWIN__ | |
| "%+.3d"; | |
| # else | |
| "%+.2d"; | |
| @@ -4510,7 +4512,7 @@ | |
| *p++ = '+'; | |
| /* Produce the same number of exponent digits as | |
| the native printf implementation. */ | |
| -# if defined _WIN32 && ! defined __CYGWIN__ | |
| +# if (defined _WIN32 && FALSE) && ! defined __CYGWIN__ | |
| *p++ = '0'; | |
| # endif | |
| *p++ = '0'; | |
| @@ -4835,10 +4837,10 @@ | |
| switch (type) | |
| { | |
| -#if HAVE_LONG_LONG_INT | |
| +#if HAVE_LONG_LONG | |
| case TYPE_LONGLONGINT: | |
| case TYPE_ULONGLONGINT: | |
| -# if defined _WIN32 && ! defined __CYGWIN__ | |
| +# if (defined _WIN32 && FALSE) && ! defined __CYGWIN__ | |
| *fbp++ = 'I'; | |
| *fbp++ = '6'; | |
| *fbp++ = '4'; | |
| @@ -5063,7 +5065,7 @@ | |
| SNPRINTF_BUF (arg); | |
| } | |
| break; | |
| -#if HAVE_LONG_LONG_INT | |
| +#if HAVE_LONG_LONG | |
| case TYPE_LONGLONGINT: | |
| { | |
| long long int arg = a.arg[dp->arg_index].a.a_longlongint; | |
| --- glib-82c3e92/glib/gnulib/xsize.h 2019-02-09 09:44:59.231076600 +0000 | |
| +++ glib-82c3e92/glib/gnulib/xsize.h 2019-02-09 10:21:28.789553900 +0000 | |
| @@ -18,10 +18,12 @@ | |
| #ifndef _XSIZE_H | |
| #define _XSIZE_H | |
| +#include <glib.h> | |
| + | |
| /* Get size_t. */ | |
| #include <stddef.h> | |
| -/* Get SIZE_MAX. */ | |
| +/* Get G_MAXSIZE. */ | |
| #include <limits.h> | |
| #if HAVE_STDINT_H | |
| # include <stdint.h> | |
| @@ -42,8 +44,8 @@ | |
| returns a piece of memory that is way too small, and the program then | |
| crashes while attempting to fill the memory. | |
| To avoid this, the functions and macros in this file check for overflow. | |
| - The convention is that SIZE_MAX represents overflow. | |
| - malloc (SIZE_MAX) is not guaranteed to fail -- think of a malloc | |
| + The convention is that G_MAXSIZE represents overflow. | |
| + malloc (G_MAXSIZE) is not guaranteed to fail -- think of a malloc | |
| implementation that uses mmap --, it's recommended to use size_overflow_p() | |
| or size_in_bounds_p() before invoking malloc(). | |
| The example thus becomes: | |
| @@ -53,7 +55,7 @@ | |
| /* Convert an arbitrary value >= 0 to type size_t. */ | |
| #define xcast_size_t(N) \ | |
| - ((N) <= SIZE_MAX ? (size_t) (N) : SIZE_MAX) | |
| + ((N) <= G_MAXSIZE ? (size_t) (N) : G_MAXSIZE) | |
| /* Sum of two sizes, with overflow check. */ | |
| XSIZE_INLINE size_t | |
| @@ -63,7 +65,7 @@ | |
| xsum (size_t size1, size_t size2) | |
| { | |
| size_t sum = size1 + size2; | |
| - return (sum >= size1 ? sum : SIZE_MAX); | |
| + return (sum >= size1 ? sum : G_MAXSIZE); | |
| } | |
| /* Sum of three sizes, with overflow check. */ | |
| @@ -94,23 +96,23 @@ | |
| xmax (size_t size1, size_t size2) | |
| { | |
| /* No explicit check is needed here, because for any n: | |
| - max (SIZE_MAX, n) == SIZE_MAX and max (n, SIZE_MAX) == SIZE_MAX. */ | |
| + max (G_MAXSIZE, n) == G_MAXSIZE and max (n, G_MAXSIZE) == G_MAXSIZE. */ | |
| return (size1 >= size2 ? size1 : size2); | |
| } | |
| /* Multiplication of a count with an element size, with overflow check. | |
| The count must be >= 0 and the element size must be > 0. | |
| This is a macro, not a function, so that it works correctly even | |
| - when N is of a wider type and N > SIZE_MAX. */ | |
| + when N is of a wider type and N > G_MAXSIZE. */ | |
| #define xtimes(N, ELSIZE) \ | |
| - ((N) <= SIZE_MAX / (ELSIZE) ? (size_t) (N) * (ELSIZE) : SIZE_MAX) | |
| + ((N) <= G_MAXSIZE / (ELSIZE) ? (size_t) (N) * (ELSIZE) : G_MAXSIZE) | |
| /* Check for overflow. */ | |
| #define size_overflow_p(SIZE) \ | |
| - ((SIZE) == SIZE_MAX) | |
| + ((SIZE) == G_MAXSIZE) | |
| /* Check against overflow. */ | |
| #define size_in_bounds_p(SIZE) \ | |
| - ((SIZE) != SIZE_MAX) | |
| + ((SIZE) != G_MAXSIZE) | |
| _GL_INLINE_HEADER_END | |
| --- a/glib/gnulib/gnulib_math.h.in | |
| +++ b/glib/gnulib/gnulib_math.h.in | |
| @@ -25,6 +25,13 @@ | |
| /* The include_next requires a split double-inclusion guard. */ | |
| #@INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ @NEXT_AS_FIRST_DIRECTIVE_MATH_H@ | |
| +/* The __const__ attribute was added in gcc 2.95. */ | |
| +#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95) | |
| +# define _GL_ATTRIBUTE_CONST __attribute__ ((__const__)) | |
| +#else | |
| +# define _GL_ATTRIBUTE_CONST /* empty */ | |
| +#endif | |
| + | |
| #ifndef _@GUARD_PREFIX@_MATH_H | |
| #define _@GUARD_PREFIX@_MATH_H | |
| @@ -41,9 +48,9 @@ _GL_INLINE_HEADER_BEGIN | |
| # define _GL_MATH_INLINE _GL_INLINE | |
| #endif | |
| -/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */ | |
| +#include "c++defs.h" | |
| -/* The definition of _GL_ARG_NONNULL is copied here. */ | |
| +#include "arg-nonnull.h" | |
| /* The definition of _GL_WARN_ON_USE is copied here. */ | |