Patch updating lepdflib.cc to upstream revision 4415, which basically removes part of the exported interface and thereby circumvents the changes in poppler-0.20 -> 0.22. Experimental, rebased on our existing Gentoo patches poppler-0.18.patch and poppler-0.20.patch. Here to solve bug 449538. diff -ruN luatex-beta-0.70.1.gentoo/source/texk/web2c/luatexdir/lua/lepdflib.cc luatex-beta-0.70.1/source/texk/web2c/luatexdir/lua/lepdflib.cc --- luatex-beta-0.70.1.gentoo/source/texk/web2c/luatexdir/lua/lepdflib.cc 2013-03-10 13:31:22.000000000 +0100 +++ luatex-beta-0.70.1/source/texk/web2c/luatexdir/lua/lepdflib.cc 2013-03-10 13:47:24.000000000 +0100 @@ -1,7 +1,7 @@ /* lepdflib.cc - Copyright 2009-2011 Taco Hoekwater - Copyright 2009-2011 Hartmut Henkel + Copyright 2009-2012 Taco Hoekwater + Copyright 2009-2012 Hartmut Henkel This file is part of LuaTeX. @@ -49,15 +49,13 @@ //********************************************************************** #define M_Annot "Annot" -#define M_AnnotBorder "AnnotBorder" -#define M_AnnotBorderStyle "AnnotBorderStyle" #define M_Annots "Annots" #define M_Array "Array" #define M_Catalog "Catalog" -#define M_EmbFile "EmbFile" #define M_Dict "Dict" #define M_GooString "GooString" #define M_LinkDest "LinkDest" +#define M_Link "Link" #define M_Links "Links" #define M_Object "Object" #define M_Page "Page" @@ -65,8 +63,8 @@ #define M_PDFRectangle "PDFRectangle" #define M_Ref "Ref" #define M_Stream "Stream" -#define M_XRef "XRef" #define M_XRefEntry "XRefEntry" +#define M_XRef "XRef" //********************************************************************** @@ -84,13 +82,9 @@ new_poppler_userdata(PDFDoc); new_poppler_userdata(Annot); -new_poppler_userdata(AnnotBorder); -//new_poppler_userdata(AnnotBorderStyle); -new_poppler_userdata(Annots); new_poppler_userdata(Array); new_poppler_userdata(Catalog); new_poppler_userdata(Dict); -//new_poppler_userdata(GooString); new_poppler_userdata(LinkDest); new_poppler_userdata(Links); new_poppler_userdata(Object); @@ -99,7 +93,6 @@ new_poppler_userdata(Ref); new_poppler_userdata(Stream); new_poppler_userdata(XRef); -//new_poppler_userdata(XRefEntry); //********************************************************************** @@ -134,53 +127,6 @@ return 1; // doc path } -static int l_new_Annot(lua_State * L) -{ - udstruct *uxref, *udict, *ucatalog, *uref, *uout; - uxref = (udstruct *) luaL_checkudata(L, 1, M_XRef); - udict = (udstruct *) luaL_checkudata(L, 2, M_Dict); - ucatalog = (udstruct *) luaL_checkudata(L, 3, M_Catalog); - uref = (udstruct *) luaL_checkudata(L, 4, M_Ref); - if (uxref->pd != ucatalog->pd || uxref->pd != udict->pd - || uxref->pd != uref->pd) - pdfdoc_differs_error(L); - if ((uxref->pd != NULL && uxref->pd->pc != uxref->pc) || - (ucatalog->pd != NULL && ucatalog->pd->pc != ucatalog->pc) || - (udict->pd != NULL && udict->pd->pc != udict->pc) || - (uref->pd != NULL && uref->pd->pc != uref->pc)) - pdfdoc_changed_error(L); - uout = new_Annot_userdata(L); - uout->d = - new Annot(udict->pd->doc, (Dict *) udict->d, - (Object *) uref->d); - uout->atype = ALLOC_LEPDF; - uout->pc = uxref->pc; - uout->pd = uxref->pd; - return 1; -} - -static int l_new_Annots(lua_State * L) -{ - udstruct *uxref, *ucatalog, *uannotsobj, *uout; - uxref = (udstruct *) luaL_checkudata(L, 1, M_XRef); - ucatalog = (udstruct *) luaL_checkudata(L, 2, M_Catalog); - uannotsobj = (udstruct *) luaL_checkudata(L, 3, M_Object); - if (uxref->pd != ucatalog->pd || uxref->pd != uannotsobj->pd) - pdfdoc_differs_error(L); - if ((uxref->pd != NULL && uxref->pd->pc != uxref->pc) - || (ucatalog->pd != NULL && ucatalog->pd->pc != ucatalog->pc) - || (uannotsobj->pd != NULL && uannotsobj->pd->pc != uannotsobj->pc)) - pdfdoc_changed_error(L); - uout = new_Annots_userdata(L); - uout->d = - new Annots(uannotsobj->pd->doc, - (Object *) uannotsobj->d); - uout->atype = ALLOC_LEPDF; - uout->pc = uxref->pc; - uout->pd = uxref->pd; - return 1; -} - static int l_new_Array(lua_State * L) { udstruct *uxref, *uout; @@ -235,8 +181,6 @@ static const struct luaL_Reg epdflib[] = { {"open", l_open_PDFDoc}, - {"Annot", l_new_Annot}, - {"Annots", l_new_Annots}, {"Array", l_new_Array}, {"Dict", l_new_Dict}, {"Object", l_new_Object}, @@ -359,12 +303,26 @@ return 1; \ } +#define m_poppler_check_string(in, function) \ +static int m_##in##_##function(lua_State * L) \ +{ \ + const char *s; \ + udstruct *uin; \ + uin = (udstruct *) luaL_checkudata(L, 1, M_##in); \ + if (uin->pd != NULL && uin->pd->pc != uin->pc) \ + pdfdoc_changed_error(L); \ + s = luaL_checkstring(L, 2); \ + if (((in *) uin->d)->function((char *) s)) \ + lua_pushboolean(L, 1); \ + else \ + lua_pushboolean(L, 0); \ + return 1; \ +} + //********************************************************************** // Annot m_poppler_get_BOOL(Annot, isOk); -m_poppler_get_OBJECT(Annot, getAppearanceResDict); -m_poppler_get_poppler(Annot, AnnotBorder, getBorder); static int m_Annot_match(lua_State * L) { @@ -398,8 +356,6 @@ static const struct luaL_Reg Annot_m[] = { {"isOk", m_Annot_isOk}, - {"getAppearanceResDict", m_Annot_getAppearanceResDict}, - {"getBorder", m_Annot_getBorder}, {"match", m_Annot_match}, {"__tostring", m_Annot__tostring}, {"__gc", m_Annot__gc}, @@ -654,6 +610,7 @@ m_poppler_get_poppler(Catalog, Object, getDests); m_poppler_get_INT(Catalog, numEmbeddedFiles); + m_poppler_get_INT(Catalog, numJS); static int m_Catalog_getJS(lua_State * L) @@ -770,20 +727,7 @@ return 0; } -static int m_Dict_is(lua_State * L) -{ - const char *s; - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_Dict); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - s = luaL_checkstring(L, 2); - if (((Dict *) uin->d)->is((char *) s)) - lua_pushboolean(L, 1); - else - lua_pushboolean(L, 0); - return 1; -} +m_poppler_check_string(Dict, is); static int m_Dict_lookup(lua_State * L) { @@ -894,6 +838,8 @@ return 1; } +m_poppler_check_string(Dict, hasKey); + m_poppler__tostring(Dict); static const struct luaL_Reg Dict_m[] = { @@ -910,6 +856,7 @@ {"getKey", m_Dict_getKey}, {"getVal", m_Dict_getVal}, {"getValNF", m_Dict_getValNF}, + {"hasKey", m_Dict_hasKey}, {"__tostring", m_Dict__tostring}, {NULL, NULL} // sentinel }; @@ -1017,9 +964,13 @@ //********************************************************************** // Links +m_poppler_get_INT(Links, getNumLinks); + m_poppler__tostring(Links); static const struct luaL_Reg Links_m[] = { + {"getNumLinks", m_Links_getNumLinks}, + //{"getLink", m_Links_getLink}, {"__tostring", m_Links__tostring}, {NULL, NULL} // sentinel }; @@ -1925,28 +1876,6 @@ m_poppler_get_poppler(Page, Dict, getResourceDict); m_poppler_get_OBJECT(Page, getAnnots); -static int m_Page_getLinks(lua_State * L) -{ - Links *links; - udstruct *uin, *ucat, *uout; - uin = (udstruct *) luaL_checkudata(L, 1, M_Page); - ucat = (udstruct *) luaL_checkudata(L, 2, M_Catalog); - if (uin->pd != NULL && ucat->pd != NULL && uin->pd != ucat->pd) - pdfdoc_differs_error(L); - if ((uin->pd != NULL && uin->pd->pc != uin->pc) - || (ucat->pd != NULL && ucat->pd->pc != ucat->pd->pc)) - pdfdoc_changed_error(L); - links = ((Page *) uin->d)->getLinks(); - if (links != NULL) { - uout = new_Links_userdata(L); - uout->d = links; - uout->pc = uin->pc; - uout->pd = uin->pd; - } else - lua_pushnil(L); - return 1; -} - m_poppler_get_OBJECT(Page, getContents); m_poppler__tostring(Page); @@ -1973,7 +1902,6 @@ {"getSeparationInfo", m_Page_getSeparationInfo}, {"getResourceDict", m_Page_getResourceDict}, {"getAnnots", m_Page_getAnnots}, - {"getLinks", m_Page_getLinks}, {"getContents", m_Page_getContents}, {"__tostring", m_Page__tostring}, {NULL, NULL} // sentinel @@ -2158,19 +2086,23 @@ static int m_PDFDoc_getLinks(lua_State * L) { - int i; + int i, pages; Links *links; udstruct *uin, *uout; uin = (udstruct *) luaL_checkudata(L, 1, M_PDFDoc); if (uin->pd != NULL && uin->pd->pc != uin->pc) pdfdoc_changed_error(L); i = luaL_checkint(L, 2); - links = ((PdfDocument *) uin->d)->doc->getLinks(i); - if (links != NULL) { - uout = new_Links_userdata(L); - uout->d = links; - uout->pc = uin->pc; - uout->pd = uin->pd; + pages = ((PdfDocument *) uin->d)->doc->getNumPages(); + if (i > 0 && i <= pages) { + links = ((PdfDocument *) uin->d)->doc->getLinks(i); + if (links != NULL) { + uout = new_Links_userdata(L); + uout->d = links; + uout->pc = uin->pc; + uout->pd = uin->pd; + } else + lua_pushnil(L); } else lua_pushnil(L); return 1; @@ -2249,6 +2181,8 @@ m_PDFDoc_INT(getPDFMajorVersion); m_PDFDoc_INT(getPDFMinorVersion); +m_poppler__tostring(PDFDoc); + static int m_PDFDoc__gc(lua_State * L) { udstruct *uin; @@ -2292,6 +2226,7 @@ {"getDocInfoNF", m_PDFDoc_getDocInfoNF}, {"getPDFMajorVersion", m_PDFDoc_getPDFMajorVersion}, {"getPDFMinorVersion", m_PDFDoc_getPDFMinorVersion}, + {"__tostring", m_PDFDoc__tostring}, {"__gc", m_PDFDoc__gc}, // finalizer {NULL, NULL} // sentinel }; @@ -2437,11 +2372,6 @@ "Flate", "JBIG2", "JPX", "Weird", NULL }; -#if 0 -static const char *StreamColorSpaceModeNames[] = - { "CSNone", "CSDeviceGray", "CSDeviceRGB", "CSDeviceCMYK", NULL }; -#endif - m_poppler_get_INT(Stream, getKind); static int m_Stream_getKindName(lua_State * L) @@ -2527,11 +2457,26 @@ m_poppler_get_OBJECT(XRef, getDocInfo); m_poppler_get_OBJECT(XRef, getDocInfoNF); m_poppler_get_INT(XRef, getNumObjects); -// getLastXRefPos m_poppler_get_INT(XRef, getRootNum); m_poppler_get_INT(XRef, getRootGen); // getStreamEnd -// getEntry + +static int m_XRef_getNumEntry(lua_State * L) +{ + int i, offset; + udstruct *uin; + uin = (udstruct *) luaL_checkudata(L, 1, M_XRef); + if (uin->pd != NULL && uin->pd->pc != uin->pc) + pdfdoc_changed_error(L); + offset = luaL_checkint(L, 2); + i = ((XRef *) uin->d)->getNumEntry(offset); + if (i >= 0) + lua_pushinteger(L, i); + else + lua_pushnil(L); + return 1; +} + m_poppler_get_poppler(XRef, Object, getTrailerDict); m_poppler__tostring(XRef); @@ -2553,10 +2498,10 @@ {"getDocInfo", m_XRef_getDocInfo}, {"getDocInfoNF", m_XRef_getDocInfoNF}, {"getNumObjects", m_XRef_getNumObjects}, - // {"getRootNum", m_XRef_getRootNum}, {"getRootGen", m_XRef_getRootGen}, - // + // {"getStreamEnd", m_XRef_getStreamEnd}, + {"getNumEntry", m_XRef_getNumEntry}, {"getTrailerDict", m_XRef_getTrailerDict}, {"__tostring", m_XRef__tostring}, {NULL, NULL} // sentinel @@ -2565,7 +2510,10 @@ //********************************************************************** // XRefEntry +m_poppler__tostring(XRefEntry); + static const struct luaL_Reg XRefEntry_m[] = { + {"__tostring", m_XRefEntry__tostring}, {NULL, NULL} // sentinel }; @@ -2582,7 +2530,6 @@ int luaopen_epdf(lua_State * L) { register_meta(Annot); - // TODO register_meta(AnnotBorder); register_meta(Annots); register_meta(Array); register_meta(Catalog);