libs/sqplus/minimalSqPlus/minimalSqPlus.cpp
2017-01-10 07:08:49 +03:00

169 lines
4.7 KiB
C++
Executable File

// 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