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