gmio_core: safer int types when no <stdint.h>

This commit is contained in:
Hugues Delorme 2015-11-19 17:43:07 +01:00
parent 47b134797a
commit efe3e64648
3 changed files with 30 additions and 11 deletions

View File

@ -81,6 +81,11 @@ set(CMAKE_REQUIRED_FLAGS "${CMAKE_C_FLAGS}")
# Some compilers (like GCC v4.9) don't disable <stdint.h> in STRICT_ANSI mode
check_include_files(stdint.h GMIO_HAVE_STDINT_H)
# Find size of short, int and long types
check_type_size("short" GMIO_SIZEOF_SHORT)
check_type_size("int" GMIO_SIZEOF_INT)
check_type_size("long" GMIO_SIZEOF_LONG)
# Check non-ANSI available features
if(NOT GMIO_BUILD_STRICT_C90)
# Check availability of a 64b integer type

View File

@ -18,6 +18,11 @@
#ifndef GMIO_CONFIG_H_CMAKE
#define GMIO_CONFIG_H_CMAKE
/* Size(in bytes) of integer types */
#cmakedefine GMIO_SIZEOF_SHORT @GMIO_SIZEOF_SHORT@
#cmakedefine GMIO_SIZEOF_INT @GMIO_SIZEOF_INT@
#cmakedefine GMIO_SIZEOF_LONG @GMIO_SIZEOF_LONG@
/* 64b integer type */
#cmakedefine GMIO_HAVE_INT64_T
#cmakedefine GMIO_HAVE_MSVC_INT64

View File

@ -27,6 +27,13 @@
#ifndef GMIO_GLOBAL_H
#define GMIO_GLOBAL_H
/* "config.h" is generated by cmake, it should reside in the out-of-source
* build dir.
* In CMakeFiles.txt, the directory where resides "config.h" is added to the
* include path list
*/
#include "config.h"
/* GMIO_OS_WIN */
#if defined(WIN64) || defined(_WIN64) || defined(__WIN64__) \
|| defined(WIN32) || defined(_WIN32) || defined(__WIN32__) \
@ -69,13 +76,6 @@
# define GMIO_LIB_EXPORT
#endif
/* "config.h" is generated by cmake, it should reside in the out-of-source
* build dir.
* In CMakeFiles.txt, the directory where resides "config.h" is added to the
* include path list
*/
#include "config.h"
/* Typedefs for specific width integers */
#ifdef GMIO_HAVE_STDINT_H
# include <stdint.h>
@ -83,17 +83,26 @@
typedef char int8_t;
typedef unsigned char uint8_t;
/* TODO: short is not necessarily 16b on all archs */
# if GMIO_SIZEOF_SHORT == 2
typedef short int16_t;
typedef unsigned short uint16_t;
# else
# error Not supported: sizeof(short) != 2
# endif
/* TODO: int is not necessarily 32b on all archs */
# if GMIO_SIZEOF_INT == 4
typedef int int32_t;
typedef unsigned int uint32_t;
# elif GMIO_SIZEOF_LONG == 4
typedef long int32_t;
typedef unsigned long uint32_t;
# else
# error Failed to find a 32bit integer type with 'int' and 'long'
# endif
#endif
/* int64_t */
/* uint64_t */
/* (u)int64_t */
#ifndef GMIO_HAVE_INT64_T
# if defined(GMIO_HAVE_MSVC_INT64)
typedef __int64_t int64_t;