1dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com/*
2dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com** $Id: lauxlib.h,v 1.120 2011/11/29 15:55:08 roberto Exp $
3dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com** Auxiliary functions for building Lua libraries
4dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com** See Copyright Notice in lua.h
5dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com*/
6dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
7dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
8dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#ifndef lauxlib_h
9dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#define lauxlib_h
10dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
11dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
12dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#include <stddef.h>
13dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#include <stdio.h>
14dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
15dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#include "lua.h"
16dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
17dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
18dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
19dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com/* extra error code for `luaL_load' */
20dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#define LUA_ERRFILE     (LUA_ERRERR+1)
21dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
22dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
23dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comtypedef struct luaL_Reg {
24dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com  const char *name;
25dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com  lua_CFunction func;
26dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com} luaL_Reg;
27dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
28dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
29dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comLUALIB_API void (luaL_checkversion_) (lua_State *L, lua_Number ver);
30dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#define luaL_checkversion(L)	luaL_checkversion_(L, LUA_VERSION_NUM)
31dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
32dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comLUALIB_API int (luaL_getmetafield) (lua_State *L, int obj, const char *e);
33dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comLUALIB_API int (luaL_callmeta) (lua_State *L, int obj, const char *e);
34dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comLUALIB_API const char *(luaL_tolstring) (lua_State *L, int idx, size_t *len);
35dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comLUALIB_API int (luaL_argerror) (lua_State *L, int numarg, const char *extramsg);
36dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comLUALIB_API const char *(luaL_checklstring) (lua_State *L, int numArg,
37dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com                                                          size_t *l);
38dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comLUALIB_API const char *(luaL_optlstring) (lua_State *L, int numArg,
39dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com                                          const char *def, size_t *l);
40dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comLUALIB_API lua_Number (luaL_checknumber) (lua_State *L, int numArg);
41dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comLUALIB_API lua_Number (luaL_optnumber) (lua_State *L, int nArg, lua_Number def);
42dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
43dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comLUALIB_API lua_Integer (luaL_checkinteger) (lua_State *L, int numArg);
44dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comLUALIB_API lua_Integer (luaL_optinteger) (lua_State *L, int nArg,
45dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com                                          lua_Integer def);
46dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comLUALIB_API lua_Unsigned (luaL_checkunsigned) (lua_State *L, int numArg);
47dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comLUALIB_API lua_Unsigned (luaL_optunsigned) (lua_State *L, int numArg,
48dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com                                            lua_Unsigned def);
49dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
50dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comLUALIB_API void (luaL_checkstack) (lua_State *L, int sz, const char *msg);
51dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comLUALIB_API void (luaL_checktype) (lua_State *L, int narg, int t);
52dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comLUALIB_API void (luaL_checkany) (lua_State *L, int narg);
53dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
54dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comLUALIB_API int   (luaL_newmetatable) (lua_State *L, const char *tname);
55dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comLUALIB_API void  (luaL_setmetatable) (lua_State *L, const char *tname);
56dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comLUALIB_API void *(luaL_testudata) (lua_State *L, int ud, const char *tname);
57dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comLUALIB_API void *(luaL_checkudata) (lua_State *L, int ud, const char *tname);
58dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
59dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comLUALIB_API void (luaL_where) (lua_State *L, int lvl);
60dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comLUALIB_API int (luaL_error) (lua_State *L, const char *fmt, ...);
61dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
62dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comLUALIB_API int (luaL_checkoption) (lua_State *L, int narg, const char *def,
63dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com                                   const char *const lst[]);
64dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
65dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comLUALIB_API int (luaL_fileresult) (lua_State *L, int stat, const char *fname);
66dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comLUALIB_API int (luaL_execresult) (lua_State *L, int stat);
67dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
68dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com/* pre-defined references */
69dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#define LUA_NOREF       (-2)
70dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#define LUA_REFNIL      (-1)
71dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
72dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comLUALIB_API int (luaL_ref) (lua_State *L, int t);
73dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comLUALIB_API void (luaL_unref) (lua_State *L, int t, int ref);
74dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
75dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comLUALIB_API int (luaL_loadfilex) (lua_State *L, const char *filename,
76dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com                                               const char *mode);
77dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
78dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#define luaL_loadfile(L,f)	luaL_loadfilex(L,f,NULL)
79dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
80dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comLUALIB_API int (luaL_loadbufferx) (lua_State *L, const char *buff, size_t sz,
81dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com                                   const char *name, const char *mode);
82dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comLUALIB_API int (luaL_loadstring) (lua_State *L, const char *s);
83dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
84dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comLUALIB_API lua_State *(luaL_newstate) (void);
85dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
86dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comLUALIB_API int (luaL_len) (lua_State *L, int idx);
87dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
88dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comLUALIB_API const char *(luaL_gsub) (lua_State *L, const char *s, const char *p,
89dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com                                                  const char *r);
90dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
91dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comLUALIB_API void (luaL_setfuncs) (lua_State *L, const luaL_Reg *l, int nup);
92dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
93dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comLUALIB_API int (luaL_getsubtable) (lua_State *L, int idx, const char *fname);
94dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
95dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comLUALIB_API void (luaL_traceback) (lua_State *L, lua_State *L1,
96dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com                                  const char *msg, int level);
97dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
98dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comLUALIB_API void (luaL_requiref) (lua_State *L, const char *modname,
99dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com                                 lua_CFunction openf, int glb);
100dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
101dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com/*
102dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com** ===============================================================
103dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com** some useful macros
104dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com** ===============================================================
105dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com*/
106dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
107dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
108dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#define luaL_newlibtable(L,l)	\
109dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com  lua_createtable(L, 0, sizeof(l)/sizeof((l)[0]) - 1)
110dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
111dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#define luaL_newlib(L,l)	(luaL_newlibtable(L,l), luaL_setfuncs(L,l,0))
112dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
113dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#define luaL_argcheck(L, cond,numarg,extramsg)	\
114dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com		((void)((cond) || luaL_argerror(L, (numarg), (extramsg))))
115dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#define luaL_checkstring(L,n)	(luaL_checklstring(L, (n), NULL))
116dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#define luaL_optstring(L,n,d)	(luaL_optlstring(L, (n), (d), NULL))
117dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#define luaL_checkint(L,n)	((int)luaL_checkinteger(L, (n)))
118dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#define luaL_optint(L,n,d)	((int)luaL_optinteger(L, (n), (d)))
119dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#define luaL_checklong(L,n)	((long)luaL_checkinteger(L, (n)))
120dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#define luaL_optlong(L,n,d)	((long)luaL_optinteger(L, (n), (d)))
121dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
122dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#define luaL_typename(L,i)	lua_typename(L, lua_type(L,(i)))
123dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
124dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#define luaL_dofile(L, fn) \
125dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com	(luaL_loadfile(L, fn) || lua_pcall(L, 0, LUA_MULTRET, 0))
126dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
127dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#define luaL_dostring(L, s) \
128dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com	(luaL_loadstring(L, s) || lua_pcall(L, 0, LUA_MULTRET, 0))
129dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
130dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#define luaL_getmetatable(L,n)	(lua_getfield(L, LUA_REGISTRYINDEX, (n)))
131dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
132dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#define luaL_opt(L,f,n,d)	(lua_isnoneornil(L,(n)) ? (d) : f(L,(n)))
133dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
134dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#define luaL_loadbuffer(L,s,sz,n)	luaL_loadbufferx(L,s,sz,n,NULL)
135dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
136dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
137dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com/*
138dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com** {======================================================
139dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com** Generic Buffer manipulation
140dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com** =======================================================
141dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com*/
142dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
143dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comtypedef struct luaL_Buffer {
144dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com  char *b;  /* buffer address */
145dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com  size_t size;  /* buffer size */
146dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com  size_t n;  /* number of characters in buffer */
147dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com  lua_State *L;
148dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com  char initb[LUAL_BUFFERSIZE];  /* initial buffer */
149dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com} luaL_Buffer;
150dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
151dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
152dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#define luaL_addchar(B,c) \
153dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com  ((void)((B)->n < (B)->size || luaL_prepbuffsize((B), 1)), \
154dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com   ((B)->b[(B)->n++] = (c)))
155dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
156dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#define luaL_addsize(B,s)	((B)->n += (s))
157dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
158dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comLUALIB_API void (luaL_buffinit) (lua_State *L, luaL_Buffer *B);
159dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comLUALIB_API char *(luaL_prepbuffsize) (luaL_Buffer *B, size_t sz);
160dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comLUALIB_API void (luaL_addlstring) (luaL_Buffer *B, const char *s, size_t l);
161dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comLUALIB_API void (luaL_addstring) (luaL_Buffer *B, const char *s);
162dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comLUALIB_API void (luaL_addvalue) (luaL_Buffer *B);
163dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comLUALIB_API void (luaL_pushresult) (luaL_Buffer *B);
164dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comLUALIB_API void (luaL_pushresultsize) (luaL_Buffer *B, size_t sz);
165dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comLUALIB_API char *(luaL_buffinitsize) (lua_State *L, luaL_Buffer *B, size_t sz);
166dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
167dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#define luaL_prepbuffer(B)	luaL_prepbuffsize(B, LUAL_BUFFERSIZE)
168dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
169dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com/* }====================================================== */
170dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
171dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
172dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
173dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com/*
174dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com** {======================================================
175dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com** File handles for IO library
176dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com** =======================================================
177dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com*/
178dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
179dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com/*
180dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com** A file handle is a userdata with metatable 'LUA_FILEHANDLE' and
181dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com** initial structure 'luaL_Stream' (it may contain other fields
182dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com** after that initial structure).
183dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com*/
184dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
185dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#define LUA_FILEHANDLE          "FILE*"
186dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
187dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
188dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comtypedef struct luaL_Stream {
189dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com  FILE *f;  /* stream (NULL for incompletely created streams) */
190dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com  lua_CFunction closef;  /* to close stream (NULL for closed streams) */
191dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com} luaL_Stream;
192dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
193dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com/* }====================================================== */
194dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
195dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
196dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
197dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com/* compatibility with old module system */
198dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#if defined(LUA_COMPAT_MODULE)
199dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
200dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comLUALIB_API void (luaL_pushmodule) (lua_State *L, const char *modname,
201dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com                                   int sizehint);
202dff7e11c2000d6745261de046d76b1500a05ece9reed@google.comLUALIB_API void (luaL_openlib) (lua_State *L, const char *libname,
203dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com                                const luaL_Reg *l, int nup);
204dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
205dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#define luaL_register(L,n,l)	(luaL_openlib(L,(n),(l),0))
206dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
207dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#endif
208dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
209dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
210dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com#endif
211dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
212dff7e11c2000d6745261de046d76b1500a05ece9reed@google.com
213