Warning: this is an htmlized version!
The original is here, and
the conversion rules are here.
/*
 * demo_luaClua.c: a demo of Lua->C->Lua in swig.
 * Swig helps us with the "Lua->C" direction, but sometimes we want to
 * make our C functions call functions written in Lua - the "C->Lua"
 * part.
 * By Edrx, 2006jul18
 * Note: this is unfinished, untested, broken.
 * Check the e-scripts instead:
 * (find-es "swig" "making-L-accessible")
 * (find-es "swig" "making-L-accessible-long")
 * (find-es "swig" "single-source" "#ifdef SWIG")
 *
 * The only reason to have this thing in a file by itself is that
 * Emacs's c-mode likes reals C files and doesn't like my ".e"s.
 *
 * (find-swigmanualw3m "SWIG.html")
 * (find-swigmanualw3m "Typemaps.html")
 * (find-swigmanualw3m "Typemaps.html#Typemaps_nn4")
 * (find-swigmanualfile "")
 * file:///home/edrx/usrc/swig-1.3.29/Doc/Manual/Typemaps.html
 * file:///home/edrx/usrc/swig-1.3.29/Doc/Manual/Typemaps.html#Typemaps_mixed_default
 *
 * (find-swigfile "")
 * (find-swigfile "Lib/lua/")
 * (find-swigfile "Lib/lua/lua.swg")
 * (find-swigfile "Lib/lua/luarun.swg")
 * (find-swigfile "Lib/lua/typemaps.i")
 * (find-swigsh "find | grep -i lua")
 */


#ifdef SWIG
%module C
%typemap(in) lua_State *L "$1 = L;"
%inline %{
  extern int foo(char *str, int n, lua_State *L);
%}
#else /* Not SWIG */

/*
 * (find-node "(cpp)The preprocessing language" "before and after the `#'")
 * (find-lua50file "include/")
 * (find-lua50file "include/lua.h" "#define LUA_GLOBALSINDEX")
 * (find-luamanual-ff  "pushing")
 * (find-luamanualw3m+ "pushing")
 * (find-luamanualw3m+ "debug.debug")
 * (find-luamanualw3m+ "lua-to" "lua_tonumber converts the Lua value")
 * (find-luamanualw3m+ "3.14" "lua_call")
 * (find-fline "/tmp/mla/")
 * (find-fline "/tmp/mla/mla_wrap.c" "_wrap_foo")
 * (find-fline "/tmp/mla/mla_wrap.c" "_wrap_foo" "arg3 = L;")
 * (find-swigfile "")
 */
#include "lua.h"
#include "lauxlib.h"

int foo(char *str, int n, lua_State *L) {
  int subfoo_result;
  printf("C.foo:  depth at the beginning: %d\n", lua_gettop(L));
  lua_pushstring(L, "subfoo");                        /* function name */
  lua_gettable(L, LUA_GLOBALSINDEX);          /* function to be called */
  lua_pushstring(L, str[0] ? str+1 : "empty");         /* 1st argument */
  lua_pushnumber(L, n*10);                             /* 2nd argument */
  lua_call(L, 2, 1);    /* call function with 2 arguments and 1 result */
    /* now convert the returned value to an int and return it (plus 5) */
  subfoo_result = lua_tonumber(L, -1);  /* index=-1 means top of stack */
  lua_pop(L, 1);                          /* remove results from stack */
  printf("C.foo:  depth after lua_pop:    %d\n", lua_gettop(L));
  return subfoo_result + 5;
}

#endif /* Not SWIG */