diff --git a/src/cborencoder.c b/src/cborencoder.c index a51f4451..1bf31c8c 100644 --- a/src/cborencoder.c +++ b/src/cborencoder.c @@ -31,6 +31,7 @@ #ifndef __STDC_LIMIT_MACROS # define __STDC_LIMIT_MACROS 1 #endif +#define __STDC_WANT_IEC_60559_TYPES_EXT__ #include "cbor.h" #include "cborinternal_p.h" diff --git a/src/cborencoder_close_container_checked.c b/src/cborencoder_close_container_checked.c index 5661e4d5..b88f06cf 100644 --- a/src/cborencoder_close_container_checked.c +++ b/src/cborencoder_close_container_checked.c @@ -27,6 +27,7 @@ #ifndef __STDC_LIMIT_MACROS # define __STDC_LIMIT_MACROS 1 #endif +#define __STDC_WANT_IEC_60559_TYPES_EXT__ #include "cbor.h" diff --git a/src/cborencoder_float.c b/src/cborencoder_float.c index 6f168379..d87919e2 100644 --- a/src/cborencoder_float.c +++ b/src/cborencoder_float.c @@ -27,6 +27,7 @@ #ifndef __STDC_LIMIT_MACROS # define __STDC_LIMIT_MACROS 1 #endif +#define __STDC_WANT_IEC_60559_TYPES_EXT__ #include "cbor.h" diff --git a/src/cborinternal_p.h b/src/cborinternal_p.h index 16269e63..19273acd 100644 --- a/src/cborinternal_p.h +++ b/src/cborinternal_p.h @@ -25,11 +25,19 @@ #ifndef CBORINTERNAL_P_H #define CBORINTERNAL_P_H +/* Dependent source files (*.c) must define __STDC_WANT_IEC_60559_TYPES_EXT__ + * before is (transitively) first included. + */ +#if !defined(__STDC_WANT_IEC_60559_TYPES_EXT__) +# error __STDC_WANT_IEC_60559_TYPES_EXT__ not defined +#endif + #include "compilersupport_p.h" #ifndef CBOR_NO_FLOATING_POINT # include # include +# include #else # ifndef CBOR_NO_HALF_FLOAT_TYPE # define CBOR_NO_HALF_FLOAT_TYPE 1 @@ -37,7 +45,26 @@ #endif #ifndef CBOR_NO_HALF_FLOAT_TYPE -# if defined(__F16C__) || defined(__AVX2__) +/* Check for FLT16_MANT_DIG using integer comparison. Clang headers incorrectly + * define this macro unconditionally when __STDC_WANT_IEC_60559_TYPES_EXT__ + * is defined (regardless of actual support for _Float16). + */ +# if FLT16_MANT_DIG > 0 || __FLT16_MANT_DIG__ > 0 +static inline unsigned short encode_half(float x) +{ + unsigned short h; + _Float16 f = (_Float16)x; + memcpy(&h, &f, 2); + return h; +} + +static inline float decode_half(unsigned short x) +{ + _Float16 f; + memcpy(&f, &x, 2); + return (float)f; +} +# elif defined(__F16C__) || defined(__AVX2__) # include static inline unsigned short encode_half(float val) { diff --git a/src/cborparser.c b/src/cborparser.c index 45ae23fb..62cdcaaa 100644 --- a/src/cborparser.c +++ b/src/cborparser.c @@ -31,6 +31,7 @@ #ifndef __STDC_LIMIT_MACROS # define __STDC_LIMIT_MACROS 1 #endif +#define __STDC_WANT_IEC_60559_TYPES_EXT__ #include "cbor.h" #include "cborinternal_p.h" diff --git a/src/cborparser_dup_string.c b/src/cborparser_dup_string.c index c4308cf9..837d9da4 100644 --- a/src/cborparser_dup_string.c +++ b/src/cborparser_dup_string.c @@ -31,6 +31,7 @@ #ifndef __STDC_LIMIT_MACROS # define __STDC_LIMIT_MACROS 1 #endif +#define __STDC_WANT_IEC_60559_TYPES_EXT__ #include "cbor.h" #include "compilersupport_p.h" diff --git a/src/cborparser_float.c b/src/cborparser_float.c index 426cd7d4..268239ee 100644 --- a/src/cborparser_float.c +++ b/src/cborparser_float.c @@ -27,6 +27,7 @@ #ifndef __STDC_LIMIT_MACROS # define __STDC_LIMIT_MACROS 1 #endif +#define __STDC_WANT_IEC_60559_TYPES_EXT__ #include "cbor.h" diff --git a/src/cborpretty.c b/src/cborpretty.c index 763d822f..a07741f7 100644 --- a/src/cborpretty.c +++ b/src/cborpretty.c @@ -27,6 +27,7 @@ #ifndef __STDC_LIMIT_MACROS # define __STDC_LIMIT_MACROS 1 #endif +#define __STDC_WANT_IEC_60559_TYPES_EXT__ #include "cbor.h" #include "cborinternal_p.h" diff --git a/src/cbortojson.c b/src/cbortojson.c index fff9d298..5bcf3640 100644 --- a/src/cbortojson.c +++ b/src/cbortojson.c @@ -28,6 +28,7 @@ #ifndef __STDC_LIMIT_MACROS # define __STDC_LIMIT_MACROS 1 #endif +#define __STDC_WANT_IEC_60559_TYPES_EXT__ #include "cbor.h" #include "cborjson.h" diff --git a/src/cborvalidation.c b/src/cborvalidation.c index f76d25c6..6e13138b 100644 --- a/src/cborvalidation.c +++ b/src/cborvalidation.c @@ -27,6 +27,7 @@ #ifndef __STDC_LIMIT_MACROS # define __STDC_LIMIT_MACROS 1 #endif +#define __STDC_WANT_IEC_60559_TYPES_EXT__ #include "cbor.h" #include "cborinternal_p.h" diff --git a/tools/json2cbor/json2cbor.c b/tools/json2cbor/json2cbor.c index 26e80fc6..090ee158 100644 --- a/tools/json2cbor/json2cbor.c +++ b/tools/json2cbor/json2cbor.c @@ -23,6 +23,7 @@ ****************************************************************************/ #define _GNU_SOURCE +#define __STDC_WANT_IEC_60559_TYPES_EXT__ #include "cbor.h" #include "cborinternal_p.h" #include "compilersupport_p.h"