static void bbsluaHook(lua_State *L, lua_Debug* ar) { // vmsg("bbslua HOOK!"); if (blrt.abort) { vkey_purge(); lua_yield(L, 0); return; } if (ar->event != LUA_HOOKCOUNT) return; #ifdef BBSLUA_USAGE bbslua_count += BLCONF_EXEC_COUNT; #endif // now, peek and check if (vkey_is_full()) vkey_purge(); // refresh(); // check if input key is system break key. if (bl_peekbreak(BLCONF_PEEK_TIME)) { lua_yield(L, 0); return; } }
static int bl_peekbreak(float f) { if (vkey_is_full()) vkey_purge(); if (vkey_prefetch(f * MILLISECONDS) && vkey_is_prefetched(BLCONF_BREAK_KEY)) { vkey_purge(); blrt.abort = 1; return 1; } return 0; }
BLAPI_PROTO bl_kbreset(lua_State *L) { // peek input queue first! if (bl_peekbreak(BLCONF_PEEK_TIME)) return lua_yield(L, 0); vkey_purge(); return 0; }
BLAPI_PROTO bl_getstr(lua_State* L) { int y, x; // TODO not using fixed length here? char buf[PATHLEN] = ""; int len = 2, echo = 1; int n = lua_gettop(L); const char *pmsg = NULL; if (n > 0) len = lua_tointeger(L, 1); if (n > 1) echo = lua_tointeger(L, 2); if (n > 2) pmsg = lua_tostring(L, 3); if (len < 2) len = 2; if (len >= (int)sizeof(buf)) len = sizeof(buf) - 1; /* * this part now done in getdata_str if (pmsg && *pmsg) { strlcpy(buf, pmsg, sizeof(buf)); } */ // TODO process Ctrl-C here getyx(&y, &x); if (!pmsg) pmsg = ""; len = getdata_str(y, x, NULL, buf, len, echo, pmsg); if (len <= 0) { len = 0; // check if we got Ctrl-C? (workaround in getdata) // TODO someday write 'ungetch()' in io.c to prevent // such workaround. if (buf[1] == Ctrl('C')) { vkey_purge(); blrt.abort = 1; return lua_yield(L, 0); } lua_pushstring(L, ""); } else { lua_pushstring(L, buf); } // return len ? 1 : 0; return 1; }
BLAPI_PROTO bl_getch(lua_State* L) { int c = vkey(); if (c == BLCONF_BREAK_KEY) { vkey_purge(); blrt.abort = 1; return lua_yield(L, 0); } bl_k2s(L, c); return 1; }
void wait_penalty(int sec) { static time4_t lastWait = 0; syncnow(); if (now - lastWait < sec) { sec = now - lastWait; if (sec < 0 || sec >= 5) sec = 5; sleep(sec); vkey_purge(); } lastWait = now; }
BLAPI_PROTO bl_pause(lua_State* L) { int n = lua_gettop(L); const char *s = NULL; if (n > 0) s = lua_tostring(L, 1); n = vmsg(s); if (n == BLCONF_BREAK_KEY) { vkey_purge(); blrt.abort = 1; return lua_yield(L, 0); } bl_k2s(L, n); return 1; }