1
0

Squirrel Plugins

I worked a little bit on the squirrel Bindings
They work now on linux and windows :) (OSX is untested, but should work also) but they are very limited at the moment. (Only made OnChat working)
I also fixed some small bugs.


git-svn-id: http://mc-server.googlecode.com/svn/trunk@648 0a769ca7-a7f5-676a-18bf-c427514a06d6
This commit is contained in:
lapayo94@gmail.com 2012-07-08 21:01:08 +00:00
parent 358e74ded8
commit 083228a10d
74 changed files with 14262 additions and 7256 deletions

View File

@ -52,7 +52,10 @@ INCLUDE = -I.\
-IiniFile\
-Itolua++-1.0.93/include\
-Ijsoncpp-src-0.5.0/include\
-Ijsoncpp-src-0.5.0/src/lib_json
-Ijsoncpp-src-0.5.0/src/lib_json\
-Isquirrel_3_0_1_stable/include\
-Isquirrel_3_0_1_stable\
-Isquirrel_3_0_1_stable/sqrat
#
# Build MCServer

View File

@ -1,26 +1,20 @@
class SquirrelChatLog extends cPlugin__Squirrel
class SquirrelChatLog extends Plugin
{
constructor()
{
base.constructor();
}
name = "SquirrelChatLogger";
function Initialize()
{
::print("SquirrelChatLog initialize()");
this.SetName("SquirrelChatLog");
local PluginManager = cRoot.Get().GetPluginManager();
PluginManager.AddHook( this, PluginManager.E_PLUGIN_CHAT );
this.AddHook(Hook.Chat);
return true;
}
function OnChat( Message, Player )
{
::print("CHAT");
::print(Player.GetName() + ": " + Message);
}
}
Plugin <- SquirrelChatLog();
cRoot.Get().GetPluginManager().AddPlugin( Plugin );

View File

@ -99,7 +99,7 @@
<ClCompile>
<AdditionalOptions>/ZI /D_DEBUG %(AdditionalOptions)</AdditionalOptions>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\tolua++-1.0.93\include;..\lua-5.1.4\src;..\zlib-1.2.7;..\mysql-connector\include;..\source\;..\pdcurs34\;..\jsoncpp-src-0.5.0\include;..\squirrel_3_0_1_stable\include;..\squirrel_3_0_1_stable;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>..\tolua++-1.0.93\include;..\lua-5.1.4\src;..\zlib-1.2.7;..\mysql-connector\include;..\source\;..\pdcurs34\;..\jsoncpp-src-0.5.0\include;..\squirrel_3_0_1_stable\include;..\squirrel_3_0_1_stable;..\squirrel_3_0_1_stable\sqrat;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>true</MinimalRebuild>
<ExceptionHandling>Sync</ExceptionHandling>
@ -130,7 +130,7 @@
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug with optimized Noise|Win32'">
<ClCompile>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>..\tolua++-1.0.93\include;..\lua-5.1.4\src;..\zlib-1.2.7;..\mysql-connector\include;..\source\;..\pdcurs34\;..\jsoncpp-src-0.5.0\include;..\squirrel_3_0_1_stable\include;..\squirrel_3_0_1_stable;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>..\tolua++-1.0.93\include;..\lua-5.1.4\src;..\zlib-1.2.7;..\mysql-connector\include;..\source\;..\pdcurs34\;..\jsoncpp-src-0.5.0\include;..\squirrel_3_0_1_stable\include;..\squirrel_3_0_1_stable;..\squirrel_3_0_1_stable\sqrat;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>true</MinimalRebuild>
<ExceptionHandling>Sync</ExceptionHandling>
@ -228,7 +228,7 @@
<InlineFunctionExpansion>Default</InlineFunctionExpansion>
<IntrinsicFunctions>true</IntrinsicFunctions>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
<AdditionalIncludeDirectories>..\tolua++-1.0.93\include;..\lua-5.1.4\src;..\zlib-1.2.7;..\mysql-connector\include;..\source\;..\pdcurs34\;..\jsoncpp-src-0.5.0\include;..\squirrel_3_0_1_stable\include;..\squirrel_3_0_1_stable;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>..\tolua++-1.0.93\include;..\lua-5.1.4\src;..\zlib-1.2.7;..\mysql-connector\include;..\source\;..\pdcurs34\;..\jsoncpp-src-0.5.0\include;..\squirrel_3_0_1_stable\include;..\squirrel_3_0_1_stable;..\squirrel_3_0_1_stable\sqrat;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<BasicRuntimeChecks>Default</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<BufferSecurityCheck>false</BufferSecurityCheck>
@ -306,6 +306,7 @@
<ClCompile Include="..\source\BlockID.cpp" />
<ClCompile Include="..\source\cAggressiveMonster.cpp" />
<ClCompile Include="..\Source\cAuthenticator.cpp" />
<ClCompile Include="..\source\cBlockArea.cpp" />
<ClCompile Include="..\source\cBlockingTCPLink.cpp" />
<ClCompile Include="..\source\cCavespider.cpp" />
<ClCompile Include="..\Source\cChicken.cpp" />
@ -356,6 +357,7 @@
<ClCompile Include="..\source\cPiston.cpp" />
<ClCompile Include="..\Source\cPluginManager.cpp" />
<ClCompile Include="..\source\cPlugin_NewLua.cpp" />
<ClCompile Include="..\source\cPlugin_Squirrel.cpp" />
<ClCompile Include="..\source\CraftingRecipes.cpp" />
<ClCompile Include="..\source\cRedstone.cpp" />
<ClCompile Include="..\source\cRedstoneSimulator.cpp" />
@ -472,7 +474,8 @@
<ClCompile Include="..\source\packets\cPacket_WindowClick.cpp" />
<ClCompile Include="..\source\packets\cPacket_WindowClose.cpp" />
<ClCompile Include="..\source\packets\cPacket_WindowOpen.cpp" />
<ClCompile Include="..\source\SquirrelBindings.cpp" />
<ClCompile Include="..\source\squirrelbindings\SquirrelBindings.cpp" />
<ClCompile Include="..\source\squirrelbindings\SquirrelFunctions.cpp" />
<ClCompile Include="..\source\StackWalker.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug with optimized Noise|Win32'">NotUsing</PrecompiledHeader>
@ -495,6 +498,7 @@
<ClInclude Include="..\Source\BlockID.h" />
<ClInclude Include="..\source\cAggressiveMonster.h" />
<ClInclude Include="..\Source\cAuthenticator.h" />
<ClInclude Include="..\source\cBlockArea.h" />
<ClInclude Include="..\source\cBlockingTCPLink.h" />
<ClInclude Include="..\source\cCavespider.h" />
<ClInclude Include="..\Source\cChicken.h" />
@ -522,6 +526,7 @@
<ClInclude Include="..\source\ChunkSender.h" />
<ClInclude Include="..\source\cIsThread.h" />
<ClInclude Include="..\Source\cLadder.h" />
<ClInclude Include="..\source\cPlugin_Squirrel.h" />
<ClInclude Include="..\Source\cVine.h" />
<ClInclude Include="..\source\cLavaSimulator.h" />
<ClInclude Include="..\Source\cLuaCommandBinder.h" />
@ -660,7 +665,10 @@
<ClInclude Include="..\source\packets\cPacket_WindowClick.h" />
<ClInclude Include="..\source\packets\cPacket_WindowClose.h" />
<ClInclude Include="..\source\packets\cPacket_WindowOpen.h" />
<ClInclude Include="..\source\SquirrelBindings.h" />
<ClInclude Include="..\source\squirrelbindings\cSquirrelBaseClass.h" />
<ClInclude Include="..\source\squirrelbindings\SquirrelBindings.h" />
<ClInclude Include="..\source\squirrelbindings\SquirrelFunctions.h" />
<ClInclude Include="..\source\squirrelbindings\SquirrelObject.h" />
<ClInclude Include="..\source\StackWalker.h" />
<ClInclude Include="..\source\StringCompression.h" />
<ClInclude Include="..\source\StringUtils.h" />

View File

@ -427,12 +427,15 @@
<Filter Include="Simulator\cSimulator\cRedstoneSimulator">
<UniqueIdentifier>{4b3b7b43-8e8b-4823-b112-2259fdfff7d3}</UniqueIdentifier>
</Filter>
<Filter Include="Generating">
<UniqueIdentifier>{833e49bd-848d-42de-ac60-6cd7656474e3}</UniqueIdentifier>
</Filter>
<Filter Include="Storage">
<UniqueIdentifier>{038cf4bd-108e-44e2-bdcb-9d48fb26676e}</UniqueIdentifier>
</Filter>
<Filter Include="cPlugin\cPlugin_Squirrel">
<UniqueIdentifier>{43f91962-ebda-4195-aadc-921eca3c8356}</UniqueIdentifier>
</Filter>
<Filter Include="HandyStuff\Generating">
<UniqueIdentifier>{833e49bd-848d-42de-ac60-6cd7656474e3}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\source\cServer.cpp">
@ -799,9 +802,6 @@
<ClCompile Include="..\source\cLavaSimulator.cpp">
<Filter>Simulator\cSimulator\cFluidSimulator\cLavaSimulator</Filter>
</ClCompile>
<ClCompile Include="..\source\SquirrelBindings.cpp">
<Filter>LuaBindings\SquirrelBindings</Filter>
</ClCompile>
<ClCompile Include="..\source\packets\cPacket_Explosion.cpp">
<Filter>Packets\cPacket_Explosion</Filter>
</ClCompile>
@ -870,26 +870,26 @@
<Filter>Packets</Filter>
</ClCompile>
<ClCompile Include="..\source\cChunkGenerator.cpp">
<Filter>Generating</Filter>
<Filter>HandyStuff\Generating</Filter>
</ClCompile>
<ClCompile Include="..\source\Trees.cpp">
<Filter>Generating</Filter>
<Filter>HandyStuff\Generating</Filter>
</ClCompile>
<ClCompile Include="..\source\CompoGen.cpp">
<Filter>Generating</Filter>
<Filter>HandyStuff\Generating</Filter>
</ClCompile>
<ClCompile Include="..\source\HeiGen.cpp">
<Filter>Generating</Filter>
<Filter>HandyStuff\Generating</Filter>
</ClCompile>
<ClCompile Include="..\source\StructGen.cpp">
<Filter>Generating</Filter>
<Filter>HandyStuff\Generating</Filter>
</ClCompile>
<ClCompile Include="..\source\BioGen.cpp">
<Filter>Generating</Filter>
<Filter>HandyStuff\Generating</Filter>
</ClCompile>
<ClCompile Include="..\source\BlockID.cpp" />
<ClCompile Include="..\source\FinishGen.cpp">
<Filter>Generating</Filter>
<Filter>HandyStuff\Generating</Filter>
</ClCompile>
<ClCompile Include="..\source\WorldStorage.cpp">
<Filter>Storage</Filter>
@ -904,6 +904,16 @@
<Filter>Storage</Filter>
</ClCompile>
<ClCompile Include="..\source\CraftingRecipes.cpp" />
<ClCompile Include="..\source\cBlockArea.cpp" />
<ClCompile Include="..\source\squirrelbindings\SquirrelBindings.cpp">
<Filter>LuaBindings\SquirrelBindings</Filter>
</ClCompile>
<ClCompile Include="..\source\cPlugin_Squirrel.cpp">
<Filter>cPlugin\cPlugin_Squirrel</Filter>
</ClCompile>
<ClCompile Include="..\source\squirrelbindings\SquirrelFunctions.cpp">
<Filter>LuaBindings\SquirrelBindings</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\source\cServer.h">
@ -1308,9 +1318,6 @@
<ClInclude Include="..\source\cLavaSimulator.h">
<Filter>Simulator\cSimulator\cFluidSimulator\cLavaSimulator</Filter>
</ClInclude>
<ClInclude Include="..\source\SquirrelBindings.h">
<Filter>LuaBindings\SquirrelBindings</Filter>
</ClInclude>
<ClInclude Include="..\source\packets\cPacket_Explosion.h">
<Filter>Packets\cPacket_Explosion</Filter>
</ClInclude>
@ -1380,25 +1387,25 @@
<Filter>Packets</Filter>
</ClInclude>
<ClInclude Include="..\source\cChunkGenerator.h">
<Filter>Generating</Filter>
<Filter>HandyStuff\Generating</Filter>
</ClInclude>
<ClInclude Include="..\source\StructGen.h">
<Filter>Generating</Filter>
<Filter>HandyStuff\Generating</Filter>
</ClInclude>
<ClInclude Include="..\source\Trees.h">
<Filter>Generating</Filter>
<Filter>HandyStuff\Generating</Filter>
</ClInclude>
<ClInclude Include="..\source\CompoGen.h">
<Filter>Generating</Filter>
<Filter>HandyStuff\Generating</Filter>
</ClInclude>
<ClInclude Include="..\source\HeiGen.h">
<Filter>Generating</Filter>
<Filter>HandyStuff\Generating</Filter>
</ClInclude>
<ClInclude Include="..\source\BioGen.h">
<Filter>Generating</Filter>
<Filter>HandyStuff\Generating</Filter>
</ClInclude>
<ClInclude Include="..\source\FinishGen.h">
<Filter>Generating</Filter>
<Filter>HandyStuff\Generating</Filter>
</ClInclude>
<ClInclude Include="..\source\WorldStorage.h">
<Filter>Storage</Filter>
@ -1414,6 +1421,22 @@
</ClInclude>
<ClInclude Include="..\source\cStep.h" />
<ClInclude Include="..\source\CraftingRecipes.h" />
<ClInclude Include="..\source\cBlockArea.h" />
<ClInclude Include="..\source\squirrelbindings\SquirrelBindings.h">
<Filter>LuaBindings\SquirrelBindings</Filter>
</ClInclude>
<ClInclude Include="..\source\cPlugin_Squirrel.h">
<Filter>cPlugin\cPlugin_Squirrel</Filter>
</ClInclude>
<ClInclude Include="..\source\squirrelbindings\SquirrelFunctions.h">
<Filter>LuaBindings\SquirrelBindings</Filter>
</ClInclude>
<ClInclude Include="..\source\squirrelbindings\SquirrelObject.h">
<Filter>LuaBindings\SquirrelBindings</Filter>
</ClInclude>
<ClInclude Include="..\source\squirrelbindings\cSquirrelBaseClass.h">
<Filter>LuaBindings\SquirrelBindings</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<None Include="..\source\AllToLua.pkg">

View File

@ -72,13 +72,6 @@
</Lib>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="..\squirrel_3_0_1_stable\sqplus\SqPlus.cpp" />
<ClCompile Include="..\squirrel_3_0_1_stable\sqplus\SqPlusOCharBuf.cpp" />
<ClCompile Include="..\squirrel_3_0_1_stable\sqplus\SqPlusUtf8.cpp" />
<ClCompile Include="..\squirrel_3_0_1_stable\sqplus\SquirrelBindingsUtils.cpp" />
<ClCompile Include="..\squirrel_3_0_1_stable\sqplus\SquirrelBindingsUtilsWin32.cpp" />
<ClCompile Include="..\squirrel_3_0_1_stable\sqplus\SquirrelObject.cpp" />
<ClCompile Include="..\squirrel_3_0_1_stable\sqplus\SquirrelVM.cpp" />
<ClCompile Include="..\squirrel_3_0_1_stable\sqstdlib\sqstdaux.cpp" />
<ClCompile Include="..\squirrel_3_0_1_stable\sqstdlib\sqstdblob.cpp" />
<ClCompile Include="..\squirrel_3_0_1_stable\sqstdlib\sqstdio.cpp" />
@ -101,21 +94,6 @@
<ClCompile Include="..\squirrel_3_0_1_stable\squirrel\sqvm.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\squirrel_3_0_1_stable\sqplus\sqplus.h" />
<ClInclude Include="..\squirrel_3_0_1_stable\sqplus\SqPlusCallTemplates.h" />
<ClInclude Include="..\squirrel_3_0_1_stable\sqplus\SqPlusConst.h" />
<ClInclude Include="..\squirrel_3_0_1_stable\sqplus\SqPlusFunctionCallImpl.h" />
<ClInclude Include="..\squirrel_3_0_1_stable\sqplus\SqPlusOCharBuf.h" />
<ClInclude Include="..\squirrel_3_0_1_stable\sqplus\SqPlusOverload.h" />
<ClInclude Include="..\squirrel_3_0_1_stable\sqplus\SqPlusSetup.h" />
<ClInclude Include="..\squirrel_3_0_1_stable\sqplus\SqPlusSmartPointer.h" />
<ClInclude Include="..\squirrel_3_0_1_stable\sqplus\SqPlusTypeMask.h" />
<ClInclude Include="..\squirrel_3_0_1_stable\sqplus\SqPlusUtf8.h" />
<ClInclude Include="..\squirrel_3_0_1_stable\sqplus\sqplusWin32.h" />
<ClInclude Include="..\squirrel_3_0_1_stable\sqplus\SquirrelBindingsUtils.h" />
<ClInclude Include="..\squirrel_3_0_1_stable\sqplus\SquirrelBindingsUtilsWin32.h" />
<ClInclude Include="..\squirrel_3_0_1_stable\sqplus\SquirrelObject.h" />
<ClInclude Include="..\squirrel_3_0_1_stable\sqplus\SquirrelVM.h" />
<ClInclude Include="..\squirrel_3_0_1_stable\sqstdlib\sqstdblobimpl.h" />
<ClInclude Include="..\squirrel_3_0_1_stable\sqstdlib\sqstdstream.h" />
<ClInclude Include="..\squirrel_3_0_1_stable\squirrel\sqarray.h" />

View File

@ -7,9 +7,6 @@
<Filter Include="sqstdlib">
<UniqueIdentifier>{819d39f8-4859-48ad-b096-04f8d6811524}</UniqueIdentifier>
</Filter>
<Filter Include="sqplus">
<UniqueIdentifier>{d9a1c0d8-bd70-4686-9a3d-c35c9d3365e3}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\squirrel_3_0_1_stable\squirrel\sqapi.cpp">
@ -72,27 +69,6 @@
<ClCompile Include="..\squirrel_3_0_1_stable\sqstdlib\sqstdsystem.cpp">
<Filter>sqstdlib</Filter>
</ClCompile>
<ClCompile Include="..\squirrel_3_0_1_stable\sqplus\SqPlus.cpp">
<Filter>sqplus</Filter>
</ClCompile>
<ClCompile Include="..\squirrel_3_0_1_stable\sqplus\SqPlusOCharBuf.cpp">
<Filter>sqplus</Filter>
</ClCompile>
<ClCompile Include="..\squirrel_3_0_1_stable\sqplus\SqPlusUtf8.cpp">
<Filter>sqplus</Filter>
</ClCompile>
<ClCompile Include="..\squirrel_3_0_1_stable\sqplus\SquirrelBindingsUtils.cpp">
<Filter>sqplus</Filter>
</ClCompile>
<ClCompile Include="..\squirrel_3_0_1_stable\sqplus\SquirrelBindingsUtilsWin32.cpp">
<Filter>sqplus</Filter>
</ClCompile>
<ClCompile Include="..\squirrel_3_0_1_stable\sqplus\SquirrelObject.cpp">
<Filter>sqplus</Filter>
</ClCompile>
<ClCompile Include="..\squirrel_3_0_1_stable\sqplus\SquirrelVM.cpp">
<Filter>sqplus</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\squirrel_3_0_1_stable\squirrel\sqarray.h">
@ -149,50 +125,5 @@
<ClInclude Include="..\squirrel_3_0_1_stable\sqstdlib\sqstdstream.h">
<Filter>sqstdlib</Filter>
</ClInclude>
<ClInclude Include="..\squirrel_3_0_1_stable\sqplus\sqplus.h">
<Filter>sqplus</Filter>
</ClInclude>
<ClInclude Include="..\squirrel_3_0_1_stable\sqplus\SqPlusCallTemplates.h">
<Filter>sqplus</Filter>
</ClInclude>
<ClInclude Include="..\squirrel_3_0_1_stable\sqplus\SqPlusConst.h">
<Filter>sqplus</Filter>
</ClInclude>
<ClInclude Include="..\squirrel_3_0_1_stable\sqplus\SqPlusFunctionCallImpl.h">
<Filter>sqplus</Filter>
</ClInclude>
<ClInclude Include="..\squirrel_3_0_1_stable\sqplus\SqPlusOCharBuf.h">
<Filter>sqplus</Filter>
</ClInclude>
<ClInclude Include="..\squirrel_3_0_1_stable\sqplus\SqPlusOverload.h">
<Filter>sqplus</Filter>
</ClInclude>
<ClInclude Include="..\squirrel_3_0_1_stable\sqplus\SqPlusSetup.h">
<Filter>sqplus</Filter>
</ClInclude>
<ClInclude Include="..\squirrel_3_0_1_stable\sqplus\SqPlusSmartPointer.h">
<Filter>sqplus</Filter>
</ClInclude>
<ClInclude Include="..\squirrel_3_0_1_stable\sqplus\SqPlusTypeMask.h">
<Filter>sqplus</Filter>
</ClInclude>
<ClInclude Include="..\squirrel_3_0_1_stable\sqplus\SqPlusUtf8.h">
<Filter>sqplus</Filter>
</ClInclude>
<ClInclude Include="..\squirrel_3_0_1_stable\sqplus\sqplusWin32.h">
<Filter>sqplus</Filter>
</ClInclude>
<ClInclude Include="..\squirrel_3_0_1_stable\sqplus\SquirrelBindingsUtils.h">
<Filter>sqplus</Filter>
</ClInclude>
<ClInclude Include="..\squirrel_3_0_1_stable\sqplus\SquirrelBindingsUtilsWin32.h">
<Filter>sqplus</Filter>
</ClInclude>
<ClInclude Include="..\squirrel_3_0_1_stable\sqplus\SquirrelObject.h">
<Filter>sqplus</Filter>
</ClInclude>
<ClInclude Include="..\squirrel_3_0_1_stable\sqplus\SquirrelVM.h">
<Filter>sqplus</Filter>
</ClInclude>
</ItemGroup>
</Project>

View File

