WebAssembly (Wasm) is a very interesting format. It is s designed as a portable compilation target for different programming languages. It is very easy to use Wasm from the Extism PDKs via C-API of it in PureBasic.
Enjoy it.
Stefan
Code: Select all
#EXTISM_SUCCESS = 0
Procedure ErrorHandler()
PrintN("ERROR: " + ErrorMessage())
EndProcedure
Procedure countVowels(input.s)
fileName.s = "..//c-pdk//count_vowels.wasm"
libExtism.i = #Null
CompilerSelect #PB_Compiler_OS
CompilerCase #PB_OS_Linux
libExtism = OpenLibrary(#PB_Any, ".//libextism.so")
CompilerCase #PB_OS_MacOS
libExtism = OpenLibrary(#PB_Any, ".//libextism.dylib")
CompilerCase #PB_OS_Windows
libExtism = OpenLibrary(#PB_Any, ".//extism.dll")
CompilerEndSelect
If libExtism
IncludeFile ".//getLibExtismFunctions.pbi"
Else
PrintN("ERROR: Can not open library")
ProcedureReturn
EndIf
wasmFile.i = OpenFile(#PB_Any, fileName)
If Not wasmFile
CloseLibrary(libExtism)
PrintN("ERROR: Can not open wasm file")
ProcedureReturn
EndIf
*wasm = AllocateMemory(Lof(wasmFile))
If *wasm And ReadData(wasmFile, *wasm, Lof(wasmFile))
errmsg.s = #Null$
*errmsg = @errmsg
plugin.i = CallCFunctionFast(*extismPluginNew, *wasm, MemorySize(*wasm), #Null, 0, #True, @*errmsg)
If plugin
functionName.s = "count_vowels"
functionExists.b = CallCFunctionFast(*extismPluginFunctionExists, plugin, UTF8(functionName))
If functionExists
rc.i = CallCFunctionFast(*extismPluginCall, plugin, UTF8(functionName), UTF8(input), Len(input))
If rc = #EXTISM_SUCCESS
outLen.i = CallCFunctionFast(*extismPluginOutputLength, plugin)
out.i = CallCFunctionFast(*extismPluginOutputData, plugin)
PrintN(PeekS(out, outLen, #PB_UTF8))
Else
*error = CallCFunctionFast(*extismPluginError, plugin)
PrintN("ERROR: " + PeekS(*error, -1, #PB_UTF8))
EndIf
CallCFunctionFast(*extismPluginFree, plugin)
EndIf
Else
PrintN("ERROR: " + PeekS(*errmsg, -1, #PB_UTF8))
CallCFunctionFast(*extismPluginNewErrorFree, *errmsg)
EndIf
FreeMemory(*wasm)
EndIf
CloseFile(wasmFile)
CloseLibrary(libExtism)
EndProcedure
Procedure Main()
If OpenConsole()
OnErrorCall(@ErrorHandler())
countVowels(~"Hello World from PureBasic via WebAssembly")
; Expected output: {"count":13,"vowels":"aeiouAEIOU"}
PrintN("Press return to exit")
Input()
CloseConsole()
EndIf
EndProcedure
Main()
End
getLibExtismFunctions.pbi:
Code: Select all
*extismCompiledPluginFree = GetFunction(libExtism, "extism_compiled_plugin_free")
*extismCompiledPluginNew = GetFunction(libExtism, "extism_compiled_plugin_new")
*extismCurrentPluginHostContext = GetFunction(libExtism, "extism_current_plugin_host_context")
*extismCurrentPluginMemory = GetFunction(libExtism, "extism_current_plugin_memory")
*extismCurrentPluginMemoryAlloc = GetFunction(libExtism, "extism_current_plugin_memory_alloc")
*extismCurrentPluginMemoryFree = GetFunction(libExtism, "extism_current_plugin_memory_free")
*extismCurrentPluginMemoryLength = GetFunction(libExtism, "extism_current_plugin_memory_length")
*extismError = GetFunction(libExtism, "extism_error")
*extismFunctionFree = GetFunction(libExtism, "extism_function_free")
*extismFunctionNew = GetFunction(libExtism, "extism_function_new")
*extismFunctionSetNamespace = GetFunction(libExtism, "extism_function_set_namespace")
*extismLogCustom = GetFunction(libExtism, "extism_log_custom")
*extismLogDrain = GetFunction(libExtism, "extism_log_drain")
*extismLogFile = GetFunction(libExtism, "extism_log_file")
*extismPluginAllowHttpResponseHeader = GetFunction(libExtism, "extism_plugin_allow_http_response_headers")
*extismPluginCall = GetFunction(libExtism, "extism_plugin_call")
*extismPluginCallWithHostContext = GetFunction(libExtism, "extism_plugin_call_with_host_context")
*extismPluginCancel = GetFunction(libExtism, "extism_plugin_cancel")
*extismPluginCancelHandle = GetFunction(libExtism, "extism_plugin_cancel_handle")
*extismPluginConfig = GetFunction(libExtism, "extism_plugin_config")
*extismPluginError = GetFunction(libExtism, "extism_plugin_error")
*extismPluginFree = GetFunction(libExtism, "extism_plugin_free")
*extismPluginFunctionExists = GetFunction(libExtism, "extism_plugin_function_exists")
*extismPluginId = GetFunction(libExtism, "extism_plugin_id")
*extismPluginNew = GetFunction(libExtism, "extism_plugin_new")
*extismPluginNewErrorFree = GetFunction(libExtism, "extism_plugin_new_error_free")
*extismPluginNewFromCompiled = GetFunction(libExtism, "extism_plugin_new_from_compiled")
*extismPluginNewWithFuelLimit = GetFunction(libExtism, "extism_plugin_new_with_fuel_limit")
*extismPluginOutputData = GetFunction(libExtism, "extism_plugin_output_data")
*extismPluginOutputLength = GetFunction(libExtism, "extism_plugin_output_length")
*extismPluginReset = GetFunction(libExtism, "extism_plugin_reset")
*extismVersion = GetFunction(libExtism, "extism_version")