Programming > Problems & Solutions
O2 SB Embed
JRS:
Charles,
I'm trying to get scriba_NewSbArgs working in O2. You show an example in SbWin2.o2bas which doesn't complain like it does for me. The scriba.inc definition of this function doesn't reference the arguments after the mask string and I get an O2 error with a parameter mismatch. Did you ever get this function to work?
Here is an example of it working in CBASIC.
https://allbasic.info/forum/index.php?topic=628.msg7563#msg7563
JRS:
I noticed that you went SB direct with the following rather than using the scriba.inc file. Does this make it easier to call functions with a variable number of arguments?
--- Code: OxygenBasic --- sys sb=LoadLibrary libScriba ' 'http://www.scriptbasic.org/docs/dg/devguide_3.3.html extern bind sb { scriba_new ' @newmem, @freemem scriba_SetStdin() ' pProgram,@function scriba_SetStdout() ' pProgram,@function scriba_SetEmbedPointer() ' pProgram,@function scriba_LoadConfiguration ' pProgram,filename scriba_destroy ' pProgram scriba_DestroySbData ' pProgram, pData scriba_SetFileName ' pProgram, strptr filename scriba_LoadSourceProgram ' pProgram scriba_LoadProgramString ' pProgram, SrcString, len scriba_Run ' pProgram, strptr commandline scriba_GetVariable ' pProgram, serial, psbData scriba_SetVariable ' pProgram, serial, type, longVal, doubleVal, charVal*, size scriba_LookupVariableByName ' pProgram, strptr name scriba_LookupFunctionByName ' pProgram, strptr name scriba_Call ' pProgram, serial scriba_CallArg ' pProgram, serial,ArgFormString i/r/s/b,args... scriba_NewSbArgs ' pProgram, string i/r/s/b,args scriba_CallArgEx ' pProgram, serial,ReturnData,countArgs,*ArgDate scriba_DestroySbArgs ' pProgram, pArgData, CountArgs scriba_DestroySbData ' pProgram, pSbData scriba_NewSbString ' pProgram, char* s } end extern
JRS:
I was able to get it working using the extern approach.
ScriptBasic can be used in 4 ways.
[*] Console interpreter with stdio redirection
[*] Windows interpreter for GUI apps
[*] Muli-threaded webserver as a service
[*] Enbeddable API as a DLL
[/list]
Runs on everything. ANSI C based.
--- Code: OxygenBasic ---' O2 SB Embed % filename "o2sb.exe"includepath "$/inc/"include "RTL32.inc"% libScriba = "libScriba.dll"indexbase 0 type SbData typ as dword siz as dword union { dbl as double lng as sys str as char* gen as sys }end type #define SBT_UNDEF 0#define SBT_DOUBLE 1#define SBT_LONG 2#define SBT_STRING 3#define SBT_ZCHAR 4 sys pProgram, iError, cArgssys f1, f2, vsys n, msys qdatSbData ReturnData, ArgData[3]sbData pdat sys sb=LoadLibrary libScribaextern cdecl bind sb { scriba_new scriba_SetStdin() scriba_SetStdout() scriba_SetEmbedPointer() scriba_LoadConfiguration scriba_destroy scriba_DestroySbData scriba_SetFileName scriba_LoadSourceProgram scriba_LoadProgramString scriba_Run scriba_GetVariable scriba_SetVariable scriba_LookupVariableByName scriba_LookupFunctionByName scriba_Call scriba_CallArg scriba_NewSbArgs scriba_CallArgEx scriba_DestroySbArgs scriba_DestroySbData scriba_NewSbString }end extern function newmem cdecl (sys le) as sys, export return getmemory leend function function freemem cdecl (sys p) export freememory pend function pProgram = scriba_new(@newmem, @freemem)scriba_LoadConfiguration(pProgram, "C:\Windows\SCRIBA.INI")scriba_SetFileName(pProgram, "test.sb")scriba_LoadSourceProgram(pProgram)scriba_Run(pProgram,"") ' Get Global Var sbdata *p v = scriba_LookupVariableByName(pProgram, "main::a")scriba_GetVariable(pProgram, v, @@p)print "A: " + str(p.lng) ' Create SB Variant ArraysbData *arg@arg = scriba_NewSbArgs(pProgram,"i r s", 1, .2, "three")print str(arg[0].lng) + " | " + str(arg[1].dbl) + " | " + arg[2].str scriba_destroy(pProgram)
test.sb
--- Code: Script BASIC ---a = 99
03/26/2021 11:01 PM 14,336 o2sb.exe
JRS:
This example shows how to use ScriptBasic syntax in your Oxygen Basic program.
I can't thank Charles enough for the enormous effort he invested in untangling ScriptBasic's macro pointer C environment to O2.
--- Code: OxygenBasic ---' O2 SB Syntax Embed % filename "replace.exe"includepath "$/inc/"include "RTL32.inc"% libScriba = "libScriba.dll"indexbase 0 type SbData typ as dword siz as dword union { dbl as double lng as sys str as char* gen as sys }end type sys sb = LoadLibrary libScribaextern cdecl bind sb { scriba_new scriba_LoadConfiguration scriba_SetFileName scriba_LoadSourceProgram scriba_Run scriba_LookupFunctionByName scriba_NewSbArgs scriba_CallArgEx scriba_DestroySbArgs scriba_destroy }end extern function newmem cdecl (sys le) as sys, export return getmemory leend function function freemem cdecl (sys p) export freememory pend function sys pProgram. fnsnsbData *argsbData *argr pProgram = scriba_new(@newmem, @freemem)scriba_LoadConfiguration(pProgram, "C:\Windows\SCRIBA.INI")scriba_SetFileName(pProgram, "sbfunctions")scriba_LoadSourceProgram(pProgram)scriba_Run(pProgram, "") @arg = scriba_NewSbArgs(pProgram, "s s s i i", "Hello World", "Hello", "Goodbye", 1, 1)fnsn = scriba_LookupFunctionByName(pProgram, "main::sb_replace") @argr = scriba_NewSbArgs(pProgram,"s", "")scriba_CallArgEx(pProgram, fnsn, argr, 5, arg)print argr.str scriba_DestroySbArgs(pProgram, arg, 5)scriba_DestroySbArgs(pProgram, argr, 1)scriba_destroy(pProgram)
sbfunctions
--- Code: Script BASIC ---' sbfunctions - ScriptBasic syntax function wrappers FUNCTION sb_replace(basestr, searchstr, replacestr, occurances, startpos) sb_replace = REPLACE(basestr, searchstr, replacestr, occurances, startpos)END FUNCTION
JRS:
This example shows calling a ScriptBasic function that uses the cURL extension module to do a request to the OpenWeather API returning a JSON response.
--- Code: OxygenBasic ---' O2 SB cURL OpenWeather Example % filename "weather.exe"includepath "$/inc/"include "RTL32.inc"% libScriba = "libScriba.dll" indexbase 0 type SbData typ as dword siz as dword union { dbl as double lng as sys str as char* gen as sys }end type sys sb = LoadLibrary libScribaextern cdecl bind sb { scriba_new scriba_LoadConfiguration scriba_SetFileName scriba_LoadSourceProgram scriba_Run scriba_LookupFunctionByName scriba_NewSbArgs scriba_CallArgEx scriba_DestroySbArgs scriba_destroy }end extern function newmem cdecl (sys le) as sys, export return getmemory leend function function freemem cdecl (sys p) export freememory pend function sys pProgram, fnsnsbData *argsbData *argr pProgram = scriba_new(@newmem, @freemem)scriba_LoadConfiguration(pProgram, "C:\Windows\SCRIBA.INI")scriba_SetFileName(pProgram, "weather.sb")scriba_LoadSourceProgram(pProgram)scriba_Run(pProgram, "") @arg = scriba_NewSbArgs(pProgram, "s", "Anacortes,US")fnsn = scriba_LookupFunctionByName(pProgram, "main::get_weather") @argr = scriba_NewSbArgs(pProgram,"s", "")scriba_CallArgEx(pProgram, fnsn, argr, 1, arg)print argr.str scriba_DestroySbArgs(pProgram, arg, 1)scriba_DestroySbArgs(pProgram, argr, 1)scriba_destroy(pProgram)
weather.sb
--- Code: Script BASIC ---' OpenWeather - Curl Example IMPORT curl.sbi FUNCTION Get_Weather(place) ch = curl::init() curl::option(ch, "URL", "http://api.openweathermap.org/data/2.5/weather?q=" & place & "&units=imperial&appid=MY_API_KEY") curl::option(ch, "CUSTOMREQUEST", "GET") response = curl::perform(ch) curl::finish(ch) Get_Weather = responseEND FUNCTION
Navigation
[0] Message Index
[#] Next page
Go to full version