# HG changeset patch # User Tom?s Guisasola Gorham # Date 1343430908 -3600 # Node ID e981a82571cf5c54d5e84f73fbcad7214f699c03 # Parent 5dfed844930e6ccd981d44290fe51d20255388bc Add compatibility with Lua 5.2 diff -r 5dfed844930e -r e981a82571cf src/lxp/lom.lua --- a/src/lxp/lom.lua Fri Jul 27 22:03:24 2012 +0100 +++ b/src/lxp/lom.lua Sat Jul 28 00:15:08 2012 +0100 @@ -1,13 +1,11 @@ -- See Copyright Notice in license.html -- $Id: lom.lua,v 1.6 2005/06/09 19:18:40 tuler Exp $ -require "lxp" +local lxp = require "lxp" -local tinsert, tremove, getn = table.insert, table.remove, table.getn +local tinsert, tremove = table.insert, table.remove local assert, type, print = assert, type, print -local lxp = lxp -module ("lxp.lom") local function starttag (p, tag, attr) local stack = p:getcallbacks().stack @@ -19,14 +17,14 @@ local stack = p:getcallbacks().stack local element = tremove(stack) assert(element.tag == tag) - local level = getn(stack) + local level = #stack tinsert(stack[level], element) end local function text (p, txt) local stack = p:getcallbacks().stack - local element = stack[getn(stack)] - local n = getn(element) + local element = stack[#stack] + local n = #element if type(element[n]) == "string" then element[n] = element[n] .. txt else @@ -34,7 +32,7 @@ end end -function parse (o) +local function parse (o) local c = { StartElement = starttag, EndElement = endtag, CharacterData = text, @@ -47,7 +45,7 @@ status, err = p:parse(o) if not status then return nil, err end else - for l in o do + for l in pairs(o) do status, err = p:parse(l) if not status then return nil, err end end @@ -58,3 +56,4 @@ return c.stack[1][1] end +return { parse = parse } diff -r 5dfed844930e -r e981a82571cf src/lxplib.c --- a/src/lxplib.c Fri Jul 27 22:03:24 2012 +0100 +++ b/src/lxplib.c Sat Jul 28 00:15:08 2012 +0100 @@ -13,14 +13,16 @@ #include "lua.h" #include "lauxlib.h" -#if ! defined (LUA_VERSION_NUM) || LUA_VERSION_NUM < 501 -#include "compat-5.1.h" -#endif #include "lxplib.h" +#if !defined(lua_pushliteral) +#define lua_pushliteral(L, s) \ + lua_pushstring(L, "" s, (sizeof(s)/sizeof(char))-1) +#endif + enum XPState { XPSpre, /* parser just initialized */ @@ -66,7 +68,7 @@ static void lxpclose (lua_State *L, lxp_userdata *xpu) { - lua_unref(L, xpu->tableref); + luaL_unref(L, LUA_REGISTRYINDEX, xpu->tableref); xpu->tableref = LUA_REFNIL; if (xpu->parser) XML_ParserFree(xpu->parser); @@ -225,7 +227,7 @@ child->parser = XML_ExternalEntityParserCreate(p, context, NULL); if (!child->parser) luaL_error(L, "XML_ParserCreate failed"); - lua_getref(L, xpu->tableref); /* child uses the same table of its father */ + lua_rawgeti(L, LUA_REGISTRYINDEX, xpu->tableref); /*lua_getref(L, xpu->tableref); */ /* child uses the same table of its father */ child->tableref = luaL_ref(L, LUA_REGISTRYINDEX); lua_pushstring(L, base); lua_pushstring(L, systemId); @@ -449,7 +451,7 @@ xpu->state = XPSok; xpu->b = &b; lua_settop(L, 2); - lua_getref(L, xpu->tableref); /* to be used by handlers */ + lua_rawgeti(L, LUA_REGISTRYINDEX, xpu->tableref); /*lua_getref(L, xpu->tableref);*/ /* to be used by handlers */ status = XML_Parse(xpu->parser, s, (int)len, s == NULL); if (xpu->state == XPSstring) dischargestring(xpu); if (xpu->state == XPSerror) { /* callback error? */ @@ -517,7 +519,12 @@ return 1; } -static const struct luaL_reg lxp_meths[] = { +#if !defined LUA_VERSION_NUM +/* Lua 5.0 */ +#define luaL_Reg luaL_reg +#endif + +static const struct luaL_Reg lxp_meths[] = { {"parse", lxp_parse}, {"close", lxp_close}, {"__gc", parser_gc}, @@ -530,7 +537,7 @@ {NULL, NULL} }; -static const struct luaL_reg lxp_funcs[] = { +static const struct luaL_Reg lxp_funcs[] = { {"new", lxp_make_parser}, {NULL, NULL} }; @@ -541,25 +548,48 @@ */ static void set_info (lua_State *L) { lua_pushliteral (L, "_COPYRIGHT"); - lua_pushliteral (L, "Copyright (C) 2003-2007 Kepler Project"); + lua_pushliteral (L, "Copyright (C) 2003-2012 Kepler Project"); lua_settable (L, -3); lua_pushliteral (L, "_DESCRIPTION"); lua_pushliteral (L, "LuaExpat is a SAX XML parser based on the Expat library"); lua_settable (L, -3); lua_pushliteral (L, "_VERSION"); - lua_pushliteral (L, "LuaExpat 1.2.0"); + lua_pushliteral (L, "LuaExpat 1.3.0"); lua_settable (L, -3); } +#if !defined LUA_VERSION_NUM || LUA_VERSION_NUM==501 +/* +** Adapted from Lua 5.2.0 +*/ +static void luaL_setfuncs (lua_State *L, const luaL_Reg *l, int nup) { + luaL_checkstack(L, nup, "too many upvalues"); + for (; l->name != NULL; l++) { /* fill the table with given functions */ + int i; + for (i = 0; i < nup; i++) /* copy upvalues to the top */ + lua_pushvalue(L, -nup); + lua_pushstring(L, l->name); + lua_pushcclosure(L, l->func, nup); /* closure with those upvalues */ + lua_settable(L, -(nup + 3)); + } + lua_pop(L, nup); /* remove upvalues */ +} +#endif + + int luaopen_lxp (lua_State *L) { - luaL_newmetatable(L, ParserType); - lua_pushliteral(L, "__index"); - lua_pushvalue(L, -2); - lua_rawset(L, -3); - luaL_openlib (L, NULL, lxp_meths, 0); - luaL_openlib (L, "lxp", lxp_funcs, 0); - set_info (L); + luaL_newmetatable(L, ParserType); - return 1; + lua_pushliteral(L, "__index"); + lua_pushvalue(L, -2); + lua_rawset(L, -3); + + luaL_setfuncs (L, lxp_meths, 0); + lua_pop (L, 1); /* remove metatable */ + + lua_newtable (L); + luaL_setfuncs (L, lxp_funcs, 0); + set_info (L); + return 1; }