@ -25,7 +25,10 @@ INCLUDE = -I.\
-IiniFile\
-Itolua++-1.0.93/include\
-Ijsoncpp-src-0.5.0/include\
-Ijsoncpp-src-0.5.0/src/lib_json
-Ijsoncpp-src-0.5.0/src/lib_json\
-Isquirrel_3_0_1_stable/include\
-Isquirrel_3_0_1_stable\
-Isquirrel_3_0_1_stable/sqrat
#
@ -66,6 +69,7 @@ MCServer : \
build/cReferenceManager.o\
build/Bindings.o\
build/BlockID.o\
build/cBlockArea.o\
build/cBlockToPickup.o\
build/cChatColor.o\
build/cChestEntity.o\
@ -253,7 +257,32 @@ MCServer : \
build/WSSAnvil.o\
build/FastNBT.o\
build/StringCompression.o\
build/StringCompression.o\
build/sqstdaux.o\
build/sqstdblob.o\
build/sqstdio.o\
build/sqstdmath.o\
build/sqstdrex.o\
build/sqstdstream.o\
build/sqstdstring.o\
build/sqstdsystem.o\
build/sqapi.o\
build/sqbaselib.o\
build/sqclass.o\
build/sqcompiler.o\
build/sqdebug.o\
build/sqfuncstate.o\
build/sqlexer.o\
build/sqmem.o\
build/sqobject.o\
build/sqstate.o\
build/sqtable.o\
build/sqvm.o\
build/squirrelbindings/SquirrelBindings.o\
build/squirrelbindings/SquirrelFunctions.o\
build/cPlugin_Squirrel.o\
build/CraftingRecipes.o
$(CC) $(LNK_OPTIONS) \
build/json_reader.o\
build/json_value.o\
@ -288,6 +317,7 @@ MCServer : \
build/cReferenceManager.o\
build/Bindings.o\
build/BlockID.o\
build/cBlockArea.o\
build/cBlockToPickup.o\
build/cChatColor.o\
build/cChestEntity.o\
@ -476,6 +506,29 @@ MCServer : \
build/FastNBT.o\
build/StringCompression.o\
build/CraftingRecipes.o\
build/sqstdaux.o\
build/sqstdblob.o\
build/sqstdio.o\
build/sqstdmath.o\
build/sqstdrex.o\
build/sqstdstream.o\
build/sqstdstring.o\
build/sqstdsystem.o\
build/sqapi.o\
build/sqbaselib.o\
build/sqclass.o\
build/sqcompiler.o\
build/sqdebug.o\
build/sqfuncstate.o\
build/sqlexer.o\
build/sqmem.o\
build/sqobject.o\
build/sqstate.o\
build/sqtable.o\
build/sqvm.o\
build/squirrelbindings/SquirrelBindings.o\
build/squirrelbindings/SquirrelFunctions.o\
build/cPlugin_Squirrel.o\
-o MCServer
clean :
@ -696,6 +749,29 @@ clean :
build/cIsThread.o\
build/cSocketThreads.o\
build/CraftingRecipes.o\
build/sqstdaux.o\
build/sqstdblob.o\
build/sqstdio.o\
build/sqstdmath.o\
build/sqstdrex.o\
build/sqstdstream.o\
build/sqstdstring.o\
build/sqstdsystem.o\
build/sqapi.o\
build/sqbaselib.o\
build/sqclass.o\
build/sqcompiler.o\
build/sqdebug.o\
build/sqfuncstate.o\
build/sqlexer.o\
build/sqmem.o\
build/sqobject.o\
build/sqstate.o\
build/sqtable.o\
build/sqvm.o\
build/squirrelbindings/SquirrelBindings.o\
build/squirrelbindings/SquirrelFunctions.o\
build/cPlugin_Squirrel.o\
MCServer
install : MCServer
@ -734,6 +810,9 @@ build/Bindings.o : source/Bindings.cpp
build/BlockID.o : source/BlockID.cpp
$(CC) $(CC_OPTIONS) source/BlockID.cpp -c $(INCLUDE) -o build/BlockID.o
build/cBlockArea.o : source/cBlockArea.cpp
$(CC) $(CC_OPTIONS) source/cBlockArea.cpp -c $(INCLUDE) -o build/cBlockArea.o
# Item # 6 -- cBlockToPickup --
build/cBlockToPickup.o : source/cBlockToPickup.cpp
@ -1602,7 +1681,58 @@ build/cRedstoneSimulator.o : source/cRedstoneSimulator.cpp
build/CraftingRecipes.o : source/CraftingRecipes.cpp
$(CC) $(CC_OPTIONS) source/CraftingRecipes.cpp -c $(INCLUDE) -o build/CraftingRecipes.o
build/squirrelbindings/SquirrelBindings.o : source/squirrelbindings/SquirrelBindings.cpp
$(CC) $(CC_OPTIONS) source/squirrelbindings/SquirrelBindings.cpp -c $(INCLUDE) -o build/squirrelbindings/SquirrelBindings.o
build/squirrelbindings/SquirrelFunctions.o : source/squirrelbindings/SquirrelFunctions.cpp
$(CC) $(CC_OPTIONS) source/squirrelbindings/SquirrelFunctions.cpp -c $(INCLUDE) -o build/squirrelbindings/SquirrelFunctions.o
build/cPlugin_Squirrel.o : source/cPlugin_Squirrel.cpp
$(CC) $(CC_OPTIONS) source/cPlugin_Squirrel.cpp -c $(INCLUDE) -o build/cPlugin_Squirrel.o
build/sqstdaux.o : squirrel_3_0_1_stable/sqstdlib/sqstdaux.cpp
$(CC) $(CC_OPTIONS) squirrel_3_0_1_stable/sqstdlib/sqstdaux.cpp -c $(INCLUDE) -o build/sqstdaux.o
build/sqstdblob.o : squirrel_3_0_1_stable/sqstdlib/sqstdblob.cpp
$(CC) $(CC_OPTIONS) squirrel_3_0_1_stable/sqstdlib/sqstdblob.cpp -c $(INCLUDE) -o build/sqstdblob.o
build/sqstdio.o : squirrel_3_0_1_stable/sqstdlib/sqstdio.cpp
$(CC) $(CC_OPTIONS) squirrel_3_0_1_stable/sqstdlib/sqstdio.cpp -c $(INCLUDE) -o build/sqstdio.o
build/sqstdmath.o : squirrel_3_0_1_stable/sqstdlib/sqstdmath.cpp
$(CC) $(CC_OPTIONS) squirrel_3_0_1_stable/sqstdlib/sqstdmath.cpp -c $(INCLUDE) -o build/sqstdmath.o
build/sqstdrex.o : squirrel_3_0_1_stable/sqstdlib/sqstdrex.cpp
$(CC) $(CC_OPTIONS) squirrel_3_0_1_stable/sqstdlib/sqstdrex.cpp -c $(INCLUDE) -o build/sqstdrex.o
build/sqstdstream.o : squirrel_3_0_1_stable/sqstdlib/sqstdstream.cpp
$(CC) $(CC_OPTIONS) squirrel_3_0_1_stable/sqstdlib/sqstdstream.cpp -c $(INCLUDE) -o build/sqstdstream.o
build/sqstdstring.o : squirrel_3_0_1_stable/sqstdlib/sqstdstring.cpp
$(CC) $(CC_OPTIONS) squirrel_3_0_1_stable/sqstdlib/sqstdstring.cpp -c $(INCLUDE) -o build/sqstdstring.o
build/sqstdsystem.o : squirrel_3_0_1_stable/sqstdlib/sqstdsystem.cpp
$(CC) $(CC_OPTIONS) squirrel_3_0_1_stable/sqstdlib/sqstdsystem.cpp -c $(INCLUDE) -o build/sqstdsystem.o
build/sqapi.o : squirrel_3_0_1_stable/squirrel/sqapi.cpp
$(CC) $(CC_OPTIONS) squirrel_3_0_1_stable/squirrel/sqapi.cpp -c $(INCLUDE) -o build/sqapi.o
build/sqbaselib.o : squirrel_3_0_1_stable/squirrel/sqbaselib.cpp
$(CC) $(CC_OPTIONS) squirrel_3_0_1_stable/squirrel/sqbaselib.cpp -c $(INCLUDE) -o build/sqbaselib.o
build/sqclass.o : squirrel_3_0_1_stable/squirrel/sqclass.cpp
$(CC) $(CC_OPTIONS) squirrel_3_0_1_stable/squirrel/sqclass.cpp -c $(INCLUDE) -o build/sqclass.o
build/sqcompiler.o : squirrel_3_0_1_stable/squirrel/sqcompiler.cpp
$(CC) $(CC_OPTIONS) squirrel_3_0_1_stable/squirrel/sqcompiler.cpp -c $(INCLUDE) -o build/sqcompiler.o
build/sqdebug.o : squirrel_3_0_1_stable/squirrel/sqdebug.cpp
$(CC) $(CC_OPTIONS) squirrel_3_0_1_stable/squirrel/sqdebug.cpp -c $(INCLUDE) -o build/sqdebug.o
build/sqfuncstate.o : squirrel_3_0_1_stable/squirrel/sqfuncstate.cpp
$(CC) $(CC_OPTIONS) squirrel_3_0_1_stable/squirrel/sqfuncstate.cpp -c $(INCLUDE) -o build/sqfuncstate.o
build/sqlexer.o : squirrel_3_0_1_stable/squirrel/sqlexer.cpp
$(CC) $(CC_OPTIONS) squirrel_3_0_1_stable/squirrel/sqlexer.cpp -c $(INCLUDE) -o build/sqlexer.o
build/sqmem.o : squirrel_3_0_1_stable/squirrel/sqmem.cpp
$(CC) $(CC_OPTIONS) squirrel_3_0_1_stable/squirrel/sqmem.cpp -c $(INCLUDE) -o build/sqmem.o
build/sqobject.o : squirrel_3_0_1_stable/squirrel/sqobject.cpp
$(CC) $(CC_OPTIONS) squirrel_3_0_1_stable/squirrel/sqobject.cpp -c $(INCLUDE) -o build/sqobject.o
build/sqstate.o : squirrel_3_0_1_stable/squirrel/sqstate.cpp
$(CC) $(CC_OPTIONS) squirrel_3_0_1_stable/squirrel/sqstate.cpp -c $(INCLUDE) -o build/sqstate.o
build/sqtable.o : squirrel_3_0_1_stable/squirrel/sqtable.cpp
$(CC) $(CC_OPTIONS) squirrel_3_0_1_stable/squirrel/sqtable.cpp -c $(INCLUDE) -o build/sqtable.o
build/sqvm.o : squirrel_3_0_1_stable/squirrel/sqvm.cpp
$(CC) $(CC_OPTIONS) squirrel_3_0_1_stable/squirrel/sqvm.cpp -c $(INCLUDE) -o build/sqvm.o
# Template: copy and delete the "# "; insert filenames
# build/.o : source/.cpp
# $(CC) $(CC_OPTIONS) source/.cpp -c $(INCLUDE) -o build/.o

View File

@ -45,7 +45,7 @@ $cfile "cCuboid.h"
$cfile "cMCLogger.h"
$cfile "cTracer.h"
$cfile "cGroup.h"
$cfile "BlockArea.h"
$cfile "cBlockArea.h"
$cfile "packets/cPacket_Login.h"
$cfile "packets/cPacket_BlockDig.h"
$cfile "packets/cPacket_BlockPlace.h"

View File

@ -1,6 +1,6 @@
/*
** Lua binding: AllToLua
** Generated automatically by tolua++-1.0.92 on 07/02/12 18:39:13.
** Generated automatically by tolua++-1.0.92 on 07/08/12 16:56:12.
*/
#ifndef __cplusplus
@ -54,7 +54,7 @@ TOLUA_API int tolua_AllToLua_open (lua_State* tolua_S);
#include "cMCLogger.h"
#include "cTracer.h"
#include "cGroup.h"
#include "BlockArea.h"
#include "cBlockArea.h"
#include "packets/cPacket_Login.h"
#include "packets/cPacket_BlockDig.h"
#include "packets/cPacket_BlockPlace.h"

View File

@ -1,6 +1,6 @@
/*
** Lua binding: AllToLua
** Generated automatically by tolua++-1.0.92 on 07/02/12 18:39:13.
** Generated automatically by tolua++-1.0.92 on 07/08/12 16:56:13.
*/
/* Exported function */

View File

@ -3,8 +3,8 @@
#include "SquirrelBindings.h"
#if USE_SQUIRREL
#pragma warning(disable:4100) // Getting A LOT of these warnings from SqPlus
#pragma warning(disable:4127)
//#pragma warning(disable:4100) // Getting A LOT of these warnings from SqPlus
//#pragma warning(disable:4127)
#include <sqplus/sqplus.h>
#include <sqplus/SquirrelObject.h>

View File

@ -1,6 +1,6 @@
#pragma once
#define USE_SQUIRREL 0
#define USE_SQUIRREL 1
#if USE_SQUIRREL

View File

@ -5,7 +5,7 @@
// The object also supports writing the blockdata back into cWorld, even into other coords
#include "Globals.h"
#include "BlockArea.h"
#include "cBlockArea.h"
#include "cWorld.h"

View File

@ -27,7 +27,7 @@
#include "cBlockToPickup.h"
#include "MersenneTwister.h"
#include "cPlayer.h"
#include "BlockArea.h"
#include "cBlockArea.h"
#include "cPluginManager.h"
#include "packets/cPacket_DestroyEntity.h"

View File

@ -5,6 +5,7 @@
#include "cPlugin.h"
#include "cPlugin_Lua.h"
#include "cPlugin_NewLua.h"
#include "cPlugin_Squirrel.h"
#include "cWebAdmin.h"
#include "cItem.h"
#include "cRoot.h"
@ -12,10 +13,12 @@
#include "../iniFile/iniFile.h"
#include "tolua++.h"
#include "SquirrelBindings.h"
#include "squirrelbindings/SquirrelBindings.h"
#include "squirrelbindings/SquirrelFunctions.h"
#if USE_SQUIRREL
#pragma warning(disable:4100;disable:4127;disable:4510;disable:4610;disable:4244;disable:4512) // Getting A LOT of these warnings from SqPlus
#include <sqplus/sqplus.h>
#pragma warning(default:4100;default:4127;default:4510;default:4610;default:4244;default:4512)
#endif
@ -70,11 +73,8 @@ void cPluginManager::ReloadPluginsNow()
UnloadPluginsNow();
#if USE_SQUIRREL
if( !SquirrelBindings::IsBound ) // Can only do this once apparently, or we're making ambiguous calls in the script
{
SquirrelVM::Init();
SquirrelBindings::Bind( SquirrelVM::GetVMPtr() );
}
CloseSquirrelVM();
OpenSquirrelVM();
#endif // USE_SQUIRREL
cIniFile IniFile("settings.ini");
@ -129,26 +129,11 @@ void cPluginManager::ReloadPluginsNow()
if( !PluginFile.empty() )
{
LOGINFO("Loading Squirrel plugin: %s", PluginFile.c_str() );
try
{
SquirrelObject SquirrelScript = SquirrelVM::CompileScript( (AString("Plugins/") + PluginFile + ".nut").c_str() );
try
{
SquirrelVM::RunScript( SquirrelScript );
}
catch (SquirrelError & e)
{
LOGERROR("SquirrelScript error: %s, %s\n", e.desc, "SquirrelVM::RunScript");
}
}
catch (SquirrelError & e)
{
LOGERROR("SquirrelScript error: %s, %s\n", e.desc, "SquirrelVM::CompileScript");
}
this->AddPlugin(new cPlugin_Squirrel(PluginFile.c_str()));
}
}
#endif // USE_SQUIRREL
}
}
@ -221,6 +206,7 @@ bool cPluginManager::CallHook(PluginHook a_Hook, unsigned int a_NumArgs, ...)
return true;
}
}
return false;
}

352
source/cPlugin_Squirrel.cpp Normal file
View File

@ -0,0 +1,352 @@
#include "Globals.h"
#include "cPlugin_Squirrel.h"
#include "squirrelbindings/SquirrelFunctions.h"
#include "squirrelbindings/SquirrelBindings.h"
#include "squirrelbindings/cSquirrelBaseClass.h"
cPlugin_Squirrel::cPlugin_Squirrel( const char* a_PluginName )
{
SetLanguage( cPlugin::E_SQUIRREL );
m_PluginName = a_PluginName;
}
cPlugin_Squirrel::~cPlugin_Squirrel()
{
delete m_PluginName;
delete m_Plugin;
}
bool cPlugin_Squirrel::Initialize()
{
cCSLock Lock(m_CriticalSection);
std::string PluginPath = std::string("Plugins/") + m_PluginName + ".nut";
Sqrat::Script script;
script.CompileFile(PluginPath);
if(script.IsNull())
{
LOGERROR("Unable to run script \"%s\"", m_PluginName);
}
try {
script.Run();
Sqrat::Function construct(Sqrat::RootTable(), m_PluginName);
if(construct.IsNull())
{
LOGERROR("Constructor for Plugin \"%s\" not found.", m_PluginName);
return false;
}
Sqrat::Object obj = construct.Evaluate<Sqrat::Object>();
((cSquirrelBaseClass *) obj.GetInstanceUP())->setInstance(this);
m_Plugin = new SquirrelObject(obj);
Sqrat::Object PluginName = obj.GetSlot("name");
if(!PluginName.IsNull())
{
this->SetName(PluginName.Cast<const char*>());
}
Sqrat::Function init = m_Plugin->GetFunction("Initialize");
if(init.IsNull())
{
LOGERROR("Can not initialize plugin \"%s\"", m_PluginName);
return false;
}
return init.Evaluate<bool>();
} catch(Sqrat::Exception &e)
{
LOGERROR("Initialisation of \"%s\" failed: %s", m_PluginName, e.Message().c_str());
return false;
}
}
void cPlugin_Squirrel::OnDisable()
{
cCSLock Lock(m_CriticalSection);
m_Plugin->GetFunction("OnDisable").Execute();
}
void cPlugin_Squirrel::Tick(float a_Dt)
{
cCSLock Lock( m_CriticalSection );
m_Plugin->GetFunction("OnTick").Execute(a_Dt);
}
bool cPlugin_Squirrel::OnCollectItem( cPickup* a_Pickup, cPlayer* a_Player )
{
cCSLock Lock( m_CriticalSection );
return m_Plugin->GetFunction("OnCollectItem").Evaluate<bool>(a_Pickup, a_Player);
}
bool cPlugin_Squirrel::OnDisconnect(const AString & a_Reason, cPlayer* a_Player )
{
cCSLock Lock( m_CriticalSection );
return m_Plugin->GetFunction("OnDisconnect").Evaluate<bool>(a_Reason, a_Player);
}
bool cPlugin_Squirrel::OnBlockPlace( cPacket_BlockPlace* a_PacketData, cPlayer* a_Player )
{
cCSLock Lock( m_CriticalSection );
return m_Plugin->GetFunction("OnBlockPlace").Evaluate<bool>(a_PacketData, a_Player);
}
bool cPlugin_Squirrel::OnBlockDig( cPacket_BlockDig* a_PacketData, cPlayer* a_Player, cItem* a_PickupItem )
{
cCSLock Lock( m_CriticalSection );
return m_Plugin->GetFunction("OnBlockDig").Evaluate<bool>(a_PacketData, a_Player, a_PickupItem);
}
bool cPlugin_Squirrel::OnChat( const char* a_Chat, cPlayer* a_Player )
{
cCSLock Lock( m_CriticalSection );
return m_Plugin->GetFunction("OnChat").Evaluate<bool>(a_Chat, a_Player);
}
bool cPlugin_Squirrel::OnLogin( cPacket_Login* a_PacketData )
{
cCSLock Lock( m_CriticalSection );
return m_Plugin->GetFunction("OnLogin").Evaluate<bool>(a_PacketData);
}
void cPlugin_Squirrel::OnPlayerSpawn( cPlayer* a_Player )
{
cCSLock Lock( m_CriticalSection );
return m_Plugin->GetFunction("OnPlayerSpawn").Execute(a_Player);
}
bool cPlugin_Squirrel::OnPlayerJoin( cPlayer* a_Player )
{
cCSLock Lock( m_CriticalSection );
return m_Plugin->GetFunction("OnPlayerJoin").Evaluate<bool>(a_Player);
}
void cPlugin_Squirrel::OnPlayerMove( cPlayer* a_Player )
{
cCSLock Lock( m_CriticalSection );
return m_Plugin->GetFunction("OnPlayerMove").Execute(a_Player);
}
void cPlugin_Squirrel::OnTakeDamage( cPawn* a_Pawn, TakeDamageInfo* a_TakeDamageInfo )
{
cCSLock Lock( m_CriticalSection );
return m_Plugin->GetFunction("OnTakeDamage")(a_Pawn, a_TakeDamageInfo);
}
bool cPlugin_Squirrel::OnKilled( cPawn* a_Killed, cEntity* a_Killer )
{
cCSLock Lock( m_CriticalSection );
return m_Plugin->GetFunction("OnKilled").Evaluate<bool>(a_Killed, a_Killer);
}
void cPlugin_Squirrel::OnChunkGenerated(cWorld * a_World, int a_ChunkX, int a_ChunkZ)
{
cCSLock Lock(m_CriticalSection);
return m_Plugin->GetFunction("OnChunkGenerated")(a_World, a_ChunkX, a_ChunkZ);
}
bool cPlugin_Squirrel::OnChunkGenerating(cWorld * a_World, int a_ChunkX, int a_ChunkZ, cLuaChunk * a_pLuaChunk)
{
cCSLock Lock(m_CriticalSection);
return m_Plugin->GetFunction("OnChunkGenerating").Evaluate<bool>(a_World, a_ChunkX, a_ChunkZ, a_pLuaChunk);
}
bool cPlugin_Squirrel::OnPreCrafting(const cPlayer * a_Player, const cCraftingGrid * a_Grid, cCraftingRecipe * a_Recipe)
{
cCSLock Lock(m_CriticalSection);
return m_Plugin->GetFunction("OnPreCrafting").Evaluate<bool>((cPlayer *) a_Player, (cCraftingGrid *) a_Grid, a_Recipe);
}
bool cPlugin_Squirrel::OnCraftingNoRecipe(const cPlayer * a_Player, const cCraftingGrid * a_Grid, cCraftingRecipe * a_Recipe)
{
cCSLock Lock(m_CriticalSection);
return m_Plugin->GetFunction("OnCraftingNoRecipe").Evaluate<bool>((cPlayer *) a_Player, (cCraftingGrid *) a_Grid, a_Recipe);
}
bool cPlugin_Squirrel::OnPostCrafting(const cPlayer * a_Player, const cCraftingGrid * a_Grid, cCraftingRecipe * a_Recipe)
{
cCSLock Lock(m_CriticalSection);
return m_Plugin->GetFunction("OnPostCrafting").Evaluate<bool>((cPlayer *) a_Player, (cCraftingGrid *) a_Grid, a_Recipe);
}
bool cPlugin_Squirrel::OnBlockToPickup(
BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta,
const cPlayer * a_Player, const cItem & a_EquippedItem, cItems & a_Pickups
)
{
cCSLock Lock(m_CriticalSection);
return m_Plugin->GetFunction("OnBlockToPickup").Evaluate<bool>(a_BlockType, a_BlockMeta, (cPlayer *) a_Player, a_EquippedItem, a_Pickups);
}
bool cPlugin_Squirrel::OnWeatherChanged(cWorld * a_World)
{
cCSLock Lock(m_CriticalSection);
return m_Plugin->GetFunction("OnWeatherChanged").Evaluate<bool>(a_World);
}
bool cPlugin_Squirrel::OnUpdatingSign(
cWorld * a_World,
int a_BlockX, int a_BlockY, int a_BlockZ,
AString & a_Line1, AString & a_Line2, AString & a_Line3, AString & a_Line4
)
{
cCSLock Lock(m_CriticalSection);
return m_Plugin->GetFunction("OnUpdatingSign")
.Evaluate<bool>(
a_World,
a_BlockX,
a_BlockY,
a_BlockZ,
a_Line1,
a_Line2,
a_Line3,
a_Line4
);
}
bool cPlugin_Squirrel::OnUpdatedSign(
cWorld * a_World,
int a_BlockX, int a_BlockY, int a_BlockZ,
const AString & a_Line1, const AString & a_Line2, const AString & a_Line3, const AString & a_Line4
)
{
return m_Plugin->GetFunction("OnUpdatedSign")
.Evaluate<bool>(
a_World,
a_BlockX,
a_BlockY,
a_BlockZ,
a_Line1,
a_Line2,
a_Line3,
a_Line4
);
}

42
source/cPlugin_Squirrel.h Normal file
View File

