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()
EndgetLibExtismFunctions.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")

