18e3e3a7aSWarner Losh /* 2*0495ed39SKyle Evans ** $Id: lauxlib.h $ 38e3e3a7aSWarner Losh ** Auxiliary functions for building Lua libraries 48e3e3a7aSWarner Losh ** See Copyright Notice in lua.h 58e3e3a7aSWarner Losh */ 68e3e3a7aSWarner Losh 78e3e3a7aSWarner Losh 88e3e3a7aSWarner Losh #ifndef lauxlib_h 98e3e3a7aSWarner Losh #define lauxlib_h 108e3e3a7aSWarner Losh 118e3e3a7aSWarner Losh 128e3e3a7aSWarner Losh #include <stddef.h> 138e3e3a7aSWarner Losh #include <stdio.h> 148e3e3a7aSWarner Losh 158e3e3a7aSWarner Losh #include "lua.h" 168e3e3a7aSWarner Losh 178e3e3a7aSWarner Losh 18*0495ed39SKyle Evans /* global table */ 19*0495ed39SKyle Evans #define LUA_GNAME "_G" 20*0495ed39SKyle Evans 21*0495ed39SKyle Evans 22*0495ed39SKyle Evans typedef struct luaL_Buffer luaL_Buffer; 23*0495ed39SKyle Evans 248e3e3a7aSWarner Losh 258e3e3a7aSWarner Losh /* extra error code for 'luaL_loadfilex' */ 268e3e3a7aSWarner Losh #define LUA_ERRFILE (LUA_ERRERR+1) 278e3e3a7aSWarner Losh 288e3e3a7aSWarner Losh 298e3e3a7aSWarner Losh /* key, in the registry, for table of loaded modules */ 308e3e3a7aSWarner Losh #define LUA_LOADED_TABLE "_LOADED" 318e3e3a7aSWarner Losh 328e3e3a7aSWarner Losh 338e3e3a7aSWarner Losh /* key, in the registry, for table of preloaded loaders */ 348e3e3a7aSWarner Losh #define LUA_PRELOAD_TABLE "_PRELOAD" 358e3e3a7aSWarner Losh 368e3e3a7aSWarner Losh 378e3e3a7aSWarner Losh typedef struct luaL_Reg { 388e3e3a7aSWarner Losh const char *name; 398e3e3a7aSWarner Losh lua_CFunction func; 408e3e3a7aSWarner Losh } luaL_Reg; 418e3e3a7aSWarner Losh 428e3e3a7aSWarner Losh 438e3e3a7aSWarner Losh #define LUAL_NUMSIZES (sizeof(lua_Integer)*16 + sizeof(lua_Number)) 448e3e3a7aSWarner Losh 458e3e3a7aSWarner Losh LUALIB_API void (luaL_checkversion_) (lua_State *L, lua_Number ver, size_t sz); 468e3e3a7aSWarner Losh #define luaL_checkversion(L) \ 478e3e3a7aSWarner Losh luaL_checkversion_(L, LUA_VERSION_NUM, LUAL_NUMSIZES) 488e3e3a7aSWarner Losh 498e3e3a7aSWarner Losh LUALIB_API int (luaL_getmetafield) (lua_State *L, int obj, const char *e); 508e3e3a7aSWarner Losh LUALIB_API int (luaL_callmeta) (lua_State *L, int obj, const char *e); 518e3e3a7aSWarner Losh LUALIB_API const char *(luaL_tolstring) (lua_State *L, int idx, size_t *len); 528e3e3a7aSWarner Losh LUALIB_API int (luaL_argerror) (lua_State *L, int arg, const char *extramsg); 53*0495ed39SKyle Evans LUALIB_API int (luaL_typeerror) (lua_State *L, int arg, const char *tname); 548e3e3a7aSWarner Losh LUALIB_API const char *(luaL_checklstring) (lua_State *L, int arg, 558e3e3a7aSWarner Losh size_t *l); 568e3e3a7aSWarner Losh LUALIB_API const char *(luaL_optlstring) (lua_State *L, int arg, 578e3e3a7aSWarner Losh const char *def, size_t *l); 588e3e3a7aSWarner Losh LUALIB_API lua_Number (luaL_checknumber) (lua_State *L, int arg); 598e3e3a7aSWarner Losh LUALIB_API lua_Number (luaL_optnumber) (lua_State *L, int arg, lua_Number def); 608e3e3a7aSWarner Losh 618e3e3a7aSWarner Losh LUALIB_API lua_Integer (luaL_checkinteger) (lua_State *L, int arg); 628e3e3a7aSWarner Losh LUALIB_API lua_Integer (luaL_optinteger) (lua_State *L, int arg, 638e3e3a7aSWarner Losh lua_Integer def); 648e3e3a7aSWarner Losh 658e3e3a7aSWarner Losh LUALIB_API void (luaL_checkstack) (lua_State *L, int sz, const char *msg); 668e3e3a7aSWarner Losh LUALIB_API void (luaL_checktype) (lua_State *L, int arg, int t); 678e3e3a7aSWarner Losh LUALIB_API void (luaL_checkany) (lua_State *L, int arg); 688e3e3a7aSWarner Losh 698e3e3a7aSWarner Losh LUALIB_API int (luaL_newmetatable) (lua_State *L, const char *tname); 708e3e3a7aSWarner Losh LUALIB_API void (luaL_setmetatable) (lua_State *L, const char *tname); 718e3e3a7aSWarner Losh LUALIB_API void *(luaL_testudata) (lua_State *L, int ud, const char *tname); 728e3e3a7aSWarner Losh LUALIB_API void *(luaL_checkudata) (lua_State *L, int ud, const char *tname); 738e3e3a7aSWarner Losh 748e3e3a7aSWarner Losh LUALIB_API void (luaL_where) (lua_State *L, int lvl); 758e3e3a7aSWarner Losh LUALIB_API int (luaL_error) (lua_State *L, const char *fmt, ...); 768e3e3a7aSWarner Losh 778e3e3a7aSWarner Losh LUALIB_API int (luaL_checkoption) (lua_State *L, int arg, const char *def, 788e3e3a7aSWarner Losh const char *const lst[]); 798e3e3a7aSWarner Losh 808e3e3a7aSWarner Losh LUALIB_API int (luaL_fileresult) (lua_State *L, int stat, const char *fname); 818e3e3a7aSWarner Losh LUALIB_API int (luaL_execresult) (lua_State *L, int stat); 828e3e3a7aSWarner Losh 83*0495ed39SKyle Evans 848e3e3a7aSWarner Losh /* predefined references */ 858e3e3a7aSWarner Losh #define LUA_NOREF (-2) 868e3e3a7aSWarner Losh #define LUA_REFNIL (-1) 878e3e3a7aSWarner Losh 888e3e3a7aSWarner Losh LUALIB_API int (luaL_ref) (lua_State *L, int t); 898e3e3a7aSWarner Losh LUALIB_API void (luaL_unref) (lua_State *L, int t, int ref); 908e3e3a7aSWarner Losh 918e3e3a7aSWarner Losh LUALIB_API int (luaL_loadfilex) (lua_State *L, const char *filename, 928e3e3a7aSWarner Losh const char *mode); 938e3e3a7aSWarner Losh 948e3e3a7aSWarner Losh #define luaL_loadfile(L,f) luaL_loadfilex(L,f,NULL) 958e3e3a7aSWarner Losh 968e3e3a7aSWarner Losh LUALIB_API int (luaL_loadbufferx) (lua_State *L, const char *buff, size_t sz, 978e3e3a7aSWarner Losh const char *name, const char *mode); 988e3e3a7aSWarner Losh LUALIB_API int (luaL_loadstring) (lua_State *L, const char *s); 998e3e3a7aSWarner Losh 1008e3e3a7aSWarner Losh LUALIB_API lua_State *(luaL_newstate) (void); 1018e3e3a7aSWarner Losh 1028e3e3a7aSWarner Losh LUALIB_API lua_Integer (luaL_len) (lua_State *L, int idx); 1038e3e3a7aSWarner Losh 104*0495ed39SKyle Evans LUALIB_API void luaL_addgsub (luaL_Buffer *b, const char *s, 105*0495ed39SKyle Evans const char *p, const char *r); 106*0495ed39SKyle Evans LUALIB_API const char *(luaL_gsub) (lua_State *L, const char *s, 107*0495ed39SKyle Evans const char *p, const char *r); 1088e3e3a7aSWarner Losh 1098e3e3a7aSWarner Losh LUALIB_API void (luaL_setfuncs) (lua_State *L, const luaL_Reg *l, int nup); 1108e3e3a7aSWarner Losh 1118e3e3a7aSWarner Losh LUALIB_API int (luaL_getsubtable) (lua_State *L, int idx, const char *fname); 1128e3e3a7aSWarner Losh 1138e3e3a7aSWarner Losh LUALIB_API void (luaL_traceback) (lua_State *L, lua_State *L1, 1148e3e3a7aSWarner Losh const char *msg, int level); 1158e3e3a7aSWarner Losh 1168e3e3a7aSWarner Losh LUALIB_API void (luaL_requiref) (lua_State *L, const char *modname, 1178e3e3a7aSWarner Losh lua_CFunction openf, int glb); 1188e3e3a7aSWarner Losh 1198e3e3a7aSWarner Losh /* 1208e3e3a7aSWarner Losh ** =============================================================== 1218e3e3a7aSWarner Losh ** some useful macros 1228e3e3a7aSWarner Losh ** =============================================================== 1238e3e3a7aSWarner Losh */ 1248e3e3a7aSWarner Losh 1258e3e3a7aSWarner Losh 1268e3e3a7aSWarner Losh #define luaL_newlibtable(L,l) \ 1278e3e3a7aSWarner Losh lua_createtable(L, 0, sizeof(l)/sizeof((l)[0]) - 1) 1288e3e3a7aSWarner Losh 1298e3e3a7aSWarner Losh #define luaL_newlib(L,l) \ 1308e3e3a7aSWarner Losh (luaL_checkversion(L), luaL_newlibtable(L,l), luaL_setfuncs(L,l,0)) 1318e3e3a7aSWarner Losh 1328e3e3a7aSWarner Losh #define luaL_argcheck(L, cond,arg,extramsg) \ 1338e3e3a7aSWarner Losh ((void)((cond) || luaL_argerror(L, (arg), (extramsg)))) 134*0495ed39SKyle Evans 135*0495ed39SKyle Evans #define luaL_argexpected(L,cond,arg,tname) \ 136*0495ed39SKyle Evans ((void)((cond) || luaL_typeerror(L, (arg), (tname)))) 137*0495ed39SKyle Evans 1388e3e3a7aSWarner Losh #define luaL_checkstring(L,n) (luaL_checklstring(L, (n), NULL)) 1398e3e3a7aSWarner Losh #define luaL_optstring(L,n,d) (luaL_optlstring(L, (n), (d), NULL)) 1408e3e3a7aSWarner Losh 1418e3e3a7aSWarner Losh #define luaL_typename(L,i) lua_typename(L, lua_type(L,(i))) 1428e3e3a7aSWarner Losh 1438e3e3a7aSWarner Losh #define luaL_dofile(L, fn) \ 1448e3e3a7aSWarner Losh (luaL_loadfile(L, fn) || lua_pcall(L, 0, LUA_MULTRET, 0)) 1458e3e3a7aSWarner Losh 1468e3e3a7aSWarner Losh #define luaL_dostring(L, s) \ 1478e3e3a7aSWarner Losh (luaL_loadstring(L, s) || lua_pcall(L, 0, LUA_MULTRET, 0)) 1488e3e3a7aSWarner Losh 1498e3e3a7aSWarner Losh #define luaL_getmetatable(L,n) (lua_getfield(L, LUA_REGISTRYINDEX, (n))) 1508e3e3a7aSWarner Losh 1518e3e3a7aSWarner Losh #define luaL_opt(L,f,n,d) (lua_isnoneornil(L,(n)) ? (d) : f(L,(n))) 1528e3e3a7aSWarner Losh 1538e3e3a7aSWarner Losh #define luaL_loadbuffer(L,s,sz,n) luaL_loadbufferx(L,s,sz,n,NULL) 1548e3e3a7aSWarner Losh 1558e3e3a7aSWarner Losh 156*0495ed39SKyle Evans /* push the value used to represent failure/error */ 157*0495ed39SKyle Evans #define luaL_pushfail(L) lua_pushnil(L) 158*0495ed39SKyle Evans 159*0495ed39SKyle Evans 1608e3e3a7aSWarner Losh /* 1618e3e3a7aSWarner Losh ** {====================================================== 1628e3e3a7aSWarner Losh ** Generic Buffer manipulation 1638e3e3a7aSWarner Losh ** ======================================================= 1648e3e3a7aSWarner Losh */ 1658e3e3a7aSWarner Losh 166*0495ed39SKyle Evans struct luaL_Buffer { 1678e3e3a7aSWarner Losh char *b; /* buffer address */ 1688e3e3a7aSWarner Losh size_t size; /* buffer size */ 1698e3e3a7aSWarner Losh size_t n; /* number of characters in buffer */ 1708e3e3a7aSWarner Losh lua_State *L; 171*0495ed39SKyle Evans union { 172*0495ed39SKyle Evans LUAI_MAXALIGN; /* ensure maximum alignment for buffer */ 173*0495ed39SKyle Evans char b[LUAL_BUFFERSIZE]; /* initial buffer */ 174*0495ed39SKyle Evans } init; 175*0495ed39SKyle Evans }; 176*0495ed39SKyle Evans 177*0495ed39SKyle Evans 178*0495ed39SKyle Evans #define luaL_bufflen(bf) ((bf)->n) 179*0495ed39SKyle Evans #define luaL_buffaddr(bf) ((bf)->b) 1808e3e3a7aSWarner Losh 1818e3e3a7aSWarner Losh 1828e3e3a7aSWarner Losh #define luaL_addchar(B,c) \ 1838e3e3a7aSWarner Losh ((void)((B)->n < (B)->size || luaL_prepbuffsize((B), 1)), \ 1848e3e3a7aSWarner Losh ((B)->b[(B)->n++] = (c))) 1858e3e3a7aSWarner Losh 1868e3e3a7aSWarner Losh #define luaL_addsize(B,s) ((B)->n += (s)) 1878e3e3a7aSWarner Losh 188*0495ed39SKyle Evans #define luaL_buffsub(B,s) ((B)->n -= (s)) 189*0495ed39SKyle Evans 1908e3e3a7aSWarner Losh LUALIB_API void (luaL_buffinit) (lua_State *L, luaL_Buffer *B); 1918e3e3a7aSWarner Losh LUALIB_API char *(luaL_prepbuffsize) (luaL_Buffer *B, size_t sz); 1928e3e3a7aSWarner Losh LUALIB_API void (luaL_addlstring) (luaL_Buffer *B, const char *s, size_t l); 1938e3e3a7aSWarner Losh LUALIB_API void (luaL_addstring) (luaL_Buffer *B, const char *s); 1948e3e3a7aSWarner Losh LUALIB_API void (luaL_addvalue) (luaL_Buffer *B); 1958e3e3a7aSWarner Losh LUALIB_API void (luaL_pushresult) (luaL_Buffer *B); 1968e3e3a7aSWarner Losh LUALIB_API void (luaL_pushresultsize) (luaL_Buffer *B, size_t sz); 1978e3e3a7aSWarner Losh LUALIB_API char *(luaL_buffinitsize) (lua_State *L, luaL_Buffer *B, size_t sz); 1988e3e3a7aSWarner Losh 1998e3e3a7aSWarner Losh #define luaL_prepbuffer(B) luaL_prepbuffsize(B, LUAL_BUFFERSIZE) 2008e3e3a7aSWarner Losh 2018e3e3a7aSWarner Losh /* }====================================================== */ 2028e3e3a7aSWarner Losh 2038e3e3a7aSWarner Losh 2048e3e3a7aSWarner Losh 2058e3e3a7aSWarner Losh /* 2068e3e3a7aSWarner Losh ** {====================================================== 2078e3e3a7aSWarner Losh ** File handles for IO library 2088e3e3a7aSWarner Losh ** ======================================================= 2098e3e3a7aSWarner Losh */ 2108e3e3a7aSWarner Losh 2118e3e3a7aSWarner Losh /* 2128e3e3a7aSWarner Losh ** A file handle is a userdata with metatable 'LUA_FILEHANDLE' and 2138e3e3a7aSWarner Losh ** initial structure 'luaL_Stream' (it may contain other fields 2148e3e3a7aSWarner Losh ** after that initial structure). 2158e3e3a7aSWarner Losh */ 2168e3e3a7aSWarner Losh 2178e3e3a7aSWarner Losh #define LUA_FILEHANDLE "FILE*" 2188e3e3a7aSWarner Losh 2198e3e3a7aSWarner Losh 2208e3e3a7aSWarner Losh typedef struct luaL_Stream { 2218e3e3a7aSWarner Losh FILE *f; /* stream (NULL for incompletely created streams) */ 2228e3e3a7aSWarner Losh lua_CFunction closef; /* to close stream (NULL for closed streams) */ 2238e3e3a7aSWarner Losh } luaL_Stream; 2248e3e3a7aSWarner Losh 2258e3e3a7aSWarner Losh /* }====================================================== */ 2268e3e3a7aSWarner Losh 2278e3e3a7aSWarner Losh /* 2288e3e3a7aSWarner Losh ** {================================================================== 2298e3e3a7aSWarner Losh ** "Abstraction Layer" for basic report of messages and errors 2308e3e3a7aSWarner Losh ** =================================================================== 2318e3e3a7aSWarner Losh */ 2328e3e3a7aSWarner Losh 2338e3e3a7aSWarner Losh /* print a string */ 2348e3e3a7aSWarner Losh #if !defined(lua_writestring) 2358e3e3a7aSWarner Losh #define lua_writestring(s,l) fwrite((s), sizeof(char), (l), stdout) 2368e3e3a7aSWarner Losh #endif 2378e3e3a7aSWarner Losh 2388e3e3a7aSWarner Losh /* print a newline and flush the output */ 2398e3e3a7aSWarner Losh #if !defined(lua_writeline) 2408e3e3a7aSWarner Losh #define lua_writeline() (lua_writestring("\n", 1), fflush(stdout)) 2418e3e3a7aSWarner Losh #endif 2428e3e3a7aSWarner Losh 2438e3e3a7aSWarner Losh /* print an error message */ 2448e3e3a7aSWarner Losh #if !defined(lua_writestringerror) 2458e3e3a7aSWarner Losh #define lua_writestringerror(s,p) \ 2468e3e3a7aSWarner Losh (fprintf(stderr, (s), (p)), fflush(stderr)) 2478e3e3a7aSWarner Losh #endif 2488e3e3a7aSWarner Losh 2498e3e3a7aSWarner Losh /* }================================================================== */ 2508e3e3a7aSWarner Losh 2518e3e3a7aSWarner Losh 2528e3e3a7aSWarner Losh /* 2538e3e3a7aSWarner Losh ** {============================================================ 2548e3e3a7aSWarner Losh ** Compatibility with deprecated conversions 2558e3e3a7aSWarner Losh ** ============================================================= 2568e3e3a7aSWarner Losh */ 2578e3e3a7aSWarner Losh #if defined(LUA_COMPAT_APIINTCASTS) 2588e3e3a7aSWarner Losh 2598e3e3a7aSWarner Losh #define luaL_checkunsigned(L,a) ((lua_Unsigned)luaL_checkinteger(L,a)) 2608e3e3a7aSWarner Losh #define luaL_optunsigned(L,a,d) \ 2618e3e3a7aSWarner Losh ((lua_Unsigned)luaL_optinteger(L,a,(lua_Integer)(d))) 2628e3e3a7aSWarner Losh 2638e3e3a7aSWarner Losh #define luaL_checkint(L,n) ((int)luaL_checkinteger(L, (n))) 2648e3e3a7aSWarner Losh #define luaL_optint(L,n,d) ((int)luaL_optinteger(L, (n), (d))) 2658e3e3a7aSWarner Losh 2668e3e3a7aSWarner Losh #define luaL_checklong(L,n) ((long)luaL_checkinteger(L, (n))) 2678e3e3a7aSWarner Losh #define luaL_optlong(L,n,d) ((long)luaL_optinteger(L, (n), (d))) 2688e3e3a7aSWarner Losh 2698e3e3a7aSWarner Losh #endif 2708e3e3a7aSWarner Losh /* }============================================================ */ 2718e3e3a7aSWarner Losh 2728e3e3a7aSWarner Losh 2738e3e3a7aSWarner Losh 2748e3e3a7aSWarner Losh #endif 2758e3e3a7aSWarner Losh 2768e3e3a7aSWarner Losh 277