Pushok icon

Lua Stack Module

Pushok | PRO | 05/02/11 09:54:08 AM UTC | 0 ⭐ | 723 👁️ | Never ⏰ | []
C++ |

3.61 KB

|

None

|

0 👍

/

0 👎

#include "windows.h"
 
extern "C" {
#include "math.h"
#include "string.h"
#include "stdio.h"
#include "stdlib.h"
#include "lua/lua.h"
#include "lua/lauxlib.h"
#include "lua/lualib.h"
}
 
template<typename T> class CStack {
public:
    static enum {CStack_StackEmpty, CStack_BadMemory};
 
    unsigned int slots()
    {
        return StackSize;
    }
 
    unsigned int size()
    {
        return StackIter;
    }
 
    bool empty()
    {
        return StackIter == 0;
    }
 
    T pop()
    {
        if(StackIter == 0) throw (int)CStack_StackEmpty;
 
        return _Stack[--StackIter];
    }
 
    void push(T j)
    {
        if(StackSize >= StackIter && _Stack != 0)
        {
            T* _newstack = (T*)malloc(sizeof(T) * (StackSize + 1));
 
            if(_newstack == NULL)
            {
                free(_newstack);
                this->~CStack();
                throw (int)CStack_BadMemory;
            }
 
            for(int i=0;i<StackSize;i++)
                _newstack[i] = _Stack[i];
 
            free(_Stack);
 
            _Stack = _newstack;
        }
        else if (_Stack == 0)
        {
            _Stack = (T*)malloc(sizeof(T) * (StackSize == 0 ? 1 : StackSize));
            if(_Stack == 0)
            {
                this->~CStack();
                throw (int)CStack_BadMemory;
            }
        }
 
        _Stack[StackSize++] = j;
 
        StackIter = StackSize;
 
    }
 
    void clear()
    {
        StackIter = 0;
    }
 
    CStack()
    {
        StackIter = StackSize = 0;
        _Stack = NULL;
    }
 
    ~CStack()
    {
        free(_Stack);
        StackIter = StackSize = 0;
    }
 
private:
    unsigned int StackSize, StackIter;
    T* _Stack;
};
 
CStack<LUA_NUMBER> *LuaStack = NULL;
 
extern "C" {
    int __declspec(dllexport) luaopen_stack (lua_State *L);
}
 
static int luaStack_Create(lua_State *Lua)
{
    if(LuaStack != NULL)
    {
        luaL_error(Lua, "Stack already created!");
        return 0;
    }
 
    LuaStack = new CStack<LUA_NUMBER>();
    return 0;
}
 
static int luaStack_Close(lua_State *Lua)
{
    if(LuaStack == NULL)
    {
        luaL_error(Lua, "Stack is not created!");
        return 0;
    }
 
    delete LuaStack;
    LuaStack = NULL;
    return 0;
}
 
static int luaStack_Push(lua_State *Lua)
{
    if(LuaStack == NULL)
    {
        luaL_error(Lua, "Stack is not created!");
        return 0;
    }
 
    LuaStack->push(lua_tonumber(Lua, 1));
    return 0;
}
 
static int luaStack_Pop(lua_State *Lua)
{
    if(LuaStack == NULL)
    {
        luaL_error(Lua, "Stack is not created!");
        return 0;
    }
 
    try
    {
        lua_pushnumber(Lua, LuaStack->pop());
    }
    catch (int e)
    {
        switch(e)
        {
        case static_cast<int>(CStack<LUA_NUMBER>::CStack_StackEmpty):
            lua_pushstring(Lua, "Stack is empty!");
            break;
        }
    }
    return 1;
}
 
static int luaStack_Clear(lua_State *Lua)
{
    if(LuaStack == NULL)
    {
        luaL_error(Lua, "Stack is not created!");
        return 0;
    }
 
    LuaStack->clear();
    return 0;
}
 
static int luaStack_Size(lua_State *Lua)
{
    if(LuaStack == NULL)
    {
        luaL_error(Lua, "Stack is not created!");
        return 0;
    }
 
    lua_pushnumber(Lua, LuaStack->size());
    return 1;
}
 
static int luaStack_Empty(lua_State *Lua)
{
    if(LuaStack == NULL)
    {
        luaL_error(Lua, "Stack is not created!");
        return 0;
    }
 
    lua_pushboolean(Lua, LuaStack->empty());
    return 1;
}
 
static int luaStack_Length(lua_State *Lua)
{
    if(LuaStack == NULL)
    {
        luaL_error(Lua, "Stack is not created!");
        return 0;
    }
 
    lua_pushnumber(Lua, LuaStack->slots());
    return 1;
}
 
int __declspec(dllexport) luaopen_stack (lua_State *L) {
    printf("Stack loaded!\n");
    struct luaL_reg driver[] = {
        {"push", luaStack_Push},
        {"pop", luaStack_Pop},
        {"clear", luaStack_Clear},
        {"size", luaStack_Size},
        {"empty", luaStack_Empty},
        {"create", luaStack_Create},
        {"close", luaStack_Close},
        {"length", luaStack_Length},
        {NULL, NULL}
    };
 
    luaL_openlib (L, "stack", driver, 0);
    return 1;
};

Comments