Extension Modules > MY-BASIC

MY-BASIC Extension Module

(1/1)

Support:
Here is an example of the new MY-BASIC extension module for Script BASIC. Attached is the Windows 32 bit and Linux (Ubuntu) 64 bit shared objects. (dll/so)

interface.c

--- Code: C ---// MY-BASIC - Script BASIC extension module #include <stdio.h>#include <stdlib.h>#include <string.h>#include <stdarg.h>#include <ctype.h>#include <math.h>#include <time.h>#include "../../basext.h"#include "cbasic.h" #include "my_basic.h"  /**************************** Extension Module Functions****************************/ besVERSION_NEGOTIATE  RETURN_FUNCTION((int)INTERFACE_VERSION);besEND besSUB_START  DIM AS long PTR p;  besMODULEPOINTER = besALLOC(sizeof(long));  IF (besMODULEPOINTER EQ NULL) THEN_DO RETURN_FUNCTION(0);  p = (long PTR)besMODULEPOINTER;  RETURN_FUNCTION(0);besEND besSUB_FINISH  DIM AS long PTR p;  p = (long PTR)besMODULEPOINTER;  IF (p EQ NULL) THEN_DO RETURN_FUNCTION(0);  RETURN_FUNCTION(0);besEND  /******************** MY-BASIC Functions********************/ static struct mb_interpreter_t* bas = 0; static int watch(struct mb_interpreter_t* s, void** l) {  int result = MB_FUNC_OK;  int_t arg = 0;  mb_assert(s && l);  mb_check(mb_attempt_open_bracket(s, l));  mb_check(mb_pop_int(s, l, &arg)); // That's it!  mb_check(mb_attempt_close_bracket(s, l));  // arg is what you want.  return result;} besFUNCTION(mbas_init)  besRETURN_LONG(mb_init());besEND besFUNCTION(mbas_dispose)  besRETURN_LONG(mb_dispose());besEND besFUNCTION(mbas_open)  besRETURN_LONG(mb_open(AT bas));besEND besFUNCTION(mbas_close)  besRETURN_LONG(mb_close(AT bas));besEND besFUNCTION(mbas_load_str)  DIM AS const char PTR pgm;  besARGUMENTS("z")    AT pgm  besARGEND  besRETURN_LONG(mb_load_string(bas, pgm));besEND besFUNCTION(mbas_load_file)  DIM AS const char PTR pgm;  besARGUMENTS("z")    AT pgm  besARGEND  besRETURN_LONG(mb_load_file(bas, pgm));besEND besFUNCTION(mbas_run)  besRETURN_LONG(mb_run(bas));besEND besFUNCTION(mbas_reset)  besRETURN_LONG(mb_reset(bas, false));besEND besFUNCTION(mbas_getint)  DIM AS mb_value_t mbval;  DIM AS const char PTR varname;  besARGUMENTS("z")    AT varname  besARGEND  mbval.type = MB_DT_INT;  mb_debug_get(bas, varname, &mbval);  besRETURN_LONG(mbval.value.integer);besEND besFUNCTION(mbas_getdbl)  DIM AS mb_value_t mbval;  DIM AS const char PTR varname;  besARGUMENTS("z")    AT varname  besARGEND  mbval.type = MB_DT_REAL;  mb_debug_get(bas, varname, &mbval);  besRETURN_DOUBLE(mbval.value.float_point);besEND besFUNCTION(mbas_getstr)  DIM AS mb_value_t mbval;  DIM AS const char PTR varname;  besARGUMENTS("z")    AT varname  besARGEND  mbval.type = MB_DT_STRING;  mb_debug_get(bas, varname, &mbval);  besRETURN_STRING(mbval.value.string);besEND besFUNCTION(mbas_setint)  DIM AS VARIABLE Argument;  DIM AS mb_value_t mbval;  DIM AS int usrval, i, rtnval;  DIM AS const char PTR varname;  IF (besARGNR < 2) THEN_DO RETURN_FUNCTION(EX_ERROR_TOO_FEW_ARGUMENTS);  DEF_FOR (i = 1 TO i <= 2 STEP INCR i)  BEGIN_FOR    Argument = besARGUMENT(i);    besDEREFERENCE(Argument);    IF (i EQ 1) THEN_DO varname = STRINGVALUE(Argument);    IF (i EQ 2) THEN_DO usrval = LONGVALUE(Argument);  NEXT  mbval.type = MB_DT_INT;  mbval.value.integer = usrval;  rtnval = mb_debug_set(bas, varname, mbval);  besRETURN_LONG(rtnval);besEND besFUNCTION(mbas_setdbl)  DIM AS VARIABLE Argument;  DIM AS mb_value_t mbval;  DIM AS int i, rtnval;  DIM AS double usrval;  DIM AS const char PTR varname;  IF (besARGNR < 2) THEN_DO RETURN_FUNCTION(EX_ERROR_TOO_FEW_ARGUMENTS);  DEF_FOR (i = 1 TO i <= 2 STEP INCR i)  BEGIN_FOR    Argument = besARGUMENT(i);    besDEREFERENCE(Argument);    IF (i EQ 1) THEN_DO varname = STRINGVALUE(Argument);    IF (i EQ 2) THEN_DO usrval = DOUBLEVALUE(Argument);  NEXT  mbval.type = MB_DT_REAL;  mbval.value.float_point = usrval;  rtnval = mb_debug_set(bas, varname, mbval);  besRETURN_LONG(rtnval);besEND besFUNCTION(mbas_setstr)  DIM AS VARIABLE Argument;  DIM AS mb_value_t mbval;  DIM AS int i, rtnval;  DIM AS const char PTR varname;  DIM AS const char PTR usrval;  IF (besARGNR < 2) THEN_DO RETURN_FUNCTION(EX_ERROR_TOO_FEW_ARGUMENTS);  DEF_FOR (i = 1 TO i <= 2 STEP INCR i)  BEGIN_FOR    Argument = besARGUMENT(i);    besDEREFERENCE(Argument);    IF (i EQ 1) THEN_DO varname = STRINGVALUE(Argument);    IF (i EQ 2) THEN_DO usrval = STRINGVALUE(Argument);  NEXT  mbval.type = MB_DT_STRING;  usrval = mb_memdup(usrval, strlen(usrval) + 1);  mbval.value.string = usrval;  besRETURN_LONG(mb_debug_set(bas, varname, mbval));besEND 
mbvars.sb

