Commits

rude committed 27da708

Say hello to the love module. Oh my!

Because technically, it *is* a module. Also renamed "launcher.cpp".

  • Participants
  • Parent commits 73f4863

Comments (0)

Files changed (11)

File platform/msvc2010/liblove.vcxproj

     <ClCompile Include="..\..\src\libraries\luasocket\libluasocket\udp.c" />
     <ClCompile Include="..\..\src\libraries\luasocket\libluasocket\wsocket.c" />
     <ClCompile Include="..\..\src\libraries\luasocket\luasocket.cpp" />
-    <ClCompile Include="..\..\src\love.cpp" />
     <ClCompile Include="..\..\src\modules\audio\Audio.cpp" />
     <ClCompile Include="..\..\src\modules\audio\null\Audio.cpp" />
     <ClCompile Include="..\..\src\modules\audio\null\Source.cpp" />
     <ClCompile Include="..\..\src\modules\keyboard\Keyboard.cpp" />
     <ClCompile Include="..\..\src\modules\keyboard\sdl\Keyboard.cpp" />
     <ClCompile Include="..\..\src\modules\keyboard\wrap_Keyboard.cpp" />
+    <ClCompile Include="..\..\src\modules\love\love.cpp" />
     <ClCompile Include="..\..\src\modules\mouse\Mouse.cpp" />
     <ClCompile Include="..\..\src\modules\mouse\sdl\Mouse.cpp" />
     <ClCompile Include="..\..\src\modules\mouse\wrap_Mouse.cpp" />
     <ClInclude Include="..\..\src\modules\keyboard\Keyboard.h" />
     <ClInclude Include="..\..\src\modules\keyboard\sdl\Keyboard.h" />
     <ClInclude Include="..\..\src\modules\keyboard\wrap_Keyboard.h" />
+    <ClInclude Include="..\..\src\modules\love\love.h" />
     <ClInclude Include="..\..\src\modules\mouse\Mouse.h" />
     <ClInclude Include="..\..\src\modules\mouse\sdl\Mouse.h" />
     <ClInclude Include="..\..\src\modules\mouse\wrap_Mouse.h" />

File platform/msvc2010/liblove.vcxproj.filters

     <Filter Include="modules\window\sdl">
       <UniqueIdentifier>{d46cbbf1-a76f-4401-83d4-1f20492f9889}</UniqueIdentifier>
     </Filter>
+    <Filter Include="modules\love">
+      <UniqueIdentifier>{5fb201c1-9b39-48ca-8334-6862da260b43}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
-    <ClCompile Include="..\..\src\love.cpp" />
     <ClCompile Include="..\..\src\common\Matrix.cpp">
       <Filter>common</Filter>
     </ClCompile>
     <ClCompile Include="..\..\src\modules\window\sdl\Window.cpp">
       <Filter>modules\window\sdl</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\src\modules\love\love.cpp">
+      <Filter>modules\love</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <None Include="..\..\src\scripts\boot.lua">
     <ClInclude Include="..\..\src\modules\window\sdl\Window.h">
       <Filter>modules\window\sdl</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\src\modules\love\love.h">
+      <Filter>modules\love</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ResourceCompile Include="love.rc" />

