diff options
Diffstat (limited to 'upb')
-rw-r--r-- | upb/json/parser.rl | 2 | ||||
-rw-r--r-- | upb/json/printer.c | 4 | ||||
-rw-r--r-- | upb/port.c | 27 | ||||
-rw-r--r-- | upb/port_def.inc | 20 | ||||
-rw-r--r-- | upb/port_undef.inc | 2 |
5 files changed, 50 insertions, 5 deletions
diff --git a/upb/json/parser.rl b/upb/json/parser.rl index fd3704c..f80ed18 100644 --- a/upb/json/parser.rl +++ b/upb/json/parser.rl @@ -947,7 +947,7 @@ static bool parse_number_from_buffer(upb_json_parser *p, const char *buf, upb_fieldtype_t type = upb_fielddef_type(p->top->f); double val; double dummy; - double inf = 1.0 / 0.0; /* C89 does not have an INFINITY macro. */ + double inf = UPB_INFINITY; errno = 0; diff --git a/upb/json/printer.c b/upb/json/printer.c index 90705a7..38f817d 100644 --- a/upb/json/printer.c +++ b/upb/json/printer.c @@ -181,11 +181,11 @@ const char neginf[] = "\"-Infinity\""; const char inf[] = "\"Infinity\""; static size_t fmt_double(double val, char* buf, size_t length) { - if (val == (1.0 / 0.0)) { + if (val == UPB_INFINITY) { CHKLENGTH(length >= strlen(inf)); strcpy(buf, inf); return strlen(inf); - } else if (val == (-1.0 / 0.0)) { + } else if (val == -UPB_INFINITY) { CHKLENGTH(length >= strlen(neginf)); strcpy(buf, neginf); return strlen(neginf); diff --git a/upb/port.c b/upb/port.c new file mode 100644 index 0000000..023f7dc --- /dev/null +++ b/upb/port.c @@ -0,0 +1,27 @@ + +#include "upb/upb.h" +#include "upb/port_def.inc" + +#ifdef UPB_MSVC_VSNPRINTF +/* Visual C++ earlier than 2015 doesn't have standard C99 snprintf and + * vsnprintf. To support them, missing functions are manually implemented + * using the existing secure functions. */ +int msvc_vsnprintf(char* s, size_t n, const char* format, va_list arg) { + if (!s) { + return _vscprintf(format, arg); + } + int ret = _vsnprintf_s(s, n, _TRUNCATE, format, arg); + if (ret < 0) { + ret = _vscprintf(format, arg); + } + return ret; +} + +int msvc_snprintf(char* s, size_t n, const char* format, ...) { + va_list arg; + va_start(arg, format); + int ret = msvc_vsnprintf(s, n, format, arg); + va_end(arg); + return ret; +} +#endif diff --git a/upb/port_def.inc b/upb/port_def.inc index 5220c29..0650920 100644 --- a/upb/port_def.inc +++ b/upb/port_def.inc @@ -75,8 +75,16 @@ /* Windows versions */ #include <stdarg.h> #include <stdio.h> -#define _upb_snprintf _snprintf_s -#define _upb_vsnprintf _vsnprintf_s +#if defined(_MSC_VER) && _MSC_VER < 1900 +int msvc_vsnprintf(char* s, size_t n, const char* format, va_list arg); +int msvc_snprintf(char* s, size_t n, const char* format, ...); +#define UPB_MSVC_VSNPRINTF +#define _upb_snprintf msvc_snprintf +#define _upb_vsnprintf msvc_vsnprintf +#else +#define _upb_snprintf snprintf +#define _upb_vsnprintf vsnprintf +#endif #define _upb_va_copy(a, b) va_copy(a, b) #else #if __STDC_VERSION__ >= 199901L || __cplusplus >= 201103L @@ -130,3 +138,11 @@ #else #define UPB_UNREACHABLE() do { assert(0); } while(0) #endif + +/* UPB_INFINITY representing floating-point positive infinity. */ +#include <math.h> +#ifdef INFINITY +#define UPB_INFINITY INFINITY +#else +#define UPB_INFINITY (1.0 / 0.0) +#endif diff --git a/upb/port_undef.inc b/upb/port_undef.inc index bfd2a08..103180b 100644 --- a/upb/port_undef.inc +++ b/upb/port_undef.inc @@ -14,6 +14,8 @@ #undef UPB_ASSERT #undef UPB_ASSERT_DEBUGVAR #undef UPB_UNREACHABLE +#undef UPB_INFINITY +#undef UPB_MSVC_VSNPRINTF #undef _upb_snprintf #undef _upb_vsnprintf #undef _upb_va_copy |