@ -0,0 +1,42 @@
#pragma once
#include "cPlugin.h"
#include <sqrat.h>
#include "squirrelbindings/SquirrelObject.h"
class cPlugin_Squirrel : public cPlugin
{
public:
cPlugin_Squirrel(const char* a_PluginName);
~cPlugin_Squirrel();
void OnDisable();
bool Initialize();
void Tick(float a_Dt);
bool OnCollectItem (cPickup* a_Pickup, cPlayer* a_Player ) override;
bool OnDisconnect (const AString & a_Reason, cPlayer * a_Player ) override;
bool OnBlockPlace (cPacket_BlockPlace* a_PacketData, cPlayer* a_Player ) override;
bool OnBlockDig (cPacket_BlockDig* a_PacketData, cPlayer* a_Player, cItem* a_PickupItem ) override;
bool OnChat (const char* a_Chat, cPlayer* a_Player ) override;
bool OnLogin (cPacket_Login* a_PacketData ) override;
void OnPlayerSpawn (cPlayer* a_Player ) override;
bool OnPlayerJoin (cPlayer* a_Player ) override;
void OnPlayerMove (cPlayer* a_Player ) override;
void OnTakeDamage (cPawn* a_Pawn, TakeDamageInfo* a_TakeDamageInfo ) override;
bool OnKilled (cPawn* a_Killed, cEntity* a_Killer ) override;
void OnChunkGenerated (cWorld * a_World, int a_ChunkX, int a_ChunkZ) override;
bool OnChunkGenerating (cWorld * a_World, int a_ChunkX, int a_ChunkZ, cLuaChunk * a_pLuaChunk ) override;
bool OnPreCrafting (const cPlayer * a_Player, const cCraftingGrid * a_Grid, cCraftingRecipe * a_Recipe) override;
bool OnCraftingNoRecipe(const cPlayer * a_Player, const cCraftingGrid * a_Grid, cCraftingRecipe * a_Recipe) override;
bool OnPostCrafting (const cPlayer * a_Player, const cCraftingGrid * a_Grid, cCraftingRecipe * a_Recipe) override;
bool OnBlockToPickup (BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta, const cPlayer * a_Player, const cItem & a_EquippedItem, cItems & a_Pickups);
bool OnWeatherChanged (cWorld * a_World) override;
bool OnUpdatingSign (cWorld * a_World, int a_BlockX, int a_BlockY, int a_BlockZ, AString & a_Line1, AString & a_Line2, AString & a_Line3, AString & a_Line4) override;
bool OnUpdatedSign (cWorld * a_World, int a_BlockX, int a_BlockY, int a_BlockZ, const AString & a_Line1, const AString & a_Line2, const AString & a_Line3, const AString & a_Line4) override;
protected:
const char * m_PluginName;
cCriticalSection m_CriticalSection;
SquirrelObject *m_Plugin;
};

View File

@ -19,6 +19,5 @@ public:
default:
return 0xf;
};
return 0xf;
} //tolua_export
}; //tolua_export

View File

@ -6,16 +6,17 @@
#include <exception> //std::exception
#include <csignal> //std::signal
#include <stdlib.h> //exit()
#include "squirrelbindings/SquirrelFunctions.h"
#ifdef _WIN32
#include <dbghelp.h>
#endif // _WIN32
#include "SquirrelBindings.h"
#include "squirrelbindings/SquirrelBindings.h"
#if USE_SQUIRREL
#pragma warning(push)
#pragma warning(disable:4100;disable:4127;disable:4510;disable:4610;disable:4244;disable:4512) // Getting A LOT of these warnings from SqPlus
#include <sqplus/sqplus.h>
#pragma warning(pop)
#endif
@ -189,7 +190,7 @@ int main( int argc, char **argv )
}
#if USE_SQUIRREL
SquirrelVM::Shutdown();
CloseSquirrelVM();
#endif
#if defined(_MSC_VER) && defined(_DEBUG) && defined(ENABLE_LEAK_FINDER)

View File

@ -0,0 +1,52 @@
#include "Globals.h"
#include "SquirrelBindings.h"
#include "SquirrelFunctions.h"
#include "cSquirrelBaseClass.h"
#include "../cPlayer.h"
using namespace Sqrat;
void BindSquirrel(HSQUIRRELVM vm)
{
RootTable()
.Bind("Plugin", Class<cSquirrelBaseClass>()
.Func("AddHook", &cSquirrelBaseClass::AddHook)
);
RootTable().Bind("cPlayer", Class<cPlayer, NoConstructor>()
.Func("GetName", &cPlayer::GetName)
);
RootTable().Func("print", &sqPrint);
ConstTable().Enum("Hook", Enumeration()
.Const("Tick", cPluginManager::HOOK_TICK)
.Const("Chat", cPluginManager::HOOK_CHAT)
.Const("CollectItem", cPluginManager::HOOK_COLLECT_ITEM)
.Const("BlockDig", cPluginManager::HOOK_BLOCK_DIG)
.Const("BlockPlace", cPluginManager::HOOK_BLOCK_PLACE)
.Const("Disconnect", cPluginManager::HOOK_DISCONNECT)
.Const("Handshake", cPluginManager::HOOK_HANDSHAKE)
.Const("Login", cPluginManager::HOOK_LOGIN)
.Const("PlayerSpawn", cPluginManager::HOOK_PLAYER_SPAWN)
.Const("PlayerJoin", cPluginManager::HOOK_PLAYER_JOIN)
.Const("PlayerMove", cPluginManager::HOOK_PLAYER_MOVE)
.Const("TakeDamage", cPluginManager::HOOK_TAKE_DAMAGE)
.Const("Killed", cPluginManager::HOOK_KILLED)
.Const("ChunkGenerated", cPluginManager::HOOK_CHUNK_GENERATED)
.Const("ChunkGenerating", cPluginManager::HOOK_CHUNK_GENERATING)
.Const("BlockToDrops", cPluginManager::HOOK_BLOCK_TO_DROPS)
.Const("PreCrafting", cPluginManager::HOOK_PRE_CRAFTING)
.Const("CraftingNoRecipe", cPluginManager::HOOK_CRAFTING_NO_RECIPE)
.Const("PostCrafting", cPluginManager::HOOK_POST_CRAFTING)
.Const("BlockToPickup", cPluginManager::HOOK_BLOCK_TO_PICKUP)
.Const("WeatherChanged", cPluginManager::HOOK_WEATHER_CHANGED)
.Const("UpdatingSign", cPluginManager::HOOK_UPDATING_SIGN)
.Const("UpdatedSign", cPluginManager::HOOK_UPDATED_SIGN));
}

View File

@ -0,0 +1,13 @@
#pragma once
#define USE_SQUIRREL 1
#if USE_SQUIRREL
#include <squirrel.h>
#include <sqrat.h>
void BindSquirrel(HSQUIRRELVM vm);
#endif

View File

@ -0,0 +1,65 @@
#include "Globals.h"
#include "SquirrelFunctions.h"
#include "SquirrelBindings.h"
static HSQUIRRELVM squirrelvm = NULL;
SQInteger runtimeErrorHandler(HSQUIRRELVM a_VM)
{
const SQChar *sErr = 0;
if(sq_gettop(a_VM) >= 1)
{
if(SQ_SUCCEEDED(sq_getstring(a_VM, 2, &sErr)))
{
LOGERROR("Squirrel Error: %s", sErr);
}
else
{
LOGERROR("Squirrel Error: Unknown Error");
}
}
return 0;
}
void compilerErrorHandler(HSQUIRRELVM v,
const SQChar* a_Desc,
const SQChar* a_Source,
SQInteger a_Line,
SQInteger a_Column)
{
LOGERROR("Squirrel Error: %s (%d:%d) %s", a_Source, a_Line, a_Column, a_Desc);
}
HSQUIRRELVM OpenSquirrelVM()
{
if(!squirrelvm)
{
squirrelvm = sq_open(1024);
Sqrat::DefaultVM::Set(squirrelvm);
sq_newclosure(squirrelvm, runtimeErrorHandler, 0);
sq_seterrorhandler(squirrelvm);
sq_setcompilererrorhandler(squirrelvm, compilerErrorHandler);
BindSquirrel(squirrelvm);
}
return squirrelvm;
}
void CloseSquirrelVM()
{
if(squirrelvm)
{
sq_close(squirrelvm);
squirrelvm = NULL;
}
}
void sqPrint(SQChar * text)
{
LOGINFO("%s", text);
}

View File

@ -0,0 +1,6 @@
#pragma once
#include <sqrat.h>
HSQUIRRELVM OpenSquirrelVM();
void CloseSquirrelVM();
void sqPrint(SQChar * text);

View File

@ -0,0 +1,24 @@
#pragma once
#include <sqrat.h>
class SquirrelObject
{
public:
SquirrelObject(Sqrat::Object a_Obj)
{
m_SquirrelObject = a_Obj;
}
Sqrat::Function GetFunction(const char *methodName)
{
if(m_SquirrelObject.IsNull())
return Sqrat::Function();
Sqrat::Function method(m_SquirrelObject, methodName);
return method;
}
protected:
Sqrat::Object m_SquirrelObject;
};

View File

@ -0,0 +1,29 @@
#pragma once
#include "SquirrelBindings.h"
#include "../cPlugin_Squirrel.h"
#include "../cPluginManager.h"
#include "cRoot.h"
//The baseclass for squirrel plugins
class cSquirrelBaseClass
{
public:
cSquirrelBaseClass()
: m_Instance(0)
{
}
void setInstance(cPlugin_Squirrel *a_Instance)
{
m_Instance = a_Instance;
}
void AddHook(short a_Hook)
{
if(m_Instance)
cRoot::Get()->GetPluginManager()->AddHook(m_Instance, (cPluginManager::PluginHook) a_Hook);
}
protected:
cPlugin_Squirrel *m_Instance;
};

View File

@ -0,0 +1,199 @@
//
// SqModule: API used to communicate with and register squirrel modules
//
//
// Copyright (c) 2009 Brandon Jones
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
// claim that you wrote the original software. If you use this software
// in a product, an acknowledgment in the product documentation would be
// appreciated but is not required.
//
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
//
// 3. This notice may not be removed or altered from any source
// distribution.
//
#if !defined(_SQ_MODULE_H_)
#define _SQ_MODULE_H_
#include "squirrel.h"
#ifdef __cplusplus
extern "C" {
#endif
/* HSQAPI */
/*
Allows modules to interface with squirrel's C api without linking to the squirrel library
If new functions are added to the Squirrel API, they should be added here too
*/
typedef struct {
/*vm*/
HSQUIRRELVM (*open)(SQInteger initialstacksize);
HSQUIRRELVM (*newthread)(HSQUIRRELVM friendvm, SQInteger initialstacksize);
void (*seterrorhandler)(HSQUIRRELVM v);
void (*close)(HSQUIRRELVM v);
void (*setforeignptr)(HSQUIRRELVM v,SQUserPointer p);
SQUserPointer (*getforeignptr)(HSQUIRRELVM v);
#if SQUIRREL_VERSION_NUMBER >= 300
void (*setprintfunc)(HSQUIRRELVM v, SQPRINTFUNCTION printfunc, SQPRINTFUNCTION);
#else
void (*setprintfunc)(HSQUIRRELVM v, SQPRINTFUNCTION printfunc);
#endif
SQPRINTFUNCTION (*getprintfunc)(HSQUIRRELVM v);
SQRESULT (*suspendvm)(HSQUIRRELVM v);
SQRESULT (*wakeupvm)(HSQUIRRELVM v,SQBool resumedret,SQBool retval,SQBool raiseerror,SQBool throwerror);
SQInteger (*getvmstate)(HSQUIRRELVM v);
/*compiler*/
SQRESULT (*compile)(HSQUIRRELVM v,SQLEXREADFUNC read,SQUserPointer p,const SQChar *sourcename,SQBool raiseerror);
SQRESULT (*compilebuffer)(HSQUIRRELVM v,const SQChar *s,SQInteger size,const SQChar *sourcename,SQBool raiseerror);
void (*enabledebuginfo)(HSQUIRRELVM v, SQBool enable);
void (*notifyallexceptions)(HSQUIRRELVM v, SQBool enable);
void (*setcompilererrorhandler)(HSQUIRRELVM v,SQCOMPILERERROR f);
/*stack operations*/
void (*push)(HSQUIRRELVM v,SQInteger idx);
void (*pop)(HSQUIRRELVM v,SQInteger nelemstopop);
void (*poptop)(HSQUIRRELVM v);
void (*remove)(HSQUIRRELVM v,SQInteger idx);
SQInteger (*gettop)(HSQUIRRELVM v);
void (*settop)(HSQUIRRELVM v,SQInteger newtop);
#if SQUIRREL_VERSION_NUMBER >= 300
SQRESULT (*reservestack)(HSQUIRRELVM v,SQInteger nsize);
#else
void (*reservestack)(HSQUIRRELVM v,SQInteger nsize);
#endif
SQInteger (*cmp)(HSQUIRRELVM v);
void (*move)(HSQUIRRELVM dest,HSQUIRRELVM src,SQInteger idx);
/*object creation handling*/
SQUserPointer (*newuserdata)(HSQUIRRELVM v,SQUnsignedInteger size);
void (*newtable)(HSQUIRRELVM v);
void (*newarray)(HSQUIRRELVM v,SQInteger size);
void (*newclosure)(HSQUIRRELVM v,SQFUNCTION func,SQUnsignedInteger nfreevars);
SQRESULT (*setparamscheck)(HSQUIRRELVM v,SQInteger nparamscheck,const SQChar *typemask);
SQRESULT (*bindenv)(HSQUIRRELVM v,SQInteger idx);
void (*pushstring)(HSQUIRRELVM v,const SQChar *s,SQInteger len);
void (*pushfloat)(HSQUIRRELVM v,SQFloat f);
void (*pushinteger)(HSQUIRRELVM v,SQInteger n);
void (*pushbool)(HSQUIRRELVM v,SQBool b);
void (*pushuserpointer)(HSQUIRRELVM v,SQUserPointer p);
void (*pushnull)(HSQUIRRELVM v);
SQObjectType (*gettype)(HSQUIRRELVM v,SQInteger idx);
SQInteger (*getsize)(HSQUIRRELVM v,SQInteger idx);
SQRESULT (*getbase)(HSQUIRRELVM v,SQInteger idx);
SQBool (*instanceof)(HSQUIRRELVM v);
#if SQUIRREL_VERSION_NUMBER >= 300
SQRESULT (*tostring)(HSQUIRRELVM v,SQInteger idx);
#else
void (*tostring)(HSQUIRRELVM v,SQInteger idx);
#endif
void (*tobool)(HSQUIRRELVM v, SQInteger idx, SQBool *b);
SQRESULT (*getstring)(HSQUIRRELVM v,SQInteger idx,const SQChar **c);
SQRESULT (*getinteger)(HSQUIRRELVM v,SQInteger idx,SQInteger *i);
SQRESULT (*getfloat)(HSQUIRRELVM v,SQInteger idx,SQFloat *f);
SQRESULT (*getbool)(HSQUIRRELVM v,SQInteger idx,SQBool *b);
SQRESULT (*getthread)(HSQUIRRELVM v,SQInteger idx,HSQUIRRELVM *thread);
SQRESULT (*getuserpointer)(HSQUIRRELVM v,SQInteger idx,SQUserPointer *p);
SQRESULT (*getuserdata)(HSQUIRRELVM v,SQInteger idx,SQUserPointer *p,SQUserPointer *typetag);
SQRESULT (*settypetag)(HSQUIRRELVM v,SQInteger idx,SQUserPointer typetag);
SQRESULT (*gettypetag)(HSQUIRRELVM v,SQInteger idx,SQUserPointer *typetag);
void (*setreleasehook)(HSQUIRRELVM v,SQInteger idx,SQRELEASEHOOK hook);
SQChar* (*getscratchpad)(HSQUIRRELVM v,SQInteger minsize);
SQRESULT (*getclosureinfo)(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger *nparams,SQUnsignedInteger *nfreevars);
SQRESULT (*setnativeclosurename)(HSQUIRRELVM v,SQInteger idx,const SQChar *name);
SQRESULT (*setinstanceup)(HSQUIRRELVM v, SQInteger idx, SQUserPointer p);
SQRESULT (*getinstanceup)(HSQUIRRELVM v, SQInteger idx, SQUserPointer *p,SQUserPointer typetag);
SQRESULT (*setclassudsize)(HSQUIRRELVM v, SQInteger idx, SQInteger udsize);
SQRESULT (*newclass)(HSQUIRRELVM v,SQBool hasbase);
SQRESULT (*createinstance)(HSQUIRRELVM v,SQInteger idx);
SQRESULT (*setattributes)(HSQUIRRELVM v,SQInteger idx);
SQRESULT (*getattributes)(HSQUIRRELVM v,SQInteger idx);
SQRESULT (*getclass)(HSQUIRRELVM v,SQInteger idx);
void (*weakref)(HSQUIRRELVM v,SQInteger idx);
SQRESULT (*getdefaultdelegate)(HSQUIRRELVM v,SQObjectType t);
/*object manipulation*/
void (*pushroottable)(HSQUIRRELVM v);
void (*pushregistrytable)(HSQUIRRELVM v);
void (*pushconsttable)(HSQUIRRELVM v);
SQRESULT (*setroottable)(HSQUIRRELVM v);
SQRESULT (*setconsttable)(HSQUIRRELVM v);
SQRESULT (*newslot)(HSQUIRRELVM v, SQInteger idx, SQBool bstatic);
SQRESULT (*deleteslot)(HSQUIRRELVM v,SQInteger idx,SQBool pushval);
SQRESULT (*set)(HSQUIRRELVM v,SQInteger idx);
SQRESULT (*get)(HSQUIRRELVM v,SQInteger idx);
SQRESULT (*rawget)(HSQUIRRELVM v,SQInteger idx);
SQRESULT (*rawset)(HSQUIRRELVM v,SQInteger idx);
SQRESULT (*rawdeleteslot)(HSQUIRRELVM v,SQInteger idx,SQBool pushval);
SQRESULT (*arrayappend)(HSQUIRRELVM v,SQInteger idx);
SQRESULT (*arraypop)(HSQUIRRELVM v,SQInteger idx,SQBool pushval);
SQRESULT (*arrayresize)(HSQUIRRELVM v,SQInteger idx,SQInteger newsize);
SQRESULT (*arrayreverse)(HSQUIRRELVM v,SQInteger idx);
SQRESULT (*arrayremove)(HSQUIRRELVM v,SQInteger idx,SQInteger itemidx);
SQRESULT (*arrayinsert)(HSQUIRRELVM v,SQInteger idx,SQInteger destpos);
SQRESULT (*setdelegate)(HSQUIRRELVM v,SQInteger idx);
SQRESULT (*getdelegate)(HSQUIRRELVM v,SQInteger idx);
SQRESULT (*clone)(HSQUIRRELVM v,SQInteger idx);
SQRESULT (*setfreevariable)(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger nval);
SQRESULT (*next)(HSQUIRRELVM v,SQInteger idx);
SQRESULT (*getweakrefval)(HSQUIRRELVM v,SQInteger idx);
SQRESULT (*clear)(HSQUIRRELVM v,SQInteger idx);
/*calls*/
SQRESULT (*call)(HSQUIRRELVM v,SQInteger params,SQBool retval,SQBool raiseerror);
SQRESULT (*resume)(HSQUIRRELVM v,SQBool retval,SQBool raiseerror);
const SQChar* (*getlocal)(HSQUIRRELVM v,SQUnsignedInteger level,SQUnsignedInteger idx);
const SQChar* (*getfreevariable)(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger nval);
SQRESULT (*throwerror)(HSQUIRRELVM v,const SQChar *err);
void (*reseterror)(HSQUIRRELVM v);
void (*getlasterror)(HSQUIRRELVM v);
/*raw object handling*/
SQRESULT (*getstackobj)(HSQUIRRELVM v,SQInteger idx,HSQOBJECT *po);
void (*pushobject)(HSQUIRRELVM v,HSQOBJECT obj);
void (*addref)(HSQUIRRELVM v,HSQOBJECT *po);
SQBool (*release)(HSQUIRRELVM v,HSQOBJECT *po);
void (*resetobject)(HSQOBJECT *po);
const SQChar* (*objtostring)(const HSQOBJECT *o);
SQBool (*objtobool)(const HSQOBJECT *o);
SQInteger (*objtointeger)(const HSQOBJECT *o);
SQFloat (*objtofloat)(const HSQOBJECT *o);
SQRESULT (*getobjtypetag)(const HSQOBJECT *o,SQUserPointer * typetag);
/*GC*/
SQInteger (*collectgarbage)(HSQUIRRELVM v);
/*serialization*/
SQRESULT (*writeclosure)(HSQUIRRELVM vm,SQWRITEFUNC writef,SQUserPointer up);
SQRESULT (*readclosure)(HSQUIRRELVM vm,SQREADFUNC readf,SQUserPointer up);
/*mem allocation*/
void* (*malloc)(SQUnsignedInteger size);
void* (*realloc)(void* p,SQUnsignedInteger oldsize,SQUnsignedInteger newsize);
void (*free)(void *p,SQUnsignedInteger size);
/*debug*/
SQRESULT (*stackinfos)(HSQUIRRELVM v,SQInteger level,SQStackInfos *si);
void (*setdebughook)(HSQUIRRELVM v);
} sq_api;
typedef sq_api* HSQAPI;
#ifdef __cplusplus
} /*extern "C"*/
#endif
#endif /*_SQ_MODULE_H_*/

View File

@ -0,0 +1,41 @@
//
// Sqrat: Squirrel C++ Binding Utility
//
//
// Copyright (c) 2009 Brandon Jones
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
// claim that you wrote the original software. If you use this software
// in a product, an acknowledgment in the product documentation would be
// appreciated but is not required.
//
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
//
// 3. This notice may not be removed or altered from any source
// distribution.
//
#if !defined(_SCRAT_MAIN_H_)
#define _SCRAT_MAIN_H_
#include <squirrel.h>
#include "sqrat/sqratTable.h"
#include "sqrat/sqratClass.h"
#include "sqrat/sqratFunction.h"
#include "sqrat/sqratConst.h"
#include "sqrat/sqratUtil.h"
#include "sqrat/sqratScript.h"
#include "sqrat/sqratArray.h"
#endif

View File

@ -0,0 +1,134 @@
//
// SqratAllocator: Custom Class Allocation/Deallocation
//
//
// Copyright (c) 2009 Brandon Jones
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
// claim that you wrote the original software. If you use this software
// in a product, an acknowledgment in the product documentation would be
// appreciated but is not required.
//
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
//
// 3. This notice may not be removed or altered from any source
// distribution.
//
#if !defined(_SCRAT_ALLOCATOR_H_)
#define _SCRAT_ALLOCATOR_H_
#include <squirrel.h>
#include <string.h>
#include "sqratObject.h"
namespace Sqrat {
//
// DefaultAllocator
//
template<class C>
class DefaultAllocator {
public:
static SQInteger New(HSQUIRRELVM vm) {
C* instance = new C();
sq_setinstanceup(vm, 1, instance);
sq_setreleasehook(vm, 1, &Delete);
return 0;
}
static SQInteger Copy(HSQUIRRELVM vm, SQInteger idx, const void* value) {
C* instance = new C(*static_cast<const C*>(value));
sq_setinstanceup(vm, idx, instance);
sq_setreleasehook(vm, idx, &Delete);
return 0;
}
static SQInteger Delete(SQUserPointer ptr, SQInteger size) {
C* instance = reinterpret_cast<C*>(ptr);
delete instance;
return 0;
}
};
//
// NoConstructorAllocator
//
class NoConstructor {
public:
static SQInteger New(HSQUIRRELVM) {
return 0;
}
static SQInteger Copy(HSQUIRRELVM, SQInteger, const void*) {
return 0;
}
static SQInteger Delete(SQUserPointer, SQInteger) {
return 0;
}
};
//
// CopyOnly
//
template<class C>
class CopyOnly {
public:
static SQInteger New(HSQUIRRELVM) {
return 0;
}
static SQInteger Copy(HSQUIRRELVM vm, SQInteger idx, const void* value) {
C* instance = new C(*static_cast<const C*>(value));
sq_setinstanceup(vm, idx, instance);
sq_setreleasehook(vm, idx, &Delete);
return 0;
}
static SQInteger Delete(SQUserPointer ptr, SQInteger size) {
void* instance = reinterpret_cast<C*>(ptr);
delete instance;
return 0;
}
};
//
// NoCopy
//
template<class C>
class NoCopy {
public:
static SQInteger New(HSQUIRRELVM vm) {
C* instance = new C();
sq_setinstanceup(vm, 1, instance);
sq_setreleasehook(vm, 1, &Delete);
return 0;
}
static SQInteger Copy(HSQUIRRELVM vm, SQInteger idx, const void* value) {
return 0;
}
static SQInteger Delete(SQUserPointer ptr, SQInteger size) {
C* instance = reinterpret_cast<C*>(ptr);
delete instance;
return 0;
}
};
}
#endif