File platform/msvc2010/love.sln

 
 Microsoft Visual Studio Solution File, Format Version 11.00
 # Visual C++ Express 2010
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "love", "love.vcxproj", "{B496CCF6-9B6D-0794-8F41-67A6EC86B4AA}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "love", "love.vcxproj", "{0078B97A-F6DB-E014-BED9-BE378D93CEA4}"
 	ProjectSection(ProjectDependencies) = postProject
 		{A3FCC735-3E18-4D6B-9DA9-01D9E910B7F8} = {A3FCC735-3E18-4D6B-9DA9-01D9E910B7F8}
 	EndProjectSection
 		Release Static|x64 = Release Static|x64
 	EndGlobalSection
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{B496CCF6-9B6D-0794-8F41-67A6EC86B4AA}.Debug Dynamic|Win32.ActiveCfg = Debug Dynamic|Win32
-		{B496CCF6-9B6D-0794-8F41-67A6EC86B4AA}.Debug Dynamic|Win32.Build.0 = Debug Dynamic|Win32
-		{B496CCF6-9B6D-0794-8F41-67A6EC86B4AA}.Debug Dynamic|x64.ActiveCfg = Debug Dynamic|x64
-		{B496CCF6-9B6D-0794-8F41-67A6EC86B4AA}.Release Dynamic|Win32.ActiveCfg = Release Dynamic|Win32
-		{B496CCF6-9B6D-0794-8F41-67A6EC86B4AA}.Release Dynamic|Win32.Build.0 = Release Dynamic|Win32
-		{B496CCF6-9B6D-0794-8F41-67A6EC86B4AA}.Release Dynamic|x64.ActiveCfg = Release Dynamic|x64
-		{B496CCF6-9B6D-0794-8F41-67A6EC86B4AA}.Release Dynamic|x64.Build.0 = Release Dynamic|x64
-		{B496CCF6-9B6D-0794-8F41-67A6EC86B4AA}.Release Static|Win32.ActiveCfg = Release Static|Win32
-		{B496CCF6-9B6D-0794-8F41-67A6EC86B4AA}.Release Static|Win32.Build.0 = Release Static|Win32
-		{B496CCF6-9B6D-0794-8F41-67A6EC86B4AA}.Release Static|x64.ActiveCfg = Release Static|x64
-		{B496CCF6-9B6D-0794-8F41-67A6EC86B4AA}.Release Static|x64.Build.0 = Release Static|x64
+		{0078B97A-F6DB-E014-BED9-BE378D93CEA4}.Debug Dynamic|Win32.ActiveCfg = Debug Dynamic|Win32
+		{0078B97A-F6DB-E014-BED9-BE378D93CEA4}.Debug Dynamic|Win32.Build.0 = Debug Dynamic|Win32
+		{0078B97A-F6DB-E014-BED9-BE378D93CEA4}.Debug Dynamic|x64.ActiveCfg = Debug Dynamic|x64
+		{0078B97A-F6DB-E014-BED9-BE378D93CEA4}.Release Dynamic|Win32.ActiveCfg = Release Dynamic|Win32
+		{0078B97A-F6DB-E014-BED9-BE378D93CEA4}.Release Dynamic|Win32.Build.0 = Release Dynamic|Win32
+		{0078B97A-F6DB-E014-BED9-BE378D93CEA4}.Release Dynamic|x64.ActiveCfg = Release Dynamic|x64
+		{0078B97A-F6DB-E014-BED9-BE378D93CEA4}.Release Dynamic|x64.Build.0 = Release Dynamic|x64
+		{0078B97A-F6DB-E014-BED9-BE378D93CEA4}.Release Static|Win32.ActiveCfg = Release Static|Win32
+		{0078B97A-F6DB-E014-BED9-BE378D93CEA4}.Release Static|Win32.Build.0 = Release Static|Win32
+		{0078B97A-F6DB-E014-BED9-BE378D93CEA4}.Release Static|x64.ActiveCfg = Release Static|x64
+		{0078B97A-F6DB-E014-BED9-BE378D93CEA4}.Release Static|x64.Build.0 = Release Static|x64
 		{A3FCC735-3E18-4D6B-9DA9-01D9E910B7F8}.Debug Dynamic|Win32.ActiveCfg = Debug Dynamic|Win32
 		{A3FCC735-3E18-4D6B-9DA9-01D9E910B7F8}.Debug Dynamic|Win32.Build.0 = Debug Dynamic|Win32
 		{A3FCC735-3E18-4D6B-9DA9-01D9E910B7F8}.Debug Dynamic|x64.ActiveCfg = Debug Dynamic|x64

File platform/msvc2010/love.vcxproj

     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
