diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2004-09-21 13:54:32 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2004-09-21 13:54:32 -0300 |
commit | 6acfb91c8d4dd1174545537ef85e1dacfdb04633 (patch) | |
tree | 045cf5caa21bdc6707ac5fccfc120c34cfecc62c /lauxlib.c | |
parent | 2419f2bf02a9165471248f09bae57e3fa134e545 (diff) | |
download | lua-6acfb91c8d4dd1174545537ef85e1dacfdb04633.tar.gz lua-6acfb91c8d4dd1174545537ef85e1dacfdb04633.tar.bz2 lua-6acfb91c8d4dd1174545537ef85e1dacfdb04633.zip |
new auxiliary functions to implement new package system
Diffstat (limited to 'lauxlib.c')
-rw-r--r-- | lauxlib.c | 49 |
1 files changed, 46 insertions, 3 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lauxlib.c,v 1.123 2004/08/30 18:35:14 roberto Exp roberto $ | 2 | ** $Id: lauxlib.c,v 1.124 2004/09/03 13:17:14 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 | */ |
@@ -352,8 +352,8 @@ static const char *pushnexttemplate (lua_State *L, const char *path) { | |||
352 | } | 352 | } |
353 | 353 | ||
354 | 354 | ||
355 | static const char *luaL_gsub (lua_State *L, const char *s, | 355 | LUALIB_API const char *luaL_gsub (lua_State *L, const char *s, const char *p, |
356 | const char *p, const char *r) { | 356 | const char *r) { |
357 | const char *wild; | 357 | const char *wild; |
358 | int l = strlen(p); | 358 | int l = strlen(p); |
359 | luaL_Buffer b; | 359 | luaL_Buffer b; |
@@ -391,6 +391,49 @@ LUALIB_API const char *luaL_searchpath (lua_State *L, const char *name, | |||
391 | } | 391 | } |
392 | 392 | ||
393 | 393 | ||
394 | LUALIB_API const char *luaL_getfield (lua_State *L, const char *fname) { | ||
395 | const char *e; | ||
396 | while ((e = strchr(fname, '.')) != NULL) { | ||
397 | lua_pushlstring(L, fname, e - fname); | ||
398 | lua_gettable(L, -2); | ||
399 | lua_remove(L, -2); /* remove previous table */ | ||
400 | fname = e + 1; | ||
401 | if (!lua_istable(L, -1)) return fname; | ||
402 | } | ||
403 | lua_getfield(L, -1, fname); /* get last field */ | ||
404 | lua_remove(L, -2); /* remove previous table */ | ||
405 | return NULL; | ||
406 | } | ||
407 | |||
408 | |||
409 | LUALIB_API const char *luaL_setfield (lua_State *L, const char *fname) { | ||
410 | const char *e; | ||
411 | lua_insert(L, -2); /* move value to below table */ | ||
412 | while ((e = strchr(fname, '.')) != NULL) { | ||
413 | lua_pushlstring(L, fname, e - fname); | ||
414 | lua_gettable(L, -2); | ||
415 | if (lua_isnil(L, -1)) { /* no such field? */ | ||
416 | lua_pop(L, 1); /* remove this nil */ | ||
417 | lua_newtable(L); /* create a new table for field */ | ||
418 | lua_pushlstring(L, fname, e - fname); | ||
419 | lua_pushvalue(L, -2); | ||
420 | lua_settable(L, -4); /* set new table into field */ | ||
421 | } | ||
422 | lua_remove(L, -2); /* remove previous table */ | ||
423 | fname = e + 1; | ||
424 | if (!lua_istable(L, -1)) { | ||
425 | lua_pop(L, 2); /* remove table and value */ | ||
426 | return fname; | ||
427 | } | ||
428 | } | ||
429 | lua_insert(L, -2); /* move table to below value */ | ||
430 | lua_setfield(L, -2, fname); /* set last field */ | ||
431 | lua_remove(L, -2); /* remove table */ | ||
432 | return NULL; | ||
433 | } | ||
434 | |||
435 | |||
436 | |||
394 | /* | 437 | /* |
395 | ** {====================================================== | 438 | ** {====================================================== |
396 | ** Generic Buffer manipulation | 439 | ** Generic Buffer manipulation |