#include "nse_debug.h"
#include "output.h"

void l_dumpStack(lua_State *L) {
	int stack_height = lua_gettop(L);
	int i;
	
	log_write(LOG_PLAIN, "-== Stack Dump Begin ==-\n");
	for(i = -1; i >= 0 - stack_height; i--) {
		log_write(LOG_PLAIN, "%d: ", i);
		l_dumpValue(L, i);
	}

	log_write(LOG_PLAIN, "-== Stack Dump End ==-\n");
}

void l_dumpValue(lua_State *L, int i) {
    switch (lua_type(L, i))
    {
      case LUA_TTABLE:
		l_dumpTable(L, i);
        break;
      case LUA_TFUNCTION:
		l_dumpFunction(L, i);
        break;
      case LUA_TSTRING:
		log_write(LOG_PLAIN, "string '%s'\n", lua_tostring(L, i));
        break;
      case LUA_TBOOLEAN:
		log_write(LOG_PLAIN, "boolean: %s\n",
            lua_toboolean(L, i) ? "true" : "false"); 
        break;
      case LUA_TNUMBER:
		log_write(LOG_PLAIN, "number: %g\n", lua_tonumber(L, i));
        break;
      default:
		log_write(LOG_PLAIN, "%s\n", lua_typename(L, lua_type(L, i)));
    }
}

void l_dumpTable(lua_State *L, int index) {
	log_write(LOG_PLAIN, "table\n");
	lua_pushnil(L);

	if (index<0) --index;
	while(lua_next(L, index) != 0)
	{
		l_dumpValue(L, -2);
		l_dumpValue(L, -1);
		lua_pop(L, 1); 
	}
}

void l_dumpFunction(lua_State *L, int index) {
//	lua_Debug ar;

	log_write(LOG_PLAIN, "function\n");	

//	lua_pushvalue(L, index);
//	lua_getinfo(L, ">n", &ar);
//	
//	log_write(LOG_PLAIN, "\tname: %s %s\n", ar.namewhat, ar.name);
	fflush(stdout);
}