-    <ClCompile Include="..\..\src\launcher.cpp" />
-  </ItemGroup>
-  <ItemGroup>
     <ResourceCompile Include="love.rc" />
   </ItemGroup>
   <ItemGroup>
       <UseLibraryDependencyInputs>false</UseLibraryDependencyInputs>
     </ProjectReference>
   </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="..\..\src\love.cpp" />
+  </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
   </ImportGroup>

File platform/msvc2010/love.vcxproj.filters

 <?xml version="1.0" encoding="utf-8"?>
 <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <ItemGroup>
-    <ClCompile Include="..\..\src\launcher.cpp" />
+    <ResourceCompile Include="love.rc" />
   </ItemGroup>
   <ItemGroup>
-    <ResourceCompile Include="love.rc" />
+    <ClCompile Include="..\..\src\love.cpp" />
   </ItemGroup>
 </Project>

File platform/unix/exclude

 ./modules/thread/sdl/*
 ./modules/thread/win32/*
 ./modules/thread/posix/*
-./launcher.cpp
+./love.cpp

File platform/unix/gen-makefile

 bin_PROGRAMS = love
 #love_LDFLAGS =
 love_LDADD = liblove.la
-love_SOURCES = launcher.cpp
+love_SOURCES = love.cpp
 
 # libLÖVE
 lib_LTLIBRARIES = liblove.la

File src/launcher.cpp

-/**
- * Copyright (c) 2006-2012 LOVE Development Team
- *
- * 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.
- **/
-
-#include "common/config.h"
-#include <SDL.h>
-
-extern "C"
-{
-	extern int lovemain(int argc, char **argv);
-}
-
-#ifdef LOVE_BUILD_EXE
-int main(int argc, char **argv)
-{
-	return lovemain(argc, argv);
-}
-#endif // LOVE_BUILD_EXE

File src/love.cpp

  * 3. This notice may not be removed or altered from any source distribution.
  **/
 
-// LOVE
-#include "common/config.h"
-#include "common/version.h"
-#include "common/runtime.h"
+#include "modules/love/love.h"
+#include <SDL.h>
+
+#ifdef LOVE_BUILD_EXE
+
+// Lua
+extern "C" {
+	#include <lua.h>
+	#include <lualib.h>
+	#include <lauxlib.h>
+}
 
 #ifdef LOVE_WINDOWS
 #include <windows.h>
 #endif // LOVE_WINDOWS
 
