diff -ur lua-5.1.4.orig/src/Makefile lua-5.1.4/src/Makefile --- lua-5.1.4.orig/src/Makefile 2009-04-04 23:06:04.000000000 +0200 +++ lua-5.1.4/src/Makefile 2009-04-04 23:06:15.000000000 +0200 @@ -12,7 +12,7 @@ AR= ar rcu RANLIB= ranlib RM= rm -f -LIBS= -lm $(MYLIBS) +LIBS= -lm -lz $(MYLIBS) MYCFLAGS= MYLDFLAGS= diff -ur lua-5.1.4.orig/src/lauxlib.c lua-5.1.4/src/lauxlib.c --- lua-5.1.4.orig/src/lauxlib.c 2009-04-04 23:06:04.000000000 +0200 +++ lua-5.1.4/src/lauxlib.c 2009-04-05 03:35:24.000000000 +0200 @@ -11,6 +11,7 @@ #include #include #include +#include /* This file uses only the official API of Lua. @@ -535,6 +536,12 @@ char buff[LUAL_BUFFERSIZE]; } LoadF; +typedef struct LoadGZ { + int first_chunk; + gzFile f; + char buffer[LUAL_GZLDBUFFER]; +} LoadGZ; + static const char *getF (lua_State *L, void *ud, size_t *size) { LoadF *lf = (LoadF *)ud; @@ -550,6 +557,28 @@ } +static const char *getGZ (lua_State *L, void *ud, size_t *size) { + LoadGZ *lf = (LoadGZ *)ud; + char *sp = 0; + (void)L; + if (gzeof(lf->f)) return NULL; + *size = gzread(lf->f, lf->buffer, sizeof(lf->buffer)); + if (*size > 0) { + if (lf->first_chunk) { + lf->first_chunk = 0; + if ((lf->buffer[0] == '#') && (lf->buffer[1] == '!') && + (sp=strstr(lf->buffer, "\n")) != NULL) + { + *size -= ((uint)sp - (uint)lf->buffer); + return sp; + } + } + return lf->buffer; + } + return NULL; +} + + static int errfile (lua_State *L, const char *what, int fnameindex) { const char *serr = strerror(errno); const char *filename = lua_tostring(L, fnameindex) + 1; @@ -560,6 +589,31 @@ LUALIB_API int luaL_loadfile (lua_State *L, const char *filename) { + if ((filename != NULL) && strstr(filename, ".lua.gz")) { + return luaL_loadfile_gzip(L, filename); + } + else { + return luaL_loadfile_plain(L, filename); + } +} + + +LUALIB_API int luaL_loadfile_gzip (lua_State *L, const char *filename) { + LoadGZ gzf; + int status; + int fnameindex = lua_gettop(L) + 1; /* index of filename on the stack */ + lua_pushfstring(L, "@%s", filename); + gzf.f = gzopen(filename, "r"); + gzf.first_chunk = 1; + if (gzf.f == Z_NULL) return errfile(L, "open", fnameindex); + status = lua_load(L, getGZ, &gzf, lua_tostring(L, -1)); + (void)gzclose(gzf.f); + lua_remove(L, fnameindex); + return status; +} + + +LUALIB_API int luaL_loadfile_plain (lua_State *L, const char *filename) { LoadF lf; int status, readstatus; int c; diff -ur lua-5.1.4.orig/src/lauxlib.h lua-5.1.4/src/lauxlib.h --- lua-5.1.4.orig/src/lauxlib.h 2009-04-04 23:06:04.000000000 +0200 +++ lua-5.1.4/src/lauxlib.h 2009-04-04 23:06:15.000000000 +0200 @@ -81,6 +81,8 @@ LUALIB_API void (luaL_unref) (lua_State *L, int t, int ref); LUALIB_API int (luaL_loadfile) (lua_State *L, const char *filename); +LUALIB_API int (luaL_loadfile_gzip) (lua_State *L, const char *filename); +LUALIB_API int (luaL_loadfile_plain) (lua_State *L, const char *filename); LUALIB_API int (luaL_loadbuffer) (lua_State *L, const char *buff, size_t sz, const char *name); LUALIB_API int (luaL_loadstring) (lua_State *L, const char *s); diff -ur lua-5.1.4.orig/src/luaconf.h lua-5.1.4/src/luaconf.h --- lua-5.1.4.orig/src/luaconf.h 2009-04-04 23:06:04.000000000 +0200 +++ lua-5.1.4/src/luaconf.h 2009-04-04 23:27:20.000000000 +0200 @@ -101,7 +101,9 @@ #define LUA_CDIR LUA_ROOT "lib/lua/5.1/" #define LUA_PATH_DEFAULT \ "./?.lua;" LUA_LDIR"?.lua;" LUA_LDIR"?/init.lua;" \ - LUA_CDIR"?.lua;" LUA_CDIR"?/init.lua" + LUA_CDIR"?.lua;" LUA_CDIR"?/init.lua;" \ + "./?.lua.gz;" LUA_LDIR"?.lua.gz;" LUA_LDIR"?/init.lua.gz;" \ + LUA_CDIR"?.lua.gz;" LUA_CDIR"?/init.lua.gz" #define LUA_CPATH_DEFAULT \ "./?.so;" LUA_CDIR"?.so;" LUA_CDIR"loadall.so" #endif @@ -506,6 +508,12 @@ */ #define LUAL_BUFFERSIZE BUFSIZ + +/* +@@ LUAL_GZLDBUFFER is the buffer size used by the gzip source loader. +*/ +#define LUAL_GZLDBUFFER 8192 + /* }================================================================== */