Make it possible to load Lua dynamically on Unix. (Luis Carvalho)
diff --git a/src/Makefile b/src/Makefile
index 59aca22..f0c2316 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -370,8 +370,10 @@
 #CONF_OPT_DARWIN = --with-mac-arch=both
 
 # LUA
-# Uncomment this when you want to include the Lua interface.
+# Uncomment one of these when you want to include the Lua interface.
+# First one is for static linking, second one for dynamic loading.
 #CONF_OPT_LUA = --enable-luainterp
+#CONF_OPT_LUA = --enable-luainterp=dynamic
 # Lua installation dir (when not set uses $LUA_PREFIX or defaults to /usr)
 #CONF_OPT_LUA_PREFIX = --with-lua-prefix=/usr/local
 
@@ -1314,7 +1316,7 @@
 .SUFFIXES: .c .o .pro
 
 PRE_DEFS = -Iproto $(DEFS) $(GUI_DEFS) $(GUI_IPATH) $(CPPFLAGS) $(EXTRA_IPATHS)
-POST_DEFS = $(X_CFLAGS) $(LUA_CFLAGS) $(MZSCHEME_CFLAGS) $(TCL_CFLAGS) $(RUBY_CFLAGS) $(EXTRA_DEFS)
+POST_DEFS = $(X_CFLAGS) $(MZSCHEME_CFLAGS) $(TCL_CFLAGS) $(RUBY_CFLAGS) $(EXTRA_DEFS)
 
 ALL_CFLAGS = $(PRE_DEFS) $(CFLAGS) $(PROFILE_CFLAGS) $(POST_DEFS)
 
@@ -1322,7 +1324,7 @@
 # with "-E".
 OSDEF_CFLAGS = $(PRE_DEFS) $(POST_DEFS)
 
-LINT_CFLAGS = -DLINT -I. $(PRE_DEFS) $(POST_DEFS) $(PYTHON_CFLAGS) -Dinline= -D__extension__= -Dalloca=alloca
+LINT_CFLAGS = -DLINT -I. $(PRE_DEFS) $(POST_DEFS) $(LUA_CFLAGS) $(PERL_CFLAGS) $(PYTHON_CFLAGS) -Dinline= -D__extension__= -Dalloca=alloca
 
 LINT_EXTRA = -DUSE_SNIFF -DHANGUL_INPUT -D"__attribute__(x)="
 
@@ -2488,7 +2490,7 @@
 	$(CCC) -o $@ if_xcmdsrv.c
 
 objects/if_lua.o: if_lua.c
-	$(CCC) -o $@ if_lua.c
+	$(CCC) $(LUA_CFLAGS) -o $@ if_lua.c
 
 objects/if_mzsch.o: if_mzsch.c $(MZSCHEME_EXTRA)
 	$(CCC) -o $@ $(MZSCHEME_CFLAGS_EXTRA) if_mzsch.c
diff --git a/src/auto/configure b/src/auto/configure
index 12ec721..4ab3ae6 100755
--- a/src/auto/configure
+++ b/src/auto/configure
@@ -1421,7 +1421,7 @@
   --disable-selinux	  Don't check for SELinux support.
   --disable-xsmp          Disable XSMP session management
   --disable-xsmp-interact Disable XSMP interaction
-  --enable-luainterp      Include Lua interpreter.
+  --enable-luainterp=OPTS     Include Lua interpreter.  default=no OPTS=no/yes/dynamic
   --enable-mzschemeinterp   Include MzScheme interpreter.
   --enable-perlinterp=OPTS     Include Perl interpreter.  default=no OPTS=no/yes/dynamic
   --enable-pythoninterp   Include Python interpreter.
@@ -4594,7 +4594,7 @@
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_luainterp" >&5
 $as_echo "$enable_luainterp" >&6; }
 
-if test "$enable_luainterp" = "yes"; then
+if test "$enable_luainterp" = "yes" -o "$enable_luainterp" = "dynamic"; then
 
 
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking --with-lua-prefix argument" >&5
@@ -4713,6 +4713,12 @@
     LUA_PRO="if_lua.pro"
     $as_echo "#define FEAT_LUA 1" >>confdefs.h
 
+    if test "$enable_luainterp" = "dynamic"; then
+      $as_echo "#define DYNAMIC_LUA 1" >>confdefs.h
+
+      LUA_LIBS=""
+      LUA_CFLAGS="-DDYNAMIC_LUA_DLL=\\\"liblua${vi_cv_version_lua}.so\\\" $LUA_CFLAGS"
+    fi
   fi
 
 
diff --git a/src/config.h.in b/src/config.h.in
index 3e86b84..2a28e0e 100644
--- a/src/config.h.in
+++ b/src/config.h.in
@@ -319,6 +319,9 @@
 /* Define if you want to include the Lua interpreter. */
 #undef FEAT_LUA
 
