aboutsummaryrefslogtreecommitdiff
path: root/lauxlib.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2002-06-03 17:11:41 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2002-06-03 17:11:41 -0300
commitad7103ea3aed7f40a5cf7055af253b34320134bc (patch)
tree978a750ba9c4cb990ece1fe6280f3806acbe6fce /lauxlib.c
parent0079e0f57ce2bd4dc40b9b7c5831c58764a7938f (diff)
downloadlua-ad7103ea3aed7f40a5cf7055af253b34320134bc.tar.gz
lua-ad7103ea3aed7f40a5cf7055af253b34320134bc.tar.bz2
lua-ad7103ea3aed7f40a5cf7055af253b34320134bc.zip
lua_load* defined in auxlib (and so renamed to luaL_load*)
Diffstat (limited to 'lauxlib.c')
-rw-r--r--lauxlib.c206
1 files changed, 181 insertions, 25 deletions
diff --git a/lauxlib.c b/lauxlib.c
index b7b82661..af38c670 100644
--- a/lauxlib.c
+++ b/lauxlib.c
@@ -1,33 +1,36 @@
1/* 1/*
2** $Id: lauxlib.c,v 1.70 2002/05/15 18:57:44 roberto Exp roberto $ 2** $Id: lauxlib.c,v 1.71 2002/05/16 18:39:46 roberto Exp roberto $
3** Auxiliary functions for building Lua libraries 3** Auxiliary functions for building Lua libraries
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
6 6
7 7
8#include <ctype.h>
8#include <stdarg.h> 9#include <stdarg.h>
9#include <stdio.h> 10#include <stdio.h>
10#include <string.h> 11#include <string.h>
11 12
13#ifndef lua_filerror
14#include <errno.h>
15#define lua_fileerror (strerror(errno))
16#endif
17
18
12/* This file uses only the official API of Lua. 19/* This file uses only the official API of Lua.
13** Any function declared here could be written as an application function. 20** Any function declared here could be written as an application function.
14** With care, these functions can be used by other libraries.
15*/ 21*/
16 22
17#include "lua.h" 23#include "lua.h"
18 24
19#include "lauxlib.h" 25#include "lauxlib.h"
20#include "luadebug.h" 26#include "luadebug.h"
21#include "lualib.h"
22 27
23 28
24LUALIB_API int luaL_findstring (const char *name, const char *const list[]) { 29/*
25 int i; 30** {======================================================
26 for (i=0; list[i]; i++) 31** Error-report functions
27 if (strcmp(list[i], name) == 0) 32** =======================================================
28 return i; 33*/
29 return -1; /* name not found */
30}
31 34
32 35
33LUALIB_API int luaL_argerror (lua_State *L, int narg, const char *extramsg) { 36LUALIB_API int luaL_argerror (lua_State *L, int narg, const char *extramsg) {
@@ -54,6 +57,33 @@ static void tag_error (lua_State *L, int narg, int tag) {
54} 57}
55 58
56 59
60LUALIB_API int luaL_verror (lua_State *L, const char *fmt, ...) {
61 lua_Debug ar;
62 const char *msg;
63 va_list argp;
64 va_start(argp, fmt);
65 msg = lua_pushvfstring(L, fmt, argp);
66 va_end(argp);
67 if (lua_getstack(L, 1, &ar)) { /* check calling function */
68 lua_getinfo(L, "Snl", &ar);
69 if (ar.currentline > 0)
70 lua_pushfstring(L, "%s:%d: %s", ar.short_src, ar.currentline, msg);
71 }
72 return lua_errorobj(L);
73}
74
75/* }====================================================== */
76
77
78LUALIB_API int luaL_findstring (const char *name, const char *const list[]) {
79 int i;
80 for (i=0; list[i]; i++)
81 if (strcmp(list[i], name) == 0)
82 return i;
83 return -1; /* name not found */
84}
85
86
57LUALIB_API void luaL_check_stack (lua_State *L, int space, const char *mes) { 87LUALIB_API void luaL_check_stack (lua_State *L, int space, const char *mes) {
58 if (!lua_checkstack(L, space)) 88 if (!lua_checkstack(L, space))
59 luaL_verror(L, "stack overflow (%s)", mes); 89 luaL_verror(L, "stack overflow (%s)", mes);
@@ -143,21 +173,6 @@ LUALIB_API void luaL_opennamedlib (lua_State *L, const char *libname,
143} 173}
144 174
145 175
146LUALIB_API int luaL_verror (lua_State *L, const char *fmt, ...) {
147 lua_Debug ar;
148 const char *msg;
149 va_list argp;
150 va_start(argp, fmt);
151 msg = lua_pushvfstring(L, fmt, argp);
152 va_end(argp);
153 if (lua_getstack(L, 1, &ar)) { /* check calling function */
154 lua_getinfo(L, "Snl", &ar);
155 if (ar.currentline > 0)
156 lua_pushfstring(L, "%s:%d: %s", ar.short_src, ar.currentline, msg);
157 }
158 return lua_errorobj(L);
159}
160
161 176
162/* 177/*
163** {====================================================== 178** {======================================================
@@ -284,3 +299,144 @@ LUALIB_API void luaL_unref (lua_State *L, int t, int ref) {
284 } 299 }
285} 300}
286 301
302
303/*
304** {======================================================
305** Load functions
306** =======================================================
307*/
308
309typedef struct LoadF {
310 FILE *f;
311 char buff[LUAL_BUFFERSIZE];
312} LoadF;
313
314
315static const char *getF (void *ud, size_t *size) {
316 LoadF *lf = (LoadF *)ud;
317 *size = fread(lf->buff, 1, LUAL_BUFFERSIZE, lf->f);
318 return (*size > 0) ? lf->buff : NULL;
319}
320
321
322static int errfile (lua_State *L, const char *filename) {
323 if (filename == NULL) filename = "stdin";
324 lua_pushfstring(L, "cannot read %s: %s", filename, lua_fileerror);
325 return LUA_ERRFILE;
326}
327
328
329LUALIB_API int luaL_loadfile (lua_State *L, const char *filename) {
330 LoadF lf;
331 int status;
332 int c;
333 int old_top = lua_gettop(L);
334 lf.f = (filename == NULL) ? stdin : fopen(filename, "r");
335 if (lf.f == NULL) return errfile(L, filename); /* unable to open file */
336 c = ungetc(getc(lf.f), lf.f);
337 if (!(isspace(c) || isprint(c)) && lf.f != stdin) { /* binary file? */
338 fclose(lf.f);
339 lf.f = fopen(filename, "rb"); /* reopen in binary mode */
340 if (lf.f == NULL) return errfile(L, filename); /* unable to reopen file */
341 }
342 if (filename == NULL)
343 lua_pushliteral(L, "=stdin");
344 else
345 lua_pushfstring(L, "@%s", filename);
346 status = lua_load(L, getF, &lf, lua_tostring(L, -1));
347 lua_remove(L, old_top+1); /* remove filename from stack */
348 if (ferror(lf.f)) {
349 lua_settop(L, old_top); /* ignore results from `lua_load' */
350 return errfile(L, filename);
351 }
352 if (lf.f != stdin)
353 fclose(lf.f);
354 return status;
355}
356
357
358typedef struct LoadS {
359 const char *s;
360 size_t size;
361} LoadS;
362
363
364static const char *getS (void *ud, size_t *size) {
365 LoadS *ls = (LoadS *)ud;
366 if (ls->size == 0) return NULL;
367 *size = ls->size;
368 ls->size = 0;
369 return ls->s;
370}
371
372
373LUALIB_API int luaL_loadbuffer (lua_State *L, const char *buff, size_t size,
374 const char *name) {
375 LoadS ls;
376 ls.s = buff;
377 ls.size = size;
378 return lua_load(L, getS, &ls, name);
379}
380
381/* }====================================================== */
382
383
384/*
385** {======================================================
386** compatibility code
387** =======================================================
388*/
389
390
391static void callalert (lua_State *L, int status) {
392 if (status != 0) {
393 int top = lua_gettop(L);
394 lua_getglobal(L, "_ALERT");
395 lua_insert(L, -2);
396 lua_pcall(L, 1, 0, 0);
397 lua_settop(L, top-1);
398 }
399}
400
401
402LUALIB_API int lua_call (lua_State *L, int nargs, int nresults) {
403 int status;
404 int errpos = lua_gettop(L) - nargs;
405 lua_getglobal(L, "_ERRORMESSAGE");
406 lua_insert(L, errpos); /* put below function and args */
407 status = lua_pcall(L, nargs, nresults, errpos);
408 lua_remove(L, errpos);
409 callalert(L, status);
410 return status;
411}
412
413
414static int aux_do (lua_State *L, int status) {
415 if (status == 0) { /* parse OK? */
416 int err = lua_gettop(L);
417 lua_getglobal(L, "_ERRORMESSAGE");
418 lua_insert(L, err);
419 status = lua_pcall(L, 0, LUA_MULTRET, err); /* call main */
420 lua_remove(L, err); /* remove error function */
421 }
422 callalert(L, status);
423 return status;
424}
425
426
427LUALIB_API int lua_dofile (lua_State *L, const char *filename) {
428 return aux_do(L, luaL_loadfile(L, filename));
429}
430
431
432LUALIB_API int lua_dobuffer (lua_State *L, const char *buff, size_t size,
433 const char *name) {
434 return aux_do(L, luaL_loadbuffer(L, buff, size, name));
435}
436
437
438LUALIB_API int lua_dostring (lua_State *L, const char *str) {
439 return lua_dobuffer(L, str, strlen(str), str);
440}
441
442/* }====================================================== */