From 254b5abef8217a92032f9ad971b8477966f72bbd Mon Sep 17 00:00:00 2001 From: "Cameron Armstrong (Nightfox)" Date: Mon, 15 Jul 2024 11:30:44 +0800 Subject: [PATCH] Do not use duplocale if building for libnix because it isnt supported yet --- CMakeLists.txt | 8 +++++++- README.md | 2 +- cmake/config.h.in | 3 +++ json_tokener.c | 8 ++++++++ 4 files changed, 19 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ed877e3..11bfa43 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -84,6 +84,8 @@ if (${CMAKE_SYSTEM_NAME} STREQUAL "AmigaOS") set(NEWLIB ON) elseif(${M68K_CRT} STREQUAL "clib2") set(CLIB2 ON) + elseif(${M68K_CRT} STREQUAL "ixemul") + set(IXEMUL ON) elseif(${M68K_CRT} STREQUAL "nix20") set(NIX20 ON) elseif(${M68K_CRT} STREQUAL "nix13") @@ -205,6 +207,10 @@ endif() if (HAVE_LOCALE_H) check_symbol_exists(setlocale "locale.h" HAVE_SETLOCALE) check_symbol_exists(uselocale "locale.h" HAVE_USELOCALE) + if (NOT NIX20 AND NOT NIX13) + # libnix does not fully support this yet + check_symbol_exists(duplocale "locale.h" HAVE_DUPLOCALE) + endif() endif() # uClibc *intentionally* crashes in duplocale(), at least as of: @@ -379,7 +385,7 @@ if (NOT ("${CMAKE_C_COMPILER_FRONTEND_VARIANT}" STREQUAL "MSVC")) # OSX Mach-O doesn't support linking with '-Bsymbolic-functions'. # Others may not support it, too. - list(APPEND CMAKE_REQUIRED_LIBRARIES "-Wl,-Bsymbolic-functions") + list(APPEND CMAKE_REQUIRED_LIBRARIES "-Wl,-Bsymbolic-functions,-lamiga,-lc") check_c_source_compiles( " int main (void) diff --git a/README.md b/README.md index 1327f3a..4b972d6 100644 --- a/README.md +++ b/README.md @@ -294,7 +294,7 @@ make libjson-c.a will get created in the build directory. -You can change newlib to nix20, nix13 or clib2 if you would like to build the library suited for libnix or clib2 instead. Newlib is default. +You can change newlib to nix20, nix13, ixemul or clib2 if you would like to build the library suited for libnix or clib2 instead. Newlib is default. ### To build for PowerPC Amiga: diff --git a/cmake/config.h.in b/cmake/config.h.in index 1e6359d..6517340 100644 --- a/cmake/config.h.in +++ b/cmake/config.h.in @@ -137,6 +137,9 @@ /* Define to 1 if you have the `uselocale' function. */ #cmakedefine HAVE_USELOCALE +/* Define to 1 if you have the `duplocale' function. */ +#cmakedefine HAVE_DUPLOCALE + /* Define to 1 if newlocale() needs freelocale() called on it's `base` argument */ #cmakedefine NEWLOCALE_NEEDS_FREELOCALE diff --git a/json_tokener.c b/json_tokener.c index 20bad14..53ef209 100644 --- a/json_tokener.c +++ b/json_tokener.c @@ -345,6 +345,7 @@ struct json_object *json_tokener_parse_ex(struct json_tokener *tok, const char * #ifdef HAVE_USELOCALE { +#ifdef HAVE_DUPLOCALE locale_t duploc = duplocale(oldlocale); if (duploc == NULL && errno == ENOMEM) { @@ -352,16 +353,23 @@ struct json_object *json_tokener_parse_ex(struct json_tokener *tok, const char * return NULL; } newloc = newlocale(LC_NUMERIC_MASK, "C", duploc); +#else + newloc = newlocale(LC_NUMERIC_MASK, "C", oldlocale); +#endif if (newloc == NULL) { tok->err = json_tokener_error_memory; +#ifdef HAVE_DUPLOCALE freelocale(duploc); +#endif return NULL; } #ifdef NEWLOCALE_NEEDS_FREELOCALE +#ifdef HAVE_DUPLOCALE // Older versions of FreeBSD (<12.4) don't free the locale // passed to newlocale(), so do it here freelocale(duploc); +#endif #endif uselocale(newloc); }