diff options
Diffstat (limited to 'Build/source/texk/web2c/luatexdir/lua/lepdflib.cc')
-rw-r--r-- | Build/source/texk/web2c/luatexdir/lua/lepdflib.cc | 3624 |
1 files changed, 0 insertions, 3624 deletions
diff --git a/Build/source/texk/web2c/luatexdir/lua/lepdflib.cc b/Build/source/texk/web2c/luatexdir/lua/lepdflib.cc index 32bcdab0177..ea8ed96b051 100644 --- a/Build/source/texk/web2c/luatexdir/lua/lepdflib.cc +++ b/Build/source/texk/web2c/luatexdir/lua/lepdflib.cc @@ -17,3627 +17,3 @@ You should have received a copy of the GNU General Public License along with LuaTeX; if not, see <http://www.gnu.org/licenses/>. */ - - -#include "image/epdf.h" - -// Patches for the new poppler 0.59 from -// https://www.mail-archive.com/arch-commits@archlinux.org/msg357548.html -// with some modifications to comply the poppler API. - -// define DEBUG - -//********************************************************************** -// TODO: add more poppler functions (many are still missing) - -//********************************************************************** -// objects allocated by poppler may not be deleted in the lepdflib - -typedef enum { ALLOC_POPPLER, ALLOC_LEPDF } alloctype; - -typedef struct { - void *d; - alloctype atype; // was it allocated by poppler or the lepdflib.cc? - PdfDocument *pd; // reference to PdfDocument, or NULL - unsigned long pc; // counter to detect PDFDoc change -} udstruct; - -static const char *ErrorCodeNames[] = { "None", "OpenFile", "BadCatalog", - "Damaged", "Encrypted", "HighlightFile", "BadPrinter", "Printing", - "Permission", "BadPageNum", "FileIO", NULL -}; - -//********************************************************************** - -#define M_Annot "epdf.Annot" /* ls-hh: epdf.* gives better protection in registry */ -#define M_Annots "epdf.Annots" -#define M_Array "epdf.Array" -#define M_Catalog "epdf.Catalog" -#define M_Dict "epdf.Dict" -#define M_EmbFile "epdf.EmbFile" -#define M_FileSpec "epdf.FileSpec" -#define M_GooString "epdf.GooString" -#define M_LinkDest "epdf.LinkDest" -#define M_Link "epdf.Link" -#define M_Links "epdf.Links" -#define M_Object "epdf.Object" -#define M_Page "epdf.Page" -#define M_PDFDoc "epdf.PDFDoc" -#define M_PDFRectangle "epdf.PDFRectangle" -#define M_Ref "epdf.Ref" -#define M_Stream "epdf.Stream" -#define M_StructElement "epdf.StructElement" -#define M_Attribute "epdf.Attribute" -#define M_TextSpan "epdf.TextSpan" -#define M_StructTreeRoot "epdf.StructTreeRoot" -#define M_XRefEntry "epdf.XRefEntry" -#define M_XRef "epdf.XRef" - -//********************************************************************** - -#define new_poppler_userdata(type) \ -static udstruct *new_##type##_userdata(lua_State * L) \ -{ \ - udstruct *a; \ - a = (udstruct *) lua_newuserdata(L, sizeof(udstruct)); /* udstruct ... */ \ - a->atype = ALLOC_POPPLER; \ - luaL_getmetatable(L, M_##type); /* m udstruct ... */ \ - lua_setmetatable(L, -2); /* udstruct ... */ \ - return a; \ -} - -new_poppler_userdata(PDFDoc); - -new_poppler_userdata(Annot); -new_poppler_userdata(Array); -new_poppler_userdata(Catalog); -new_poppler_userdata(Dict); -new_poppler_userdata(EmbFile); -new_poppler_userdata(FileSpec); -new_poppler_userdata(LinkDest); -new_poppler_userdata(Links); -new_poppler_userdata(Object); -new_poppler_userdata(Page); -new_poppler_userdata(PDFRectangle); -new_poppler_userdata(Ref); -new_poppler_userdata(Stream); -new_poppler_userdata(StructElement); -new_poppler_userdata(Attribute); -new_poppler_userdata(TextSpan); -new_poppler_userdata(StructTreeRoot); -new_poppler_userdata(XRef); - -//********************************************************************** - -static void pdfdoc_changed_error(lua_State * L) -{ - luaL_error(L, "PDFDoc changed or gone"); -} - -static void pdfdoc_differs_error(lua_State * L) -{ - luaL_error(L, "PDFDoc differs between arguments"); -} - -//********************************************************************** - -static int l_open_PDFDoc(lua_State * L) -{ - const char *file_path; - udstruct *uout; - PdfDocument *d; - file_path = luaL_checkstring(L, 1); // path - d = refPdfDocument(file_path, FE_RETURN_NULL); - if (d == NULL) - lua_pushnil(L); - else { - if (!(globalParams)) // globalParams could be already created - globalParams = new GlobalParams(); - uout = new_PDFDoc_userdata(L); - uout->d = d; - uout->atype = ALLOC_LEPDF; - uout->pc = d->pc; - uout->pd = d; - } - return 1; // doc path -} - -static int l_open_MemStreamPDFDoc(lua_State * L) -{ - const char *docstream = NULL; - char *docstream_usr = NULL ; - const char *file_id; - unsigned long long stream_size; - udstruct *uout; - PdfDocument *d; - switch (lua_type(L, 1)) { - case LUA_TSTRING: - docstream = luaL_checkstring(L, 1); // stream as Lua string - break; - case LUA_TLIGHTUSERDATA: - docstream = (const char *) lua_touserdata(L, 1); // stream as sequence of bytes - break; - default: - luaL_error(L, "bad argument: string or lightuserdata expected"); - } - if (docstream==NULL) - luaL_error(L, "bad document"); - stream_size = (unsigned long long) luaL_checkint(L, 2);// size of the stream - file_id = luaL_checkstring(L, 3); // a symbolic name for this stream, mandatory - if (file_id == NULL) - luaL_error(L, "PDFDoc has an invalid id"); - if (strlen(file_id) >STREAM_FILE_ID_LEN ) // a limit to the length of the string - luaL_error(L, "PDFDoc has a too long id"); - docstream_usr = (char *)gmalloc((unsigned) (stream_size + 1)); - if (!docstream_usr) - luaL_error(L, "no room for PDFDoc"); - memcpy(docstream_usr, docstream, (stream_size + 1)); - docstream_usr[stream_size]='\0'; - d = refMemStreamPdfDocument(docstream_usr, stream_size, file_id); - if (d == NULL) { - lua_pushnil(L); - lua_pushnil(L); - lua_pushnil(L); - } - else if (d->file_path == NULL ) { - lua_pushnil(L); - lua_pushnil(L); - lua_pushnil(L); - } - else { - if (!(globalParams)) // globalParams could be already created - globalParams = new GlobalParams(); - uout = new_PDFDoc_userdata(L); - uout->d = d; - uout->atype = ALLOC_LEPDF; - uout->pc = d->pc; - uout->pd = d; - lua_pushstring(L,d->file_path); - lua_pushstring(L,STREAM_URI); - } - return 3; // stream, stream_id, stream_uri -} - - - - -static int l_new_Array(lua_State * L) -{ - udstruct *uxref, *uout; - uxref = (udstruct *) luaL_checkudata(L, 1, M_XRef); - if (uxref->pd != NULL && uxref->pd->pc != uxref->pc) - pdfdoc_changed_error(L); - uout = new_Array_userdata(L); - uout->d = new Array((XRef *) uxref->d); // automatic init to length 0 - uout->atype = ALLOC_LEPDF; - uout->pc = uxref->pc; - uout->pd = uxref->pd; - return 1; -} - -static int l_new_Attribute(lua_State * L) -{ - Attribute::Type t; - const char *n; - int nlen; - udstruct *uobj, *uout; - - if (lua_type(L,1)==LUA_TNUMBER) { - uobj = (udstruct *) luaL_checkudata(L, 2, M_Object); - if (uobj->pd != NULL && uobj->pd->pc != uobj->pc) - pdfdoc_changed_error(L); - t = (Attribute::Type) luaL_checkint(L, 1); - uout = new_Attribute_userdata(L); - uout->d = new Attribute(t, (Object *)uobj->d); - uout->atype = ALLOC_LEPDF; - uout->pc = uobj->pc; - uout->pd = uobj->pd; - - } else if (lua_type(L,1)==LUA_TSTRING) { - n = luaL_checkstring(L,1); - nlen = luaL_checkint(L,2); - uobj = (udstruct *) luaL_checkudata(L, 3, M_Object); - if (uobj->pd != NULL && uobj->pd->pc != uobj->pc) - pdfdoc_changed_error(L); - uout = new_Attribute_userdata(L); - uout->d = new Attribute(n, nlen, (Object *)uobj->d); - uout->atype = ALLOC_LEPDF; - uout->pc = uobj->pc; - uout->pd = uobj->pd; - } else - lua_pushnil(L); - return 1; -} - -#define ATTRIBUTE_TYPE_ENTRY(name) \ - lua_pushstring(L, #name); \ - lua_pushinteger(L, Attribute::name); \ - lua_settable(L,-3) - - -#define OBJECT_TYPE(name) \ - lua_pushstring(L, #name); \ - lua_pushinteger(L, (int)name); \ - lua_settable(L,-3) - - -#define STRUCTELEMENT_TYPE_ENTRY(name) \ - lua_pushstring(L, #name); \ - lua_pushinteger(L, StructElement::name); \ - lua_settable(L,-3) - - -static int l_Attribute_Type(lua_State * L) { - lua_createtable (L, 0, 42); - ATTRIBUTE_TYPE_ENTRY(BBox); - ATTRIBUTE_TYPE_ENTRY(BackgroundColor); - ATTRIBUTE_TYPE_ENTRY(BorderColor); - ATTRIBUTE_TYPE_ENTRY(BorderThickness); - ATTRIBUTE_TYPE_ENTRY(Color); - ATTRIBUTE_TYPE_ENTRY(ColumnGap); - ATTRIBUTE_TYPE_ENTRY(ColumnWidths); - ATTRIBUTE_TYPE_ENTRY(Desc); - ATTRIBUTE_TYPE_ENTRY(Role); - ATTRIBUTE_TYPE_ENTRY(TextDecorationColor); - ATTRIBUTE_TYPE_ENTRY(TextDecorationThickness); - ATTRIBUTE_TYPE_ENTRY(BaselineShift); - ATTRIBUTE_TYPE_ENTRY(BlockAlign); - ATTRIBUTE_TYPE_ENTRY(BorderStyle); - ATTRIBUTE_TYPE_ENTRY(ColSpan); - ATTRIBUTE_TYPE_ENTRY(ColumnCount); - ATTRIBUTE_TYPE_ENTRY(EndIndent); - ATTRIBUTE_TYPE_ENTRY(GlyphOrientationVertical); - ATTRIBUTE_TYPE_ENTRY(Headers); - ATTRIBUTE_TYPE_ENTRY(Height); - ATTRIBUTE_TYPE_ENTRY(InlineAlign); - ATTRIBUTE_TYPE_ENTRY(LineHeight); - ATTRIBUTE_TYPE_ENTRY(ListNumbering); - ATTRIBUTE_TYPE_ENTRY(Padding); - ATTRIBUTE_TYPE_ENTRY(Placement); - ATTRIBUTE_TYPE_ENTRY(RowSpan); - ATTRIBUTE_TYPE_ENTRY(RubyAlign); - ATTRIBUTE_TYPE_ENTRY(RubyPosition); - ATTRIBUTE_TYPE_ENTRY(Scope); - ATTRIBUTE_TYPE_ENTRY(SpaceAfter); - ATTRIBUTE_TYPE_ENTRY(SpaceBefore); - ATTRIBUTE_TYPE_ENTRY(StartIndent); - ATTRIBUTE_TYPE_ENTRY(Summary); - ATTRIBUTE_TYPE_ENTRY(TBorderStyle); - ATTRIBUTE_TYPE_ENTRY(TPadding); - ATTRIBUTE_TYPE_ENTRY(TextAlign); - ATTRIBUTE_TYPE_ENTRY(TextDecorationType); - ATTRIBUTE_TYPE_ENTRY(TextIndent); - ATTRIBUTE_TYPE_ENTRY(Width); - ATTRIBUTE_TYPE_ENTRY(WritingMode); - ATTRIBUTE_TYPE_ENTRY(Unknown); - ATTRIBUTE_TYPE_ENTRY(checked); - return 1; -} - -static int l_Object_Type(lua_State * L) { - lua_createtable(L,0,16);/*nr of ObjType values*/ ; - OBJECT_TYPE(objBool); - OBJECT_TYPE(objInt); - OBJECT_TYPE(objReal); - OBJECT_TYPE(objString); - OBJECT_TYPE(objName); - OBJECT_TYPE(objNull); - OBJECT_TYPE(objArray); - OBJECT_TYPE(objDict); - OBJECT_TYPE(objStream); - OBJECT_TYPE(objRef); - OBJECT_TYPE(objCmd); - OBJECT_TYPE(objError); - OBJECT_TYPE(objEOF); - OBJECT_TYPE(objNone); - OBJECT_TYPE(objInt64); - OBJECT_TYPE(objDead); - return 1; -} - - -static int l_StructElement_Type(lua_State * L) { - lua_createtable (L, 0, 50); - STRUCTELEMENT_TYPE_ENTRY(Document); - STRUCTELEMENT_TYPE_ENTRY(Part); - STRUCTELEMENT_TYPE_ENTRY(Art); - STRUCTELEMENT_TYPE_ENTRY(Sect); - STRUCTELEMENT_TYPE_ENTRY(Div); - STRUCTELEMENT_TYPE_ENTRY(BlockQuote); - STRUCTELEMENT_TYPE_ENTRY(Caption); - STRUCTELEMENT_TYPE_ENTRY(NonStruct); - STRUCTELEMENT_TYPE_ENTRY(Index); - STRUCTELEMENT_TYPE_ENTRY(Private); - STRUCTELEMENT_TYPE_ENTRY(Span); - STRUCTELEMENT_TYPE_ENTRY(Quote); - STRUCTELEMENT_TYPE_ENTRY(Note); - STRUCTELEMENT_TYPE_ENTRY(Reference); - STRUCTELEMENT_TYPE_ENTRY(BibEntry); - STRUCTELEMENT_TYPE_ENTRY(Code); - STRUCTELEMENT_TYPE_ENTRY(Link); - STRUCTELEMENT_TYPE_ENTRY(Annot); - STRUCTELEMENT_TYPE_ENTRY(Ruby); - STRUCTELEMENT_TYPE_ENTRY(RB); - STRUCTELEMENT_TYPE_ENTRY(RT); - STRUCTELEMENT_TYPE_ENTRY(RP); - STRUCTELEMENT_TYPE_ENTRY(Warichu); - STRUCTELEMENT_TYPE_ENTRY(WT); - STRUCTELEMENT_TYPE_ENTRY(WP); - STRUCTELEMENT_TYPE_ENTRY(P); - STRUCTELEMENT_TYPE_ENTRY(H); - STRUCTELEMENT_TYPE_ENTRY(H1); - STRUCTELEMENT_TYPE_ENTRY(H2); - STRUCTELEMENT_TYPE_ENTRY(H3); - STRUCTELEMENT_TYPE_ENTRY(H4); - STRUCTELEMENT_TYPE_ENTRY(H5); - STRUCTELEMENT_TYPE_ENTRY(H6); - STRUCTELEMENT_TYPE_ENTRY(L); - STRUCTELEMENT_TYPE_ENTRY(LI); - STRUCTELEMENT_TYPE_ENTRY(Lbl); - STRUCTELEMENT_TYPE_ENTRY(LBody); - STRUCTELEMENT_TYPE_ENTRY(Table); - STRUCTELEMENT_TYPE_ENTRY(TR); - STRUCTELEMENT_TYPE_ENTRY(TH); - STRUCTELEMENT_TYPE_ENTRY(TD); - STRUCTELEMENT_TYPE_ENTRY(THead); - STRUCTELEMENT_TYPE_ENTRY(TFoot); - STRUCTELEMENT_TYPE_ENTRY(TBody); - STRUCTELEMENT_TYPE_ENTRY(Figure); - STRUCTELEMENT_TYPE_ENTRY(Formula); - STRUCTELEMENT_TYPE_ENTRY(Form); - STRUCTELEMENT_TYPE_ENTRY(TOC); - STRUCTELEMENT_TYPE_ENTRY(TOCI); - lua_pushstring(L, "Unknown"); - lua_pushinteger(L, 0); - lua_settable(L,-3); - return 1; -} - -static int l_AttributeOwner_Type(lua_State * L) { - lua_createtable (L, 0, 12); - lua_pushstring(L, "XML-1.00"); lua_pushinteger(L, Attribute::XML_1_00); lua_settable(L,-3); - lua_pushstring(L, "HTML-3.20"); lua_pushinteger(L, Attribute::HTML_3_20); lua_settable(L,-3); - lua_pushstring(L, "HTML-4.01"); lua_pushinteger(L, Attribute::HTML_4_01); lua_settable(L,-3); - lua_pushstring(L, "OEB-1.00"); lua_pushinteger(L, Attribute::OEB_1_00); lua_settable(L,-3); - lua_pushstring(L, "RTF-1.05"); lua_pushinteger(L, Attribute::RTF_1_05); lua_settable(L,-3); - lua_pushstring(L, "CSS-1.00"); lua_pushinteger(L, Attribute::CSS_1_00); lua_settable(L,-3); - lua_pushstring(L, "CSS-2.00"); lua_pushinteger(L, Attribute::CSS_2_00); lua_settable(L,-3); - lua_pushstring(L, "Layout"); lua_pushinteger(L, Attribute::Layout); lua_settable(L,-3); - lua_pushstring(L, "PrintField"); lua_pushinteger(L, Attribute::PrintField); lua_settable(L,-3); - lua_pushstring(L, "Table"); lua_pushinteger(L, Attribute::Table); lua_settable(L,-3); - lua_pushstring(L, "List"); lua_pushinteger(L, Attribute::List); lua_settable(L,-3); - lua_pushstring(L, "UserProperties"); lua_pushinteger(L, Attribute::UserProperties);lua_settable(L,-3); - return 1; -} - - -static int l_new_Dict(lua_State * L) -{ - udstruct *uxref, *uout; - uxref = (udstruct *) luaL_checkudata(L, 1, M_XRef); - if (uxref->pd != NULL && uxref->pd->pc != uxref->pc) - pdfdoc_changed_error(L); - uout = new_Dict_userdata(L); - uout->d = new Dict((XRef *) uxref->d); // automatic init to length 0 - uout->atype = ALLOC_LEPDF; - uout->pc = uxref->pc; - uout->pd = uxref->pd; - return 1; -} - -static int l_new_Object(lua_State * L) -{ - udstruct *uout; - int n = lua_gettop(L); // number of arguments - uout = new_Object_userdata(L); - switch(n) { - case 0: - uout->d = new Object(); // automatic init to type "none" - uout->atype = ALLOC_LEPDF; - uout->pc = 0; - uout->pd = NULL; // not connected to any PDFDoc - break; - case 1: - if (lua_isboolean (L,1)) { - uout->d = new Object(lua_toboolean(L, 1)? gTrue : gFalse); - uout->atype = ALLOC_LEPDF; - uout->pc = 0; - uout->pd = NULL; - } else if (lua_isnumber (L,1)) { - double d = lua_tonumber(L,1); - // Missed :Object(long long int64gA) - if (d==((int)d)) { - uout->d = new Object((int)d); - } else { - uout->d = new Object(d); - } - uout->atype = ALLOC_LEPDF; - uout->pc = 0; - uout->pd = NULL; - } else if (lua_isstring (L,1)){ - GooString *gs; - const char *s; - size_t len; - s = luaL_checklstring(L, 2, &len); - gs = new GooString(s, len); - uout->d = new Object(gs); - uout->atype = ALLOC_LEPDF; - uout->pc = 0; - uout->pd = NULL; - } else if (luaL_testudata(L,1,M_Array)){ - udstruct *u; - Array *a; - u = (udstruct *) luaL_checkudata(L, 1, M_Array); - a = (Array *)u->d; - uout->d = new Object(a); - uout->atype = ALLOC_LEPDF; - uout->pc = 0; - uout->pd = NULL; - } else if (luaL_testudata(L,1,M_Dict)){ - udstruct *u; - Dict *d; - u = (udstruct *) luaL_checkudata(L, 1, M_Dict); - d = (Dict *)u->d; - uout->d = new Object(d); - uout->atype = ALLOC_LEPDF; - uout->pc = 0; - uout->pd = NULL; - } else if (luaL_testudata(L,1,M_Stream)){ - udstruct *u; - Stream *s; - u = (udstruct *) luaL_checkudata(L, 1, M_Stream); - s = (Stream *)u->d; - *((Object *) uout->d) = Object(s); - } else - luaL_error(L, "Invalid/unsupported value for Object constructor"); - break; - case 2: - if (lua_isnumber (L,1) && lua_isnumber (L,2)) { - double numA = lua_tonumber(L,1); - double genA = lua_tonumber(L,2); - if ( ((numA)==(int)(numA)) && ((genA)==(int)(genA)) ){ - uout->d = new Object((int)(numA), (int)(genA)); - uout->atype = ALLOC_LEPDF; - uout->pc = 0; - uout->pd = NULL; - } - } else if (lua_isnumber (L,1) && (lua_isstring(L,2)|| lua_isnoneornil(L,2))) { - double d_typeA = lua_tonumber(L,1); - int typeA = (int)(d_typeA); - if (d_typeA==typeA){ - switch((int)(typeA)) { - case objBool: - case objInt: - case objReal: - case objString: - case objName: - case objNull: - case objArray: - case objDict: - case objStream: - case objRef: - case objCmd: - case objError: - case objEOF: - case objNone: - case objInt64: - case objDead: - if (lua_isstring(L,2)) - uout->d = new Object((ObjType)(typeA), luaL_checkstring(L, 2)); - else - uout->d = new Object((ObjType)(typeA)); - uout->atype = ALLOC_LEPDF; - uout->pc = 0; - uout->pd = NULL; - - break; - default: - luaL_error(L, "Invalid values for Object constructor"); - break; - }//switch((int)(d)) - } else // (d_typeA)!=(typeA) - luaL_error(L, "Invalid/unsupported values for Object constructor"); - } // if (lua_isnumber (L,1) && (lua_isstring(L,2)|| lua_isnoneornil(L,2))) - break; - default: - luaL_error(L, "Invalid specification for Object constructor"); - } - lua_settop(L,1); - return 1; -} - -// static int l_new_Object(lua_State * L) -// { -// udstruct *uout; -// uout = new_Object_userdata(L); -// uout->d = new Object(); // automatic init to type "none" -// uout->atype = ALLOC_LEPDF; -// uout->pc = 0; -// uout->pd = NULL; // not connected to any PDFDoc -// return 1; -// } - - -// PDFRectangle see Page.h - -static int l_new_PDFRectangle(lua_State * L) -{ - udstruct *uout; - uout = new_PDFRectangle_userdata(L); - uout->d = new PDFRectangle(); // automatic init to [0, 0, 0, 0] - uout->atype = ALLOC_LEPDF; - uout->pc = 0; - uout->pd = NULL; - return 1; -} - -static const struct luaL_Reg epdflib_f[] = { - {"open", l_open_PDFDoc}, - {"openMemStream", l_open_MemStreamPDFDoc}, - {"Array", l_new_Array}, - {"Attribute", l_new_Attribute}, - {"StructElement_Type", l_StructElement_Type}, - {"Attribute_Type", l_Attribute_Type}, - {"AttributeOwner_Type",l_AttributeOwner_Type}, - {"Dict", l_new_Dict}, - {"Object", l_new_Object}, - {"Object_Type", l_Object_Type}, - {"PDFRectangle", l_new_PDFRectangle}, - {NULL, NULL} // sentinel -}; - -//********************************************************************** - -#define m_poppler_get_poppler(in, out, function) \ -static int m_##in##_##function(lua_State * L) \ -{ \ - out *o; \ - udstruct *uin, *uout; \ - uin = (udstruct *) luaL_checkudata(L, 1, M_##in); \ - if (uin->pd != NULL && uin->pd->pc != uin->pc) \ - pdfdoc_changed_error(L); \ - o = ((in *) uin->d)->function(); \ - if (o != NULL) { \ - uout = new_##out##_userdata(L); \ - uout->d = o; \ - uout->pc = uin->pc; \ - uout->pd = uin->pd; \ - } else \ - lua_pushnil(L); \ - return 1; \ -} - -#define m_poppler_get_BOOL(in, function) \ -static int m_##in##_##function(lua_State * L) \ -{ \ - udstruct *uin; \ - uin = (udstruct *) luaL_checkudata(L, 1, M_##in); \ - if (uin->pd != NULL && uin->pd->pc != uin->pc) \ - pdfdoc_changed_error(L); \ - if (((in *) uin->d)->function()) \ - lua_pushboolean(L, 1); \ - else \ - lua_pushboolean(L, 0); \ - return 1; \ -} - -#define m_poppler_get_INT(in, function) \ -static int m_##in##_##function(lua_State * L) \ -{ \ - int i; \ - udstruct *uin; \ - uin = (udstruct *) luaL_checkudata(L, 1, M_##in); \ - if (uin->pd != NULL && uin->pd->pc != uin->pc) \ - pdfdoc_changed_error(L); \ - i = (int) ((in *) uin->d)->function(); \ - lua_pushinteger(L, i); \ - return 1; \ -} - - -#define m_poppler_get_GUINT(in, function) \ -static int m_##in##_##function(lua_State * L) \ -{ \ - unsigned int i; \ - udstruct *uin; \ - uin = (udstruct *) luaL_checkudata(L, 1, M_##in); \ - if (uin->pd != NULL && uin->pd->pc != uin->pc) \ - pdfdoc_changed_error(L); \ - i = (unsigned int) ((in *) uin->d)->function(); \ - lua_pushinteger(L, i); \ - return 1; \ -} - -#define m_poppler_get_UINT(in, function) \ -m_poppler_get_GUINT(in, function) - - - -#define m_poppler_get_DOUBLE(in, function) \ -static int m_##in##_##function(lua_State * L) \ -{ \ - double d; \ - udstruct *uin; \ - uin = (udstruct *) luaL_checkudata(L, 1, M_##in); \ - if (uin->pd != NULL && uin->pd->pc != uin->pc) \ - pdfdoc_changed_error(L); \ - d = (double) ((in *) uin->d)->function(); \ - lua_pushnumber(L, d); /* float */ \ - return 1; \ -} - -#define m_poppler_get_GOOSTRING(in, function) \ -static int m_##in##_##function(lua_State * L) \ -{ \ - GooString *gs; \ - udstruct *uin; \ - uin = (udstruct *) luaL_checkudata(L, 1, M_##in); \ - if (uin->pd != NULL && uin->pd->pc != uin->pc) \ - pdfdoc_changed_error(L); \ - gs = (GooString *)((in *) uin->d)->function(); \ - if (gs != NULL) \ - lua_pushlstring(L, gs->getCString(), gs->getLength()); \ - else \ - lua_pushnil(L); \ - return 1; \ -} - -#define m_poppler_get_OBJECT(in, function) \ -static int m_##in##_##function(lua_State * L) \ -{ \ - udstruct *uin, *uout; \ - uin = (udstruct *) luaL_checkudata(L, 1, M_##in); \ - if (uin->pd != NULL && uin->pd->pc != uin->pc) \ - pdfdoc_changed_error(L); \ - uout = new_Object_userdata(L); \ - uout->d = new Object(); \ - *((Object *)uout->d) = ((in *) uin->d)->function(); \ - uout->atype = ALLOC_LEPDF; \ - uout->pc = uin->pc; \ - uout->pd = uin->pd; \ - return 1; \ -} - -#define m_poppler_do(in, function) \ -static int m_##in##_##function(lua_State * L) \ -{ \ - udstruct *uin; \ - uin = (udstruct *) luaL_checkudata(L, 1, M_##in); \ - if (uin->pd != NULL && uin->pd->pc != uin->pc) \ - pdfdoc_changed_error(L); \ - ((in *) uin->d)->function(); \ - return 0; \ -} - -#define m_poppler__tostring(type) \ -static int m_##type##__tostring(lua_State * L) \ -{ \ - udstruct *uin; \ - uin = (udstruct *) luaL_checkudata(L, 1, M_##type); \ - if (uin->pd != NULL && uin->pd->pc != uin->pc) \ - pdfdoc_changed_error(L); \ - lua_pushfstring(L, "%s: %p", #type, (type *) uin->d); \ - 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(s)) \ - lua_pushboolean(L, 1); \ - else \ - lua_pushboolean(L, 0); \ - return 1; \ -} - -//********************************************************************** -// Annot - -m_poppler_get_BOOL(Annot, isOk); - -static int m_Annot_match(lua_State * L) -{ - udstruct *uin, *uref; - uin = (udstruct *) luaL_checkudata(L, 1, M_Annot); - uref = (udstruct *) luaL_checkudata(L, 2, M_Ref); - if (uin->pd != NULL && uref->pd != NULL && uin->pd != uref->pd) - pdfdoc_differs_error(L); - if ((uin->pd != NULL && uin->pd->pc != uin->pc) - || (uref->pd != NULL && uref->pd->pc != uref->pc)) - pdfdoc_changed_error(L); - lua_pushboolean(L, ((Annot *) uin->d)->match((Ref *) uref->d)); - return 1; -} - -m_poppler__tostring(Annot); - -static int m_Annot__gc(lua_State * L) -{ - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_Annot); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); -#ifdef DEBUG - printf("\n===== Annot GC ===== uin=<%p>\n", uin); -#endif - if (uin->atype == ALLOC_LEPDF) -#if 1 /* def HAVE_ANNOTDECREFCNT */ - ((Annot *) uin->d)->decRefCnt(); -#else - delete(Annot *) uin->d; -#endif - return 0; -} - -static const struct luaL_Reg Annot_m[] = { - {"isOk", m_Annot_isOk}, - {"match", m_Annot_match}, - {"__tostring", m_Annot__tostring}, - {"__gc", m_Annot__gc}, - {NULL, NULL} // sentinel -}; - -//********************************************************************** -// Annots - -m_poppler_get_INT(Annots, getNumAnnots); - -static int m_Annots_getAnnot(lua_State * L) -{ - int i, annots; - udstruct *uin, *uout; - uin = (udstruct *) luaL_checkudata(L, 1, M_Annots); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - i = luaL_checkint(L, 2); - annots = ((Annots *) uin->d)->getNumAnnots(); - if (i > 0 && i <= annots) { - uout = new_Annot_userdata(L); - uout->d = ((Annots *) uin->d)->getAnnot(i); - uout->pc = uin->pc; - uout->pd = uin->pd; - } else - lua_pushnil(L); - return 1; -} - -m_poppler__tostring(Annots); - -static const struct luaL_Reg Annots_m[] = { - {"getNumAnnots", m_Annots_getNumAnnots}, - {"getAnnot", m_Annots_getAnnot}, - {"__tostring", m_Annots__tostring}, - {NULL, NULL} // sentinel -}; - -//********************************************************************** -// Array -// Now private -// static int m_Array_incRef(lua_State * L) -// { -// udstruct *uin; -// uin = (udstruct *) luaL_checkudata(L, 1, M_Array); -// if (uin->pd != NULL && uin->pd->pc != uin->pc) -// pdfdoc_changed_error(L); -// lua_pushinteger(L, 1); -// return 1; -// } -// Now private -// static int m_Array_decRef(lua_State * L) -// { -// int i; -// udstruct *uin; -// uin = (udstruct *) luaL_checkudata(L, 1, M_Array); -// if (uin->pd != NULL && uin->pd->pc != uin->pc) -// pdfdoc_changed_error(L); -// lua_pushinteger(L, 1); -// return 1; -// } - -m_poppler_get_INT(Array, getLength); - -static int m_Array_add(lua_State * L) -{ - udstruct *uin, *uobj; - uin = (udstruct *) luaL_checkudata(L, 1, M_Array); - uobj = (udstruct *) luaL_checkudata(L, 2, M_Object); - if (uin->pd != NULL && uobj->pd != NULL && uin->pd != uobj->pd) - pdfdoc_differs_error(L); - if ((uin->pd != NULL && uin->pd->pc != uin->pc) - || (uobj->pd != NULL && uobj->pd->pc != uobj->pc)) - pdfdoc_changed_error(L); - ((Array *) uin->d)->add(std::move(*((Object *) uobj->d))); - return 0; -} - -static int m_Array_get(lua_State * L) -{ - int i, len; - udstruct *uin, *uout; - uin = (udstruct *) luaL_checkudata(L, 1, M_Array); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - i = luaL_checkint(L, 2); - len = ((Array *) uin->d)->getLength(); - if (i > 0 && i <= len) { - uout = new_Object_userdata(L); - uout->d = new Object(); - *((Object *) uout->d) = ((Array *) uin->d)->get(i - 1); - uout->atype = ALLOC_LEPDF; - uout->pc = uin->pc; - uout->pd = uin->pd; - } else - lua_pushnil(L); - return 1; -} - -static int m_Array_getNF(lua_State * L) -{ - int i, len; - udstruct *uin, *uout; - uin = (udstruct *) luaL_checkudata(L, 1, M_Array); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - i = luaL_checkint(L, 2); - len = ((Array *) uin->d)->getLength(); - if (i > 0 && i <= len) { - uout = new_Object_userdata(L); - uout->d = new Object(); - *((Object *) uout->d) = ((Array *) uin->d)->getNF(i - 1); - uout->atype = ALLOC_LEPDF; - uout->pc = uin->pc; - uout->pd = uin->pd; - } else - lua_pushnil(L); - return 1; -} - -static int m_Array_getString(lua_State * L) -{ - GooString *gs; - int i, len; - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_Array); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - i = luaL_checkint(L, 2); - len = ((Array *) uin->d)->getLength(); - if (i > 0 && i <= len) { - gs = new GooString(); - if (((Array *) uin->d)->getString(i - 1, gs)) - lua_pushlstring(L, gs->getCString(), gs->getLength()); - else - lua_pushnil(L); - delete gs; - } else - lua_pushnil(L); - return 1; -} - -m_poppler__tostring(Array); - -static const struct luaL_Reg Array_m[] = { - // {"incRef", m_Array_incRef},// Now private - // {"decRef", m_Array_decRef},// Now private - {"getLength", m_Array_getLength}, - {"add", m_Array_add}, - {"get", m_Array_get}, - {"getNF", m_Array_getNF}, - {"getString", m_Array_getString}, - {"__tostring", m_Array__tostring}, - {NULL, NULL} // sentinel -}; - -//********************************************************************** -// Catalog - -m_poppler_get_BOOL(Catalog, isOk); -m_poppler_get_INT(Catalog, getNumPages); - -static int m_Catalog_getPage(lua_State * L) -{ - int i, pages; - udstruct *uin, *uout; - uin = (udstruct *) luaL_checkudata(L, 1, M_Catalog); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - i = luaL_checkint(L, 2); - pages = ((Catalog *) uin->d)->getNumPages(); - if (i > 0 && i <= pages) { - uout = new_Page_userdata(L); - uout->d = ((Catalog *) uin->d)->getPage(i); - uout->pc = uin->pc; - uout->pd = uin->pd; - } else - lua_pushnil(L); - return 1; -} - -static int m_Catalog_getPageRef(lua_State * L) -{ - int i, pages; - udstruct *uin, *uout; - uin = (udstruct *) luaL_checkudata(L, 1, M_Catalog); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - i = luaL_checkint(L, 2); - pages = ((Catalog *) uin->d)->getNumPages(); - if (i > 0 && i <= pages) { - uout = new_Ref_userdata(L); - uout->d = (Ref *) gmalloc(sizeof(Ref)); - ((Ref *) uout->d)->num = ((Catalog *) uin->d)->getPageRef(i)->num; - ((Ref *) uout->d)->gen = ((Catalog *) uin->d)->getPageRef(i)->gen; - uout->atype = ALLOC_LEPDF; - uout->pc = uin->pc; - uout->pd = uin->pd; - } else - lua_pushnil(L); - return 1; -} - -m_poppler_get_GOOSTRING(Catalog, getBaseURI); -m_poppler_get_GOOSTRING(Catalog, readMetadata); -m_poppler_get_poppler(Catalog, StructTreeRoot, getStructTreeRoot); - -static int m_Catalog_findPage(lua_State * L) -{ - int num, gen, i; - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_Catalog); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - num = luaL_checkint(L, 2); - gen = luaL_checkint(L, 3); - i = ((Catalog *) uin->d)->findPage(num, gen); - if (i > 0) - lua_pushinteger(L, i); - else - lua_pushnil(L); - return 1; -} - -static int m_Catalog_findDest(lua_State * L) -{ - GooString *name; - LinkDest *dest; - const char *s; - size_t len; - udstruct *uin, *uout; - uin = (udstruct *) luaL_checkudata(L, 1, M_Catalog); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - s = luaL_checklstring(L, 2, &len); - name = new GooString(s, len); - dest = ((Catalog *) uin->d)->findDest(name); - if (dest != NULL) { - uout = new_LinkDest_userdata(L); - uout->d = dest; - uout->pc = uin->pc; - uout->pd = uin->pd; - } else - lua_pushnil(L); - delete name; - return 1; -} - -m_poppler_get_poppler(Catalog, Object, getDests); -m_poppler_get_INT(Catalog, numEmbeddedFiles); - -static int m_Catalog_embeddedFile(lua_State * L) -{ - int i, len; - udstruct *uin, *uout; - uin = (udstruct *) luaL_checkudata(L, 1, M_Catalog); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - i = luaL_checkint(L, 2); - len = ((Catalog *) uin->d)->numEmbeddedFiles(); - if (i > 0 && i <= len) { - uout = new_FileSpec_userdata(L); - uout->d = ((Catalog *) uin->d)->embeddedFile(i - 1); - uout->pc = uin->pc; - uout->pd = uin->pd; - } else - lua_pushnil(L); - return 1; -} - -m_poppler_get_INT(Catalog, numJS); - -static int m_Catalog_getJS(lua_State * L) -{ - GooString *gs; - int i, len; - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_Catalog); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - i = luaL_checkint(L, 2); - len = ((Catalog *) uin->d)->numJS(); - if (i > 0 && i <= len) { - gs = ((Catalog *) uin->d)->getJS(i - 1); - if (gs != NULL) - lua_pushlstring(L, gs->getCString(), gs->getLength()); - else - lua_pushnil(L); - delete gs; - } else - lua_pushnil(L); - return 1; -} - -m_poppler_get_poppler(Catalog, Object, getOutline); -m_poppler_get_poppler(Catalog, Object, getAcroForm); - -m_poppler__tostring(Catalog); - -static const struct luaL_Reg Catalog_m[] = { - {"isOk", m_Catalog_isOk}, - {"getNumPages", m_Catalog_getNumPages}, - {"getPage", m_Catalog_getPage}, - {"getPageRef", m_Catalog_getPageRef}, - {"getBaseURI", m_Catalog_getBaseURI}, - {"readMetadata", m_Catalog_readMetadata}, - {"getStructTreeRoot", m_Catalog_getStructTreeRoot}, - {"findPage", m_Catalog_findPage}, - {"findDest", m_Catalog_findDest}, - {"getDests", m_Catalog_getDests}, - {"numEmbeddedFiles", m_Catalog_numEmbeddedFiles}, - {"embeddedFile", m_Catalog_embeddedFile}, - {"numJS", m_Catalog_numJS}, - {"getJS", m_Catalog_getJS}, - {"getOutline", m_Catalog_getOutline}, - {"getAcroForm", m_Catalog_getAcroForm}, - {"__tostring", m_Catalog__tostring}, - {NULL, NULL} // sentinel -}; - -//********************************************************************** -// Dict -// Now private -// static int m_Dict_incRef(lua_State * L) -// { -// udstruct *uin; -// uin = (udstruct *) luaL_checkudata(L, 1, M_Dict); -// if (uin->pd != NULL && uin->pd->pc != uin->pc) -// pdfdoc_changed_error(L); -// lua_pushinteger(L, 1); -// return 1; -// } -// Now private -// static int m_Dict_decRef(lua_State * L) -// { -// udstruct *uin; -// uin = (udstruct *) luaL_checkudata(L, 1, M_Dict); -// if (uin->pd != NULL && uin->pd->pc != uin->pc) -// pdfdoc_changed_error(L); -// lua_pushinteger(L, 1); -// return 1; -// } - -m_poppler_get_INT(Dict, getLength); - -static int m_Dict_add(lua_State * L) -{ - char *s; - udstruct *uin, *uobj; - uin = (udstruct *) luaL_checkudata(L, 1, M_Dict); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - s = copyString(luaL_checkstring(L, 2)); - uobj = (udstruct *) luaL_checkudata(L, 3, M_Object); - ((Dict *) uin->d)->add(s, std::move(*((Object *) uobj->d))); - return 0; -} - -static int m_Dict_set(lua_State * L) -{ - const char *s; - udstruct *uin, *uobj; - 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); - uobj = (udstruct *) luaL_checkudata(L, 3, M_Object); - ((Dict *) uin->d)->set(s, std::move(*((Object *) uobj->d))); - return 0; -} - -static int m_Dict_remove(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); - ((Dict *) uin->d)->remove(s); - return 0; -} - -m_poppler_check_string(Dict, is); - -static int m_Dict_lookup(lua_State * L) -{ - const char *s; - udstruct *uin, *uout; - 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); - uout = new_Object_userdata(L); - uout->d = new Object(); - *((Object *) uout->d) = ((Dict *) uin->d)->lookup(s); - uout->atype = ALLOC_LEPDF; - uout->pc = uin->pc; - uout->pd = uin->pd; - return 1; -} - -static int m_Dict_lookupNF(lua_State * L) -{ - const char *s; - udstruct *uin, *uout; - 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); - uout = new_Object_userdata(L); - uout->d = new Object(); - *((Object *) uout->d) = ((Dict *) uin->d)->lookupNF(s); - uout->atype = ALLOC_LEPDF; - uout->pc = uin->pc; - uout->pd = uin->pd; - return 1; -} - -static int m_Dict_lookupInt(lua_State * L) -{ - const char *s1, *s2; - int i; - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_Dict); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - s1 = luaL_checkstring(L, 2); - s2 = luaL_checkstring(L, 3); - if (((Dict *) uin->d)->lookupInt(s1, s2, &i)) - lua_pushinteger(L, i); - else - lua_pushnil(L); - return 1; -} - -static int m_Dict_getKey(lua_State * L) -{ - int i, len; - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_Dict); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - i = luaL_checkint(L, 2); - len = ((Dict *) uin->d)->getLength(); - if (i > 0 && i <= len) - lua_pushstring(L, ((Dict *) uin->d)->getKey(i - 1)); - else - lua_pushnil(L); - return 1; -} - -static int m_Dict_getVal(lua_State * L) -{ - int i, len; - udstruct *uin, *uout; - uin = (udstruct *) luaL_checkudata(L, 1, M_Dict); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - i = luaL_checkint(L, 2); - len = ((Dict *) uin->d)->getLength(); - if (i > 0 && i <= len) { - uout = new_Object_userdata(L); - uout->d = new Object(); - *((Object *) uout->d) = ((Dict *) uin->d)->getVal(i - 1); - uout->atype = ALLOC_LEPDF; - uout->pc = uin->pc; - uout->pd = uin->pd; - } else - lua_pushnil(L); - return 1; -} - -static int m_Dict_getValNF(lua_State * L) -{ - int i, len; - udstruct *uin, *uout; - uin = (udstruct *) luaL_checkudata(L, 1, M_Dict); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - i = luaL_checkint(L, 2); - len = ((Dict *) uin->d)->getLength(); - if (i > 0 && i <= len) { - uout = new_Object_userdata(L); - uout->d = new Object(); - *((Object *) uout->d) = ((Dict *) uin->d)->getValNF(i - 1); - uout->atype = ALLOC_LEPDF; - uout->pc = uin->pc; - uout->pd = uin->pd; - } else - lua_pushnil(L); - return 1; -} - -m_poppler_check_string(Dict, hasKey); - -m_poppler__tostring(Dict); - -static const struct luaL_Reg Dict_m[] = { - // {"incRef", m_Dict_incRef},// Now private - // {"decRef", m_Dict_decRef},// Now private - {"getLength", m_Dict_getLength}, - {"add", m_Dict_add}, - {"set", m_Dict_set}, - {"remove", m_Dict_remove}, - {"is", m_Dict_is}, - {"lookup", m_Dict_lookup}, - {"lookupNF", m_Dict_lookupNF}, - {"lookupInt", m_Dict_lookupInt}, - {"getKey", m_Dict_getKey}, - {"getVal", m_Dict_getVal}, - {"getValNF", m_Dict_getValNF}, - {"hasKey", m_Dict_hasKey}, - {"__tostring", m_Dict__tostring}, - {NULL, NULL} // sentinel -}; - -//********************************************************************** -// EmbFile - -m_poppler_get_INT(EmbFile, size); -m_poppler_get_GOOSTRING(EmbFile, modDate); -m_poppler_get_GOOSTRING(EmbFile, createDate); -m_poppler_get_GOOSTRING(EmbFile, checksum); -m_poppler_get_GOOSTRING(EmbFile, mimeType); - -m_poppler_get_BOOL(EmbFile, isOk); - -static int m_EmbFile_save(lua_State * L) -{ - const char *s; - size_t len; - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_EmbFile); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - s = luaL_checklstring(L, 2, &len); - if (((EmbFile *) uin->d)->save(s)) - lua_pushboolean(L, 1); - else - lua_pushboolean(L, 0); - return 1; -} - -m_poppler__tostring(EmbFile); - -static const struct luaL_Reg EmbFile_m[] = { - {"size", m_EmbFile_size}, - {"modDate", m_EmbFile_modDate}, - {"createDate", m_EmbFile_createDate}, - {"checksum", m_EmbFile_checksum}, - {"mimeType", m_EmbFile_mimeType}, - {"isOk", m_EmbFile_isOk}, - {"save", m_EmbFile_save}, - {"__tostring", m_EmbFile__tostring}, - {NULL, NULL} // sentinel -}; - -//********************************************************************** -// FileSpec - -m_poppler_get_BOOL(FileSpec, isOk); -m_poppler_get_GOOSTRING(FileSpec, getFileName); -m_poppler_get_GOOSTRING(FileSpec, getFileNameForPlatform); -m_poppler_get_GOOSTRING(FileSpec, getDescription); - -static int m_FileSpec_getEmbeddedFile(lua_State * L) -{ - udstruct *uin, *uout; - uin = (udstruct *) luaL_checkudata(L, 1, M_FileSpec); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - uout = new_EmbFile_userdata(L); - uout->d = ((FileSpec *) uin->d)->getEmbeddedFile(); - uout->pc = uin->pc; - uout->pd = uin->pd; - return 1; -} - -m_poppler__tostring(FileSpec); - -static const struct luaL_Reg FileSpec_m[] = { - {"isOk", m_FileSpec_isOk}, - {"getFileName", m_FileSpec_getFileName}, - {"getFileNameForPlatform", m_FileSpec_getFileNameForPlatform}, - {"getDescription", m_FileSpec_getDescription}, - {"getEmbeddedFile", m_FileSpec_getEmbeddedFile}, - {"__tostring", m_FileSpec__tostring}, - {NULL, NULL} // sentinel -}; - -//********************************************************************** -// GooString - -static int m_GooString__tostring(lua_State * L) -{ - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_GooString); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - lua_pushlstring(L, ((GooString *) uin->d)->getCString(), - ((GooString *) uin->d)->getLength()); - return 1; -} - -static const struct luaL_Reg GooString_m[] = { - {"__tostring", m_GooString__tostring}, - {NULL, NULL} // sentinel -}; - -//********************************************************************** -// LinkDest - -static const char *LinkDestKindNames[] = - { "XYZ", "Fit", "FitH", "FitV", "FitR", "FitB", "FitBH", "FitBV", NULL }; - -m_poppler_get_BOOL(LinkDest, isOk); - -static int m_LinkDest_getKind(lua_State * L) -{ - int i; - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_LinkDest); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - i = (int) ((LinkDest *) uin->d)->getKind(); - lua_pushinteger(L, i); - return 1; -} - -static int m_LinkDest_getKindName(lua_State * L) -{ - int i; - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_LinkDest); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - i = (int) ((LinkDest *) uin->d)->getKind(); - lua_pushstring(L, LinkDestKindNames[i]); - return 1; -} - -m_poppler_get_BOOL(LinkDest, isPageRef); -m_poppler_get_INT(LinkDest, getPageNum); - -static int m_LinkDest_getPageRef(lua_State * L) -{ - udstruct *uin, *uout; - uin = (udstruct *) luaL_checkudata(L, 1, M_LinkDest); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - uout = new_Ref_userdata(L); - uout->d = (Ref *) gmalloc(sizeof(Ref)); - ((Ref *) uout->d)->num = ((LinkDest *) uin->d)->getPageRef().num; - ((Ref *) uout->d)->gen = ((LinkDest *) uin->d)->getPageRef().gen; - uout->atype = ALLOC_LEPDF; - uout->pc = uin->pc; - uout->pd = uin->pd; - return 1; -} - -m_poppler_get_DOUBLE(LinkDest, getLeft); -m_poppler_get_DOUBLE(LinkDest, getBottom); -m_poppler_get_DOUBLE(LinkDest, getRight); -m_poppler_get_DOUBLE(LinkDest, getTop); -m_poppler_get_DOUBLE(LinkDest, getZoom); -m_poppler_get_BOOL(LinkDest, getChangeLeft); -m_poppler_get_BOOL(LinkDest, getChangeTop); -m_poppler_get_BOOL(LinkDest, getChangeZoom); - -m_poppler__tostring(LinkDest); - -static const struct luaL_Reg LinkDest_m[] = { - {"isOk", m_LinkDest_isOk}, - {"getKind", m_LinkDest_getKind}, - {"getKindName", m_LinkDest_getKindName}, // not poppler - {"isPageRef", m_LinkDest_isPageRef}, - {"getPageNum", m_LinkDest_getPageNum}, - {"getPageRef", m_LinkDest_getPageRef}, - {"getLeft", m_LinkDest_getLeft}, - {"getBottom", m_LinkDest_getBottom}, - {"getRight", m_LinkDest_getRight}, - {"getTop", m_LinkDest_getTop}, - {"getZoom", m_LinkDest_getZoom}, - {"getChangeLeft", m_LinkDest_getChangeLeft}, - {"getChangeTop", m_LinkDest_getChangeTop}, - {"getChangeZoom", m_LinkDest_getChangeZoom}, - {"__tostring", m_LinkDest__tostring}, - {NULL, NULL} // sentinel -}; - -//********************************************************************** -// 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 -}; - -//********************************************************************** -// Object - -#ifdef HAVE_OBJECT_INITCMD_CONST_CHARP -#define CHARP_CAST -#else -// must cast arg of Object::initCmd, Object::isStream, and Object::streamIs -// from 'const char *' to 'char *', although they are not modified. -#define CHARP_CAST (char *) -#endif - -// Special type checking. -#define m_Object_isType_(function, cast) \ -static int m_Object_##function(lua_State * L) \ -{ \ - udstruct *uin; \ - uin = (udstruct *) luaL_checkudata(L, 1, M_Object); \ - if (uin->pd != NULL && uin->pd->pc != uin->pc) \ - pdfdoc_changed_error(L); \ - if (lua_gettop(L) >= 2) { \ - if (lua_isstring(L, 2) \ - && ((Object *) uin->d)->function(cast lua_tostring(L, 2))) \ - lua_pushboolean(L, 1); \ - else \ - lua_pushboolean(L, 0); \ - } else { \ - if (((Object *) uin->d)->function()) \ - lua_pushboolean(L, 1); \ - else \ - lua_pushboolean(L, 0); \ - } \ - return 1; \ -} -#define m_Object_isType(function) m_Object_isType_(function, ) -#define m_Object_isType_nonconst(function) m_Object_isType_(function, CHARP_CAST) - -static int m_Object_initBool(lua_State * L) -{ - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_Object); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - luaL_checktype(L, 2, LUA_TBOOLEAN); - if (lua_toboolean(L, 2) != 0) - *((Object *) uin->d) = Object(gTrue); - else - *((Object *) uin->d) = Object(gFalse); - return 0; -} - -static int m_Object_initInt(lua_State * L) -{ - int i; - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_Object); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - i = luaL_checkint(L, 2); - *((Object *) uin->d) = Object(i); - return 0; -} - -static int m_Object_initReal(lua_State * L) -{ - double d; - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_Object); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - d = luaL_checknumber(L, 2); - *((Object *) uin->d) = Object(d); - return 0; -} - -static int m_Object_initString(lua_State * L) -{ - GooString *gs; - const char *s; - size_t len; - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_Object); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - s = luaL_checklstring(L, 2, &len); - gs = new GooString(s, len); - *((Object *) uin->d) = Object(gs); - return 0; -} - -static int m_Object_initName(lua_State * L) -{ - const char *s; - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_Object); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - s = luaL_checkstring(L, 2); - *((Object *) uin->d) = Object(objName, s); - return 0; -} - -static int m_Object_initNull(lua_State * L) -{ - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_Object); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - *((Object *) uin->d) = Object(objNull); - return 0; -} - -static int m_Object_initArray(lua_State * L) -{ - udstruct *uin, *uxref; - Array *a; - uin = (udstruct *) luaL_checkudata(L, 1, M_Object); - uxref = (udstruct *) luaL_checkudata(L, 2, M_XRef); - if (uin->pd != NULL && uxref->pd != NULL && uin->pd != uxref->pd) - pdfdoc_differs_error(L); - if ((uin->pd != NULL && uin->pd->pc != uin->pc) - || (uxref->pd != NULL && uxref->pd->pc != uxref->pc)) - pdfdoc_changed_error(L); - a = new Array((XRef *) uxref->d); - *((Object *) uin->d) = Object(a); - return 0; -} - -// TODO: decide betweeen -// Object *initDict(XRef *xref); -// Object *initDict(Dict *dictA); - -static int m_Object_initDict(lua_State * L) -{ - udstruct *uin, *uxref; - Dict *d; - uin = (udstruct *) luaL_checkudata(L, 1, M_Object); - uxref = (udstruct *) luaL_checkudata(L, 2, M_XRef); - if (uin->pd != NULL && uxref->pd != NULL && uin->pd != uxref->pd) - pdfdoc_differs_error(L); - if ((uin->pd != NULL && uin->pd->pc != uin->pc) - || (uxref->pd != NULL && uxref->pd->pc != uxref->pc)) - pdfdoc_changed_error(L); - d = new Dict((XRef *) uxref->d); - *((Object *) uin->d) = Object(d); - return 0; -} - -static int m_Object_initStream(lua_State * L) -{ - udstruct *uin, *ustream; - uin = (udstruct *) luaL_checkudata(L, 1, M_Object); - ustream = (udstruct *) luaL_checkudata(L, 2, M_Stream); - if (uin->pd != NULL && ustream->pd != NULL && uin->pd != ustream->pd) - pdfdoc_differs_error(L); - if ((uin->pd != NULL && uin->pd->pc != uin->pc) - || (ustream->pd != NULL && ustream->pd->pc != ustream->pc)) - pdfdoc_changed_error(L); - *((Object *) uin->d) = Object((Stream *) ustream->d); - return 0; -} - -static int m_Object_initRef(lua_State * L) -{ - int num, gen; - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_Object); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - num = luaL_checkint(L, 2); - gen = luaL_checkint(L, 3); - *((Object *) uin->d) = Object(num, gen); - return 0; -} - -static int m_Object_initCmd(lua_State * L) -{ - const char *s; - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_Object); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - s = luaL_checkstring(L, 2); - *((Object *) uin->d) = Object(objCmd, s); - return 0; -} - -static int m_Object_initError(lua_State * L) -{ - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_Object); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - *((Object *) uin->d) = Object(objError); - return 0; -} - -static int m_Object_initEOF(lua_State * L) -{ - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_Object); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - *((Object *) uin->d) = Object(objEOF); - return 0; -} - -static int m_Object_fetch(lua_State * L) -{ - udstruct *uin, *uxref, *uout; - uin = (udstruct *) luaL_checkudata(L, 1, M_Object); - uxref = (udstruct *) luaL_checkudata(L, 2, M_XRef); - if (uin->pd != NULL && uxref->pd != NULL && uin->pd != uxref->pd) - pdfdoc_differs_error(L); - if ((uin->pd != NULL && uin->pd->pc != uin->pc) - || (uxref->pd != NULL && uxref->pd->pc != uxref->pc)) - pdfdoc_changed_error(L); - uout = new_Object_userdata(L); - uout->d = new Object(); - *((Object *) uout->d) = ((Object *) uin->d)->fetch((XRef *) uxref->d); - uout->atype = ALLOC_LEPDF; - uout->pc = uin->pc; - uout->pd = uin->pd; - return 1; -} - -static int m_Object_getType(lua_State * L) -{ - ObjType t; - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_Object); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - t = ((Object *) uin->d)->getType(); - lua_pushinteger(L, (int) t); - return 1; -} - -static int m_Object_getTypeName(lua_State * L) -{ - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_Object); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - lua_pushstring(L, ((Object *) uin->d)->getTypeName()); - return 1; -} - -m_poppler_get_BOOL(Object, isBool); -m_poppler_get_BOOL(Object, isInt); -m_poppler_get_BOOL(Object, isReal); -m_poppler_get_BOOL(Object, isNum); -m_poppler_get_BOOL(Object, isString); -m_Object_isType(isName); -m_poppler_get_BOOL(Object, isNull); -m_poppler_get_BOOL(Object, isArray); -m_Object_isType(isDict); -m_Object_isType_nonconst(isStream); -m_poppler_get_BOOL(Object, isRef); -m_Object_isType(isCmd); -m_poppler_get_BOOL(Object, isError); -m_poppler_get_BOOL(Object, isEOF); -m_poppler_get_BOOL(Object, isNone); - -static int m_Object_getBool(lua_State * L) -{ - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_Object); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - if (((Object *) uin->d)->isBool()) { - if (((Object *) uin->d)->getBool()) - lua_pushboolean(L, 1); - else - lua_pushboolean(L, 0); - } else - lua_pushnil(L); - return 1; -} - -static int m_Object_getInt(lua_State * L) -{ - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_Object); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - if (((Object *) uin->d)->isInt()) - lua_pushinteger(L, ((Object *) uin->d)->getInt()); - else - lua_pushnil(L); - return 1; -} - -static int m_Object_getReal(lua_State * L) -{ - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_Object); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - if (((Object *) uin->d)->isReal()) - lua_pushnumber(L, ((Object *) uin->d)->getReal()); /* float */ - else - lua_pushnil(L); - return 1; -} - -static int m_Object_getNum(lua_State * L) -{ - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_Object); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - if (((Object *) uin->d)->isInt()) - lua_pushinteger(L, ((Object *) uin->d)->getInt()); - else if (((Object *) uin->d)->isReal()) - lua_pushinteger(L, ((Object *) uin->d)->getReal()); - else if (((Object *) uin->d)->isNum()) /* redundant */ - lua_pushnumber(L, ((Object *) uin->d)->getNum()); /* integer or float */ - else - lua_pushnil(L); - return 1; -} - -static int m_Object_getString(lua_State * L) -{ - GooString *gs; - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_Object); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - if (((Object *) uin->d)->isString()) { - gs = (GooString *)((Object *) uin->d)->getString(); - lua_pushlstring(L, gs->getCString(), gs->getLength()); - } else - lua_pushnil(L); - return 1; -} - -static int m_Object_getName(lua_State * L) -{ - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_Object); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - if (((Object *) uin->d)->isName()) - lua_pushstring(L, ((Object *) uin->d)->getName()); - else - lua_pushnil(L); - return 1; -} - -static int m_Object_getArray(lua_State * L) -{ - udstruct *uin, *uout; - uin = (udstruct *) luaL_checkudata(L, 1, M_Object); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - if (((Object *) uin->d)->isArray()) { - uout = new_Array_userdata(L); - uout->d = ((Object *) uin->d)->getArray(); - uout->pc = uin->pc; - uout->pd = uin->pd; - } else - lua_pushnil(L); - return 1; -} - -static int m_Object_getDict(lua_State * L) -{ - udstruct *uin, *uout; - uin = (udstruct *) luaL_checkudata(L, 1, M_Object); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - if (((Object *) uin->d)->isDict()) { - uout = new_Dict_userdata(L); - uout->d = ((Object *) uin->d)->getDict(); - uout->pc = uin->pc; - uout->pd = uin->pd; - } else - lua_pushnil(L); - return 1; -} - -static int m_Object_getStream(lua_State * L) -{ - udstruct *uin, *uout; - uin = (udstruct *) luaL_checkudata(L, 1, M_Object); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - if (((Object *) uin->d)->isStream()) { - uout = new_Stream_userdata(L); - uout->d = ((Object *) uin->d)->getStream(); - uout->pc = uin->pc; - uout->pd = uin->pd; - } else - lua_pushnil(L); - return 1; -} - -static int m_Object_getRef(lua_State * L) -{ - udstruct *uin, *uout; - uin = (udstruct *) luaL_checkudata(L, 1, M_Object); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - if (((Object *) uin->d)->isRef()) { - uout = new_Ref_userdata(L); - uout->d = (Ref *) gmalloc(sizeof(Ref)); - ((Ref *) uout->d)->num = ((Object *) uin->d)->getRef().num; - ((Ref *) uout->d)->gen = ((Object *) uin->d)->getRef().gen; - uout->atype = ALLOC_LEPDF; - uout->pc = uin->pc; - uout->pd = uin->pd; - } else - lua_pushnil(L); - return 1; -} - -static int m_Object_getRefNum(lua_State * L) -{ - int i; - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_Object); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - if (((Object *) uin->d)->isRef()) { - i = ((Object *) uin->d)->getRef().num; - lua_pushinteger(L, i); - } else - lua_pushnil(L); - return 1; -} - -static int m_Object_getRefGen(lua_State * L) -{ - int i; - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_Object); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - if (((Object *) uin->d)->isRef()) { - i = ((Object *) uin->d)->getRef().gen; - lua_pushinteger(L, i); - } else - lua_pushnil(L); - return 1; -} - -static int m_Object_getCmd(lua_State * L) -{ - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_Object); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - if (((Object *) uin->d)->isCmd()) - lua_pushstring(L, ((Object *) uin->d)->getCmd()); - else - lua_pushnil(L); - return 1; -} - -static int m_Object_arrayGetLength(lua_State * L) -{ - int len; - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_Object); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - if (((Object *) uin->d)->isArray()) { - len = ((Object *) uin->d)->arrayGetLength(); - lua_pushinteger(L, len); - } else - lua_pushnil(L); - return 1; -} - -static int m_Object_arrayAdd(lua_State * L) -{ - udstruct *uin, *uobj; - uin = (udstruct *) luaL_checkudata(L, 1, M_Object); - uobj = (udstruct *) luaL_checkudata(L, 2, M_Object); - if (uin->pd != NULL && uobj->pd != NULL && uin->pd != uobj->pd) - pdfdoc_differs_error(L); - if ((uin->pd != NULL && uin->pd->pc != uin->pc) - || (uobj->pd != NULL && uobj->pd->pc != uobj->pd->pc)) - pdfdoc_changed_error(L); - if (!((Object *) uin->d)->isArray()) - luaL_error(L, "Object is not an Array"); - ((Object *) uin->d)->arrayAdd(std::move(*((Object *) uobj->d))); - return 0; -} - -static int m_Object_arrayGet(lua_State * L) -{ - int i, len; - udstruct *uin, *uout; - uin = (udstruct *) luaL_checkudata(L, 1, M_Object); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - i = luaL_checkint(L, 2); - if (((Object *) uin->d)->isArray()) { - len = ((Object *) uin->d)->arrayGetLength(); - if (i > 0 && i <= len) { - uout = new_Object_userdata(L); - uout->d = new Object(); - *((Object *) uout->d) = ((Object *) uin->d)->arrayGet(i - 1); - uout->atype = ALLOC_LEPDF; - uout->pc = uin->pc; - uout->pd = uin->pd; - } else - lua_pushnil(L); - } else - lua_pushnil(L); - return 1; -} - -static int m_Object_arrayGetNF(lua_State * L) -{ - int i, len; - udstruct *uin, *uout; - uin = (udstruct *) luaL_checkudata(L, 1, M_Object); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - i = luaL_checkint(L, 2); - if (((Object *) uin->d)->isArray()) { - len = ((Object *) uin->d)->arrayGetLength(); - if (i > 0 && i <= len) { - uout = new_Object_userdata(L); - uout->d = new Object(); - *((Object *) uout->d) = ((Object *) uin->d)->arrayGetNF(i - 1); - uout->atype = ALLOC_LEPDF; - uout->pc = uin->pc; - uout->pd = uin->pd; - } else - lua_pushnil(L); - } else - lua_pushnil(L); - return 1; -} - -static int m_Object_dictGetLength(lua_State * L) -{ - int len; - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_Object); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - if (((Object *) uin->d)->isDict()) { - len = ((Object *) uin->d)->dictGetLength(); - lua_pushinteger(L, len); - } else - lua_pushnil(L); - return 1; -} - -static int m_Object_dictAdd(lua_State * L) -{ - const char *s; - udstruct *uin, *uobj; - uin = (udstruct *) luaL_checkudata(L, 1, M_Object); - s = luaL_checkstring(L, 2); - uobj = (udstruct *) luaL_checkudata(L, 3, M_Object); - if (uin->pd != NULL && uobj->pd != NULL && uin->pd != uobj->pd) - pdfdoc_differs_error(L); - if ((uin->pd != NULL && uin->pd->pc != uin->pc) - || (uobj->pd != NULL && uobj->pd->pc != uobj->pd->pc)) - pdfdoc_changed_error(L); - if (!((Object *) uin->d)->isDict()) - luaL_error(L, "Object is not a Dict"); - ((Object *) uin->d)->dictAdd(copyString(s), std::move(*((Object *) uobj->d))); - return 0; -} - -static int m_Object_dictSet(lua_State * L) -{ - const char *s; - udstruct *uin, *uobj; - uin = (udstruct *) luaL_checkudata(L, 1, M_Object); - s = luaL_checkstring(L, 2); - uobj = (udstruct *) luaL_checkudata(L, 3, M_Object); - if (uin->pd != NULL && uobj->pd != NULL && uin->pd != uobj->pd) - pdfdoc_differs_error(L); - if ((uin->pd != NULL && uin->pd->pc != uin->pc) - || (uobj->pd != NULL && uobj->pd->pc != uobj->pd->pc)) - pdfdoc_changed_error(L); - if (!((Object *) uin->d)->isDict()) - luaL_error(L, "Object is not a Dict"); - ((Object *) uin->d)->dictSet(s, std::move(*((Object *) uobj->d))); - return 0; -} - -static int m_Object_dictLookup(lua_State * L) -{ - const char *s; - udstruct *uin, *uout; - uin = (udstruct *) luaL_checkudata(L, 1, M_Object); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - s = luaL_checkstring(L, 2); - if (((Object *) uin->d)->isDict()) { - uout = new_Object_userdata(L); - uout->d = new Object(); - *((Object *) uout->d) = ((Object *) uin->d)->dictLookup(s); - uout->atype = ALLOC_LEPDF; - uout->pc = uin->pc; - uout->pd = uin->pd; - } else - lua_pushnil(L); - return 1; -} - -static int m_Object_dictLookupNF(lua_State * L) -{ - const char *s; - udstruct *uin, *uout; - uin = (udstruct *) luaL_checkudata(L, 1, M_Object); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - s = luaL_checkstring(L, 2); - if (((Object *) uin->d)->isDict()) { - uout = new_Object_userdata(L); - uout->d = new Object(); - *((Object *) uout->d) = ((Object *) uin->d)->dictLookupNF(s); - uout->atype = ALLOC_LEPDF; - uout->pc = uin->pc; - uout->pd = uin->pd; - } else - lua_pushnil(L); - return 1; -} - -static int m_Object_dictGetKey(lua_State * L) -{ - int i, len; - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_Object); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - i = luaL_checkint(L, 2); - if (((Object *) uin->d)->isDict()) { - len = ((Object *) uin->d)->dictGetLength(); - if (i > 0 && i <= len) - lua_pushstring(L, ((Object *) uin->d)->dictGetKey(i - 1)); - else - lua_pushnil(L); - } else - lua_pushnil(L); - return 1; -} - -static int m_Object_dictGetVal(lua_State * L) -{ - int i, len; - udstruct *uin, *uout; - uin = (udstruct *) luaL_checkudata(L, 1, M_Object); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - i = luaL_checkint(L, 2); - if (((Object *) uin->d)->isDict()) { - len = ((Object *) uin->d)->dictGetLength(); - if (i > 0 && i <= len) { - uout = new_Object_userdata(L); - uout->d = new Object(); - *((Object *) uout->d) = ((Object *) uin->d)->dictGetVal(i - 1); - uout->atype = ALLOC_LEPDF; - uout->pc = uin->pc; - uout->pd = uin->pd; - } else - lua_pushnil(L); - } else - lua_pushnil(L); - return 1; -} - -static int m_Object_dictGetValNF(lua_State * L) -{ - int i, len; - udstruct *uin, *uout; - uin = (udstruct *) luaL_checkudata(L, 1, M_Object); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - i = luaL_checkint(L, 2); - if (((Object *) uin->d)->isDict()) { - len = ((Object *) uin->d)->dictGetLength(); - if (i > 0 && i <= len) { - uout = new_Object_userdata(L); - uout->d = new Object(); - *((Object *) uout->d) = ((Object *) uin->d)->dictGetValNF(i - 1); - uout->atype = ALLOC_LEPDF; - uout->pc = uin->pc; - uout->pd = uin->pd; - } else - lua_pushnil(L); - } else - lua_pushnil(L); - return 1; -} - -static int m_Object_streamIs(lua_State * L) -{ - const char *s; - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_Object); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - s = luaL_checkstring(L, 2); - if (((Object *) uin->d)->isStream()) { - if (((Object *) uin->d)->streamIs(CHARP_CAST s)) - lua_pushboolean(L, 1); - else - lua_pushboolean(L, 0); - } else - lua_pushnil(L); - return 1; -} - -static int m_Object_streamReset(lua_State * L) -{ - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_Object); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - if (((Object *) uin->d)->isStream()) - ((Object *) uin->d)->streamReset(); - return 0; -} - -static int m_Object_streamGetChar(lua_State * L) -{ - int i; - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_Object); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - if (((Object *) uin->d)->isStream()) { - i = ((Object *) uin->d)->streamGetChar(); - lua_pushinteger(L, i); - } else - lua_pushnil(L); - return 1; -} - -static int m_Object_streamLookChar(lua_State * L) -{ - int i; - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_Object); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - if (((Object *) uin->d)->isStream()) { - i = ((Object *) uin->d)->streamLookChar(); - lua_pushinteger(L, i); - } else - lua_pushnil(L); - return 1; -} - -static int m_Object_streamGetPos(lua_State * L) -{ - int i; - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_Object); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - if (((Object *) uin->d)->isStream()) { - i = (int) ((Object *) uin->d)->streamGetPos(); - lua_pushinteger(L, i); - } else - lua_pushnil(L); - return 1; -} - -static int m_Object_streamSetPos(lua_State * L) -{ - int i; - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_Object); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - i = luaL_checkint(L, 2); - if (((Object *) uin->d)->isStream()) - ((Object *) uin->d)->streamSetPos(i); - return 0; -} - -static int m_Object_streamGetDict(lua_State * L) -{ - udstruct *uin, *uout; - uin = (udstruct *) luaL_checkudata(L, 1, M_Object); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - if (((Object *) uin->d)->isStream()) { - uout = new_Dict_userdata(L); - uout->d = ((Object *) uin->d)->streamGetDict(); - uout->pc = uin->pc; - uout->pd = uin->pd; - } else - lua_pushnil(L); - return 1; -} - -static int m_Object__gc(lua_State * L) -{ - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_Object); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); -#ifdef DEBUG - printf("\n===== Object GC ===== uin=<%p>\n", uin); -#endif - if (uin->atype == ALLOC_LEPDF) { - // free() seems to collide with the lua gc - //((Object *) uin->d)->free(); - delete(Object *) uin->d; - } - return 0; -} - -m_poppler__tostring(Object); - -static const struct luaL_Reg Object_m[] = { - {"initBool", m_Object_initBool}, - {"initInt", m_Object_initInt}, - {"initReal", m_Object_initReal}, - {"initString", m_Object_initString}, - {"initName", m_Object_initName}, - {"initNull", m_Object_initNull}, - {"initArray", m_Object_initArray}, - {"initDict", m_Object_initDict}, - {"initStream", m_Object_initStream}, - {"initRef", m_Object_initRef}, - {"initCmd", m_Object_initCmd}, - {"initError", m_Object_initError}, - {"initEOF", m_Object_initEOF}, - // {"copy", m_Object_copy}, - {"fetch", m_Object_fetch}, - {"getType", m_Object_getType}, - {"getTypeName", m_Object_getTypeName}, - {"isBool", m_Object_isBool}, - {"isInt", m_Object_isInt}, - {"isReal", m_Object_isReal}, - {"isNum", m_Object_isNum}, - {"isString", m_Object_isString}, - {"isName", m_Object_isName}, - {"isNull", m_Object_isNull}, - {"isArray", m_Object_isArray}, - {"isDict", m_Object_isDict}, - {"isStream", m_Object_isStream}, - {"isRef", m_Object_isRef}, - {"isCmd", m_Object_isCmd}, - {"isError", m_Object_isError}, - {"isEOF", m_Object_isEOF}, - {"isNone", m_Object_isNone}, - {"getBool", m_Object_getBool}, - {"getInt", m_Object_getInt}, - {"getReal", m_Object_getReal}, - {"getNum", m_Object_getNum}, - {"getString", m_Object_getString}, - {"getName", m_Object_getName}, - {"getArray", m_Object_getArray}, - {"getDict", m_Object_getDict}, - {"getStream", m_Object_getStream}, - {"getRef", m_Object_getRef}, - {"getRefNum", m_Object_getRefNum}, - {"getRefGen", m_Object_getRefGen}, - {"getCmd", m_Object_getCmd}, - {"arrayGetLength", m_Object_arrayGetLength}, - {"arrayAdd", m_Object_arrayAdd}, - {"arrayGet", m_Object_arrayGet}, - {"arrayGetNF", m_Object_arrayGetNF}, - {"dictGetLength", m_Object_dictGetLength}, - {"dictAdd", m_Object_dictAdd}, - {"dictSet", m_Object_dictSet}, - {"dictLookup", m_Object_dictLookup}, - {"dictLookupNF", m_Object_dictLookupNF}, - {"dictGetKey", m_Object_dictGetKey}, - {"dictGetVal", m_Object_dictGetVal}, - {"dictGetValNF", m_Object_dictGetValNF}, - {"streamIs", m_Object_streamIs}, - {"streamReset", m_Object_streamReset}, - // {"streamClose", m_Object_streamClose}, - {"streamGetChar", m_Object_streamGetChar}, - {"streamLookChar", m_Object_streamLookChar}, - // {"streamGetLine", m_Object_streamGetLine}, - {"streamGetPos", m_Object_streamGetPos}, - {"streamSetPos", m_Object_streamSetPos}, - {"streamGetDict", m_Object_streamGetDict}, - {"__tostring", m_Object__tostring}, - {"__gc", m_Object__gc}, // finalizer - {NULL, NULL} // sentinel -}; - -//********************************************************************** -// Page - -m_poppler_get_BOOL(Page, isOk); -m_poppler_get_INT(Page, getNum); -m_poppler_get_poppler(Page, PDFRectangle, getMediaBox); -m_poppler_get_poppler(Page, PDFRectangle, getCropBox); -m_poppler_get_BOOL(Page, isCropped); -m_poppler_get_DOUBLE(Page, getMediaWidth); -m_poppler_get_DOUBLE(Page, getMediaHeight); -m_poppler_get_DOUBLE(Page, getCropWidth); -m_poppler_get_DOUBLE(Page, getCropHeight); -m_poppler_get_poppler(Page, PDFRectangle, getBleedBox); -m_poppler_get_poppler(Page, PDFRectangle, getTrimBox); -m_poppler_get_poppler(Page, PDFRectangle, getArtBox); -m_poppler_get_INT(Page, getRotate); -m_poppler_get_GOOSTRING(Page, getLastModified); -m_poppler_get_poppler(Page, Dict, getBoxColorInfo); -m_poppler_get_poppler(Page, Dict, getGroup); -m_poppler_get_poppler(Page, Stream, getMetadata); -m_poppler_get_poppler(Page, Dict, getPieceInfo); -m_poppler_get_poppler(Page, Dict, getSeparationInfo); -m_poppler_get_poppler(Page, Dict, getResourceDict); -m_poppler_get_OBJECT(Page, getAnnotsObject); - -m_poppler_get_OBJECT(Page, getContents); - -m_poppler__tostring(Page); - -static const struct luaL_Reg Page_m[] = { - {"isOk", m_Page_isOk}, - {"getNum", m_Page_getNum}, - {"getMediaBox", m_Page_getMediaBox}, - {"getCropBox", m_Page_getCropBox}, - {"isCropped", m_Page_isCropped}, - {"getMediaWidth", m_Page_getMediaWidth}, - {"getMediaHeight", m_Page_getMediaHeight}, - {"getCropWidth", m_Page_getCropWidth}, - {"getCropHeight", m_Page_getCropHeight}, - {"getBleedBox", m_Page_getBleedBox}, - {"getTrimBox", m_Page_getTrimBox}, - {"getArtBox", m_Page_getArtBox}, - {"getRotate", m_Page_getRotate}, - {"getLastModified", m_Page_getLastModified}, - {"getBoxColorInfo", m_Page_getBoxColorInfo}, - {"getGroup", m_Page_getGroup}, - {"getMetadata", m_Page_getMetadata}, - {"getPieceInfo", m_Page_getPieceInfo}, - {"getSeparationInfo", m_Page_getSeparationInfo}, - {"getResourceDict", m_Page_getResourceDict}, - {"getAnnotsObject", m_Page_getAnnotsObject}, - {"getContents", m_Page_getContents}, - {"__tostring", m_Page__tostring}, - {NULL, NULL} // sentinel -}; - -//********************************************************************** -// PDFDoc - -#define m_PDFDoc_BOOL(function) \ -static int m_PDFDoc_##function(lua_State * L) \ -{ \ - udstruct *uin; \ - uin = (udstruct *) luaL_checkudata(L, 1, M_PDFDoc); \ - if (uin->pd != NULL && uin->pd->pc != uin->pc) \ - pdfdoc_changed_error(L); \ - if (((PdfDocument *) uin->d)->doc->function()) \ - lua_pushboolean(L, 1); \ - else \ - lua_pushboolean(L, 0); \ - return 1; \ -} - -#define m_PDFDoc_INT(function) \ -static int m_PDFDoc_##function(lua_State * L) \ -{ \ - int i; \ - udstruct *uin; \ - uin = (udstruct *) luaL_checkudata(L, 1, M_PDFDoc); \ - if (uin->pd != NULL && uin->pd->pc != uin->pc) \ - pdfdoc_changed_error(L); \ - i = ((PdfDocument *) uin->d)->doc->function(); \ - lua_pushinteger(L, i); \ - return 1; \ -} - -m_PDFDoc_BOOL(isOk); -m_PDFDoc_INT(getErrorCode); - -static int m_PDFDoc_getFileName(lua_State * L) -{ - GooString *gs; - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_PDFDoc); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - gs = ((PdfDocument *) uin->d)->doc->getFileName(); - if (gs != NULL) - lua_pushlstring(L, gs->getCString(), gs->getLength()); - else - lua_pushnil(L); - return 1; -} - -static int m_PDFDoc_getErrorCodeName(lua_State * L) -{ - int i; - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_PDFDoc); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - i = ((PdfDocument *) uin->d)->doc->getErrorCode(); - lua_pushstring(L, ErrorCodeNames[i]); - return 1; -} - -static int m_PDFDoc_getXRef(lua_State * L) -{ - XRef *xref; - udstruct *uin, *uout; - uin = (udstruct *) luaL_checkudata(L, 1, M_PDFDoc); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - xref = ((PdfDocument *) uin->d)->doc->getXRef(); - if (xref->isOk()) { - uout = new_XRef_userdata(L); - uout->d = xref; - uout->pc = uin->pc; - uout->pd = uin->pd; - } else - lua_pushnil(L); - return 1; -} - -static int m_PDFDoc_getCatalog(lua_State * L) -{ - Catalog *cat; - udstruct *uin, *uout; - uin = (udstruct *) luaL_checkudata(L, 1, M_PDFDoc); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - cat = ((PdfDocument *) uin->d)->doc->getCatalog(); - if (cat->isOk()) { - uout = new_Catalog_userdata(L); - uout->d = cat; - uout->pc = uin->pc; - uout->pd = uin->pd; - } else - lua_pushnil(L); - return 1; -} - -#define m_PDFDoc_PAGEDIMEN(function) \ -static int m_PDFDoc_##function(lua_State * L) \ -{ \ - int i, pages; \ - double d; \ - udstruct *uin; \ - 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); \ - pages = ((PdfDocument *) uin->d)->doc->getNumPages(); \ - if (i > 0 && i <= pages) { \ - d = (double) ((PdfDocument *) uin->d)->doc->function(i); \ - lua_pushnumber(L, d); /* float */ \ - } else \ - lua_pushnil(L); \ - return 1; \ -} - -m_PDFDoc_PAGEDIMEN(getPageMediaWidth); -m_PDFDoc_PAGEDIMEN(getPageMediaHeight); -m_PDFDoc_PAGEDIMEN(getPageCropWidth); -m_PDFDoc_PAGEDIMEN(getPageCropHeight); -m_PDFDoc_INT(getNumPages); - -static int m_PDFDoc_readMetadata(lua_State * L) -{ - GooString *gs; - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_PDFDoc); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - if (((PdfDocument *) uin->d)->doc->getCatalog()->isOk()) { - gs = ((PdfDocument *) uin->d)->doc->readMetadata(); - if (gs != NULL) - lua_pushlstring(L, gs->getCString(), gs->getLength()); - else - lua_pushnil(L); - } else - lua_pushnil(L); - return 1; -} - -static int m_PDFDoc_getStructTreeRoot(lua_State * L) -{ - StructTreeRoot *obj; - udstruct *uin, *uout; - uin = (udstruct *) luaL_checkudata(L, 1, M_PDFDoc); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - if (((PdfDocument *) uin->d)->doc->getCatalog()->isOk()) { - obj = ((PdfDocument *) uin->d)->doc->getStructTreeRoot(); - uout = new_StructTreeRoot_userdata(L); - uout->d = obj; - uout->pc = uin->pc; - uout->pd = uin->pd; - } else - lua_pushnil(L); - return 1; -} - -static int m_PDFDoc_findPage(lua_State * L) -{ - int num, gen, i; - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_PDFDoc); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - num = luaL_checkint(L, 2); - gen = luaL_checkint(L, 3); - if (((PdfDocument *) uin->d)->doc->getCatalog()->isOk()) { - i = ((PdfDocument *) uin->d)->doc->findPage(num, gen); - if (i > 0) - lua_pushinteger(L, i); - else - lua_pushnil(L); - } else - lua_pushnil(L); - return 1; -} - -static int m_PDFDoc_getLinks(lua_State * L) -{ - 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); - 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; -} - -static int m_PDFDoc_findDest(lua_State * L) -{ - GooString *name; - LinkDest *dest; - const char *s; - size_t len; - udstruct *uin, *uout; - uin = (udstruct *) luaL_checkudata(L, 1, M_PDFDoc); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - s = luaL_checklstring(L, 2, &len); - name = new GooString(s, len); - if (((PdfDocument *) uin->d)->doc->getCatalog()->isOk()) { - dest = ((PdfDocument *) uin->d)->doc->findDest(name); - if (dest != NULL) { - uout = new_LinkDest_userdata(L); - uout->d = dest; - uout->pc = uin->pc; - uout->pd = uin->pd; - } else - lua_pushnil(L); - } else - lua_pushnil(L); - delete name; - return 1; -} - -m_PDFDoc_BOOL(isEncrypted); -m_PDFDoc_BOOL(okToPrint); -m_PDFDoc_BOOL(okToChange); -m_PDFDoc_BOOL(okToCopy); -m_PDFDoc_BOOL(okToAddNotes); -m_PDFDoc_BOOL(isLinearized); - -static int m_PDFDoc_getDocInfo(lua_State * L) -{ - udstruct *uin, *uout; - uin = (udstruct *) luaL_checkudata(L, 1, M_PDFDoc); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - if (((PdfDocument *) uin->d)->doc->getXRef()->isOk()) { - uout = new_Object_userdata(L); - uout->d = new Object(); - *((Object *) uout->d) = ((PdfDocument *) uin->d)->doc->getDocInfo(); - uout->atype = ALLOC_LEPDF; - uout->pc = uin->pc; - uout->pd = uin->pd; - } else - lua_pushnil(L); - return 1; -} - -static int m_PDFDoc_getDocInfoNF(lua_State * L) -{ - udstruct *uin, *uout; - uin = (udstruct *) luaL_checkudata(L, 1, M_PDFDoc); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - if (((PdfDocument *) uin->d)->doc->getXRef()->isOk()) { - uout = new_Object_userdata(L); - uout->d = new Object(); - *((Object *) uout->d) = ((PdfDocument *) uin->d)->doc->getDocInfoNF(); - uout->atype = ALLOC_LEPDF; - uout->pc = uin->pc; - uout->pd = uin->pd; - } else - lua_pushnil(L); - return 1; -} - -m_PDFDoc_INT(getPDFMajorVersion); -m_PDFDoc_INT(getPDFMinorVersion); - -m_poppler__tostring(PDFDoc); - -static int m_PDFDoc__gc(lua_State * L) -{ - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_PDFDoc); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); -#ifdef DEBUG - printf("\n===== PDFDoc GC ===== file_path=<%s>\n", - ((PdfDocument *) uin->d)->file_path); -#endif - assert(uin->atype == ALLOC_LEPDF); - unrefPdfDocument(((PdfDocument *) uin->d)->file_path); - return 0; -} - -static const struct luaL_Reg PDFDoc_m[] = { - {"isOk", m_PDFDoc_isOk}, - {"getErrorCode", m_PDFDoc_getErrorCode}, - {"getErrorCodeName", m_PDFDoc_getErrorCodeName}, // not poppler - {"getFileName", m_PDFDoc_getFileName}, - {"getXRef", m_PDFDoc_getXRef}, - {"getCatalog", m_PDFDoc_getCatalog}, - // {"getBaseStream", m_PDFDoc_getBaseStream}, - {"getPageMediaWidth", m_PDFDoc_getPageMediaWidth}, - {"getPageMediaHeight", m_PDFDoc_getPageMediaHeight}, - {"getPageCropWidth", m_PDFDoc_getPageCropWidth}, - {"getPageCropHeight", m_PDFDoc_getPageCropHeight}, - {"getNumPages", m_PDFDoc_getNumPages}, - {"readMetadata", m_PDFDoc_readMetadata}, - {"getStructTreeRoot", m_PDFDoc_getStructTreeRoot}, - {"findPage", m_PDFDoc_findPage}, - {"getLinks", m_PDFDoc_getLinks}, - {"findDest", m_PDFDoc_findDest}, - {"isEncrypted", m_PDFDoc_isEncrypted}, - {"okToPrint", m_PDFDoc_okToPrint}, - {"okToChange", m_PDFDoc_okToChange}, - {"okToCopy", m_PDFDoc_okToCopy}, - {"okToAddNotes", m_PDFDoc_okToAddNotes}, - {"isLinearized", m_PDFDoc_isLinearized}, - {"getDocInfo", m_PDFDoc_getDocInfo}, - {"getDocInfoNF", m_PDFDoc_getDocInfoNF}, - {"getPDFMajorVersion", m_PDFDoc_getPDFMajorVersion}, - {"getPDFMinorVersion", m_PDFDoc_getPDFMinorVersion}, - {"__tostring", m_PDFDoc__tostring}, - {"__gc", m_PDFDoc__gc}, // finalizer - {NULL, NULL} // sentinel -}; - -//********************************************************************** -// PDFRectangle - -m_poppler_get_BOOL(PDFRectangle, isValid); - -m_poppler__tostring(PDFRectangle); - -static int m_PDFRectangle__index(lua_State * L) -{ - const char *s; - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_PDFRectangle); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - s = luaL_checkstring(L, 2); - if (strlen(s) == 2) { - if (s[0] == 'x') { - if (s[1] == '1') - lua_pushnumber(L, ((PDFRectangle *) uin->d)->x1); /* float */ - else if (s[1] == '2') - lua_pushnumber(L, ((PDFRectangle *) uin->d)->x2); /* float */ - else - lua_pushnil(L); - } else if (s[0] == 'y') { - if (s[1] == '1') - lua_pushnumber(L, ((PDFRectangle *) uin->d)->y1); /* float */ - else if (s[1] == '2') - lua_pushnumber(L, ((PDFRectangle *) uin->d)->y2); /* float */ - else - lua_pushnil(L); - } else - lua_pushnil(L); - } else - lua_pushnil(L); - return 1; -} - -static int m_PDFRectangle__newindex(lua_State * L) -{ - double d; - const char *s; - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_PDFRectangle); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - s = luaL_checkstring(L, 2); - d = luaL_checknumber(L, 3); - if (strlen(s) == 2) { - if (s[0] == 'x') { - if (s[1] == '1') - ((PDFRectangle *) uin->d)->x1 = d; - else if (s[1] == '2') - ((PDFRectangle *) uin->d)->x2 = d; - else - luaL_error(L, "wrong PDFRectangle coordinate (%s)", s); - } else if (s[0] == 'y') { - if (s[1] == '1') - ((PDFRectangle *) uin->d)->y1 = d; - else if (s[1] == '2') - ((PDFRectangle *) uin->d)->y2 = d; - } else - luaL_error(L, "wrong PDFRectangle coordinate (%s)", s); - } else - luaL_error(L, "wrong PDFRectangle coordinate (%s)", s); - return 0; -} - -static int m_PDFRectangle__gc(lua_State * L) -{ - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_PDFRectangle); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); -#ifdef DEBUG - printf("\n===== PDFRectangle GC ===== uin=<%p>\n", uin); -#endif - if (uin->atype == ALLOC_LEPDF) - delete(PDFRectangle *) uin->d; - return 0; -} - -static const struct luaL_Reg PDFRectangle_m[] = { - {"isValid", m_PDFRectangle_isValid}, - {"__index", m_PDFRectangle__index}, - {"__newindex", m_PDFRectangle__newindex}, - {"__tostring", m_PDFRectangle__tostring}, - {"__gc", m_PDFRectangle__gc}, - {NULL, NULL} // sentinel -}; - -//********************************************************************** -// Ref - -static int m_Ref__index(lua_State * L) -{ - const char *s; - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_Ref); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - s = luaL_checkstring(L, 2); - if (strcmp(s, "num") == 0) - lua_pushinteger(L, ((Ref *) uin->d)->num); - else if (strcmp(s, "gen") == 0) - lua_pushinteger(L, ((Ref *) uin->d)->gen); - else - lua_pushnil(L); - return 1; -} - -m_poppler__tostring(Ref); - -static int m_Ref__gc(lua_State * L) -{ - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_Ref); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); -#ifdef DEBUG - printf("\n===== Ref GC ===== uin=<%p>\n", uin); -#endif - if (uin->atype == ALLOC_LEPDF && ((Ref *) uin->d) != NULL) - gfree(((Ref *) uin->d)); - return 0; -} - -static const struct luaL_Reg Ref_m[] = { - {"__index", m_Ref__index}, - {"__tostring", m_Ref__tostring}, - {"__gc", m_Ref__gc}, // finalizer - {NULL, NULL} // sentinel -}; - -//********************************************************************** -// Stream - -static const char *StreamKindNames[] = - { "File", "ASCIIHex", "ASCII85", "LZW", "RunLength", "CCITTFax", "DCT", - "Flate", "JBIG2", "JPX", "Weird", NULL -}; - -m_poppler_get_INT(Stream, getKind); - -static int m_Stream_getKindName(lua_State * L) -{ - StreamKind t; - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_Stream); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - t = ((Stream *) uin->d)->getKind(); - lua_pushstring(L, StreamKindNames[t]); - return 1; -} - -m_poppler_do(Stream, reset); -m_poppler_do(Stream, close); -m_poppler_get_INT(Stream, getChar); -m_poppler_get_INT(Stream, lookChar); -m_poppler_get_INT(Stream, getRawChar); -m_poppler_get_INT(Stream, getUnfilteredChar); -m_poppler_do(Stream, unfilteredReset); -m_poppler_get_INT(Stream, getPos); -m_poppler_get_BOOL(Stream, isBinary); -m_poppler_get_poppler(Stream, Stream, getUndecodedStream); -m_poppler_get_poppler(Stream, Dict, getDict); - -m_poppler__tostring(Stream); - -static const struct luaL_Reg Stream_m[] = { - {"getKind", m_Stream_getKind}, - {"getKindName", m_Stream_getKindName}, // not poppler - {"reset", m_Stream_reset}, - {"close", m_Stream_close}, - {"getUndecodedStream", m_Stream_getUndecodedStream}, - {"getChar", m_Stream_getChar}, - {"lookChar", m_Stream_lookChar}, - {"getRawChar", m_Stream_getRawChar}, - {"getUnfilteredChar", m_Stream_getUnfilteredChar}, - {"unfilteredReset", m_Stream_unfilteredReset}, - // {"getLine", m_Stream_getLine}, - {"getPos", m_Stream_getPos}, - {"isBinary", m_Stream_isBinary}, - {"getUndecodedStream", m_Stream_getUndecodedStream}, - {"getDict", m_Stream_getDict}, - {"__tostring", m_Stream__tostring}, - {NULL, NULL} // sentinel -}; - -//********************************************************************** -// TextSpan - -m_poppler_get_GOOSTRING(TextSpan, getText); -m_poppler__tostring(TextSpan); - -static const struct luaL_Reg TextSpan_m[] = { - {"getText", m_TextSpan_getText}, - {"__tostring", m_TextSpan__tostring}, - {NULL, NULL} // sentinel -}; - - - - -//********************************************************************** -// Attribute -m_poppler_get_BOOL(Attribute,isOk); -m_poppler_get_INT(Attribute,getType); -m_poppler_get_INT(Attribute,getOwner); -m_poppler_get_GOOSTRING(Attribute,getName); - -static int m_Attribute_getTypeName(lua_State * L) -{ - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_Attribute); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - lua_pushstring(L, ((Attribute *) uin->d)->getTypeName()); - return 1; -} - -static int m_Attribute_getOwnerName(lua_State * L) -{ - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_Attribute); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - lua_pushstring(L, ((Attribute *) uin->d)->getOwnerName()); - return 1; -} - -static int m_Attribute_getValue(lua_State * L) -{ - udstruct *uin, *uout; - Object *origin; - uin = (udstruct *) luaL_checkudata(L, 1, M_Attribute); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - uout = new_Object_userdata(L); - uout->d = new Object(); - origin = (Object *) (((Attribute *) uin->d)->getValue()); - *((Object *) uout->d) = origin->copy(); - uout->atype = ALLOC_LEPDF; - uout->pc = uin->pc; - uout->pd = uin->pd; - return 1; -} - - -static int m_Attribute_getDefaultValue(lua_State * L) -{ - Attribute::Type t; - udstruct *uin, *uout; - uin = (udstruct *) luaL_checkudata(L, 1, M_Attribute); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - t = (Attribute::Type) luaL_checkint(L, 2); - uout = new_Object_userdata(L); - uout->d = ((Attribute *)uin->d)->getDefaultValue(t) ; - //uout->atype = ALLOC_LEPDF; - uout->pc = uin->pc; - uout->pd = uin->pd; - return 1; -} - - -m_poppler_get_GUINT(Attribute,getRevision); - -static int m_Attribute_setRevision(lua_State * L) -{ - Guint i; - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_Attribute); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - i = (Guint) luaL_checkint(L, 2); - ((Attribute *) uin->d)->setRevision(i); - return 0; -} - -m_poppler_get_BOOL(Attribute, isHidden); - -static int m_Attribute_setHidden(lua_State * L) -{ - GBool i; - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_Attribute); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - i = (GBool) lua_toboolean(L, 2); - ((Attribute *) uin->d)->setHidden(i); - return 0; -} - -static int m_Attribute_getFormattedValue(lua_State * L) -{ - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_Attribute); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - lua_pushstring(L, ((Attribute *) uin->d)->getFormattedValue()); - return 1; -} - - -static int m_Attribute_setFormattedValue(lua_State * L) -{ - const char *c; - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_Attribute); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - c = luaL_checkstring(L, 2); - ((Attribute *) uin->d)->setFormattedValue(c); - return 0; -} - -static int m_Attribute__gc(lua_State * L) -{ - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_Attribute); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); -#ifdef DEBUG - printf("\n===== Attribute GC ===== uin=<%p>\n", uin); -#endif - if (uin->atype == ALLOC_LEPDF) { - delete(Attribute *) uin->d; - } - return 0; -} - - -m_poppler__tostring(Attribute); - - -static const struct luaL_Reg Attribute_m[] = { - {"isOk",m_Attribute_isOk}, - {"getType",m_Attribute_getType}, - {"getOwner",m_Attribute_getOwner}, - {"getTypeName",m_Attribute_getTypeName}, - {"getOwnerName",m_Attribute_getOwnerName}, - {"getValue",m_Attribute_getValue}, - {"getDefaultValue",m_Attribute_getDefaultValue}, - {"getName",m_Attribute_getName}, - {"getRevision",m_Attribute_getRevision}, - {"setRevision",m_Attribute_setRevision}, - {"istHidden",m_Attribute_isHidden}, - {"setHidden",m_Attribute_setHidden}, - {"getFormattedValue",m_Attribute_getFormattedValue}, - {"setFormattedValue",m_Attribute_setFormattedValue}, - {"__gc", m_Attribute__gc}, - {"__tostring", m_Attribute__tostring}, - {NULL, NULL} // sentinel -}; - - - - -//********************************************************************** -// StructElement - - -m_poppler_get_INT(StructElement,getType); -m_poppler_get_BOOL(StructElement,isOk); -m_poppler_get_BOOL(StructElement,isBlock); -m_poppler_get_BOOL(StructElement,isInline); -m_poppler_get_BOOL(StructElement,isGrouping); -m_poppler_get_BOOL(StructElement,isContent); -m_poppler_get_BOOL(StructElement,isObjectRef); -m_poppler_get_BOOL(StructElement,hasPageRef); -m_poppler_get_INT(StructElement,getMCID); -m_poppler_get_INT(StructElement, getNumChildren); - -m_poppler_get_GUINT(StructElement,getRevision); -m_poppler_get_UINT(StructElement,getNumAttributes); - -m_poppler_get_GOOSTRING(StructElement, getID); -m_poppler_get_GOOSTRING(StructElement, getLanguage); -m_poppler_get_GOOSTRING(StructElement, getTitle); -m_poppler_get_GOOSTRING(StructElement, getExpandedAbbr); -m_poppler_get_GOOSTRING(StructElement, getAltText); -m_poppler_get_GOOSTRING(StructElement, getActualText); - -m_poppler_get_poppler(StructElement, StructTreeRoot, getStructTreeRoot); -m_poppler__tostring(StructElement); - - -static int m_StructElement_getObjectRef(lua_State * L) -{ - udstruct *uin, *uout; - uin = (udstruct *) luaL_checkudata(L, 1, M_StructElement); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - uout = new_Ref_userdata(L); - uout->d = (Ref *) gmalloc(sizeof(Ref)); - ((Ref *) uout->d)->num = ((StructElement *) uin->d)->getObjectRef().num; - ((Ref *) uout->d)->gen = ((StructElement *) uin->d)->getObjectRef().gen; - uout->atype = ALLOC_LEPDF; - uout->pc = uin->pc; - uout->pd = uin->pd; - return 1; -} - - -static int m_StructElement_getParentRef(lua_State * L) -{ - udstruct *uin, *uout; - uin = (udstruct *) luaL_checkudata(L, 1, M_StructElement); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - uout = new_Ref_userdata(L); - uout->d = (Ref *) gmalloc(sizeof(Ref)); - ((Ref *) uout->d)->num = ((StructElement *) uin->d)->getParentRef().num; - ((Ref *) uout->d)->gen = ((StructElement *) uin->d)->getParentRef().gen; - uout->atype = ALLOC_LEPDF; - uout->pc = uin->pc; - uout->pd = uin->pd; - return 1; -} - -// Not exactly as the header: -// Ref = StructElement:getPageRef() -// Ref is false if the C++ functione return false -static int m_StructElement_getPageRef(lua_State * L) -{ - GBool b; - Ref *r; - udstruct *uin, *uout; - uin = (udstruct *) luaL_checkudata(L, 1, M_StructElement); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - r = (Ref *) gmalloc(sizeof(Ref)); - b = ((StructElement *) uin->d)->getPageRef( *r ); - if (b) { - uout = new_Ref_userdata(L); - uout->d = r ; - //uout->atype = ALLOC_LEPDF; - uout->pc = uin->pc; - uout->pd = uin->pd; - } else - lua_pushboolean(L,0); - return 1; -} - - - -static int m_StructElement_getTypeName(lua_State * L) -{ - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_StructElement); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - lua_pushstring(L, ((StructElement *) uin->d)->getTypeName()); - return 1; -} - - -static int m_StructElement_setRevision(lua_State * L) -{ - Guint i; - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_StructElement); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - i = (Guint) luaL_checkint(L, 2); - ((StructElement *) uin->d)->setRevision(i); - return 0; -} - -static int m_StructElement_getText(lua_State * L) -{ - GBool i; - GooString *gs; - udstruct *uin; - uin = (udstruct *) luaL_checkudata(L, 1, M_StructElement); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - i = (GBool) lua_toboolean(L, 2); - gs = ((StructElement *) uin->d)->getText(i); - if (gs != NULL) - lua_pushlstring(L, gs->getCString(), gs->getLength()); - else - lua_pushnil(L); - return 1; -} - - -static int m_StructElement_getChild(lua_State * L) -{ - StructElement *c; - int i; - udstruct *uin, *uout; - uin = (udstruct *) luaL_checkudata(L, 1, M_StructElement); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - i = (int) luaL_checkint(L, 2); - c = ((StructElement *) uin->d)->getChild(i-1); - if (c != NULL) { - uout = new_StructElement_userdata(L); - uout->d = c ; - //uout->atype = ALLOC_LEPDF; - uout->pc = uin->pc; - uout->pd = uin->pd; - } - else - lua_pushnil(L); - return 1; -} - - -static int m_StructElement_appendChild(lua_State * L) -{ - udstruct *uin, *uin1; - uin = (udstruct *) luaL_checkudata(L, 1, M_StructElement); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - uin1 = (udstruct *) luaL_checkudata(L, 2, M_StructElement); - if (uin1->pd != NULL && uin1->pd->pc != uin1->pc) - pdfdoc_changed_error(L); - ((StructElement *) uin->d)->appendChild( (StructElement *)uin1->d ); - return 0; -} - - -static int m_StructElement_getAttribute(lua_State * L) -{ - Attribute *a; - int i; - udstruct *uin, *uout; - uin = (udstruct *) luaL_checkudata(L, 1, M_StructElement); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - i = (int) luaL_checkint(L, 2); - a = ((StructElement *) uin->d)->getAttribute(i-1); - if (a != NULL) { - uout = new_Attribute_userdata(L); - uout->d = a ; - uout->pc = uin->pc; - uout->pd = uin->pd; - } - else - lua_pushnil(L); - return 1; -} - - - -static int m_StructElement_appendAttribute(lua_State * L) -{ - - udstruct *uin, *uin1; - uin = (udstruct *) luaL_checkudata(L, 1, M_StructElement); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - uin1 = (udstruct *) luaL_checkudata(L, 2, M_Attribute); - if (uin1->pd != NULL && uin1->pd->pc != uin1->pc) - pdfdoc_changed_error(L); - ((StructElement *) uin->d)->appendAttribute( (Attribute *)uin1->d ); - return 0; -} - - -static int m_StructElement_findAttribute(lua_State * L) -{ - Attribute::Type t; - Attribute::Owner o; - GBool g; - udstruct *uin, *uout; - const Attribute *a; - uin = (udstruct *) luaL_checkudata(L, 1, M_StructElement); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - t = (Attribute::Type) luaL_checkint(L,1); - o = (Attribute::Owner) luaL_checkint(L,2); - g = (GBool) lua_toboolean(L, 3); - a = ((StructElement *) uin->d)->findAttribute(t,g,o); - - if (a!=NULL){ - uout = new_Attribute_userdata(L); - uout->d = new Attribute(a->getType(),a->getValue()); - uout->atype = ALLOC_LEPDF; - uout->pc = uin->pc; - uout->pd = uin->pd; - } else - lua_pushnil(L); - return 1; -} - -// This returns a lua table -static int m_StructElement_getTextSpans(lua_State * L) -{ - int i ; - udstruct *uin, *uout; - uin = (udstruct *) luaL_checkudata(L, 1, M_StructElement); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - - if ((((StructElement *) uin->d)->getTextSpans()).size()>0) { - lua_createtable (L, - (int) (((StructElement *) uin->d)->getTextSpans()).size(), - 0); - for(i=0;i<(int) (((StructElement *) uin->d)->getTextSpans()).size(); i++){ - uout = new_TextSpan_userdata(L); - uout->d = new TextSpan( (((StructElement *) uin->d)->getTextSpans())[i] ); - uout->atype = ALLOC_LEPDF; - uout->pc = uin->pc; - uout->pd = uin->pd; - lua_rawseti(L,-2,i+1); - } - } else - lua_pushnil(L); - return 1; -} - - - -static const struct luaL_Reg StructElement_m[] = { - {"getTypeName", m_StructElement_getTypeName}, - {"getType",m_StructElement_getType}, - {"isOk",m_StructElement_isOk}, - {"isBlock",m_StructElement_isBlock}, - {"isInline",m_StructElement_isInline}, - {"isGrouping",m_StructElement_isGrouping}, - {"isContent",m_StructElement_isContent}, - {"isObjectRef",m_StructElement_isObjectRef}, - {"getMCID",m_StructElement_getMCID}, - {"getObjectRef",m_StructElement_getObjectRef}, - {"getParentRef",m_StructElement_getParentRef}, - {"hasPageRef",m_StructElement_hasPageRef}, - {"getPageRef",m_StructElement_getPageRef}, - {"getStructTreeRoot",m_StructElement_getStructTreeRoot}, - {"getID",m_StructElement_getID}, - {"getLanguage",m_StructElement_getLanguage}, - {"getRevision",m_StructElement_getRevision}, - {"setRevision",m_StructElement_setRevision}, - {"getTitle",m_StructElement_getTitle}, - {"getExpandedAbbr",m_StructElement_getExpandedAbbr}, - {"getNumChildren",m_StructElement_getNumChildren}, - {"getChild",m_StructElement_getChild}, - {"appendChild",m_StructElement_appendChild}, - {"getNumAttributes",m_StructElement_getNumAttributes}, - {"getAttribute",m_StructElement_getAttribute}, - {"appendAttribute",m_StructElement_appendAttribute}, - {"findAttribute",m_StructElement_findAttribute}, - {"getAltText",m_StructElement_getAltText}, - {"getActualText",m_StructElement_getActualText}, - {"getText",m_StructElement_getText}, - {"getTextSpans",m_StructElement_getTextSpans}, - {"__tostring", m_StructElement__tostring}, - {NULL, NULL} // sentinel -}; - - -//********************************************************************** -// StructTreeRoot - -m_poppler_get_INT(StructTreeRoot, getNumChildren); -m_poppler_get_poppler(StructTreeRoot, PDFDoc, getDoc); -m_poppler_get_poppler(StructTreeRoot, Dict, getRoleMap); -m_poppler_get_poppler(StructTreeRoot, Dict, getClassMap); -m_poppler__tostring(StructTreeRoot); - -static int m_StructTreeRoot_getChild(lua_State * L) -{ - unsigned int i; - udstruct *uin, *uout; - StructElement *child ; - StructTreeRoot *root ; - - uin = (udstruct *) luaL_checkudata(L, 1, M_StructTreeRoot); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - i = (unsigned) luaL_checkint(L, 2); - root = (StructTreeRoot *) uin->d; - if (i-1 < root->getNumChildren() ){ - child = root->getChild(i-1); - uout = new_StructElement_userdata(L); - uout->d = child; - //uout->atype = ALLOC_LEPDF; - uout->pc = uin->pc; - uout->pd = uin->pd; - } else - lua_pushnil(L); - return 1; -} - -static int m_StructTreeRoot_appendChild(lua_State * L) -{ - udstruct *uin, *uin_child; - StructElement *child ; - StructTreeRoot *root ; - uin = (udstruct *) luaL_checkudata(L, 1, M_StructTreeRoot); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - uin_child = (udstruct *) luaL_checkudata(L, 2, M_StructElement); - if (uin_child->pd != NULL && uin_child->pd->pc != uin_child->pc) - pdfdoc_changed_error(L); - root = (StructTreeRoot *) uin->d; - child = (StructElement *) uin_child->d; - root->appendChild(child); - return 0; -} - - -static int m_StructTreeRoot_findParentElement(lua_State * L) -{ - unsigned int i; - udstruct *uin, *uout; - const StructElement *parent ; - StructTreeRoot *root ; - - uin = (udstruct *) luaL_checkudata(L, 1, M_StructTreeRoot); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - i = (unsigned) luaL_checkint(L, 2); - root = (StructTreeRoot *) uin->d; - parent = root->findParentElement(i-1); - if (parent != NULL) { - uout = new_StructElement_userdata(L); - // see https://isocpp.org/wiki/faq/const-correctness#aliasing-and-const - uout->d = (StructElement *) parent; - uout->atype = ALLOC_LEPDF; - uout->pc = uin->pc; - uout->pd = uin->pd; - } else - lua_pushnil(L); - return 1; -} - - -static const struct luaL_Reg StructTreeRoot_m[] = { - {"getDoc",m_StructTreeRoot_getDoc}, - {"getRoleMap",m_StructTreeRoot_getRoleMap}, - {"getClassMap",m_StructTreeRoot_getClassMap}, - {"getNumChildren",m_StructTreeRoot_getNumChildren}, - {"getChild",m_StructTreeRoot_getChild}, - {"appendChild",m_StructTreeRoot_appendChild}, - {"findParentElement",m_StructTreeRoot_findParentElement}, - {"__tostring", m_StructTreeRoot__tostring}, - {NULL, NULL} // sentinel -}; - -//********************************************************************** -// XRef - -m_poppler_get_BOOL(XRef, isOk); -m_poppler_get_INT(XRef, getErrorCode); -m_poppler_get_BOOL(XRef, isEncrypted); -m_poppler_get_BOOL(XRef, okToPrint); -m_poppler_get_BOOL(XRef, okToPrintHighRes); -m_poppler_get_BOOL(XRef, okToChange); -m_poppler_get_BOOL(XRef, okToCopy); -m_poppler_get_BOOL(XRef, okToAddNotes); -m_poppler_get_BOOL(XRef, okToFillForm); -m_poppler_get_BOOL(XRef, okToAccessibility); -m_poppler_get_BOOL(XRef, okToAssemble); -m_poppler_get_OBJECT(XRef, getCatalog); - -static int m_XRef_fetch(lua_State * L) -{ - int num, gen; - udstruct *uin, *uout; - uin = (udstruct *) luaL_checkudata(L, 1, M_XRef); - if (uin->pd != NULL && uin->pd->pc != uin->pc) - pdfdoc_changed_error(L); - num = luaL_checkint(L, 2); - gen = luaL_checkint(L, 3); - uout = new_Object_userdata(L); - uout->d = new Object(); - *((Object *) uout->d) = ((XRef *) uin->d)->fetch(num, gen); - uout->atype = ALLOC_LEPDF; - uout->pc = uin->pc; - uout->pd = uin->pd; - return 1; -} - -m_poppler_get_OBJECT(XRef, getDocInfo); -m_poppler_get_OBJECT(XRef, getDocInfoNF); -m_poppler_get_INT(XRef, getNumObjects); -m_poppler_get_INT(XRef, getRootNum); -m_poppler_get_INT(XRef, getRootGen); -// getStreamEnd - -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); - -static const struct luaL_Reg XRef_m[] = { - {"isOk", m_XRef_isOk}, - {"getErrorCode", m_XRef_getErrorCode}, - {"isEncrypted", m_XRef_isEncrypted}, - {"okToPrint", m_XRef_okToPrint}, - {"okToPrintHighRes", m_XRef_okToPrintHighRes}, - {"okToChange", m_XRef_okToChange}, - {"okToCopy", m_XRef_okToCopy}, - {"okToAddNotes", m_XRef_okToAddNotes}, - {"okToFillForm", m_XRef_okToFillForm}, - {"okToAccessibility", m_XRef_okToAccessibility}, - {"okToAssemble", m_XRef_okToAssemble}, - {"getCatalog", m_XRef_getCatalog}, - {"fetch", m_XRef_fetch}, - {"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 -}; - -//********************************************************************** -// XRefEntry - -m_poppler__tostring(XRefEntry); - -static const struct luaL_Reg XRefEntry_m[] = { - {"__tostring", m_XRefEntry__tostring}, - {NULL, NULL} // sentinel -}; - -//********************************************************************** - -#ifdef LuajitTeX -#define setfuncs_meta(type) \ - luaL_newmetatable(L, M_##type); \ - lua_pushvalue(L, -1); \ - lua_setfield(L, -2, "__index"); \ - lua_pushstring(L, "no user access"); \ - lua_setfield(L, -2, "__metatable"); \ - luaL_openlib(L, NULL, type##_m, 0) -#else -#define setfuncs_meta(type) \ - luaL_newmetatable(L, M_##type); \ - lua_pushvalue(L, -1); \ - lua_setfield(L, -2, "__index"); \ - lua_pushstring(L, "no user access"); \ - lua_setfield(L, -2, "__metatable"); \ - luaL_setfuncs(L, type##_m, 0) -#endif - -int luaopen_epdf(lua_State * L) -{ - setfuncs_meta(Annot); - setfuncs_meta(Annots); - setfuncs_meta(Array); - setfuncs_meta(Catalog); - setfuncs_meta(Dict); - setfuncs_meta(EmbFile); - setfuncs_meta(FileSpec); - setfuncs_meta(GooString); - setfuncs_meta(LinkDest); - setfuncs_meta(Links); - setfuncs_meta(Object); - setfuncs_meta(Page); - setfuncs_meta(PDFDoc); - setfuncs_meta(PDFRectangle); - setfuncs_meta(Ref); - setfuncs_meta(Stream); - setfuncs_meta(Attribute); - setfuncs_meta(StructElement); - setfuncs_meta(StructTreeRoot); - setfuncs_meta(TextSpan); - setfuncs_meta(XRef); - setfuncs_meta(XRefEntry); - luaL_openlib(L, "epdf", epdflib_f, 0); - return 1; -} |