View File

@ -0,0 +1,210 @@
//
// SqratArray: Array Binding
//
//
// Copyright 2011 Alston Chen
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
// claim that you wrote the original software. If you use this software
// in a product, an acknowledgment in the product documentation would be
// appreciated but is not required.
//
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
//
// 3. This notice may not be removed or altered from any source
// distribution.
//
#if !defined(_SCRAT_ARRAY_H_)
#define _SCRAT_ARRAY_H_
#include <squirrel.h>
#include <string.h>
#include "sqratObject.h"
#include "sqratFunction.h"
#include "sqratGlobalMethods.h"
namespace Sqrat {
class ArrayBase : public Object {
public:
ArrayBase(HSQUIRRELVM v = DefaultVM::Get()) : Object(v, true) {
}
ArrayBase(const Object& obj) : Object(obj) {
}
// Bind a Table or Class to the Array (Can be used to facilitate Namespaces)
// Note: Bind cannot be called "inline" like other functions because it introduces order-of-initialization bugs.
void Bind(const SQInteger index, Object& obj) {
sq_pushobject(vm, GetObject());
sq_pushinteger(vm, index);
sq_pushobject(vm, obj.GetObject());
sq_set(vm, -3);
sq_pop(vm,1); // pop array
}
// Bind a raw Squirrel closure to the Array
ArrayBase& SquirrelFunc(const SQInteger index, SQFUNCTION func) {
sq_pushobject(vm, GetObject());
sq_pushinteger(vm, index);
sq_newclosure(vm, func, 0);
sq_set(vm, -3);
sq_pop(vm,1); // pop array
return *this;
}
//
// Variable Binding
//
template<class V>
ArrayBase& SetValue(const SQInteger index, const V& val) {
sq_pushobject(vm, GetObject());
sq_pushinteger(vm, index);
PushVar(vm, val);
sq_set(vm, -3);
sq_pop(vm,1); // pop array
return *this;
}
template<class V>
ArrayBase& SetInstance(const SQInteger index, V* val) {
BindInstance<V>(index, false);
return *this;
}
template<class F>
ArrayBase& Func(const SQInteger index, F method) {
BindFunc(index, &method, sizeof(method), SqGlobalFunc(method));
return *this;
}
//template<class F>
//ArrayBase& Overload(const SQChar* name, F method) {
// BindOverload(name, &method, sizeof(method), SqGlobalFunc(method), SqOverloadFunc(method), SqGetArgCount(method));
// return *this;
//}
//
// Function Calls
//
Function GetFunction(const SQInteger index) {
HSQOBJECT funcObj;
sq_pushobject(vm, GetObject());
sq_pushinteger(vm, index);
if(SQ_FAILED(sq_get(vm, -2))) {
sq_pushnull(vm);
}
sq_getstackobj(vm, -1, &funcObj);
Function ret(vm, GetObject(), funcObj);
sq_pop(vm, 2);
return ret;
}
//
// Array manipulation
//
template<class V>
ArrayBase& Append(const V& val) {
sq_pushobject(vm, GetObject());
PushVar(vm, val);
sq_arrayappend(vm, -2);
sq_pop(vm,1); // pop array
return *this;
}
template<class V>
ArrayBase& Append(V* val) {
sq_pushobject(vm, GetObject());
PushVar(vm, val);
sq_arrayappend(vm, -2);
sq_pop(vm,1); // pop array
return *this;
}
template<class V>
ArrayBase& Insert(const SQInteger destpos, const V& val) {
sq_pushobject(vm, GetObject());
PushVar(vm, val);
sq_arrayinsert(vm, -2, destpos);
sq_pop(vm,1); // pop array
return *this;
}
template<class V>
ArrayBase& Insert(const SQInteger destpos, V* val) {
sq_pushobject(vm, GetObject());
PushVar(vm, val);
sq_arrayinsert(vm, -2, destpos);
sq_pop(vm,1); // pop array
return *this;
}
Object Pop() {
HSQOBJECT slotObj;
sq_pushobject(vm, GetObject());
if(SQ_FAILED(sq_arraypop(vm, -1, true))) {
sq_pop(vm, 1);
return Object(); // Return a NULL object
} else {
sq_getstackobj(vm, -1, &slotObj);
Object ret(slotObj, vm);
sq_pop(vm, 2);
return ret;
}
}
ArrayBase& Remove(const SQInteger itemidx) {
sq_pushobject(vm, GetObject());
sq_arrayremove(vm, -1, itemidx);
sq_pop(vm,1); // pop array
return *this;
}
ArrayBase& Resize(const SQInteger newsize) {
sq_pushobject(vm, GetObject());
sq_arrayresize(vm, -1, newsize);
sq_pop(vm,1); // pop array
return *this;
}
ArrayBase& Reverse() {
sq_pushobject(vm, GetObject());
sq_arrayreverse(vm, -1);
sq_pop(vm,1); // pop array
return *this;
}
};
class Array : public ArrayBase {
public:
Array(HSQUIRRELVM v = DefaultVM::Get(), const SQInteger size = 0) : ArrayBase(v) {
sq_newarray(vm, size);
sq_getstackobj(vm,-1,&obj);
sq_addref(vm, &obj);
sq_pop(vm,1);
}
Array(const Object& obj) : ArrayBase(obj) {
}
};
}
#endif

View File

@ -0,0 +1,415 @@
//
// SqratClass: Class Binding
//
//
// Copyright (c) 2009 Brandon Jones
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
// claim that you wrote the original software. If you use this software
// in a product, an acknowledgment in the product documentation would be
// appreciated but is not required.
//
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
//
// 3. This notice may not be removed or altered from any source
// distribution.
//
#if !defined(_SCRAT_CLASS_H_)
#define _SCRAT_CLASS_H_
#include <squirrel.h>
#include <string.h>
#include "sqratObject.h"
#include "sqratClassType.h"
#include "sqratMemberMethods.h"
#include "sqratAllocator.h"
namespace Sqrat
{
/**
@tparam C class type to expose
@tparam A allocator to use when instantiating and destroying class instances in Squirrel
@remarks
DefaultAllocator<C> is used if no allocator is specified. This should be sufficent for most classes
but if specific behavior is desired it can be overridden. If the class should not be instantiated from
Squirrel the NoConstructor allocator may be used.
*/
/// Exposes a C++ class to Squirrel
template<class C, class A = DefaultAllocator<C> >
class Class : public Object
{
public:
/**
@param v Squirrel virtual machine to bind to
*/
/// Constructor
Class(HSQUIRRELVM v = DefaultVM::Get(), bool createClass = true) : Object(v, false) {
if(createClass && !ClassType<C>::Initialized(v)) {
HSQOBJECT& classObj = ClassType<C>::ClassObject(v);
sq_resetobject(&classObj);
sq_newclass(vm, false);
sq_getstackobj(vm, -1, &classObj);
sq_addref(vm, &classObj); // must addref before the pop!
sq_pop(vm, 1);
InitClass();
ClassType<C>::Initialized(v) = true;
}
}
~Class() {
/*ClassType<C>::deleteClassTypeData(vm);*/
/* it seems the original design by Tojo was that ClassType objects are static
so they presist with the lifetime of the program; so we cannot delete the
ClassType object here */
}
/// Get the Squirrel Object for this Class (const)
virtual HSQOBJECT GetObject() const {
return ClassType<C>::ClassObject(vm);
}
/// Get the Squirrel Object for this Class (ref)
virtual HSQOBJECT& GetObject() {
return ClassType<C>::ClassObject(vm);
}
public:
//
// Variable Binding
//
/**
@param name name of the static slot
@param var value to assign
*/
/// Assign a static class slot a value
template<class V>
Class& SetStaticValue(const SQChar* name, const V& val) {
BindValue<V>(name, val, true);
return *this;
}
/**
@param name name of the slot
@param var value to assign
*/
/// Assign a class slot a value
template<class V>
Class& SetValue(const SQChar* name, const V& val) {
BindValue<V>(name, val, false);
return *this;
}
/**
@param name name of the variable as it will appear in Squirrel
@param var variable to bind
*/
/// Bind a class variable
template<class V>
Class& Var(const SQChar* name, V C::* var) {
// Add the getter
BindAccessor(name, &var, sizeof(var), &sqDefaultGet<C, V>, ClassType<C>::GetTable(vm));
// Add the setter
BindAccessor(name, &var, sizeof(var), &sqDefaultSet<C, V>, ClassType<C>::SetTable(vm));
return *this;
}
/// Bind a class property (variable accessed via a setter and getter)
template<class V>
Class& Prop(const SQChar* name, V (C::*getMethod)() const, void (C::*setMethod)(const V&)) {
if(getMethod != NULL) {
// Add the getter
BindAccessor(name, &getMethod, sizeof(getMethod), SqMemberFunc(getMethod), ClassType<C>::GetTable(vm));
}
if(setMethod != NULL) {
// Add the setter
BindAccessor(name, &setMethod, sizeof(setMethod), SqMemberFunc(setMethod), ClassType<C>::SetTable(vm));
}
return *this;
}
/// Bind a class property (variable accessed via a setter and getter)
template<class V>
Class& Prop(const SQChar* name, V (C::*getMethod)(), void (C::*setMethod)(V)) {
if(getMethod != NULL) {
// Add the getter
BindAccessor(name, &getMethod, sizeof(getMethod), SqMemberFunc(getMethod), ClassType<C>::GetTable(vm));
}
if(setMethod != NULL) {
// Add the setter
BindAccessor(name, &setMethod, sizeof(setMethod), SqMemberFunc(setMethod), ClassType<C>::SetTable(vm));
}
return *this;
}
/// Bind a read only class property (variable accessed via a getter)
template<class V>
Class& Prop(const SQChar* name, V (C::*getMethod)() const) {
// Add the getter
BindAccessor(name, &getMethod, sizeof(getMethod), SqMemberFunc(getMethod), ClassType<C>::GetTable(vm));
return *this;
}
/// Bind a read only class property (variable accessed via a getter)
template<class V>
Class& Prop(const SQChar* name, V (C::*getMethod)()) {
// Add the getter
BindAccessor(name, &getMethod, sizeof(getMethod), SqMemberFunc(getMethod), ClassType<C>::GetTable(vm));
return *this;
}
// TODO: Handle static instance vars
//
// Function Binding
//
template<class F>
Class& Func(const SQChar* name, F method) {
BindFunc(name, &method, sizeof(method), SqMemberFunc(method));
return *this;
}
template<class F>
Class& Overload(const SQChar* name, F method) {
BindOverload(name, &method, sizeof(method), SqMemberFunc(method), SqOverloadFunc(method), SqGetArgCount(method));
return *this;
}
template<class F>
Class& GlobalFunc(const SQChar* name, F method) {
BindFunc(name, &method, sizeof(method), SqMemberGlobalFunc(method));
return *this;
}
template<class F>
Class& StaticFunc(const SQChar* name, F method) {
BindFunc(name, &method, sizeof(method), SqGlobalFunc(method));
return *this;
}
template<class F>
Class& SquirrelFunc(const SQChar* name, SQFUNCTION func) {
sq_pushobject(vm, ClassType<C>::ClassObject(vm));
sq_pushstring(vm, name, -1);
sq_newclosure(vm, func, 0);
sq_newslot(vm, -3, false);
sq_pop(vm, 1); // pop table
return *this;
}
//
// Function Calls
//
Function GetFunction(const SQChar* name) {
HSQOBJECT funcObj;
sq_pushobject(vm, ClassType<C>::ClassObject(vm));
sq_pushstring(vm, name, -1);
if(SQ_FAILED(sq_get(vm, -2))) {
sq_pushnull(vm);
}
sq_getstackobj(vm, -1, &funcObj);
sq_pop(vm, 2);
return Function(vm, ClassType<C>::ClassObject(vm), funcObj);
}
protected:
static SQInteger ClassWeakref(HSQUIRRELVM vm) {
sq_weakref(vm, -1);
return 1;
}
// Initialize the required data structure for the class
void InitClass() {
ClassType<C>::CopyFunc(vm) = &A::Copy;
// push the class
sq_pushobject(vm, ClassType<C>::ClassObject(vm));
// add the default constructor
sq_pushstring(vm,_SC("constructor"), -1);
sq_newclosure(vm, &A::New, 0);
sq_newslot(vm, -3, false);
// add the set table (static)
HSQOBJECT& setTable = ClassType<C>::SetTable(vm);
sq_resetobject(&setTable);
sq_pushstring(vm,_SC("__setTable"), -1);
sq_newtable(vm);
sq_getstackobj(vm, -1, &setTable);
sq_addref(vm, &setTable);
sq_newslot(vm, -3, true);
// add the get table (static)
HSQOBJECT& getTable = ClassType<C>::GetTable(vm);
sq_resetobject(&getTable);
sq_pushstring(vm,_SC("__getTable"), -1);
sq_newtable(vm);
sq_getstackobj(vm, -1, &getTable);
sq_addref(vm, &getTable);
sq_newslot(vm, -3, true);
// override _set
sq_pushstring(vm, _SC("_set"), -1);
sq_pushobject(vm, setTable); // Push the set table as a free variable
sq_newclosure(vm, &sqVarSet, 1);
sq_newslot(vm, -3, false);
// override _get
sq_pushstring(vm, _SC("_get"), -1);
sq_pushobject(vm, getTable); // Push the get table as a free variable
sq_newclosure(vm, &sqVarGet, 1);
sq_newslot(vm, -3, false);
// add weakref (apparently not provided by default)
sq_pushstring(vm, _SC("weakref"), -1);
sq_newclosure(vm, &Class::ClassWeakref, 0);
sq_newslot(vm, -3, false);
// pop the class
sq_pop(vm, 1);
}
// Helper function used to bind getters and setters
inline void BindAccessor(const SQChar* name, void* var, size_t varSize, SQFUNCTION func, HSQOBJECT table) {
// Push the get or set table
sq_pushobject(vm, table);
sq_pushstring(vm, name, -1);
// Push the variable offset as a free variable
SQUserPointer varPtr = sq_newuserdata(vm, static_cast<SQUnsignedInteger>(varSize));
memcpy(varPtr, var, varSize);
// Create the accessor function
sq_newclosure(vm, func, 1);
// Add the accessor to the table
sq_newslot(vm, -3, false);
// Pop get/set table
sq_pop(vm, 1);
}
};
/**
@tparam C class type to expose
@tparam B base class type (must already be bound)
@tparam A allocator to use when instantiating and destroying class instances in Squirrel
@remarks
DefaultAllocator<C> is used if no allocator is specified. This should be sufficent for most classes
but if specific behavior is desired it can be overridden. If the class should not be instantiated from
Squirrel the NoConstructor allocator may be used.
@remarks
Classes in Squirrel are single-inheritance only, and as such Sqrat only allows for single inheritance as well
*/
/// Exposes a C++ class with a base class to Squirrel
template<class C, class B, class A = DefaultAllocator<C> >
class DerivedClass : public Class<C, A>
{
public:
DerivedClass(HSQUIRRELVM v = DefaultVM::Get()) : Class<C, A>(v, false) {
if(!ClassType<C>::Initialized(v)) {
HSQOBJECT& classObj = ClassType<C>::ClassObject(v);
sq_resetobject(&classObj);
sq_pushobject(v, ClassType<B>::ClassObject(v));
sq_newclass(v, true);
sq_getstackobj(v, -1, &classObj);
sq_addref(v, &classObj); // must addref before the pop!
sq_pop(v, 1);
InitDerivedClass(v);
ClassType<C>::Initialized(v) = true;
}
}
protected:
void InitDerivedClass(HSQUIRRELVM vm) {
ClassType<C>::CopyFunc(vm) = &A::Copy;
// push the class
sq_pushobject(vm, ClassType<C>::ClassObject(vm));
// add the default constructor
sq_pushstring(vm,_SC("constructor"), -1);
sq_newclosure(vm, &A::New, 0);
sq_newslot(vm, -3, false);
// clone the base classes set table (static)
HSQOBJECT& setTable = ClassType<C>::SetTable(vm);
sq_resetobject(&setTable);
sq_pushobject(vm, ClassType<B>::SetTable(vm));
sq_pushstring(vm,_SC("__setTable"), -1);
sq_clone(vm, -2);
sq_remove(vm, -3);
sq_getstackobj(vm, -1, &setTable);
sq_addref(vm, &setTable);
sq_newslot(vm, -3, true);
// clone the base classes get table (static)
HSQOBJECT& getTable = ClassType<C>::GetTable(vm);
sq_resetobject(&getTable);
sq_pushobject(vm, ClassType<B>::GetTable(vm));
sq_pushstring(vm,_SC("__getTable"), -1);
sq_clone(vm, -2);
sq_remove(vm, -3);
sq_getstackobj(vm, -1, &getTable);
sq_addref(vm, &getTable);
sq_newslot(vm, -3, true);
// override _set
sq_pushstring(vm, _SC("_set"), -1);
sq_pushobject(vm, setTable); // Push the set table as a free variable
sq_newclosure(vm, sqVarSet, 1);
sq_newslot(vm, -3, false);
// override _get
sq_pushstring(vm, _SC("_get"), -1);
sq_pushobject(vm, getTable); // Push the get table as a free variable
sq_newclosure(vm, sqVarGet, 1);
sq_newslot(vm, -3, false);
// add weakref (apparently not provided by default)
sq_pushstring(vm, _SC("weakref"), -1);
sq_newclosure(vm, &Class<C, A>::ClassWeakref, 0);
sq_newslot(vm, -3, false);
// pop the class
sq_pop(vm, 1);
}
};
}
#endif

View File

@ -0,0 +1,126 @@
//
// SqratClassType: Type Translators
//
//
// Copyright (c) 2009 Brandon Jones
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
// claim that you wrote the original software. If you use this software
// in a product, an acknowledgment in the product documentation would be
// appreciated but is not required.
//
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
//
// 3. This notice may not be removed or altered from any source
// distribution.
//
#if !defined(_SCRAT_CLASSTYPE_H_)
#define _SCRAT_CLASSTYPE_H_
#include <squirrel.h>
#include <map>
namespace Sqrat
{
//
// ClassType
//
// Get the Copy Function for this Class
typedef SQInteger (*COPYFUNC)(HSQUIRRELVM, SQInteger, const void*);
struct ClassTypeData {
bool initialized;
HSQOBJECT classObj;
HSQOBJECT getTable;
HSQOBJECT setTable;
COPYFUNC copyFunc;
ClassTypeData(): initialized(false) {}
};
template<class C>
struct ClassType {
static std::map< HSQUIRRELVM, ClassTypeData > s_classTypeDataMap;
static inline ClassTypeData& getClassTypeData(HSQUIRRELVM vm) {
//TODO: use mutex to lock s_classTypeDataMap in multithreaded environment
return s_classTypeDataMap[vm];
}
static inline bool hasClassTypeData(HSQUIRRELVM vm) {
//TODO: use mutex to lock s_classTypeDataMap in multithreaded environment
return (s_classTypeDataMap.find(vm) != s_classTypeDataMap.end());
}
static inline void deleteClassTypeData(HSQUIRRELVM vm) {
//TODO: use mutex to lock s_classTypeDataMap in multithreaded environment
std::map< HSQUIRRELVM, ClassTypeData >::iterator it = s_classTypeDataMap.find(vm);
if(it != s_classTypeDataMap.end()) {
s_classTypeDataMap.erase(it);
}
}
// Get the Squirrel Object for this Class
static inline HSQOBJECT& ClassObject(HSQUIRRELVM vm) {
return getClassTypeData(vm).classObj;
}
// Get the Get Table for this Class
static inline HSQOBJECT& GetTable(HSQUIRRELVM vm) {
return getClassTypeData(vm).getTable;
}
// Get the Set Table for this Class
static inline HSQOBJECT& SetTable(HSQUIRRELVM vm) {
return getClassTypeData(vm).setTable;
}
static inline COPYFUNC& CopyFunc(HSQUIRRELVM vm) {
return getClassTypeData(vm).copyFunc;
}
static inline bool& Initialized(HSQUIRRELVM vm) {
return getClassTypeData(vm).initialized;
}
static void PushInstance(HSQUIRRELVM vm, C* ptr) {
sq_pushobject(vm, ClassObject(vm));
sq_createinstance(vm, -1);
sq_remove(vm, -2);
sq_setinstanceup(vm, -1, ptr);
}
static void PushInstanceCopy(HSQUIRRELVM vm, C& value) {
sq_pushobject(vm, ClassObject(vm));
sq_createinstance(vm, -1);
sq_remove(vm, -2);
CopyFunc(vm)(vm, -1, &value);
}
static C* GetInstance(HSQUIRRELVM vm, SQInteger idx) {
C* ptr = NULL;
sq_getinstanceup(vm, idx, (SQUserPointer*)&ptr, NULL);
return ptr;
}
};
template<class C>
std::map< HSQUIRRELVM, ClassTypeData > ClassType<C>::s_classTypeDataMap;
}
#endif

View File

@ -0,0 +1,120 @@
//
// SqratConst: Constant and Enumeration Binding
//
//
// Copyright (c) 2009 Brandon Jones
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
// claim that you wrote the original software. If you use this software
// in a product, an acknowledgment in the product documentation would be
// appreciated but is not required.
//
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
//
// 3. This notice may not be removed or altered from any source
// distribution.
//
#if !defined(_SCRAT_CONST_H_)
#define _SCRAT_CONST_H_
#include <squirrel.h>
#include <string.h>
#include "sqratObject.h"
namespace Sqrat {
//
// Enumerations
//
class Enumeration : public Object {
public:
Enumeration(HSQUIRRELVM v = DefaultVM::Get(), bool createTable = true) : Object(v, false) {
if(createTable) {
sq_newtable(vm);
sq_getstackobj(vm,-1,&obj);
sq_addref(vm, &obj);
sq_pop(vm,1);
}
}
//
// Bind Constants
//
virtual Enumeration& Const(const SQChar* name, const int val) {
BindValue<int>(name, val, false);
return *this;
}
virtual Enumeration& Const(const SQChar* name, const float val) {
BindValue<float>(name, val, false);
return *this;
}
virtual Enumeration& Const(const SQChar* name, const SQChar* val) {
BindValue<const SQChar*>(name, val, false);
return *this;
}
};
//
// Constants
//
class ConstTable : public Enumeration {
public:
ConstTable(HSQUIRRELVM v = DefaultVM::Get()) : Enumeration(v, false) {
sq_pushconsttable(vm);
sq_getstackobj(vm,-1, &obj);
sq_pop(v,1); // No addref needed, since the consttable is always around
}
//
// Bind Constants
//
virtual ConstTable& Const(const SQChar* name, const int val) {
Enumeration::Const(name, val);
return *this;
}
virtual ConstTable& Const(const SQChar* name, const float val) {
Enumeration::Const(name, val);
return *this;
}
virtual ConstTable& Const(const SQChar* name, const SQChar* val) {
Enumeration::Const(name, val);
return *this;
}
//
// Bind Enumerations
//
ConstTable& Enum(const SQChar* name, Enumeration& en) {
sq_pushobject(vm, GetObject());
sq_pushstring(vm, name, -1);
sq_pushobject(vm, en.GetObject());
sq_newslot(vm, -3, false);
sq_pop(vm,1); // pop table
return *this;
}
};
}
#endif

