From e2ad3e13fb1163f53304bbdbab4c44f12c16731d Mon Sep 17 00:00:00 2001 From: Aaron Marks Date: Tue, 19 Apr 2005 09:30:43 +0000 Subject: Added basic object definition for reviewal. Added basic scripting interface & Squirrel (squirrel.sf.net). --- src/script-sq.cpp | 103 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 src/script-sq.cpp (limited to 'src/script-sq.cpp') diff --git a/src/script-sq.cpp b/src/script-sq.cpp new file mode 100644 index 00000000..fc02616e --- /dev/null +++ b/src/script-sq.cpp @@ -0,0 +1,103 @@ +#include "script-sq.h" +#include + +/* + * printfunc - Print function for Squirrel + */ +void printfunc(HSQUIRRELVM v, const SQChar *s, ...) +{ + va_list arglist; + va_start(arglist, s); + vprintf(s, arglist); + va_end(arglist); +} + +/* + * functionCall - Call function with arguments + * fn - name of function + * args - string with argument types. + * 's' = String + * 'i' = Integer + * 'f' = Float + */ +void functionCall(HSQUIRRELVM v, char *fn, char *args, ...) +{ + int argCount = 0; + va_list arglist; + va_start(arglist, args); + + int top = sq_gettop(v); //save stack + sq_pushroottable(v); //pushes global table + sq_pushstring(v, _SC(fn), -1); + if (SQ_SUCCEEDED(sq_get(v, -2))) + { + sq_pushroottable(v); //push 'this' + + if (args != NULL) + { + for (int i = 0; i < strlen(args); i++) + { + switch (args[i]) + { + case 'S': + case 's': + //string + argCount++; + sq_pushstring(v, va_arg(arglist, char*), -1); + break; + case 'I': + case 'i': + //integer + argCount++; + sq_pushinteger(v, va_arg(arglist, int)); + break; + case 'F': + case 'f': + //float + argCount++; + sq_pushfloat(v, va_arg(arglist, float)); + break; + } + } + } + + sq_call(v, argCount + 1, 0); + } + sq_settop(v, top); + + va_end(arglist); +} + +ScriptSquirrel::~ScriptSquirrel() +{ + sq_pop(vm, 1); + sq_close(vm); +} + +void ScriptSquirrel::init() +{ + vm = sq_open(2048); + sqstd_seterrorhandlers(vm); + sq_setprintfunc(vm, printfunc); + + sq_pushroottable(vm); + sqstd_dofile(vm, _SC("test.nut"), 0, 1); + if (SQ_SUCCEEDED(sqstd_dofile(vm, _SC("test.nut"), 0, 1))) + functionCall(vm, "init", NULL); +} + +void ScriptSquirrel::destroy() +{ + functionCall(vm, "destroy", NULL); +} + +void ScriptSquirrel::update() +{ + functionCall(vm, "update", NULL); +} + +void ScriptSquirrel::message(char *msg) +{ + functionCall(vm, "message", "s", msg); +} + -- cgit v1.2.3-70-g09d2