+/* Define for linking via dlopen() or LoadLibrary() */
+#undef DYNAMIC_LUA
+
 /* Define if you want to include the MzScheme interpreter. */
 #undef FEAT_MZSCHEME
 
diff --git a/src/configure.in b/src/configure.in
index b10d5c9..0492eb0 100644
--- a/src/configure.in
+++ b/src/configure.in
@@ -413,11 +413,11 @@
 dnl Check for Lua feature.
 AC_MSG_CHECKING(--enable-luainterp argument)
 AC_ARG_ENABLE(luainterp,
-	[  --enable-luainterp      Include Lua interpreter.], ,
+	[  --enable-luainterp[=OPTS]     Include Lua interpreter.  [default=no] [OPTS=no/yes/dynamic]], ,
 	[enable_luainterp="no"])
 AC_MSG_RESULT($enable_luainterp)
 
-if test "$enable_luainterp" = "yes"; then
+if test "$enable_luainterp" = "yes" -o "$enable_luainterp" = "dynamic"; then
   dnl -- find the lua executable
   AC_SUBST(vi_cv_path_lua)
 
@@ -477,6 +477,11 @@
     LUA_OBJ="objects/if_lua.o"
     LUA_PRO="if_lua.pro"
     AC_DEFINE(FEAT_LUA)
+    if test "$enable_luainterp" = "dynamic"; then
+      AC_DEFINE(DYNAMIC_LUA)
+      LUA_LIBS=""
+      LUA_CFLAGS="-DDYNAMIC_LUA_DLL=\\\"liblua${vi_cv_version_lua}.so\\\" $LUA_CFLAGS"
+    fi
   fi
   AC_SUBST(LUA_SRC)
   AC_SUBST(LUA_OBJ)
diff --git a/src/if_lua.c b/src/if_lua.c
index 133f2fc..4c3f9b7 100644
--- a/src/if_lua.c
+++ b/src/if_lua.c
@@ -41,6 +41,19 @@
 
 
 #ifdef DYNAMIC_LUA
+
+#ifndef WIN3264
+# include <dlfcn.h>
+# define HANDLE void*
+# define load_dll(n) dlopen((n), RTLD_LAZY|RTLD_GLOBAL)
+# define symbol_from_dll dlsym
+# define close_dll dlclose
+#else
+# define load_dll LoadLibrary
+# define symbol_from_dll GetProcAddress
+# define close_dll FreeLibrary
+#endif
+
 /* lauxlib */
 #define luaL_register dll_luaL_register
 #define luaL_typerror dll_luaL_typerror
@@ -227,14 +240,14 @@
     {NULL, NULL}
 };
 
-static HINSTANCE hinstLua = 0;
+static HANDLE hinstLua = NULL;
 
     static void
 end_dynamic_lua(void)
 {
     if (hinstLua)
     {
-	FreeLibrary(hinstLua);
+	close_dll(hinstLua);
 	hinstLua = 0;
     }
 }
@@ -244,7 +257,7 @@
 {
     const luaV_Reg *reg;
     if (hinstLua) return OK;
-    hinstLua = LoadLibrary(libname);
+    hinstLua = load_dll(libname);
     if (!hinstLua)
     {
 	if (verbose)
@@ -253,8 +266,9 @@
     }
     for (reg = luaV_dll; reg->func; reg++)
     {
-	if ((*reg->func = GetProcAddress(hinstLua, reg->name)) == NULL) {
-	    FreeLibrary(hinstLua);
+	if ((*reg->func = symbol_from_dll(hinstLua, reg->name)) == NULL)
+	{
+	    close_dll(hinstLua);
 	    hinstLua = 0;
 	    if (verbose)
 		EMSG2(_(e_loadfunc), reg->name);
@@ -364,7 +378,8 @@
 		/* check cache */
 		lua_pushlightuserdata(L, (void *) d);
 		lua_rawget(L, LUA_ENVIRONINDEX);
-		if (lua_isnil(L, -1)) { /* not interned? */
+		if (lua_isnil(L, -1)) /* not interned? */
+		{
 		    hashtab_T *ht = &d->dv_hashtab;
 		    hashitem_T *hi;
 		    int n = ht->ht_used; /* remaining items */
diff --git a/src/proto/if_lua.pro b/src/proto/if_lua.pro
index fb80ae0..3bac4cc 100644
--- a/src/proto/if_lua.pro
+++ b/src/proto/if_lua.pro
@@ -1,4 +1,5 @@
 /* if_lua.c */
+int lua_enabled __ARGS((int verbose));
 void lua_end __ARGS((void));
 void ex_lua __ARGS((exarg_T *eap));
 void ex_luado __ARGS((exarg_T *eap));