View File

@ -0,0 +1,751 @@
//
// SqObject: Referenced Squirrel Object Wrapper
//
//
// Copyright (c) 2009 Brandon Jones
// Copyirght 2011 Li-Cheng (Andy) Tai
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
// claim that you wrote the original software. If you use this software
// in a product, an acknowledgment in the product documentation would be
// appreciated but is not required.
//
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
//
// 3. This notice may not be removed or altered from any source
// distribution.
//
#if !defined(_SCRAT_SQFUNC_H_)
#define _SCRAT_SQFUNC_H_
#include <squirrel.h>
#include "sqratObject.h"
namespace Sqrat {
class Function {
friend class TableBase;
friend class Table;
friend class ArrayBase;
friend struct Var<Function>;
private:
HSQUIRRELVM vm;
HSQOBJECT env, obj;
Function(HSQUIRRELVM v, HSQOBJECT e, HSQOBJECT o) : vm(v), env(e), obj(o) {
sq_addref(vm, &env);
sq_addref(vm, &obj);
}
public:
Function() {
sq_resetobject(&env);
sq_resetobject(&obj);
}
Function(const Function& sf) : vm(sf.vm), env(sf.env), obj(sf.obj) {
sq_addref(vm, &env);
sq_addref(vm, &obj);
}
Function(const Object& e, const SQChar* slot) : vm(e.GetVM()), env(e.GetObject()) {
sq_addref(vm, &env);
Object so = e.GetSlot(slot);
obj = so.GetObject();
sq_addref(vm, &obj);
}
~Function() {
Release();
}
Function& operator=(const Function& sf) {
Release();
vm = sf.vm;
env = sf.env;
obj = sf.obj;
sq_addref(vm, &env);
sq_addref(vm, &obj);
return *this;
}
bool IsNull() {
return sq_isnull(obj);
}
HSQOBJECT& GetEnv() {
return env;
}
HSQOBJECT& GetFunc() {
return obj;
}
HSQUIRRELVM& GetVM() {
return vm;
}
void Release() {
if(!IsNull()) {
sq_release(vm, &env);
sq_release(vm, &obj);
sq_resetobject(&env);
sq_resetobject(&obj);
}
}
template <class R>
R Evaluate() {
sq_pushobject(vm, obj);
sq_pushobject(vm, env);
sq_call(vm, 1, true, ErrorHandling::IsEnabled());
R ret = Var<R>(vm, -1).value;
sq_pop(vm, 2);
return ret;
}
template <class R, class A1>
R Evaluate(A1 a1) {
sq_pushobject(vm, obj);
sq_pushobject(vm, env);
PushVar(vm, a1);
sq_call(vm, 2, true, ErrorHandling::IsEnabled());
Var<R> ret(vm, -1);
sq_pop(vm, 2);
return ret.value;
}
template <class R, class A1, class A2>
R Evaluate(A1 a1, A2 a2) {
sq_pushobject(vm, obj);
sq_pushobject(vm, env);
PushVar(vm, a1);
PushVar(vm, a2);
sq_call(vm, 3, true, ErrorHandling::IsEnabled());
R ret = Var<R>(vm, -1).value;
sq_pop(vm, 2);
return ret;
}
template <class R, class A1, class A2, class A3>
R Evaluate(A1 a1, A2 a2, A3 a3) {
sq_pushobject(vm, obj);
sq_pushobject(vm, env);
PushVar(vm, a1);
PushVar(vm, a2);
PushVar(vm, a3);
sq_call(vm, 4, true, ErrorHandling::IsEnabled());
R ret = Var<R>(vm, -1).value;
sq_pop(vm, 2);
return ret;
}
template <class R, class A1, class A2, class A3, class A4>
R Evaluate(A1 a1, A2 a2, A3 a3, A4 a4) {
sq_pushobject(vm, obj);
sq_pushobject(vm, env);
PushVar(vm, a1);
PushVar(vm, a2);
PushVar(vm, a3);
PushVar(vm, a4);
sq_call(vm, 5, true, ErrorHandling::IsEnabled());
R ret = Var<R>(vm, -1).value;
sq_pop(vm, 2);
return ret;
}
template <class R, class A1, class A2, class A3, class A4, class A5>
R Evaluate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) {
sq_pushobject(vm, obj);
sq_pushobject(vm, env);
PushVar(vm, a1);
PushVar(vm, a2);
PushVar(vm, a3);
PushVar(vm, a4);
PushVar(vm, a5);
sq_call(vm, 6, true, ErrorHandling::IsEnabled());
R ret = Var<R>(vm, -1).value;
sq_pop(vm, 2);
return ret;
}
template <class R, class A1, class A2, class A3, class A4, class A5, class A6>
R Evaluate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) {
sq_pushobject(vm, obj);
sq_pushobject(vm, env);
PushVar(vm, a1);
PushVar(vm, a2);
PushVar(vm, a3);
PushVar(vm, a4);
PushVar(vm, a5);
PushVar(vm, a6);
sq_call(vm, 7, true, ErrorHandling::IsEnabled());
R ret = Var<R>(vm, -1).value;
sq_pop(vm, 2);
return ret;
}
template <class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
R Evaluate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) {
sq_pushobject(vm, obj);
sq_pushobject(vm, env);
PushVar(vm, a1);
PushVar(vm, a2);
PushVar(vm, a3);
PushVar(vm, a4);
PushVar(vm, a5);
PushVar(vm, a6);
PushVar(vm, a7);
sq_call(vm, 8, true, ErrorHandling::IsEnabled());
R ret = Var<R>(vm, -1).value;
sq_pop(vm, 2);
return ret;
}
template <class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8>
R Evaluate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) {
sq_pushobject(vm, obj);
sq_pushobject(vm, env);
PushVar(vm, a1);
PushVar(vm, a2);
PushVar(vm, a3);
PushVar(vm, a4);
PushVar(vm, a5);
PushVar(vm, a6);
PushVar(vm, a7);
PushVar(vm, a8);
sq_call(vm, 9, true, ErrorHandling::IsEnabled());
R ret = Var<R>(vm, -1).value;
sq_pop(vm, 2);
return ret;
}
template <class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9>
R Evaluate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9) {
sq_pushobject(vm, obj);
sq_pushobject(vm, env);
PushVar(vm, a1);
PushVar(vm, a2);
PushVar(vm, a3);
PushVar(vm, a4);
PushVar(vm, a5);
PushVar(vm, a6);
PushVar(vm, a7);
PushVar(vm, a8);
PushVar(vm, a9);
sq_call(vm, 10, true, ErrorHandling::IsEnabled());
R ret = Var<R>(vm, -1).value;
sq_pop(vm, 2);
return ret;
}
template <class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10>
R Evaluate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10) {
sq_pushobject(vm, obj);
sq_pushobject(vm, env);
PushVar(vm, a1);
PushVar(vm, a2);
PushVar(vm, a3);
PushVar(vm, a4);
PushVar(vm, a5);
PushVar(vm, a6);
PushVar(vm, a7);
PushVar(vm, a8);
PushVar(vm, a9);
PushVar(vm, a10);
sq_call(vm, 11, true, ErrorHandling::IsEnabled());
R ret = Var<R>(vm, -1).value;
sq_pop(vm, 2);
return ret;
}
template <class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11>
R Evaluate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11) {
sq_pushobject(vm, obj);
sq_pushobject(vm, env);
PushVar(vm, a1);
PushVar(vm, a2);
PushVar(vm, a3);
PushVar(vm, a4);
PushVar(vm, a5);
PushVar(vm, a6);
PushVar(vm, a7);
PushVar(vm, a8);
PushVar(vm, a9);
PushVar(vm, a10);
PushVar(vm, a11);
sq_call(vm, 12, true, ErrorHandling::IsEnabled());
R ret = Var<R>(vm, -1).value;
sq_pop(vm, 2);
return ret;
}
template <class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11, class A12>
R Evaluate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12) {
sq_pushobject(vm, obj);
sq_pushobject(vm, env);
PushVar(vm, a1);
PushVar(vm, a2);
PushVar(vm, a3);
PushVar(vm, a4);
PushVar(vm, a5);
PushVar(vm, a6);
PushVar(vm, a7);
PushVar(vm, a8);
PushVar(vm, a9);
PushVar(vm, a10);
PushVar(vm, a11);
PushVar(vm, a12);
sq_call(vm, 13, true, ErrorHandling::IsEnabled());
R ret = Var<R>(vm, -1).value;
sq_pop(vm, 2);
return ret;
}
template <class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11, class A12, class A13>
R Evaluate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12, A13 a13) {
sq_pushobject(vm, obj);
sq_pushobject(vm, env);
PushVar(vm, a1);
PushVar(vm, a2);
PushVar(vm, a3);
PushVar(vm, a4);
PushVar(vm, a5);
PushVar(vm, a6);
PushVar(vm, a7);
PushVar(vm, a8);
PushVar(vm, a9);
PushVar(vm, a10);
PushVar(vm, a11);
PushVar(vm, a12);
PushVar(vm, a13);
sq_call(vm, 14, true, ErrorHandling::IsEnabled());
R ret = Var<R>(vm, -1).value;
sq_pop(vm, 2);
return ret;
}
template <class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11, class A12, class A13, class A14>
R Evaluate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12, A13 a13, A14 a14) {
sq_pushobject(vm, obj);
sq_pushobject(vm, env);
PushVar(vm, a1);
PushVar(vm, a2);
PushVar(vm, a3);
PushVar(vm, a4);
PushVar(vm, a5);
PushVar(vm, a6);
PushVar(vm, a7);
PushVar(vm, a8);
PushVar(vm, a9);
PushVar(vm, a10);
PushVar(vm, a11);
PushVar(vm, a12);
PushVar(vm, a13);
PushVar(vm, a14);
sq_call(vm, 15, true, ErrorHandling::IsEnabled());
R ret = Var<R>(vm, -1).value;
sq_pop(vm, 2);
return ret;
}
//
// void returns
//
void Execute() {
sq_pushobject(vm, obj);
sq_pushobject(vm, env);
sq_call(vm, 1, false, ErrorHandling::IsEnabled());
sq_pop(vm, 1);
}
template <class A1>
void Execute(A1 a1) {
sq_pushobject(vm, obj);
sq_pushobject(vm, env);
PushVar(vm, a1);
sq_call(vm, 2, false, ErrorHandling::IsEnabled());
sq_pop(vm, 1);
}
template <class A1, class A2>
void Execute(A1 a1, A2 a2) {
sq_pushobject(vm, obj);
sq_pushobject(vm, env);
PushVar(vm, a1);
PushVar(vm, a2);
sq_call(vm, 3, false, ErrorHandling::IsEnabled());
sq_pop(vm, 1);
}
template <class A1, class A2, class A3>
void Execute(A1 a1, A2 a2, A3 a3) {
sq_pushobject(vm, obj);
sq_pushobject(vm, env);
PushVar(vm, a1);
PushVar(vm, a2);
PushVar(vm, a3);
sq_call(vm, 4, false, ErrorHandling::IsEnabled());
sq_pop(vm, 1);
}
template <class A1, class A2, class A3, class A4>
void Execute(A1 a1, A2 a2, A3 a3, A4 a4) {
sq_pushobject(vm, obj);
sq_pushobject(vm, env);
PushVar(vm, a1);
PushVar(vm, a2);
PushVar(vm, a3);
PushVar(vm, a4);
sq_call(vm, 5, false, ErrorHandling::IsEnabled());
sq_pop(vm, 1);
}
template <class A1, class A2, class A3, class A4, class A5>
void Execute(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) {
sq_pushobject(vm, obj);
sq_pushobject(vm, env);
PushVar(vm, a1);
PushVar(vm, a2);
PushVar(vm, a3);
PushVar(vm, a4);
PushVar(vm, a5);
sq_call(vm, 6, false, ErrorHandling::IsEnabled());
sq_pop(vm, 1);
}
template <class A1, class A2, class A3, class A4, class A5, class A6>
void Execute(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) {
sq_pushobject(vm, obj);
sq_pushobject(vm, env);
PushVar(vm, a1);
PushVar(vm, a2);
PushVar(vm, a3);
PushVar(vm, a4);
PushVar(vm, a5);
PushVar(vm, a6);
sq_call(vm, 7, false, ErrorHandling::IsEnabled());
sq_pop(vm, 1);
}
template <class A1, class A2, class A3, class A4, class A5, class A6, class A7>
void Execute(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) {
sq_pushobject(vm, obj);
sq_pushobject(vm, env);
PushVar(vm, a1);
PushVar(vm, a2);
PushVar(vm, a3);
PushVar(vm, a4);
PushVar(vm, a5);
PushVar(vm, a6);
PushVar(vm, a7);
sq_call(vm, 8, false, ErrorHandling::IsEnabled());
sq_pop(vm, 1);
}
template <class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8>
void Execute(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) {
sq_pushobject(vm, obj);
sq_pushobject(vm, env);
PushVar(vm, a1);
PushVar(vm, a2);
PushVar(vm, a3);
PushVar(vm, a4);
PushVar(vm, a5);
PushVar(vm, a6);
PushVar(vm, a7);
PushVar(vm, a8);
sq_call(vm, 9, false, ErrorHandling::IsEnabled());
sq_pop(vm, 1);
}
template <class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9>
void Execute(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9) {
sq_pushobject(vm, obj);
sq_pushobject(vm, env);
PushVar(vm, a1);
PushVar(vm, a2);
PushVar(vm, a3);
PushVar(vm, a4);
PushVar(vm, a5);
PushVar(vm, a6);
PushVar(vm, a7);
PushVar(vm, a8);
PushVar(vm, a9);
sq_call(vm, 10, false, ErrorHandling::IsEnabled());
sq_pop(vm, 1);
}
template <class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10>
void Execute(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10) {
sq_pushobject(vm, obj);
sq_pushobject(vm, env);
PushVar(vm, a1);
PushVar(vm, a2);
PushVar(vm, a3);
PushVar(vm, a4);
PushVar(vm, a5);
PushVar(vm, a6);
PushVar(vm, a7);
PushVar(vm, a8);
PushVar(vm, a9);
PushVar(vm, a10);
sq_call(vm, 11, false, ErrorHandling::IsEnabled());
sq_pop(vm, 1);
}
template <class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11>
void Execute(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11) {
sq_pushobject(vm, obj);
sq_pushobject(vm, env);
PushVar(vm, a1);
PushVar(vm, a2);
PushVar(vm, a3);
PushVar(vm, a4);
PushVar(vm, a5);
PushVar(vm, a6);
PushVar(vm, a7);
PushVar(vm, a8);
PushVar(vm, a9);
PushVar(vm, a10);
PushVar(vm, a11);
sq_call(vm, 12, false, ErrorHandling::IsEnabled());
sq_pop(vm, 1);
}
template <class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11, class A12>
void Execute(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12) {
sq_pushobject(vm, obj);
sq_pushobject(vm, env);
PushVar(vm, a1);
PushVar(vm, a2);
PushVar(vm, a3);
PushVar(vm, a4);
PushVar(vm, a5);
PushVar(vm, a6);
PushVar(vm, a7);
PushVar(vm, a8);
PushVar(vm, a9);
PushVar(vm, a10);
PushVar(vm, a11);
PushVar(vm, a12);
sq_call(vm, 13, false, ErrorHandling::IsEnabled());
sq_pop(vm, 1);
}
template <class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11, class A12, class A13>
void Execute(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12, A13 a13) {
sq_pushobject(vm, obj);
sq_pushobject(vm, env);
PushVar(vm, a1);
PushVar(vm, a2);
PushVar(vm, a3);
PushVar(vm, a4);
PushVar(vm, a5);
PushVar(vm, a6);
PushVar(vm, a7);
PushVar(vm, a8);
PushVar(vm, a9);
PushVar(vm, a10);
PushVar(vm, a11);
PushVar(vm, a12);
PushVar(vm, a13);
sq_call(vm, 14, false, ErrorHandling::IsEnabled());
sq_pop(vm, 1);
}
template <class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11, class A12, class A13, class A14>
void Execute(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12, A13 a13, A14 a14) {
sq_pushobject(vm, obj);
sq_pushobject(vm, env);
PushVar(vm, a1);
PushVar(vm, a2);
PushVar(vm, a3);
PushVar(vm, a4);
PushVar(vm, a5);
PushVar(vm, a6);
PushVar(vm, a7);
PushVar(vm, a8);
PushVar(vm, a9);
PushVar(vm, a10);
PushVar(vm, a11);
PushVar(vm, a12);
PushVar(vm, a13);
PushVar(vm, a14);
sq_call(vm, 15, false, ErrorHandling::IsEnabled());
sq_pop(vm, 1);
}
//
// Operator overloads for ease of use (calls Execute)
//
void operator()() {
Execute();
}
template <class A1>
void operator()(A1 a1) {
Execute(a1);
}
template <class A1, class A2>
void operator()(A1 a1, A2 a2) {
Execute(a1, a2);
}
template <class A1, class A2, class A3>
void operator()(A1 a1, A2 a2, A3 a3) {
Execute(a1, a2, a3);
}
template <class A1, class A2, class A3, class A4>
void operator()(A1 a1, A2 a2, A3 a3, A4 a4) {
Execute(a1, a2, a3, a4);
}
template <class A1, class A2, class A3, class A4, class A5>
void operator()(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) {
Execute(a1, a2, a3, a4, a5);
}
template <class A1, class A2, class A3, class A4, class A5, class A6>
void operator()(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) {
Execute(a1, a2, a3, a4, a5, a6);
}
template <class A1, class A2, class A3, class A4, class A5, class A6, class A7>
void operator()(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) {
Execute(a1, a2, a3, a4, a5, a6, a7);
}
template <class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8>
void operator()(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) {
Execute(a1, a2, a3, a4, a5, a6, a7, a8);
}
template <class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9>
void operator()(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9) {
Execute(a1, a2, a3, a4, a5, a6, a7, a8, a9);
}
template <class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10>
void operator()(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10) {
Execute(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
}
template <class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11>
void operator()(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11) {
Execute(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);
}
template <class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11, class A12>
void operator()(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12) {
Execute(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12);
}
template <class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11, class A12, class A13>
void operator()(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12, A13 a13) {
Execute(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13);
}
template <class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11, class A12, class A13, class A14>
void operator()(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12, A13 a13, A14 a14) {
Execute(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14);
}
};
//
// Overridden Getter/Setter
//
template<>
struct Var<Function> {
Function value;
Var(HSQUIRRELVM vm, SQInteger idx) {
HSQOBJECT sqEnv;
HSQOBJECT sqValue;
sq_getstackobj(vm, 1, &sqEnv);
sq_getstackobj(vm, idx, &sqValue);
value = Function(vm, sqEnv, sqValue);
}
static void push(HSQUIRRELVM vm, Function& value) {
sq_pushobject(vm, value.GetFunc());
}
};
}
#endif

View File

