summaryrefslogtreecommitdiffstats
path: root/package/lua/patches-host/040-gzip-source-loader.patch
diff options
context:
space:
mode:
Diffstat (limited to 'package/lua/patches-host/040-gzip-source-loader.patch')
-rw-r--r--package/lua/patches-host/040-gzip-source-loader.patch134
1 files changed, 134 insertions, 0 deletions
diff --git a/package/lua/patches-host/040-gzip-source-loader.patch b/package/lua/patches-host/040-gzip-source-loader.patch
new file mode 100644
index 000000000..6fbafa206
--- /dev/null
+++ b/package/lua/patches-host/040-gzip-source-loader.patch
@@ -0,0 +1,134 @@
+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 00:03:33.000000000 +0200
+@@ -11,6 +11,7 @@
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <string.h>
++#include <zlib.h>
+
+
+ /* 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,26 @@
+ }
+
+
++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 (strstr(lf->buffer, "#!") && (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 +587,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
++
+ /* }================================================================== */
+
+