-#ifdef LOVE_LEGENDARY_CONSOLE_IO_HACK
-#include <fcntl.h>
-#include <io.h>
-#include <iostream>
-#include <fstream>
-#endif // LOVE_LEGENDARY_CONSOLE_IO_HACK
-
-#ifdef LOVE_BUILD_EXE
-
-// SDL
-#include <SDL.h>
-
-// Libraries.
-#include "libraries/luasocket/luasocket.h"
-
-// Scripts
-#include "scripts/boot.lua.h"
-
-#endif // LOVE_BUILD_EXE
-
-#ifdef LOVE_BUILD_STANDALONE
-
-// All modules define a c-accessible luaopen
-// so let's make use of those, instead
-// of addressing implementations directly.
-extern "C"
-{
-	extern int luaopen_love_audio(lua_State*);
-	extern int luaopen_love_event(lua_State*);
-	extern int luaopen_love_filesystem(lua_State*);
-	extern int luaopen_love_font(lua_State*);
-	extern int luaopen_love_graphics(lua_State*);
-	extern int luaopen_love_image(lua_State*);
-	extern int luaopen_love_joystick(lua_State*);
-	extern int luaopen_love_keyboard(lua_State*);
-	extern int luaopen_love_mouse(lua_State*);
-	extern int luaopen_love_physics(lua_State*);
-	extern int luaopen_love_sound(lua_State*);
-	extern int luaopen_love_timer(lua_State*);
-	extern int luaopen_love_thread(lua_State*);
-	extern int luaopen_love_boot(lua_State*);
-}
-
-static const luaL_Reg modules[] = {
-	{ "love.audio", luaopen_love_audio },
-	{ "love.event", luaopen_love_event },
-	{ "love.filesystem", luaopen_love_filesystem },
-	{ "love.font", luaopen_love_font },
-	{ "love.graphics", luaopen_love_graphics },
-	{ "love.image", luaopen_love_image },
-	{ "love.joystick", luaopen_love_joystick },
-	{ "love.keyboard", luaopen_love_keyboard },
-	{ "love.mouse", luaopen_love_mouse },
-	{ "love.physics", luaopen_love_physics },
-	{ "love.sound", luaopen_love_sound },
-	{ "love.timer", luaopen_love_timer },
-	{ "love.thread", luaopen_love_thread },
-	{ "love.boot", luaopen_love_boot },
-	{ 0, 0 }
-};
-
-#endif // LOVE_BUILD_STANDALONE
-
-#ifdef LOVE_LEGENDARY_CONSOLE_IO_HACK
-int w__openConsole(lua_State * L);
-#endif // LOVE_LEGENDARY_CONSOLE_IO_HACK
-
-extern "C" LOVE_EXPORT int luaopen_love(lua_State * L)
-{
-	love::luax_insistglobal(L, "love");
-
-	// Set version information.
-	lua_pushstring(L, love::VERSION);
-	lua_setfield(L, -2, "_version");
-
-	lua_pushnumber(L, love::VERSION_MAJOR);
-	lua_setfield(L, -2, "_version_major");
-	lua_pushnumber(L, love::VERSION_MINOR);
-	lua_setfield(L, -2, "_version_minor");
-	lua_pushnumber(L, love::VERSION_REV);
-	lua_setfield(L, -2, "_version_revision");
-
-	lua_pushstring(L, love::VERSION_CODENAME);
-	lua_setfield(L, -2, "_version_codename");
-
-#ifdef LOVE_LEGENDARY_CONSOLE_IO_HACK
-	lua_pushcfunction(L, w__openConsole);
-	lua_setfield(L, -2, "_openConsole");
-#endif // LOVE_LEGENDARY_CONSOLE_IO_HACK
-
-	lua_newtable(L);
-
-	for (int i = 0; love::VERSION_COMPATIBILITY[i] != 0; ++i)
-	{
-		lua_pushstring(L, love::VERSION_COMPATIBILITY[i]);
-		lua_rawseti(L, -2, i+1);
-	}
-
-	lua_setfield(L, -2, "_version_compat");
-
-#ifdef LOVE_WINDOWS
-	lua_pushstring(L, "Windows");
-#elif defined(LOVE_MACOSX)
-	lua_pushstring(L, "OS X");
-#elif defined(LOVE_LINUX)
-	lua_pushstring(L, "Linux");
-#else
-	lua_pushstring(L, "Unknown");
-#endif
-	lua_setfield(L, -2, "_os");
-
-#ifdef LOVE_BUILD_STANDALONE
-
-	// Preload module loaders.
-	for (int i = 0; modules[i].name != 0; i++)
-	{
-		love::luax_preload(L, modules[i].func, modules[i].name);
-	}
-
-	love::luasocket::__open(L);
-
-#endif // LOVE_BUILD_STANDALONE
-
-	return 1;
-}
-
 #ifdef LOVE_LEGENDARY_UTF8_ARGV_HACK
 