@ -0,0 +1,835 @@
//
// SqratGlobalMethods: Global Methods
//
//
// Copyright (c) 2009 Brandon Jones
// Copyirght 2011 Li-Cheng (Andy) Tai
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
// claim that you wrote the original software. If you use this software
// in a product, an acknowledgment in the product documentation would be
// appreciated but is not required.
//
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
//
// 3. This notice may not be removed or altered from any source
// distribution.
//
#if !defined(_SCRAT_GLOBAL_METHODS_H_)
#define _SCRAT_GLOBAL_METHODS_H_
#include <squirrel.h>
#include "sqratTypes.h"
namespace Sqrat {
//
// Squirrel Global Functions
//
template <class R>
class SqGlobal {
public:
// Arg Count 0
static SQInteger Func0(HSQUIRRELVM vm) {
typedef R (*M)();
M* method;
sq_getuserdata(vm, -1, (SQUserPointer*)&method, NULL);
R ret = (*method)();
PushVar(vm, ret);
return 1;
}
// Arg Count 1
template <class A1, SQInteger startIdx>
static SQInteger Func1(HSQUIRRELVM vm) {
typedef R (*M)(A1);
M* method;
sq_getuserdata(vm, -1, (SQUserPointer*)&method, NULL);
R ret = (*method)(
Var<A1>(vm, startIdx).value
);
PushVar(vm, ret);
return 1;
}
// Arg Count 2
template <class A1, class A2, SQInteger startIdx>
static SQInteger Func2(HSQUIRRELVM vm) {
typedef R (*M)(A1, A2);
M* method;
sq_getuserdata(vm, -1, (SQUserPointer*)&method, NULL);
R ret = (*method)(
Var<A1>(vm, startIdx).value,
Var<A2>(vm, startIdx + 1).value
);
PushVar(vm, ret);
return 1;
}
// Arg Count 3
template <class A1, class A2, class A3, SQInteger startIdx>
static SQInteger Func3(HSQUIRRELVM vm) {
typedef R (*M)(A1, A2, A3);
M* method;
sq_getuserdata(vm, -1, (SQUserPointer*)&method, NULL);
R ret = (*method)(
Var<A1>(vm, startIdx).value,
Var<A2>(vm, startIdx + 1).value,
Var<A3>(vm, startIdx + 2).value
);
PushVar(vm, ret);
return 1;
}
// Arg Count 4
template <class A1, class A2, class A3, class A4, SQInteger startIdx>
static SQInteger Func4(HSQUIRRELVM vm) {
typedef R (*M)(A1, A2, A3, A4);
M* method;
sq_getuserdata(vm, -1, (SQUserPointer*)&method, NULL);
R ret = (*method)(
Var<A1>(vm, startIdx).value,
Var<A2>(vm, startIdx + 1).value,
Var<A3>(vm, startIdx + 2).value,
Var<A4>(vm, startIdx + 3).value
);
PushVar(vm, ret);
return 1;
}
// Arg Count 5
template <class A1, class A2, class A3, class A4, class A5, SQInteger startIdx>
static SQInteger Func5(HSQUIRRELVM vm) {
typedef R (*M)(A1, A2, A3, A4, A5);
M* method;
sq_getuserdata(vm, -1, (SQUserPointer*)&method, NULL);
R ret = (*method)(
Var<A1>(vm, startIdx).value,
Var<A2>(vm, startIdx + 1).value,
Var<A3>(vm, startIdx + 2).value,
Var<A4>(vm, startIdx + 3).value,
Var<A5>(vm, startIdx + 4).value
);
PushVar(vm, ret);
return 1;
}
// Arg Count 6
template <class A1, class A2, class A3, class A4, class A5, class A6, SQInteger startIdx>
static SQInteger Func6(HSQUIRRELVM vm) {
typedef R (*M)(A1, A2, A3, A4, A5, A6);
M* method;
sq_getuserdata(vm, -1, (SQUserPointer*)&method, NULL);
R ret = (*method)(
Var<A1>(vm, startIdx).value,
Var<A2>(vm, startIdx + 1).value,
Var<A3>(vm, startIdx + 2).value,
Var<A4>(vm, startIdx + 3).value,
Var<A5>(vm, startIdx + 4).value,
Var<A6>(vm, startIdx + 5).value
);
PushVar(vm, ret);
return 1;
}
// Arg Count 7
template <class A1, class A2, class A3, class A4, class A5, class A6, class A7, SQInteger startIdx>
static SQInteger Func7(HSQUIRRELVM vm) {
typedef R (*M)(A1, A2, A3, A4, A5, A6, A7);
M* method;
sq_getuserdata(vm, -1, (SQUserPointer*)&method, NULL);
R ret = (*method)(
Var<A1>(vm, startIdx).value,
Var<A2>(vm, startIdx + 1).value,
Var<A3>(vm, startIdx + 2).value,
Var<A4>(vm, startIdx + 3).value,
Var<A5>(vm, startIdx + 4).value,
Var<A6>(vm, startIdx + 5).value,
Var<A7>(vm, startIdx + 6).value
);
PushVar(vm, ret);
return 1;
}
// Arg Count 8
template <class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, SQInteger startIdx>
static SQInteger Func8(HSQUIRRELVM vm) {
typedef R (*M)(A1, A2, A3, A4, A5, A6, A7, A8);
M* method;
sq_getuserdata(vm, -1, (SQUserPointer*)&method, NULL);
R ret = (*method)(
Var<A1>(vm, startIdx).value,
Var<A2>(vm, startIdx + 1).value,
Var<A3>(vm, startIdx + 2).value,
Var<A4>(vm, startIdx + 3).value,
Var<A5>(vm, startIdx + 4).value,
Var<A6>(vm, startIdx + 5).value,
Var<A7>(vm, startIdx + 6).value,
Var<A8>(vm, startIdx + 7).value
);
PushVar(vm, ret);
return 1;
}
// Arg Count 9
template <class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, SQInteger startIdx>
static SQInteger Func9(HSQUIRRELVM vm) {
typedef R (*M)(A1, A2, A3, A4, A5, A6, A7, A8, A9);
M* method;
sq_getuserdata(vm, -1, (SQUserPointer*)&method, NULL);
R ret = (*method)(
Var<A1>(vm, startIdx).value,
Var<A2>(vm, startIdx + 1).value,
Var<A3>(vm, startIdx + 2).value,
Var<A4>(vm, startIdx + 3).value,
Var<A5>(vm, startIdx + 4).value,
Var<A6>(vm, startIdx + 5).value,
Var<A7>(vm, startIdx + 6).value,
Var<A8>(vm, startIdx + 7).value,
Var<A9>(vm, startIdx + 8).value
);
PushVar(vm, ret);
return 1;
}
// Arg Count 10
template <class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, SQInteger startIdx>
static SQInteger Func10(HSQUIRRELVM vm) {
typedef R (*M)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10);
M* method;
sq_getuserdata(vm, -1, (SQUserPointer*)&method, NULL);
R ret = (*method)(
Var<A1>(vm, startIdx).value,
Var<A2>(vm, startIdx + 1).value,
Var<A3>(vm, startIdx + 2).value,
Var<A4>(vm, startIdx + 3).value,
Var<A5>(vm, startIdx + 4).value,
Var<A6>(vm, startIdx + 5).value,
Var<A7>(vm, startIdx + 6).value,
Var<A8>(vm, startIdx + 7).value,
Var<A9>(vm, startIdx + 8).value,
Var<A10>(vm, startIdx + 9).value
);
PushVar(vm, ret);
return 1;
}
// Arg Count 11
template <class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11, SQInteger startIdx>
static SQInteger Func11(HSQUIRRELVM vm) {
typedef R (*M)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11);
M* method;
sq_getuserdata(vm, -1, (SQUserPointer*)&method, NULL);
R ret = (*method)(
Var<A1>(vm, startIdx).value,
Var<A2>(vm, startIdx + 1).value,
Var<A3>(vm, startIdx + 2).value,
Var<A4>(vm, startIdx + 3).value,
Var<A5>(vm, startIdx + 4).value,
Var<A6>(vm, startIdx + 5).value,
Var<A7>(vm, startIdx + 6).value,
Var<A8>(vm, startIdx + 7).value,
Var<A9>(vm, startIdx + 8).value,
Var<A10>(vm, startIdx + 9).value,
Var<A11>(vm, startIdx + 10).value
);
PushVar(vm, ret);
return 1;
}
// Arg Count 12
template <class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11, class A12, SQInteger startIdx>
static SQInteger Func12(HSQUIRRELVM vm) {
typedef R (*M)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12);
M* method;
sq_getuserdata(vm, -1, (SQUserPointer*)&method, NULL);
R ret = (*method)(
Var<A1>(vm, startIdx).value,
Var<A2>(vm, startIdx + 1).value,
Var<A3>(vm, startIdx + 2).value,
Var<A4>(vm, startIdx + 3).value,
Var<A5>(vm, startIdx + 4).value,
Var<A6>(vm, startIdx + 5).value,
Var<A7>(vm, startIdx + 6).value,
Var<A8>(vm, startIdx + 7).value,
Var<A9>(vm, startIdx + 8).value,
Var<A10>(vm, startIdx + 9).value,
Var<A11>(vm, startIdx + 10).value,
Var<A12>(vm, startIdx + 11).value
);
PushVar(vm, ret);
return 1;
}
// Arg Count 13
template <class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11, class A12, class A13, SQInteger startIdx>
static SQInteger Func13(HSQUIRRELVM vm) {
typedef R (*M)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13);
M* method;
sq_getuserdata(vm, -1, (SQUserPointer*)&method, NULL);
R ret = (*method)(
Var<A1>(vm, startIdx).value,
Var<A2>(vm, startIdx + 1).value,
Var<A3>(vm, startIdx + 2).value,
Var<A4>(vm, startIdx + 3).value,
Var<A5>(vm, startIdx + 4).value,
Var<A6>(vm, startIdx + 5).value,
Var<A7>(vm, startIdx + 6).value,
Var<A8>(vm, startIdx + 7).value,
Var<A9>(vm, startIdx + 8).value,
Var<A10>(vm, startIdx + 9).value,
Var<A11>(vm, startIdx + 10).value,
Var<A12>(vm, startIdx + 11).value,
Var<A13>(vm, startIdx + 12).value
);
PushVar(vm, ret);
return 1;
}
// Arg Count 14
template <class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11, class A12, class A13, class A14, SQInteger startIdx>
static SQInteger Func14(HSQUIRRELVM vm) {
typedef R (*M)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14);
M* method;
sq_getuserdata(vm, -1, (SQUserPointer*)&method, NULL);
R ret = (*method)(
Var<A1>(vm, startIdx).value,
Var<A2>(vm, startIdx + 1).value,
Var<A3>(vm, startIdx + 2).value,
Var<A4>(vm, startIdx + 3).value,
Var<A5>(vm, startIdx + 4).value,
Var<A6>(vm, startIdx + 5).value,
Var<A7>(vm, startIdx + 6).value,
Var<A8>(vm, startIdx + 7).value,
Var<A9>(vm, startIdx + 8).value,
Var<A10>(vm, startIdx + 9).value,
Var<A11>(vm, startIdx + 10).value,
Var<A12>(vm, startIdx + 11).value,
Var<A13>(vm, startIdx + 12).value,
Var<A14>(vm, startIdx + 13).value
);
PushVar(vm, ret);
return 1;
}
};
//
// void return specialization
//
template <>
class SqGlobal<void> {
public:
// Arg Count 0
static SQInteger Func0(HSQUIRRELVM vm) {
typedef void (*M)();
M* method;
sq_getuserdata(vm, -1, (SQUserPointer*)&method, NULL);
(*method)();
return 0;
}
// Arg Count 1
template <class A1, SQInteger startIdx>
static SQInteger Func1(HSQUIRRELVM vm) {
typedef void (*M)(A1);
M* method;
sq_getuserdata(vm, -1, (SQUserPointer*)&method, NULL);
(*method)(
Var<A1>(vm, startIdx).value
);
return 0;
}
// Arg Count 2
template <class A1, class A2, SQInteger startIdx>
static SQInteger Func2(HSQUIRRELVM vm) {
typedef void (*M)(A1, A2);
M* method;
sq_getuserdata(vm, -1, (SQUserPointer*)&method, NULL);
(*method)(
Var<A1>(vm, startIdx).value,
Var<A2>(vm, startIdx + 1).value
);
return 0;
}
// Arg Count 3
template <class A1, class A2, class A3, SQInteger startIdx>
static SQInteger Func3(HSQUIRRELVM vm) {
typedef void (*M)(A1, A2, A3);
M* method;
sq_getuserdata(vm, -1, (SQUserPointer*)&method, NULL);
(*method)(
Var<A1>(vm, startIdx).value,
Var<A2>(vm, startIdx + 1).value,
Var<A3>(vm, startIdx + 2).value
);
return 0;
}
// Arg Count 4
template <class A1, class A2, class A3, class A4, SQInteger startIdx>
static SQInteger Func4(HSQUIRRELVM vm) {
typedef void (*M)(A1, A2, A3, A4);
M* method;
sq_getuserdata(vm, -1, (SQUserPointer*)&method, NULL);
(*method)(
Var<A1>(vm, startIdx).value,
Var<A2>(vm, startIdx + 1).value,
Var<A3>(vm, startIdx + 2).value,
Var<A4>(vm, startIdx + 3).value
);
return 0;
}
// Arg Count 5
template <class A1, class A2, class A3, class A4, class A5, SQInteger startIdx>
static SQInteger Func5(HSQUIRRELVM vm) {
typedef void (*M)(A1, A2, A3, A4, A5);
M* method;
sq_getuserdata(vm, -1, (SQUserPointer*)&method, NULL);
(*method)(
Var<A1>(vm, startIdx).value,
Var<A2>(vm, startIdx + 1).value,
Var<A3>(vm, startIdx + 2).value,
Var<A4>(vm, startIdx + 3).value,
Var<A5>(vm, startIdx + 4).value
);
return 0;
}
// Arg Count 6
template <class A1, class A2, class A3, class A4, class A5, class A6, SQInteger startIdx>
static SQInteger Func6(HSQUIRRELVM vm) {
typedef void (*M)(A1, A2, A3, A4, A5, A6);
M* method;
sq_getuserdata(vm, -1, (SQUserPointer*)&method, NULL);
(*method)(
Var<A1>(vm, startIdx).value,
Var<A2>(vm, startIdx + 1).value,
Var<A3>(vm, startIdx + 2).value,
Var<A4>(vm, startIdx + 3).value,
Var<A5>(vm, startIdx + 4).value,
Var<A6>(vm, startIdx + 5).value
);
return 0;
}
// Arg Count 7
template <class A1, class A2, class A3, class A4, class A5, class A6, class A7, SQInteger startIdx>
static SQInteger Func7(HSQUIRRELVM vm) {
typedef void (*M)(A1, A2, A3, A4, A5, A6, A7);
M* method;
sq_getuserdata(vm, -1, (SQUserPointer*)&method, NULL);
(*method)(
Var<A1>(vm, startIdx).value,
Var<A2>(vm, startIdx + 1).value,
Var<A3>(vm, startIdx + 2).value,
Var<A4>(vm, startIdx + 3).value,
Var<A5>(vm, startIdx + 4).value,
Var<A6>(vm, startIdx + 5).value,
Var<A7>(vm, startIdx + 6).value
);
return 0;
}
// Arg Count 8
template <class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, SQInteger startIdx>
static SQInteger Func8(HSQUIRRELVM vm) {
typedef void (*M)(A1, A2, A3, A4, A5, A6, A7, A8);
M* method;
sq_getuserdata(vm, -1, (SQUserPointer*)&method, NULL);
(*method)(
Var<A1>(vm, startIdx).value,
Var<A2>(vm, startIdx + 1).value,
Var<A3>(vm, startIdx + 2).value,
Var<A4>(vm, startIdx + 3).value,
Var<A5>(vm, startIdx + 4).value,
Var<A6>(vm, startIdx + 5).value,
Var<A7>(vm, startIdx + 6).value,
Var<A8>(vm, startIdx + 7).value
);
return 0;
}
// Arg Count 9
template <class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, SQInteger startIdx>
static SQInteger Func9(HSQUIRRELVM vm) {
typedef void (*M)(A1, A2, A3, A4, A5, A6, A7, A8, A9);
M* method;
sq_getuserdata(vm, -1, (SQUserPointer*)&method, NULL);
(*method)(
Var<A1>(vm, startIdx).value,
Var<A2>(vm, startIdx + 1).value,
Var<A3>(vm, startIdx + 2).value,
Var<A4>(vm, startIdx + 3).value,
Var<A5>(vm, startIdx + 4).value,
Var<A6>(vm, startIdx + 5).value,
Var<A7>(vm, startIdx + 6).value,
Var<A8>(vm, startIdx + 7).value,
Var<A9>(vm, startIdx + 8).value
);
return 0;
}
// Arg Count 10
template <class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, SQInteger startIdx>
static SQInteger Func10(HSQUIRRELVM vm) {
typedef void (*M)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10);
M* method;
sq_getuserdata(vm, -1, (SQUserPointer*)&method, NULL);
(*method)(
Var<A1>(vm, startIdx).value,
Var<A2>(vm, startIdx + 1).value,
Var<A3>(vm, startIdx + 2).value,
Var<A4>(vm, startIdx + 3).value,
Var<A5>(vm, startIdx + 4).value,
Var<A6>(vm, startIdx + 5).value,
Var<A7>(vm, startIdx + 6).value,
Var<A8>(vm, startIdx + 7).value,
Var<A9>(vm, startIdx + 8).value,
Var<A10>(vm, startIdx + 9).value
);
return 0;
}
// Arg Count 11
template <class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11, SQInteger startIdx>
static SQInteger Func11(HSQUIRRELVM vm) {
typedef void (*M)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11);
M* method;
sq_getuserdata(vm, -1, (SQUserPointer*)&method, NULL);
(*method)(
Var<A1>(vm, startIdx).value,
Var<A2>(vm, startIdx + 1).value,
Var<A3>(vm, startIdx + 2).value,
Var<A4>(vm, startIdx + 3).value,
Var<A5>(vm, startIdx + 4).value,
Var<A6>(vm, startIdx + 5).value,
Var<A7>(vm, startIdx + 6).value,
Var<A8>(vm, startIdx + 7).value,
Var<A9>(vm, startIdx + 8).value,
Var<A10>(vm, startIdx + 9).value,
Var<A11>(vm, startIdx + 10).value
);
return 0;
}
// Arg Count 12
template <class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11, class A12, SQInteger startIdx>
static SQInteger Func12(HSQUIRRELVM vm) {
typedef void (*M)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12);
M* method;
sq_getuserdata(vm, -1, (SQUserPointer*)&method, NULL);
(*method)(
Var<A1>(vm, startIdx).value,
Var<A2>(vm, startIdx + 1).value,
Var<A3>(vm, startIdx + 2).value,
Var<A4>(vm, startIdx + 3).value,
Var<A5>(vm, startIdx + 4).value,
Var<A6>(vm, startIdx + 5).value,
Var<A7>(vm, startIdx + 6).value,
Var<A8>(vm, startIdx + 7).value,
Var<A9>(vm, startIdx + 8).value,
Var<A10>(vm, startIdx + 9).value,
Var<A11>(vm, startIdx + 10).value,
Var<A12>(vm, startIdx + 11).value
);
return 0;
}
// Arg Count 13
template <class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11, class A12, class A13, SQInteger startIdx>
static SQInteger Func13(HSQUIRRELVM vm) {
typedef void (*M)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13);
M* method;
sq_getuserdata(vm, -1, (SQUserPointer*)&method, NULL);
(*method)(
Var<A1>(vm, startIdx).value,
Var<A2>(vm, startIdx + 1).value,
Var<A3>(vm, startIdx + 2).value,
Var<A4>(vm, startIdx + 3).value,
Var<A5>(vm, startIdx + 4).value,
Var<A6>(vm, startIdx + 5).value,
Var<A7>(vm, startIdx + 6).value,
Var<A8>(vm, startIdx + 7).value,
Var<A9>(vm, startIdx + 8).value,
Var<A10>(vm, startIdx + 9).value,
Var<A11>(vm, startIdx + 10).value,
Var<A12>(vm, startIdx + 11).value,
Var<A13>(vm, startIdx + 12).value
);
return 0;
}
// Arg Count 14
template <class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11, class A12, class A13, class A14, SQInteger startIdx>
static SQInteger Func14(HSQUIRRELVM vm) {
typedef void (*M)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14);
M* method;
sq_getuserdata(vm, -1, (SQUserPointer*)&method, NULL);
(*method)(
Var<A1>(vm, startIdx).value,
Var<A2>(vm, startIdx + 1).value,
Var<A3>(vm, startIdx + 2).value,
Var<A4>(vm, startIdx + 3).value,
Var<A5>(vm, startIdx + 4).value,
Var<A6>(vm, startIdx + 5).value,
Var<A7>(vm, startIdx + 6).value,
Var<A8>(vm, startIdx + 7).value,
Var<A9>(vm, startIdx + 8).value,
Var<A10>(vm, startIdx + 9).value,
Var<A11>(vm, startIdx + 10).value,
Var<A12>(vm, startIdx + 11).value,
Var<A13>(vm, startIdx + 12).value,
Var<A14>(vm, startIdx + 13).value
);
return 0;
}
};
//
// Global Function Resolvers
//
// Arg Count 0
template <class R>
SQFUNCTION SqGlobalFunc(R (*method)()) {
return &SqGlobal<R>::Func0;
}
// Arg Count 1
template <class R, class A1>
SQFUNCTION SqGlobalFunc(R (*method)(A1)) {
return &SqGlobal<R>::template Func1<A1, 2>;
}
// Arg Count 2
template <class R, class A1, class A2>
SQFUNCTION SqGlobalFunc(R (*method)(A1, A2)) {
return &SqGlobal<R>::template Func2<A1, A2, 2>;
}
// Arg Count 3
template <class R, class A1, class A2, class A3>
SQFUNCTION SqGlobalFunc(R (*method)(A1, A2, A3)) {
return &SqGlobal<R>::template Func3<A1, A2, A3, 2>;
}
// Arg Count 4
template <class R, class A1, class A2, class A3, class A4>
SQFUNCTION SqGlobalFunc(R (*method)(A1, A2, A3, A4)) {
return &SqGlobal<R>::template Func4<A1, A2, A3, A4, 2>;
}
// Arg Count 5
template <class R, class A1, class A2, class A3, class A4, class A5>
SQFUNCTION SqGlobalFunc(R (*method)(A1, A2, A3, A4, A5)) {
return &SqGlobal<R>::template Func5<A1, A2, A3, A4, A5, 2>;
}
// Arg Count 6
template <class R, class A1, class A2, class A3, class A4, class A5, class A6>
SQFUNCTION SqGlobalFunc(R (*method)(A1, A2, A3, A4, A5, A6)) {
return &SqGlobal<R>::template Func6<A1, A2, A3, A4, A5, A6, 2>;
}
// Arg Count 7
template <class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
SQFUNCTION SqGlobalFunc(R (*method)(A1, A2, A3, A4, A5, A6, A7)) {
return &SqGlobal<R>::template Func7<A1, A2, A3, A4, A5, A6, A7, 2>;
}
// Arg Count 8
template <class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8>
SQFUNCTION SqGlobalFunc(R (*method)(A1, A2, A3, A4, A5, A6, A7, A8)) {
return &SqGlobal<R>::template Func8<A1, A2, A3, A4, A5, A6, A7, A8, 2>;
}
// Arg Count 9
template <class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9>
SQFUNCTION SqGlobalFunc(R (*method)(A1, A2, A3, A4, A5, A6, A7, A8, A9)) {
return &SqGlobal<R>::template Func9<A1, A2, A3, A4, A5, A6, A7, A8, A9, 2>;
}
// Arg Count 10
template <class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10>
SQFUNCTION SqGlobalFunc(R (*method)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10)) {
return &SqGlobal<R>::template Func10<A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, 2>;
}
// Arg Count 11
template <class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11>
SQFUNCTION SqGlobalFunc(R (*method)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11)) {
return &SqGlobal<R>::template Func11<A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, 2>;
}
// Arg Count 12
template <class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11, class A12>
SQFUNCTION SqGlobalFunc(R (*method)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12)) {
return &SqGlobal<R>::template Func12<A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, 2>;
}
// Arg Count 13
template <class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11, class A12, class A13>
SQFUNCTION SqGlobalFunc(R (*method)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13)) {
return &SqGlobal<R>::template Func13<A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, 2>;
}
// Arg Count 14
template <class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11, class A12, class A13, class A14>
SQFUNCTION SqGlobalFunc(R (*method)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14)) {
return &SqGlobal<R>::template Func14<A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, 2>;
}
//
// Member Global Function Resolvers
//
// Arg Count 1
template <class R, class A1>
SQFUNCTION SqMemberGlobalFunc(R (*method)(A1)) {
return &SqGlobal<R>::template Func1<A1, 1>;
}
// Arg Count 2
template <class R, class A1, class A2>
SQFUNCTION SqMemberGlobalFunc(R (*method)(A1, A2)) {
return &SqGlobal<R>::template Func2<A1, A2, 1>;
}
// Arg Count 3
template <class R, class A1, class A2, class A3>
SQFUNCTION SqMemberGlobalFunc(R (*method)(A1, A2, A3)) {
return &SqGlobal<R>::template Func3<A1, A2, A3, 1>;
}
// Arg Count 4
template <class R, class A1, class A2, class A3, class A4>
SQFUNCTION SqMemberGlobalFunc(R (*method)(A1, A2, A3, A4)) {
return &SqGlobal<R>::template Func4<A1, A2, A3, A4, 1>;
}
// Arg Count 5
template <class R, class A1, class A2, class A3, class A4, class A5>
SQFUNCTION SqMemberGlobalFunc(R (*method)(A1, A2, A3, A4, A5)) {
return &SqGlobal<R>::template Func5<A1, A2, A3, A4, A5, 1>;
}
// Arg Count 6
template <class R, class A1, class A2, class A3, class A4, class A5, class A6>
SQFUNCTION SqMemberGlobalFunc(R (*method)(A1, A2, A3, A4, A5, A6)) {
return &SqGlobal<R>::template Func6<A1, A2, A3, A4, A5, A6, 1>;
}
// Arg Count 7
template <class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
SQFUNCTION SqMemberGlobalFunc(R (*method)(A1, A2, A3, A4, A5, A6, A7)) {
return &SqGlobal<R>::template Func7<A1, A2, A3, A4, A5, A6, A7, 1>;
}
// Arg Count 8
template <class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8>
SQFUNCTION SqMemberGlobalFunc(R (*method)(A1, A2, A3, A4, A5, A6, A7, A8)) {
return &SqGlobal<R>::template Func8<A1, A2, A3, A4, A5, A6, A7, A8, 1>;
}
// Arg Count 9
template <class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9>
SQFUNCTION SqMemberGlobalFunc(R (*method)(A1, A2, A3, A4, A5, A6, A7, A8, A9)) {
return &SqGlobal<R>::template Func9<A1, A2, A3, A4, A5, A6, A7, A8, A9, 1>;
}
// Arg Count 10
template <class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10>
SQFUNCTION SqMemberGlobalFunc(R (*method)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10)) {
return &SqGlobal<R>::template Func10<A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, 1>;
}
// Arg Count 11
template <class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11>
SQFUNCTION SqMemberGlobalFunc(R (*method)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11)) {
return &SqGlobal<R>::template Func11<A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, 1>;
}
// Arg Count 12
template <class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11, class A12>
SQFUNCTION SqMemberGlobalFunc(R (*method)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12)) {
return &SqGlobal<R>::template Func12<A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, 1>;
}
// Arg Count 13
template <class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11, class A12, class A13>
SQFUNCTION SqMemberGlobalFunc(R (*method)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13)) {
return &SqGlobal<R>::template Func13<A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, 1>;
}
// Arg Count 14
template <class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11, class A12, class A13, class A14>
SQFUNCTION SqMemberGlobalFunc(R (*method)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14)) {
return &SqGlobal<R>::template Func14<A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, 1>;
}
}
#endif

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,310 @@
//
// SqratObject: Referenced Squirrel Object Wrapper
//
//
// Copyright (c) 2009 Brandon Jones
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
// claim that you wrote the original software. If you use this software
// in a product, an acknowledgment in the product documentation would be
// appreciated but is not required.
//
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
//
// 3. This notice may not be removed or altered from any source
// distribution.
//
#if !defined(_SCRAT_OBJECT_H_)
#define _SCRAT_OBJECT_H_
#include <squirrel.h>
#include <string.h>
#include "sqratTypes.h"
#include "sqratOverloadMethods.h"
#include "sqratUtil.h"
namespace Sqrat {
class Object {
protected:
HSQUIRRELVM vm;
HSQOBJECT obj;
bool release;
Object(HSQUIRRELVM v, bool releaseOnDestroy = true) : vm(v), release(releaseOnDestroy) {
sq_resetobject(&obj);
}
public:
Object() : vm(0), release(true) {
sq_resetobject(&obj);
}
Object(const Object& so) : vm(so.vm), obj(so.obj), release(so.release) {
sq_addref(vm, &obj);
}
Object(HSQOBJECT o, HSQUIRRELVM v = DefaultVM::Get()) : vm(v), obj(o), release(true) {
sq_addref(vm, &obj);
}
template<class T>
Object(T* instance, HSQUIRRELVM v = DefaultVM::Get()) : vm(v), release(true) {
ClassType<T>::PushInstance(vm, instance);
sq_getstackobj(vm, -1, &obj);
sq_addref(vm, &obj);
}
virtual ~Object() {
if(release) {
Release();
}
}
Object& operator=(const Object& so) {
if(release) {
Release();
}
vm = so.vm;
obj = so.obj;
release = so.release;
sq_addref(vm, &GetObject());
return *this;
}
HSQUIRRELVM& GetVM() {
return vm;
}
HSQUIRRELVM GetVM() const {
return vm;
}
SQObjectType GetType() const {
return GetObject()._type;
}
bool IsNull() const {
return sq_isnull(GetObject());
}
virtual HSQOBJECT GetObject() const {
return obj;
}
virtual HSQOBJECT& GetObject() {
return obj;
}
operator HSQOBJECT&() {
return GetObject();
}
void Release() {
sq_release(vm, &obj);
}
SQUserPointer GetInstanceUP(SQUserPointer tag = NULL) const {
SQUserPointer up;
sq_pushobject(vm, GetObject());
sq_getinstanceup(vm, -1, &up, tag);
sq_pop(vm, 1);
return up;
}
Object GetSlot(const SQChar* slot) const {
HSQOBJECT slotObj;
sq_pushobject(vm, GetObject());
sq_pushstring(vm, slot, -1);
if(SQ_FAILED(sq_get(vm, -2))) {
sq_pop(vm, 1);
return Object(vm); // Return a NULL object
} else {
sq_getstackobj(vm, -1, &slotObj);
Object ret(slotObj, vm); // must addref before the pop!
sq_pop(vm, 2);
return ret;
}
}
template <class T>
T Cast() const {
sq_pushobject(vm, GetObject());
T ret = Var<T>(vm, -1).value;
sq_pop(vm, 1);
return ret;
}
Object GetSlot(SQInteger index) const {
HSQOBJECT slotObj;
sq_pushobject(vm, GetObject());
sq_pushinteger(vm, index);
if(SQ_FAILED(sq_get(vm, -2))) {
sq_pop(vm, 1);
return Object(vm); // Return a NULL object
} else {
sq_getstackobj(vm, -1, &slotObj);
Object ret(slotObj, vm); // must addref before the pop!
sq_pop(vm, 2);
return ret;
}
}
template <class T>
inline Object operator[](T slot)
{
return GetSlot(slot);
}
SQInteger GetSize() const {
sq_pushobject(vm, GetObject());
SQInteger ret = sq_getsize(vm, -1);
sq_pop(vm, 1);
return ret;
}
protected:
// Bind a function and it's associated Squirrel closure to the object
inline void BindFunc(const SQChar* name, void* method, size_t methodSize, SQFUNCTION func, bool staticVar = false) {
sq_pushobject(vm, GetObject());
sq_pushstring(vm, name, -1);
SQUserPointer methodPtr = sq_newuserdata(vm, static_cast<SQUnsignedInteger>(methodSize));
memcpy(methodPtr, method, methodSize);
sq_newclosure(vm, func, 1);
sq_newslot(vm, -3, staticVar);
sq_pop(vm,1); // pop table
}
inline void BindFunc(const SQInteger index, void* method, size_t methodSize, SQFUNCTION func, bool staticVar = false) {
sq_pushobject(vm, GetObject());
sq_pushinteger(vm, index);
SQUserPointer methodPtr = sq_newuserdata(vm, static_cast<SQUnsignedInteger>(methodSize));
memcpy(methodPtr, method, methodSize);
sq_newclosure(vm, func, 1);
sq_newslot(vm, -3, staticVar);
sq_pop(vm,1); // pop table
}
// Bind a function and it's associated Squirrel closure to the object
inline void BindOverload(const SQChar* name, void* method, size_t methodSize, SQFUNCTION func, SQFUNCTION overload, int argCount, bool staticVar = false) {
string overloadName = SqOverloadName::Get(name, argCount);
sq_pushobject(vm, GetObject());
// Bind overload handler
sq_pushstring(vm, name, -1);
sq_pushstring(vm, name, -1); // function name is passed as a free variable
sq_newclosure(vm, overload, 1);
sq_newslot(vm, -3, staticVar);
// Bind overloaded function
sq_pushstring(vm, overloadName.c_str(), -1);
SQUserPointer methodPtr = sq_newuserdata(vm, static_cast<SQUnsignedInteger>(methodSize));
memcpy(methodPtr, method, methodSize);
sq_newclosure(vm, func, 1);
sq_newslot(vm, -3, staticVar);
sq_pop(vm,1); // pop table
}
// Set the value of a variable on the object. Changes to values set this way are not reciprocated
template<class V>
inline void BindValue(const SQChar* name, const V& val, bool staticVar = false) {
sq_pushobject(vm, GetObject());
sq_pushstring(vm, name, -1);
PushVar(vm, val);
sq_newslot(vm, -3, staticVar);
sq_pop(vm,1); // pop table
}
template<class V>
inline void BindValue(const SQInteger index, const V& val, bool staticVar = false) {
sq_pushobject(vm, GetObject());
sq_pushinteger(vm, index);
PushVar(vm, val);
sq_newslot(vm, -3, staticVar);
sq_pop(vm,1); // pop table
}
// Set the value of an instance on the object. Changes to values set this way are reciprocated back to the source instance
template<class V>
inline void BindInstance(const SQChar* name, V* val, bool staticVar = false) {
sq_pushobject(vm, GetObject());
sq_pushstring(vm, name, -1);
PushVar(vm, val);
sq_newslot(vm, -3, staticVar);
sq_pop(vm,1); // pop table
}
template<class V>
inline void BindInstance(const SQInteger index, V* val, bool staticVar = false) {
sq_pushobject(vm, GetObject());
sq_pushinteger(vm, index);
PushVar(vm, val);
sq_newslot(vm, -3, staticVar);
sq_pop(vm,1); // pop table
}
};
//
// Overridden Getter/Setter
//
template<>
struct Var<Object> {
Object value;
Var(HSQUIRRELVM vm, SQInteger idx) {
HSQOBJECT sqValue;
sq_getstackobj(vm, idx, &sqValue);
value = Object(sqValue, vm);
}
static void push(HSQUIRRELVM vm, Object& value) {
sq_pushobject(vm, value.GetObject());
}
};
template<>
struct Var<Object&> {
Object value;
Var(HSQUIRRELVM vm, SQInteger idx) {
HSQOBJECT sqValue;
sq_getstackobj(vm, idx, &sqValue);
value = Object(sqValue, vm);
}
static void push(HSQUIRRELVM vm, Object& value) {
sq_pushobject(vm, value.GetObject());
}
};
template<>
struct Var<const Object&> {
Object value;
Var(HSQUIRRELVM vm, SQInteger idx) {
HSQOBJECT sqValue;
sq_getstackobj(vm, idx, &sqValue);
value = Object(sqValue, vm);
}
static void push(HSQUIRRELVM vm, Object& value) {
sq_pushobject(vm, value.GetObject());
}
};
}
#endif

