lua

A copy of the Lua development repository
Log | Files | Refs | README

lauxlib.h (8508B)


      1 /*
      2 ** $Id: lauxlib.h $
      3 ** Auxiliary functions for building Lua libraries
      4 ** See Copyright Notice in lua.h
      5 */
      6 
      7 
      8 #ifndef lauxlib_h
      9 #define lauxlib_h
     10 
     11 
     12 #include <stddef.h>
     13 #include <stdio.h>
     14 
     15 #include "luaconf.h"
     16 #include "lua.h"
     17 
     18 
     19 /* global table */
     20 #define LUA_GNAME	"_G"
     21 
     22 
     23 typedef struct luaL_Buffer luaL_Buffer;
     24 
     25 
     26 /* extra error code for 'luaL_loadfilex' */
     27 #define LUA_ERRFILE     (LUA_ERRERR+1)
     28 
     29 
     30 /* key, in the registry, for table of loaded modules */
     31 #define LUA_LOADED_TABLE	"_LOADED"
     32 
     33 
     34 /* key, in the registry, for table of preloaded loaders */
     35 #define LUA_PRELOAD_TABLE	"_PRELOAD"
     36 
     37 
     38 typedef struct luaL_Reg {
     39   const char *name;
     40   lua_CFunction func;
     41 } luaL_Reg;
     42 
     43 
     44 #define LUAL_NUMSIZES	(sizeof(lua_Integer)*16 + sizeof(lua_Number))
     45 
     46 LUALIB_API void (luaL_checkversion_) (lua_State *L, lua_Number ver, size_t sz);
     47 #define luaL_checkversion(L)  \
     48 	  luaL_checkversion_(L, LUA_VERSION_NUM, LUAL_NUMSIZES)
     49 
     50 LUALIB_API int (luaL_getmetafield) (lua_State *L, int obj, const char *e);
     51 LUALIB_API int (luaL_callmeta) (lua_State *L, int obj, const char *e);
     52 LUALIB_API const char *(luaL_tolstring) (lua_State *L, int idx, size_t *len);
     53 LUALIB_API int (luaL_argerror) (lua_State *L, int arg, const char *extramsg);
     54 LUALIB_API int (luaL_typeerror) (lua_State *L, int arg, const char *tname);
     55 LUALIB_API const char *(luaL_checklstring) (lua_State *L, int arg,
     56                                                           size_t *l);
     57 LUALIB_API const char *(luaL_optlstring) (lua_State *L, int arg,
     58                                           const char *def, size_t *l);
     59 LUALIB_API lua_Number (luaL_checknumber) (lua_State *L, int arg);
     60 LUALIB_API lua_Number (luaL_optnumber) (lua_State *L, int arg, lua_Number def);
     61 
     62 LUALIB_API lua_Integer (luaL_checkinteger) (lua_State *L, int arg);
     63 LUALIB_API lua_Integer (luaL_optinteger) (lua_State *L, int arg,
     64                                           lua_Integer def);
     65 
     66 LUALIB_API void (luaL_checkstack) (lua_State *L, int sz, const char *msg);
     67 LUALIB_API void (luaL_checktype) (lua_State *L, int arg, int t);
     68 LUALIB_API void (luaL_checkany) (lua_State *L, int arg);
     69 
     70 LUALIB_API int   (luaL_newmetatable) (lua_State *L, const char *tname);
     71 LUALIB_API void  (luaL_setmetatable) (lua_State *L, const char *tname);
     72 LUALIB_API void *(luaL_testudata) (lua_State *L, int ud, const char *tname);
     73 LUALIB_API void *(luaL_checkudata) (lua_State *L, int ud, const char *tname);
     74 
     75 LUALIB_API void (luaL_where) (lua_State *L, int lvl);
     76 LUALIB_API int (luaL_error) (lua_State *L, const char *fmt, ...);
     77 
     78 LUALIB_API int (luaL_checkoption) (lua_State *L, int arg, const char *def,
     79                                    const char *const lst[]);
     80 
     81 LUALIB_API int (luaL_fileresult) (lua_State *L, int stat, const char *fname);
     82 LUALIB_API int (luaL_execresult) (lua_State *L, int stat);
     83 
     84 
     85 /* predefined references */
     86 #define LUA_NOREF       (-2)
     87 #define LUA_REFNIL      (-1)
     88 
     89 LUALIB_API int (luaL_ref) (lua_State *L, int t);
     90 LUALIB_API void (luaL_unref) (lua_State *L, int t, int ref);
     91 
     92 LUALIB_API int (luaL_loadfilex) (lua_State *L, const char *filename,
     93                                                const char *mode);
     94 
     95 #define luaL_loadfile(L,f)	luaL_loadfilex(L,f,NULL)
     96 
     97 LUALIB_API int (luaL_loadbufferx) (lua_State *L, const char *buff, size_t sz,
     98                                    const char *name, const char *mode);
     99 LUALIB_API int (luaL_loadstring) (lua_State *L, const char *s);
    100 
    101 LUALIB_API lua_State *(luaL_newstate) (void);
    102 
    103 LUALIB_API unsigned luaL_makeseed (lua_State *L);
    104 
    105 LUALIB_API lua_Integer (luaL_len) (lua_State *L, int idx);
    106 
    107 LUALIB_API void (luaL_addgsub) (luaL_Buffer *b, const char *s,
    108                                      const char *p, const char *r);
    109 LUALIB_API const char *(luaL_gsub) (lua_State *L, const char *s,
    110                                     const char *p, const char *r);
    111 
    112 LUALIB_API void (luaL_setfuncs) (lua_State *L, const luaL_Reg *l, int nup);
    113 
    114 LUALIB_API int (luaL_getsubtable) (lua_State *L, int idx, const char *fname);
    115 
    116 LUALIB_API void (luaL_traceback) (lua_State *L, lua_State *L1,
    117                                   const char *msg, int level);
    118 
    119 LUALIB_API void (luaL_requiref) (lua_State *L, const char *modname,
    120                                  lua_CFunction openf, int glb);
    121 
    122 /*
    123 ** ===============================================================
    124 ** some useful macros
    125 ** ===============================================================
    126 */
    127 
    128 
    129 #define luaL_newlibtable(L,l)	\
    130   lua_createtable(L, 0, sizeof(l)/sizeof((l)[0]) - 1)
    131 
    132 #define luaL_newlib(L,l)  \
    133   (luaL_checkversion(L), luaL_newlibtable(L,l), luaL_setfuncs(L,l,0))
    134 
    135 #define luaL_argcheck(L, cond,arg,extramsg)	\
    136 	((void)(luai_likely(cond) || luaL_argerror(L, (arg), (extramsg))))
    137 
    138 #define luaL_argexpected(L,cond,arg,tname)	\
    139 	((void)(luai_likely(cond) || luaL_typeerror(L, (arg), (tname))))
    140 
    141 #define luaL_checkstring(L,n)	(luaL_checklstring(L, (n), NULL))
    142 #define luaL_optstring(L,n,d)	(luaL_optlstring(L, (n), (d), NULL))
    143 
    144 #define luaL_typename(L,i)	lua_typename(L, lua_type(L,(i)))
    145 
    146 #define luaL_dofile(L, fn) \
    147 	(luaL_loadfile(L, fn) || lua_pcall(L, 0, LUA_MULTRET, 0))
    148 
    149 #define luaL_dostring(L, s) \
    150 	(luaL_loadstring(L, s) || lua_pcall(L, 0, LUA_MULTRET, 0))
    151 
    152 #define luaL_getmetatable(L,n)	(lua_getfield(L, LUA_REGISTRYINDEX, (n)))
    153 
    154 #define luaL_opt(L,f,n,d)	(lua_isnoneornil(L,(n)) ? (d) : f(L,(n)))
    155 
    156 #define luaL_loadbuffer(L,s,sz,n)	luaL_loadbufferx(L,s,sz,n,NULL)
    157 
    158 
    159 /*
    160 ** Perform arithmetic operations on lua_Integer values with wrap-around
    161 ** semantics, as the Lua core does.
    162 */
    163 #define luaL_intop(op,v1,v2)  \
    164 	((lua_Integer)((lua_Unsigned)(v1) op (lua_Unsigned)(v2)))
    165 
    166 
    167 /* push the value used to represent failure/error */
    168 #if defined(LUA_FAILISFALSE)
    169 #define luaL_pushfail(L)	lua_pushboolean(L, 0)
    170 #else
    171 #define luaL_pushfail(L)	lua_pushnil(L)
    172 #endif
    173 
    174 
    175 
    176 /*
    177 ** {======================================================
    178 ** Generic Buffer manipulation
    179 ** =======================================================
    180 */
    181 
    182 struct luaL_Buffer {
    183   char *b;  /* buffer address */
    184   size_t size;  /* buffer size */
    185   size_t n;  /* number of characters in buffer */
    186   lua_State *L;
    187   union {
    188     LUAI_MAXALIGN;  /* ensure maximum alignment for buffer */
    189     char b[LUAL_BUFFERSIZE];  /* initial buffer */
    190   } init;
    191 };
    192 
    193 
    194 #define luaL_bufflen(bf)	((bf)->n)
    195 #define luaL_buffaddr(bf)	((bf)->b)
    196 
    197 
    198 #define luaL_addchar(B,c) \
    199   ((void)((B)->n < (B)->size || luaL_prepbuffsize((B), 1)), \
    200    ((B)->b[(B)->n++] = (c)))
    201 
    202 #define luaL_addsize(B,s)	((B)->n += (s))
    203 
    204 #define luaL_buffsub(B,s)	((B)->n -= (s))
    205 
    206 LUALIB_API void (luaL_buffinit) (lua_State *L, luaL_Buffer *B);
    207 LUALIB_API char *(luaL_prepbuffsize) (luaL_Buffer *B, size_t sz);
    208 LUALIB_API void (luaL_addlstring) (luaL_Buffer *B, const char *s, size_t l);
    209 LUALIB_API void (luaL_addstring) (luaL_Buffer *B, const char *s);
    210 LUALIB_API void (luaL_addvalue) (luaL_Buffer *B);
    211 LUALIB_API void (luaL_pushresult) (luaL_Buffer *B);
    212 LUALIB_API void (luaL_pushresultsize) (luaL_Buffer *B, size_t sz);
    213 LUALIB_API char *(luaL_buffinitsize) (lua_State *L, luaL_Buffer *B, size_t sz);
    214 
    215 #define luaL_prepbuffer(B)	luaL_prepbuffsize(B, LUAL_BUFFERSIZE)
    216 
    217 /* }====================================================== */
    218 
    219 
    220 
    221 /*
    222 ** {======================================================
    223 ** File handles for IO library
    224 ** =======================================================
    225 */
    226 
    227 /*
    228 ** A file handle is a userdata with metatable 'LUA_FILEHANDLE' and
    229 ** initial structure 'luaL_Stream' (it may contain other fields
    230 ** after that initial structure).
    231 */
    232 
    233 #define LUA_FILEHANDLE          "FILE*"
    234 
    235 
    236 typedef struct luaL_Stream {
    237   FILE *f;  /* stream (NULL for incompletely created streams) */
    238   lua_CFunction closef;  /* to close stream (NULL for closed streams) */
    239 } luaL_Stream;
    240 
    241 /* }====================================================== */
    242 
    243 
    244 /*
    245 ** {============================================================
    246 ** Compatibility with deprecated conversions
    247 ** =============================================================
    248 */
    249 #if defined(LUA_COMPAT_APIINTCASTS)
    250 
    251 #define luaL_checkunsigned(L,a)	((lua_Unsigned)luaL_checkinteger(L,a))
    252 #define luaL_optunsigned(L,a,d)	\
    253 	((lua_Unsigned)luaL_optinteger(L,a,(lua_Integer)(d)))
    254 
    255 #define luaL_checkint(L,n)	((int)luaL_checkinteger(L, (n)))
    256 #define luaL_optint(L,n,d)	((int)luaL_optinteger(L, (n), (d)))
    257 
    258 #define luaL_checklong(L,n)	((long)luaL_checkinteger(L, (n)))
    259 #define luaL_optlong(L,n,d)	((long)luaL_optinteger(L, (n), (d)))
    260 
    261 #endif
    262 /* }============================================================ */
    263 
    264 
    265 
    266 #endif
    267 
    268