diff --git a/Font.cc b/Font.cc deleted file mode 100644 index e807d6a..0000000 --- a/Font.cc +++ /dev/null @@ -1,2 +0,0 @@ -#define STB_TRUETYPE_IMPLEMENTATION -#include "Font.h" \ No newline at end of file diff --git a/Game.h b/Game.h deleted file mode 100644 index a44c41b..0000000 --- a/Game.h +++ /dev/null @@ -1,69 +0,0 @@ -#pragma once - -#include -#include - -#include "iDrawable.h" -#include "iWritable.h" -#include "Logger.h" -#include "OffsetClock.h" -#include "SystemClock.h" -#include "Texture.h" - - -namespace gj { - - -class Game : public iDrawable, public iWritable { - public: - Game() = delete; - Game(Game&&) = delete; - Game(const Game&) = delete; - - Game& operator=(Game&&) = delete; - Game& operator=(const Game&) = delete; - - Game(iAllocator* alloc, uint32_t w, uint32_t h) : - alloc_(alloc), uptime_(&SystemClock::instance()), - w_(w), h_(h), logger_(h), test_(Colorbuffer(alloc, 1, 1)) { - Colorbuffer temp(alloc_, 5, 5); - float* ptr = temp.ptr(); - for (size_t i = 0; i < 25; ++i) ptr[i] = i%2*.3+.7; - test_ = Texture(std::move(temp)); - } - - void Update() { - const uint64_t i = uptime_.now(); - if (i%1000 == 0) logger_.Print(L"すべての人類は死滅する: "+std::to_wstring(i)); - - double t = i%2000/2000.; - t = 1 - t; - - mat3 m = mat3{ {.2, 0, 0},{0, .2, 0},{0, 0, 1} }; - - const double s = sin(3.14*2*t*t*t), c = cos(3.14*2*t*t*t); - m = ::linalg::mul(mat3{{c, -s, 0,}, {s, c, 0}, {0, 0, 1}}, m); - m = ::linalg::mul(mat3{{ 1, 0, 0,}, {0, 1, 0}, {(1 - t * t * t * 2) * .6, 0, 1}}, m); - m = ::linalg::mul(mat3{ {1, 0, 0},{0, 16/9., 0},{0, 0, 1} }, m); - test_.SetMatrix(m); - } - - void Draw(Colorbuffer& fb) const override { - test_.Draw(fb); - } - void Write(Textbuffer& fb) const override { - logger_.Write(fb); - } - - private: - iAllocator* alloc_; - OffsetClock uptime_; - - uint32_t w_, h_; - Logger logger_; - - Texture test_; -}; - - -} \ No newline at end of file diff --git a/GlyphsJuke.vcxproj b/GlyphsJuke.vcxproj index 1b66d8c..d273b3f 100644 --- a/GlyphsJuke.vcxproj +++ b/GlyphsJuke.vcxproj @@ -117,11 +117,17 @@ _DEBUG;_CONSOLE;%(PreprocessorDefinitions) true /utf-8 %(AdditionalOptions) + $(SolutionDir)/ + stdcpp20 Console true + + + + @@ -140,31 +146,57 @@ - - - + + + + + + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + Document + + + + diff --git a/GlyphsJuke.vcxproj.filters b/GlyphsJuke.vcxproj.filters index ec2bd0b..43a6b52 100644 --- a/GlyphsJuke.vcxproj.filters +++ b/GlyphsJuke.vcxproj.filters @@ -18,39 +18,51 @@ - + Source Files - + Source Files - + + Source Files + + + Source Files + + + Source Files + + + Source Files + + Source Files - + Header Files - + Header Files - + Header Files - + Header Files - + Header Files - + Header Files - + Header Files - + Header Files @@ -59,35 +71,83 @@ Header Files\thirdparty - + Header Files - + Header Files - + Header Files - + Header Files - + Header Files - + Header Files - + Header Files - + Header Files - + Header Files - + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + Header Files + + + + + + \ No newline at end of file diff --git a/Texture.h b/Texture.h deleted file mode 100644 index 0174332..0000000 --- a/Texture.h +++ /dev/null @@ -1,117 +0,0 @@ -#pragma once - -#include - -#include "thirdparty/linalg.h" - -#include "iDrawable.h" -#include "Rasterbuffer.h" - - -namespace gj { - - -class Texture : public DrawableBase { - public: - Texture() = delete; - Texture(Texture&&) = default; - Texture(const Texture&) = default; - - Texture& operator=(Texture&&) = default; - Texture& operator=(const Texture&) = default; - - Texture(Colorbuffer&& src) : src_(std::move(src)) { - } - - void Draw(Colorbuffer& fb) const override { - const int32_t w = static_cast(fb.width()); - const int32_t h = static_cast(fb.height()); - - const int32_t srcw = static_cast(src_.width()); - const int32_t srch = static_cast(src_.height()); - - vec3 p[4] = { - { -1, 1, 1 }, - { -1, -1, 1 }, - { 1, -1, 1 }, - { 1, 1, 1 }, - }; - for (size_t i = 0; i < 4; ++i) { - p[i] = ::linalg::mul(mat_, p[i]); - } - const double pl = std::min({p[0].x, p[1].x, p[2].x, p[3].x})-.1; - const double pr = std::max({p[0].x, p[1].x, p[2].x, p[3].x})+.1; - const double pu = std::max({p[0].y, p[1].y, p[2].y, p[3].y})+.1; - const double pb = std::min({p[0].y, p[1].y, p[2].y, p[3].y})-.1; - const double pw = pr - pl; - const double ph = pu - pb; - - const int32_t pli = static_cast((pl + 1) / 2 * w); - const int32_t pri = static_cast((pr + 1) / 2 * w); - const int32_t pui = static_cast((pu + 1) / 2 * h); - const int32_t pbi = static_cast((pb + 1) / 2 * h); - const int32_t pwi = pri - pli; - const int32_t phi = pui - pbi; - - vec3 q[4] = { - { pl, pu, 1 }, - { pl, pb, 1 }, - { pr, pb, 1 }, - { pr, pu, 1 }, - }; - for (size_t i = 0; i < 4; ++i) { - q[i] = ::linalg::mul(invmat_, q[i]); - } - const double ql = std::min({q[0].x, q[1].x, q[2].x, q[3].x}); - const double qr = std::max({q[0].x, q[1].x, q[2].x, q[3].x}); - const double qu = std::max({q[0].y, q[1].y, q[2].y, q[3].y}); - const double qb = std::min({q[0].y, q[1].y, q[2].y, q[3].y}); - - const double qldx = q[0].x - q[1].x; - const double qrdx = q[3].x - q[2].x; - const double qldy = q[0].y - q[1].y; - const double qrdy = q[3].y - q[2].y; - - const float* src = src_.ptr(); - float* dst = fb.ptr(); - for (int32_t y = 0; y <= phi; ++y) { - const double yfr = y*1. / phi; - - const double lxf = qldx * yfr + q[1].x; - const double rxf = qrdx * yfr + q[2].x; - const double ax = (rxf - lxf) / pwi; - - const double lyf = qldy * yfr + q[1].y; - const double ryf = qrdy * yfr + q[2].y; - const double ay = (ryf - lyf) / pwi; - - for (int32_t x = 0; x <= pwi; ++x) { - const double xf = lxf + ax*x; - const double yf = lyf + ay*x; - if (std::abs(xf) > 1 || std::abs(yf) > 1) continue; - - int32_t srcx = static_cast((xf+1)/2 * srcw); - int32_t srcy = srch - 1 - static_cast((yf+1)/2 * srch); - if (srcx >= srcw) srcx = srcw - 1; - if (srcy >= srch) srcy = srch - 1; - - const int32_t dstx = pli + x; - const int32_t dsty = (h-pui) + y; - if (dstx < 0 || w <= dstx) continue; - if (dsty < 0 || h <= dsty) continue; - - dst[dstx + w*dsty] = src[srcx + srcw*srcy]; - } - } - } - - void SetSource(Colorbuffer&& src) { - src_ = std::move(src); - } - - private: - Colorbuffer src_; -}; - - -} \ No newline at end of file diff --git a/src/Font.cc b/src/Font.cc new file mode 100644 index 0000000..db56126 --- /dev/null +++ b/src/Font.cc @@ -0,0 +1,4 @@ +/* Because an implementation of stb_truetype is huge, compiles it separately. */ + +#define STB_TRUETYPE_IMPLEMENTATION +#include "Font.h" \ No newline at end of file diff --git a/Font.h b/src/Font.h similarity index 94% rename from Font.h rename to src/Font.h index 3442966..619a950 100644 --- a/Font.h +++ b/src/Font.h @@ -33,7 +33,7 @@ namespace gj { const size_t size = ifs.tellg(); ifs.seekg(0); - buf_ = alloc_->MakeUniqueArray(size); + buf_ = alloc_->MakeUniqArray(size); ifs.read(reinterpret_cast(buf_.get()), size); const int offset = stbtt_GetFontOffsetForIndex(buf_.get(), 0); @@ -66,7 +66,7 @@ namespace gj { stbtt_fontinfo stb_; - iAllocator::UniquePtr buf_; + UniqPtr buf_; }; diff --git a/src/Frame.h b/src/Frame.h new file mode 100644 index 0000000..4932477 --- /dev/null +++ b/src/Frame.h @@ -0,0 +1,55 @@ +#pragma once + +#include + +#include "iDrawable.h" +#include "iWritable.h" + + +namespace gj { + + +class Frame : public iDrawable, public iWritable { + public: + Frame() = delete; + Frame(Frame&&) = delete; + Frame(const Frame&) = delete; + + Frame& operator=(Frame&&) = delete; + Frame& operator=(const Frame&) = delete; + + Frame(size_t dres, size_t wres) { + draw_.reserve(dres); + write_.reserve(wres); + } + + void Clear() { + draw_.clear(); + write_.clear(); + } + + void Add(const iDrawable* d) { + draw_.push_back(d); + } + void Add(const iWritable* w) { + write_.push_back(w); + } + + void Draw(Colorbuffer& fb) const override { + for (auto d : draw_) { + d->Draw(fb); + } + } + void Write(Textbuffer& fb) const override { + for (auto w : write_) { + w->Write(fb); + } + } + + private: + std::vector draw_; + std::vector write_; +}; + + +} \ No newline at end of file diff --git a/src/Game.cc b/src/Game.cc new file mode 100644 index 0000000..7e999e1 --- /dev/null +++ b/src/Game.cc @@ -0,0 +1,19 @@ +#include "Game.h" +#include "PlayScene.h" + + +gj::Game::Game(gj::Game::Param&& p) : + alloc_(p.alloc), + clock_(p.clock), + logger_(p.h), + w_(p.w), h_(p.h), + frame_(kReserveDrawable, kReserveWritable) { + gj::PlayScene::Param param; + param.alloc = alloc_; + param.clock = &clock_; + param.logger = &logger_; + param.w = w_; + param.h = h_; + param.score = "test"; /* TODO test */ + scene_ = alloc_->MakeUniq(std::move(param)); +} \ No newline at end of file diff --git a/src/Game.h b/src/Game.h new file mode 100644 index 0000000..afe836e --- /dev/null +++ b/src/Game.h @@ -0,0 +1,70 @@ +#pragma once + +#include +#include +#include + +#include "Frame.h" +#include "iDrawable.h" +#include "iWritable.h" +#include "iScene.h" +#include "Logger.h" +#include "TickingClock.h" + + +namespace gj { + + +class Game : public iDrawable, public iWritable { + public: + static constexpr size_t kReserveDrawable = 256; + static constexpr size_t kReserveWritable = 64; + + struct Param { + iAllocator* alloc; + const iClock* clock; + + uint32_t w, h; + }; + + Game() = delete; + Game(Game&&) = delete; + Game(const Game&) = delete; + + Game& operator=(Game&&) = delete; + Game& operator=(const Game&) = delete; + + Game(Param&& p); + + void Update() { + clock_.Tick(); + + frame_.Clear(); + UniqPtr next = scene_->Update(frame_); + if (next) { + scene_ = std::move(next); + } + } + + void Draw(Colorbuffer& fb) const override { + frame_.Draw(fb); + } + void Write(Textbuffer& fb) const override { + frame_.Write(fb); + logger_.Write(fb); + } + + private: + iAllocator* alloc_; + TickingClock clock_; + + Logger logger_; + + uint32_t w_, h_; + Frame frame_; + + UniqPtr scene_; +}; + + +} \ No newline at end of file diff --git a/LinearAllocator.h b/src/LinearAllocator.h similarity index 98% rename from LinearAllocator.h rename to src/LinearAllocator.h index 537c2d5..a12a6e1 100644 --- a/LinearAllocator.h +++ b/src/LinearAllocator.h @@ -14,7 +14,7 @@ namespace gj { class LinearAllocator : public iAllocator { public: using iAllocator::Alloc; - using iAllocator::MakeUnique; + using iAllocator::MakeUniq; LinearAllocator() = delete; LinearAllocator(LinearAllocator&&) = delete; diff --git a/Logger.h b/src/Logger.h similarity index 100% rename from Logger.h rename to src/Logger.h diff --git a/src/Lua.cc b/src/Lua.cc new file mode 100644 index 0000000..47a6a76 --- /dev/null +++ b/src/Lua.cc @@ -0,0 +1,119 @@ +#include "Lua.h" + + +class LuaFunc : public gj::iElementDriver { + public: + LuaFunc() = delete; + LuaFunc(LuaFunc&&) = delete; + LuaFunc(const LuaFunc&) = delete; + + LuaFunc& operator=(LuaFunc&&) = delete; + LuaFunc& operator=(const LuaFunc&) = delete; + + LuaFunc(lua_State* L) : L(L) { + func_ = luaL_ref(L, LUA_REGISTRYINDEX); + + lua_createtable(L, 0, 0); + table_ = luaL_ref(L, LUA_REGISTRYINDEX); + } + ~LuaFunc() { + luaL_unref(L, LUA_REGISTRYINDEX, func_); + } + + void Update(Param& param) override { + lua_rawgeti(L, LUA_REGISTRYINDEX, func_); + + lua_rawgeti(L, LUA_REGISTRYINDEX, table_); + for (const auto& p : param) { + lua_pushstring(L, p.first.c_str()); + if (std::holds_alternative(p.second)) { + lua_pushinteger(L, std::get(p.second)); + } else if (std::holds_alternative(p.second)) { + lua_pushnumber(L, std::get(p.second)); + } else if (std::holds_alternative(p.second)) { + const std::string str = std::get(p.second); + lua_pushstring(L, str.c_str()); + } else { + assert(false); + } + lua_rawset(L, -3); + } + + const int ret = lua_pcall(L, 1, 0, 0); + if (ret) { + gj::Abort(std::string("Lua error: ")+lua_tostring(L, -1)); + } + + lua_rawgeti(L, LUA_REGISTRYINDEX, table_); + for (auto& p : param) { + lua_pushstring(L, p.first.c_str()); + lua_rawget(L, -2); + + if (std::holds_alternative(p.second)) { + p.second = luaL_checkinteger(L, -1); + } else if (std::holds_alternative(p.second)) { + p.second = luaL_checknumber(L, -1); + } else if (std::holds_alternative(p.second)) { + p.second = luaL_checkstring(L, -1); + } else { + assert(false); + } + lua_pop(L, 1); + } + lua_pop(L, 1); + } + + private: + lua_State* L; + + int func_ = LUA_REFNIL; + int table_ = LUA_REFNIL; +}; + + +static int CallFactory_(lua_State* L) { + gj::iAllocator* alloc = + reinterpret_cast(lua_touserdata(L, lua_upvalueindex(1))); + gj::iElementFactory* factory = + reinterpret_cast(lua_touserdata(L, lua_upvalueindex(2))); + + const lua_Integer st = luaL_checkinteger(L, 1); + const lua_Integer ed = luaL_checkinteger(L, 2); + if (st >= ed) { + return luaL_error(L, "invalid period"); + } + if (!lua_isfunction(L, 3)) { + return luaL_error(L, "no driver specified"); + } + + lua_pushvalue(L, 3); + factory->Create(gj::Period(st, ed), alloc->MakeUniq(L)); + return 0; +} + + +gj::Lua::Lua(iAllocator* alloc, const FactoryMap& factory, const std::string& path) { + L = luaL_newstate(); + if (L == nullptr) { + Abort("lua_newstate failure"); + } + + for (const auto& f : factory) { + lua_pushstring(L, f.first.c_str()); + + lua_pushlightuserdata(L, alloc); + lua_pushlightuserdata(L, f.second); + lua_pushcclosure(L, CallFactory_, 2); + + lua_rawset(L, LUA_GLOBALSINDEX); + } + + if (0 != luaL_loadfile(L, path.c_str())) { + const char* msg = lua_tostring(L, -1); + Abort(std::string("luaL_loadfile failure: ") + msg); + } + const int ret = lua_pcall(L, 0, 0, 0); + if (ret) { + gj::Abort(std::string("Lua error: ") + lua_tostring(L, -1)); + } +} \ No newline at end of file diff --git a/src/Lua.h b/src/Lua.h new file mode 100644 index 0000000..4b3a20c --- /dev/null +++ b/src/Lua.h @@ -0,0 +1,38 @@ +#pragma once + +#include +#include + +#include "thirdparty/lua.hpp" + +#include "common.h" +#include "iAllocator.h" +#include "iElementFactory.h" + + +namespace gj { + + +class Lua { + public: + using FactoryMap = std::map; + + Lua() = delete; + Lua(Lua&&) = delete; + Lua(const Lua&) = delete; + + Lua& operator=(Lua&&) = delete; + Lua& operator=(const Lua&) = delete; + + Lua(iAllocator* alloc, const FactoryMap& factory, const std::string& path); + + ~Lua() { + lua_close(L); + } + + private: + lua_State* L = nullptr; +}; + + +} \ No newline at end of file diff --git a/OffsetClock.h b/src/OffsetClock.h similarity index 100% rename from OffsetClock.h rename to src/OffsetClock.h diff --git a/src/Period.h b/src/Period.h new file mode 100644 index 0000000..9b26a7f --- /dev/null +++ b/src/Period.h @@ -0,0 +1,29 @@ +#pragma once + +#include + +namespace gj { + + +struct Period { + public: + Period() = delete; + + Period(uint64_t st, uint64_t ed) : start(st), end(ed) { + assert(st <= ed); + } + + bool isHit(uint64_t now) const { + return start <= now && now < end; + } + + uint64_t duration() const { + return end - start; + } + + uint64_t start; + uint64_t end; +}; + + +} \ No newline at end of file diff --git a/src/PlayScene.cc b/src/PlayScene.cc new file mode 100644 index 0000000..44c3d02 --- /dev/null +++ b/src/PlayScene.cc @@ -0,0 +1,10 @@ +#include "PlayScene.h" + + +gj::PlayScene::PlayScene(gj::PlayScene::Param&& p) : + alloc_(p.alloc), logger_(p.logger), w_(p.w), h_(p.h), + clock_(p.clock) { + lua_ = alloc_->MakeUniq(alloc_, Lua::FactoryMap(), "res/score/"+p.score+".lua"); + + logger_->Print(L"PlayScene init"); +} \ No newline at end of file diff --git a/src/PlayScene.h b/src/PlayScene.h new file mode 100644 index 0000000..debc3ac --- /dev/null +++ b/src/PlayScene.h @@ -0,0 +1,51 @@ +#pragma once + +#include "Frame.h" +#include "iAllocator.h" +#include "iLogger.h" +#include "iScene.h" +#include "Lua.h" +#include "OffsetClock.h" + + +namespace gj { + + +class PlayScene : public iScene { + public: + struct Param { + iAllocator* alloc; + iLogger* logger; + const iClock* clock; + + uint32_t w, h; + + std::string score; + }; + + PlayScene() = delete; + PlayScene(PlayScene&&) = delete; + PlayScene(const PlayScene&) = delete; + + PlayScene& operator=(PlayScene&&) = delete; + PlayScene& operator=(const PlayScene&) = delete; + + PlayScene(Param&& p); + + UniqPtr Update(Frame& f) override { + return nullptr; + } + + private: + iAllocator* alloc_; + iLogger* logger_; + + uint32_t w_, h_; + + OffsetClock clock_; + + UniqPtr lua_; +}; + + +} \ No newline at end of file diff --git a/Rasterbuffer.h b/src/Rasterbuffer.h similarity index 100% rename from Rasterbuffer.h rename to src/Rasterbuffer.h diff --git a/StackAllocator.h b/src/StackAllocator.h similarity index 97% rename from StackAllocator.h rename to src/StackAllocator.h index 0a6f1ee..b4bcceb 100644 --- a/StackAllocator.h +++ b/src/StackAllocator.h @@ -13,7 +13,7 @@ namespace gj { class StackAllocator : public iAllocator { public: using iAllocator::Alloc; - using iAllocator::MakeUnique; + using iAllocator::MakeUniq; StackAllocator() = delete; StackAllocator(StackAllocator&&) = delete; diff --git a/SystemClock.h b/src/SystemClock.h similarity index 100% rename from SystemClock.h rename to src/SystemClock.h diff --git a/Text.h b/src/Text.h similarity index 100% rename from Text.h rename to src/Text.h diff --git a/src/Texture.cc b/src/Texture.cc new file mode 100644 index 0000000..a0f74d7 --- /dev/null +++ b/src/Texture.cc @@ -0,0 +1,87 @@ +#include "Texture.h" + + +void gj::Texture::Draw(Colorbuffer& fb) const { + const int32_t w = static_cast(fb.width()); + const int32_t h = static_cast(fb.height()); + + const int32_t srcw = static_cast(src_.width()); + const int32_t srch = static_cast(src_.height()); + + /* dst coordinate */ + vec3 p[4] = { + { -1, 1, 1 }, + { -1, -1, 1 }, + { 1, -1, 1 }, + { 1, 1, 1 }, + }; + for (size_t i = 0; i < 4; ++i) { + p[i] = ::linalg::mul(mat_, p[i]); + } + const double pl = std::min({p[0].x, p[1].x, p[2].x, p[3].x})-.1; + const double pr = std::max({p[0].x, p[1].x, p[2].x, p[3].x})+.1; + const double pu = std::max({p[0].y, p[1].y, p[2].y, p[3].y})+.1; + const double pb = std::min({p[0].y, p[1].y, p[2].y, p[3].y})-.1; + const double pw = pr - pl; + const double ph = pu - pb; + + const int32_t pli = static_cast((pl + 1) / 2 * w); + const int32_t pri = static_cast((pr + 1) / 2 * w); + const int32_t pui = static_cast((pu + 1) / 2 * h); + const int32_t pbi = static_cast((pb + 1) / 2 * h); + const int32_t pwi = pri - pli; + const int32_t phi = pui - pbi; + + /* src coordinate */ + vec3 q[4] = { + { pl, pu, 1 }, + { pl, pb, 1 }, + { pr, pb, 1 }, + { pr, pu, 1 }, + }; + for (size_t i = 0; i < 4; ++i) { + q[i] = ::linalg::mul(invmat_, q[i]); + } + const double ql = std::min({q[0].x, q[1].x, q[2].x, q[3].x}); + const double qr = std::max({q[0].x, q[1].x, q[2].x, q[3].x}); + const double qu = std::max({q[0].y, q[1].y, q[2].y, q[3].y}); + const double qb = std::min({q[0].y, q[1].y, q[2].y, q[3].y}); + + const double qldx = q[0].x - q[1].x; + const double qrdx = q[3].x - q[2].x; + const double qldy = q[0].y - q[1].y; + const double qrdy = q[3].y - q[2].y; + + /* blit with transformation */ + const float* src = src_.ptr(); + float* dst = fb.ptr(); + for (int32_t y = 0; y <= phi; ++y) { + const double yfr = y*1. / phi; + + const double lxf = qldx * yfr + q[1].x; + const double rxf = qrdx * yfr + q[2].x; + const double ax = (rxf - lxf) / pwi; + + const double lyf = qldy * yfr + q[1].y; + const double ryf = qrdy * yfr + q[2].y; + const double ay = (ryf - lyf) / pwi; + + for (int32_t x = 0; x <= pwi; ++x) { + const double xf = lxf + ax*x; + const double yf = lyf + ay*x; + if (std::abs(xf) > 1 || std::abs(yf) > 1) continue; + + int32_t srcx = static_cast((xf+1)/2 * srcw); + int32_t srcy = srch - 1 - static_cast((yf+1)/2 * srch); + if (srcx >= srcw) srcx = srcw - 1; + if (srcy >= srch) srcy = srch - 1; + + const int32_t dstx = pli + x; + const int32_t dsty = (h-pui) + y; + if (dstx < 0 || w <= dstx) continue; + if (dsty < 0 || h <= dsty) continue; + + dst[dstx + w*dsty] = src[srcx + srcw*srcy]; + } + } +} \ No newline at end of file diff --git a/src/Texture.h b/src/Texture.h new file mode 100644 index 0000000..9570064 --- /dev/null +++ b/src/Texture.h @@ -0,0 +1,37 @@ +#pragma once + +#include + +#include "thirdparty/linalg.h" + +#include "iDrawable.h" +#include "Rasterbuffer.h" + + +namespace gj { + + +class Texture : public DrawableBase { + public: + Texture() = delete; + Texture(Texture&&) = default; + Texture(const Texture&) = default; + + Texture& operator=(Texture&&) = default; + Texture& operator=(const Texture&) = default; + + Texture(Colorbuffer&& src) : src_(std::move(src)) { + } + + void Draw(Colorbuffer& fb) const override; + + void SetSource(Colorbuffer&& src) { + src_ = std::move(src); + } + + private: + Colorbuffer src_; +}; + + +} \ No newline at end of file diff --git a/src/TickingClock.h b/src/TickingClock.h new file mode 100644 index 0000000..a0c7be8 --- /dev/null +++ b/src/TickingClock.h @@ -0,0 +1,43 @@ +#pragma once + +#include + +#define NOMINMAX +#include +#undef NOMINMAX + +#include "iClock.h" + + +namespace gj { + + + class TickingClock : public iClock { + public: + TickingClock() = delete; + TickingClock(TickingClock&&) = default; + TickingClock(const TickingClock&) = default; + + TickingClock& operator=(TickingClock&&) = default; + TickingClock& operator=(const TickingClock&) = default; + + TickingClock(const iClock* parent) : parent_(parent) { + Tick(); + } + + void Tick() { + now_ = parent_->now(); + } + + uint64_t now() const override { + return now_; + } + + private: + const iClock* parent_; + + uint64_t now_; + }; + + +} \ No newline at end of file diff --git a/Win32Console.cc b/src/Win32Console.cc similarity index 97% rename from Win32Console.cc rename to src/Win32Console.cc index 548b609..f1c39ae 100644 --- a/Win32Console.cc +++ b/src/Win32Console.cc @@ -18,7 +18,7 @@ static void CalcChar(CHAR_INFO& c, float color, uint16_t text) { constexpr size_t reso = char_expr_count*attr_expr_count; /* post effect */ - color = std::pow(color, 1.9); + color = static_cast(std::pow(color, 1.9)); int8_t a = static_cast(color*reso); if (a >= reso) a = reso-1; diff --git a/Win32Console.h b/src/Win32Console.h similarity index 100% rename from Win32Console.h rename to src/Win32Console.h diff --git a/common.h b/src/common.h similarity index 74% rename from common.h rename to src/common.h index 726f5d4..8895a57 100644 --- a/common.h +++ b/src/common.h @@ -5,11 +5,19 @@ #include #include +#define NOMINMAX #include +#undef NOMINMAX + +#include "thirdparty/linalg.h" namespace gj { +using mat3 = ::linalg::mat; +using vec3 = ::linalg::vec; + + static inline std::wstring ConvertUtf8ToUtf16(const std::string& str) { std::wostringstream conv; conv << str.c_str(); diff --git a/iAllocator.h b/src/iAllocator.h similarity index 69% rename from iAllocator.h rename to src/iAllocator.h index 494a230..88927c4 100644 --- a/iAllocator.h +++ b/src/iAllocator.h @@ -32,7 +32,7 @@ public: }; template - using UniquePtr = std::unique_ptr>; + using UniqPtr = std::unique_ptr>; iAllocator(iAllocator&&) = default; iAllocator(const iAllocator&) = default; @@ -53,16 +53,24 @@ public: } template - UniquePtr MakeUnique(Args&&... args) { + UniqPtr MakeUniq(Args&&... args) { T* ptr = Alloc(); - return std::unique_ptr>(new(ptr) T(args...), Deleter(this)); + return std::unique_ptr>(new(ptr) T(std::forward(args)...), Deleter(this)); + } + template + UniqPtr MakeUniq(Args&&... args) { + T* ptr = Alloc(); + return std::unique_ptr>(new(ptr) T(std::forward(args)...), Deleter(this)); } template - UniquePtr MakeUniqueArray(size_t n) { + UniqPtr MakeUniqArray(size_t n) { T* ptr = Alloc(n); return std::unique_ptr>(ptr, Deleter(this)); } }; +template +using UniqPtr = iAllocator::UniqPtr; + } \ No newline at end of file diff --git a/iClock.h b/src/iClock.h similarity index 100% rename from iClock.h rename to src/iClock.h diff --git a/iConsole.h b/src/iConsole.h similarity index 100% rename from iConsole.h rename to src/iConsole.h diff --git a/iDrawable.h b/src/iDrawable.h similarity index 89% rename from iDrawable.h rename to src/iDrawable.h index ab15fed..e69b1b6 100644 --- a/iDrawable.h +++ b/src/iDrawable.h @@ -1,16 +1,12 @@ #pragma once -#include "thirdparty/linalg.h" - +#include "common.h" #include "Rasterbuffer.h" namespace gj { -using mat3 = ::linalg::mat; -using vec3 = ::linalg::vec; - class iDrawable { public: iDrawable(iDrawable&&) = default; diff --git a/src/iElement.h b/src/iElement.h new file mode 100644 index 0000000..b233047 --- /dev/null +++ b/src/iElement.h @@ -0,0 +1,28 @@ +#pragma once + +#include "Frame.h" +#include "Period.h" + + +namespace gj { + + +class iElement { + public: + iElement(iElement&&) = default; + iElement(const iElement&) = default; + + iElement& operator=(iElement&&) = default; + iElement& operator=(const iElement&) = default; + + iElement() = default; + virtual ~iElement() = default; + + virtual void Update(Frame& f) = 0; + + /* Interfaces had better not have a variable but this is for optimization. */ + const Period period; +}; + + +} \ No newline at end of file diff --git a/src/iElementDriver.h b/src/iElementDriver.h new file mode 100644 index 0000000..76e6ecc --- /dev/null +++ b/src/iElementDriver.h @@ -0,0 +1,29 @@ +#pragma once + +#include +#include +#include + + +namespace gj { + + +class iElementDriver { + public: + using Value = std::variant; + using Param = std::map; + + iElementDriver(iElementDriver&&) = default; + iElementDriver(const iElementDriver&) = default; + + iElementDriver& operator=(iElementDriver&&) = default; + iElementDriver& operator=(const iElementDriver&) = default; + + iElementDriver() = default; + virtual ~iElementDriver() = default; + + virtual void Update(Param&) = 0; +}; + + +} \ No newline at end of file diff --git a/src/iElementFactory.h b/src/iElementFactory.h new file mode 100644 index 0000000..e5379d2 --- /dev/null +++ b/src/iElementFactory.h @@ -0,0 +1,27 @@ +#pragma once + +#include "iAllocator.h" +#include "iElement.h" +#include "iElementDriver.h" +#include "Period.h" + + +namespace gj { + + +class iElementFactory { + public: + iElementFactory(iElementFactory&&) = default; + iElementFactory(const iElementFactory&) = default; + + iElementFactory& operator=(iElementFactory&&) = default; + iElementFactory& operator=(const iElementFactory&) = default; + + iElementFactory() = default; + virtual ~iElementFactory() = default; + + virtual UniqPtr Create(const Period& p, UniqPtr&& drv) = 0; +}; + + +} \ No newline at end of file diff --git a/iLogger.h b/src/iLogger.h similarity index 100% rename from iLogger.h rename to src/iLogger.h diff --git a/src/iScene.h b/src/iScene.h new file mode 100644 index 0000000..f9feb02 --- /dev/null +++ b/src/iScene.h @@ -0,0 +1,30 @@ +#pragma once + +#include + +#include "Frame.h" +#include "iAllocator.h" +#include "iDrawable.h" +#include "iWritable.h" + + +namespace gj { + + +class iScene { + public: + iScene() = default; + iScene(iScene&&) = default; + iScene(const iScene&) = default; + + iScene& operator=(iScene&&) = default; + iScene& operator=(const iScene&) = default; + + virtual ~iScene() = default; + + /* Returns next scene if this scene ends, otherwise nullptr. */ + virtual UniqPtr Update(Frame& f) = 0; +}; + + +} \ No newline at end of file diff --git a/iWritable.h b/src/iWritable.h similarity index 100% rename from iWritable.h rename to src/iWritable.h diff --git a/main.cc b/src/main.cc similarity index 80% rename from main.cc rename to src/main.cc index 8f2e391..bdf290e 100644 --- a/main.cc +++ b/src/main.cc @@ -9,6 +9,7 @@ #include "Font.h" #include "Game.h" #include "LinearAllocator.h" +#include "SystemClock.h" #include "Win32Console.h" @@ -24,7 +25,12 @@ int main() { gj::Win32Console console(&alloc, kWidth, kHeight); console.Show(); - gj::Game game(&alloc, kWidth, kHeight); + gj::Game::Param param; + param.alloc = &alloc; + param.clock = &gj::SystemClock::instance(); + param.w = kWidth; + param.h = kHeight; + gj::Game game(std::move(param)); while (true) { game.Update(); { diff --git a/thirdparty/lauxlib.h b/thirdparty/lauxlib.h new file mode 100644 index 0000000..3425823 --- /dev/null +++ b/thirdparty/lauxlib.h @@ -0,0 +1,174 @@ +/* +** $Id: lauxlib.h,v 1.88.1.1 2007/12/27 13:02:25 roberto Exp $ +** Auxiliary functions for building Lua libraries +** See Copyright Notice in lua.h +*/ + + +#ifndef lauxlib_h +#define lauxlib_h + + +#include +#include + +#include "lua.h" + + +#if defined(LUA_COMPAT_GETN) +LUALIB_API int (luaL_getn) (lua_State *L, int t); +LUALIB_API void (luaL_setn) (lua_State *L, int t, int n); +#else +#define luaL_getn(L,i) ((int)lua_objlen(L, i)) +#define luaL_setn(L,i,j) ((void)0) /* no op! */ +#endif + +#if defined(LUA_COMPAT_OPENLIB) +#define luaI_openlib luaL_openlib +#endif + + +/* extra error code for `luaL_load' */ +#define LUA_ERRFILE (LUA_ERRERR+1) + + +typedef struct luaL_Reg { + const char *name; + lua_CFunction func; +} luaL_Reg; + + + +LUALIB_API void (luaI_openlib) (lua_State *L, const char *libname, + const luaL_Reg *l, int nup); +LUALIB_API void (luaL_register) (lua_State *L, const char *libname, + const luaL_Reg *l); +LUALIB_API int (luaL_getmetafield) (lua_State *L, int obj, const char *e); +LUALIB_API int (luaL_callmeta) (lua_State *L, int obj, const char *e); +LUALIB_API int (luaL_typerror) (lua_State *L, int narg, const char *tname); +LUALIB_API int (luaL_argerror) (lua_State *L, int numarg, const char *extramsg); +LUALIB_API const char *(luaL_checklstring) (lua_State *L, int numArg, + size_t *l); +LUALIB_API const char *(luaL_optlstring) (lua_State *L, int numArg, + const char *def, size_t *l); +LUALIB_API lua_Number (luaL_checknumber) (lua_State *L, int numArg); +LUALIB_API lua_Number (luaL_optnumber) (lua_State *L, int nArg, lua_Number def); + +LUALIB_API lua_Integer (luaL_checkinteger) (lua_State *L, int numArg); +LUALIB_API lua_Integer (luaL_optinteger) (lua_State *L, int nArg, + lua_Integer def); + +LUALIB_API void (luaL_checkstack) (lua_State *L, int sz, const char *msg); +LUALIB_API void (luaL_checktype) (lua_State *L, int narg, int t); +LUALIB_API void (luaL_checkany) (lua_State *L, int narg); + +LUALIB_API int (luaL_newmetatable) (lua_State *L, const char *tname); +LUALIB_API void *(luaL_checkudata) (lua_State *L, int ud, const char *tname); + +LUALIB_API void (luaL_where) (lua_State *L, int lvl); +LUALIB_API int (luaL_error) (lua_State *L, const char *fmt, ...); + +LUALIB_API int (luaL_checkoption) (lua_State *L, int narg, const char *def, + const char *const lst[]); + +LUALIB_API int (luaL_ref) (lua_State *L, int t); +LUALIB_API void (luaL_unref) (lua_State *L, int t, int ref); + +LUALIB_API int (luaL_loadfile) (lua_State *L, const char *filename); +LUALIB_API int (luaL_loadbuffer) (lua_State *L, const char *buff, size_t sz, + const char *name); +LUALIB_API int (luaL_loadstring) (lua_State *L, const char *s); + +LUALIB_API lua_State *(luaL_newstate) (void); + + +LUALIB_API const char *(luaL_gsub) (lua_State *L, const char *s, const char *p, + const char *r); + +LUALIB_API const char *(luaL_findtable) (lua_State *L, int idx, + const char *fname, int szhint); + + + + +/* +** =============================================================== +** some useful macros +** =============================================================== +*/ + +#define luaL_argcheck(L, cond,numarg,extramsg) \ + ((void)((cond) || luaL_argerror(L, (numarg), (extramsg)))) +#define luaL_checkstring(L,n) (luaL_checklstring(L, (n), NULL)) +#define luaL_optstring(L,n,d) (luaL_optlstring(L, (n), (d), NULL)) +#define luaL_checkint(L,n) ((int)luaL_checkinteger(L, (n))) +#define luaL_optint(L,n,d) ((int)luaL_optinteger(L, (n), (d))) +#define luaL_checklong(L,n) ((long)luaL_checkinteger(L, (n))) +#define luaL_optlong(L,n,d) ((long)luaL_optinteger(L, (n), (d))) + +#define luaL_typename(L,i) lua_typename(L, lua_type(L,(i))) + +#define luaL_dofile(L, fn) \ + (luaL_loadfile(L, fn) || lua_pcall(L, 0, LUA_MULTRET, 0)) + +#define luaL_dostring(L, s) \ + (luaL_loadstring(L, s) || lua_pcall(L, 0, LUA_MULTRET, 0)) + +#define luaL_getmetatable(L,n) (lua_getfield(L, LUA_REGISTRYINDEX, (n))) + +#define luaL_opt(L,f,n,d) (lua_isnoneornil(L,(n)) ? (d) : f(L,(n))) + +/* +** {====================================================== +** Generic Buffer manipulation +** ======================================================= +*/ + + + +typedef struct luaL_Buffer { + char *p; /* current position in buffer */ + int lvl; /* number of strings in the stack (level) */ + lua_State *L; + char buffer[LUAL_BUFFERSIZE]; +} luaL_Buffer; + +#define luaL_addchar(B,c) \ + ((void)((B)->p < ((B)->buffer+LUAL_BUFFERSIZE) || luaL_prepbuffer(B)), \ + (*(B)->p++ = (char)(c))) + +/* compatibility only */ +#define luaL_putchar(B,c) luaL_addchar(B,c) + +#define luaL_addsize(B,n) ((B)->p += (n)) + +LUALIB_API void (luaL_buffinit) (lua_State *L, luaL_Buffer *B); +LUALIB_API char *(luaL_prepbuffer) (luaL_Buffer *B); +LUALIB_API void (luaL_addlstring) (luaL_Buffer *B, const char *s, size_t l); +LUALIB_API void (luaL_addstring) (luaL_Buffer *B, const char *s); +LUALIB_API void (luaL_addvalue) (luaL_Buffer *B); +LUALIB_API void (luaL_pushresult) (luaL_Buffer *B); + + +/* }====================================================== */ + + +/* compatibility with ref system */ + +/* pre-defined references */ +#define LUA_NOREF (-2) +#define LUA_REFNIL (-1) + +#define lua_ref(L,lock) ((lock) ? luaL_ref(L, LUA_REGISTRYINDEX) : \ + (lua_pushstring(L, "unlocked references are obsolete"), lua_error(L), 0)) + +#define lua_unref(L,ref) luaL_unref(L, LUA_REGISTRYINDEX, (ref)) + +#define lua_getref(L,ref) lua_rawgeti(L, LUA_REGISTRYINDEX, (ref)) + + +#define luaL_reg luaL_Reg + +#endif + + diff --git a/thirdparty/lua.h b/thirdparty/lua.h new file mode 100644 index 0000000..e4bdfd3 --- /dev/null +++ b/thirdparty/lua.h @@ -0,0 +1,388 @@ +/* +** $Id: lua.h,v 1.218.1.5 2008/08/06 13:30:12 roberto Exp $ +** Lua - An Extensible Extension Language +** Lua.org, PUC-Rio, Brazil (http://www.lua.org) +** See Copyright Notice at the end of this file +*/ + + +#ifndef lua_h +#define lua_h + +#include +#include + + +#include "luaconf.h" + + +#define LUA_VERSION "Lua 5.1" +#define LUA_RELEASE "Lua 5.1.4" +#define LUA_VERSION_NUM 501 +#define LUA_COPYRIGHT "Copyright (C) 1994-2008 Lua.org, PUC-Rio" +#define LUA_AUTHORS "R. Ierusalimschy, L. H. de Figueiredo & W. Celes" + + +/* mark for precompiled code (`Lua') */ +#define LUA_SIGNATURE "\033Lua" + +/* option for multiple returns in `lua_pcall' and `lua_call' */ +#define LUA_MULTRET (-1) + + +/* +** pseudo-indices +*/ +#define LUA_REGISTRYINDEX (-10000) +#define LUA_ENVIRONINDEX (-10001) +#define LUA_GLOBALSINDEX (-10002) +#define lua_upvalueindex(i) (LUA_GLOBALSINDEX-(i)) + + +/* thread status; 0 is OK */ +#define LUA_YIELD 1 +#define LUA_ERRRUN 2 +#define LUA_ERRSYNTAX 3 +#define LUA_ERRMEM 4 +#define LUA_ERRERR 5 + + +typedef struct lua_State lua_State; + +typedef int (*lua_CFunction) (lua_State *L); + + +/* +** functions that read/write blocks when loading/dumping Lua chunks +*/ +typedef const char * (*lua_Reader) (lua_State *L, void *ud, size_t *sz); + +typedef int (*lua_Writer) (lua_State *L, const void* p, size_t sz, void* ud); + + +/* +** prototype for memory-allocation functions +*/ +typedef void * (*lua_Alloc) (void *ud, void *ptr, size_t osize, size_t nsize); + + +/* +** basic types +*/ +#define LUA_TNONE (-1) + +#define LUA_TNIL 0 +#define LUA_TBOOLEAN 1 +#define LUA_TLIGHTUSERDATA 2 +#define LUA_TNUMBER 3 +#define LUA_TSTRING 4 +#define LUA_TTABLE 5 +#define LUA_TFUNCTION 6 +#define LUA_TUSERDATA 7 +#define LUA_TTHREAD 8 + + + +/* minimum Lua stack available to a C function */ +#define LUA_MINSTACK 20 + + +/* +** generic extra include file +*/ +#if defined(LUA_USER_H) +#include LUA_USER_H +#endif + + +/* type of numbers in Lua */ +typedef LUA_NUMBER lua_Number; + + +/* type for integer functions */ +typedef LUA_INTEGER lua_Integer; + + + +/* +** state manipulation +*/ +LUA_API lua_State *(lua_newstate) (lua_Alloc f, void *ud); +LUA_API void (lua_close) (lua_State *L); +LUA_API lua_State *(lua_newthread) (lua_State *L); + +LUA_API lua_CFunction (lua_atpanic) (lua_State *L, lua_CFunction panicf); + + +/* +** basic stack manipulation +*/ +LUA_API int (lua_gettop) (lua_State *L); +LUA_API void (lua_settop) (lua_State *L, int idx); +LUA_API void (lua_pushvalue) (lua_State *L, int idx); +LUA_API void (lua_remove) (lua_State *L, int idx); +LUA_API void (lua_insert) (lua_State *L, int idx); +LUA_API void (lua_replace) (lua_State *L, int idx); +LUA_API int (lua_checkstack) (lua_State *L, int sz); + +LUA_API void (lua_xmove) (lua_State *from, lua_State *to, int n); + + +/* +** access functions (stack -> C) +*/ + +LUA_API int (lua_isnumber) (lua_State *L, int idx); +LUA_API int (lua_isstring) (lua_State *L, int idx); +LUA_API int (lua_iscfunction) (lua_State *L, int idx); +LUA_API int (lua_isuserdata) (lua_State *L, int idx); +LUA_API int (lua_type) (lua_State *L, int idx); +LUA_API const char *(lua_typename) (lua_State *L, int tp); + +LUA_API int (lua_equal) (lua_State *L, int idx1, int idx2); +LUA_API int (lua_rawequal) (lua_State *L, int idx1, int idx2); +LUA_API int (lua_lessthan) (lua_State *L, int idx1, int idx2); + +LUA_API lua_Number (lua_tonumber) (lua_State *L, int idx); +LUA_API lua_Integer (lua_tointeger) (lua_State *L, int idx); +LUA_API int (lua_toboolean) (lua_State *L, int idx); +LUA_API const char *(lua_tolstring) (lua_State *L, int idx, size_t *len); +LUA_API size_t (lua_objlen) (lua_State *L, int idx); +LUA_API lua_CFunction (lua_tocfunction) (lua_State *L, int idx); +LUA_API void *(lua_touserdata) (lua_State *L, int idx); +LUA_API lua_State *(lua_tothread) (lua_State *L, int idx); +LUA_API const void *(lua_topointer) (lua_State *L, int idx); + + +/* +** push functions (C -> stack) +*/ +LUA_API void (lua_pushnil) (lua_State *L); +LUA_API void (lua_pushnumber) (lua_State *L, lua_Number n); +LUA_API void (lua_pushinteger) (lua_State *L, lua_Integer n); +LUA_API void (lua_pushlstring) (lua_State *L, const char *s, size_t l); +LUA_API void (lua_pushstring) (lua_State *L, const char *s); +LUA_API const char *(lua_pushvfstring) (lua_State *L, const char *fmt, + va_list argp); +LUA_API const char *(lua_pushfstring) (lua_State *L, const char *fmt, ...); +LUA_API void (lua_pushcclosure) (lua_State *L, lua_CFunction fn, int n); +LUA_API void (lua_pushboolean) (lua_State *L, int b); +LUA_API void (lua_pushlightuserdata) (lua_State *L, void *p); +LUA_API int (lua_pushthread) (lua_State *L); + + +/* +** get functions (Lua -> stack) +*/ +LUA_API void (lua_gettable) (lua_State *L, int idx); +LUA_API void (lua_getfield) (lua_State *L, int idx, const char *k); +LUA_API void (lua_rawget) (lua_State *L, int idx); +LUA_API void (lua_rawgeti) (lua_State *L, int idx, int n); +LUA_API void (lua_createtable) (lua_State *L, int narr, int nrec); +LUA_API void *(lua_newuserdata) (lua_State *L, size_t sz); +LUA_API int (lua_getmetatable) (lua_State *L, int objindex); +LUA_API void (lua_getfenv) (lua_State *L, int idx); + + +/* +** set functions (stack -> Lua) +*/ +LUA_API void (lua_settable) (lua_State *L, int idx); +LUA_API void (lua_setfield) (lua_State *L, int idx, const char *k); +LUA_API void (lua_rawset) (lua_State *L, int idx); +LUA_API void (lua_rawseti) (lua_State *L, int idx, int n); +LUA_API int (lua_setmetatable) (lua_State *L, int objindex); +LUA_API int (lua_setfenv) (lua_State *L, int idx); + + +/* +** `load' and `call' functions (load and run Lua code) +*/ +LUA_API void (lua_call) (lua_State *L, int nargs, int nresults); +LUA_API int (lua_pcall) (lua_State *L, int nargs, int nresults, int errfunc); +LUA_API int (lua_cpcall) (lua_State *L, lua_CFunction func, void *ud); +LUA_API int (lua_load) (lua_State *L, lua_Reader reader, void *dt, + const char *chunkname); + +LUA_API int (lua_dump) (lua_State *L, lua_Writer writer, void *data); + + +/* +** coroutine functions +*/ +LUA_API int (lua_yield) (lua_State *L, int nresults); +LUA_API int (lua_resume) (lua_State *L, int narg); +LUA_API int (lua_status) (lua_State *L); + +/* +** garbage-collection function and options +*/ + +#define LUA_GCSTOP 0 +#define LUA_GCRESTART 1 +#define LUA_GCCOLLECT 2 +#define LUA_GCCOUNT 3 +#define LUA_GCCOUNTB 4 +#define LUA_GCSTEP 5 +#define LUA_GCSETPAUSE 6 +#define LUA_GCSETSTEPMUL 7 + +LUA_API int (lua_gc) (lua_State *L, int what, int data); + + +/* +** miscellaneous functions +*/ + +LUA_API int (lua_error) (lua_State *L); + +LUA_API int (lua_next) (lua_State *L, int idx); + +LUA_API void (lua_concat) (lua_State *L, int n); + +LUA_API lua_Alloc (lua_getallocf) (lua_State *L, void **ud); +LUA_API void lua_setallocf (lua_State *L, lua_Alloc f, void *ud); + + + +/* +** =============================================================== +** some useful macros +** =============================================================== +*/ + +#define lua_pop(L,n) lua_settop(L, -(n)-1) + +#define lua_newtable(L) lua_createtable(L, 0, 0) + +#define lua_register(L,n,f) (lua_pushcfunction(L, (f)), lua_setglobal(L, (n))) + +#define lua_pushcfunction(L,f) lua_pushcclosure(L, (f), 0) + +#define lua_strlen(L,i) lua_objlen(L, (i)) + +#define lua_isfunction(L,n) (lua_type(L, (n)) == LUA_TFUNCTION) +#define lua_istable(L,n) (lua_type(L, (n)) == LUA_TTABLE) +#define lua_islightuserdata(L,n) (lua_type(L, (n)) == LUA_TLIGHTUSERDATA) +#define lua_isnil(L,n) (lua_type(L, (n)) == LUA_TNIL) +#define lua_isboolean(L,n) (lua_type(L, (n)) == LUA_TBOOLEAN) +#define lua_isthread(L,n) (lua_type(L, (n)) == LUA_TTHREAD) +#define lua_isnone(L,n) (lua_type(L, (n)) == LUA_TNONE) +#define lua_isnoneornil(L, n) (lua_type(L, (n)) <= 0) + +#define lua_pushliteral(L, s) \ + lua_pushlstring(L, "" s, (sizeof(s)/sizeof(char))-1) + +#define lua_setglobal(L,s) lua_setfield(L, LUA_GLOBALSINDEX, (s)) +#define lua_getglobal(L,s) lua_getfield(L, LUA_GLOBALSINDEX, (s)) + +#define lua_tostring(L,i) lua_tolstring(L, (i), NULL) + + + +/* +** compatibility macros and functions +*/ + +#define lua_open() luaL_newstate() + +#define lua_getregistry(L) lua_pushvalue(L, LUA_REGISTRYINDEX) + +#define lua_getgccount(L) lua_gc(L, LUA_GCCOUNT, 0) + +#define lua_Chunkreader lua_Reader +#define lua_Chunkwriter lua_Writer + + +/* hack */ +LUA_API void lua_setlevel (lua_State *from, lua_State *to); + + +/* +** {====================================================================== +** Debug API +** ======================================================================= +*/ + + +/* +** Event codes +*/ +#define LUA_HOOKCALL 0 +#define LUA_HOOKRET 1 +#define LUA_HOOKLINE 2 +#define LUA_HOOKCOUNT 3 +#define LUA_HOOKTAILRET 4 + + +/* +** Event masks +*/ +#define LUA_MASKCALL (1 << LUA_HOOKCALL) +#define LUA_MASKRET (1 << LUA_HOOKRET) +#define LUA_MASKLINE (1 << LUA_HOOKLINE) +#define LUA_MASKCOUNT (1 << LUA_HOOKCOUNT) + +typedef struct lua_Debug lua_Debug; /* activation record */ + + +/* Functions to be called by the debuger in specific events */ +typedef void (*lua_Hook) (lua_State *L, lua_Debug *ar); + + +LUA_API int lua_getstack (lua_State *L, int level, lua_Debug *ar); +LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar); +LUA_API const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int n); +LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n); +LUA_API const char *lua_getupvalue (lua_State *L, int funcindex, int n); +LUA_API const char *lua_setupvalue (lua_State *L, int funcindex, int n); + +LUA_API int lua_sethook (lua_State *L, lua_Hook func, int mask, int count); +LUA_API lua_Hook lua_gethook (lua_State *L); +LUA_API int lua_gethookmask (lua_State *L); +LUA_API int lua_gethookcount (lua_State *L); + + +struct lua_Debug { + int event; + const char *name; /* (n) */ + const char *namewhat; /* (n) `global', `local', `field', `method' */ + const char *what; /* (S) `Lua', `C', `main', `tail' */ + const char *source; /* (S) */ + int currentline; /* (l) */ + int nups; /* (u) number of upvalues */ + int linedefined; /* (S) */ + int lastlinedefined; /* (S) */ + char short_src[LUA_IDSIZE]; /* (S) */ + /* private part */ + int i_ci; /* active function */ +}; + +/* }====================================================================== */ + + +/****************************************************************************** +* Copyright (C) 1994-2008 Lua.org, PUC-Rio. All rights reserved. +* +* 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. +******************************************************************************/ + + +#endif diff --git a/thirdparty/lua.hpp b/thirdparty/lua.hpp new file mode 100644 index 0000000..ec417f5 --- /dev/null +++ b/thirdparty/lua.hpp @@ -0,0 +1,9 @@ +// lua.hpp +// Lua header files for C++ +// <> not supplied automatically because Lua also compiles as C++ + +extern "C" { +#include "lua.h" +#include "lualib.h" +#include "lauxlib.h" +} diff --git a/thirdparty/lua5.1.dll b/thirdparty/lua5.1.dll new file mode 100644 index 0000000..b15fa18 Binary files /dev/null and b/thirdparty/lua5.1.dll differ diff --git a/thirdparty/lua5.1.lib b/thirdparty/lua5.1.lib new file mode 100644 index 0000000..ba5788d Binary files /dev/null and b/thirdparty/lua5.1.lib differ diff --git a/thirdparty/luaconf.h b/thirdparty/luaconf.h new file mode 100644 index 0000000..bb3fa30 --- /dev/null +++ b/thirdparty/luaconf.h @@ -0,0 +1,766 @@ +/* +** $Id: luaconf.h,v 1.82.1.7 2008/02/11 16:25:08 roberto Exp $ +** Configuration file for Lua +** See Copyright Notice in lua.h +*/ + + +#ifndef lconfig_h +#define lconfig_h + +#include +#include + + +/* +** ================================================================== +** Search for "@@" to find all configurable definitions. +** =================================================================== +*/ + + +/* +@@ LUA_ANSI controls the use of non-ansi features. +** CHANGE it (define it) if you want Lua to avoid the use of any +** non-ansi feature or library. +*/ +#if defined(__STRICT_ANSI__) +#define LUA_ANSI +#endif + + +#if !defined(LUA_ANSI) && defined(_WIN32) +#define LUA_WIN +#endif + +#if defined(LUA_USE_LINUX) +#define LUA_USE_POSIX +#define LUA_USE_DLOPEN /* needs an extra library: -ldl */ +#define LUA_USE_READLINE /* needs some extra libraries */ +#endif + +#if defined(LUA_USE_MACOSX) +#define LUA_USE_POSIX +#define LUA_DL_DYLD /* does not need extra library */ +#endif + + + +/* +@@ LUA_USE_POSIX includes all functionallity listed as X/Open System +@* Interfaces Extension (XSI). +** CHANGE it (define it) if your system is XSI compatible. +*/ +#if defined(LUA_USE_POSIX) +#define LUA_USE_MKSTEMP +#define LUA_USE_ISATTY +#define LUA_USE_POPEN +#define LUA_USE_ULONGJMP +#endif + + +/* +@@ LUA_PATH and LUA_CPATH are the names of the environment variables that +@* Lua check to set its paths. +@@ LUA_INIT is the name of the environment variable that Lua +@* checks for initialization code. +** CHANGE them if you want different names. +*/ +#define LUA_PATH "LUA_PATH" +#define LUA_CPATH "LUA_CPATH" +#define LUA_INIT "LUA_INIT" + + +/* +@@ LUA_PATH_DEFAULT is the default path that Lua uses to look for +@* Lua libraries. +@@ LUA_CPATH_DEFAULT is the default path that Lua uses to look for +@* C libraries. +** CHANGE them if your machine has a non-conventional directory +** hierarchy or if you want to install your libraries in +** non-conventional directories. +*/ +#if defined(_WIN32) +/* +** In Windows, any exclamation mark ('!') in the path is replaced by the +** path of the directory of the executable file of the current process. +*/ +#define LUA_LDIR "!\\lua\\" +#define LUA_CDIR "!\\" +#define LUA_PATH_DEFAULT \ + ".\\?.lua;" LUA_LDIR"?.lua;" LUA_LDIR"?\\init.lua;" \ + LUA_CDIR"?.lua;" LUA_CDIR"?\\init.lua" +#define LUA_CPATH_DEFAULT \ + ".\\?.dll;" LUA_CDIR"?.dll;" LUA_CDIR"loadall.dll;" \ + LUA_CDIR"clibs\\?.dll;" LUA_CDIR"clibs\\loadall.dll;" \ + ".\\?51.dll;" LUA_CDIR"?51.dll;" LUA_CDIR"clibs\\?51.dll" + +#else +#define LUA_ROOT "/usr/local/" +#define LUA_LDIR LUA_ROOT "share/lua/5.1/" +#define LUA_CDIR LUA_ROOT "lib/lua/5.1/" +#define LUA_PATH_DEFAULT \ + "./?.lua;" LUA_LDIR"?.lua;" LUA_LDIR"?/init.lua;" \ + LUA_CDIR"?.lua;" LUA_CDIR"?/init.lua" +#define LUA_CPATH_DEFAULT \ + "./?.so;" LUA_CDIR"?.so;" LUA_CDIR"loadall.so;" \ + "./lib?51.so;" LUA_CDIR"lib?51.so;" +#endif + + +/* +@@ LUA_DIRSEP is the directory separator (for submodules). +** CHANGE it if your machine does not use "/" as the directory separator +** and is not Windows. (On Windows Lua automatically uses "\".) +*/ +#if defined(_WIN32) +#define LUA_DIRSEP "\\" +#else +#define LUA_DIRSEP "/" +#endif + + +/* +@@ LUA_PATHSEP is the character that separates templates in a path. +@@ LUA_PATH_MARK is the string that marks the substitution points in a +@* template. +@@ LUA_EXECDIR in a Windows path is replaced by the executable's +@* directory. +@@ LUA_IGMARK is a mark to ignore all before it when bulding the +@* luaopen_ function name. +** CHANGE them if for some reason your system cannot use those +** characters. (E.g., if one of those characters is a common character +** in file/directory names.) Probably you do not need to change them. +*/ +#define LUA_PATHSEP ";" +#define LUA_PATH_MARK "?" +#define LUA_EXECDIR "!" +#define LUA_IGMARK "-" + + +/* +@@ LUA_INTEGER is the integral type used by lua_pushinteger/lua_tointeger. +** CHANGE that if ptrdiff_t is not adequate on your machine. (On most +** machines, ptrdiff_t gives a good choice between int or long.) +*/ +#define LUA_INTEGER ptrdiff_t + + +/* +@@ LUA_API is a mark for all core API functions. +@@ LUALIB_API is a mark for all standard library functions. +** CHANGE them if you need to define those functions in some special way. +** For instance, if you want to create one Windows DLL with the core and +** the libraries, you may want to use the following definition (define +** LUA_BUILD_AS_DLL to get it). +*/ +#if defined(LUA_BUILD_AS_DLL) + +#if defined(LUA_CORE) || defined(LUA_LIB) +#define LUA_API __declspec(dllexport) +#else +#define LUA_API __declspec(dllimport) +#endif + +#else + +#define LUA_API extern + +#endif + +/* more often than not the libs go together with the core */ +#define LUALIB_API LUA_API + + +/* +@@ LUAI_FUNC is a mark for all extern functions that are not to be +@* exported to outside modules. +@@ LUAI_DATA is a mark for all extern (const) variables that are not to +@* be exported to outside modules. +** CHANGE them if you need to mark them in some special way. Elf/gcc +** (versions 3.2 and later) mark them as "hidden" to optimize access +** when Lua is compiled as a shared library. +*/ +#if defined(luaall_c) +#define LUAI_FUNC static +#define LUAI_DATA /* empty */ + +#elif defined(__GNUC__) && ((__GNUC__*100 + __GNUC_MINOR__) >= 302) && \ + defined(__ELF__) +#define LUAI_FUNC __attribute__((visibility("hidden"))) extern +#define LUAI_DATA LUAI_FUNC + +#else +#define LUAI_FUNC extern +#define LUAI_DATA extern +#endif + + + +/* +@@ LUA_QL describes how error messages quote program elements. +** CHANGE it if you want a different appearance. +*/ +#define LUA_QL(x) "'" x "'" +#define LUA_QS LUA_QL("%s") + + +/* +@@ LUA_IDSIZE gives the maximum size for the description of the source +@* of a function in debug information. +** CHANGE it if you want a different size. +*/ +#define LUA_IDSIZE 60 + + +/* +** {================================================================== +** Stand-alone configuration +** =================================================================== +*/ + +#if defined(lua_c) || defined(luaall_c) + +/* +@@ lua_stdin_is_tty detects whether the standard input is a 'tty' (that +@* is, whether we're running lua interactively). +** CHANGE it if you have a better definition for non-POSIX/non-Windows +** systems. +*/ +#if defined(LUA_USE_ISATTY) +#include +#define lua_stdin_is_tty() isatty(0) +#elif defined(LUA_WIN) +#include +#include +#define lua_stdin_is_tty() _isatty(_fileno(stdin)) +#else +#define lua_stdin_is_tty() 1 /* assume stdin is a tty */ +#endif + + +/* +@@ LUA_PROMPT is the default prompt used by stand-alone Lua. +@@ LUA_PROMPT2 is the default continuation prompt used by stand-alone Lua. +** CHANGE them if you want different prompts. (You can also change the +** prompts dynamically, assigning to globals _PROMPT/_PROMPT2.) +*/ +#define LUA_PROMPT "> " +#define LUA_PROMPT2 ">> " + + +/* +@@ LUA_PROGNAME is the default name for the stand-alone Lua program. +** CHANGE it if your stand-alone interpreter has a different name and +** your system is not able to detect that name automatically. +*/ +#define LUA_PROGNAME "lua" + + +/* +@@ LUA_MAXINPUT is the maximum length for an input line in the +@* stand-alone interpreter. +** CHANGE it if you need longer lines. +*/ +#define LUA_MAXINPUT 512 + + +/* +@@ lua_readline defines how to show a prompt and then read a line from +@* the standard input. +@@ lua_saveline defines how to "save" a read line in a "history". +@@ lua_freeline defines how to free a line read by lua_readline. +** CHANGE them if you want to improve this functionality (e.g., by using +** GNU readline and history facilities). +*/ +#if defined(LUA_USE_READLINE) +#include +#include +#include +#define lua_readline(L,b,p) ((void)L, ((b)=readline(p)) != NULL) +#define lua_saveline(L,idx) \ + if (lua_strlen(L,idx) > 0) /* non-empty line? */ \ + add_history(lua_tostring(L, idx)); /* add it to history */ +#define lua_freeline(L,b) ((void)L, free(b)) +#else +#define lua_readline(L,b,p) \ + ((void)L, fputs(p, stdout), fflush(stdout), /* show prompt */ \ + fgets(b, LUA_MAXINPUT, stdin) != NULL) /* get line */ +#define lua_saveline(L,idx) { (void)L; (void)idx; } +#define lua_freeline(L,b) { (void)L; (void)b; } +#endif + +#endif + +/* }================================================================== */ + + +/* +@@ LUAI_GCPAUSE defines the default pause between garbage-collector cycles +@* as a percentage. +** CHANGE it if you want the GC to run faster or slower (higher values +** mean larger pauses which mean slower collection.) You can also change +** this value dynamically. +*/ +#define LUAI_GCPAUSE 200 /* 200% (wait memory to double before next GC) */ + + +/* +@@ LUAI_GCMUL defines the default speed of garbage collection relative to +@* memory allocation as a percentage. +** CHANGE it if you want to change the granularity of the garbage +** collection. (Higher values mean coarser collections. 0 represents +** infinity, where each step performs a full collection.) You can also +** change this value dynamically. +*/ +#define LUAI_GCMUL 200 /* GC runs 'twice the speed' of memory allocation */ + + + +/* +@@ LUA_COMPAT_GETN controls compatibility with old getn behavior. +** CHANGE it (define it) if you want exact compatibility with the +** behavior of setn/getn in Lua 5.0. +*/ +#undef LUA_COMPAT_GETN + +/* +@@ LUA_COMPAT_LOADLIB controls compatibility about global loadlib. +** CHANGE it to undefined as soon as you do not need a global 'loadlib' +** function (the function is still available as 'package.loadlib'). +*/ +#undef LUA_COMPAT_LOADLIB + +/* +@@ LUA_COMPAT_VARARG controls compatibility with old vararg feature. +** CHANGE it to undefined as soon as your programs use only '...' to +** access vararg parameters (instead of the old 'arg' table). +*/ +#define LUA_COMPAT_VARARG + +/* +@@ LUA_COMPAT_MOD controls compatibility with old math.mod function. +** CHANGE it to undefined as soon as your programs use 'math.fmod' or +** the new '%' operator instead of 'math.mod'. +*/ +#define LUA_COMPAT_MOD + +/* +@@ LUA_COMPAT_LSTR controls compatibility with old long string nesting +@* facility. +** CHANGE it to 2 if you want the old behaviour, or undefine it to turn +** off the advisory error when nesting [[...]]. +*/ +#define LUA_COMPAT_LSTR 1 + +/* +@@ LUA_COMPAT_GFIND controls compatibility with old 'string.gfind' name. +** CHANGE it to undefined as soon as you rename 'string.gfind' to +** 'string.gmatch'. +*/ +#define LUA_COMPAT_GFIND + +/* +@@ LUA_COMPAT_OPENLIB controls compatibility with old 'luaL_openlib' +@* behavior. +** CHANGE it to undefined as soon as you replace to 'luaL_register' +** your uses of 'luaL_openlib' +*/ +#define LUA_COMPAT_OPENLIB + + + +/* +@@ luai_apicheck is the assert macro used by the Lua-C API. +** CHANGE luai_apicheck if you want Lua to perform some checks in the +** parameters it gets from API calls. This may slow down the interpreter +** a bit, but may be quite useful when debugging C code that interfaces +** with Lua. A useful redefinition is to use assert.h. +*/ +#if defined(LUA_USE_APICHECK) +#include +#define luai_apicheck(L,o) { (void)L; assert(o); } +#else +#define luai_apicheck(L,o) { (void)L; } +#endif + + +/* +@@ LUAI_BITSINT defines the number of bits in an int. +** CHANGE here if Lua cannot automatically detect the number of bits of +** your machine. Probably you do not need to change this. +*/ +/* avoid overflows in comparison */ +#if INT_MAX-20 < 32760 +#define LUAI_BITSINT 16 +#elif INT_MAX > 2147483640L +/* int has at least 32 bits */ +#define LUAI_BITSINT 32 +#else +#error "you must define LUA_BITSINT with number of bits in an integer" +#endif + + +/* +@@ LUAI_UINT32 is an unsigned integer with at least 32 bits. +@@ LUAI_INT32 is an signed integer with at least 32 bits. +@@ LUAI_UMEM is an unsigned integer big enough to count the total +@* memory used by Lua. +@@ LUAI_MEM is a signed integer big enough to count the total memory +@* used by Lua. +** CHANGE here if for some weird reason the default definitions are not +** good enough for your machine. (The definitions in the 'else' +** part always works, but may waste space on machines with 64-bit +** longs.) Probably you do not need to change this. +*/ +#if LUAI_BITSINT >= 32 +#define LUAI_UINT32 unsigned int +#define LUAI_INT32 int +#define LUAI_MAXINT32 INT_MAX +#define LUAI_UMEM size_t +#define LUAI_MEM ptrdiff_t +#else +/* 16-bit ints */ +#define LUAI_UINT32 unsigned long +#define LUAI_INT32 long +#define LUAI_MAXINT32 LONG_MAX +#define LUAI_UMEM unsigned long +#define LUAI_MEM long +#endif + + +/* +@@ LUAI_MAXCALLS limits the number of nested calls. +** CHANGE it if you need really deep recursive calls. This limit is +** arbitrary; its only purpose is to stop infinite recursion before +** exhausting memory. +*/ +#define LUAI_MAXCALLS 20000 + + +/* +@@ LUAI_MAXCSTACK limits the number of Lua stack slots that a C function +@* can use. +** CHANGE it if you need lots of (Lua) stack space for your C +** functions. This limit is arbitrary; its only purpose is to stop C +** functions to consume unlimited stack space. (must be smaller than +** -LUA_REGISTRYINDEX) +*/ +#define LUAI_MAXCSTACK 8000 + + + +/* +** {================================================================== +** CHANGE (to smaller values) the following definitions if your system +** has a small C stack. (Or you may want to change them to larger +** values if your system has a large C stack and these limits are +** too rigid for you.) Some of these constants control the size of +** stack-allocated arrays used by the compiler or the interpreter, while +** others limit the maximum number of recursive calls that the compiler +** or the interpreter can perform. Values too large may cause a C stack +** overflow for some forms of deep constructs. +** =================================================================== +*/ + + +/* +@@ LUAI_MAXCCALLS is the maximum depth for nested C calls (short) and +@* syntactical nested non-terminals in a program. +*/ +#define LUAI_MAXCCALLS 200 + + +/* +@@ LUAI_MAXVARS is the maximum number of local variables per function +@* (must be smaller than 250). +*/ +#define LUAI_MAXVARS 200 + + +/* +@@ LUAI_MAXUPVALUES is the maximum number of upvalues per function +@* (must be smaller than 250). +*/ +#define LUAI_MAXUPVALUES 60 + + +/* +@@ LUAL_BUFFERSIZE is the buffer size used by the lauxlib buffer system. +*/ +#define LUAL_BUFFERSIZE BUFSIZ + +/* }================================================================== */ + + + + +/* +** {================================================================== +@@ LUA_NUMBER is the type of numbers in Lua. +** CHANGE the following definitions only if you want to build Lua +** with a number type different from double. You may also need to +** change lua_number2int & lua_number2integer. +** =================================================================== +*/ + +#define LUA_NUMBER_DOUBLE +#define LUA_NUMBER double + +/* +@@ LUAI_UACNUMBER is the result of an 'usual argument conversion' +@* over a number. +*/ +#define LUAI_UACNUMBER double + + +/* +@@ LUA_NUMBER_SCAN is the format for reading numbers. +@@ LUA_NUMBER_FMT is the format for writing numbers. +@@ lua_number2str converts a number to a string. +@@ LUAI_MAXNUMBER2STR is maximum size of previous conversion. +@@ lua_str2number converts a string to a number. +*/ +#define LUA_NUMBER_SCAN "%lf" +#define LUA_NUMBER_FMT "%.14g" +#define lua_number2str(s,n) sprintf((s), LUA_NUMBER_FMT, (n)) +#define LUAI_MAXNUMBER2STR 32 /* 16 digits, sign, point, and \0 */ +#define lua_str2number(s,p) strtod((s), (p)) + + +/* +@@ The luai_num* macros define the primitive operations over numbers. +*/ +#if defined(LUA_CORE) +#include +#define luai_numadd(a,b) ((a)+(b)) +#define luai_numsub(a,b) ((a)-(b)) +#define luai_nummul(a,b) ((a)*(b)) +#define luai_numdiv(a,b) ((a)/(b)) +#define luai_nummod(a,b) ((a) - floor((a)/(b))*(b)) +#define luai_numpow(a,b) (pow(a,b)) +#define luai_numunm(a) (-(a)) +#define luai_numeq(a,b) ((a)==(b)) +#define luai_numlt(a,b) ((a)<(b)) +#define luai_numle(a,b) ((a)<=(b)) +#define luai_numisnan(a) (!luai_numeq((a), (a))) +#endif + + +/* +@@ lua_number2int is a macro to convert lua_Number to int. +@@ lua_number2integer is a macro to convert lua_Number to lua_Integer. +** CHANGE them if you know a faster way to convert a lua_Number to +** int (with any rounding method and without throwing errors) in your +** system. In Pentium machines, a naive typecast from double to int +** in C is extremely slow, so any alternative is worth trying. +*/ + +/* On a Pentium, resort to a trick */ +#if defined(LUA_NUMBER_DOUBLE) && !defined(LUA_ANSI) && !defined(__SSE2__) && \ + (defined(__i386) || defined (_M_IX86) || defined(__i386__)) + +/* On a Microsoft compiler, use assembler */ +#if defined(_MSC_VER) + +#define lua_number2int(i,d) __asm fld d __asm fistp i +#define lua_number2integer(i,n) lua_number2int(i, n) + +/* the next trick should work on any Pentium, but sometimes clashes + with a DirectX idiosyncrasy */ +#else + +union luai_Cast { double l_d; long l_l; }; +#define lua_number2int(i,d) \ + { volatile union luai_Cast u; u.l_d = (d) + 6755399441055744.0; (i) = u.l_l; } +#define lua_number2integer(i,n) lua_number2int(i, n) + +#endif + + +/* this option always works, but may be slow */ +#else +#define lua_number2int(i,d) ((i)=(int)(d)) +#define lua_number2integer(i,d) ((i)=(lua_Integer)(d)) + +#endif + +/* }================================================================== */ + + +/* +@@ LUAI_USER_ALIGNMENT_T is a type that requires maximum alignment. +** CHANGE it if your system requires alignments larger than double. (For +** instance, if your system supports long doubles and they must be +** aligned in 16-byte boundaries, then you should add long double in the +** union.) Probably you do not need to change this. +*/ +#define LUAI_USER_ALIGNMENT_T union { double u; void *s; long l; } + + +/* +@@ LUAI_THROW/LUAI_TRY define how Lua does exception handling. +** CHANGE them if you prefer to use longjmp/setjmp even with C++ +** or if want/don't to use _longjmp/_setjmp instead of regular +** longjmp/setjmp. By default, Lua handles errors with exceptions when +** compiling as C++ code, with _longjmp/_setjmp when asked to use them, +** and with longjmp/setjmp otherwise. +*/ +#if defined(__cplusplus) +/* C++ exceptions */ +#define LUAI_THROW(L,c) throw(c) +#define LUAI_TRY(L,c,a) try { a } catch(...) \ + { if ((c)->status == 0) (c)->status = -1; } +#define luai_jmpbuf int /* dummy variable */ + +#elif defined(LUA_USE_ULONGJMP) +/* in Unix, try _longjmp/_setjmp (more efficient) */ +#define LUAI_THROW(L,c) _longjmp((c)->b, 1) +#define LUAI_TRY(L,c,a) if (_setjmp((c)->b) == 0) { a } +#define luai_jmpbuf jmp_buf + +#else +/* default handling with long jumps */ +#define LUAI_THROW(L,c) longjmp((c)->b, 1) +#define LUAI_TRY(L,c,a) if (setjmp((c)->b) == 0) { a } +#define luai_jmpbuf jmp_buf + +#endif + + +/* +@@ LUA_MAXCAPTURES is the maximum number of captures that a pattern +@* can do during pattern-matching. +** CHANGE it if you need more captures. This limit is arbitrary. +*/ +#define LUA_MAXCAPTURES 32 + + +/* +@@ lua_tmpnam is the function that the OS library uses to create a +@* temporary name. +@@ LUA_TMPNAMBUFSIZE is the maximum size of a name created by lua_tmpnam. +** CHANGE them if you have an alternative to tmpnam (which is considered +** insecure) or if you want the original tmpnam anyway. By default, Lua +** uses tmpnam except when POSIX is available, where it uses mkstemp. +*/ +#if defined(loslib_c) || defined(luaall_c) + +#if defined(LUA_USE_MKSTEMP) +#include +#define LUA_TMPNAMBUFSIZE 32 +#define lua_tmpnam(b,e) { \ + strcpy(b, "/tmp/lua_XXXXXX"); \ + e = mkstemp(b); \ + if (e != -1) close(e); \ + e = (e == -1); } + +#else +#define LUA_TMPNAMBUFSIZE L_tmpnam +#define lua_tmpnam(b,e) { e = (tmpnam(b) == NULL); } +#endif + +#endif + + +/* +@@ lua_popen spawns a new process connected to the current one through +@* the file streams. +** CHANGE it if you have a way to implement it in your system. +*/ +#if defined(LUA_USE_POPEN) + +#define lua_popen(L,c,m) ((void)L, fflush(NULL), popen(c,m)) +#define lua_pclose(L,file) ((void)L, (pclose(file) != -1)) + +#elif defined(LUA_WIN) + +#define lua_popen(L,c,m) ((void)L, _popen(c,m)) +#define lua_pclose(L,file) ((void)L, (_pclose(file) != -1)) + +#else + +#define lua_popen(L,c,m) ((void)((void)c, m), \ + luaL_error(L, LUA_QL("popen") " not supported"), (FILE*)0) +#define lua_pclose(L,file) ((void)((void)L, file), 0) + +#endif + +/* +@@ LUA_DL_* define which dynamic-library system Lua should use. +** CHANGE here if Lua has problems choosing the appropriate +** dynamic-library system for your platform (either Windows' DLL, Mac's +** dyld, or Unix's dlopen). If your system is some kind of Unix, there +** is a good chance that it has dlopen, so LUA_DL_DLOPEN will work for +** it. To use dlopen you also need to adapt the src/Makefile (probably +** adding -ldl to the linker options), so Lua does not select it +** automatically. (When you change the makefile to add -ldl, you must +** also add -DLUA_USE_DLOPEN.) +** If you do not want any kind of dynamic library, undefine all these +** options. +** By default, _WIN32 gets LUA_DL_DLL and MAC OS X gets LUA_DL_DYLD. +*/ +#if defined(LUA_USE_DLOPEN) +#define LUA_DL_DLOPEN +#endif + +#if defined(LUA_WIN) +#define LUA_DL_DLL +#endif + + +/* +@@ LUAI_EXTRASPACE allows you to add user-specific data in a lua_State +@* (the data goes just *before* the lua_State pointer). +** CHANGE (define) this if you really need that. This value must be +** a multiple of the maximum alignment required for your machine. +*/ +#define LUAI_EXTRASPACE 0 + + +/* +@@ luai_userstate* allow user-specific actions on threads. +** CHANGE them if you defined LUAI_EXTRASPACE and need to do something +** extra when a thread is created/deleted/resumed/yielded. +*/ +#define luai_userstateopen(L) ((void)L) +#define luai_userstateclose(L) ((void)L) +#define luai_userstatethread(L,L1) ((void)L) +#define luai_userstatefree(L) ((void)L) +#define luai_userstateresume(L,n) ((void)L) +#define luai_userstateyield(L,n) ((void)L) + + +/* +@@ LUA_INTFRMLEN is the length modifier for integer conversions +@* in 'string.format'. +@@ LUA_INTFRM_T is the integer type correspoding to the previous length +@* modifier. +** CHANGE them if your system supports long long or does not support long. +*/ + +#if defined(LUA_USELONGLONG) + +#define LUA_INTFRMLEN "ll" +#define LUA_INTFRM_T long long + +#else + +#define LUA_INTFRMLEN "l" +#define LUA_INTFRM_T long + +#endif + + + +/* =================================================================== */ + +/* +** Local configuration. You can use this space to add your redefinitions +** without modifying the main part of the file. +*/ + + + +#endif + diff --git a/thirdparty/lualib.h b/thirdparty/lualib.h new file mode 100644 index 0000000..469417f --- /dev/null +++ b/thirdparty/lualib.h @@ -0,0 +1,53 @@ +/* +** $Id: lualib.h,v 1.36.1.1 2007/12/27 13:02:25 roberto Exp $ +** Lua standard libraries +** See Copyright Notice in lua.h +*/ + + +#ifndef lualib_h +#define lualib_h + +#include "lua.h" + + +/* Key to file-handle type */ +#define LUA_FILEHANDLE "FILE*" + + +#define LUA_COLIBNAME "coroutine" +LUALIB_API int (luaopen_base) (lua_State *L); + +#define LUA_TABLIBNAME "table" +LUALIB_API int (luaopen_table) (lua_State *L); + +#define LUA_IOLIBNAME "io" +LUALIB_API int (luaopen_io) (lua_State *L); + +#define LUA_OSLIBNAME "os" +LUALIB_API int (luaopen_os) (lua_State *L); + +#define LUA_STRLIBNAME "string" +LUALIB_API int (luaopen_string) (lua_State *L); + +#define LUA_MATHLIBNAME "math" +LUALIB_API int (luaopen_math) (lua_State *L); + +#define LUA_DBLIBNAME "debug" +LUALIB_API int (luaopen_debug) (lua_State *L); + +#define LUA_LOADLIBNAME "package" +LUALIB_API int (luaopen_package) (lua_State *L); + + +/* open all previous libraries */ +LUALIB_API void (luaL_openlibs) (lua_State *L); + + + +#ifndef lua_assert +#define lua_assert(x) ((void)0) +#endif + + +#endif