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
+
 /* }================================================================== */
 
 
