New upstream release beta6
authorChris Butler <chrisb@debian.org>
Thu, 24 Mar 2011 10:18:14 +0000 (10:18 +0000)
committerChris Butler <chrisb@debian.org>
Thu, 24 Mar 2011 10:18:14 +0000 (10:18 +0000)
Merge commit 'upstream/0.6-beta'

Conflicts:
.gitignore
CorsixTH/CMakeLists.txt
CorsixTH/Src/main.cpp

1  2 
.gitignore
CorsixTH/CMakeLists.txt
CorsixTH/Src/main.cpp

diff --cc .gitignore
@@@ -1,1 -1,22 +1,25 @@@
++# Debian specific
 +.pc
++
+ # These are from svn:ignore
+ /DataRaw/
+ /LuaJIT/
+ /SDL/
+ /SDL_mixer-1.2.8/
+ config.txt
+ CorsixTH/Src/config.h
+ # This is for the CMake build output
+ cmake_install.cmake
+ *.build/
+ CMakeScripts/
+ CMakeFiles/
+ CMakeCache.txt
+ # This is for the CMake-generated XCode project and output
+ /build/
+ *.xcodeproj/
+ Debug/
+ Release/
+ MinSizeRel/
+ RelWithDebInfo/
index 979ff57,64f6a65..999f26d
mode 100755,100644..100644
- # Sanity check\r
- IF(CORSIX_TH_DONE_TOP_LEVEL_CMAKE)\r
- ELSE(CORSIX_TH_DONE_TOP_LEVEL_CMAKE)\r
- message(FATAL_ERROR "Please run cmake on the top-level directory, not this one.")\r
- ENDIF(CORSIX_TH_DONE_TOP_LEVEL_CMAKE)\r
\r
- # Project Declaration\r
- PROJECT(CorsixTH)\r
\r
- # Basic platform dependant stuff\r
- IF(UNIX)\r
-   IF(APPLE)\r
-     # fruit goes here\r
-     add_subdirectory(SDLMain)\r
-   ELSE(APPLE)\r
-     # regular unix/linux\r
-   ENDIF(APPLE)\r
- ELSE()\r
-   IF(WIN32)\r
-     # Win32 specific\r
-     IF(MSVC)\r
-       # We want to bind against the very latest versions of the MSVC runtimes\r
-       add_definitions(/D "_BIND_TO_CURRENT_VCLIBS_VERSION=1")\r
-     ELSE(MSVC)\r
-       IF(MSYS)\r
-         # MSYS stuff\r
-       ELSE(MSYS)\r
-         # What's left? MINGW? CYGWIN? BORLAND?\r
-       ENDIF(MSYS)\r
-     ENDIF(MSVC)\r
-   ELSE(WIN32)\r
-     # other OS (not UNIX, not 32/64 bit Windows)\r
-   ENDIF(WIN32)\r
- ENDIF(UNIX)\r
\r
- # Modify the config.h based upon our selection of options\r
- CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/CorsixTH/Src/config.h.in ${CMAKE_BINARY_DIR}/CorsixTH/Src/config.h)\r
- INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR}/CorsixTH/Src/)\r
- INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/agg/include/)\r
\r
- # Generate source files list\r
- # Note: Done after generating config.h\r
- FILE(GLOB_RECURSE corsixth_source_files\r
-   ${CMAKE_SOURCE_DIR}/CorsixTH/SrcUnshared/*.cpp\r
-   ${CMAKE_SOURCE_DIR}/CorsixTH/SrcUnshared/*.c\r
-   ${CMAKE_SOURCE_DIR}/CorsixTH/SrcUnshared/*.h\r
-   ${CMAKE_SOURCE_DIR}/CorsixTH/SrcUnshared/*.hpp\r
-   ${CMAKE_SOURCE_DIR}/CorsixTH/Src/*.cpp\r
-   ${CMAKE_SOURCE_DIR}/CorsixTH/Src/*.c\r
-   ${CMAKE_SOURCE_DIR}/CorsixTH/Src/*.hpp\r
-   ${CMAKE_SOURCE_DIR}/CorsixTH/Src/*.h\r
-   ${CMAKE_BINARY_DIR}/CorsixTH/Src/config.h\r
-   ${CMAKE_SOURCE_DIR}/CorsixTH/Lua/api_version.lua\r
-   ${CMAKE_SOURCE_DIR}/CorsixTH/CorsixTH.rc\r
-   ${CMAKE_SOURCE_DIR}/LFS/*.c\r
-   ${CMAKE_SOURCE_DIR}/LPEG/*.c\r
-   ${CMAKE_SOURCE_DIR}/agg/src/agg_image_filters.cpp\r
- )\r
\r
- # Declaration of the executable\r
- add_executable(CorsixTH ${corsixth_source_files})\r
\r
- IF(APPLE)\r
-   target_link_libraries(CorsixTH SDLmain)\r
-   INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR}/CorsixTH/SDLMain/)\r
- ENDIF(APPLE)\r
\r
- # Finding libraries\r
\r
- # Find SDL\r
- FIND_PACKAGE(SDL REQUIRED)\r
- IF(SDL_FOUND)\r
-   INCLUDE_DIRECTORIES(${SDL_INCLUDE_DIR})\r
-   IF(SDLMAIN_LIBRARY STREQUAL "")\r
-     IF(WIN32)\r
-       # SDLmain not being found is not fatal, as the win32 SDLmain.c is distributed with CorsixTH\r
-     ELSE(WIN32)\r
-       message(FATAL_ERROR "Error: SDL was found but SDLmain was not")\r
-       message("Make sure the path is correctly defined or set the environment variable SDLDIR to the correct location")\r
-     ENDIF(WIN32)\r
-   ENDIF(SDLMAIN_LIBRARY STREQUAL "")\r
-   # No need to specify sdlmain seperately, the FindSDL.cmake file will take care of that. If not we get an error about it\r
-   TARGET_LINK_LIBRARIES(CorsixTH ${SDL_LIBRARY})\r
-   message("  SDL found")\r
- ELSE(SDL_FOUND)\r
-   message(FATAL_ERROR "Error: SDL library not found, it is required to build. Make sure the path is correctly defined or set the environment variable SDLDIR to the correct location")\r
- ENDIF(SDL_FOUND)\r
\r
- # Find Lua\r
- FIND_PACKAGE(Lua51 REQUIRED)\r
- IF(LUA51_FOUND)\r
-   TARGET_LINK_LIBRARIES(CorsixTH ${LUA_LIBRARY})\r
-   INCLUDE_DIRECTORIES(${LUA_INCLUDE_DIR})\r
-   message("  Lua 5.1 found")\r
- ELSE(LUA51_FOUND)\r
-   message(FATAL_ERROR "Error: Lua library not found, it is required to build")\r
- ENDIF(LUA51_FOUND)\r
\r
- # Find SDL_mixer\r
- IF(CORSIX_TH_USE_SDL_MIXER)\r
-   FIND_PACKAGE(SDL_mixer REQUIRED)\r
-   IF(SDLMIXER_FOUND)\r
-     TARGET_LINK_LIBRARIES(CorsixTH ${SDLMIXER_LIBRARY})\r
-     INCLUDE_DIRECTORIES(${SDLMIXER_INCLUDE_DIR})\r
-     message("  SDL_mixer found")\r
-   ELSE(SDLMIXER_FOUND)\r
-     message("Error: SDL_mixer library not found, even though it was selected to be included")\r
-   ENDIF(SDLMIXER_FOUND)\r
- ENDIF(CORSIX_TH_USE_SDL_MIXER)\r
\r
- # Find OpenGL\r
- IF(CORSIX_TH_USE_OGL_RENDERER)\r
-   FIND_PACKAGE(OpenGL REQUIRED)\r
-   IF(OPENGL_FOUND)\r
-     TARGET_LINK_LIBRARIES(CorsixTH ${OPENGL_gl_LIBRARY})\r
-     INCLUDE_DIRECTORIES(${OPENGL_INCLUDE_DIR})\r
-     message("  OpenGL found")\r
-   ELSE(OPENGL_FOUND)\r
-     message(FATAL_ERROR "Error: OpenGL library not found, it is required to build (consider changing choice of renderer)")\r
-   ENDIF(OPENGL_FOUND)\r
- ENDIF(CORSIX_TH_USE_OGL_RENDERER)\r
\r
- # Declaration of the install process\r
- install(TARGETS CorsixTH RUNTIME DESTINATION games)\r
- install(DIRECTORY Lua DESTINATION share/games/CorsixTH PATTERN "*svn" EXCLUDE)\r
- install(DIRECTORY Bitmap DESTINATION share/games/CorsixTH PATTERN "*svn" EXCLUDE)\r
- install(DIRECTORY Levels DESTINATION share/games/CorsixTH PATTERN "*svn" EXCLUDE)\r
- install(FILES CorsixTH.lua DESTINATION share/games/CorsixTH )\r
- #install(FILES LICENSE.txt DESTINATION CorsixTH ) # removed: licence is listed in debian/copyright\r
- #install(FILES CorsixTH.ico DESTINATION CorsixTH ) # removed: converted to xpm by debian/rules\r
\r
+ # Sanity check
+ IF(CORSIX_TH_DONE_TOP_LEVEL_CMAKE)
+ ELSE(CORSIX_TH_DONE_TOP_LEVEL_CMAKE)
+ message(FATAL_ERROR "Please run cmake on the top-level directory, not this one.")
+ ENDIF(CORSIX_TH_DONE_TOP_LEVEL_CMAKE)
+ # Project Declaration
+ PROJECT(CorsixTH)
+ # Basic platform dependant stuff
+ IF(UNIX)
+   IF(APPLE)
+     # fruit goes here
+     add_subdirectory(SDLMain)
+   ELSE(APPLE)
+     # regular unix/linux
+   ENDIF(APPLE)
+ ELSE()
+   IF(WIN32)
+     # Win32 specific
+     IF(MSVC)
+       # We want to bind against the very latest versions of the MSVC runtimes
+       add_definitions(/D "_BIND_TO_CURRENT_VCLIBS_VERSION=1")
+     ELSE(MSVC)
+       IF(MSYS)
+         # MSYS stuff
+       ELSE(MSYS)
+         # What's left? MINGW? CYGWIN? BORLAND?
+       ENDIF(MSYS)
+     ENDIF(MSVC)
+   ELSE(WIN32)
+     # other OS (not UNIX, not 32/64 bit Windows)
+   ENDIF(WIN32)
+ ENDIF(UNIX)
+ # Modify the config.h based upon our selection of options
+ CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/CorsixTH/Src/config.h.in ${CMAKE_BINARY_DIR}/CorsixTH/Src/config.h)
+ INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR}/CorsixTH/Src/)
+ INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/agg/include/)
+ # Generate source files list
+ # Note: Done after generating config.h
+ FILE(GLOB_RECURSE corsixth_source_files
+   ${CMAKE_SOURCE_DIR}/CorsixTH/SrcUnshared/*.cpp
+   ${CMAKE_SOURCE_DIR}/CorsixTH/SrcUnshared/*.c
+   ${CMAKE_SOURCE_DIR}/CorsixTH/SrcUnshared/*.h
+   ${CMAKE_SOURCE_DIR}/CorsixTH/SrcUnshared/*.hpp
+   ${CMAKE_SOURCE_DIR}/CorsixTH/Src/*.cpp
+   ${CMAKE_SOURCE_DIR}/CorsixTH/Src/*.c
+   ${CMAKE_SOURCE_DIR}/CorsixTH/Src/*.hpp
+   ${CMAKE_SOURCE_DIR}/CorsixTH/Src/*.h
+   ${CMAKE_BINARY_DIR}/CorsixTH/Src/config.h
+   ${CMAKE_SOURCE_DIR}/CorsixTH/Lua/api_version.lua
+   ${CMAKE_SOURCE_DIR}/CorsixTH/CorsixTH.rc
+   ${CMAKE_SOURCE_DIR}/LFS/*.c
+   ${CMAKE_SOURCE_DIR}/LPEG/*.c
+   ${CMAKE_SOURCE_DIR}/agg/src/agg_image_filters.cpp
+ )
+ # Declaration of the executable
+ add_executable(CorsixTH ${corsixth_source_files})
+ IF(APPLE)
+   target_link_libraries(CorsixTH SDLmain)
+   INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR}/CorsixTH/SDLMain/)
+ ENDIF(APPLE)
+ # Finding libraries
+ # Find SDL
+ FIND_PACKAGE(SDL REQUIRED)
+ IF(SDL_FOUND)
+   INCLUDE_DIRECTORIES(${SDL_INCLUDE_DIR})
+   IF(SDLMAIN_LIBRARY STREQUAL "")
+     IF(WIN32)
+       # SDLmain not being found is not fatal, as the win32 SDLmain.c is distributed with CorsixTH
+     ELSE(WIN32)
+       message(FATAL_ERROR "Error: SDL was found but SDLmain was not")
+       message("Make sure the path is correctly defined or set the environment variable SDLDIR to the correct location")
+     ENDIF(WIN32)
+   ENDIF(SDLMAIN_LIBRARY STREQUAL "")
+   # No need to specify sdlmain seperately, the FindSDL.cmake file will take care of that. If not we get an error about it
+   TARGET_LINK_LIBRARIES(CorsixTH ${SDL_LIBRARY})
+   message("  SDL found")
+ ELSE(SDL_FOUND)
+   message(FATAL_ERROR "Error: SDL library not found, it is required to build. Make sure the path is correctly defined or set the environment variable SDLDIR to the correct location")
+ ENDIF(SDL_FOUND)
+ # Find Lua
+ FIND_PACKAGE(Lua51 REQUIRED)
+ IF(LUA51_FOUND)
+   TARGET_LINK_LIBRARIES(CorsixTH ${LUA_LIBRARY})
+   INCLUDE_DIRECTORIES(${LUA_INCLUDE_DIR})
+   message("  Lua 5.1 found")
+ ELSE(LUA51_FOUND)
+   message(FATAL_ERROR "Error: Lua library not found, it is required to build")
+ ENDIF(LUA51_FOUND)
+ # Find SDL_mixer
+ IF(CORSIX_TH_USE_SDL_MIXER)
+   FIND_PACKAGE(SDL_mixer REQUIRED)
+   IF(SDLMIXER_FOUND)
+     TARGET_LINK_LIBRARIES(CorsixTH ${SDLMIXER_LIBRARY})
+     INCLUDE_DIRECTORIES(${SDLMIXER_INCLUDE_DIR})
+     message("  SDL_mixer found")
+   ELSE(SDLMIXER_FOUND)
+     message("Error: SDL_mixer library not found, even though it was selected to be included")
+   ENDIF(SDLMIXER_FOUND)
+ ENDIF(CORSIX_TH_USE_SDL_MIXER)
+ # Find Freetype2
+ IF(CORSIX_TH_USE_FREETYPE2)
+   FIND_PACKAGE(Freetype REQUIRED)
+   IF(FREETYPE_FOUND)
+     TARGET_LINK_LIBRARIES(CorsixTH ${FREETYPE_LIBRARIES})
+     INCLUDE_DIRECTORIES(${FREETYPE_INCLUDE_DIRS})
+     message("  FreeType2 found")
+   ELSE(FREETYPE_FOUND)
+     message("Error: FreeType2 library not found, even though it was selected to be used")
+   ENDIF(FREETYPE_FOUND)
+ ENDIF(CORSIX_TH_USE_FREETYPE2)
+ # Find OpenGL
+ IF(CORSIX_TH_USE_OGL_RENDERER)
+   FIND_PACKAGE(OpenGL REQUIRED)
+   IF(OPENGL_FOUND)
+     TARGET_LINK_LIBRARIES(CorsixTH ${OPENGL_gl_LIBRARY})
+     INCLUDE_DIRECTORIES(${OPENGL_INCLUDE_DIR})
+     message("  OpenGL found")
+   ELSE(OPENGL_FOUND)
+     message(FATAL_ERROR "Error: OpenGL library not found, it is required to build (consider changing choice of renderer)")
+   ENDIF(OPENGL_FOUND)
+ ENDIF(CORSIX_TH_USE_OGL_RENDERER)
+ # Declaration of the install process
 -install(TARGETS CorsixTH RUNTIME DESTINATION CorsixTH)
 -install(DIRECTORY Lua Levels DESTINATION CorsixTH PATTERN "*.svn" EXCLUDE)
 -install(DIRECTORY Bitmap DESTINATION CorsixTH
++install(TARGETS CorsixTH RUNTIME DESTINATION games)
++install(DIRECTORY Lua Levels DESTINATION share/games/CorsixTH PATTERN "*svn" EXCLUDE)
++install(DIRECTORY Bitmap DESTINATION share/games/CorsixTH
+         FILES_MATCHING REGEX ".*\\.(tab|pal|dat|png)$"
+         PATTERN "*.svn" EXCLUDE)
 -install(FILES CorsixTH.lua LICENSE.txt CorsixTH.ico DESTINATION CorsixTH )
 -
++install(FILES CorsixTH.lua DESTINATION CorsixTH )
++#install(FILES LICENSE.txt DESTINATION CorsixTH ) # removed: licence is listed in debian/copyright
++#install(FILES CorsixTH.ico DESTINATION CorsixTH ) # removed: converted to xpm by debian/rules
index b2448a2,eee494f..9a2f193
mode 100755,100644..100644
- /*\r
- Copyright (c) 2009 Peter "Corsix" Cawley\r
\r
- Permission is hereby granted, free of charge, to any person obtaining a copy of\r
- this software and associated documentation files (the "Software"), to deal in\r
- the Software without restriction, including without limitation the rights to\r
- use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\r
- of the Software, and to permit persons to whom the Software is furnished to do\r
- so, subject to the following conditions:\r
\r
- The above copyright notice and this permission notice shall be included in all\r
- copies or substantial portions of the Software.\r
\r
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
- SOFTWARE.\r
- */\r
\r
- #include "config.h"\r
- #include "lua.hpp"\r
- extern "C" {\r
- #include "../../LFS/lfs.h"\r
- int luaopen_lpeg(lua_State *L);\r
- int luaopen_random(lua_State *L);\r
- }\r
- #include "rnc.h"\r
- #include "th_lua.h"\r
- #include "lua_sdl.h"\r
- #include "jit_opt.h"\r
- #include "persist_lua.h"\r
- #include "iso_fs.h"\r
\r
- // Config file checking\r
- #ifndef CORSIX_TH_USE_PACK_PRAGMAS\r
- #error "config.h is out of date - please rerun CMake"\r
- #endif\r
- // End of config file checking\r
\r
- int CorsixTH_lua_main_no_eval(lua_State *L)\r
- {\r
-     // assert(_VERSION == LUA_VERSION)\r
-     size_t iLength;\r
-     lua_getglobal(L, "_VERSION");\r
-     const char* sVersion = lua_tolstring(L, -1, &iLength);\r
-     if(iLength != strlen(LUA_VERSION) || strcmp(sVersion, LUA_VERSION) != 0)\r
-     {\r
-         lua_pushliteral(L, "Linked against a version of Lua different to the "\r
-             "one used when compiling.\nPlease recompile CorsixTH against the "\r
-             "same Lua version it is linked against.");\r
-         return lua_error(L);\r
-     }\r
-     lua_pop(L, 1);\r
\r
-     // registry._CLEANUP = {}\r
-     lua_newtable(L);\r
-     lua_setfield(L, LUA_REGISTRYINDEX, "_CLEANUP");\r
\r
-     // math.random* = Mersenne twister variant\r
-     luaT_cpcall(L, luaopen_random, NULL);\r
\r
-     // package.preload["jit.opt"] = load(jit_opt_lua)\r
-     // package.preload["jit.opt_inline"] = load(jit_opt_inline_lua)\r
-     lua_getglobal(L, "package");\r
-     lua_getfield(L, -1, "preload");\r
-     luaL_loadbuffer(L, (const char*)jit_opt_lua, sizeof(jit_opt_lua),\r
-         "jit/opt.luac");\r
-     lua_setfield(L, -2, "jit.opt");\r
-     luaL_loadbuffer(L, (const char*)jit_opt_inline_lua,\r
-         sizeof(jit_opt_inline_lua), "jit/opt_inline.luac");\r
-     lua_setfield(L, -2, "jit.opt_inline");\r
-     lua_pop(L, 2);\r
\r
-     // if registry._LOADED.jit then\r
-     // require"jit.opt".start()\r
-     // else\r
-     // print "Notice: ..."\r
-     // end\r
-     // (this could be done in Lua rather than here, but ideally the optimiser\r
-     // should be turned on before any Lua code is loaded)\r
-     lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED");\r
-     lua_getfield(L, -1, "jit");\r
-     if(lua_type(L, -1) == LUA_TNIL)\r
-     {\r
-         lua_pop(L, 2);\r
-         lua_getglobal(L, "print");\r
-         lua_pushliteral(L, "Notice: LuaJIT not being used.\nConsider replacing"\r
-             " Lua with LuaJIT to improve performance.");\r
- #ifdef CORSIX_TH_64BIT\r
-         lua_pushliteral(L, " Note that there is not currently a 64 bit version"\r
-             " of LuaJIT.");\r
-         lua_concat(L, 2);\r
- #endif\r
-         lua_call(L, 1, 0);\r
-     }\r
-     else\r
-     {\r
-         lua_pop(L, 2);\r
-         lua_getglobal(L, "require");\r
-         lua_pushliteral(L, "jit.opt");\r
-         lua_call(L, 1, 1);\r
-         lua_getfield(L, -1, "start");\r
-         lua_call(L, 0, 0);\r
-         lua_pop(L, 1);\r
-     }\r
\r
-     // Fill in package.preload table so that calls to require("X") from Lua\r
-     // will call the appropriate luaopen_X function in C.\r
- #define PRELOAD(name, fn) \\r
-     luaT_execute(L, "package.preload." name " = ...", fn)\r
-     PRELOAD("lfs", luaopen_lfs_ext);\r
-     PRELOAD("lpeg", luaopen_lpeg);\r
-     PRELOAD("rnc", luaopen_rnc);\r
-     PRELOAD("TH", luaopen_th);\r
-     PRELOAD("ISO_FS", luaopen_iso_fs);\r
-     PRELOAD("persist", luaopen_persist);\r
-     PRELOAD("sdl", luaopen_sdl);\r
- #undef PRELOAD\r
\r
-     // require "debug" (Harmless in Lua 5.1, useful in 5.2 for compatbility)\r
-     luaT_execute(L, "require \"debug\"");\r
\r
-     // Check for --interpreter and run that instead of CorsixTH.lua\r
-     bool bGotScriptFile = false;\r
-     int iNArgs = lua_gettop(L);\r
-     for(int i = 1; i <= iNArgs; ++i)\r
-     {\r
-         if(lua_type(L, i) == LUA_TSTRING)\r
-         {\r
-             size_t iLen;\r
-             const char* sCmd = lua_tolstring(L, i, &iLen);\r
-             if(iLen > 14 && memcmp(sCmd, "--interpreter=", 14) == 0)\r
-             {\r
-                 lua_getglobal(L, "assert");\r
-                 lua_getglobal(L, "loadfile");\r
-                 lua_pushlstring(L, sCmd + 14, iLen - 14);\r
-                 bGotScriptFile = true;\r
-                 break;\r
-             }\r
-         }\r
-     }\r
\r
-     // Code to try several variations on finding CorsixTH.lua:\r
-     // CorsixTH.lua\r
-     // CorsixTH/CorsixTH.lua\r
-     // ../CorsixTH.lua\r
-     // ../CorsixTH/CorsixTH.lua\r
-     // ../../CorsixTH.lua\r
-     // ../../CorsixTH/CorsixTH.lua\r
-     // ../../../CorsixTH.lua\r
-     // ../../../CorsixTH/CorsixTH.lua\r
-     // It is simpler to write this in Lua than in C.\r
-     const char sLuaCorsixTHLua[] =\r
-     "local name, sep, code = \"CorsixTH.lua\", package.config:sub(1, 1)\n"\r
-     "local root = (... or \"\"):match(\"^(.*[\"..sep..\"])\") or \"\"\n"\r
- #ifdef __APPLE__ // Darrell: Search inside the bundle first.\r
-                  // There's probably a better way of doing this.\r
-     "code = loadfile(\"CorsixTH.app/Contents/Resources/\"..name)\n"\r
-     "if code then return code end\n";\r
- #elif defined(__LINUX__)\r
-       // Try /usr/share/games/CorsixTH first on Linux systems\r
-     "code = loadfile(\"/usr/share/games/CorsixTH/\"..name)\n"\r
-     "if code then return code end\n";\r
- #else\r
-       // I'm excluding this for the Debian build, as loading code from the\r
-       // current directory, or a parent directory could be considered a security\r
-       // risk.\r
-     "for num_dotdot = 0, 3 do\n"\r
-     "  for num_dir = 0, 1 do\n"\r
-     "    code = loadfile(root..(\"..\"..sep):rep(num_dotdot)..\n"\r
-     "                    (\"CorsixTH\"..sep):rep(num_dir)..name)\n"\r
-     "    if code then return code end \n"\r
-     "  end \n"\r
-     "end \n"\r
-     "return loadfile(name)";\r
- #endif\r
\r
-     // return assert(loadfile"CorsixTH.lua")(...)\r
-     if(!bGotScriptFile)\r
-     {\r
-         lua_getglobal(L, "assert");\r
-         luaL_loadbuffer(L, sLuaCorsixTHLua, strlen(sLuaCorsixTHLua),\r
-             "@main.cpp (l_main bootstrap)");\r
-         if(lua_gettop(L) == 2)\r
-             lua_pushnil(L);\r
-         else\r
-             lua_pushvalue(L, 1);\r
-     }\r
-     lua_call(L, 1, 2);\r
-     lua_call(L, 2, 1);\r
-     lua_insert(L, 1);\r
-     return lua_gettop(L);\r
- }\r
-     \r
- int CorsixTH_lua_main(lua_State *L)\r
- {\r
-     lua_call(L, CorsixTH_lua_main_no_eval(L) - 1, LUA_MULTRET);\r
-     return lua_gettop(L);\r
- }\r
\r
- int CorsixTH_lua_stacktrace(lua_State *L)\r
- {\r
-     // err = tostring(err)\r
-     lua_settop(L, 1);\r
-     lua_getglobal(L, "tostring");\r
-     lua_insert(L, 1);\r
-     lua_call(L, 1, 1);\r
\r
-     // err = <description> .. err\r
-     lua_pushliteral(L, "An error has occured in CorsixTH:\n");\r
-     lua_insert(L, 1);\r
-     lua_concat(L, 2);\r
\r
-     // return debug.traceback(err, 2)\r
-     lua_getglobal(L, "debug");\r
-     lua_getfield(L, -1, "traceback");\r
-     lua_pushvalue(L, 1);\r
-     lua_pushinteger(L, 2);\r
-     lua_call(L, 2, 1);\r
\r
-     return 1;\r
- }\r
\r
- int CorsixTH_lua_panic(lua_State *L)\r
- {\r
-     fprintf(stderr, "A Lua error has occured in CorsixTH outside of protected "\r
-         "mode!!\n");\r
-     fflush(stderr);\r
\r
-     if(lua_type(L, -1) == LUA_TSTRING)\r
-         fprintf(stderr, "%s\n", lua_tostring(L, -1));\r
-     else\r
-         fprintf(stderr, "%p\n", lua_topointer(L, -1));\r
-     fflush(stderr);\r
\r
-     // A stack trace would be nice, but they cannot be done in a panic.\r
\r
-     return 0;\r
- }\r
+ /*
+ Copyright (c) 2009 Peter "Corsix" Cawley
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+ */
+ #include "config.h"
+ #include "lua.hpp"
+ extern "C" {
+ #include "../../LFS/lfs.h"
+ int luaopen_lpeg(lua_State *L);
+ int luaopen_random(lua_State *L);
+ }
+ #include "rnc.h"
+ #include "th_lua.h"
+ #include "lua_sdl.h"
+ #include "jit_opt.h"
+ #include "persist_lua.h"
+ #include "iso_fs.h"
+ // Config file checking
+ #ifndef CORSIX_TH_USE_PACK_PRAGMAS
+ #error "config.h is out of date - please rerun CMake"
+ #endif
+ // End of config file checking
+ int CorsixTH_lua_main_no_eval(lua_State *L)
+ {
+     // assert(_VERSION == LUA_VERSION)
+     size_t iLength;
+     lua_getglobal(L, "_VERSION");
+     const char* sVersion = lua_tolstring(L, -1, &iLength);
+     if(iLength != strlen(LUA_VERSION) || strcmp(sVersion, LUA_VERSION) != 0)
+     {
+         lua_pushliteral(L, "Linked against a version of Lua different to the "
+             "one used when compiling.\nPlease recompile CorsixTH against the "
+             "same Lua version it is linked against.");
+         return lua_error(L);
+     }
+     lua_pop(L, 1);
+     // registry._CLEANUP = {}
+     lua_newtable(L);
+     lua_setfield(L, LUA_REGISTRYINDEX, "_CLEANUP");
+     // math.random* = Mersenne twister variant
+     luaT_cpcall(L, luaopen_random, NULL);
+     // package.preload["jit.opt"] = load(jit_opt_lua)
+     // package.preload["jit.opt_inline"] = load(jit_opt_inline_lua)
+     lua_getglobal(L, "package");
+     lua_getfield(L, -1, "preload");
+     luaL_loadbuffer(L, (const char*)jit_opt_lua, sizeof(jit_opt_lua),
+         "jit/opt.luac");
+     lua_setfield(L, -2, "jit.opt");
+     luaL_loadbuffer(L, (const char*)jit_opt_inline_lua,
+         sizeof(jit_opt_inline_lua), "jit/opt_inline.luac");
+     lua_setfield(L, -2, "jit.opt_inline");
+     lua_pop(L, 2);
+     // if registry._LOADED.jit then
+     // require"jit.opt".start()
+     // else
+     // print "Notice: ..."
+     // end
+     // (this could be done in Lua rather than here, but ideally the optimiser
+     // should be turned on before any Lua code is loaded)
+     lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED");
+     lua_getfield(L, -1, "jit");
+     if(lua_type(L, -1) == LUA_TNIL)
+     {
+         lua_pop(L, 2);
+         lua_getglobal(L, "print");
+         lua_pushliteral(L, "Notice: LuaJIT not being used.\nConsider replacing"
+             " Lua with LuaJIT to improve performance.");
+ #ifdef CORSIX_TH_64BIT
+         lua_pushliteral(L, " Note that there is not currently a 64 bit version"
+             " of LuaJIT.");
+         lua_concat(L, 2);
+ #endif
+         lua_call(L, 1, 0);
+     }
+     else
+     {
+         lua_pop(L, 2);
+         lua_getglobal(L, "require");
+         lua_pushliteral(L, "jit.opt");
+         lua_call(L, 1, 1);
+         lua_getfield(L, -1, "start");
+         lua_call(L, 0, 0);
+         lua_pop(L, 1);
+     }
+     // Fill in package.preload table so that calls to require("X") from Lua
+     // will call the appropriate luaopen_X function in C.
+ #define PRELOAD(name, fn) \
+     luaT_execute(L, "package.preload." name " = ...", fn)
+     PRELOAD("lfs", luaopen_lfs_ext);
+     PRELOAD("lpeg", luaopen_lpeg);
+     PRELOAD("rnc", luaopen_rnc);
+     PRELOAD("TH", luaopen_th);
+     PRELOAD("ISO_FS", luaopen_iso_fs);
+     PRELOAD("persist", luaopen_persist);
+     PRELOAD("sdl", luaopen_sdl);
+ #undef PRELOAD
+     // require "debug" (Harmless in Lua 5.1, useful in 5.2 for compatbility)
+     luaT_execute(L, "require \"debug\"");
+     // Check for --interpreter and run that instead of CorsixTH.lua
+     bool bGotScriptFile = false;
+     int iNArgs = lua_gettop(L);
+     for(int i = 1; i <= iNArgs; ++i)
+     {
+         if(lua_type(L, i) == LUA_TSTRING)
+         {
+             size_t iLen;
+             const char* sCmd = lua_tolstring(L, i, &iLen);
+             if(iLen > 14 && memcmp(sCmd, "--interpreter=", 14) == 0)
+             {
+                 lua_getglobal(L, "assert");
+                 lua_getglobal(L, "loadfile");
+                 lua_pushlstring(L, sCmd + 14, iLen - 14);
+                 bGotScriptFile = true;
+                 break;
+             }
+         }
+     }
+     // Code to try several variations on finding CorsixTH.lua:
+     // CorsixTH.lua
+     // CorsixTH/CorsixTH.lua
+     // ../CorsixTH.lua
+     // ../CorsixTH/CorsixTH.lua
+     // ../../CorsixTH.lua
+     // ../../CorsixTH/CorsixTH.lua
+     // ../../../CorsixTH.lua
+     // ../../../CorsixTH/CorsixTH.lua
+     // It is simpler to write this in Lua than in C.
+     const char sLuaCorsixTHLua[] =
+     "local name, sep, code = \"CorsixTH.lua\", package.config:sub(1, 1)\n"
+     "local root = (... or \"\"):match(\"^(.*[\"..sep..\"])\") or \"\"\n"
+ #ifdef __APPLE__ // Darrell: Search inside the bundle first.
+                  // There's probably a better way of doing this.
+     "code = loadfile(\"CorsixTH.app/Contents/Resources/\"..name)\n"
 -    "if code then return code end\n"
 -#endif
++    "if code then return code end\n";
++#elif defined(__LINUX__)
++      // Try /usr/share/games/CorsixTH first on Linux systems
++    "code = loadfile(\"/usr/share/games/CorsixTH/\"..name)\n"
++    "if code then return code end\n";
++#else
++      // I'm excluding this for the Debian build, as loading code from the
++      // current directory, or a parent directory could be considered a security
++      // risk.
+     "for num_dotdot = 0, 3 do\n"
+     "  for num_dir = 0, 1 do\n"
+     "    code = loadfile(root..(\"..\"..sep):rep(num_dotdot)..\n"
+     "                    (\"CorsixTH\"..sep):rep(num_dir)..name)\n"
+     "    if code then return code end \n"
+     "  end \n"
+     "end \n"
+     "return loadfile(name)";
++#endif
+     // return assert(loadfile"CorsixTH.lua")(...)
+     if(!bGotScriptFile)
+     {
+         lua_getglobal(L, "assert");
+         luaL_loadbuffer(L, sLuaCorsixTHLua, strlen(sLuaCorsixTHLua),
+             "@main.cpp (l_main bootstrap)");
+         if(lua_gettop(L) == 2)
+             lua_pushnil(L);
+         else
+             lua_pushvalue(L, 1);
+     }
+     lua_call(L, 1, 2);
+     lua_call(L, 2, 1);
+     lua_insert(L, 1);
+     return lua_gettop(L);
+ }
+     
+ int CorsixTH_lua_main(lua_State *L)
+ {
+     lua_call(L, CorsixTH_lua_main_no_eval(L) - 1, LUA_MULTRET);
+     return lua_gettop(L);
+ }
+ int CorsixTH_lua_stacktrace(lua_State *L)
+ {
+     // err = tostring(err)
+     lua_settop(L, 1);
+     lua_getglobal(L, "tostring");
+     lua_insert(L, 1);
+     lua_call(L, 1, 1);
+     // err = <description> .. err
+     lua_pushliteral(L, "An error has occured in CorsixTH:\n");
+     lua_insert(L, 1);
+     lua_concat(L, 2);
+     // return debug.traceback(err, 2)
+     lua_getglobal(L, "debug");
+     lua_getfield(L, -1, "traceback");
+     lua_pushvalue(L, 1);
+     lua_pushinteger(L, 2);
+     lua_call(L, 2, 1);
+     return 1;
+ }
+ int CorsixTH_lua_panic(lua_State *L)
+ {
+     fprintf(stderr, "A Lua error has occured in CorsixTH outside of protected "
+         "mode!!\n");
+     fflush(stderr);
+     if(lua_type(L, -1) == LUA_TSTRING)
+         fprintf(stderr, "%s\n", lua_tostring(L, -1));
+     else
+         fprintf(stderr, "%p\n", lua_topointer(L, -1));
+     fflush(stderr);
+     // A stack trace would be nice, but they cannot be done in a panic.
+     return 0;
+ }