-void get_utf8_arguments(int & argc, char **& argv)
+void get_utf8_arguments(int &argc, char **&argv)
 {
 	LPWSTR cmd = GetCommandLineW();
 
 	if (!cmd)
 		return;
 
-	LPWSTR * argv_w = CommandLineToArgvW(cmd, &argc);
+	LPWSTR *argv_w = CommandLineToArgvW(cmd, &argc);
 
-	argv = new char*[argc];
+	argv = new char *[argc];
 
-	for (int i = 0; i<argc; ++i)
+	for (int i = 0; i < argc; ++i)
 	{
 		// Size of wide char buffer (plus one for trailing '\0').
-		size_t wide_len = wcslen(argv_w[i])+1;
+		size_t wide_len = wcslen(argv_w[i]) + 1;
 
 		// Get size in UTF-8.
 		int utf8_size = WideCharToMultiByte(CP_UTF8, 0, argv_w[i], wide_len, argv[i], 0, 0, 0);
 
 #endif // LOVE_LEGENDARY_UTF8_ARGV_HACK
 
-#ifdef LOVE_LEGENDARY_CONSOLE_IO_HACK
-
-int w__openConsole(lua_State * L)
-{
-	static bool is_open = false;
-	if (is_open)
-		return 0;
-	is_open = true;
-
-	if (GetConsoleWindow() != NULL || AllocConsole() == 0)
-		return 0;
-
-	const int MAX_CONSOLE_LINES = 5000;
-	CONSOLE_SCREEN_BUFFER_INFO console_info;
-
-	// Set size.
-	GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &console_info);
-	console_info.dwSize.Y = MAX_CONSOLE_LINES;
-	SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), console_info.dwSize);
-
-	SetConsoleTitle(TEXT("LOVE Console"));
-
-	FILE * fp;
-
-	// Redirect stdout.
-	fp = freopen("CONOUT$", "w", stdout);
-	if (L && fp == NULL)
-		luaL_error(L, "Console redirection of stdout failed.");
-
-	// Redirect stdin.
-	fp = freopen("CONIN$", "r", stdin);
-	if (L && fp == NULL)
-		luaL_error(L, "Console redirection of stdin failed.");
-
-	// Redirect stderr.
-	fp = freopen("CONOUT$", "w", stderr);
-	if (L && fp == NULL)
-		luaL_error(L, "Console redirection of stderr failed.");
-
-	return 0;
-}
-
-#endif // LOVE_LEGENDARY_CONSOLE_IO_HACK
-
 #ifdef LOVE_LEGENDARY_LIBSTDCXX_HACK
 
 // Workarounds for symbols that are missing from Leopard stdlibc++.dylib.
 
 #endif // LOVE_LEGENDARY_LIBSTDCXX_HACK
 
-extern "C" int luaopen_love_boot(lua_State *L)
+static int love_preload(lua_State *L, lua_CFunction f, const char *name)
 {
-	if (luaL_loadbuffer(L, (const char *)love::boot_lua, sizeof(love::boot_lua), "boot.lua") == 0)
-	lua_call(L, 0, 1);
-	return 1;
+	lua_getglobal(L, "package");
+	lua_getfield(L, -1, "preload");
+	lua_pushcfunction(L, f);
+	lua_setfield(L, -2, name);
+	lua_pop(L, 2);
+	return 0;
 }
 
-extern "C" LOVE_EXPORT int lovemain(int argc, char ** argv)
+int main(int argc, char **argv)
 {
 #ifdef LOVE_LEGENDARY_UTF8_ARGV_HACK
-	int hack_argc = 0;
-	char ** hack_argv = 0;
+	int hack_argc = 0;	char **hack_argv = 0;
 	get_utf8_arguments(hack_argc, hack_argv);
 	argc = hack_argc;
 	argv = hack_argv;
 	// Oh, you just want the version? Okay!
 	if (argc > 1 && strcmp(argv[1],"--version") == 0)
 	{
-		printf("LOVE %s (%s)\n", love::VERSION, love::VERSION_CODENAME);
+		printf("LOVE %s (%s)\n", love_version(), love_codename());
 		return 0;
 	}
 
 	// Create the virtual machine.
-	lua_State * L = lua_open();
+	lua_State *L = lua_open();
 	luaL_openlibs(L);
 
-	love::luax_preload(L, luaopen_love, "love");
+	love_preload(L, luaopen_love, "love");
 
 	luaopen_love(L);
 
 	return retval;
 }
 
