From e73c35964c2e73e238afbcff425bc674d5b69518 Mon Sep 17 00:00:00 2001 From: Mike Nolan Date: Tue, 8 Apr 2025 23:09:08 -0500 Subject: [PATCH] Removed dependency for jansson, using my own json --- CMakeLists.txt | 61 ++++++++++++++---- README.md | 7 +- include/CrossLang.hpp | 4 +- src/runtime_methods/json.cpp | 120 ++++++++++++----------------------- 4 files changed, 94 insertions(+), 98 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 61f3cbd..284ec39 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,11 +12,11 @@ option(CROSSLANG_ENABLE_BINARIES "Enable Tesses CrossLang binaries" ON) option(CROSSLANG_INSTALL_DEVELOPMENT "Enable Tesses CrossLang development files" ON) option(CROSSLANG_ENABLE_THREADING "Enable Tesses CrossLang threading" ON) option(CROSSLANG_ENABLE_SQLITE "Enable sqlite (Embedded database, supports Wii)" ON) -option(CROSSLANG_ENABLE_JSON "Enable JSON" ON) option(CROSSLANG_ENABLE_PROCESS "Enable process" ON) option(CROSSLANG_ENABLE_TERMIOS "Enable termios (For changing terminal options)" ON) option(CROSSLANG_ENABLE_PLATFORM_FOLDERS "Enable platform folders" ON) option(CROSSLANG_SHARED_EXECUTABLES "Link with libcrosslang_shared" ON) +option(CROSSLANG_FETCHCONTENT "Use fetchcontent" ON) option(CROSSLANG_CUSTOM_CONSOLE "Enable custom Console" OFF) @@ -27,21 +27,26 @@ set(CROSSLANG_ENABLE_SHARED OFF) endif() set(CROSSLANG_OFFLINE_SHELL_PACKAGE "" CACHE FILEPATH "Path to the shell package generated from https://onedev.site.tesses.net/CrossLang/CrossLangExtras") -set(JANSSON_DIR "" CACHE PATH "Directory for Jansson") + +if(CROSSLANG_FETCHCONTENT) +set(TESSESFRAMEWORK_ENABLE_EXAMPLES OFF) +set(TESSESFRAMEWORK_ENABLE_APPS OFF) +set(CROSSLANG_ENABLE_SHARED OFF) +set(TESSESFRAMEWORK_ENABLE_SHARED OFF) +set(CROSSLANG_SHARED_EXECUTABLES OFF) + +include(FetchContent) +FetchContent_Declare( + TessesFramework + GIT_REPOSITORY https://onedev.site.tesses.net/tesses-framework.git +) +FetchContent_MakeAvailable(TessesFramework) +else() find_package(TessesFramework REQUIRED) +endif() function(CROSSLANG_LINK_DEPS CROSSLANG_TARGET_NAME) if(CROSSLANG_ENABLE_PROCESS) target_compile_definitions(${CROSSLANG_TARGET_NAME} PUBLIC CROSSLANG_ENABLE_PROCESS) -endif() -if(CROSSLANG_ENABLE_JSON) -target_compile_definitions(${CROSSLANG_TARGET_NAME} PUBLIC CROSSLANG_ENABLE_JSON) -if(JANSSON_DIR STREQUAL "") -else() -target_include_directories(${CROSSLANG_TARGET_NAME} PUBLIC ${JANSSON_DIR}/include) -target_link_directories(${CROSSLANG_TARGET_NAME} PUBLIC ${JANSSON_DIR}/lib) -endif() -target_link_libraries(${CROSSLANG_TARGET_NAME} PUBLIC jansson) - endif() if(CROSSLANG_ENABLE_THREADING) target_compile_definitions(${CROSSLANG_TARGET_NAME} PUBLIC CROSSLANG_ENABLE_THREADING) @@ -141,9 +146,13 @@ include(GNUInstallDirs) if(CROSSLANG_ENABLE_STATIC) add_library(crosslang_static STATIC ${CROSSLANG_SOURCE}) -target_link_libraries(crosslang_static PUBLIC TessesFramework::tessesframework) - CROSSLANG_LINK_DEPS(crosslang_static) +if(CROSSLANG_FETCHCONTENT) +target_link_libraries(crosslang_static PUBLIC tessesframework) +else() +target_link_libraries(crosslang_static PUBLIC TessesFramework::tessesframework) +endif() + list(APPEND TessesCrossLangLibs crosslang_static) endif() @@ -151,7 +160,11 @@ endif() if(CROSSLANG_ENABLE_SHARED) add_library(crosslang_shared SHARED ${CROSSLANG_SOURCE}) CROSSLANG_LINK_DEPS(crosslang_shared) +if(CROSSLANG_FETCHCONTENT) +target_link_libraries(crosslang_shared PUBLIC tessesframework_shared) +else() target_link_libraries(crosslang_shared PUBLIC TessesFramework::tessesframework_shared) +endif() list(APPEND TessesCrossLangLibs crosslang_shared) endif() @@ -248,6 +261,26 @@ CROSSLANG_LINK_DEPS(crossdump) CROSSLANG_LINK_DEPS(crossarchiveextract) CROSSLANG_LINK_DEPS(crossarchivecreate) CROSSLANG_LINK_DEPS(crossthumbnailer) + +if(CROSSLANG_FETCHCONTENT) +target_link_libraries(crossc PUBLIC tessesframework) +target_link_libraries(crossvm PUBLIC tessesframework) +target_link_libraries(crossint PUBLIC tessesframework) +target_link_libraries(crosslang PUBLIC tessesframework) +target_link_libraries(crossdump PUBLIC tessesframework) +target_link_libraries(crossarchiveextract PUBLIC tessesframework) +target_link_libraries(crossarchivecreate PUBLIC tessesframework) +target_link_libraries(crossthumbnailer PUBLIC tessesframework) +else() +target_link_libraries(crossc PUBLIC TessesFramework::tessesframework) +target_link_libraries(crossvm PUBLIC TessesFramework::tessesframework) +target_link_libraries(crossint PUBLIC TessesFramework::tessesframework) +target_link_libraries(crosslang PUBLIC TessesFramework::tessesframework) +target_link_libraries(crossdump PUBLIC TessesFramework::tessesframework) +target_link_libraries(crossarchiveextract PUBLIC TessesFramework::tessesframework) +target_link_libraries(crossarchivecreate PUBLIC TessesFramework::tessesframework) +target_link_libraries(crossthumbnailer PUBLIC TessesFramework::tessesframework) +endif() endif() install(TARGETS crossc DESTINATION bin) install(TARGETS crossvm DESTINATION bin) diff --git a/README.md b/README.md index b1476d3..4bc7f36 100644 --- a/README.md +++ b/README.md @@ -4,11 +4,10 @@ Tesses Cross Language ![CrossImage](crosslang.png) ## What is required to build this project -- [TessesFramework](https://onedev.site.tesses.net/tesses-framework) -- Jansson (but can be turned off but is strongly recommended otherwise many programs will not work) +- [TessesFramework](https://onedev.site.tesses.net/tesses-framework) (if you turn CROSSLANG_FETCHCONTENT off otherwise it will be grabbed automaticly) - CMake -## What libraries have I embeaded from other people +## What libraries have I embeded from other people - [HodwardHinnart's date]() (in folder src/HodwardHinnart_date, modified tz.cpp to point to correct header) - [Sqlite]() (in folder src/sqlite also uses demo VFS (at least on Wii)) - [Sago's platform_folders]() (in folder src/sago) @@ -26,7 +25,7 @@ Tesses Cross Language ``` ## To Install -- [Follow TessesFramework setup](https://onedev.site.tesses.net/tesses-framework) +- Install [mbedtls](https://github.com/Mbed-TLS/mbedtls) (use sudo apt install libmbedtls-dev on debian) for TessesFramework - Follow the commands bellow ## Run these commands to install crosslang (or use binaries from [here](https://crosslang.tesseslanguage.com/download/)) diff --git a/include/CrossLang.hpp b/include/CrossLang.hpp index d0d05ec..0081e7b 100644 --- a/include/CrossLang.hpp +++ b/include/CrossLang.hpp @@ -844,7 +844,7 @@ class GC { class TDictionary : public THeapObject { public: - std::unordered_map items; + std::map items; static TDictionary* Create(GCList* gc); static TDictionary* Create(GCList& gc); template @@ -1237,7 +1237,7 @@ class GC { class TDictionaryEnumerator : public TEnumerator { bool hasStarted; - std::unordered_map::iterator ittr; + std::map::iterator ittr; TDictionary* dict; public: static TDictionaryEnumerator* Create(GCList& ls, TDictionary* dict); diff --git a/src/runtime_methods/json.cpp b/src/runtime_methods/json.cpp index 40e983e..8de5fc8 100644 --- a/src/runtime_methods/json.cpp +++ b/src/runtime_methods/json.cpp @@ -1,17 +1,10 @@ -/* - -*/ #include "CrossLang.hpp" - -#if defined(CROSSLANG_ENABLE_JSON) -#include -#endif +using namespace Tesses::Framework::Serialization::Json; namespace Tesses::CrossLang { -#if defined(CROSSLANG_ENABLE_JSON) static bool IsValidForJson(TObject v) { if(std::holds_alternative(v)) return true; @@ -37,17 +30,13 @@ namespace Tesses::CrossLang } return false; } - static json_t* JsonSerialize(TObject v) + static JToken JsonSerialize(TObject v) { - if(std::holds_alternative(v)) return json_null(); - if(std::holds_alternative(v)) return json_integer(std::get(v)); - if(std::holds_alternative(v)) return json_real(std::get(v)); - if(std::holds_alternative(v)) return json_boolean(std::get(v)); - if(std::holds_alternative(v)) - { - std::string txt = std::get(v); - return json_stringn(txt.c_str(),txt.size()); - } + if(std::holds_alternative(v)) return nullptr; + if(std::holds_alternative(v)) return std::get(v); + if(std::holds_alternative(v)) return std::get(v); + if(std::holds_alternative(v)) return std::get(v); + if(std::holds_alternative(v)) return std::get(v); if(std::holds_alternative(v)) { auto obj = std::get(v).obj; @@ -56,29 +45,29 @@ namespace Tesses::CrossLang if(ls != nullptr) { - json_t* items=json_array(); + JArray items; for(int64_t i = 0; i < ls->Count(); i++) { auto val = ls->Get(i); if(IsValidForJson(val)) - json_array_append_new(items,JsonSerialize(val)); + items.Add(JsonSerialize(val)); } return items; } if(dict != nullptr) { - json_t* obj = json_object(); + JObject obj; for(auto item : dict->items) { if(IsValidForJson(item.second)) - json_object_set_new(obj, item.first.c_str(),JsonSerialize(item.second)); + obj.SetValue(item.first,JsonSerialize(item.second)); } return obj; } } - return json_null(); + return nullptr; } static TObject JsonEncode(GCList& ls2, std::vector args) { @@ -87,32 +76,30 @@ namespace Tesses::CrossLang bool indent = (args.size() == 2 && std::holds_alternative(args[1]) && std::get(args[1])); auto json = JsonSerialize(args[0]); - char* txt = json_dumps(json, indent ? JSON_INDENT(4) : 0); - std::string str = txt; - free(txt); - json_decref(json); - return str; + + return Json::Encode(json,indent); } return "null"; } - static TObject JsonDeserialize(GCList& ls2,json_t* json) + static TObject JsonDeserialize(GCList& ls2,JToken json) { - if(json == nullptr) return nullptr; - if(json_is_null(json)) return nullptr; - if(json_is_true(json)) return true; - if(json_is_false(json)) return false; - if(json_is_integer(json)) return (int64_t)json_integer_value(json); - if(json_is_real(json)) return json_real_value(json); - if(json_is_string(json)) - { - return std::string(json_string_value(json),json_string_length(json)); - } - if(json_is_array(json)) + if(std::holds_alternative(json)) return nullptr; + if(std::holds_alternative(json)) return nullptr; + bool b; + int64_t _i64; + double _f64; + std::string str; + JArray arr; + JObject obj; + if(TryGetJToken(json,b)) return b; + if(TryGetJToken(json,_i64)) return _i64; + if(TryGetJToken(json,_f64)) return _f64; + if(TryGetJToken(json,str)) return str; + if(TryGetJToken(json,arr)) { TList* ls = TList::Create(ls2); - json_t* item; - size_t index; - json_array_foreach(json,index, item) + + for(auto& item : arr) { auto itemRes = JsonDeserialize(ls2,item); ls2.GetGC()->BarrierBegin(); @@ -121,20 +108,18 @@ namespace Tesses::CrossLang } return ls; } - if(json_is_object(json)) + if(TryGetJToken(json,obj)) { TDictionary* dict = TDictionary::Create(ls2); - void* n; - const char* key; - size_t len; - json_t* value; + - json_object_foreach_safe(json,n,key,value) + for(auto& item : obj) { - auto itemRes = JsonDeserialize(ls2,value); + + auto itemRes = JsonDeserialize(ls2,item.second); ls2.GetGC()->BarrierBegin(); - dict->SetValue(std::string(key),itemRes); + dict->SetValue(item.first,itemRes); ls2.GetGC()->BarrierEnd(); } return dict; @@ -145,46 +130,26 @@ namespace Tesses::CrossLang { if(args.size() > 0 && std::holds_alternative(args[0])) { - std::string jsonText = std::get(args[0]); - json_t* json = json_loadb(jsonText.c_str(), jsonText.size(),0,NULL); - auto res = JsonDeserialize(ls2, json); - json_decref(json); - return res; + + return JsonDeserialize(ls2, Json::Decode(std::get(args[0]))); + + } return Undefined(); } - #endif std::string Json_Encode(TObject o,bool indent) { - #if defined(CROSSLANG_ENABLE_JSON) - auto json = JsonSerialize(o); - char* txt = json_dumps(json, indent ? JSON_INDENT(4) : 0); - std::string str = txt; - free(txt); - json_decref(json); - return str; - #else - return ""; - #endif - + return Json::Encode(JsonSerialize(o),indent); } TObject Json_Decode(GCList ls,std::string str) { - #if defined(CROSSLANG_ENABLE_JSON) - json_t* json = json_loadb(str.c_str(), str.size(),0,NULL); - auto res = JsonDeserialize(ls,json); - json_decref(json); - return res; - #else - return nullptr; - #endif + return JsonDeserialize(ls,Json::Decode(str)); } void TStd::RegisterJson(GC* gc,TRootEnvironment* env) { env->permissions.canRegisterJSON=true; - #if defined(CROSSLANG_ENABLE_JSON) GCList ls(gc); TDictionary* dict = TDictionary::Create(ls); dict->DeclareFunction(gc, "Decode","Deserialize Json",{"Json string"},JsonDecode); @@ -194,7 +159,6 @@ namespace Tesses::CrossLang gc->BarrierBegin(); env->DeclareVariable("Json", dict); gc->BarrierEnd(); - #endif } } \ No newline at end of file