136
Nim / Re: Nim SB
« on: December 13, 2019, 07:49:45 AM »
I still have a few functions that need to be broken apart or reworked,
SB_CallSubArgs
SB_GetVar
SB_SetDbl
SB_SetStr
sbobj.c
SB_CallSubArgs
SB_GetVar
SB_SetDbl
SB_SetStr
sbobj.c
Code: C
- // 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;
- pRSP->pTProgram = pProgram;
- if( pProgram == NULL )return;
- scriba_SetFileName(pProgram,szInputFile);
- if (pRSP->pszConfigFileName != NULL){
- scriba_LoadConfiguration(pProgram, pRSP->pszConfigFileName);
- }else{
- scriba_SetProcessSbObject(pProgram,pProgram);
- }
- scriba_LoadSourceProgram(pProgram);
- if (pRSP->pszCmdLineArgs != NULL){
- 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");
- 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;
- IF (pszCmdLineArgs NE NULL) THEN
- ELSE
- pRSP->pszCmdLineArgs = NULL;
- END_IF
- IF (pszConfigFileName NE NULL) THEN
- 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 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
- besFUNCTION(SB_GetVar)
- DIM AS pSbData varobj;
- DIM AS unsigned long sbobj;
- DIM AS int vsn;
- DIM AS char PTR varname;
- besARGUMENTS("iz")
- AT sbobj, AT varname
- besARGEND
- vsn = scriba_LookupVariableByName(sbobj, varname);
- scriba_GetVariable(sbobj, vsn, AT varobj);
- SELECT_CASE (scriba_GetVariableType(sbobj, vsn))
- BEGIN_SELECT
- CASE SBT_LONG :
- besRETURN_LONG(varobj[0].v.l);
- END_CASE
- CASE SBT_DOUBLE :
- besRETURN_DOUBLE(varobj[0].v.d);
- END_CASE
- CASE SBT_STRING :
- besRETURN_STRING(varobj[0].v.s);
- END_CASE
- CASE SBT_UNDEF :
- besRETURNVALUE = NULL;
- END_CASE
- END_SELECT
- besEND
- 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()
- BEGIN_FUNCTION
- DIM AS VARIABLE Argument;
- DIM AS pSbData varobj;
- DIM AS unsigned long sbobj;
- DIM AS int vsn, usrval, i;
- DIM AS char PTR varname;
- IF (besARGNR < 3) THEN_DO RETURN_FUNCTION(EX_ERROR_TOO_FEW_ARGUMENTS);
- DEF_FOR (i = 1 TO i <= 3 STEP INCR i)
- BEGIN_FOR
- Argument = besARGUMENT(i);
- besDEREFERENCE(Argument);
- IF (i EQ 1) THEN_DO sbobj = LONGVALUE(Argument);
- IF (i EQ 2) THEN_DO varname = STRINGVALUE(Argument);
- IF (i EQ 3) THEN_DO usrval = LONGVALUE(Argument);
- NEXT
- vsn = scriba_LookupVariableByName(sbobj, varname);
- besRETURN_LONG(scriba_SetVariable(sbobj, vsn, SBT_LONG, usrval, 0, "", 0));
- besEND
- besFUNCTION(SB_SetDbl)
- DIM AS VARIABLE Argument;
- DIM AS pSbData varobj;
- DIM AS unsigned long sbobj;
- DIM AS int vsn, i;
- DIM AS char PTR varname;
- DIM AS double usrval;
- IF (besARGNR < 3) THEN_DO RETURN_FUNCTION(EX_ERROR_TOO_FEW_ARGUMENTS);
- DEF_FOR (i = 1 TO i <= 3 STEP INCR i)
- BEGIN_FOR
- Argument = besARGUMENT(i);
- besDEREFERENCE(Argument);
- IF (i EQ 1) THEN_DO sbobj = LONGVALUE(Argument);
- IF (i EQ 2) THEN_DO varname = STRINGVALUE(Argument);
- IF (i EQ 3) THEN_DO usrval = DOUBLEVALUE(Argument);
- NEXT
- vsn = scriba_LookupVariableByName(sbobj, varname);
- besRETURN_LONG(scriba_SetVariable(sbobj, vsn, SBT_DOUBLE, 0, usrval, "", 0));
- besEND
- besFUNCTION(SB_SetStr)
- DIM AS VARIABLE Argument;
- DIM AS pSbData varobj;
- DIM AS unsigned long sbobj;
- DIM AS int vsn, i;
- DIM AS char PTR varname;
- DIM AS char PTR usrval;
- IF (besARGNR < 3) THEN_DO RETURN_FUNCTION(EX_ERROR_TOO_FEW_ARGUMENTS);
- DEF_FOR (i = 1 TO i <= 3 STEP INCR i)
- BEGIN_FOR
- Argument = besARGUMENT(i);
- besDEREFERENCE(Argument);
- IF (i EQ 1) THEN_DO sbobj = LONGVALUE(Argument);
- IF (i EQ 2) THEN_DO varname = STRINGVALUE(Argument);
- IF (i EQ 3) THEN_DO usrval = STRINGVALUE(Argument);
- NEXT
- vsn = scriba_LookupVariableByName(sbobj, varname);
- besEND
- SUB SB_ResetVars(unsigned long sbobj)
- BEGIN_SUB
- scriba_ResetVariables(sbobj);
- END_SUB
- SUB SB_msSleep(long t)
- BEGIN_SUB
- usleep(t);
- END_SUB