////////////////////////////////////////////////////////////////////////// // BBS Lua Project // // Author: Hung-Te Lin(piaip), Jan. 2008. // // This source is released in MIT License. // // TODO: // 1. add quick key/val conversion // 2. add key values (UP/DOWN/...) // 3. remove i/o libraries ////////////////////////////////////////////////////////////////////////// #include "bbs.h" #include #include #include ////////////////////////////////////////////////////////////////////////// // DEFINITION ////////////////////////////////////////////////////////////////////////// #define BBSLUA_VERSION (1) #define BBSLUA_VERSION_STR "1.0" #define BLAPI_PROTO int ////////////////////////////////////////////////////////////////////////// // BBSLUA API IMPLEMENTATION ////////////////////////////////////////////////////////////////////////// BLAPI_PROTO bl_getyx(lua_State* L) { int y, x; getyx(&y, &x); lua_pushinteger(L, y); lua_pushinteger(L, x); return 2; } BLAPI_PROTO bl_move(lua_State* L) { int n = lua_gettop(L); int y = 0, x = 0; if (n > 0) y = lua_tointeger(L, 1); if (n > 1) x = lua_tointeger(L, 2); move(y, x); return 0; } BLAPI_PROTO bl_clear(lua_State* L) { clear(); return 0; } BLAPI_PROTO bl_clrtoeol(lua_State* L) { clrtoeol(); return 0; } BLAPI_PROTO bl_clrtobot(lua_State* L) { clrtobot(); return 0; } BLAPI_PROTO bl_refresh(lua_State* L) { refresh(); return 0; } BLAPI_PROTO bl_redrawwin(lua_State* L) { redrawwin(); return 0; } BLAPI_PROTO bl_addstr(lua_State* L) { int n = lua_gettop(L); int i = 1; for (i = 1; i <= n; i++) { const char *s = lua_tostring(L, i); if(s) outs(s); } return 0; } BLAPI_PROTO bl_igetch(lua_State* L) { int c = igetch(); lua_pushinteger(L, c); return 1; } BLAPI_PROTO bl_getdata(lua_State* L) { int y, x; char buf[PATHLEN] = ""; int len = 2, echo = 1; int n = lua_gettop(L); if (n > 0) len = lua_tointeger(L, 1); if (n > 2) echo = lua_tointeger(L, 2); if (len < 2) len = 2; if (len >= sizeof(buf)) len = sizeof(buf)-1; getyx(&y, &x); len = getdata(y, x, NULL, buf, len, echo); if (len) lua_pushstring(L, buf); return len ? 1 : 0; } BLAPI_PROTO bl_vmsg(lua_State* L) { int n = lua_gettop(L); const char *s = NULL; if (n > 0) s = lua_tostring(L, 1); n = vmsg(s); lua_pushinteger(L, n); return 1; } BLAPI_PROTO bl_stand_title(lua_State* L) { int n = lua_gettop(L); const char *s = NULL; if (n > 0) s = lua_tostring(L, 1); if (s == NULL) return 0; stand_title(s); return 0; } ////////////////////////////////////////////////////////////////////////// // BBSLUA LIBRARY ////////////////////////////////////////////////////////////////////////// static const struct luaL_reg lib_bbslua [] = { /* curses output */ { "getyx", bl_getyx }, { "move", bl_move }, { "clear", bl_clear }, { "clrtoeol", bl_clrtoeol }, { "clrtobot", bl_clrtobot }, { "refresh", bl_refresh }, { "redrawwin", bl_redrawwin }, { "addch", bl_addstr }, { "addstr", bl_addstr }, { "outc", bl_addstr }, { "outs", bl_addstr }, /* input */ { "getch", bl_igetch }, { "igetch", bl_igetch }, { "getdata", bl_getdata }, /* BBS utilities */ { "vmsg", bl_vmsg }, { "pause", bl_vmsg }, { "stand_title",bl_stand_title }, { NULL, NULL}, }; static const luaL_Reg mylualibs[] = { {"", luaopen_base}, // {LUA_LOADLIBNAME, luaopen_package}, {LUA_TABLIBNAME, luaopen_table}, // {LUA_IOLIBNAME, luaopen_io}, // {LUA_OSLIBNAME, luaopen_os}, {LUA_STRLIBNAME, luaopen_string}, {LUA_MATHLIBNAME, luaopen_math}, // {LUA_DBLIBNAME, luaopen_debug}, {NULL, NULL} }; LUALIB_API void myluaL_openlibs (lua_State *L) { const luaL_Reg *lib = mylualibs; for (; lib->func; lib++) { lua_pushcfunction(L, lib->func); lua_pushstring(L, lib->name); lua_call(L, 1, 0); } } int bbslua(const char *fpath) { int r = 0; lua_State *L = lua_open(); myluaL_openlibs(L); luaL_openlib(L, "bbs", lib_bbslua, 0); grayout(0, b_lines, GRAYOUT_DARK); move(b_lines, 0); clrtoeol(); outs("Loading BBS-Lua " BBSLUA_VERSION_STR " ..."); refresh(); r = luaL_dofile(L, fpath); lua_close(L); grayout(0, b_lines, GRAYOUT_DARK); move(b_lines, 0); clrtoeol(); vmsgf("BBS-Lua: %s", r ? "FAILED" : "OK"); clear(); return 0; } // vim:ts=4:sw=4