// ScriptBasic Shared Object
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
#include <time.h>
#include <unistd.h>
#include "/home/ubuntu/sb-dev-master/basext.h"
#include "/home/ubuntu/sb-dev-master/scriba.h"
#include "cbasic.h"
/***********************
Statc Support Routines
***********************/
struct _RunServiceProgram {
char *pszProgramFileName;
char *pszCmdLineArgs;
char *pszConfigFileName;
pSbProgram pTProgram;
int iRestart;
};
static void ExecuteProgramThread(void *p){
pSbProgram pProgram;
char szInputFile[1024];
int iErrorCode;
struct _RunServiceProgram *pRSP;
pRSP = p;
strcpy(szInputFile
,pRSP
->pszProgramFileName
); pRSP->pTProgram = pProgram;
if( pProgram == NULL )return;
scriba_SetFileName(pProgram,szInputFile);
if (pRSP->pszConfigFileName != NULL){
strcpy(szInputFile
,pRSP
->pszConfigFileName
); scriba_LoadConfiguration(pProgram, pRSP->pszConfigFileName);
}else{
scriba_SetProcessSbObject(pProgram,pProgram);
}
scriba_LoadSourceProgram(pProgram);
if (pRSP->pszCmdLineArgs != NULL){
strcpy(szInputFile
,pRSP
->pszCmdLineArgs
); iErrorCode = scriba_Run(pProgram,pRSP->pszCmdLineArgs);
}else{
iErrorCode = scriba_Run(pProgram,NULL);
}
// scriba_destroy(pProgram);
return;
}
/*****************************
ScriptBasic Object Functions
*****************************/
FUNCTION long SB_New()
BEGIN_FUNCTION
DIM AS pSbProgram sbobj;
RETURN_FUNCTION(sbobj);
END_FUNCTION
FUNCTION int SB_Configure(unsigned long sbobj, char PTR cfgfilename)
BEGIN_FUNCTION
DIM AS int rtnval = -1;
rtnval = scriba_LoadConfiguration(sbobj, cfgfilename);
RETURN_FUNCTION(rtnval);
END_FUNCTION
FUNCTION int SB_Load(unsigned long sbobj, char PTR sbfilename)
BEGIN_FUNCTION
DIM AS int rtnval = -1;
rtnval = scriba_SetFileName(sbobj, sbfilename);
scriba_LoadSourceProgram(sbobj);
RETURN_FUNCTION(rtnval);
END_FUNCTION
FUNCTION int SB_LoadStr(unsigned long sbobj, char PTR sbpgm)
BEGIN_FUNCTION
DIM AS int rtnval = -1;
scriba_SetFileName(sbobj, "fake");
rtnval
= scriba_LoadProgramString
(sbobj
, sbpgm
, strlen(sbpgm
)); RETURN_FUNCTION(rtnval);
END_FUNCTION
FUNCTION int SB_Run(unsigned long sbobj, char PTR sbcmdline)
BEGIN_FUNCTION
DIM AS int rtnval;
IF (besARGNR < 2) THEN_DO sbcmdline = "";
rtnval = scriba_Run(sbobj, sbcmdline);
RETURN_FUNCTION(rtnval);
END_FUNCTION
FUNCTION int SB_NoRun(unsigned long sbobj)
BEGIN_FUNCTION
DIM AS int rtnval;
rtnval = scriba_NoRun(sbobj);
RETURN_FUNCTION(rtnval);
END_FUNCTION
FUNCTION int SB_ThreadStart(char PTR pszProgramFileName, char PTR pszCmdLineArgs, char PTR pszConfigFileName)
BEGIN_FUNCTION
DIM AS struct _RunServiceProgram PTR pRSP;
DIM AS THREADHANDLE T;
DIM AS unsigned long rtnval;
pRSP
= (struct _RunServiceProgram PTR
)malloc( sizeof(struct _RunServiceProgram
) ); pRSP
->pszProgramFileName
= (char PTR
)malloc(strlen(pszProgramFileName
) + 1); strcpy(pRSP
->pszProgramFileName
,pszProgramFileName
); IF (pszCmdLineArgs NE NULL) THEN
pRSP
->pszCmdLineArgs
= (char PTR
)malloc(strlen(pszCmdLineArgs
) + 1); strcpy(pRSP
->pszCmdLineArgs
,pszCmdLineArgs
); ELSE
pRSP->pszCmdLineArgs = NULL;
END_IF
IF (pszConfigFileName NE NULL) THEN
pRSP
->pszConfigFileName
= (char PTR
)malloc(strlen(pszConfigFileName
) + 1); strcpy(pRSP
->pszConfigFileName
,pszConfigFileName
); ELSE
pRSP->pszConfigFileName = NULL;
END_IF
pRSP->iRestart = 0;
thread_CreateThread(AT T,ExecuteProgramThread,pRSP);
usleep(500);
rtnval = pRSP->pTProgram;
RETURN_FUNCTION(rtnval);
END_FUNCTION
SUB SB_ThreadEnd()
BEGIN_SUB
thread_ExitThread();
END_SUB
SUB SB_Destroy(unsigned long sbobj)
scriba_destroy(sbobj);
END_SUB
FUNCTION long SB_GetLong(unsigned long sbobj, char PTR varname)
BEGIN_FUNCTION
DIM AS pSbData varobj;
DIM AS int vsn;
vsn = scriba_LookupVariableByName(sbobj, varname);
scriba_GetVariable(sbobj, vsn, AT varobj);
RETURN_FUNCTION(varobj[0].v.l);
END_FUNCTION
FUNCTION double SB_GetDouble(unsigned long sbobj, char PTR varname)
BEGIN_FUNCTION
DIM AS pSbData varobj;
DIM AS int vsn;
vsn = scriba_LookupVariableByName(sbobj, varname);
scriba_GetVariable(sbobj, vsn, AT varobj);
RETURN_FUNCTION(varobj[0].v.d);
END_FUNCTION
FUNCTION PTR char SB_GetString(unsigned long sbobj, char PTR varname)
BEGIN_FUNCTION
DIM AS pSbData varobj;
DIM AS int vsn;
vsn = scriba_LookupVariableByName(sbobj, varname);
scriba_GetVariable(sbobj, vsn, AT varobj);
RETURN_FUNCTION(varobj[0].v.s);
END_FUNCTION
FUNCTION int SB_SetUndef(unsigned long sbobj, char PTR varname)
BEGIN_FUNCTION
DIM AS pSbData varobj;
DIM AS int vsn;
vsn = scriba_LookupVariableByName(sbobj, varname);
RETURN_FUNCTION(scriba_SetVariable(sbobj, vsn, SBT_UNDEF, NULL, 0, "", 0));
END_FUNCTION
FUNCTION int SB_SetInt(unsigned long sbobj, char PTR varname, int usrval)
BEGIN_FUNCTION
DIM AS pSbData varobj;
DIM AS int vsn;
vsn = scriba_LookupVariableByName(sbobj, varname);
RETURN_FUNCTION(scriba_SetVariable(sbobj, vsn, SBT_LONG, usrval, 0, "", 0));
END_FUNCTION
FUNCTION int SB_SetDbl(unsigned long sbobj, char PTR varname, double usrval)
BEGIN_FUNCTION
DIM AS pSbData varobj;
DIM AS int vsn;
vsn = scriba_LookupVariableByName(sbobj, varname);
RETURN_FUNCTION(scriba_SetVariable(sbobj, vsn, SBT_DOUBLE, 0, usrval, "", 0));
END_FUNCTION
FUNCTION int SB_SetStr(unsigned long sbobj, char PTR varname, char PTR usrval)
BEGIN_FUNCTION
DIM AS pSbData varobj;
DIM AS int vsn;
vsn = scriba_LookupVariableByName(sbobj, varname);
RETURN_FUNCTION
(scriba_SetVariable
(sbobj
, vsn
, SBT_STRING
, 0, 0, usrval
, strlen(usrval
)));END_FUNCTION
SUB SB_ResetVars(unsigned long sbobj)
BEGIN_SUB
scriba_ResetVariables(sbobj);
END_SUB
SUB SB_msSleep(long t)
BEGIN_SUB
usleep(t);
END_SUB
FUNCTION int SB_CallSub(unsigned long sbobj, char PTR funcname)
DIM AS int funcsernum;
funcsernum = scriba_LookupFunctionByName(sbobj, funcname);
RETURN_FUNCTION(scriba_Call(sbobj, funcsernum));
END_FUNCTION
besFUNCTION(SB_CallSubArgs)
DIM AS VARIABLE Argument;
DIM AS SbData ArgData[8];
DIM AS SbData FunctionResult;
DIM AS unsigned long sbobj;
DIM AS char PTR funcname;
DIM AS int i, sbtype, fnsn;
Argument = besARGUMENT(1);
besDEREFERENCE(Argument);
sbobj = LONGVALUE(Argument);
Argument = besARGUMENT(2);
besDEREFERENCE(Argument);
funcname = STRINGVALUE(Argument);
DEF_FOR (i = 3 TO i <= besARGNR STEP INCR i)
BEGIN_FOR
Argument = besARGUMENT(i);
besDEREFERENCE(Argument);
SELECT_CASE (sbtype = TYPE(Argument))
BEGIN_SELECT
CASE VTYPE_LONG:
ArgData[i-3] = PTR scriba_NewSbLong(sbobj, LONGVALUE(Argument));
END_CASE
CASE VTYPE_DOUBLE:
ArgData[i-3] = PTR scriba_NewSbDouble(sbobj, DOUBLEVALUE(Argument));
END_CASE
CASE VTYPE_STRING:
ArgData[i-3] = PTR scriba_NewSbString(sbobj, STRINGVALUE(Argument));
END_CASE
CASE_ELSE
ArgData[i-3] = PTR scriba_NewSbUndef(sbobj);
END_CASE
END_SELECT
NEXT
fnsn = scriba_LookupFunctionByName(sbobj, funcname);
scriba_CallArgEx(sbobj, fnsn, AT FunctionResult, besARGNR - 2, AT ArgData);
SELECT_CASE (FunctionResult.type)
BEGIN_SELECT
CASE SBT_LONG:
besRETURN_LONG(FunctionResult.v.l);
END_CASE
CASE SBT_DOUBLE:
besRETURN_DOUBLE(FunctionResult.v.d);
END_CASE
CASE SBT_STRING:
besRETURN_STRING(FunctionResult.v.s);
END_CASE
CASE SBT_UNDEF:
besRETURNVALUE = NULL;
END_CASE
END_SELECT
besEND