169 lines
4.7 KiB
C++
169 lines
4.7 KiB
C++
|
// minimalSqPlus.cpp
|
||
|
// A minimal example and an example with a simple class.
|
||
|
// Example for use with the remote debugger is also shown.
|
||
|
// Created 10/08/05, John Schultz
|
||
|
// Free for any use.
|
||
|
|
||
|
#include <stdio.h>
|
||
|
#include <stdarg.h>
|
||
|
#include "sqplus.h"
|
||
|
|
||
|
using namespace SqPlus;
|
||
|
|
||
|
// Define MINIMAL_EXAMPLE for minimal HelloWorld example.
|
||
|
//#define MINIMAL_EXAMPLE
|
||
|
|
||
|
// Define USE_REMOTE_DEBUGGER to use the remote debugger. See the example and docs in the sqdbg directory for
|
||
|
// more information.
|
||
|
//#define USE_REMOTE_DEBUGGER // Remote debugger must be started after the program is launched.
|
||
|
#ifdef USE_REMOTE_DEBUGGER
|
||
|
#include "sqrdbg.h"
|
||
|
#endif
|
||
|
|
||
|
// The following pragmas can be used to link the correct library for Debug/Release builds
|
||
|
// without requiring the application to include the associated Squirrel projects.
|
||
|
// (The libraries must be created before compiling this example).
|
||
|
// Set SQ_REL_PATH as needed for your application.
|
||
|
|
||
|
#define SQ_REL_PATH "../"
|
||
|
|
||
|
#ifdef UNICODE
|
||
|
#define LIB "U.lib"
|
||
|
#else
|
||
|
#define LIB ".lib"
|
||
|
#endif
|
||
|
|
||
|
#ifdef _MSC_VER
|
||
|
#ifdef _DEBUG
|
||
|
#pragma comment(lib,SQ_REL_PATH "lib/squirrelD" LIB)
|
||
|
#pragma comment(lib,SQ_REL_PATH "lib/sqstdlibD" LIB)
|
||
|
#ifdef USE_REMOTE_DEBUGGER
|
||
|
#pragma comment(lib,SQ_REL_PATH "lib/sqdbglibD" LIB)
|
||
|
#endif
|
||
|
#pragma comment(lib,SQ_REL_PATH "lib/sqplusD" LIB)
|
||
|
#else // Release
|
||
|
#pragma comment(lib,SQ_REL_PATH "lib/squirrel" LIB)
|
||
|
#pragma comment(lib,SQ_REL_PATH "lib/sqstdlib" LIB)
|
||
|
#ifdef USE_REMOTE_DEBUGGER
|
||
|
#pragma comment(lib,SQ_REL_PATH "lib/sqdbglib" LIB)
|
||
|
#endif
|
||
|
#pragma comment(lib,SQ_REL_PATH "lib/sqplus" LIB)
|
||
|
#endif
|
||
|
#endif
|
||
|
|
||
|
#ifdef USE_REMOTE_DEBUGGER
|
||
|
void printSQDBGError(HSQUIRRELVM v) {
|
||
|
const SQChar *err;
|
||
|
sq_getlasterror(v);
|
||
|
if(SQ_SUCCEEDED(sq_getstring(v,-1,&err))) {
|
||
|
scprintf(_T("SQDBG error : %s"),err);
|
||
|
}else {
|
||
|
scprintf(_T("SQDBG error"),err);
|
||
|
} // if
|
||
|
sq_poptop(v);
|
||
|
} // printSQDBGError
|
||
|
#endif
|
||
|
|
||
|
static void printFunc(HSQUIRRELVM v,const SQChar * s,...) {
|
||
|
static SQChar temp[2048];
|
||
|
va_list vl;
|
||
|
va_start(vl,s);
|
||
|
scvsprintf( temp,s,vl);
|
||
|
SCPUTS(temp);
|
||
|
va_end(vl);
|
||
|
} // printFunc
|
||
|
|
||
|
class MyClass {
|
||
|
public:
|
||
|
int classVal;
|
||
|
// See examples in testSqPlus2.cpp for passing arguments to the constructor (including variable arguments).
|
||
|
MyClass() : classVal(123) {}
|
||
|
bool process(int iVal,const SQChar * sVal) {
|
||
|
scprintf(_T("classVal: %d, iVal: %d, sVal %s\n"),classVal,iVal,sVal);
|
||
|
classVal += iVal;
|
||
|
return iVal > 1;
|
||
|
} // process
|
||
|
};
|
||
|
|
||
|
#ifdef MINIMAL_EXAMPLE
|
||
|
|
||
|
int main(int argc,char * argv[]) {
|
||
|
SquirrelVM::Init();
|
||
|
SquirrelObject helloWorld = SquirrelVM::CompileBuffer(_T("print(\"Hello World\");"));
|
||
|
SquirrelVM::RunScript(helloWorld);
|
||
|
SquirrelVM::Shutdown();
|
||
|
scprintf(_T("Press RETURN to exit."));
|
||
|
getchar();
|
||
|
} // main
|
||
|
|
||
|
#else
|
||
|
|
||
|
int main(int argc,char * argv[]) {
|
||
|
SquirrelVM::Init();
|
||
|
// This example shows how to redirect print output to your own custom
|
||
|
// print function (the default handler prints to stdout).
|
||
|
sq_setprintfunc(SquirrelVM::GetVMPtr(),printFunc);
|
||
|
|
||
|
#ifdef USE_REMOTE_DEBUGGER
|
||
|
HSQREMOTEDBG rdbg = sq_rdbg_init(SquirrelVM::GetVMPtr(),1234,SQTrue);
|
||
|
if(rdbg) {
|
||
|
// Enable debug info generation (for the compiler).
|
||
|
sq_enabledebuginfo(SquirrelVM::GetVMPtr(),SQTrue);
|
||
|
scprintf(_T("Waiting for SQDBG connection..."));
|
||
|
// Suspends the app until the debugger client connects.
|
||
|
if(SQ_SUCCEEDED(sq_rdbg_waitforconnections(rdbg))) {
|
||
|
printf("SQDBG: connected.\n");
|
||
|
} // if
|
||
|
} else {
|
||
|
printSQDBGError(SquirrelVM::GetVMPtr());
|
||
|
return 0;
|
||
|
} // if
|
||
|
#endif
|
||
|
|
||
|
// See examples in testSqPlus2.cpp for script read-only vars, constants,
|
||
|
// enums, static/global functions, variable arguments, constructor arguments,
|
||
|
// passing/returning classes/structs by value or by address, etc.
|
||
|
SQClassDef<MyClass>(_T("MyClass")).
|
||
|
func(&MyClass::process,_T("process")).
|
||
|
var(&MyClass::classVal,_T("classVal"));
|
||
|
|
||
|
SquirrelObject helloSqPlus = SquirrelVM::CompileBuffer(_T("\
|
||
|
local myClass = MyClass(); \n\
|
||
|
local rVal = myClass.process(1,\"MyClass1\"); \n\
|
||
|
print(\"Returned: \"+(rVal ? \"true\" : \"false\")); \n\
|
||
|
rVal = myClass.process(2,\"MyClass2\"); \n\
|
||
|
print(\"Returned: \"+(rVal ? \"true\" : \"false\")); \n\
|
||
|
print(\"classVal: \"+myClass.classVal); \n\
|
||
|
"));
|
||
|
|
||
|
try {
|
||
|
SquirrelVM::RunScript(helloSqPlus);
|
||
|
} catch (SquirrelError & e) {
|
||
|
scprintf(_T("Error: %s, %s\n"),e.desc,_T("Squirrel::helloSqPlus"));
|
||
|
} // catch
|
||
|
|
||
|
#ifdef USE_REMOTE_DEBUGGER
|
||
|
if (rdbg) {
|
||
|
sq_rdbg_shutdown(rdbg);
|
||
|
} // if
|
||
|
#endif
|
||
|
|
||
|
SquirrelVM::Shutdown();
|
||
|
|
||
|
scprintf(_T("Press RETURN to exit."));
|
||
|
getchar();
|
||
|
|
||
|
return 0;
|
||
|
|
||
|
} // main
|
||
|
|
||
|
#endif
|
||
|
|
||
|
#ifdef SQPLUS_SMARTPOINTER_OPT
|
||
|
unsigned char* getSmartPointerPointee(unsigned char *up) {
|
||
|
return up;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
// minimalSqPlus.cpp
|