81 lines
2.3 KiB
C
81 lines
2.3 KiB
C
|
/* Read-only tables for Lua */
|
||
|
|
||
|
#ifndef lrotable_h
|
||
|
#define lrotable_h
|
||
|
|
||
|
#include "lua.h"
|
||
|
#include "llimits.h"
|
||
|
#include "lobject.h"
|
||
|
#include "luaconf.h"
|
||
|
|
||
|
/* Macros one can use to define rotable entries */
|
||
|
#ifndef LUA_PACK_VALUE
|
||
|
#define LRO_FUNCVAL(v) {{.p = v}, LUA_TLIGHTFUNCTION}
|
||
|
#define LRO_LUDATA(v) {{.p = v}, LUA_TLIGHTUSERDATA}
|
||
|
#define LRO_NUMVAL(v) {{.n = v}, LUA_TNUMBER}
|
||
|
#define LRO_ROVAL(v) {{.p = (void*)v}, LUA_TROTABLE}
|
||
|
#define LRO_NILVAL {{.p = NULL}, LUA_TNIL}
|
||
|
#else // #ifndef LUA_PACK_VALUE
|
||
|
#define LRO_NUMVAL(v) {.value.n = v}
|
||
|
#ifdef ELUA_ENDIAN_LITTLE
|
||
|
#define LRO_FUNCVAL(v) {{(int)v, add_sig(LUA_TLIGHTFUNCTION)}}
|
||
|
#define LRO_LUDATA(v) {{(int)v, add_sig(LUA_TLIGHTUSERDATA)}}
|
||
|
#define LRO_ROVAL(v) {{(int)v, add_sig(LUA_TROTABLE)}}
|
||
|
#define LRO_NILVAL {{0, add_sig(LUA_TNIL)}}
|
||
|
#else // #ifdef ELUA_ENDIAN_LITTLE
|
||
|
#define LRO_FUNCVAL(v) {{add_sig(LUA_TLIGHTFUNCTION), (int)v}}
|
||
|
#define LRO_LUDATA(v) {{add_sig(LUA_TLIGHTUSERDATA), (int)v}}
|
||
|
#define LRO_ROVAL(v) {{add_sig(LUA_TROTABLE), (int)v}}
|
||
|
#define LRO_NILVAL {{add_sig(LUA_TNIL), 0}}
|
||
|
#endif // #ifdef ELUA_ENDIAN_LITTLE
|
||
|
#endif // #ifndef LUA_PACK_VALUE
|
||
|
|
||
|
#define LRO_STRKEY(k) {LUA_TSTRING, {.strkey = k}}
|
||
|
#define LRO_NUMKEY(k) {LUA_TNUMBER, {.numkey = k}}
|
||
|
#define LRO_NILKEY {LUA_TNIL, {.strkey=NULL}}
|
||
|
|
||
|
/* Maximum length of a rotable name and of a string key*/
|
||
|
#define LUA_MAX_ROTABLE_NAME 32
|
||
|
|
||
|
/* Type of a numeric key in a rotable */
|
||
|
typedef int luaR_numkey;
|
||
|
|
||
|
/* The next structure defines the type of a key */
|
||
|
typedef struct
|
||
|
{
|
||
|
int type;
|
||
|
union
|
||
|
{
|
||
|
const char* strkey;
|
||
|
luaR_numkey numkey;
|
||
|
} id;
|
||
|
} luaR_key;
|
||
|
|
||
|
/* An entry in the read only table */
|
||
|
typedef struct
|
||
|
{
|
||
|
const luaR_key key;
|
||
|
const TValue value;
|
||
|
} luaR_entry;
|
||
|
|
||
|
/* A rotable */
|
||
|
typedef struct
|
||
|
{
|
||
|
const char *name;
|
||
|
const luaR_entry *pentries;
|
||
|
} luaR_table;
|
||
|
|
||
|
void* luaR_findglobal(const char *key, unsigned len);
|
||
|
int luaR_findfunction(lua_State *L, const luaR_entry *ptable);
|
||
|
const TValue* luaR_findentry(void *data, const char *strkey, luaR_numkey numkey, unsigned *ppos);
|
||
|
void luaR_getcstr(char *dest, const TString *src, size_t maxsize);
|
||
|
void luaR_next(lua_State *L, void *data, TValue *key, TValue *val);
|
||
|
void* luaR_getmeta(void *data);
|
||
|
#ifdef LUA_META_ROTABLES
|
||
|
int luaR_isrotable(void *p);
|
||
|
#else
|
||
|
#define luaR_isrotable(p) (0)
|
||
|
#endif
|
||
|
|
||
|
#endif
|