003 File Manager
Current Path:
/usr/src/contrib/lua/src
usr
/
src
/
contrib
/
lua
/
src
/
📁
..
📄
Makefile
(7.34 KB)
📄
lapi.c
(34.08 KB)
📄
lapi.h
(1.27 KB)
📄
lauxlib.c
(30.94 KB)
📄
lauxlib.h
(8.64 KB)
📄
lbaselib.c
(14.44 KB)
📄
lcode.c
(49.85 KB)
📄
lcode.h
(3.71 KB)
📄
lcorolib.c
(4.57 KB)
📄
lctype.c
(2.4 KB)
📄
lctype.h
(2.07 KB)
📄
ldblib.c
(12.94 KB)
📄
ldebug.c
(24.61 KB)
📄
ldebug.h
(1.87 KB)
📄
ldo.c
(27.19 KB)
📄
ldo.h
(2.77 KB)
📄
ldump.c
(4.66 KB)
📄
lfunc.c
(8.95 KB)
📄
lfunc.h
(1.72 KB)
📄
lgc.c
(54.47 KB)
📄
lgc.h
(5.87 KB)
📄
linit.c
(1.58 KB)
📄
liolib.c
(21.25 KB)
📄
ljumptab.h
(1.62 KB)
📄
llex.c
(16.38 KB)
📄
llex.h
(2.35 KB)
📄
llimits.h
(8.72 KB)
📄
lmathlib.c
(18.43 KB)
📄
lmem.c
(5.83 KB)
📄
lmem.h
(3.29 KB)
📄
loadlib.c
(22.39 KB)
📄
lobject.c
(18.45 KB)
📄
lobject.h
(21.49 KB)
📄
lopcodes.c
(4.03 KB)
📄
lopcodes.h
(12.38 KB)
📄
lopnames.h
(1.12 KB)
📄
loslib.c
(11.53 KB)
📄
lparser.c
(54.72 KB)
📄
lparser.h
(5.8 KB)
📄
lprefix.h
(828 B)
📄
lstate.c
(10.73 KB)
📄
lstate.h
(13.24 KB)
📄
lstring.c
(7.32 KB)
📄
lstring.h
(1.57 KB)
📄
lstrlib.c
(52.83 KB)
📄
ltable.c
(29.89 KB)
📄
ltable.h
(1.92 KB)
📄
ltablib.c
(12.82 KB)
📄
ltm.c
(7.97 KB)
📄
ltm.h
(2.84 KB)
📄
lua.c
(18.46 KB)
📄
lua.h
(15.4 KB)
📄
lua.hpp
(191 B)
📄
luac.c
(14.79 KB)
📄
luaconf.h.dist
(20.27 KB)
📄
lualib.h
(1.16 KB)
📄
lundump.c
(7.68 KB)
📄
lundump.h
(863 B)
📄
lutf8lib.c
(7.9 KB)
📄
lvm.c
(55.76 KB)
📄
lvm.h
(4.25 KB)
📄
lzio.c
(1.29 KB)
📄
lzio.h
(1.4 KB)
Editing: lcorolib.c
/* ** $Id: lcorolib.c $ ** Coroutine Library ** See Copyright Notice in lua.h */ #define lcorolib_c #define LUA_LIB #include "lprefix.h" #include <stdlib.h> #include "lua.h" #include "lauxlib.h" #include "lualib.h" static lua_State *getco (lua_State *L) { lua_State *co = lua_tothread(L, 1); luaL_argexpected(L, co, 1, "thread"); return co; } /* ** Resumes a coroutine. Returns the number of results for non-error ** cases or -1 for errors. */ static int auxresume (lua_State *L, lua_State *co, int narg) { int status, nres; if (!lua_checkstack(co, narg)) { lua_pushliteral(L, "too many arguments to resume"); return -1; /* error flag */ } lua_xmove(L, co, narg); status = lua_resume(co, L, narg, &nres); if (status == LUA_OK || status == LUA_YIELD) { if (!lua_checkstack(L, nres + 1)) { lua_pop(co, nres); /* remove results anyway */ lua_pushliteral(L, "too many results to resume"); return -1; /* error flag */ } lua_xmove(co, L, nres); /* move yielded values */ return nres; } else { lua_xmove(co, L, 1); /* move error message */ return -1; /* error flag */ } } static int luaB_coresume (lua_State *L) { lua_State *co = getco(L); int r; r = auxresume(L, co, lua_gettop(L) - 1); if (r < 0) { lua_pushboolean(L, 0); lua_insert(L, -2); return 2; /* return false + error message */ } else { lua_pushboolean(L, 1); lua_insert(L, -(r + 1)); return r + 1; /* return true + 'resume' returns */ } } static int luaB_auxwrap (lua_State *L) { lua_State *co = lua_tothread(L, lua_upvalueindex(1)); int r = auxresume(L, co, lua_gettop(L)); if (r < 0) { /* error? */ int stat = lua_status(co); if (stat != LUA_OK && stat != LUA_YIELD) /* error in the coroutine? */ lua_resetthread(co); /* close its tbc variables */ if (stat != LUA_ERRMEM && /* not a memory error and ... */ lua_type(L, -1) == LUA_TSTRING) { /* ... error object is a string? */ luaL_where(L, 1); /* add extra info, if available */ lua_insert(L, -2); lua_concat(L, 2); } return lua_error(L); /* propagate error */ } return r; } static int luaB_cocreate (lua_State *L) { lua_State *NL; luaL_checktype(L, 1, LUA_TFUNCTION); NL = lua_newthread(L); lua_pushvalue(L, 1); /* move function to top */ lua_xmove(L, NL, 1); /* move function from L to NL */ return 1; } static int luaB_cowrap (lua_State *L) { luaB_cocreate(L); lua_pushcclosure(L, luaB_auxwrap, 1); return 1; } static int luaB_yield (lua_State *L) { return lua_yield(L, lua_gettop(L)); } #define COS_RUN 0 #define COS_DEAD 1 #define COS_YIELD 2 #define COS_NORM 3 static const char *const statname[] = {"running", "dead", "suspended", "normal"}; static int auxstatus (lua_State *L, lua_State *co) { if (L == co) return COS_RUN; else { switch (lua_status(co)) { case LUA_YIELD: return COS_YIELD; case LUA_OK: { lua_Debug ar; if (lua_getstack(co, 0, &ar)) /* does it have frames? */ return COS_NORM; /* it is running */ else if (lua_gettop(co) == 0) return COS_DEAD; else return COS_YIELD; /* initial state */ } default: /* some error occurred */ return COS_DEAD; } } } static int luaB_costatus (lua_State *L) { lua_State *co = getco(L); lua_pushstring(L, statname[auxstatus(L, co)]); return 1; } static int luaB_yieldable (lua_State *L) { lua_State *co = lua_isnone(L, 1) ? L : getco(L); lua_pushboolean(L, lua_isyieldable(co)); return 1; } static int luaB_corunning (lua_State *L) { int ismain = lua_pushthread(L); lua_pushboolean(L, ismain); return 2; } static int luaB_close (lua_State *L) { lua_State *co = getco(L); int status = auxstatus(L, co); switch (status) { case COS_DEAD: case COS_YIELD: { status = lua_resetthread(co); if (status == LUA_OK) { lua_pushboolean(L, 1); return 1; } else { lua_pushboolean(L, 0); lua_xmove(co, L, 1); /* copy error message */ return 2; } } default: /* normal or running coroutine */ return luaL_error(L, "cannot close a %s coroutine", statname[status]); } } static const luaL_Reg co_funcs[] = { {"create", luaB_cocreate}, {"resume", luaB_coresume}, {"running", luaB_corunning}, {"status", luaB_costatus}, {"wrap", luaB_cowrap}, {"yield", luaB_yield}, {"isyieldable", luaB_yieldable}, {"close", luaB_close}, {NULL, NULL} }; LUAMOD_API int luaopen_coroutine (lua_State *L) { luaL_newlib(L, co_funcs); return 1; }
Upload File
Create Folder