summaryrefslogtreecommitdiff
path: root/package/lua/patches/040-gzip-source-loader.patch
blob: 8214ae9f8720b4c66b9101886f76e18b8ce5274c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
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 <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,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
+
 /* }================================================================== */