mirror of
https://github.com/postgres/postgres.git
synced 2025-07-28 23:42:10 +03:00
Use <stdint.h> and <inttypes.h> for c.h integers.
Redefine our exact width types with standard C99 types and macros, including int64_t, INT64_MAX, INT64_C(), PRId64 etc. We were already using <stdint.h> types in a few places. One complication is that Windows' <inttypes.h> uses format strings like "%I64d", "%I32", "%I" for PRI*64, PRI*32, PTR*PTR, instead of mapping to other standardized format strings like "%lld" etc as seen on other known systems. Teach our snprintf.c to understand them. This removes a lot of configure clutter, and should also allow 64-bit numbers and other standard types to be used in localized messages without casting. Reviewed-by: Peter Eisentraut <peter@eisentraut.org> Discussion: https://postgr.es/m/ME3P282MB3166F9D1F71F787929C0C7E7B6312%40ME3P282MB3166.AUSP282.PROD.OUTLOOK.COM
This commit is contained in:
52
configure.ac
52
configure.ac
@ -1604,6 +1604,7 @@ PGAC_C_STATIC_ASSERT
|
||||
PGAC_C_TYPEOF
|
||||
PGAC_C_TYPES_COMPATIBLE
|
||||
PGAC_C_BUILTIN_CONSTANT_P
|
||||
PGAC_C_BUILTIN_OP_OVERFLOW
|
||||
PGAC_C_BUILTIN_UNREACHABLE
|
||||
PGAC_C_COMPUTED_GOTO
|
||||
PGAC_STRUCT_TIMEZONE
|
||||
@ -1906,54 +1907,18 @@ for the exact reason.]])],
|
||||
# Run tests below here
|
||||
# --------------------
|
||||
|
||||
dnl Check to see if we have a working 64-bit integer type.
|
||||
dnl Since Postgres 8.4, we no longer support compilers without a working
|
||||
dnl 64-bit type; but we have to determine whether that type is called
|
||||
dnl "long int" or "long long int".
|
||||
|
||||
PGAC_TYPE_64BIT_INT([long int])
|
||||
|
||||
if test x"$HAVE_LONG_INT_64" = x"yes" ; then
|
||||
pg_int64_type="long int"
|
||||
else
|
||||
PGAC_TYPE_64BIT_INT([long long int])
|
||||
if test x"$HAVE_LONG_LONG_INT_64" = x"yes" ; then
|
||||
pg_int64_type="long long int"
|
||||
else
|
||||
AC_MSG_ERROR([Cannot find a working 64-bit integer type.])
|
||||
fi
|
||||
fi
|
||||
|
||||
AC_DEFINE_UNQUOTED(PG_INT64_TYPE, $pg_int64_type,
|
||||
[Define to the name of a signed 64-bit integer type.])
|
||||
|
||||
# Select the printf length modifier that goes with that, too.
|
||||
if test x"$pg_int64_type" = x"long long int" ; then
|
||||
INT64_MODIFIER='"ll"'
|
||||
else
|
||||
INT64_MODIFIER='"l"'
|
||||
fi
|
||||
|
||||
AC_DEFINE_UNQUOTED(INT64_MODIFIER, $INT64_MODIFIER,
|
||||
[Define to the appropriate printf length modifier for 64-bit ints.])
|
||||
|
||||
# has to be down here, rather than with the other builtins, because
|
||||
# the test uses PG_INT64_TYPE.
|
||||
PGAC_C_BUILTIN_OP_OVERFLOW
|
||||
|
||||
# Check size of void *, size_t (enables tweaks for > 32bit address space)
|
||||
AC_CHECK_SIZEOF([void *])
|
||||
AC_CHECK_SIZEOF([size_t])
|
||||
AC_CHECK_SIZEOF([long])
|
||||
AC_CHECK_SIZEOF([long long])
|
||||
|
||||
# Determine memory alignment requirements for the basic C data types.
|
||||
|
||||
AC_CHECK_ALIGNOF(short)
|
||||
AC_CHECK_ALIGNOF(int)
|
||||
AC_CHECK_ALIGNOF(long)
|
||||
if test x"$HAVE_LONG_LONG_INT_64" = x"yes" ; then
|
||||
AC_CHECK_ALIGNOF(long long int)
|
||||
fi
|
||||
AC_CHECK_ALIGNOF(int64_t)
|
||||
AC_CHECK_ALIGNOF(double)
|
||||
|
||||
# Compute maximum alignment of any basic type.
|
||||
@ -1977,12 +1942,11 @@ MAX_ALIGNOF=$ac_cv_alignof_double
|
||||
if test $ac_cv_alignof_long -gt $MAX_ALIGNOF ; then
|
||||
AC_MSG_ERROR([alignment of 'long' is greater than the alignment of 'double'])
|
||||
fi
|
||||
if test x"$HAVE_LONG_LONG_INT_64" = xyes && test $ac_cv_alignof_long_long_int -gt $MAX_ALIGNOF ; then
|
||||
AC_MSG_ERROR([alignment of 'long long int' is greater than the alignment of 'double'])
|
||||
if test $ac_cv_alignof_int64_t -gt $MAX_ALIGNOF ; then
|
||||
AC_MSG_ERROR([alignment of 'int64_t' is greater than the alignment of 'double'])
|
||||
fi
|
||||
AC_DEFINE_UNQUOTED(MAXIMUM_ALIGNOF, $MAX_ALIGNOF, [Define as the maximum alignment requirement of any C data type.])
|
||||
|
||||
|
||||
# Some compilers offer a 128-bit integer scalar type.
|
||||
PGAC_TYPE_128BIT_INT
|
||||
|
||||
@ -2472,12 +2436,6 @@ AC_CONFIG_HEADERS([src/include/pg_config.h],
|
||||
echo >src/include/stamp-h
|
||||
])
|
||||
|
||||
AC_CONFIG_HEADERS([src/include/pg_config_ext.h],
|
||||
[
|
||||
# Update timestamp for pg_config_ext.h (see Makefile.global)
|
||||
echo >src/include/stamp-ext-h
|
||||
])
|
||||
|
||||
AC_CONFIG_HEADERS([src/interfaces/ecpg/include/ecpg_config.h],
|
||||
[echo >src/interfaces/ecpg/include/stamp-h])
|
||||
|
||||
|
Reference in New Issue
Block a user