diff options
-rw-r--r-- | glib/glibconfig.h.in | 47 | ||||
-rw-r--r-- | meson.build | 120 | ||||
-rw-r--r-- | tests/type-test.c | 17 |
3 files changed, 83 insertions, 101 deletions
diff --git a/glib/glibconfig.h.in b/glib/glibconfig.h.in index 7ef8c481d..13c5ca93c 100644 --- a/glib/glibconfig.h.in +++ b/glib/glibconfig.h.in @@ -10,6 +10,8 @@ #include <limits.h> #include <float.h> +#include <stdint.h> +#include <inttypes.h> #mesondefine GLIB_HAVE_ALLOCA_H /* Specifies that GLib's g_print*() functions wrap the @@ -37,37 +39,54 @@ G_BEGIN_DECLS #define G_MAXLONG LONG_MAX #define G_MAXULONG ULONG_MAX -typedef signed char gint8; -typedef unsigned char guint8; +typedef int8_t gint8; +typedef uint8_t guint8; -typedef signed @gint16@ gint16; -typedef unsigned @gint16@ guint16; +#define G_GINT8_PRINTF_FORMAT PRId8 +#define G_GINT8_SCANF_FORMAT SCNd8 +#define G_GUINT8_PRINTF_FORMAT PRIu8 +#define G_GUINT8_SCANF_FORMAT SCNu8 + +typedef int16_t gint16; +typedef uint16_t guint16; #define G_GINT16_MODIFIER @gint16_modifier@ #define G_GINT16_FORMAT @gint16_format@ #define G_GUINT16_FORMAT @guint16_format@ +#define G_GINT16_PRINTF_FORMAT PRId16 +#define G_GINT16_SCANF_FORMAT SCNd16 +#define G_GUINT16_PRINTF_FORMAT PRIu16 +#define G_GUINT16_SCANF_FORMAT SCNu16 -typedef signed @gint32@ gint32; -typedef unsigned @gint32@ guint32; +typedef int32_t gint32; +typedef uint32_t guint32; #define G_GINT32_MODIFIER @gint32_modifier@ #define G_GINT32_FORMAT @gint32_format@ #define G_GUINT32_FORMAT @guint32_format@ +#define G_GINT32_PRINTF_FORMAT PRId32 +#define G_GINT32_SCANF_FORMAT SCNd32 +#define G_GUINT32_PRINTF_FORMAT PRIu32 +#define G_GUINT32_SCANF_FORMAT SCNu32 #define G_HAVE_GINT64 1 /* deprecated, always true */ -@glib_extension@typedef signed @gint64@ gint64; -@glib_extension@typedef unsigned @gint64@ guint64; +typedef int64_t gint64; +typedef uint64_t guint64; -#define G_GINT64_CONSTANT(val) @gint64_constant@ -#define G_GUINT64_CONSTANT(val) @guint64_constant@ +#define G_GINT64_CONSTANT(val) INT64_C(val) +#define G_GUINT64_CONSTANT(val) UINT64_C(val) #define G_GINT64_MODIFIER @gint64_modifier@ #define G_GINT64_FORMAT @gint64_format@ #define G_GUINT64_FORMAT @guint64_format@ +#define G_GINT64_PRINTF_FORMAT PRId64 +#define G_GINT64_SCANF_FORMAT SCNd64 +#define G_GUINT64_PRINTF_FORMAT PRIu64 +#define G_GUINT64_SCANF_FORMAT SCNu64 #define GLIB_SIZEOF_VOID_P @glib_void_p@ #define GLIB_SIZEOF_LONG @glib_long@ @@ -75,13 +94,13 @@ typedef unsigned @gint32@ guint32; #define GLIB_SIZEOF_SSIZE_T @glib_ssize_t@ typedef signed @glib_size_type_define@ gssize; -typedef unsigned @glib_size_type_define@ gsize; +typedef size_t gsize; #define G_GSIZE_MODIFIER @gsize_modifier@ #define G_GSSIZE_MODIFIER @gssize_modifier@ #define G_GSIZE_FORMAT @gsize_format@ #define G_GSSIZE_FORMAT @gssize_format@ -#define G_MAXSIZE G_MAXU@glib_msize_type@ +#define G_MAXSIZE SIZE_MAX #define G_MINSSIZE G_MIN@glib_msize_type@ #define G_MAXSSIZE G_MAX@glib_msize_type@ @@ -101,8 +120,8 @@ typedef gint64 goffset; #define GINT_TO_POINTER(i) ((gpointer) @glib_gpi_cast@ (i)) #define GUINT_TO_POINTER(u) ((gpointer) @glib_gpui_cast@ (u)) -typedef signed @glib_intptr_type_define@ gintptr; -typedef unsigned @glib_intptr_type_define@ guintptr; +typedef intptr_t gintptr; +typedef uintptr_t guintptr; #define G_GINTPTR_MODIFIER @gintptr_modifier@ #define G_GINTPTR_FORMAT @gintptr_format@ diff --git a/meson.build b/meson.build index bb6040558..fd9d9d326 100644 --- a/meson.build +++ b/meson.build @@ -1174,6 +1174,7 @@ if long_long_size == long_size return 1; }''', name : 'int64_t is long') int64_t_typedef = 'long' + int64_m = 'l' elif cc.compiles('''#if defined(_AIX) && !defined(__GNUC__) #pragma options langlvl=stdc99 #endif @@ -1186,10 +1187,10 @@ if long_long_size == long_size return 1; }''', name : 'int64_t is long long') int64_t_typedef = 'long long' + int64_m = 'll' endif endif -int64_m = 'll' char_align = cc.alignment('char') short_align = cc.alignment('short') int_align = cc.alignment('int') @@ -1212,89 +1213,45 @@ glib_conf.set('SIZEOF_SSIZE_T', ssizet_size) glib_conf.set('SIZEOF_VOID_P', voidp_size) glib_conf.set('SIZEOF_WCHAR_T', cc.sizeof('wchar_t', prefix: '#include <stddef.h>')) -if short_size == 2 - gint16 = 'short' - gint16_modifier='h' - gint16_format='hi' - guint16_format='hu' -elif int_size == 2 - gint16 = 'int' - gint16_modifier='' - gint16_format='i' - guint16_format='u' -else - error('Compiler provides no native 16-bit integer type') +if not cc.has_header('stdint.h') + error('Missing stdint.h; GLib requires a C99 toolchain') endif -glibconfig_conf.set('gint16', gint16) + +native_int_types = [ + [ 'int16_t', '16 bit' ], + [ 'int32_t', '32 bit' ], + [ 'int64_t', '64 bit' ], +] + +foreach type: native_int_types + if not cc.has_header_symbol('stdint.h', type[0]) + error('Missing native @0@ type'.format(type[1])) + endif +endforeach + +# Legacy symbols for sized integers +gint16_modifier = '' +gint16_format = 'PRId16' +guint16_format = 'PRIu16' glibconfig_conf.set_quoted('gint16_modifier', gint16_modifier) -glibconfig_conf.set_quoted('gint16_format', gint16_format) -glibconfig_conf.set_quoted('guint16_format', guint16_format) - -if short_size == 4 - gint32 = 'short' - gint32_modifier='h' - gint32_format='hi' - guint32_format='hu' - guint32_align = short_align -elif int_size == 4 - gint32 = 'int' - gint32_modifier='' - gint32_format='i' - guint32_format='u' - guint32_align = int_align -elif long_size == 4 - gint32 = 'long' - gint32_modifier='l' - gint32_format='li' - guint32_format='lu' - guint32_align = long_align -else - error('Compiler provides no native 32-bit integer type') -endif -glibconfig_conf.set('gint32', gint32) +glibconfig_conf.set('gint16_format', gint16_format) +glibconfig_conf.set('guint16_format', guint16_format) + +gint32_modifier = '' +gint32_format = 'PRId32' +guint32_format = 'PRIu32' glibconfig_conf.set_quoted('gint32_modifier', gint32_modifier) -glibconfig_conf.set_quoted('gint32_format', gint32_format) -glibconfig_conf.set_quoted('guint32_format', guint32_format) -glib_conf.set('ALIGNOF_GUINT32', guint32_align) - -if int_size == 8 - gint64 = 'int' - gint64_modifier='' - gint64_format='i' - guint64_format='u' - glib_extension='' - gint64_constant='(val)' - guint64_constant='(val)' - guint64_align = int_align -elif long_size == 8 and (long_long_size != long_size or int64_t_typedef == 'long') - gint64 = 'long' - glib_extension='' - gint64_modifier='l' - gint64_format='li' - guint64_format='lu' - gint64_constant='(val##L)' - guint64_constant='(val##UL)' - guint64_align = long_align -elif long_long_size == 8 and (long_long_size != long_size or int64_t_typedef == 'long long') - gint64 = 'long long' - glib_extension='G_GNUC_EXTENSION ' - gint64_modifier=int64_m - gint64_format=int64_m + 'i' - guint64_format=int64_m + 'u' - gint64_constant='(G_GNUC_EXTENSION (val##LL))' - guint64_constant='(G_GNUC_EXTENSION (val##ULL))' - guint64_align = long_long_align -else - error('Compiler provides no native 64-bit integer type') -endif -glibconfig_conf.set('glib_extension', glib_extension) -glibconfig_conf.set('gint64', gint64) +glibconfig_conf.set('gint32_format', gint32_format) +glibconfig_conf.set('guint32_format', guint32_format) +glib_conf.set('ALIGNOF_GUINT32', cc.alignment('uint32_t', prefix: '#include <stdint.h>')) + +gint64_modifier = int64_m +gint64_format = 'PRId64' +guint64_format = 'PRIu64' glibconfig_conf.set_quoted('gint64_modifier', gint64_modifier) -glibconfig_conf.set_quoted('gint64_format', gint64_format) -glibconfig_conf.set_quoted('guint64_format', guint64_format) -glibconfig_conf.set('gint64_constant', gint64_constant) -glibconfig_conf.set('guint64_constant', guint64_constant) -glib_conf.set('ALIGNOF_GUINT64', guint64_align) +glibconfig_conf.set('gint64_format', gint64_format) +glibconfig_conf.set('guint64_format', guint64_format) +glib_conf.set('ALIGNOF_GUINT64', cc.alignment('uint64_t', prefix: '#include <stdint.h>')) if host_system == 'windows' glibconfig_conf.set('g_pid_type', 'void*') @@ -1405,21 +1362,18 @@ else endif if voidp_size == int_size - glibconfig_conf.set('glib_intptr_type_define', 'int') glibconfig_conf.set_quoted('gintptr_modifier', '') glibconfig_conf.set_quoted('gintptr_format', 'i') glibconfig_conf.set_quoted('guintptr_format', 'u') glibconfig_conf.set('glib_gpi_cast', '(gint)') glibconfig_conf.set('glib_gpui_cast', '(guint)') elif voidp_size == long_size - glibconfig_conf.set('glib_intptr_type_define', 'long') glibconfig_conf.set_quoted('gintptr_modifier', 'l') glibconfig_conf.set_quoted('gintptr_format', 'li') glibconfig_conf.set_quoted('guintptr_format', 'lu') glibconfig_conf.set('glib_gpi_cast', '(glong)') glibconfig_conf.set('glib_gpui_cast', '(gulong)') elif voidp_size == long_long_size - glibconfig_conf.set('glib_intptr_type_define', 'long long') glibconfig_conf.set_quoted('gintptr_modifier', int64_m) glibconfig_conf.set_quoted('gintptr_format', int64_m + 'i') glibconfig_conf.set_quoted('guintptr_format', int64_m + 'u') diff --git a/tests/type-test.c b/tests/type-test.c index dceccdd9f..20eaf196c 100644 --- a/tests/type-test.c +++ b/tests/type-test.c @@ -106,10 +106,19 @@ main (int argc, gi32t1 = -0x3AFAFAFA; gu32t1 = 0xFAFAFAFA; -#define FORMAT "%" G_GINT16_FORMAT " %" G_GINT32_FORMAT \ - " %" G_GUINT16_FORMAT " %" G_GUINT32_FORMAT "\n" - string = g_strdup_printf (FORMAT, gi16t1, gi32t1, gu16t1, gu32t1); - sscanf (string, FORMAT, &gi16t2, &gi32t2, &gu16t2, &gu32t2); +#define PRINTF_FORMAT "%" G_GINT16_FORMAT \ + " %" G_GINT32_FORMAT \ + " %" G_GUINT16_FORMAT \ + " %" G_GUINT32_FORMAT \ + "\n" + string = g_strdup_printf (PRINTF_FORMAT, gi16t1, gi32t1, gu16t1, gu32t1); + +#define SCANF_FORMAT "%" G_GINT16_SCANF_FORMAT \ + " %" G_GINT32_SCANF_FORMAT \ + " %" G_GUINT16_SCANF_FORMAT \ + " %" G_GUINT32_SCANF_FORMAT \ + "\n" + sscanf (string, SCANF_FORMAT, &gi16t2, &gi32t2, &gu16t2, &gu32t2); g_free (string); g_assert (gi16t1 == gi16t2); g_assert (gi32t1 == gi32t2); |