+#endif // LOVE_BUILD_EXE

File src/modules/love/love.cpp

+/**
+ * Copyright (c) 2006-2012 LOVE Development Team
+ *
+ * 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.
+ **/
+
+// LOVE
+#include "common/config.h"
+#include "common/version.h"
+#include "common/runtime.h"
+
+#include "love.h"
+
+#ifdef LOVE_WINDOWS
+#include <windows.h>
+#endif // LOVE_WINDOWS
+
+#ifdef LOVE_LEGENDARY_CONSOLE_IO_HACK
+#include <fcntl.h>
+#include <io.h>
+#include <iostream>
+#include <fstream>
+#endif // LOVE_LEGENDARY_CONSOLE_IO_HACK
+
+#ifdef LOVE_BUILD_EXE
+
+// Libraries.
+#include "libraries/luasocket/luasocket.h"
+
+// Scripts
+#include "scripts/boot.lua.h"
+
+#endif // LOVE_BUILD_EXE
+
+#ifdef LOVE_BUILD_STANDALONE
+
+// All modules define a c-accessible luaopen
+// so let's make use of those, instead
+// of addressing implementations directly.
+extern "C"
+{
+	extern int luaopen_love_audio(lua_State*);
+	extern int luaopen_love_event(lua_State*);
+	extern int luaopen_love_filesystem(lua_State*);
+	extern int luaopen_love_font(lua_State*);
+	extern int luaopen_love_graphics(lua_State*);
+	extern int luaopen_love_image(lua_State*);
+	extern int luaopen_love_joystick(lua_State*);
+	extern int luaopen_love_keyboard(lua_State*);
+	extern int luaopen_love_mouse(lua_State*);
+	extern int luaopen_love_physics(lua_State*);
+	extern int luaopen_love_sound(lua_State*);
+	extern int luaopen_love_timer(lua_State*);
+	extern int luaopen_love_thread(lua_State*);
+	extern int luaopen_love_boot(lua_State*);
+}
+
+static const luaL_Reg modules[] = {
+	{ "love.audio", luaopen_love_audio },
+	{ "love.event", luaopen_love_event },
+	{ "love.filesystem", luaopen_love_filesystem },
+	{ "love.font", luaopen_love_font },
+	{ "love.graphics", luaopen_love_graphics },
+	{ "love.image", luaopen_love_image },
+	{ "love.joystick", luaopen_love_joystick },
+	{ "love.keyboard", luaopen_love_keyboard },
+	{ "love.mouse", luaopen_love_mouse },
+	{ "love.physics", luaopen_love_physics },
+	{ "love.sound", luaopen_love_sound },
+	{ "love.timer", luaopen_love_timer },
+	{ "love.thread", luaopen_love_thread },
+	{ "love.boot", luaopen_love_boot },
+	{ 0, 0 }
+};
+
+#endif // LOVE_BUILD_STANDALONE
+
+#ifdef LOVE_LEGENDARY_CONSOLE_IO_HACK
+int w__openConsole(lua_State * L);
+#endif // LOVE_LEGENDARY_CONSOLE_IO_HACK
+
+extern "C" LOVE_EXPORT const char *love_version()
+{
+	return love::VERSION;
+}
+
+extern "C" LOVE_EXPORT const char *love_codename()
+{
+	return love::VERSION_CODENAME;
+}
+
+extern "C" LOVE_EXPORT int luaopen_love(lua_State * L)
+{
+	love::luax_insistglobal(L, "love");
+
+	// Set version information.
+	lua_pushstring(L, love::VERSION);
+	lua_setfield(L, -2, "_version");
+
+	lua_pushnumber(L, love::VERSION_MAJOR);
+	lua_setfield(L, -2, "_version_major");
+	lua_pushnumber(L, love::VERSION_MINOR);
+	lua_setfield(L, -2, "_version_minor");
+	lua_pushnumber(L, love::VERSION_REV);
+	lua_setfield(L, -2, "_version_revision");
+
+	lua_pushstring(L, love::VERSION_CODENAME);
+	lua_setfield(L, -2, "_version_codename");
+
+#ifdef LOVE_LEGENDARY_CONSOLE_IO_HACK
+	lua_pushcfunction(L, w__openConsole);
+	lua_setfield(L, -2, "_openConsole");
+#endif // LOVE_LEGENDARY_CONSOLE_IO_HACK
+
+	lua_newtable(L);
+
+	for (int i = 0; love::VERSION_COMPATIBILITY[i] != 0; ++i)
+	{
+		lua_pushstring(L, love::VERSION_COMPATIBILITY[i]);
+		lua_rawseti(L, -2, i+1);
+	}
+
+	lua_setfield(L, -2, "_version_compat");
+
+#ifdef LOVE_WINDOWS
+	lua_pushstring(L, "Windows");
+#elif defined(LOVE_MACOSX)
+	lua_pushstring(L, "OS X");
+#elif defined(LOVE_LINUX)
+	lua_pushstring(L, "Linux");
+#else
+	lua_pushstring(L, "Unknown");
+#endif
+	lua_setfield(L, -2, "_os");
+
+#ifdef LOVE_BUILD_STANDALONE
+
+	// Preload module loaders.
+	for (int i = 0; modules[i].name != 0; i++)
+	{
+		love::luax_preload(L, modules[i].func, modules[i].name);
+	}
+
+	love::luasocket::__open(L);
+
+#endif // LOVE_BUILD_STANDALONE
+
+	return 1;
+}
+
+#ifdef LOVE_LEGENDARY_CONSOLE_IO_HACK
+
+int w__openConsole(lua_State * L)
+{
+	static bool is_open = false;
+	if (is_open)
+		return 0;
+	is_open = true;
+
+	if (GetConsoleWindow() != NULL || AllocConsole() == 0)
+		return 0;
+
+	const int MAX_CONSOLE_LINES = 5000;
+	CONSOLE_SCREEN_BUFFER_INFO console_info;
+
+	// Set size.
+	GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &console_info);
+	console_info.dwSize.Y = MAX_CONSOLE_LINES;
+	SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), console_info.dwSize);
+
+	SetConsoleTitle(TEXT("LOVE Console"));
+
+	FILE * fp;
+
+	// Redirect stdout.
+	fp = freopen("CONOUT$", "w", stdout);
+	if (L && fp == NULL)
+		luaL_error(L, "Console redirection of stdout failed.");
+
+	// Redirect stdin.
+	fp = freopen("CONIN$", "r", stdin);
+	if (L && fp == NULL)
+		luaL_error(L, "Console redirection of stdin failed.");
+
+	// Redirect stderr.
+	fp = freopen("CONOUT$", "w", stderr);
+	if (L && fp == NULL)
+		luaL_error(L, "Console redirection of stderr failed.");
+
+	return 0;
+}
+
+#endif // LOVE_LEGENDARY_CONSOLE_IO_HACK
+
+extern "C" LOVE_EXPORT int luaopen_love_boot(lua_State *L)
+{
+	if (luaL_loadbuffer(L, (const char *)love::boot_lua, sizeof(love::boot_lua), "boot.lua") == 0)
+	lua_call(L, 0, 1);
+	return 1;
+}
+
+
+

File src/modules/love/love.h

+/**
+ * Copyright (c) 2006-2012 LOVE Development Team
+ *
+ * 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.
+ **/
+
+// LOVE
+#include "common/config.h"
+
+// Forward declare lua_State.
+struct lua_State;
+
+extern "C" LOVE_EXPORT const char *love_version();
+extern "C" LOVE_EXPORT const char *love_codename();
+extern "C" LOVE_EXPORT int luaopen_love(lua_State *L);
+extern "C" LOVE_EXPORT int luaopen_love_boot(lua_State *L);