View File

@ -0,0 +1,485 @@
//
// SqratGlobalMethods: Global Methods
//
//
// Copyright (c) 2009 Brandon Jones
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
// claim that you wrote the original software. If you use this software
// in a product, an acknowledgment in the product documentation would be
// appreciated but is not required.
//
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
//
// 3. This notice may not be removed or altered from any source
// distribution.
//
#if !defined(_SQRAT_OVERLOAD_METHODS_H_)
#define _SQRAT_OVERLOAD_METHODS_H_
#include <squirrel.h>
#include <sqstdaux.h>
#include <sstream>
#include "sqratTypes.h"
#include "sqratUtil.h"
namespace Sqrat {
//
// Overload name generator
//
class SqOverloadName {
public:
static string Get(const SQChar* name, int args) {
std::basic_stringstream<SQChar> overloadName;
overloadName << _SC("__sqrat_ol_ ") << name << _SC("_") << args;
return overloadName.str();
}
};
//
// Squirrel Overload Functions
//
template <class R>
class SqOverload {
public:
static SQInteger Func(HSQUIRRELVM vm) {
// Get the arg count
int argCount = sq_gettop(vm) - 2;
const SQChar* funcName;
sq_getstring(vm, -1, &funcName); // get the function name (free variable)
string overloadName = SqOverloadName::Get(funcName, argCount);
sq_pushstring(vm, overloadName.c_str(), -1);
if(SQ_FAILED(sq_get(vm, 1))) { // Lookup the proper overload
return sq_throwerror(vm, "No overload matching this argument list found");// How to best appropriately error?
}
// Push the args again
for(int i = 1; i <= argCount + 1; ++i) {
sq_push(vm, i);
}
sq_call(vm, argCount + 1, true, ErrorHandling::IsEnabled());
return 1;
}
};
//
// void return specialization
//
template <>
class SqOverload<void> {
public:
static SQInteger Func(HSQUIRRELVM vm) {
// Get the arg count
int argCount = sq_gettop(vm) - 2;
const SQChar* funcName;
sq_getstring(vm, -1, &funcName); // get the function name (free variable)
string overloadName = SqOverloadName::Get(funcName, argCount);
sq_pushstring(vm, overloadName.c_str(), -1);
if(SQ_FAILED(sq_get(vm, 1))) { // Lookup the proper overload
return sq_throwerror(vm, "No overload matching this argument list found");// How to best appropriately error?
}
// Push the args again
for(int i = 1; i <= argCount + 1; ++i) {
sq_push(vm, i);
}
sq_call(vm, argCount + 1, false, ErrorHandling::IsEnabled());
return 0;
}
};
//
// Overload handler resolver
//
template <class R>
inline SQFUNCTION SqOverloadFunc(R (*method)) {
return &SqOverload<R>::Func;
}
template <class C, class R>
inline SQFUNCTION SqOverloadFunc(R (C::*method)) {
return &SqOverload<R>::Func;
}
template <class C, class R>
inline SQFUNCTION SqOverloadFunc(R (C::*method)() const ) {
return &SqOverload<R>::Func;
}
template <class C, class R, class A1>
inline SQFUNCTION SqOverloadFunc(R (C::*method)(A1) const ) {
return &SqOverload<R>::Func;
}
template <class C, class R, class A1, class A2>
inline SQFUNCTION SqOverloadFunc(R (C::*method)(A1, A2) const ) {
return &SqOverload<R>::Func;
}
template <class C, class R, class A1, class A2, class A3>
inline SQFUNCTION SqOverloadFunc(R (C::*method)(A1, A2, A3) const ) {
return &SqOverload<R>::Func;
}
template <class C, class R, class A1, class A2, class A3, class A4>
inline SQFUNCTION SqOverloadFunc(R (C::*method)(A1, A2, A3, A4) const ) {
return &SqOverload<R>::Func;
}
template <class C, class R, class A1, class A2, class A3, class A4, class A5>
inline SQFUNCTION SqOverloadFunc(R (C::*method)(A1, A2, A3, A4, A5) const ) {
return &SqOverload<R>::Func;
}
template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6>
inline SQFUNCTION SqOverloadFunc(R (C::*method)(A1, A2, A3, A4, A5, A6) const ) {
return &SqOverload<R>::Func;
}
template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
inline SQFUNCTION SqOverloadFunc(R (C::*method)(A1, A2, A3, A4, A5, A6, A7) const ) {
return &SqOverload<R>::Func;
}
template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8>
inline SQFUNCTION SqOverloadFunc(R (C::*method)(A1, A2, A3, A4, A5, A6, A7, A8) const ) {
return &SqOverload<R>::Func;
}
template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9>
inline SQFUNCTION SqOverloadFunc(R (C::*method)(A1, A2, A3, A4, A5, A6, A7, A8, A9) const ) {
return &SqOverload<R>::Func;
}
template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10>
inline SQFUNCTION SqOverloadFunc(R (C::*method)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10) const ) {
return &SqOverload<R>::Func;
}
template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11>
inline SQFUNCTION SqOverloadFunc(R (C::*method)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11) const ) {
return &SqOverload<R>::Func;
}
template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11, class A12>
inline SQFUNCTION SqOverloadFunc(R (C::*method)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12) const ) {
return &SqOverload<R>::Func;
}
template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11, class A12, class A13>
inline SQFUNCTION SqOverloadFunc(R (C::*method)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13) const ) {
return &SqOverload<R>::Func;
}
template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11, class A12, class A13, class A14>
inline SQFUNCTION SqOverloadFunc(R (C::*method)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14) const ) {
return &SqOverload<R>::Func;
}
//
// Query argument count
//
// Arg Count 0
template <class R>
inline int SqGetArgCount(R (*method)()) {
return 0;
}
// Arg Count 1
template <class R, class A1>
inline int SqGetArgCount(R (*method)(A1)) {
return 1;
}
// Arg Count 2
template <class R, class A1, class A2>
inline int SqGetArgCount(R (*method)(A1, A2)) {
return 2;
}
// Arg Count 3
template <class R, class A1, class A2, class A3>
inline int SqGetArgCount(R (*method)(A1, A2, A3)) {
return 3;
}
// Arg Count 4
template <class R, class A1, class A2, class A3, class A4>
inline int SqGetArgCount(R (*method)(A1, A2, A3, A4)) {
return 4;
}
// Arg Count 5
template <class R, class A1, class A2, class A3, class A4, class A5>
inline int SqGetArgCount(R (*method)(A1, A2, A3, A4, A5)) {
return 5;
}
// Arg Count 6
template <class R, class A1, class A2, class A3, class A4, class A5, class A6>
inline int SqGetArgCount(R (*method)(A1, A2, A3, A4, A5, A6)) {
return 6;
}
// Arg Count 7
template <class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
inline int SqGetArgCount(R (*method)(A1, A2, A3, A4, A5, A6, A7)) {
return 7;
}
// Arg Count 8
template <class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8>
inline int SqGetArgCount(R (*method)(A1, A2, A3, A4, A5, A6, A7, A8)) {
return 8;
}
// Arg Count 9
template <class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9>
inline int SqGetArgCount(R (*method)(A1, A2, A3, A4, A5, A6, A7, A8, A9)) {
return 9;
}
// Arg Count 10
template <class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10>
inline int SqGetArgCount(R (*method)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10)) {
return 10;
}
// Arg Count 11
template <class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11>
inline int SqGetArgCount(R (*method)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11)) {
return 11;
}
// Arg Count 12
template <class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11, class A12>
inline int SqGetArgCount(R (*method)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12)) {
return 12;
}
// Arg Count 13
template <class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11, class A12, class A13>
inline int SqGetArgCount(R (*method)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13)) {
return 13;
}
// Arg Count 14
template <class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11, class A12, class A13, class A14>
inline int SqGetArgCount(R (*method)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14)) {
return 14;
}
//
// Query member function argument count
//
// Arg Count 0
template <class C, class R>
inline int SqGetArgCount(R (C::*method)()) {
return 0;
}
// Arg Count 1
template <class C, class R, class A1>
inline int SqGetArgCount(R (C::*method)(A1)) {
return 1;
}
// Arg Count 2
template <class C, class R, class A1, class A2>
inline int SqGetArgCount(R (C::*method)(A1, A2)) {
return 2;
}
// Arg Count 3
template <class C, class R, class A1, class A2, class A3>
inline int SqGetArgCount(R (C::*method)(A1, A2, A3)) {
return 3;
}
// Arg Count 4
template <class C, class R, class A1, class A2, class A3, class A4>
inline int SqGetArgCount(R (C::*method)(A1, A2, A3, A4)) {
return 4;
}
// Arg Count 5
template <class C, class R, class A1, class A2, class A3, class A4, class A5>
inline int SqGetArgCount(R (C::*method)(A1, A2, A3, A4, A5)) {
return 5;
}
// Arg Count 6
template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6>
inline int SqGetArgCount(R (C::*method)(A1, A2, A3, A4, A5, A6)) {
return 6;
}
// Arg Count 7
template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
inline int SqGetArgCount(R (C::*method)(A1, A2, A3, A4, A5, A6, A7)) {
return 7;
}
// Arg Count 8
template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8>
inline int SqGetArgCount(R (C::*method)(A1, A2, A3, A4, A5, A6, A7, A8)) {
return 8;
}
// Arg Count 9
template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9>
inline int SqGetArgCount(R (C::*method)(A1, A2, A3, A4, A5, A6, A7, A8, A9)) {
return 9;
}
// Arg Count 10
template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10>
inline int SqGetArgCount(R (C::*method)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10)) {
return 10;
}
// Arg Count 11
template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11>
inline int SqGetArgCount(R (C::*method)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11)) {
return 11;
}
// Arg Count 12
template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11, class A12>
inline int SqGetArgCount(R (C::*method)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12)) {
return 12;
}
// Arg Count 13
template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11, class A12, class A13>
inline int SqGetArgCount(R (C::*method)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13)) {
return 13;
}
// Arg Count 14
template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11, class A12, class A13, class A14>
inline int SqGetArgCount(R (C::*method)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14)) {
return 14;
}
//
// Query const member function argument count
//
// Arg Count 0
template <class C, class R>
inline int SqGetArgCount(R (C::*method)() const) {
return 0;
}
// Arg Count 1
template <class C, class R, class A1>
inline int SqGetArgCount(R (C::*method)(A1) const) {
return 1;
}
// Arg Count 2
template <class C, class R, class A1, class A2>
inline int SqGetArgCount(R (C::*method)(A1, A2) const) {
return 2;
}
// Arg Count 3
template <class C, class R, class A1, class A2, class A3>
inline int SqGetArgCount(R (C::*method)(A1, A2, A3) const) {
return 3;
}
// Arg Count 4
template <class C, class R, class A1, class A2, class A3, class A4>
inline int SqGetArgCount(R (C::*method)(A1, A2, A3, A4) const) {
return 4;
}
// Arg Count 5
template <class C, class R, class A1, class A2, class A3, class A4, class A5>
inline int SqGetArgCount(R (C::*method)(A1, A2, A3, A4, A5) const) {
return 5;
}
// Arg Count 6
template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6>
inline int SqGetArgCount(R (C::*method)(A1, A2, A3, A4, A5, A6) const) {
return 6;
}
// Arg Count 7
template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7>
inline int SqGetArgCount(R (C::*method)(A1, A2, A3, A4, A5, A6, A7) const) {
return 7;
}
// Arg Count 8
template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8>
inline int SqGetArgCount(R (C::*method)(A1, A2, A3, A4, A5, A6, A7, A8) const) {
return 8;
}
// Arg Count 9
template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9>
inline int SqGetArgCount(R (C::*method)(A1, A2, A3, A4, A5, A6, A7, A8, A9) const) {
return 9;
}
// Arg Count 10
template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10>
inline int SqGetArgCount(R (C::*method)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10) const) {
return 10;
}
// Arg Count 11
template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11>
inline int SqGetArgCount(R (C::*method)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11) const) {
return 11;
}
// Arg Count 12
template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11, class A12>
inline int SqGetArgCount(R (C::*method)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12) const) {
return 12;
}
// Arg Count 13
template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11, class A12, class A13>
inline int SqGetArgCount(R (C::*method)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13) const) {
return 13;
}
// Arg Count 14
template <class C, class R, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9, class A10, class A11, class A12, class A13, class A14>
inline int SqGetArgCount(R (C::*method)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14) const) {
return 14;
}
}
#endif

View File

@ -0,0 +1,141 @@
//
// SqratScript: Script Compilation and Execution
//
//
// Copyright (c) 2009 Brandon Jones
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
// claim that you wrote the original software. If you use this software
// in a product, an acknowledgment in the product documentation would be
// appreciated but is not required.
//
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
//
// 3. This notice may not be removed or altered from any source
// distribution.
//
#if !defined(_SCRAT_SCRIPT_H_)
#define _SCRAT_SCRIPT_H_
#include <squirrel.h>
#include <sqstdio.h>
#include <string.h>
#include "sqratObject.h"
namespace Sqrat {
class Script : public Object {
public:
Script(HSQUIRRELVM v = DefaultVM::Get()) : Object(v, false) {
}
~Script()
{
if(!sq_isnull(obj)) {
sq_release(vm, &obj);
}
}
void CompileString(const string& script) {
if(!sq_isnull(obj)) {
sq_release(vm, &obj);
}
if(SQ_FAILED(sq_compilebuffer(vm, script.c_str(), static_cast<SQInteger>(script.size() * sizeof(SQChar)), _SC(""), true))) {
throw Exception(LastErrorString(vm));
}
sq_getstackobj(vm,-1,&obj);
sq_addref(vm, &obj);
sq_pop(vm, 1);
}
bool CompileString(const string& script, string& errMsg) {
if(!sq_isnull(obj)) {
sq_release(vm, &obj);
}
if(SQ_FAILED(sq_compilebuffer(vm, script.c_str(), static_cast<SQInteger>(script.size() * sizeof(SQChar)), _SC(""), true))) {
errMsg = LastErrorString(vm);
return false;
}
sq_getstackobj(vm,-1,&obj);
sq_addref(vm, &obj);
sq_pop(vm, 1);
return true;
}
void CompileFile(const string& path) {
if(!sq_isnull(obj)) {
sq_release(vm, &obj);
}
if(SQ_FAILED(sqstd_loadfile(vm, path.c_str(), true))) {
throw Exception(LastErrorString(vm));
}
sq_getstackobj(vm,-1,&obj);
sq_addref(vm, &obj);
sq_pop(vm, 1);
}
bool CompileFile(const string& path, string& errMsg) {
if(!sq_isnull(obj)) {
sq_release(vm, &obj);
}
if(SQ_FAILED(sqstd_loadfile(vm, path.c_str(), true))) {
errMsg = LastErrorString(vm);
return false;
}
sq_getstackobj(vm,-1,&obj);
sq_addref(vm, &obj);
sq_pop(vm, 1);
return true;
}
void Run() {
if(!sq_isnull(obj)) {
SQRESULT result;
sq_pushobject(vm, obj);
sq_pushroottable(vm);
result = sq_call(vm, 1, false, true);
sq_pop(vm, 1);
if(SQ_FAILED(result)) {
throw Exception(LastErrorString(vm));
}
}
}
bool Run(string& errMsg) {
if(!sq_isnull(obj)) {
SQRESULT result;
sq_pushobject(vm, obj);
sq_pushroottable(vm);
result = sq_call(vm, 1, false, true);
sq_pop(vm, 1);
if(SQ_FAILED(result)) {
errMsg = LastErrorString(vm);
return false;
}
}
return true;
}
void WriteCompiledFile(const string& path) {
if(!sq_isnull(obj)) {
sq_pushobject(vm, obj);
sqstd_writeclosuretofile(vm, path.c_str());
//sq_pop(vm, 1); // needed?
}
}
};
}
#endif

