1
0
mirror of https://github.com/postgres/postgres.git synced 2025-08-31 17:02:12 +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:
Thomas Munro
2024-12-04 14:46:59 +13:00
parent 3b08d5224d
commit 962da900ac
25 changed files with 272 additions and 582 deletions

View File

@@ -131,11 +131,12 @@ sqlda_dynamic_type(Oid type, enum COMPAT_MODE compat)
case INTERVALOID:
return ECPGt_interval;
case INT8OID:
#ifdef HAVE_LONG_LONG_INT_64
return ECPGt_long_long;
#endif
#ifdef HAVE_LONG_INT_64
#if SIZEOF_LONG == 8
return ECPGt_long;
#elif SIZEOF_LONG_LONG == 8
return ECPGt_long_long;
#else
#error "cannot find integer type of the same size as INT8OID"
#endif
/* Unhandled types always return a string */
default:

View File

@@ -1,8 +1,8 @@
/* Define to 1 to build client libraries as thread-safe code. */
#define ENABLE_THREAD_SAFETY 1
/* Define to 1 if `long int' works and is 64 bits. */
#undef HAVE_LONG_INT_64
/* The size of `long', as computed by sizeof. */
#undef SIZEOF_LONG
/* Define to 1 if `long long int' works and is 64 bits. */
#undef HAVE_LONG_LONG_INT_64
/* The size of `long long', as computed by sizeof. */
#undef SIZEOF_LONG_LONG

View File

@@ -3,8 +3,8 @@
ecpg_inc = include_directories('.')
ecpg_conf_keys = [
'HAVE_LONG_INT_64',
'HAVE_LONG_LONG_INT_64',
'SIZEOF_LONG',
'SIZEOF_LONG_LONG',
]
ecpg_conf_data = configuration_data()

View File

@@ -3,21 +3,17 @@
#ifndef PGTYPES_INTERVAL
#define PGTYPES_INTERVAL
#include <stdint.h>
#include <ecpg_config.h>
#include <pgtypes.h>
#ifndef C_H
#ifdef HAVE_LONG_INT_64
typedef long int int64;
#elif defined(HAVE_LONG_LONG_INT_64)
typedef long long int int64;
#else
/* neither HAVE_LONG_INT_64 nor HAVE_LONG_LONG_INT_64 */
#error must have a working 64-bit integer datatype
#endif
typedef int64_t int64;
#define HAVE_INT64_TIMESTAMP
#endif /* C_H */
typedef struct

View File

@@ -46,12 +46,14 @@
#define SQLINTERVAL ECPGt_interval
#define SQLNCHAR ECPGt_char
#define SQLNVCHAR ECPGt_char
#ifdef HAVE_LONG_LONG_INT_64
#if SIZEOF_LONG == 8
#define SQLINT8 ECPGt_long
#define SQLSERIAL8 ECPGt_long
#elif SIZEOF_LONG_LONG == 8
#define SQLINT8 ECPGt_long_long
#define SQLSERIAL8 ECPGt_long_long
#else
#define SQLINT8 ECPGt_long
#define SQLSERIAL8 ECPGt_long
#error "cannot find integer type of the same size as SQLINT8"
#endif
#endif /* ndef ECPG_SQLTYPES_H */

View File

@@ -97,12 +97,14 @@ typedef struct sqlda_struct sqlda_t;
#define SQLINTERVAL ECPGt_interval
#define SQLNCHAR ECPGt_char
#define SQLNVCHAR ECPGt_char
#ifdef HAVE_LONG_LONG_INT_64
#if SIZEOF_LONG == 8
#define SQLINT8 ECPGt_long
#define SQLSERIAL8 ECPGt_long
#elif SIZEOF_LONG_LONG == 8
#define SQLINT8 ECPGt_long_long
#define SQLSERIAL8 ECPGt_long_long
#else
#define SQLINT8 ECPGt_long
#define SQLSERIAL8 ECPGt_long
#error "cannot find integer type of the same size as SQLINT8"
#endif
#endif /* ndef ECPG_SQLTYPES_H */