diff --git a/packages/base91/src-cpp/CMakeLists.txt b/packages/base91/src-cpp/CMakeLists.txt index 69cdda88..25c2c35f 100644 --- a/packages/base91/src-cpp/CMakeLists.txt +++ b/packages/base91/src-cpp/CMakeLists.txt @@ -10,23 +10,13 @@ set(EM_LINK_FLAGS "-sEXPORT_NAME='${CMAKE_PROJECT_NAME}'" "-sEXPORTED_FUNCTIONS=\"['_malloc']\"" "-sEXPORTED_RUNTIME_METHODS=\"['UTF8ToString', 'HEAPU8']\"" - "--post-js ${CMAKE_CURRENT_BINARY_DIR}/main_glue.js" + "-lembind" "--emit-tsd ${CMAKE_CURRENT_BINARY_DIR}/base91lib.d.ts" ) string(REPLACE ";" " " LINK_FLAGS "${EM_LINK_FLAGS}") -# Generate Glue from IDL file --- -add_custom_command( - MAIN_DEPENDENCY ${CMAKE_CURRENT_SOURCE_DIR}/main.idl - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/main_glue.js ${CMAKE_CURRENT_BINARY_DIR}/main_glue.cpp - COMMAND python3 ${CMAKE_BINARY_DIR}/../emsdk/upstream/emscripten/tools/webidl_binder.py ${CMAKE_CURRENT_SOURCE_DIR}/main.idl ${CMAKE_CURRENT_BINARY_DIR}/main_glue -) -set_property(SOURCE main.cpp APPEND PROPERTY OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/main_glue.cpp) -# --- --- --- - include_directories( ${VCPKG_INCLUDE_DIR} - ${CMAKE_CURRENT_BINARY_DIR} ) add_executable(base91lib diff --git a/packages/base91/src-cpp/main.cpp b/packages/base91/src-cpp/main.cpp index eb57cc99..a2f8811b 100644 --- a/packages/base91/src-cpp/main.cpp +++ b/packages/base91/src-cpp/main.cpp @@ -1,6 +1,9 @@ #include +#include #include +#include + const char *const version = "0.6.0"; class CBasE91 @@ -14,17 +17,17 @@ class CBasE91 reset(); } - static void *malloc(size_t __size) + uintptr_t malloc(size_t __size) { - return ::malloc(__size); + return reinterpret_cast(::malloc(__size)); } - static void free(void *__ptr) + void free(uintptr_t __ptr) { - ::free(__ptr); + ::free(reinterpret_cast(__ptr)); } - const char *version() + std::string version() const { return ::version; } @@ -34,26 +37,37 @@ class CBasE91 basE91_init(&m_basE91); } - size_t encode(const void *data, size_t dataLen, void *dataOut) + size_t encode(uintptr_t data, size_t dataLen, uintptr_t dataOut) { - return basE91_encode(&m_basE91, data, dataLen, dataOut); + return basE91_encode(&m_basE91, reinterpret_cast(data), dataLen, reinterpret_cast(dataOut)); } - size_t encode_end(void *dataOut) + size_t encode_end(uintptr_t dataOut) { - return basE91_encode_end(&m_basE91, dataOut); + return basE91_encode_end(&m_basE91, reinterpret_cast(dataOut)); } - size_t decode(const void *data, size_t dataLen, void *dataOut) + size_t decode(uintptr_t data, size_t dataLen, uintptr_t dataOut) { - return basE91_decode(&m_basE91, data, dataLen, dataOut); + return basE91_decode(&m_basE91, reinterpret_cast(data), dataLen, reinterpret_cast(dataOut)); } - size_t decode_end(void *dataOut) + size_t decode_end(uintptr_t dataOut) { - return basE91_decode_end(&m_basE91, dataOut); + return basE91_decode_end(&m_basE91, reinterpret_cast(dataOut)); } }; -// Include JS Glue --- -#include "main_glue.cpp" +EMSCRIPTEN_BINDINGS(base91lib_bindings) +{ + emscripten::class_("CBasE91") + .constructor<>() + .function("malloc", &CBasE91::malloc) + .function("free", &CBasE91::free) + .function("version", &CBasE91::version) + .function("reset", &CBasE91::reset) + .function("encode", &CBasE91::encode) + .function("encode_end", &CBasE91::encode_end) + .function("decode", &CBasE91::decode) + .function("decode_end", &CBasE91::decode_end); +} diff --git a/packages/base91/src-cpp/main.idl b/packages/base91/src-cpp/main.idl deleted file mode 100644 index 974a88f8..00000000 --- a/packages/base91/src-cpp/main.idl +++ /dev/null @@ -1,12 +0,0 @@ -interface CBasE91 -{ - void CBasE91(); - static any malloc(unsigned long size); - static void free(any ptr); - [Const] DOMString version(); - void reset(); - unsigned long encode([Const] any data, unsigned long dataLen, any dataOut); - unsigned long encode_end(any dataOut); - unsigned long decode([Const] any data, unsigned long dataLen, any dataOut); - unsigned long decode_end(any dataOut); -}; diff --git a/packages/expat/src-cpp/CMakeLists.txt b/packages/expat/src-cpp/CMakeLists.txt index 61ed481a..4de429ca 100644 --- a/packages/expat/src-cpp/CMakeLists.txt +++ b/packages/expat/src-cpp/CMakeLists.txt @@ -1 +1,31 @@ -add_subdirectory(expatlib) +project(expatlib) + +find_package(expat CONFIG REQUIRED) + +# See: https://github.com/emscripten-core/emscripten/blob/main/src/settings.js +string(REPLACE ";" " " CPP_FLAGS "${EM_CPP_FLAGS}") + +set(EM_LINK_FLAGS + ${EM_LINK_FLAGS} + "-sEXPORT_NAME='${CMAKE_PROJECT_NAME}'" + "-sEXPORTED_FUNCTIONS=\"['_malloc']\"" + "-sEXPORTED_RUNTIME_METHODS=\"[UTF8ToString]\"" + "-lembind" + "--emit-tsd ${CMAKE_CURRENT_BINARY_DIR}/expatlib.d.ts" +) +string(REPLACE ";" " " LINK_FLAGS "${EM_LINK_FLAGS}") + +include_directories( + ${VCPKG_INCLUDE_DIR} +) + +add_executable(expatlib + main.cpp +) + +set_target_properties(expatlib PROPERTIES COMPILE_FLAGS "${CPP_FLAGS}") +set_target_properties(expatlib PROPERTIES LINK_FLAGS "${LINK_FLAGS}") + +target_link_libraries(expatlib + expat::expat +) diff --git a/packages/expat/src-cpp/expatlib/CMakeLists.txt b/packages/expat/src-cpp/expatlib/CMakeLists.txt deleted file mode 100644 index 0b6a3aac..00000000 --- a/packages/expat/src-cpp/expatlib/CMakeLists.txt +++ /dev/null @@ -1,41 +0,0 @@ -project(expatlib) - -find_package(expat CONFIG REQUIRED) - -# See: https://github.com/emscripten-core/emscripten/blob/main/src/settings.js -string(REPLACE ";" " " CPP_FLAGS "${EM_CPP_FLAGS}") - -set(EM_LINK_FLAGS - ${EM_LINK_FLAGS} - "-sEXPORT_NAME='${CMAKE_PROJECT_NAME}'" - "-sEXPORTED_FUNCTIONS=\"['_malloc']\"" - "-sEXPORTED_RUNTIME_METHODS=\"[UTF8ToString]\"" - "--post-js ${CMAKE_CURRENT_BINARY_DIR}/main_glue.js" - "--emit-tsd ${CMAKE_CURRENT_BINARY_DIR}/expatlib.d.ts" -) -string(REPLACE ";" " " LINK_FLAGS "${EM_LINK_FLAGS}") - -# Generate Glue from IDL file --- -add_custom_command( - MAIN_DEPENDENCY ${CMAKE_CURRENT_SOURCE_DIR}/main.idl - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/main_glue.js ${CMAKE_CURRENT_BINARY_DIR}/main_glue.cpp - COMMAND python3 ${CMAKE_BINARY_DIR}/../emsdk/upstream/emscripten/tools/webidl_binder.py ${CMAKE_CURRENT_SOURCE_DIR}/main.idl ${CMAKE_CURRENT_BINARY_DIR}/main_glue -) -set_property(SOURCE main.cpp APPEND PROPERTY OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/main_glue.cpp) -# --- --- --- - -include_directories( - ${VCPKG_INCLUDE_DIR} - ${CMAKE_CURRENT_BINARY_DIR} -) - -add_executable(expatlib - main.cpp -) - -set_target_properties(expatlib PROPERTIES COMPILE_FLAGS "${CPP_FLAGS}") -set_target_properties(expatlib PROPERTIES LINK_FLAGS "${LINK_FLAGS}") - -target_link_libraries(expatlib - expat::expat -) diff --git a/packages/expat/src-cpp/expatlib/main.cpp b/packages/expat/src-cpp/expatlib/main.cpp deleted file mode 100644 index e05a3f6b..00000000 --- a/packages/expat/src-cpp/expatlib/main.cpp +++ /dev/null @@ -1,106 +0,0 @@ -#include "stack_parser.h" - -#include -#include - -class CExpat : public CExpatImpl -{ -private: - typedef CExpatImpl BaseClass; - -protected: - std::string m_tag; - std::string m_attrs; - std::string m_content; - -public: - static const char *version() - { - return XML_ExpatVersion(); - } - - CExpat() - { - } - - void OnPostCreate() - { - EnableStartElementHandler(); - EnableEndElementHandler(); - EnableCharacterDataHandler(); - } - - bool create() - { - return BaseClass::Create(); - } - - void destroy() - { - BaseClass::Destroy(); - } - - bool parse(const char *xml) - { - return BaseClass::Parse(xml, (int)strlen(xml), XML_TRUE); - } - - const char *tag() const - { - return m_tag.c_str(); - } - - const char *attrs() const - { - return m_attrs.c_str(); - } - - const char *content() const - { - return m_content.c_str(); - } - - virtual void startElement() - { - } - - virtual void endElement() - { - } - - virtual void characterData() - { - } - - virtual void OnStartElement(const XML_Char *pszName, const XML_Char **papszAttrs) - { - m_tag = pszName; - m_attrs = ""; - for (XML_Char **itr = (XML_Char **)papszAttrs; *itr != NULL; itr += 2) - { - if (!m_attrs.empty()) - { - m_attrs += "\1\1"; - } - m_attrs += *itr; - m_attrs += "\1"; - m_attrs += *(itr + 1); - } - startElement(); - } - - virtual void OnEndElement(const XML_Char *pszName) - { - m_tag = pszName; - endElement(); - } - - virtual void OnCharacterData(const XML_Char *pszData, int nLength) - { - m_content.assign(pszData, nLength); - characterData(); - } -}; - -// Include JS Glue --- -#include "main_glue.cpp" diff --git a/packages/expat/src-cpp/expatlib/main.idl b/packages/expat/src-cpp/expatlib/main.idl deleted file mode 100644 index 7498ad8c..00000000 --- a/packages/expat/src-cpp/expatlib/main.idl +++ /dev/null @@ -1,22 +0,0 @@ -interface CExpat -{ - void CExpat(); - [Const] static DOMString version(); - boolean create(); - void destroy(); - boolean parse([Const] DOMString xml); - [Const] DOMString tag(); - [Const] DOMString attrs(); - [Const] DOMString content(); - void startElement(); - void endElement(); - void characterData(); -}; - -[JSImplementation = "CExpat"] interface CExpatJS -{ - void CExpatJS(); - void startElement(); - void endElement(); - void characterData(); -}; diff --git a/packages/expat/src-cpp/main.cpp b/packages/expat/src-cpp/main.cpp new file mode 100644 index 00000000..86463d4c --- /dev/null +++ b/packages/expat/src-cpp/main.cpp @@ -0,0 +1,141 @@ +#include "stack_parser.h" + +#include +#include + +#include +#include + +class CExpat : public CExpatImpl +{ +private: + typedef CExpatImpl BaseClass; + +protected: + std::string m_tag; + std::string m_attrs; + std::string m_content; + emscripten::val m_callback = emscripten::val::undefined(); + +public: + static std::string version() + { + return XML_ExpatVersion(); + } + + CExpat() + { + } + + void setCallback(emscripten::val callback) + { + m_callback = callback; + } + + void OnPostCreate() + { + EnableStartElementHandler(); + EnableEndElementHandler(); + EnableCharacterDataHandler(); + } + + bool create() + { + return BaseClass::Create(); + } + + void destroy() + { + BaseClass::Destroy(); + } + + bool parse(const std::string &xml) + { + return BaseClass::Parse(xml.c_str(), (int)xml.size(), XML_TRUE); + } + + std::string tag() const + { + return m_tag; + } + + std::string attrs() const + { + return m_attrs; + } + + std::string content() const + { + return m_content; + } + + virtual void startElement() + { + if (!m_callback.isUndefined() && !m_callback["startElement"].isUndefined()) + { + m_callback.call("startElement", m_tag, m_attrs); + } + } + + virtual void endElement() + { + if (!m_callback.isUndefined() && !m_callback["endElement"].isUndefined()) + { + m_callback.call("endElement", m_tag); + } + } + + virtual void characterData() + { + if (!m_callback.isUndefined() && !m_callback["characterData"].isUndefined()) + { + m_callback.call("characterData", m_content); + } + } + + virtual void OnStartElement(const XML_Char *pszName, const XML_Char **papszAttrs) + { + m_tag = pszName; + m_attrs = ""; + for (XML_Char **itr = (XML_Char **)papszAttrs; *itr != NULL; itr += 2) + { + if (!m_attrs.empty()) + { + m_attrs += "\1\1"; + } + m_attrs += *itr; + m_attrs += "\1"; + m_attrs += *(itr + 1); + } + startElement(); + } + + virtual void OnEndElement(const XML_Char *pszName) + { + m_tag = pszName; + endElement(); + } + + virtual void OnCharacterData(const XML_Char *pszData, int nLength) + { + m_content.assign(pszData, nLength); + characterData(); + } +}; + +EMSCRIPTEN_BINDINGS(expatlib_bindings) +{ + emscripten::class_("CExpat") + .constructor<>() + .class_function("version", &CExpat::version) + .function("setCallback", &CExpat::setCallback) + .function("create", &CExpat::create) + .function("destroy", &CExpat::destroy) + .function("parse", &CExpat::parse) + .function("tag", &CExpat::tag) + .function("attrs", &CExpat::attrs) + .function("content", &CExpat::content) + .function("startElement", &CExpat::startElement) + .function("endElement", &CExpat::endElement) + .function("characterData", &CExpat::characterData); +} diff --git a/packages/expat/src-cpp/expatlib/stack_parser.h b/packages/expat/src-cpp/stack_parser.h similarity index 95% rename from packages/expat/src-cpp/expatlib/stack_parser.h rename to packages/expat/src-cpp/stack_parser.h index aba9e2b5..24338815 100644 --- a/packages/expat/src-cpp/expatlib/stack_parser.h +++ b/packages/expat/src-cpp/stack_parser.h @@ -119,12 +119,6 @@ class CExpatImpl XML_SetDefaultHandler(m_p, fEnable ? DefaultHandler : NULL); } - // void EnableExternalEntityRefHandler(bool fEnable = true) - // { - // assert(m_p != NULL); - // XML_SetExternalEntityRefHandler(m_p, fEnable ? ExternalEntityRefHandler : NULL); - // } - void EnableUnknownEncodingHandler(bool fEnable = true) { XML_SetUnknownEncodingHandler(m_p, fEnable ? UnknownEncodingHandler : NULL, 0); @@ -207,17 +201,6 @@ class CExpatImpl return XML_ExpatVersion(); } - /* static void GetExpatVersion(int *pnMajor, int *pnMinor, int *pnMicro) - { - XML_expat_version v = XML_ExpatVersionInfo(); - if(pnMajor) - *pnMajor = v .major; - if(pnMinor) - *pnMinor = v .minor; - if(pnMicro) - *pnMicro = v .micro; - }*/ - static const XML_LChar *GetErrorString(enum XML_Error nError) { return XML_ErrorString(nError); diff --git a/packages/expat/src/expat.ts b/packages/expat/src/expat.ts index 5588da23..08dcc05f 100644 --- a/packages/expat/src/expat.ts +++ b/packages/expat/src/expat.ts @@ -1,5 +1,5 @@ // @ts-expect-error importing from a wasm file is resolved via a custom esbuild plugin -import load, { reset } from "../../../build/packages/expat/src-cpp/expatlib/expatlib.wasm"; +import load, { reset } from "../../../build/packages/expat/src-cpp/expatlib.wasm"; export type Attributes = { [key: string]: string }; export interface IParser { @@ -78,7 +78,7 @@ export class Expat { * @returns The Expat c++ version */ version(): string { - return this._module.CExpat.prototype.version(); + return this._module.CExpat.version(); } /** @@ -93,20 +93,16 @@ export class Expat { * @returns `true`|`false` if the XML parse succeeds. */ parse(xml: string, callback: IParser): boolean { - const parser = new this._module.CExpatJS(); - parser.startElement = function () { - callback.startElement(this.tag(), parseAttrs(this.attrs())); - }; - parser.endElement = function () { - callback.endElement(this.tag()); - }; - parser.characterData = function () { - callback.characterData(this.content()); - }; + const parser = new this._module.CExpat(); + parser.setCallback({ + startElement: (tag: string, attrs: string) => callback.startElement(tag, parseAttrs(attrs)), + endElement: (tag: string) => callback.endElement(tag), + characterData: (content: string) => callback.characterData(content) + }); parser.create(); const retVal = parser.parse(xml); parser.destroy(); - this._module.destroy(parser); + parser.delete(); return retVal; } } diff --git a/packages/graphviz/src-cpp/CMakeLists.txt b/packages/graphviz/src-cpp/CMakeLists.txt index a512527e..ca063836 100644 --- a/packages/graphviz/src-cpp/CMakeLists.txt +++ b/packages/graphviz/src-cpp/CMakeLists.txt @@ -18,20 +18,11 @@ set(EM_LINK_FLAGS "-sEXPORT_NAME='${CMAKE_PROJECT_NAME}'" "-sEXPORTED_FUNCTIONS=\"['_free', '_malloc']\"" "-sEXPORTED_RUNTIME_METHODS=\"[UTF8ToString]\"" - "--post-js ${CMAKE_CURRENT_BINARY_DIR}/main_glue.js" + "-lembind" "--emit-tsd ${CMAKE_CURRENT_BINARY_DIR}/graphvizlib.d.ts" ) string(REPLACE ";" " " LINK_FLAGS "${EM_LINK_FLAGS}") -# Generate Glue from IDL file --- -add_custom_command( - MAIN_DEPENDENCY ${CMAKE_CURRENT_SOURCE_DIR}/main.idl - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/main_glue.js ${CMAKE_CURRENT_BINARY_DIR}/main_glue.cpp - COMMAND python3 ${CMAKE_BINARY_DIR}/../emsdk/upstream/emscripten/tools/webidl_binder.py ${CMAKE_CURRENT_SOURCE_DIR}/main.idl ${CMAKE_CURRENT_BINARY_DIR}/main_glue -) -set_property(SOURCE main.cpp APPEND PROPERTY OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/main_glue.cpp) -# --- --- --- - set(SRCS main.hpp main.cpp @@ -41,7 +32,6 @@ set(SRCS include_directories( ${Graphviz_INCLUDE_DIRS}/graphviz - ${CMAKE_CURRENT_BINARY_DIR} ) add_executable(graphvizlib diff --git a/packages/graphviz/src-cpp/main.cpp b/packages/graphviz/src-cpp/main.cpp index 1ad798c5..1f0956c4 100644 --- a/packages/graphviz/src-cpp/main.cpp +++ b/packages/graphviz/src-cpp/main.cpp @@ -4,6 +4,7 @@ #include #include +#include #include extern gvplugin_library_t gvplugin_dot_layout_LTX_library; @@ -34,12 +35,15 @@ lt_symlist_t lt_preloaded_symbols[] = { {"gvplugin_core_LTX_library", &gvplugin_core_LTX_library}, {0, 0}}; -StringBuffer lastErrorStr; - -int vizErrorf(char *buf) +namespace { - lastErrorStr = buf; - return 0; + std::string lastErrorStr; + + int vizErrorf(char *buf) + { + lastErrorStr = buf ? buf : ""; + return 0; + } } extern int Y_invert; @@ -47,12 +51,12 @@ int origYInvert = Y_invert; extern int Nop; int origNop = Nop; -const char *Graphviz::version() +std::string Graphviz::version() { return PACKAGE_VERSION; } -const char *Graphviz::lastError() +std::string Graphviz::lastError() { return lastErrorStr; } @@ -65,14 +69,13 @@ Graphviz::Graphviz(int yInvert, int nop) lastErrorStr = ""; agseterr(AGERR); agseterrf(vizErrorf); - // agreadline(1); } Graphviz::~Graphviz() { } -void Graphviz::createFile(const char *path, const char *data) +void Graphviz::createFile(const std::string &path, const std::string &data) { EM_ASM( { @@ -82,24 +85,24 @@ void Graphviz::createFile(const char *path, const char *data) FS.createPath("/", PATH.dirname(path)); FS.writeFile(PATH.join("/", path), data); }, - path, data); + path.c_str(), data.c_str()); } -const char *Graphviz::layout(const char *src, const char *format, const char *engine) +std::string Graphviz::layout(const std::string &src, const std::string &format, const std::string &engine) { layout_result = ""; GVC_t *gvc = gvContextPlugins(lt_preloaded_symbols, true); - Agraph_t *graph = agmemread(src); + Agraph_t *graph = agmemread(src.c_str()); if (graph) { char *data = NULL; size_t length; - gvLayout(gvc, graph, engine); - gvRenderData(gvc, graph, format, &data, &length); - layout_result = data; + gvLayout(gvc, graph, engine.c_str()); + gvRenderData(gvc, graph, format.c_str(), &data, &length); + layout_result = data ? data : ""; gvFreeRenderData(data); gvFreeLayout(gvc, graph); agclose(graph); @@ -111,47 +114,47 @@ const char *Graphviz::layout(const char *src, const char *format, const char *en return layout_result; } -bool Graphviz::acyclic(const char *src, bool doWrite, bool verbose) +bool Graphviz::acyclic(const std::string &src, bool doWrite, bool verbose) { acyclic_outFile = ""; acyclic_num_rev = 0; bool retVal = false; - Agraph_t *graph = agmemread(src); + Agraph_t *graph = agmemread(src.c_str()); if (graph) { TempFileBuffer outFile; graphviz_acyclic_options_t opts = {outFile, doWrite, verbose}; retVal = graphviz_acyclic(graph, &opts, &acyclic_num_rev); - acyclic_outFile = outFile; + acyclic_outFile = std::string(outFile); agclose(graph); } return retVal; } -void Graphviz::tred(const char *src, bool verbose, bool printRemovedEdges) +void Graphviz::tred(const std::string &src, bool verbose, bool printRemovedEdges) { tred_out = ""; tred_err = ""; - Agraph_t *graph = agmemread(src); + Agraph_t *graph = agmemread(src.c_str()); if (graph) { TempFileBuffer out; TempFileBuffer err; graphviz_tred_options_t opts = {verbose, printRemovedEdges, out, err}; graphviz_tred(graph, &opts); - tred_out = out; - tred_err = err; + tred_out = std::string(out); + tred_err = std::string(err); agclose(graph); } } -const char *Graphviz::unflatten(const char *src, int maxMinlen, bool do_fans, int chainLimit) +std::string Graphviz::unflatten(const std::string &src, int maxMinlen, bool do_fans, int chainLimit) { unflatten_out = ""; - Agraph_t *graph = agmemread(src); + Agraph_t *graph = agmemread(src.c_str()); if (graph) { graphviz_unflatten_options_t opts = {do_fans, maxMinlen, chainLimit}; @@ -159,11 +162,28 @@ const char *Graphviz::unflatten(const char *src, int maxMinlen, bool do_fans, in TempFileBuffer tempFile; agwrite(graph, tempFile); - unflatten_out = tempFile; + unflatten_out = std::string(tempFile); agclose(graph); } return unflatten_out; } -// Include JS Glue --- -#include "main_glue.cpp" +EMSCRIPTEN_BINDINGS(graphvizlib_bindings) +{ + emscripten::class_("Graphviz") + .constructor<>() + .constructor() + .class_function("version", &Graphviz::version) + .class_function("lastError", &Graphviz::lastError) + .function("createFile", &Graphviz::createFile) + .property("layout_result", &Graphviz::layout_result) + .function("layout", &Graphviz::layout) + .property("acyclic_outFile", &Graphviz::acyclic_outFile) + .property("acyclic_num_rev", &Graphviz::acyclic_num_rev) + .function("acyclic", &Graphviz::acyclic) + .property("tred_out", &Graphviz::tred_out) + .property("tred_err", &Graphviz::tred_err) + .function("tred", &Graphviz::tred) + .property("unflatten_out", &Graphviz::unflatten_out) + .function("unflatten", &Graphviz::unflatten); +} diff --git a/packages/graphviz/src-cpp/main.hpp b/packages/graphviz/src-cpp/main.hpp index b267933d..7d241519 100644 --- a/packages/graphviz/src-cpp/main.hpp +++ b/packages/graphviz/src-cpp/main.hpp @@ -1,27 +1,29 @@ #include "util.hpp" +#include + class Graphviz { public: - static const char *version(); - static const char *lastError(); + static std::string version(); + static std::string lastError(); Graphviz(int yInvert = 0, int nop = 0); ~Graphviz(); - void createFile(const char *path, const char *data); + void createFile(const std::string &path, const std::string &data); - StringBuffer layout_result; - const char *layout(const char *dot, const char *format, const char *engine); + std::string layout_result; + std::string layout(const std::string &dot, const std::string &format, const std::string &engine); - StringBuffer acyclic_outFile; + std::string acyclic_outFile; size_t acyclic_num_rev; - bool acyclic(const char *dot, bool doWrite = false, bool verbose = false); + bool acyclic(const std::string &dot, bool doWrite = false, bool verbose = false); - StringBuffer tred_out; - StringBuffer tred_err; - void tred(const char *dot, bool verbose = false, bool printRemovedEdges = false); + std::string tred_out; + std::string tred_err; + void tred(const std::string &dot, bool verbose = false, bool printRemovedEdges = false); - StringBuffer unflatten_out; - const char *unflatten(const char *dot, int maxMinlen = 0, bool do_fans = false, int chainLimit = 0); + std::string unflatten_out; + std::string unflatten(const std::string &dot, int maxMinlen = 0, bool do_fans = false, int chainLimit = 0); }; diff --git a/packages/graphviz/src-cpp/main.idl b/packages/graphviz/src-cpp/main.idl deleted file mode 100644 index e6a71727..00000000 --- a/packages/graphviz/src-cpp/main.idl +++ /dev/null @@ -1,20 +0,0 @@ -interface Graphviz -{ - void Graphviz(long yInvert, long nop); - [Const] static DOMString version(); - [Const] static DOMString lastError(); - void createFile([Const] DOMString file, [Const] DOMString data); - - [Const] attribute DOMString layout_result; - [Const] DOMString layout([Const] DOMString dot, [Const] DOMString format, [Const] DOMString engine); - - [Const] attribute DOMString acyclic_outFile; - attribute long acyclic_num_rev; - boolean acyclic([Const] DOMString dot, boolean doWrite, boolean verbose); - - [Const] attribute DOMString tred_out; - [Const] attribute DOMString tred_err; - void tred([Const] DOMString dot, boolean verbose, boolean printRemovedEdges); - - [Const] DOMString unflatten([Const] DOMString dot, long MaxMinlen, boolean Do_fans, long ChainLimit); -}; diff --git a/packages/graphviz/src/graphviz.ts b/packages/graphviz/src/graphviz.ts index 07da3e05..bee64d7c 100644 --- a/packages/graphviz/src/graphviz.ts +++ b/packages/graphviz/src/graphviz.ts @@ -121,7 +121,7 @@ export class Graphviz { * @returns The Graphviz c++ version */ version(): string { - return this._module.Graphviz.prototype.version(); + return this._module.Graphviz.version(); } /** @@ -145,9 +145,9 @@ export class Graphviz { } catch (e: any) { errorMsg = e.message; }; - errorMsg = graphViz.lastError() || errorMsg; + errorMsg = this._module.Graphviz.lastError() || errorMsg; } finally { - this._module.destroy(graphViz); + graphViz.delete(); } if (!retVal && errorMsg) { Graphviz.unload(); @@ -179,9 +179,9 @@ export class Graphviz { } catch (e: any) { errorMsg = e.message; }; - errorMsg = graphViz.lastError() || errorMsg; + errorMsg = this._module.Graphviz.lastError() || errorMsg; } finally { - this._module.destroy(graphViz); + graphViz.delete(); } if (errorMsg) { Graphviz.unload(); @@ -212,9 +212,9 @@ export class Graphviz { } catch (e: any) { errorMsg = e.message; }; - errorMsg = graphViz.lastError() || errorMsg; + errorMsg = this._module.Graphviz.lastError() || errorMsg; } finally { - this._module.destroy(graphViz); + graphViz.delete(); } if (!out && errorMsg) { Graphviz.unload(); @@ -243,9 +243,9 @@ export class Graphviz { } catch (e: any) { errorMsg = e.message; }; - errorMsg = graphViz.lastError() || errorMsg; + errorMsg = this._module.Graphviz.lastError() || errorMsg; } finally { - this._module.destroy(graphViz); + graphViz.delete(); } if (!retVal && errorMsg) { Graphviz.unload(); diff --git a/packages/zstd/src-cpp/CMakeLists.txt b/packages/zstd/src-cpp/CMakeLists.txt index c84e3ea4..604038d3 100644 --- a/packages/zstd/src-cpp/CMakeLists.txt +++ b/packages/zstd/src-cpp/CMakeLists.txt @@ -10,29 +10,20 @@ set(EM_LINK_FLAGS "-sEXPORT_NAME='${CMAKE_PROJECT_NAME}'" "-sEXPORTED_FUNCTIONS=\"[]\"" "-sEXPORTED_RUNTIME_METHODS=\"['UTF8ToString', 'HEAPU8']\"" - "--post-js ${CMAKE_CURRENT_BINARY_DIR}/main_glue.js" + "-lembind" + "--emit-tsd ${CMAKE_CURRENT_BINARY_DIR}/zstdlib.d.ts" ) string(REPLACE ";" " " LINK_FLAGS "${EM_LINK_FLAGS}") -# Generate Glue from IDL file --- -add_custom_command( - MAIN_DEPENDENCY ${CMAKE_CURRENT_SOURCE_DIR}/main.idl - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/main_glue.js ${CMAKE_CURRENT_BINARY_DIR}/main_glue.cpp - COMMAND python3 ${CMAKE_BINARY_DIR}/../emsdk/upstream/emscripten/tools/webidl_binder.py ${CMAKE_CURRENT_SOURCE_DIR}/main.idl ${CMAKE_CURRENT_BINARY_DIR}/main_glue -) -set_property(SOURCE main.cpp APPEND PROPERTY OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/main_glue.cpp) -# --- --- --- - include_directories( ${VCPKG_INCLUDE_DIR} - ${CMAKE_CURRENT_BINARY_DIR} ) add_executable(zstdlib main.cpp ) -set_target_properties(graphvizlib PROPERTIES COMPILE_FLAGS "${CPP_FLAGS}") +set_target_properties(zstdlib PROPERTIES COMPILE_FLAGS "${CPP_FLAGS}") set_target_properties(zstdlib PROPERTIES LINK_FLAGS "${LINK_FLAGS}") target_link_libraries(zstdlib diff --git a/packages/zstd/src-cpp/main.cpp b/packages/zstd/src-cpp/main.cpp index 907a81a0..1edea056 100644 --- a/packages/zstd/src-cpp/main.cpp +++ b/packages/zstd/src-cpp/main.cpp @@ -1,75 +1,103 @@ -#include +#include +#include +#include #include +#include + struct zstd { public: - static const char *version(void) + static std::string version() { return ZSTD_versionString(); } - static void *malloc(size_t __size) + static uintptr_t malloc(size_t size) { - return ::malloc(__size); + return reinterpret_cast(::malloc(size)); } - static void free(void *__ptr) + static void free(uintptr_t ptr) { - ::free(__ptr); + ::free(reinterpret_cast(ptr)); } - static size_t compress(void *dst, size_t dstCapacity, const void *src, size_t srcSize, int compressionLevel) + static size_t compress(uintptr_t dst, size_t dstCapacity, uintptr_t src, size_t srcSize, int compressionLevel) { - return ZSTD_compress(dst, dstCapacity, src, srcSize, compressionLevel); + return ZSTD_compress( + reinterpret_cast(dst), + dstCapacity, + reinterpret_cast(src), + srcSize, + compressionLevel); } - static size_t decompress(void *dst, size_t dstCapacity, const void *src, size_t compressedSize) + static size_t decompress(uintptr_t dst, size_t dstCapacity, uintptr_t src, size_t compressedSize) { - return ZSTD_decompress(dst, dstCapacity, src, compressedSize); + return ZSTD_decompress( + reinterpret_cast(dst), + dstCapacity, + reinterpret_cast(src), + compressedSize); } - static unsigned long long getFrameContentSize(const void *src, size_t srcSize) + static double getFrameContentSize(uintptr_t src, size_t srcSize) { - return ZSTD_getFrameContentSize(src, srcSize); + return static_cast(ZSTD_getFrameContentSize(reinterpret_cast(src), srcSize)); } - static size_t findFrameCompressedSize(const void *src, size_t srcSize) + static size_t findFrameCompressedSize(uintptr_t src, size_t srcSize) { - return ZSTD_findFrameCompressedSize(src, srcSize); + return ZSTD_findFrameCompressedSize(reinterpret_cast(src), srcSize); } - static size_t compressBound(size_t srcSize) /*!< maximum compressed size in worst case single-pass scenario */ + static size_t compressBound(size_t srcSize) { return ZSTD_compressBound(srcSize); } - static unsigned isError(size_t code) /*!< tells if a `size_t` function result is an error code */ + static unsigned isError(size_t code) { return ZSTD_isError(code); } - static const char *getErrorName(size_t code) /*!< provides readable string from an error code */ + static std::string getErrorName(size_t code) { return ZSTD_getErrorName(code); } - static int minCLevel(void) /*!< minimum negative compression level allowed, requires v1.4.0+ */ + static int minCLevel() { return ZSTD_minCLevel(); } - static int maxCLevel(void) /*!< maximum compression level available */ + static int maxCLevel() { return ZSTD_maxCLevel(); } - static int defaultCLevel(void) /*!< default compression level, specified by ZSTD_CLEVEL_DEFAULT, requires v1.5.0+ */ + static int defaultCLevel() { return ZSTD_defaultCLevel(); } }; -// Include JS Glue --- -#include "main_glue.cpp" +EMSCRIPTEN_BINDINGS(zstdlib_bindings) +{ + emscripten::class_("zstd") + .class_function("version", &zstd::version) + .class_function("malloc", &zstd::malloc) + .class_function("free", &zstd::free) + .class_function("compress", &zstd::compress) + .class_function("decompress", &zstd::decompress) + .class_function("getFrameContentSize", &zstd::getFrameContentSize) + .class_function("findFrameCompressedSize", &zstd::findFrameCompressedSize) + .class_function("compressBound", &zstd::compressBound) + .class_function("isError", &zstd::isError) + .class_function("getErrorName", &zstd::getErrorName) + .class_function("minCLevel", &zstd::minCLevel) + .class_function("maxCLevel", &zstd::maxCLevel) + .class_function("defaultCLevel", &zstd::defaultCLevel); +} diff --git a/packages/zstd/src-cpp/main.idl b/packages/zstd/src-cpp/main.idl deleted file mode 100644 index 0297e903..00000000 --- a/packages/zstd/src-cpp/main.idl +++ /dev/null @@ -1,19 +0,0 @@ -interface zstd -{ - [Const] static DOMString version(); - - static any malloc(unsigned long size); - static void free(any ptr); - - static unsigned long compress(any dst, unsigned long dstCapacity, [Const] any src, unsigned long srcSize, long compressionLevel); - static unsigned long decompress(any dst, unsigned long dstCapacity, [Const] any src, unsigned long compressedSize); - static unsigned long long getFrameContentSize([Const] any src, unsigned long srcSize); - static unsigned long findFrameCompressedSize([Const] any src, unsigned long srcSize); - - static unsigned long compressBound(unsigned long srcSize); - static unsigned long isError(unsigned long code); - [Const] static DOMString getErrorName(unsigned long code); - static long minCLevel(); - static long maxCLevel(); - static long defaultCLevel(); -}; diff --git a/packages/zstd/src/zstd.ts b/packages/zstd/src/zstd.ts index def00f60..1c2d7775 100644 --- a/packages/zstd/src/zstd.ts +++ b/packages/zstd/src/zstd.ts @@ -27,7 +27,7 @@ let g_zstd: Promise; export class Zstd extends WasmLibrary { private constructor(_module: any) { - super(_module, _module.zstd.prototype); + super(_module, _module.zstd); } /**