View File

@ -0,0 +1,162 @@
//
// SqratTable: Table Binding
//
//
// Copyright (c) 2009 Brandon Jones
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
// claim that you wrote the original software. If you use this software
// in a product, an acknowledgment in the product documentation would be
// appreciated but is not required.
//
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
//
// 3. This notice may not be removed or altered from any source
// distribution.
//
#if !defined(_SCRAT_TABLE_H_)
#define _SCRAT_TABLE_H_
#include <squirrel.h>
#include <string.h>
#include "sqratObject.h"
#include "sqratFunction.h"
#include "sqratGlobalMethods.h"
namespace Sqrat {
class TableBase : public Object {
public:
TableBase(HSQUIRRELVM v = DefaultVM::Get()) : Object(v, true) {
}
TableBase(const Object& obj) : Object(obj) {
}
// Bind a Table or Class to the Table (Can be used to facilitate Namespaces)
// Note: Bind cannot be called "inline" like other functions because it introduces order-of-initialization bugs.
void Bind(const SQChar* name, Object& obj) {
sq_pushobject(vm, GetObject());
sq_pushstring(vm, name, -1);
sq_pushobject(vm, obj.GetObject());
sq_newslot(vm, -3, false);
sq_pop(vm,1); // pop table
}
// Bind a raw Squirrel closure to the Table
TableBase& SquirrelFunc(const SQChar* name, SQFUNCTION func) {
sq_pushobject(vm, GetObject());
sq_pushstring(vm, name, -1);
sq_newclosure(vm, func, 0);
sq_newslot(vm, -3, false);
sq_pop(vm,1); // pop table
return *this;
}
//
// Variable Binding
//
template<class V>
TableBase& SetValue(const SQChar* name, const V& val) {
BindValue<V>(name, val, false);
return *this;
}
template<class V>
TableBase& SetValue(const SQInteger index, const V& val) {
BindValue<V>(index, val, false);
return *this;
}
template<class V>
TableBase& SetInstance(const SQChar* name, V* val) {
BindInstance<V>(name, val, false);
return *this;
}
template<class F>
TableBase& Func(const SQChar* name, F method) {
BindFunc(name, &method, sizeof(method), SqGlobalFunc(method));
return *this;
}
template<class F>
TableBase& Overload(const SQChar* name, F method) {
BindOverload(name, &method, sizeof(method), SqGlobalFunc(method), SqOverloadFunc(method), SqGetArgCount(method));
return *this;
}
//
// Function Calls
//
Function GetFunction(const SQChar* name) {
HSQOBJECT funcObj;
sq_pushobject(vm, GetObject());
sq_pushstring(vm, name, -1);
if(SQ_FAILED(sq_get(vm, -2))) {
sq_pushnull(vm);
}
sq_getstackobj(vm, -1, &funcObj);
Function ret(vm, GetObject(), funcObj); // must addref before the pop!
sq_pop(vm, 2);
return ret;
}
Function GetFunction(const SQInteger index) {
HSQOBJECT funcObj;
sq_pushobject(vm, GetObject());
sq_pushinteger(vm, index);
if(SQ_FAILED(sq_get(vm, -2))) {
sq_pushnull(vm);
}
sq_getstackobj(vm, -1, &funcObj);
Function ret(vm, GetObject(), funcObj);
sq_pop(vm, 2);
return ret;
}
};
class Table : public TableBase {
public:
Table(HSQUIRRELVM v = DefaultVM::Get()) : TableBase(v) {
sq_newtable(vm);
sq_getstackobj(vm,-1,&obj);
sq_addref(vm, &obj);
sq_pop(vm,1);
}
Table(const Object& obj) : TableBase(obj) {
}
};
//
// Root Table
//
class RootTable : public TableBase {
public:
RootTable(HSQUIRRELVM v = DefaultVM::Get()) : TableBase(v) {
sq_pushroottable(vm);
sq_getstackobj(vm,-1,&obj);
sq_addref(vm, &obj);
sq_pop(v,1); // pop root table
}
};
}
#endif

View File

@ -0,0 +1,341 @@
//
// SqratTypes: Type Translators
//
//
// Copyright (c) 2009 Brandon Jones
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
// claim that you wrote the original software. If you use this software
// in a product, an acknowledgment in the product documentation would be
// appreciated but is not required.
//
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
//
// 3. This notice may not be removed or altered from any source
// distribution.
//
#if !defined(_SCRAT_TYPES_H_)
#define _SCRAT_TYPES_H_
#include <squirrel.h>
#include <string>
#include "sqratClassType.h"
namespace Sqrat {
//
// Variable Accessors
//
// Generic classes
template<class T>
struct Var {
T value;
Var(HSQUIRRELVM vm, SQInteger idx) {
value = *ClassType<T>::GetInstance(vm, idx);
}
static void push(HSQUIRRELVM vm, T value) {
ClassType<T>::PushInstanceCopy(vm, value);
}
};
template<class T>
struct Var<T&> {
T value;
Var(HSQUIRRELVM vm, SQInteger idx) {
value = *ClassType<T>::GetInstance(vm, idx);
}
static void push(HSQUIRRELVM vm, T value) {
ClassType<T>::PushInstanceCopy(vm, value);
}
};
template<class T>
struct Var<T*> {
T* value;
Var(HSQUIRRELVM vm, SQInteger idx) {
value = ClassType<T>::GetInstance(vm, idx);
}
static void push(HSQUIRRELVM vm, T* value) {
ClassType<T>::PushInstance(vm, value);
}
};
template<class T>
struct Var<const T&> {
T value;
Var(HSQUIRRELVM vm, SQInteger idx) {
value = *ClassType<T>::GetInstance(vm, idx);
}
static void push(HSQUIRRELVM vm, T value) {
ClassType<T>::PushInstanceCopy(vm, value);
}
};
template<class T>
struct Var<const T*> {
T* value;
Var(HSQUIRRELVM vm, SQInteger idx) {
value = ClassType<T>::GetInstance(vm, idx);
}
static void push(HSQUIRRELVM vm, T* value) {
ClassType<T>::PushInstance(vm, value);
}
};
// Integer Types
#define SCRAT_INTEGER( type ) \
template<> \
struct Var<type> { \
type value; \
Var(HSQUIRRELVM vm, SQInteger idx) { \
SQInteger sqValue; \
sq_getinteger(vm, idx, &sqValue); \
value = static_cast<type>(sqValue); \
} \
static void push(HSQUIRRELVM vm, type& value) { \
sq_pushinteger(vm, static_cast<SQInteger>(value)); \
} \
};\
\
template<> \
struct Var<const type> { \
type value; \
Var(HSQUIRRELVM vm, SQInteger idx) { \
SQInteger sqValue; \
sq_getinteger(vm, idx, &sqValue); \
value = static_cast<type>(sqValue); \
} \
static void push(HSQUIRRELVM vm, const type& value) { \
sq_pushinteger(vm, static_cast<SQInteger>(value)); \
} \
}; \
\
template<> \
struct Var<const type&> { \
type value; \
Var(HSQUIRRELVM vm, SQInteger idx) { \
SQInteger sqValue; \
sq_getinteger(vm, idx, &sqValue); \
value = static_cast<type>(sqValue); \
} \
static void push(HSQUIRRELVM vm, const type& value) { \
sq_pushinteger(vm, static_cast<SQInteger>(value)); \
} \
};
SCRAT_INTEGER(unsigned int)
SCRAT_INTEGER(signed int)
SCRAT_INTEGER(unsigned long)
SCRAT_INTEGER(signed long)
SCRAT_INTEGER(unsigned short)
SCRAT_INTEGER(signed short)
#if defined(__int64)
SCRAT_INTEGER(unsigned __int64)
SCRAT_INTEGER(signed __int64)
#endif
// Float Types
#define SCRAT_FLOAT( type ) \
template<> \
struct Var<type> { \
type value; \
Var(HSQUIRRELVM vm, SQInteger idx) { \
SQFloat sqValue; \
sq_getfloat(vm, idx, &sqValue); \
value = static_cast<type>(sqValue); \
} \
static void push(HSQUIRRELVM vm, type& value) { \
sq_pushfloat(vm, static_cast<SQFloat>(value)); \
} \
}; \
\
template<> \
struct Var<const type> { \
type value; \
Var(HSQUIRRELVM vm, SQInteger idx) { \
SQFloat sqValue; \
sq_getfloat(vm, idx, &sqValue); \
value = static_cast<type>(sqValue); \
} \
static void push(HSQUIRRELVM vm, const type& value) { \
sq_pushfloat(vm, static_cast<SQFloat>(value)); \
} \
}; \
template<> \
struct Var<const type&> { \
type value; \
Var(HSQUIRRELVM vm, SQInteger idx) { \
SQFloat sqValue; \
sq_getfloat(vm, idx, &sqValue); \
value = static_cast<type>(sqValue); \
} \
static void push(HSQUIRRELVM vm, const type& value) { \
sq_pushfloat(vm, static_cast<SQFloat>(value)); \
} \
};
SCRAT_FLOAT(float)
SCRAT_FLOAT(double)
// Boolean Types
template<>
struct Var<bool> {
bool value;
Var(HSQUIRRELVM vm, SQInteger idx) {
SQBool sqValue;
sq_tobool(vm, idx, &sqValue);
value = (sqValue != 0);
}
static void push(HSQUIRRELVM vm, bool& value) {
sq_pushbool(vm, static_cast<SQBool>(value));
}
};
template<>
struct Var<const bool> {
bool value;
Var(HSQUIRRELVM vm, SQInteger idx) {
SQBool sqValue;
sq_tobool(vm, idx, &sqValue);
value = (sqValue != 0);
}
static void push(HSQUIRRELVM vm, const bool& value) {
sq_pushbool(vm, static_cast<SQBool>(value));
}
};
template<>
struct Var<const bool&> {
bool value;
Var(HSQUIRRELVM vm, SQInteger idx) {
SQBool sqValue;
sq_tobool(vm, idx, &sqValue);
value = (sqValue != 0);
}
static void push(HSQUIRRELVM vm, const bool& value) {
sq_pushbool(vm, static_cast<SQBool>(value));
}
};
// String Types
typedef std::basic_string<SQChar> string;
template<>
struct Var<SQChar*> {
SQChar* value;
HSQOBJECT obj;/* hold a reference to the object holding value during the Var struct lifetime*/
HSQUIRRELVM v;
Var(HSQUIRRELVM vm, SQInteger idx) {
sq_tostring(vm, idx);
sq_getstackobj(vm, -1, &obj);
sq_getstring(vm, -1, (const SQChar**)&value);
sq_addref(vm, &obj);
sq_pop(vm,1);
v = vm;
}
~Var()
{
if(v && !sq_isnull(obj)) {
sq_release(v, &obj);
}
}
static void push(HSQUIRRELVM vm, SQChar* value) {
sq_pushstring(vm, value, -1);
}
};
template<>
struct Var<const SQChar*> {
const SQChar* value;
HSQOBJECT obj; /* hold a reference to the object holding value during the Var struct lifetime*/
HSQUIRRELVM v;
Var(HSQUIRRELVM vm, SQInteger idx) {
sq_tostring(vm, idx);
sq_getstackobj(vm, -1, &obj);
sq_getstring(vm, -1, &value);
sq_addref(vm, &obj);
sq_pop(vm,1);
v = vm;
}
~Var()
{
if(v && !sq_isnull(obj)) {
sq_release(v, &obj);
}
}
static void push(HSQUIRRELVM vm, const SQChar* value) {
sq_pushstring(vm, value, -1);
}
};
template<>
struct Var<string> {
string value;
Var(HSQUIRRELVM vm, SQInteger idx) {
const SQChar* ret;
sq_tostring(vm, idx);
sq_getstring(vm, -1, &ret);
value = string(ret);
sq_pop(vm,1);
}
static void push(HSQUIRRELVM vm, string value) {
sq_pushstring(vm, value.c_str(), -1);
}
};
template<>
struct Var<string&> {
string value;
Var(HSQUIRRELVM vm, SQInteger idx) {
const SQChar* ret;
sq_tostring(vm, idx);
sq_getstring(vm, -1, &ret);
value = string(ret);
sq_pop(vm,1);
}
static void push(HSQUIRRELVM vm, string value) {
sq_pushstring(vm, value.c_str(), -1);
}
};
template<>
struct Var<const string&> {
string value;
Var(HSQUIRRELVM vm, SQInteger idx) {
const SQChar* ret;
sq_tostring(vm, idx);
sq_getstring(vm, -1, &ret);
value = string(ret);
sq_pop(vm,1);
}
static void push(HSQUIRRELVM vm, string value) {
sq_pushstring(vm, value.c_str(), -1);
}
};
//
// Variable Accessors
//
// Push
template<class T>
inline void PushVar(HSQUIRRELVM vm, T value) {
Var<T>::push(vm, value);
}
}
#endif

View File

@ -0,0 +1,94 @@
//
// SqratUtil: Squirrel Utilities
//
//
// Copyright (c) 2009 Brandon Jones
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
// claim that you wrote the original software. If you use this software
// in a product, an acknowledgment in the product documentation would be
// appreciated but is not required.
//
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
//
// 3. This notice may not be removed or altered from any source
// distribution.
//
#if !defined(_SCRAT_UTIL_H_)
#define _SCRAT_UTIL_H_
#include <squirrel.h>
#include <string.h>
#include "sqratTypes.h"
namespace Sqrat {
class DefaultVM {
private:
static HSQUIRRELVM& staticVm() {
static HSQUIRRELVM vm;
return vm;
}
public:
static HSQUIRRELVM Get() {
return staticVm();
}
static void Set(HSQUIRRELVM vm) {
staticVm() = vm;
}
};
class ErrorHandling {
private:
static bool& errorHandling() {
static bool eh = true;
return eh;
}
public:
static bool IsEnabled() {
return errorHandling();
}
static void Enable(bool enable) {
errorHandling() = enable;
}
};
class Exception {
public:
Exception(const string& msg) : message(msg) {}
Exception(const Exception& ex) : message(ex.message) {}
const string Message() const {
return message;
}
private:
string message;
};
inline string LastErrorString( HSQUIRRELVM vm ) {
const SQChar* sqErr;
sq_getlasterror(vm);
if(sq_gettype(vm, -1) == OT_NULL) {
return string();
}
sq_tostring(vm, -1);
sq_getstring(vm, -1, &sqErr);
return string(sqErr);
}
}
#endif

View File

@ -0,0 +1,255 @@
// wrapper for the Squirrel VM under Sqrat
//
// Copyright (c) 2011 Alston Chen
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
// claim that you wrote the original software. If you use this software
// in a product, an acknowledgment in the product documentation would be
// appreciated but is not required.
//
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
//
// 3. This notice may not be removed or altered from any source
// distribution.
//
//
#if !defined(_SCRAT_VM_H_)
#define _SCRAT_VM_H_
#include <squirrel.h>
#include <sqrat.h>
#include <map>
#include <iostream>
#include <stdarg.h>
#include <sqstdio.h>
#include <sqstdblob.h>
#include <sqstdmath.h>
#include <sqstdsystem.h>
#include <sqstdstring.h>
namespace Sqrat {
class SqratVM
{
private:
static std::map<HSQUIRRELVM, SqratVM*> ms_sqratVMs;
static void s_addVM(HSQUIRRELVM vm, SqratVM* sqratvm);
static void s_deleteVM(HSQUIRRELVM vm);
static SqratVM* s_getVM(HSQUIRRELVM vm);
HSQUIRRELVM m_vm;
Sqrat::RootTable* m_rootTable;
Sqrat::Script* m_script;
Sqrat::string m_lastErrorMsg;
private:
static void printFunc(HSQUIRRELVM v, const SQChar *s, ...);
static SQInteger runtimeErrorHandler(HSQUIRRELVM v);
static void compilerErrorHandler(HSQUIRRELVM v,
const SQChar* desc,
const SQChar* source,
SQInteger line,
SQInteger column);
public:
enum ERROR_STATE
{
NO_ERROR, COMPILE_ERROR, RUNTIME_ERROR
};
SqratVM(int initialStackSize = 1024);
~SqratVM();
HSQUIRRELVM getVM() { return m_vm; }
Sqrat::RootTable& getRootTable() { return *m_rootTable; }
Sqrat::Script& getScript() { return *m_script; }
Sqrat::string getLastErrorMsg() { return m_lastErrorMsg; }
void setLastErrorMsg(const Sqrat::string& str) { m_lastErrorMsg = str; }
void setPrintFunc(SQPRINTFUNCTION printFunc, SQPRINTFUNCTION errFunc);
void setErrorHandler(SQFUNCTION runErr, SQCOMPILERERROR comErr);
ERROR_STATE doString(const Sqrat::string& str);
ERROR_STATE doFile(const Sqrat::string& file);
};
#ifdef SQUNICODE
#define scvprintf vwprintf
#else
#define scvprintf vprintf
#endif
std::map<HSQUIRRELVM, SqratVM*> SqratVM::ms_sqratVMs;
void SqratVM::s_addVM(HSQUIRRELVM vm, SqratVM* sqratvm)
{
//TODO: use mutex to lock ms_sqratVMs
ms_sqratVMs.insert(std::make_pair(vm, sqratvm));
}
void SqratVM::s_deleteVM(HSQUIRRELVM vm)
{
//TODO: use mutex to lock ms_sqratVMs
ms_sqratVMs.erase(vm);
}
SqratVM* SqratVM::s_getVM(HSQUIRRELVM vm)
{
//TODO: use mutex to lock ms_sqratVMs
return ms_sqratVMs[vm];
}
void SqratVM::printFunc(HSQUIRRELVM v, const SQChar *s, ...)
{
va_list vl;
va_start(vl, s);
scvprintf(s, vl);
va_end(vl);
}
SQInteger SqratVM::runtimeErrorHandler(HSQUIRRELVM v)
{
const SQChar *sErr = 0;
if(sq_gettop(v) >= 1)
{
Sqrat::string& errStr = s_getVM(v)->m_lastErrorMsg;
if(SQ_SUCCEEDED(sq_getstring(v, 2, &sErr)))
{
//scprintf(_SC("RuntimeError: %s\n"), sErr);
//errStr = _SC("RuntimeError: ") + sErr;
errStr = sErr;
}
else
{
//scprintf(_SC("An Unknown RuntimeError Occured.\n"));
errStr = _SC("An Unknown RuntimeError Occured.");
}
}
return 0;
}
void SqratVM::compilerErrorHandler(HSQUIRRELVM v,
const SQChar* desc,
const SQChar* source,
SQInteger line,
SQInteger column)
{
//scprintf(_SC("%s(%d:%d): %s\n"), source, line, column, desc);
SQChar buf[512];
scsprintf(buf, _SC("%s(%d:%d): %s"), source, line, column, desc);
s_getVM(v)->m_lastErrorMsg = buf;
}
SqratVM::SqratVM(int initialStackSize /* = 1024 */)
: m_vm(sq_open(initialStackSize))
, m_rootTable(new Sqrat::RootTable(m_vm))
, m_script(new Sqrat::Script(m_vm))
, m_lastErrorMsg()
{
s_addVM(m_vm, this);
//register std libs
sq_pushroottable(m_vm);
sqstd_register_iolib(m_vm);
sqstd_register_bloblib(m_vm);
sqstd_register_mathlib(m_vm);
sqstd_register_systemlib(m_vm);
sqstd_register_stringlib(m_vm);
sq_pop(m_vm, 1);
setPrintFunc(printFunc, printFunc);
setErrorHandler(runtimeErrorHandler, compilerErrorHandler);
}
SqratVM::~SqratVM()
{
s_deleteVM(m_vm);
delete m_script;
delete m_rootTable;
sq_close(m_vm);
}
void SqratVM::setPrintFunc(SQPRINTFUNCTION printFunc, SQPRINTFUNCTION errFunc)
{
sq_setprintfunc(m_vm, printFunc, errFunc);
}
void SqratVM::setErrorHandler(SQFUNCTION runErr, SQCOMPILERERROR comErr)
{
sq_newclosure(m_vm, runErr, 0);
sq_seterrorhandler(m_vm);
sq_setcompilererrorhandler(m_vm, comErr);
}
SqratVM::ERROR_STATE SqratVM::doString(const Sqrat::string& str)
{
Sqrat::string msg;
m_lastErrorMsg.clear();
if(!m_script->CompileString(str, msg))
{
if(m_lastErrorMsg.empty())
{
m_lastErrorMsg = msg;
}
return COMPILE_ERROR;
}
if(!m_script->Run(msg))
{
if(m_lastErrorMsg.empty())
{
m_lastErrorMsg = msg;
}
return RUNTIME_ERROR;
}
return NO_ERROR;
}
SqratVM::ERROR_STATE SqratVM::doFile(const Sqrat::string& file)
{
Sqrat::string msg;
m_lastErrorMsg.clear();
if(!m_script->CompileFile(file, msg))
{
if(m_lastErrorMsg.empty())
{
m_lastErrorMsg = msg;
}
return COMPILE_ERROR;
}
if(!m_script->Run(msg))
{
if(m_lastErrorMsg.empty())
{
m_lastErrorMsg = msg;
}
return RUNTIME_ERROR;
}
return NO_ERROR;
}
}
#endif

View File

@ -0,0 +1,45 @@
//
// SqImport: Supports importing of squirrel modules
//
//
// Copyright (c) 2009 Brandon Jones
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
// claim that you wrote the original software. If you use this software
// in a product, an acknowledgment in the product documentation would be
// appreciated but is not required.
//
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
//
// 3. This notice may not be removed or altered from any source
// distribution.
//
#if !defined(_SQ_IMPORT_H_)
#define _SQ_IMPORT_H_
#include <squirrel.h>
#ifdef __cplusplus
extern "C" {
#endif
SQUIRREL_API SQRESULT sqrat_import(HSQUIRRELVM v);
SQUIRREL_API SQRESULT sqrat_register_importlib(HSQUIRRELVM v);
#ifdef __cplusplus
} /*extern "C"*/
#endif
#endif /*_SQ_IMPORT_H_*/