poppler/CurlPDFDocBuilder.cc | 5 +++-- poppler/CurlPDFDocBuilder.h | 3 ++- poppler/LocalPDFDocBuilder.cc | 7 ++++--- poppler/LocalPDFDocBuilder.h | 3 ++- poppler/PDFDoc.cc | 6 ++++-- poppler/PDFDoc.h | 4 ++-- poppler/PDFDocBuilder.h | 5 ++++- poppler/PDFDocFactory.cc | 4 ++-- poppler/PDFDocFactory.h | 6 ++++-- poppler/StdinPDFDocBuilder.cc | 5 +++-- poppler/StdinPDFDocBuilder.h | 3 ++- utils/pdfdetach.cc | 5 ++--- utils/pdfimages.cc | 30 +++++++++--------------------- utils/pdfinfo.cc | 11 +++++------ utils/pdftocairo.cc | 10 ++++------ utils/pdftohtml.cc | 11 ++++------- utils/pdftoppm.cc | 39 +++++++++++++++------------------------ utils/pdftops.cc | 30 ++++++++++++++---------------- utils/pdftotext.cc | 9 ++++----- 19 files changed, 89 insertions(+), 107 deletions(-)
New commits: commit 33ae035d03e56e4f37ebb33ac109bbb71084dc93 Author: Oliver Sander <[email protected]> Date: Thu Feb 11 20:22:36 2021 +0100 Make PDFDocBuilder return a std::unique_ptr This make the memory ownership cleaner, and allows to simplify a bit of error handling code in the `utils` directory. diff --git a/poppler/CurlPDFDocBuilder.cc b/poppler/CurlPDFDocBuilder.cc index 3a3f6c50..367a5b4f 100644 --- a/poppler/CurlPDFDocBuilder.cc +++ b/poppler/CurlPDFDocBuilder.cc @@ -6,6 +6,7 @@ // // Copyright 2010 Hib Eris <[email protected]> // Copyright 2010, 2017 Albert Astals Cid <[email protected]> +// Copyright 2021 Oliver Sander <[email protected]> // //======================================================================== @@ -21,7 +22,7 @@ // CurlPDFDocBuilder //------------------------------------------------------------------------ -PDFDoc *CurlPDFDocBuilder::buildPDFDoc(const GooString &uri, GooString *ownerPassword, GooString *userPassword, void *guiDataA) +std::unique_ptr<PDFDoc> CurlPDFDocBuilder::buildPDFDoc(const GooString &uri, GooString *ownerPassword, GooString *userPassword, void *guiDataA) { CachedFile *cachedFile = new CachedFile(new CurlCachedFileLoader(), uri.copy()); @@ -32,7 +33,7 @@ PDFDoc *CurlPDFDocBuilder::buildPDFDoc(const GooString &uri, GooString *ownerPas BaseStream *str = new CachedFileStream(cachedFile, 0, false, cachedFile->getLength(), Object(objNull)); - return new PDFDoc(str, ownerPassword, userPassword, guiDataA); + return std::make_unique<PDFDoc>(str, ownerPassword, userPassword, guiDataA); } bool CurlPDFDocBuilder::supports(const GooString &uri) diff --git a/poppler/CurlPDFDocBuilder.h b/poppler/CurlPDFDocBuilder.h index 4a81f9f9..601f0304 100644 --- a/poppler/CurlPDFDocBuilder.h +++ b/poppler/CurlPDFDocBuilder.h @@ -6,6 +6,7 @@ // // Copyright 2010 Hib Eris <[email protected]> // Copyright 2010, 2018 Albert Astals Cid <[email protected]> +// Copyright 2021 Oliver Sander <[email protected]> // //======================================================================== @@ -24,7 +25,7 @@ class CurlPDFDocBuilder : public PDFDocBuilder { public: - PDFDoc *buildPDFDoc(const GooString &uri, GooString *ownerPassword = nullptr, GooString *userPassword = nullptr, void *guiDataA = nullptr) override; + std::unique_ptr<PDFDoc> buildPDFDoc(const GooString &uri, GooString *ownerPassword = nullptr, GooString *userPassword = nullptr, void *guiDataA = nullptr) override; bool supports(const GooString &uri) override; }; diff --git a/poppler/LocalPDFDocBuilder.cc b/poppler/LocalPDFDocBuilder.cc index b76a83c8..9aab08eb 100644 --- a/poppler/LocalPDFDocBuilder.cc +++ b/poppler/LocalPDFDocBuilder.cc @@ -6,6 +6,7 @@ // // Copyright 2010 Hib Eris <[email protected]> // Copyright 2010 Albert Astals Cid <[email protected]> +// Copyright 2021 Oliver Sander <[email protected]> // //======================================================================== @@ -17,15 +18,15 @@ // LocalPDFDocBuilder //------------------------------------------------------------------------ -PDFDoc *LocalPDFDocBuilder::buildPDFDoc(const GooString &uri, GooString *ownerPassword, GooString *userPassword, void *guiDataA) +std::unique_ptr<PDFDoc> LocalPDFDocBuilder::buildPDFDoc(const GooString &uri, GooString *ownerPassword, GooString *userPassword, void *guiDataA) { if (uri.cmpN("file://", 7) == 0) { GooString *fileName = uri.copy(); fileName->del(0, 7); - return new PDFDoc(fileName, ownerPassword, userPassword, guiDataA); + return std::make_unique<PDFDoc>(fileName, ownerPassword, userPassword, guiDataA); } else { GooString *fileName = uri.copy(); - return new PDFDoc(fileName, ownerPassword, userPassword, guiDataA); + return std::make_unique<PDFDoc>(fileName, ownerPassword, userPassword, guiDataA); } } diff --git a/poppler/LocalPDFDocBuilder.h b/poppler/LocalPDFDocBuilder.h index ec3f6648..f82bdf63 100644 --- a/poppler/LocalPDFDocBuilder.h +++ b/poppler/LocalPDFDocBuilder.h @@ -6,6 +6,7 @@ // // Copyright 2010 Hib Eris <[email protected]> // Copyright 2010, 2018 Albert Astals Cid <[email protected]> +// Copyright 2021 Oliver Sander <[email protected]> // //======================================================================== @@ -24,7 +25,7 @@ class LocalPDFDocBuilder : public PDFDocBuilder { public: - PDFDoc *buildPDFDoc(const GooString &uri, GooString *ownerPassword = nullptr, GooString *userPassword = nullptr, void *guiDataA = nullptr) override; + std::unique_ptr<PDFDoc> buildPDFDoc(const GooString &uri, GooString *ownerPassword = nullptr, GooString *userPassword = nullptr, void *guiDataA = nullptr) override; bool supports(const GooString &uri) override; }; diff --git a/poppler/PDFDoc.cc b/poppler/PDFDoc.cc index 6f7b8052..ca440ca1 100644 --- a/poppler/PDFDoc.cc +++ b/poppler/PDFDoc.cc @@ -46,6 +46,7 @@ // Copyright (C) 2020 Nelson Benítez León <[email protected]> // Copyright (C) 2020 Thorsten Behrens <[email protected]> // Copyright (C) 2020 Adam Sampson <[email protected]> +// Copyright (C) 2021 Oliver Sander <[email protected]> // // To see a description of the changes please see the Changelog file that // came with your tarball or type make ChangeLog if you are building from git @@ -1937,13 +1938,14 @@ Outline *PDFDoc::getOutline() return outline; } -PDFDoc *PDFDoc::ErrorPDFDoc(int errorCode, const GooString *fileNameA) +std::unique_ptr<PDFDoc> PDFDoc::ErrorPDFDoc(int errorCode, const GooString *fileNameA) { + // We cannot call std::make_unique here because the PDFDoc constructor is private PDFDoc *doc = new PDFDoc(); doc->errCode = errorCode; doc->fileName = fileNameA; - return doc; + return std::unique_ptr<PDFDoc>(doc); } long long PDFDoc::strToLongLong(const char *s) diff --git a/poppler/PDFDoc.h b/poppler/PDFDoc.h index 0faef013..5ab1fb21 100644 --- a/poppler/PDFDoc.h +++ b/poppler/PDFDoc.h @@ -32,7 +32,7 @@ // Copyright (C) 2016 Jakub Alba <[email protected]> // Copyright (C) 2018 Klarälvdalens Datakonsult AB, a KDAB Group company, <[email protected]>. Work sponsored by the LiMux project of the city of Munich // Copyright (C) 2018 Evangelos Rigas <[email protected]> -// Copyright (C) 2020 Oliver Sander <[email protected]> +// Copyright (C) 2020, 2021 Oliver Sander <[email protected]> // Copyright (C) 2020 Nelson Benítez León <[email protected]> // // To see a description of the changes please see the Changelog file that @@ -132,7 +132,7 @@ public: PDFDoc(const PDFDoc &) = delete; PDFDoc &operator=(const PDFDoc &) = delete; - static PDFDoc *ErrorPDFDoc(int errorCode, const GooString *fileNameA = nullptr); + static std::unique_ptr<PDFDoc> ErrorPDFDoc(int errorCode, const GooString *fileNameA = nullptr); // Was PDF document successfully opened? bool isOk() const { return ok; } diff --git a/poppler/PDFDocBuilder.h b/poppler/PDFDocBuilder.h index a0c19fc1..a9231f01 100644 --- a/poppler/PDFDocBuilder.h +++ b/poppler/PDFDocBuilder.h @@ -6,12 +6,15 @@ // // Copyright 2010 Hib Eris <[email protected]> // Copyright 2010, 2018, 2020 Albert Astals Cid <[email protected]> +// Copyright 2021 Oliver Sander <[email protected]> // //======================================================================== #ifndef PDFDOCBUILDER_H #define PDFDOCBUILDER_H +#include <memory> + #include "PDFDoc.h" class GooString; @@ -35,7 +38,7 @@ public: // Builds a new PDFDoc. Returns a PDFDoc. You should check this PDFDoc // with PDFDoc::isOk() for failures. // The caller is responsible for deleting ownerPassword, userPassWord and guiData. - virtual PDFDoc *buildPDFDoc(const GooString &uri, GooString *ownerPassword = nullptr, GooString *userPassword = nullptr, void *guiDataA = nullptr) = 0; + virtual std::unique_ptr<PDFDoc> buildPDFDoc(const GooString &uri, GooString *ownerPassword = nullptr, GooString *userPassword = nullptr, void *guiDataA = nullptr) = 0; // Returns true if the builder supports building a PDFDoc from the URI. virtual bool supports(const GooString &uri) = 0; diff --git a/poppler/PDFDocFactory.cc b/poppler/PDFDocFactory.cc index 51440c9f..e4797074 100644 --- a/poppler/PDFDocFactory.cc +++ b/poppler/PDFDocFactory.cc @@ -8,7 +8,7 @@ // Copyright 2010 Albert Astals Cid <[email protected]> // Copyright 2017 Adrian Johnson <[email protected]> // Copyright 2018 Adam Reichold <[email protected]> -// Copyright 2019 Oliver Sander <[email protected]> +// Copyright 2019, 2021 Oliver Sander <[email protected]> // //======================================================================== @@ -53,7 +53,7 @@ PDFDocFactory::~PDFDocFactory() } } -PDFDoc *PDFDocFactory::createPDFDoc(const GooString &uri, GooString *ownerPassword, GooString *userPassword, void *guiDataA) +std::unique_ptr<PDFDoc> PDFDocFactory::createPDFDoc(const GooString &uri, GooString *ownerPassword, GooString *userPassword, void *guiDataA) { for (int i = builders->size() - 1; i >= 0; i--) { PDFDocBuilder *builder = (*builders)[i]; diff --git a/poppler/PDFDocFactory.h b/poppler/PDFDocFactory.h index 3dd92394..92a66d7e 100644 --- a/poppler/PDFDocFactory.h +++ b/poppler/PDFDocFactory.h @@ -6,13 +6,15 @@ // // Copyright 2010 Hib Eris <[email protected]> // Copyright 2010, 2018 Albert Astals Cid <[email protected]> -// Copyright 2019 Oliver Sander <[email protected]> +// Copyright 2019, 2021 Oliver Sander <[email protected]> // //======================================================================== #ifndef PDFDOCFACTORY_H #define PDFDOCFACTORY_H +#include <memory> + #include "PDFDoc.h" class GooString; @@ -43,7 +45,7 @@ public: // Create a PDFDoc. Returns a PDFDoc. You should check this PDFDoc // with PDFDoc::isOk() for failures. // The caller is responsible for deleting ownerPassword, userPassWord and guiData. - PDFDoc *createPDFDoc(const GooString &uri, GooString *ownerPassword = nullptr, GooString *userPassword = nullptr, void *guiDataA = nullptr); + std::unique_ptr<PDFDoc> createPDFDoc(const GooString &uri, GooString *ownerPassword = nullptr, GooString *userPassword = nullptr, void *guiDataA = nullptr); // Extend supported URIs with the ones from the PDFDocBuilder. void registerPDFDocBuilder(PDFDocBuilder *pdfDocBuilder); diff --git a/poppler/StdinPDFDocBuilder.cc b/poppler/StdinPDFDocBuilder.cc index 9d7142b4..b84420b2 100644 --- a/poppler/StdinPDFDocBuilder.cc +++ b/poppler/StdinPDFDocBuilder.cc @@ -6,6 +6,7 @@ // // Copyright 2010 Hib Eris <[email protected]> // Copyright 2010, 2017 Albert Astals Cid <[email protected]> +// Copyright 2021 Oliver Sander <[email protected]> // //======================================================================== @@ -19,10 +20,10 @@ // StdinPDFDocBuilder //------------------------------------------------------------------------ -PDFDoc *StdinPDFDocBuilder::buildPDFDoc(const GooString &uri, GooString *ownerPassword, GooString *userPassword, void *guiDataA) +std::unique_ptr<PDFDoc> StdinPDFDocBuilder::buildPDFDoc(const GooString &uri, GooString *ownerPassword, GooString *userPassword, void *guiDataA) { CachedFile *cachedFile = new CachedFile(new StdinCacheLoader(), nullptr); - return new PDFDoc(new CachedFileStream(cachedFile, 0, false, cachedFile->getLength(), Object(objNull)), ownerPassword, userPassword); + return std::make_unique<PDFDoc>(new CachedFileStream(cachedFile, 0, false, cachedFile->getLength(), Object(objNull)), ownerPassword, userPassword); } bool StdinPDFDocBuilder::supports(const GooString &uri) diff --git a/poppler/StdinPDFDocBuilder.h b/poppler/StdinPDFDocBuilder.h index 33fbcf0c..a4bbf8e4 100644 --- a/poppler/StdinPDFDocBuilder.h +++ b/poppler/StdinPDFDocBuilder.h @@ -6,6 +6,7 @@ // // Copyright 2010 Hib Eris <[email protected]> // Copyright 2010, 2018 Albert Astals Cid <[email protected]> +// Copyright 2021 Oliver Sander <[email protected]> // //======================================================================== @@ -24,7 +25,7 @@ class StdinPDFDocBuilder : public PDFDocBuilder { public: - PDFDoc *buildPDFDoc(const GooString &uri, GooString *ownerPassword = nullptr, GooString *userPassword = nullptr, void *guiDataA = nullptr) override; + std::unique_ptr<PDFDoc> buildPDFDoc(const GooString &uri, GooString *ownerPassword = nullptr, GooString *userPassword = nullptr, void *guiDataA = nullptr) override; bool supports(const GooString &uri) override; }; diff --git a/utils/pdfdetach.cc b/utils/pdfdetach.cc index 78846ea4..f5576b38 100644 --- a/utils/pdfdetach.cc +++ b/utils/pdfdetach.cc @@ -18,7 +18,7 @@ // Copyright (C) 2014, 2017 Adrian Johnson <[email protected]> // Copyright (C) 2018, 2020 Albert Astals Cid <[email protected]> // Copyright (C) 2018 Adam Reichold <[email protected]> -// Copyright (C) 2019 Oliver Sander <[email protected]> +// Copyright (C) 2019, 2021 Oliver Sander <[email protected]> // Copyright (C) 2020 <[email protected]> // // To see a description of the changes please see the Changelog file that @@ -72,10 +72,10 @@ static const ArgDesc argDesc[] = { { "-list", argFlag, &doList, 0, "list all emb int main(int argc, char *argv[]) { + std::unique_ptr<PDFDoc> doc; GooString *fileName; const UnicodeMap *uMap; GooString *ownerPW, *userPW; - PDFDoc *doc; char uBuf[8]; char path[1024]; char *p; @@ -329,7 +329,6 @@ int main(int argc, char *argv[]) err2: for (auto &file : embeddedFiles) delete file; - delete doc; err0: return exitCode; diff --git a/utils/pdfimages.cc b/utils/pdfimages.cc index 46cebf98..2a524fa8 100644 --- a/utils/pdfimages.cc +++ b/utils/pdfimages.cc @@ -21,7 +21,7 @@ // Copyright (C) 2012, 2013, 2017 Adrian Johnson <[email protected]> // Copyright (C) 2013 Suzuki Toshiya <[email protected]> // Copyright (C) 2018 Adam Reichold <[email protected]> -// Copyright (C) 2019 Oliver Sander <[email protected]> +// Copyright (C) 2019, 2021 Oliver Sander <[email protected]> // Copyright (C) 2019 Hartmut Goebel <[email protected]> // // To see a description of the changes please see the Changelog file that @@ -96,16 +96,13 @@ static const ArgDesc argDesc[] = { { "-f", argInt, &firstPage, 0, "first page to int main(int argc, char *argv[]) { - PDFDoc *doc; GooString *fileName; char *imgRoot = nullptr; GooString *ownerPW, *userPW; ImageOutputDev *imgOut; bool ok; - int exitCode; Win32Console win32Console(&argc, &argv); - exitCode = 99; // parse args ok = parseArgs(argDesc, &argc, argv); @@ -117,8 +114,8 @@ int main(int argc, char *argv[]) printUsage("pdfimages", "<PDF-file> <image-root>", argDesc); } if (printVersion || printHelp) - exitCode = 0; - goto err0; + return 0; + return 99; } fileName = new GooString(argv[1]); if (!listImages) @@ -146,7 +143,7 @@ int main(int argc, char *argv[]) fileName = new GooString("fd://0"); } - doc = PDFDocFactory().createPDFDoc(*fileName, ownerPW, userPW); + std::unique_ptr<PDFDoc> doc = PDFDocFactory().createPDFDoc(*fileName, ownerPW, userPW); delete fileName; if (userPW) { @@ -156,16 +153,14 @@ int main(int argc, char *argv[]) delete ownerPW; } if (!doc->isOk()) { - exitCode = 1; - goto err1; + return 1; } // check for copy permission #ifdef ENFORCE_PERMISSIONS if (!doc->okToCopy()) { error(errNotAllowed, -1, "Copying of images from this document is not allowed."); - exitCode = 3; - goto err1; + return 3; } #endif @@ -174,13 +169,13 @@ int main(int argc, char *argv[]) firstPage = 1; if (firstPage > doc->getNumPages()) { error(errCommandLine, -1, "Wrong page range given: the first page ({0:d}) can not be larger then the number of pages in the document ({1:d}).", firstPage, doc->getNumPages()); - goto err1; + return 99; } if (lastPage < 1 || lastPage > doc->getNumPages()) lastPage = doc->getNumPages(); if (lastPage < firstPage) { error(errCommandLine, -1, "Wrong page range given: the first page ({0:d}) can not be after the last page ({1:d}).", firstPage, lastPage); - goto err1; + return 99; } // write image files @@ -205,12 +200,5 @@ int main(int argc, char *argv[]) } delete imgOut; - exitCode = 0; - - // clean up -err1: - delete doc; -err0: - - return exitCode; + return 0; } diff --git a/utils/pdfinfo.cc b/utils/pdfinfo.cc index 6180dbea..cdc88d32 100644 --- a/utils/pdfinfo.cc +++ b/utils/pdfinfo.cc @@ -26,7 +26,7 @@ // Copyright (C) 2018 Adam Reichold <[email protected]> // Copyright (C) 2018 Evangelos Rigas <[email protected]> // Copyright (C) 2019 Christian Persch <[email protected]> -// Copyright (C) 2019, 2020 Oliver Sander <[email protected]> +// Copyright (C) 2019-2021 Oliver Sander <[email protected]> // Copyright (C) 2019 Thomas Fischer <[email protected]> // // To see a description of the changes please see the Changelog file that @@ -807,7 +807,7 @@ static void printInfo(PDFDoc *doc, const UnicodeMap *uMap, long long filesize, b int main(int argc, char *argv[]) { - PDFDoc *doc; + std::unique_ptr<PDFDoc> doc; GooString *fileName; GooString *ownerPW, *userPW; const UnicodeMap *uMap; @@ -915,7 +915,7 @@ int main(int argc, char *argv[]) } } else if (printJS) { // print javascript - JSInfo jsInfo(doc, firstPage - 1); + JSInfo jsInfo(doc.get(), firstPage - 1); jsInfo.scanJS(lastPage - firstPage + 1, stdout, uMap); } else if (printStructure || printStructureText) { // print structure @@ -926,7 +926,7 @@ int main(int argc, char *argv[]) } } } else if (printDests) { - printDestinations(doc, uMap); + printDestinations(doc.get(), uMap); } else { // print info long long filesize = 0; @@ -941,13 +941,12 @@ int main(int argc, char *argv[]) if (multiPage == false) lastPage = 1; - printInfo(doc, uMap, filesize, multiPage); + printInfo(doc.get(), uMap, filesize, multiPage); } exitCode = 0; // clean up err2: - delete doc; delete fileName; err1: err0: diff --git a/utils/pdftocairo.cc b/utils/pdftocairo.cc index 1a0785d2..8cdb13d2 100644 --- a/utils/pdftocairo.cc +++ b/utils/pdftocairo.cc @@ -34,7 +34,7 @@ // Copyright (C) 2018 Adam Reichold <[email protected]> // Copyright (C) 2019, 2020 Oliver Sander <[email protected]> // Copyright (C) 2019 Kris Jurka <[email protected]> -// Copyright (C) 2020 Oliver Sander <[email protected]> +// Copyright (C) 2020, 2021 Oliver Sander <[email protected]> // Copyright (C) 2020 Philipp Knechtges <[email protected]> // Copyright (C) 2020 Salvo Miosi <[email protected]> // @@ -855,7 +855,6 @@ static void checkInvalidImageOption(bool option, const char *option_name) int main(int argc, char *argv[]) { - PDFDoc *doc; GooString *fileName = nullptr; GooString *outputName = nullptr; GooString *outputFileName = nullptr; @@ -1061,7 +1060,7 @@ int main(int argc, char *argv[]) } #endif - doc = PDFDocFactory().createPDFDoc(*fileName, ownerPW, userPW); + std::unique_ptr<PDFDoc> doc = PDFDocFactory().createPDFDoc(*fileName, ownerPW, userPW); if (!doc->isOk()) { fprintf(stderr, "Error opening PDF file.\n"); exit(1); @@ -1126,7 +1125,7 @@ int main(int argc, char *argv[]) #ifdef USE_CMS cairoOut->setDisplayProfile(profile); #endif - cairoOut->startDoc(doc); + cairoOut->startDoc(doc.get()); if (sz != 0) crop_w = crop_h = sz; pg_num_len = numberOfCharacters(doc->getNumPages()); @@ -1181,14 +1180,13 @@ int main(int argc, char *argv[]) if (pg == firstPage) beginDocument(fileName, outputFileName, output_w, output_h); beginPage(&output_w, &output_h); - renderPage(doc, cairoOut, pg, pg_w, pg_h, output_w, output_h); + renderPage(doc.get(), cairoOut, pg, pg_w, pg_h, output_w, output_h); endPage(imageFileName); } endDocument(); // clean up delete cairoOut; - delete doc; if (fileName) delete fileName; if (outputName) diff --git a/utils/pdftohtml.cc b/utils/pdftohtml.cc index 23e8cef4..483b211d 100644 --- a/utils/pdftohtml.cc +++ b/utils/pdftohtml.cc @@ -28,7 +28,7 @@ // Copyright (C) 2018 Klarälvdalens Datakonsult AB, a KDAB Group company, <[email protected]>. Work sponsored by the LiMux project of the city of Munich // Copyright (C) 2018 Thibaut Brard <[email protected]> // Copyright (C) 2018 Adam Reichold <[email protected]> -// Copyright (C) 2019 Oliver Sander <[email protected]> +// Copyright (C) 2019, 2021 Oliver Sander <[email protected]> // // To see a description of the changes please see the Changelog file that // came with your tarball or type make ChangeLog if you are building from git @@ -160,7 +160,7 @@ SplashOutputDevNoText::~SplashOutputDevNoText() = default; int main(int argc, char *argv[]) { - PDFDoc *doc = nullptr; + std::unique_ptr<PDFDoc> doc; GooString *fileName = nullptr; GooString *docTitle = nullptr; GooString *author = nullptr, *keywords = nullptr, *subject = nullptr, *date = nullptr; @@ -362,7 +362,7 @@ int main(int argc, char *argv[]) SplashImageFileFormat format = strcmp(extension, "jpg") ? splashFormatPng : splashFormatJpeg; splashOut = new SplashOutputDevNoText(splashModeRGB8, 4, false, color); - splashOut->startDoc(doc); + splashOut->startDoc(doc.get()); for (int pg = firstPage; pg <= lastPage; ++pg) { InMemoryFile imf; @@ -392,14 +392,13 @@ int main(int argc, char *argv[]) delete htmlOut; delete htmlFileName; delete fileName; - delete doc; return -1; #endif } if (htmlOut->isOk()) { doc->displayPages(htmlOut, firstPage, lastPage, 72 * scale, 72 * scale, 0, true, false, false); - htmlOut->dumpDocOutline(doc); + htmlOut->dumpDocOutline(doc.get()); } delete htmlOut; @@ -408,8 +407,6 @@ int main(int argc, char *argv[]) // clean up error: - if (doc) - delete doc; delete fileName; if (htmlFileName) diff --git a/utils/pdftoppm.cc b/utils/pdftoppm.cc index 5d7c5389..9ad62fdd 100644 --- a/utils/pdftoppm.cc +++ b/utils/pdftoppm.cc @@ -29,7 +29,7 @@ // Copyright (C) 2015 William Bader <[email protected]> // Copyright (C) 2018 Martin Packman <[email protected]> // Copyright (C) 2019 Yves-Gaël Chény <[email protected]> -// Copyright (C) 2019, 2020 Oliver Sander <[email protected]> +// Copyright (C) 2019-2021 Oliver Sander <[email protected]> // Copyright (C) 2019 <[email protected]> // Copyright (C) 2019 Kris Jurka <[email protected]> // Copyright (C) 2019 Sébastien Berthier <[email protected]> @@ -381,7 +381,6 @@ static void processPageJobs() int main(int argc, char *argv[]) { - PDFDoc *doc; GooString *fileName = nullptr; char *ppmRoot = nullptr; char *ppmFile; @@ -421,7 +420,7 @@ int main(int argc, char *argv[]) } if (printVersion || printHelp) exitCode = 0; - goto err0; + return exitCode; } if (argc > 1) fileName = new GooString(argv[1]); @@ -484,7 +483,7 @@ int main(int argc, char *argv[]) delete fileName; fileName = new GooString("fd://0"); } - doc = PDFDocFactory().createPDFDoc(*fileName, ownerPW, userPW); + std::unique_ptr<PDFDoc> doc(PDFDocFactory().createPDFDoc(*fileName, ownerPW, userPW)); delete fileName; if (userPW) { @@ -494,8 +493,7 @@ int main(int argc, char *argv[]) delete ownerPW; } if (!doc->isOk()) { - exitCode = 1; - goto err1; + return 1; } // get page range @@ -507,7 +505,7 @@ int main(int argc, char *argv[]) lastPage = doc->getNumPages(); if (lastPage < firstPage) { fprintf(stderr, "Wrong page range given: the first page (%d) can not be after the last page (%d).\n", firstPage, lastPage); - goto err1; + return exitCode; } // If our page range selection and document size indicate we're only @@ -515,7 +513,7 @@ int main(int argc, char *argv[]) // filter out that single page. if (firstPage == lastPage && ((printOnlyEven && firstPage % 2 == 1) || (printOnlyOdd && firstPage % 2 == 0))) { fprintf(stderr, "Invalid even/odd page selection, no pages match criteria.\n"); - goto err1; + return exitCode; } if (singleFile && firstPage < lastPage) { @@ -540,12 +538,12 @@ int main(int argc, char *argv[]) displayprofile = make_GfxLCMSProfilePtr(cmsOpenProfileFromFile(displayprofilename.c_str(), "r")); if (!displayprofile) { fprintf(stderr, "Could not open the ICC profile \"%s\".\n", displayprofilename.c_str()); - goto err1; + return exitCode; } if (!cmsIsIntentSupported(displayprofile.get(), INTENT_RELATIVE_COLORIMETRIC, LCMS_USED_AS_OUTPUT) && !cmsIsIntentSupported(displayprofile.get(), INTENT_ABSOLUTE_COLORIMETRIC, LCMS_USED_AS_OUTPUT) && !cmsIsIntentSupported(displayprofile.get(), INTENT_SATURATION, LCMS_USED_AS_OUTPUT) && !cmsIsIntentSupported(displayprofile.get(), INTENT_PERCEPTUAL, LCMS_USED_AS_OUTPUT)) { fprintf(stderr, "ICC profile \"%s\" is not an output profile.\n", displayprofilename.c_str()); - goto err1; + return exitCode; } profilecolorspace = cmsGetColorSpace(displayprofile.get()); // Note: In contrast to pdftops we do not fail if a non-matching ICC profile is supplied. @@ -568,19 +566,19 @@ int main(int argc, char *argv[]) if (!defaultgrayprofilename.toStr().empty()) { defaultgrayprofile = make_GfxLCMSProfilePtr(cmsOpenProfileFromFile(defaultgrayprofilename.c_str(), "r")); if (!checkICCProfile(defaultgrayprofile, defaultgrayprofilename.c_str(), LCMS_USED_AS_INPUT, cmsSigGrayData)) { - goto err1; + return exitCode; } } if (!defaultrgbprofilename.toStr().empty()) { defaultrgbprofile = make_GfxLCMSProfilePtr(cmsOpenProfileFromFile(defaultrgbprofilename.c_str(), "r")); if (!checkICCProfile(defaultrgbprofile, defaultrgbprofilename.c_str(), LCMS_USED_AS_INPUT, cmsSigRgbData)) { - goto err1; + return exitCode; } } if (!defaultcmykprofilename.toStr().empty()) { defaultcmykprofile = make_GfxLCMSProfilePtr(cmsOpenProfileFromFile(defaultcmykprofilename.c_str(), "r")); if (!checkICCProfile(defaultcmykprofile, defaultcmykprofilename.c_str(), LCMS_USED_AS_INPUT, cmsSigCmykData)) { - goto err1; + return exitCode; } } #endif @@ -598,7 +596,7 @@ int main(int argc, char *argv[]) splashOut->setDefaultRGBProfile(defaultrgbprofile); splashOut->setDefaultCMYKProfile(defaultcmykprofile); # endif - splashOut->startDoc(doc); + splashOut->startDoc(doc.get()); #endif // UTILS_USE_PTHREADS @@ -656,13 +654,13 @@ int main(int argc, char *argv[]) } #ifndef UTILS_USE_PTHREADS // process job in main thread - savePageSlice(doc, splashOut, pg, param_x, param_y, param_w, param_h, pg_w, pg_h, ppmFile); + savePageSlice(doc.get(), splashOut, pg, param_x, param_y, param_w, param_h, pg_w, pg_h, ppmFile); delete[] ppmFile; #else // queue job for worker threads - PageJob pageJob = { .doc = doc, + PageJob pageJob = { .doc = doc.get(), .pg = pg, .pg_w = pg_w, @@ -701,12 +699,5 @@ int main(int argc, char *argv[]) #endif // UTILS_USE_PTHREADS - exitCode = 0; - - // clean up -err1: - delete doc; -err0: - - return exitCode; + return 0; } diff --git a/utils/pdftops.cc b/utils/pdftops.cc index 597a7937..e77edde3 100644 --- a/utils/pdftops.cc +++ b/utils/pdftops.cc @@ -25,7 +25,7 @@ // Copyright (C) 2013 Suzuki Toshiya <[email protected]> // Copyright (C) 2014, 2017 Adrian Johnson <[email protected]> // Copyright (C) 2018 Adam Reichold <[email protected]> -// Copyright (C) 2019 Oliver Sander <[email protected]> +// Copyright (C) 2019, 2021 Oliver Sander <[email protected]> // Copyright (C) 2020 Philipp Knechtges <[email protected]> // // To see a description of the changes please see the Changelog file that @@ -199,7 +199,7 @@ static const ArgDesc argDesc[] = { { "-f", argInt, &firstPage, 0, "first page to int main(int argc, char *argv[]) { - PDFDoc *doc; + std::unique_ptr<PDFDoc> doc; GooString *fileName; GooString *psFileName; PSLevel level; @@ -301,7 +301,7 @@ int main(int argc, char *argv[]) processcolorformatspecified = true; } else { fprintf(stderr, "Error: Unknown process color format \"%s\".\n", processcolorformatname.c_str()); - goto err05; + goto err1; } } @@ -310,12 +310,12 @@ int main(int argc, char *argv[]) processcolorprofile = make_GfxLCMSProfilePtr(cmsOpenProfileFromFile(processcolorprofilename.c_str(), "r")); if (!processcolorprofile) { fprintf(stderr, "Error: Could not open the ICC profile \"%s\".\n", processcolorprofilename.c_str()); - goto err05; + goto err1; } if (!cmsIsIntentSupported(processcolorprofile.get(), INTENT_RELATIVE_COLORIMETRIC, LCMS_USED_AS_OUTPUT) && !cmsIsIntentSupported(processcolorprofile.get(), INTENT_ABSOLUTE_COLORIMETRIC, LCMS_USED_AS_OUTPUT) && !cmsIsIntentSupported(processcolorprofile.get(), INTENT_SATURATION, LCMS_USED_AS_OUTPUT) && !cmsIsIntentSupported(processcolorprofile.get(), INTENT_PERCEPTUAL, LCMS_USED_AS_OUTPUT)) { fprintf(stderr, "Error: ICC profile \"%s\" is not an output profile.\n", processcolorprofilename.c_str()); - goto err05; + goto err1; } profilecolorspace = cmsGetColorSpace(processcolorprofile.get()); if (profilecolorspace == cmsSigCmykData) { @@ -324,7 +324,7 @@ int main(int argc, char *argv[]) processcolorformatspecified = true; } else if (processcolorformat != splashModeCMYK8) { fprintf(stderr, "Error: Supplied ICC profile \"%s\" is a CMYK profile, but process color format is not CMYK8.\n", processcolorprofilename.c_str()); - goto err05; + goto err1; } } else if (profilecolorspace == cmsSigGrayData) { if (!processcolorformatspecified) { @@ -332,7 +332,7 @@ int main(int argc, char *argv[]) processcolorformatspecified = true; } else if (processcolorformat != splashModeMono8) { fprintf(stderr, "Error: Supplied ICC profile \"%s\" is a monochrome profile, but process color format is not monochrome.\n", processcolorprofilename.c_str()); - goto err05; + goto err1; } } else if (profilecolorspace == cmsSigRgbData) { if (!processcolorformatspecified) { @@ -340,7 +340,7 @@ int main(int argc, char *argv[]) processcolorformatspecified = true; } else if (processcolorformat != splashModeRGB8) { fprintf(stderr, "Error: Supplied ICC profile \"%s\" is a RGB profile, but process color format is not RGB.\n", processcolorprofilename.c_str()); - goto err05; + goto err1; } } } @@ -349,10 +349,10 @@ int main(int argc, char *argv[]) if (processcolorformatspecified) { if (level1 && processcolorformat != splashModeMono8) { fprintf(stderr, "Error: Setting -level1 requires -processcolorformat MONO8"); - goto err05; + goto err1; } else if ((level1Sep || level2Sep || level3Sep || overprint) && processcolorformat != splashModeCMYK8) { fprintf(stderr, "Error: Setting -level1sep/-level2sep/-level3sep/-overprint requires -processcolorformat CMYK8"); - goto err05; + goto err1; } } #endif @@ -361,19 +361,19 @@ int main(int argc, char *argv[]) if (!defaultgrayprofilename.toStr().empty()) { defaultgrayprofile = make_GfxLCMSProfilePtr(cmsOpenProfileFromFile(defaultgrayprofilename.c_str(), "r")); if (!checkICCProfile(defaultgrayprofile, defaultgrayprofilename.c_str(), LCMS_USED_AS_INPUT, cmsSigGrayData)) { - goto err05; + goto err1; } } if (!defaultrgbprofilename.toStr().empty()) { defaultrgbprofile = make_GfxLCMSProfilePtr(cmsOpenProfileFromFile(defaultrgbprofilename.c_str(), "r")); if (!checkICCProfile(defaultrgbprofile, defaultrgbprofilename.c_str(), LCMS_USED_AS_INPUT, cmsSigRgbData)) { - goto err05; + goto err1; } } if (!defaultcmykprofilename.toStr().empty()) { defaultcmykprofile = make_GfxLCMSProfilePtr(cmsOpenProfileFromFile(defaultcmykprofilename.c_str(), "r")); if (!checkICCProfile(defaultcmykprofile, defaultcmykprofilename.c_str(), LCMS_USED_AS_INPUT, cmsSigCmykData)) { - goto err05; + goto err1; } } #endif @@ -455,7 +455,7 @@ int main(int argc, char *argv[]) } // write PostScript file - psOut = new PSOutputDev(psFileName->c_str(), doc, nullptr, pages, mode, paperWidth, paperHeight, noCrop, duplex, /*imgLLXA*/ 0, /*imgLLYA*/ 0, + psOut = new PSOutputDev(psFileName->c_str(), doc.get(), nullptr, pages, mode, paperWidth, paperHeight, noCrop, duplex, /*imgLLXA*/ 0, /*imgLLYA*/ 0, /*imgURXA*/ 0, /*imgURYA*/ 0, psRasterizeWhenNeeded, /*manualCtrlA*/ false, /*customCodeCbkA*/ nullptr, /*customCodeCbkDataA*/ nullptr, level); if (noCenter) { psOut->setPSCenter(false); @@ -527,8 +527,6 @@ int main(int argc, char *argv[]) err2: delete psFileName; err1: - delete doc; -err05: delete fileName; err0: diff --git a/utils/pdftotext.cc b/utils/pdftotext.cc index eb75b9e7..71ebcc29 100644 --- a/utils/pdftotext.cc +++ b/utils/pdftotext.cc @@ -30,7 +30,7 @@ // Copyright (C) 2018 Adam Reichold <[email protected]> // Copyright (C) 2018 Sanchit Anand <[email protected]> // Copyright (C) 2019 Dan Shea <[email protected]> -// Copyright (C) 2019 Oliver Sander <[email protected]> +// Copyright (C) 2019, 2021 Oliver Sander <[email protected]> // Copyright (C) 2021 William Bader <[email protected]> // // To see a description of the changes please see the Changelog file that @@ -155,7 +155,7 @@ static std::string myXmlTokenReplace(const char *inString) int main(int argc, char *argv[]) { - PDFDoc *doc; + std::unique_ptr<PDFDoc> doc; GooString *fileName; GooString *textFileName; GooString *ownerPW, *userPW; @@ -346,9 +346,9 @@ int main(int argc, char *argv[]) textOut->setTextPageBreaks(false); } if (bboxLayout) { - printDocBBox(f, doc, textOut, firstPage, lastPage); + printDocBBox(f, doc.get(), textOut, firstPage, lastPage); } else { - printWordBBox(f, doc, textOut, firstPage, lastPage); + printWordBBox(f, doc.get(), textOut, firstPage, lastPage); } } if (f != stdout) { @@ -404,7 +404,6 @@ int main(int argc, char *argv[]) err3: delete textFileName; err2: - delete doc; delete fileName; err1: err0: _______________________________________________ poppler mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/poppler