--- Code: Script BASIC ---DECLARE SUB mb_init ALIAS "mbas_init" LIB "mb"DECLARE SUB mb_dispose ALIAS "mbas_dispose" LIB "mb"DECLARE SUB mb_open ALIAS "mbas_open" LIB "mb"DECLARE SUB mb_close ALIAS "mbas_close" LIB "mb"DECLARE SUB mb_load_str ALIAS "mbas_load_str" LIB "mb"DECLARE SUB mb_load_file ALIAS "mbas_load_file" LIB "mb"DECLARE SUB mb_run ALIAS "mbas_run" LIB "mb"DECLARE SUB mb_getint ALIAS "mbas_getint" LIB "mb"DECLARE SUB mb_getdbl ALIAS "mbas_getdbl" LIB "mb"DECLARE SUB mb_getstr ALIAS "mbas_getstr" LIB "mb"DECLARE SUB mb_setint ALIAS "mbas_setint" LIB "mb"DECLARE SUB mb_setdbl ALIAS "mbas_setdbl" LIB "mb"DECLARE SUB mb_setstr ALIAS "mbas_setstr" LIB "mb"DECLARE SUB mb_reset ALIAS "mbas_reset" LIB "mb" mb_initmb_openmb_load_file "setvars.bas"mb_runmb_setint "A", 123mb_setdbl "B", 1.23mb_setstr "C$", "One,Two,Three"PRINT mb_getint("A"),"\n"PRINT FORMAT("%g\n", mb_getdbl("B"))PRINT mb_getstr("C$"),"\n"mb_closemb_dispose 
setvars.bas

--- Code: ---a = 0
b = 0.0
c$ = ""

--- End code ---

Output - Linux 64 bit

jrs@laptop:~/sb/sb22/mybasic$ time scriba mbvars.sb
123
1.23
One,Two,Three

real   0m0.006s
user   0m0.005s
sys   0m0.005s
jrs@laptop:~/sb/sb22/mybasic$


Output - Windows 32 bit

C:\sb22\mybasic>scriba mbvars.sb
123
1.23
One,Two,Three

C:\sb22\mybasic>

Navigation

[0] Message Index

Go to full version