diff --git a/configure.in b/configure.in index 5a3c0df..3b7e676 100644 --- a/configure.in +++ b/configure.in @@ -57,6 +57,24 @@ AC_LANG_POP([C]) AM_PROG_LIBTOOL +AC_MSG_CHECKING([for working sscanf]) +AC_TRY_RUN([ +#include +#include +#include +int main(int argc, char *argv[]){ +long i; +errno=0; +return (sscanf("1234567890123456789012345","%ld",&i)==1 && errno==ERANGE && i==INT64_MAX ? 0 : 1); +}],[ + AC_MSG_RESULT([yes]) + AC_DEFINE(HAS_SSCANF_ERANGE, 1, [Whether correctly return ERANGE]) +],[ + AC_MSG_RESULT([no, not working]) +],[ + AC_MSG_RESULT([no, not found]) +]) + AC_CONFIG_FILES([ Makefile json.pc diff --git a/json_util.c b/json_util.c index 79ae5c7..9843819 100644 --- a/json_util.c +++ b/json_util.c @@ -145,15 +145,20 @@ int json_object_to_file(char *filename, struct json_object *obj) int json_parse_int64(const char *buf, int64_t *retval) { int64_t num64; +#ifndef HAS_SSCANF_ERANGE const char *buf_skip_space; int orig_has_neg; int _errno; + errno = 0; // sscanf won't always set errno, so initialize +#endif + if (sscanf(buf, "%" SCNd64, &num64) != 1) { MC_DEBUG("Failed to parse, sscanf != 1\n"); return 1; } +#ifndef HAS_SSCANF_ERANGE _errno = errno; buf_skip_space = buf; orig_has_neg = 0; @@ -209,6 +214,7 @@ int json_parse_int64(const char *buf, int64_t *retval) else num64 = INT64_MAX; } +#endif *retval = num64; return 0; }