[poppler] 3 commits - goo/GooString.h poppler/Annot.cc poppler/DateInfo.cc poppler/Form.cc poppler/Form.h poppler/JSInfo.cc poppler/Outline.cc poppler/TextOutputDev.cc poppler/UTF.cc poppler/UTF.h qt5/tests qt6/tests utils/pdfinfo.cc utils/pdfsig.cc

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Oct 29 13:37:13 UTC 2021


 goo/GooString.h                    |    3 
 poppler/Annot.cc                   |  147 ++++++++++++++-----------------------
 poppler/DateInfo.cc                |    4 -
 poppler/Form.cc                    |   52 +++++--------
 poppler/Form.h                     |    4 -
 poppler/JSInfo.cc                  |    4 -
 poppler/Outline.cc                 |    4 -
 poppler/TextOutputDev.cc           |    2 
 poppler/UTF.cc                     |   22 ++---
 poppler/UTF.h                      |    6 -
 qt5/tests/check_utf_conversion.cpp |   16 ++--
 qt6/tests/check_utf_conversion.cpp |   16 ++--
 utils/pdfinfo.cc                   |    2 
 utils/pdfsig.cc                    |    4 -
 14 files changed, 121 insertions(+), 165 deletions(-)

New commits:
commit 406c83c465ddae11d98dcd2f9033b0cd0b262255
Author: Albert Astals Cid <aacid at kde.org>
Date:   Fri Oct 29 15:09:27 2021 +0200

    FormFieldText::tokenizeDA: Return a vector of strings instead of a vector of pointers
    
    Makes it for simpler memory management

diff --git a/poppler/Annot.cc b/poppler/Annot.cc
index fbfad5ff..74ad0e7e 100644
--- a/poppler/Annot.cc
+++ b/poppler/Annot.cc
@@ -800,35 +800,32 @@ DefaultAppearance::DefaultAppearance(const GooString *da)
     fontPtSize = -1;
 
     if (da) {
-        std::vector<GooString *> daToks;
+        std::vector<std::string> daToks;
         int i = FormFieldText::tokenizeDA(da->toStr(), &daToks, "Tf");
 
         if (i >= 1) {
-            fontPtSize = gatof(daToks[i - 1]->c_str());
+            fontPtSize = gatof(daToks[i - 1].c_str());
         }
         if (i >= 2) {
             // We are expecting a name, therefore the first letter should be '/'.
-            const GooString *fontToken = daToks[i - 2];
-            if (fontToken && fontToken->getLength() > 1 && fontToken->getChar(0) == '/') {
+            const std::string &fontToken = daToks[i - 2];
+            if (fontToken.size() > 1 && fontToken[0] == '/') {
                 // The +1 is here to skip the leading '/'.
-                fontName = Object(objName, fontToken->c_str() + 1);
+                fontName = Object(objName, fontToken.c_str() + 1);
             }
         }
         // Scan backwards: we are looking for the last set value
         for (i = daToks.size() - 1; i >= 0; --i) {
             if (!fontColor) {
-                if (!(daToks[i])->cmp("g") && i >= 1) {
-                    fontColor = std::make_unique<AnnotColor>(gatof((daToks[i - 1])->c_str()));
-                } else if (!(daToks[i])->cmp("rg") && i >= 3) {
-                    fontColor = std::make_unique<AnnotColor>(gatof((daToks[i - 3])->c_str()), gatof((daToks[i - 2])->c_str()), gatof((daToks[i - 1])->c_str()));
-                } else if (!(daToks[i])->cmp("k") && i >= 4) {
-                    fontColor = std::make_unique<AnnotColor>(gatof((daToks[i - 4])->c_str()), gatof((daToks[i - 3])->c_str()), gatof((daToks[i - 2])->c_str()), gatof((daToks[i - 1])->c_str()));
+                if (daToks[i] == "g" && i >= 1) {
+                    fontColor = std::make_unique<AnnotColor>(gatof(daToks[i - 1].c_str()));
+                } else if (daToks[i] == "rg" && i >= 3) {
+                    fontColor = std::make_unique<AnnotColor>(gatof(daToks[i - 3].c_str()), gatof(daToks[i - 2].c_str()), gatof(daToks[i - 1].c_str()));
+                } else if (daToks[i] == "k" && i >= 4) {
+                    fontColor = std::make_unique<AnnotColor>(gatof(daToks[i - 4].c_str()), gatof(daToks[i - 3].c_str()), gatof(daToks[i - 2].c_str()), gatof(daToks[i - 1].c_str()));
                 }
             }
         }
-        for (auto entry : daToks) {
-            delete entry;
-        }
     }
 }
 
diff --git a/poppler/Form.cc b/poppler/Form.cc
index 35ea5156..fe39d3cb 100644
--- a/poppler/Form.cc
+++ b/poppler/Form.cc
@@ -1562,57 +1562,46 @@ void FormFieldText::reset(const std::vector<std::string> &excludedFields)
 
 double FormFieldText::getTextFontSize()
 {
-    std::vector<GooString *> daToks;
+    std::vector<std::string> daToks;
     int idx = parseDA(&daToks);
     double fontSize = -1;
     if (idx >= 0) {
         char *p = nullptr;
-        fontSize = strtod(daToks[idx]->c_str(), &p);
+        fontSize = strtod(daToks[idx].c_str(), &p);
         if (!p || *p)
             fontSize = -1;
     }
-    for (auto entry : daToks) {
-        delete entry;
-    }
     return fontSize;
 }
 
 void FormFieldText::setTextFontSize(int fontSize)
 {
     if (fontSize > 0 && obj.isDict()) {
-        std::vector<GooString *> *daToks = new std::vector<GooString *>();
-        int idx = parseDA(daToks);
+        std::vector<std::string> daToks;
+        int idx = parseDA(&daToks);
         if (idx == -1) {
             error(errSyntaxError, -1, "FormFieldText:: invalid DA object\n");
-            for (auto entry : *daToks) {
-                delete entry;
-            }
-            delete daToks;
             return;
         }
         if (defaultAppearance)
             delete defaultAppearance;
         defaultAppearance = new GooString;
-        for (std::size_t i = 0; i < daToks->size(); ++i) {
+        for (std::size_t i = 0; i < daToks.size(); ++i) {
             if (i > 0)
                 defaultAppearance->append(' ');
             if (i == (std::size_t)idx) {
                 defaultAppearance->appendf("{0:d}", fontSize);
             } else {
-                defaultAppearance->append((*daToks)[i]);
+                defaultAppearance->append(daToks[i]);
             }
         }
-        for (auto entry : *daToks) {
-            delete entry;
-        }
-        delete daToks;
         obj.dictSet("DA", Object(defaultAppearance->copy()));
         xref->setModifiedObject(&obj, ref);
         updateChildrenAppearance();
     }
 }
 
-int FormFieldText::tokenizeDA(const std::string &da, std::vector<GooString *> *daToks, const char *searchTok)
+int FormFieldText::tokenizeDA(const std::string &da, std::vector<std::string> *daToks, const char *searchTok)
 {
     int idx = -1;
     if (daToks) {
@@ -1624,10 +1613,10 @@ int FormFieldText::tokenizeDA(const std::string &da, std::vector<GooString *> *d
             }
             if (i < da.size()) {
                 for (j = i + 1; j < da.size() && !Lexer::isSpace(da[j]); ++j) { }
-                GooString *tok = new GooString(da, i, j - i);
-                if (searchTok && !tok->cmp(searchTok))
+                std::string tok(da, i, j - i);
+                if (searchTok && tok == searchTok)
                     idx = daToks->size();
-                daToks->push_back(tok);
+                daToks->emplace_back(std::move(tok));
                 i = j;
             }
         }
@@ -1635,7 +1624,7 @@ int FormFieldText::tokenizeDA(const std::string &da, std::vector<GooString *> *d
     return idx;
 }
 
-int FormFieldText::parseDA(std::vector<GooString *> *daToks)
+int FormFieldText::parseDA(std::vector<std::string> *daToks)
 {
     int idx = -1;
     if (obj.isDict()) {
diff --git a/poppler/Form.h b/poppler/Form.h
index 6ecff357..d88f0a0a 100644
--- a/poppler/Form.h
+++ b/poppler/Form.h
@@ -496,10 +496,10 @@ public:
     void print(int indent) override;
     void reset(const std::vector<std::string> &excludedFields) override;
 
-    static int tokenizeDA(const std::string &daString, std::vector<GooString *> *daToks, const char *searchTok);
+    static int tokenizeDA(const std::string &daString, std::vector<std::string> *daToks, const char *searchTok);
 
 protected:
-    int parseDA(std::vector<GooString *> *daToks);
+    int parseDA(std::vector<std::string> *daToks);
     void fillContent(FillValueType fillType);
 
     GooString *content;
commit aba39d21302dcf53af6961cf6739c510532c683c
Author: Albert Astals Cid <aacid at kde.org>
Date:   Fri Oct 29 14:52:03 2021 +0200

    No need to new a vector that we always end deleting later

diff --git a/poppler/Annot.cc b/poppler/Annot.cc
index bfdef091..fbfad5ff 100644
--- a/poppler/Annot.cc
+++ b/poppler/Annot.cc
@@ -800,36 +800,35 @@ DefaultAppearance::DefaultAppearance(const GooString *da)
     fontPtSize = -1;
 
     if (da) {
-        std::vector<GooString *> *daToks = new std::vector<GooString *>();
-        int i = FormFieldText::tokenizeDA(da->toStr(), daToks, "Tf");
+        std::vector<GooString *> daToks;
+        int i = FormFieldText::tokenizeDA(da->toStr(), &daToks, "Tf");
 
         if (i >= 1) {
-            fontPtSize = gatof((*daToks)[i - 1]->c_str());
+            fontPtSize = gatof(daToks[i - 1]->c_str());
         }
         if (i >= 2) {
             // We are expecting a name, therefore the first letter should be '/'.
-            const GooString *fontToken = (*daToks)[i - 2];
+            const GooString *fontToken = daToks[i - 2];
             if (fontToken && fontToken->getLength() > 1 && fontToken->getChar(0) == '/') {
                 // The +1 is here to skip the leading '/'.
                 fontName = Object(objName, fontToken->c_str() + 1);
             }
         }
         // Scan backwards: we are looking for the last set value
-        for (i = daToks->size() - 1; i >= 0; --i) {
+        for (i = daToks.size() - 1; i >= 0; --i) {
             if (!fontColor) {
-                if (!((*daToks)[i])->cmp("g") && i >= 1) {
-                    fontColor = std::make_unique<AnnotColor>(gatof(((*daToks)[i - 1])->c_str()));
-                } else if (!((*daToks)[i])->cmp("rg") && i >= 3) {
-                    fontColor = std::make_unique<AnnotColor>(gatof(((*daToks)[i - 3])->c_str()), gatof(((*daToks)[i - 2])->c_str()), gatof(((*daToks)[i - 1])->c_str()));
-                } else if (!((*daToks)[i])->cmp("k") && i >= 4) {
-                    fontColor = std::make_unique<AnnotColor>(gatof(((*daToks)[i - 4])->c_str()), gatof(((*daToks)[i - 3])->c_str()), gatof(((*daToks)[i - 2])->c_str()), gatof(((*daToks)[i - 1])->c_str()));
+                if (!(daToks[i])->cmp("g") && i >= 1) {
+                    fontColor = std::make_unique<AnnotColor>(gatof((daToks[i - 1])->c_str()));
+                } else if (!(daToks[i])->cmp("rg") && i >= 3) {
+                    fontColor = std::make_unique<AnnotColor>(gatof((daToks[i - 3])->c_str()), gatof((daToks[i - 2])->c_str()), gatof((daToks[i - 1])->c_str()));
+                } else if (!(daToks[i])->cmp("k") && i >= 4) {
+                    fontColor = std::make_unique<AnnotColor>(gatof((daToks[i - 4])->c_str()), gatof((daToks[i - 3])->c_str()), gatof((daToks[i - 2])->c_str()), gatof((daToks[i - 1])->c_str()));
                 }
             }
         }
-        for (auto entry : *daToks) {
+        for (auto entry : daToks) {
             delete entry;
         }
-        delete daToks;
     }
 }
 
@@ -4168,7 +4167,7 @@ void AnnotAppearanceBuilder::writeString(const GooString &str)
 bool AnnotAppearanceBuilder::drawText(const GooString *text, const GooString *da, const GfxResources *resources, const AnnotBorder *border, const AnnotAppearanceCharacs *appearCharacs, const PDFRectangle *rect, bool multiline, int comb,
                                       int quadding, bool txField, bool forceZapfDingbats, XRef *xref, bool password, Dict *resourcesDict, const char *defaultFallback)
 {
-    std::vector<GooString *> *daToks;
+    std::vector<GooString *> daToks;
     GooString *tok;
     GooString convertedText;
     const GfxFont *font;
@@ -4186,7 +4185,6 @@ bool AnnotAppearanceBuilder::drawText(const GooString *text, const GooString *da
     // parse the default appearance string
     tfPos = tmPos = -1;
     if (da) {
-        daToks = new std::vector<GooString *>();
         int i = 0;
         while (i < da->getLength()) {
             while (i < da->getLength() && Lexer::isSpace(da->getChar(i))) {
@@ -4195,26 +4193,24 @@ bool AnnotAppearanceBuilder::drawText(const GooString *text, const GooString *da
             if (i < da->getLength()) {
                 for (j = i + 1; j < da->getLength() && !Lexer::isSpace(da->getChar(j)); ++j)
                     ;
-                daToks->push_back(new GooString(da, i, j - i));
+                daToks.push_back(new GooString(da, i, j - i));
                 i = j;
             }
         }
-        for (i = 2; i < (int)daToks->size(); ++i) {
-            if (i >= 2 && !((*daToks)[i])->cmp("Tf")) {
+        for (i = 2; i < (int)daToks.size(); ++i) {
+            if (i >= 2 && !(daToks[i])->cmp("Tf")) {
                 tfPos = i - 2;
-            } else if (i >= 6 && !((*daToks)[i])->cmp("Tm")) {
+            } else if (i >= 6 && !(daToks[i])->cmp("Tm")) {
                 tmPos = i - 6;
             }
         }
-    } else {
-        daToks = nullptr;
     }
 
     // get the font and font size
     font = nullptr;
     fontSize = 0;
     if (tfPos >= 0) {
-        tok = (*daToks)[tfPos];
+        tok = daToks[tfPos];
         if (forceZapfDingbats) {
             assert(xref != nullptr);
             if (tok->cmp("/ZaDb")) {
@@ -4235,17 +4231,14 @@ bool AnnotAppearanceBuilder::drawText(const GooString *text, const GooString *da
         } else {
             error(errSyntaxError, -1, "Invalid font name in 'Tf' operator in field's DA string");
         }
-        tok = (*daToks)[tfPos + 1];
+        tok = daToks[tfPos + 1];
         fontSize = gatof(tok->c_str());
     } else {
         error(errSyntaxError, -1, "Missing 'Tf' operator in field's DA string");
     }
     if (!font) {
-        if (daToks) {
-            for (auto entry : *daToks) {
-                delete entry;
-            }
-            delete daToks;
+        for (auto entry : daToks) {
+            delete entry;
         }
         return false;
     }
@@ -4317,7 +4310,7 @@ bool AnnotAppearanceBuilder::drawText(const GooString *text, const GooString *da
                 }
             }
             if (tfPos >= 0) {
-                tok = (*daToks)[tfPos + 1];
+                tok = daToks[tfPos + 1];
                 tok->clear();
                 tok->appendf("{0:.2f}", fontSize);
             }
@@ -4330,19 +4323,17 @@ bool AnnotAppearanceBuilder::drawText(const GooString *text, const GooString *da
 
         // set the font matrix
         if (tmPos >= 0) {
-            tok = (*daToks)[tmPos + 4];
+            tok = daToks[tmPos + 4];
             tok->clear();
             tok->append('0');
-            tok = (*daToks)[tmPos + 5];
+            tok = daToks[tmPos + 5];
             tok->clear();
             tok->appendf("{0:.2f}", y);
         }
 
         // write the DA string
-        if (daToks) {
-            for (const GooString *daTok : *daToks) {
-                appearBuf->append(daTok)->append(' ');
-            }
+        for (const GooString *daTok : daToks) {
+            appearBuf->append(daTok)->append(' ');
         }
 
         // write the font matrix (if not part of the DA string)
@@ -4399,7 +4390,7 @@ bool AnnotAppearanceBuilder::drawText(const GooString *text, const GooString *da
                 }
                 fontSize = floor(fontSize);
                 if (tfPos >= 0) {
-                    tok = (*daToks)[tfPos + 1];
+                    tok = daToks[tfPos + 1];
                     tok->clear();
                     tok->appendf("{0:.2f}", fontSize);
                 }
@@ -4427,19 +4418,17 @@ bool AnnotAppearanceBuilder::drawText(const GooString *text, const GooString *da
 
             // set the font matrix
             if (tmPos >= 0) {
-                tok = (*daToks)[tmPos + 4];
+                tok = daToks[tmPos + 4];
                 tok->clear();
                 tok->appendf("{0:.2f}", x);
-                tok = (*daToks)[tmPos + 5];
+                tok = daToks[tmPos + 5];
                 tok->clear();
                 tok->appendf("{0:.2f}", y);
             }
 
             // write the DA string
-            if (daToks) {
-                for (i = 0; i < (int)daToks->size(); ++i) {
-                    appearBuf->append((*daToks)[i])->append(' ');
-                }
+            for (i = 0; i < (int)daToks.size(); ++i) {
+                appearBuf->append(daToks[i])->append(' ');
             }
 
             // write the font matrix (if not part of the DA string)
@@ -4494,7 +4483,7 @@ bool AnnotAppearanceBuilder::drawText(const GooString *text, const GooString *da
                 }
                 fontSize = floor(fontSize);
                 if (tfPos >= 0) {
-                    tok = (*daToks)[tfPos + 1];
+                    tok = daToks[tfPos + 1];
                     tok->clear();
                     tok->appendf("{0:.2f}", fontSize);
                 }
@@ -4518,19 +4507,17 @@ bool AnnotAppearanceBuilder::drawText(const GooString *text, const GooString *da
 
             // set the font matrix
             if (tmPos >= 0) {
-                tok = (*daToks)[tmPos + 4];
+                tok = daToks[tmPos + 4];
                 tok->clear();
                 tok->appendf("{0:.2f}", x);
-                tok = (*daToks)[tmPos + 5];
+                tok = daToks[tmPos + 5];
                 tok->clear();
                 tok->appendf("{0:.2f}", y);
             }
 
             // write the DA string
-            if (daToks) {
-                for (const GooString *daTok : *daToks) {
-                    appearBuf->append(daTok)->append(' ');
-                }
+            for (const GooString *daTok : daToks) {
+                appearBuf->append(daTok)->append(' ');
             }
 
             // write the font matrix (if not part of the DA string)
@@ -4549,11 +4536,8 @@ bool AnnotAppearanceBuilder::drawText(const GooString *text, const GooString *da
     if (txField) {
         appearBuf->append("EMC\n");
     }
-    if (daToks) {
-        for (auto entry : *daToks) {
-            delete entry;
-        }
-        delete daToks;
+    for (auto entry : daToks) {
+        delete entry;
     }
     if (freeText) {
         delete text;
@@ -4568,7 +4552,7 @@ bool AnnotAppearanceBuilder::drawText(const GooString *text, const GooString *da
 // Draw the variable text or caption for a field.
 bool AnnotAppearanceBuilder::drawListBox(const FormFieldChoice *fieldChoice, const AnnotBorder *border, const PDFRectangle *rect, const GooString *da, const GfxResources *resources, int quadding, XRef *xref, Dict *resourcesDict)
 {
-    std::vector<GooString *> *daToks;
+    std::vector<GooString *> daToks;
     GooString *tok;
     GooString convertedText;
     const GfxFont *font;
@@ -4583,7 +4567,6 @@ bool AnnotAppearanceBuilder::drawListBox(const FormFieldChoice *fieldChoice, con
     // parse the default appearance string
     tfPos = tmPos = -1;
     if (da) {
-        daToks = new std::vector<GooString *>();
         i = 0;
         while (i < da->getLength()) {
             while (i < da->getLength() && Lexer::isSpace(da->getChar(i))) {
@@ -4592,26 +4575,24 @@ bool AnnotAppearanceBuilder::drawListBox(const FormFieldChoice *fieldChoice, con
             if (i < da->getLength()) {
                 for (j = i + 1; j < da->getLength() && !Lexer::isSpace(da->getChar(j)); ++j)
                     ;
-                daToks->push_back(new GooString(da, i, j - i));
+                daToks.push_back(new GooString(da, i, j - i));
                 i = j;
             }
         }
-        for (std::size_t k = 2; k < daToks->size(); ++k) {
-            if (k >= 2 && !((*daToks)[k])->cmp("Tf")) {
+        for (std::size_t k = 2; k < daToks.size(); ++k) {
+            if (k >= 2 && !(daToks[k])->cmp("Tf")) {
                 tfPos = k - 2;
-            } else if (k >= 6 && !((*daToks)[k])->cmp("Tm")) {
+            } else if (k >= 6 && !(daToks[k])->cmp("Tm")) {
                 tmPos = k - 6;
             }
         }
-    } else {
-        daToks = nullptr;
     }
 
     // get the font and font size
     font = nullptr;
     fontSize = 0;
     if (tfPos >= 0) {
-        tok = (*daToks)[tfPos];
+        tok = daToks[tfPos];
         if (tok->getLength() >= 1 && tok->getChar(0) == '/') {
             if (!resources || !(font = resources->lookupFont(tok->c_str() + 1))) {
                 if (xref != nullptr && resourcesDict != nullptr) {
@@ -4625,17 +4606,14 @@ bool AnnotAppearanceBuilder::drawListBox(const FormFieldChoice *fieldChoice, con
         } else {
             error(errSyntaxError, -1, "Invalid font name in 'Tf' operator in field's DA string");
         }
-        tok = (*daToks)[tfPos + 1];
+        tok = daToks[tfPos + 1];
         fontSize = gatof(tok->c_str());
     } else {
         error(errSyntaxError, -1, "Missing 'Tf' operator in field's DA string");
     }
     if (!font) {
-        if (daToks) {
-            for (auto entry : *daToks) {
-                delete entry;
-            }
-            delete daToks;
+        for (auto entry : daToks) {
+            delete entry;
         }
         return false;
     }
@@ -4650,11 +4628,8 @@ bool AnnotAppearanceBuilder::drawListBox(const FormFieldChoice *fieldChoice, con
             j = 0;
             if (fieldChoice->getChoice(i) == nullptr) {
                 error(errSyntaxError, -1, "Invalid annotation listbox");
-                if (daToks) {
-                    for (auto entry : *daToks) {
-                        delete entry;
-                    }
-                    delete daToks;
+                for (auto entry : daToks) {
+                    delete entry;
                 }
                 if (fontToFree) {
                     fontToFree->decRefCnt();
@@ -4673,7 +4648,7 @@ bool AnnotAppearanceBuilder::drawListBox(const FormFieldChoice *fieldChoice, con
         }
         fontSize = floor(fontSize);
         if (tfPos >= 0) {
-            tok = (*daToks)[tfPos + 1];
+            tok = daToks[tfPos + 1];
             tok->clear();
             tok->appendf("{0:.2f}", fontSize);
         }
@@ -4712,19 +4687,17 @@ bool AnnotAppearanceBuilder::drawListBox(const FormFieldChoice *fieldChoice, con
 
         // set the font matrix
         if (tmPos >= 0) {
-            tok = (*daToks)[tmPos + 4];
+            tok = daToks[tmPos + 4];
             tok->clear();
             tok->appendf("{0:.2f}", x);
-            tok = (*daToks)[tmPos + 5];
+            tok = daToks[tmPos + 5];
             tok->clear();
             tok->appendf("{0:.2f}", y);
         }
 
         // write the DA string
-        if (daToks) {
-            for (const GooString *daTok : *daToks) {
-                appearBuf->append(daTok)->append(' ');
-            }
+        for (const GooString *daTok : daToks) {
+            appearBuf->append(daTok)->append(' ');
         }
 
         // write the font matrix (if not part of the DA string)
@@ -4749,11 +4722,8 @@ bool AnnotAppearanceBuilder::drawListBox(const FormFieldChoice *fieldChoice, con
         y -= 1.1 * fontSize;
     }
 
-    if (daToks) {
-        for (auto entry : *daToks) {
-            delete entry;
-        }
-        delete daToks;
+    for (auto entry : daToks) {
+        delete entry;
     }
     if (fontToFree) {
         fontToFree->decRefCnt();
diff --git a/poppler/Form.cc b/poppler/Form.cc
index 04c677b6..35ea5156 100644
--- a/poppler/Form.cc
+++ b/poppler/Form.cc
@@ -1562,19 +1562,18 @@ void FormFieldText::reset(const std::vector<std::string> &excludedFields)
 
 double FormFieldText::getTextFontSize()
 {
-    std::vector<GooString *> *daToks = new std::vector<GooString *>();
-    int idx = parseDA(daToks);
+    std::vector<GooString *> daToks;
+    int idx = parseDA(&daToks);
     double fontSize = -1;
     if (idx >= 0) {
         char *p = nullptr;
-        fontSize = strtod((*daToks)[idx]->c_str(), &p);
+        fontSize = strtod(daToks[idx]->c_str(), &p);
         if (!p || *p)
             fontSize = -1;
     }
-    for (auto entry : *daToks) {
+    for (auto entry : daToks) {
         delete entry;
     }
-    delete daToks;
     return fontSize;
 }
 
commit 94d9d102f77312d808b7b65112d0a530a7ca4a12
Author: Albert Astals Cid <aacid at kde.org>
Date:   Fri Oct 29 14:34:13 2021 +0200

    Port a few functions from GooString to std::string

diff --git a/goo/GooString.h b/goo/GooString.h
index 81c2d5b7..aa68635c 100644
--- a/goo/GooString.h
+++ b/goo/GooString.h
@@ -17,7 +17,7 @@
 //
 // Copyright (C) 2006 Kristian Høgsberg <krh at redhat.com>
 // Copyright (C) 2006 Krzysztof Kowalczyk <kkowalczyk at gmail.com>
-// Copyright (C) 2008-2010, 2012, 2014, 2017-2020 Albert Astals Cid <aacid at kde.org>
+// Copyright (C) 2008-2010, 2012, 2014, 2017-2021 Albert Astals Cid <aacid at kde.org>
 // Copyright (C) 2012-2014 Fabio D'Urso <fabiodurso at hotmail.it>
 // Copyright (C) 2013 Jason Crain <jason at aquaticape.us>
 // Copyright (C) 2015, 2018 Adam Reichold <adam.reichold at t-online.de>
@@ -80,6 +80,7 @@ public:
 
     // Create a string from <lengthA> chars at <idx> in <str>.
     GooString(const GooString *str, int idx, int lengthA) : std::string(*str, idx, lengthA) { }
+    GooString(const std::string &str, int idx, int lengthA) : std::string(str, idx, lengthA) { }
 
     // Set content of a string to <newStr>.
     GooString *Set(const GooString *newStr)
diff --git a/poppler/Annot.cc b/poppler/Annot.cc
index caf64f53..bfdef091 100644
--- a/poppler/Annot.cc
+++ b/poppler/Annot.cc
@@ -801,7 +801,7 @@ DefaultAppearance::DefaultAppearance(const GooString *da)
 
     if (da) {
         std::vector<GooString *> *daToks = new std::vector<GooString *>();
-        int i = FormFieldText::tokenizeDA(da, daToks, "Tf");
+        int i = FormFieldText::tokenizeDA(da->toStr(), daToks, "Tf");
 
         if (i >= 1) {
             fontPtSize = gatof((*daToks)[i - 1]->c_str());
diff --git a/poppler/DateInfo.cc b/poppler/DateInfo.cc
index 1e6b51c6..177f80cf 100644
--- a/poppler/DateInfo.cc
+++ b/poppler/DateInfo.cc
@@ -2,7 +2,7 @@
 //
 // DateInfo.cc
 //
-// Copyright (C) 2008, 2018, 2019 Albert Astals Cid <aacid at kde.org>
+// Copyright (C) 2008, 2018, 2019, 2021 Albert Astals Cid <aacid at kde.org>
 // Copyright (C) 2009 Carlos Garcia Campos <carlosgc at gnome.org>
 // Copyright (C) 2015 André Guerreiro <aguerreiro1985 at gmail.com>
 // Copyright (C) 2015 André Esser <bepandre at hotmail.com>
@@ -37,7 +37,7 @@
 bool parseDateString(const GooString *date, int *year, int *month, int *day, int *hour, int *minute, int *second, char *tz, int *tzHour, int *tzMinute)
 {
     Unicode *u;
-    int len = TextStringToUCS4(date, &u);
+    int len = TextStringToUCS4(date->toStr(), &u);
     GooString s;
     for (int i = 0; i < len; i++) {
         // Ignore any non ASCII characters
diff --git a/poppler/Form.cc b/poppler/Form.cc
index 8b0159a6..04c677b6 100644
--- a/poppler/Form.cc
+++ b/poppler/Form.cc
@@ -1613,18 +1613,18 @@ void FormFieldText::setTextFontSize(int fontSize)
     }
 }
 
-int FormFieldText::tokenizeDA(const GooString *da, std::vector<GooString *> *daToks, const char *searchTok)
+int FormFieldText::tokenizeDA(const std::string &da, std::vector<GooString *> *daToks, const char *searchTok)
 {
     int idx = -1;
-    if (da && daToks) {
-        int i = 0;
-        int j = 0;
-        while (i < da->getLength()) {
-            while (i < da->getLength() && Lexer::isSpace(da->getChar(i))) {
+    if (daToks) {
+        size_t i = 0;
+        size_t j = 0;
+        while (i < da.size()) {
+            while (i < da.size() && Lexer::isSpace(da[i])) {
                 ++i;
             }
-            if (i < da->getLength()) {
-                for (j = i + 1; j < da->getLength() && !Lexer::isSpace(da->getChar(j)); ++j) { }
+            if (i < da.size()) {
+                for (j = i + 1; j < da.size() && !Lexer::isSpace(da[j]); ++j) { }
                 GooString *tok = new GooString(da, i, j - i);
                 if (searchTok && !tok->cmp(searchTok))
                     idx = daToks->size();
@@ -1643,7 +1643,7 @@ int FormFieldText::parseDA(std::vector<GooString *> *daToks)
         Object objDA(obj.dictLookup("DA"));
         if (objDA.isString()) {
             const GooString *da = objDA.getString();
-            idx = tokenizeDA(da, daToks, "Tf") - 1;
+            idx = tokenizeDA(da->toStr(), daToks, "Tf") - 1;
         }
     }
     return idx;
diff --git a/poppler/Form.h b/poppler/Form.h
index 9c51bcfd..6ecff357 100644
--- a/poppler/Form.h
+++ b/poppler/Form.h
@@ -496,7 +496,7 @@ public:
     void print(int indent) override;
     void reset(const std::vector<std::string> &excludedFields) override;
 
-    static int tokenizeDA(const GooString *daString, std::vector<GooString *> *daToks, const char *searchTok);
+    static int tokenizeDA(const std::string &daString, std::vector<GooString *> *daToks, const char *searchTok);
 
 protected:
     int parseDA(std::vector<GooString *> *daToks);
diff --git a/poppler/JSInfo.cc b/poppler/JSInfo.cc
index eb11a9ce..97625633 100644
--- a/poppler/JSInfo.cc
+++ b/poppler/JSInfo.cc
@@ -5,7 +5,7 @@
 // This file is licensed under the GPLv2 or later
 //
 // Copyright (C) 2013 Adrian Johnson <ajohnson at redneon.com>
-// Copyright (C) 2017, 2020 Albert Astals Cid <aacid at kde.org>
+// Copyright (C) 2017, 2020, 2021 Albert Astals Cid <aacid at kde.org>
 // Copyright (C) 2018 Klarälvdalens Datakonsult AB, a KDAB Group company, <info at kdab.com>. Work sponsored by the LiMux project of the city of Munich
 // Copyright (C) 2020 Oliver Sander <oliver.sander at tu-dresden.de>
 // Copyright (C) 2020 Nelson Benítez León <nbenitezl at gmail.com>
@@ -45,7 +45,7 @@ void JSInfo::printJS(const GooString *js)
     if (!js || !js->c_str())
         return;
 
-    len = TextStringToUCS4(js, &u);
+    len = TextStringToUCS4(js->toStr(), &u);
     for (i = 0; i < len; i++) {
         n = uniMap->mapUnicode(u[i], buf, sizeof(buf));
         fwrite(buf, 1, n, file);
diff --git a/poppler/Outline.cc b/poppler/Outline.cc
index aa6b4ef9..268dcaf3 100644
--- a/poppler/Outline.cc
+++ b/poppler/Outline.cc
@@ -413,7 +413,7 @@ OutlineItem::OutlineItem(const Dict *dict, Ref refA, OutlineItem *parentA, XRef
     obj1 = dict->lookup("Title");
     if (obj1.isString()) {
         const GooString *s = obj1.getString();
-        titleLen = TextStringToUCS4(s, &title);
+        titleLen = TextStringToUCS4(s->toStr(), &title);
     } else {
         titleLen = 0;
     }
@@ -494,7 +494,7 @@ void OutlineItem::setTitle(const std::string &titleA)
 
     Object dict = xref->fetch(ref);
     GooString *g = new GooString(titleA);
-    titleLen = TextStringToUCS4(g, &title);
+    titleLen = TextStringToUCS4(g->toStr(), &title);
     dict.dictSet("Title", Object(g));
     xref->setModifiedObject(&dict, ref);
 }
diff --git a/poppler/TextOutputDev.cc b/poppler/TextOutputDev.cc
index 633d1392..c0929033 100644
--- a/poppler/TextOutputDev.cc
+++ b/poppler/TextOutputDev.cc
@@ -5618,7 +5618,7 @@ void ActualText::end(const GfxState *state)
         // now that we have the position info for all of the text inside
         // the marked content span, we feed the "ActualText" back through
         // text->addChar()
-        length = TextStringToUCS4(actualText, &uni);
+        length = TextStringToUCS4(actualText->toStr(), &uni);
         text->addChar(state, actualTextX0, actualTextY0, actualTextX1 - actualTextX0, actualTextY1 - actualTextY0, 0, actualTextNBytes, uni, length);
         gfree(uni);
     }
diff --git a/poppler/UTF.cc b/poppler/UTF.cc
index fadd833f..8dd972c7 100644
--- a/poppler/UTF.cc
+++ b/poppler/UTF.cc
@@ -16,7 +16,7 @@
 // Copyright (C) 2008 Koji Otani <sho at bbr.jp>
 // Copyright (C) 2012, 2017, 2021 Adrian Johnson <ajohnson at redneon.com>
 // Copyright (C) 2012 Hib Eris <hib at hiberis.nl>
-// Copyright (C) 2016, 2018-2020 Albert Astals Cid <aacid at kde.org>
+// Copyright (C) 2016, 2018-2021 Albert Astals Cid <aacid at kde.org>
 // Copyright (C) 2016 Jason Crain <jason at aquaticape.us>
 // Copyright (C) 2018 Klarälvdalens Datakonsult AB, a KDAB Group company, <info at kdab.com>. Work sponsored by the LiMux project of the city of Munich
 // Copyright (C) 2018, 2020 Nelson Benítez León <nbenitezl at gmail.com>
@@ -88,24 +88,24 @@ int UTF16toUCS4(const Unicode *utf16, int utf16Len, Unicode **ucs4_out)
     return len;
 }
 
-int TextStringToUCS4(const GooString *textStr, Unicode **ucs4)
+int TextStringToUCS4(const std::string &textStr, Unicode **ucs4)
 {
     int i, len;
     const char *s;
     Unicode *u;
     bool isUnicode, isUnicodeLE;
 
-    len = textStr->getLength();
-    s = textStr->c_str();
+    len = textStr.size();
+    s = textStr.c_str();
     if (len == 0) {
         *ucs4 = nullptr;
         return 0;
     }
 
-    if (textStr->hasUnicodeMarker()) {
+    if (GooString::hasUnicodeMarker(textStr)) {
         isUnicode = true;
         isUnicodeLE = false;
-    } else if (textStr->hasUnicodeMarkerLE()) {
+    } else if (GooString::hasUnicodeMarkerLE(textStr)) {
         isUnicode = false;
         isUnicodeLE = true;
     } else {
@@ -357,10 +357,10 @@ uint16_t *utf8ToUtf16(const char *utf8, int *len)
     return utf16;
 }
 
-GooString *utf8ToUtf16WithBom(const GooString &utf8)
+GooString *utf8ToUtf16WithBom(const std::string &utf8)
 {
     GooString *result = new GooString();
-    if (utf8.toStr().empty()) {
+    if (utf8.empty()) {
         return result;
     }
     int tmp_length; // Number of UTF-16 symbols.
@@ -515,7 +515,7 @@ void unicodeToAscii7(const Unicode *in, int len, Unicode **ucs4_out, int *out_le
             idx = (int *)gmallocn(len * 8 + 1, sizeof(int));
     }
 
-    GooString gstr;
+    std::string str;
 
     char buf[8]; // 8 is enough for mapping an unicode char to a string
     int i, n, k;
@@ -528,14 +528,14 @@ void unicodeToAscii7(const Unicode *in, int len, Unicode **ucs4_out, int *out_le
             buf[0] = 31;
             n = 1;
         }
-        gstr.append(buf, n);
+        str.append(buf, n);
         if (indices) {
             for (; n > 0; n--)
                 idx[k++] = in_idx[i];
         }
     }
 
-    *out_len = TextStringToUCS4(&gstr, ucs4_out);
+    *out_len = TextStringToUCS4(str, ucs4_out);
 
     if (indices) {
         idx[k] = in_idx[len];
diff --git a/poppler/UTF.h b/poppler/UTF.h
index 0a85a0e2..5dca83e4 100644
--- a/poppler/UTF.h
+++ b/poppler/UTF.h
@@ -8,7 +8,7 @@
 // Copyright (C) 2016 Jason Crain <jason at aquaticape.us>
 // Copyright (C) 2018 Klarälvdalens Datakonsult AB, a KDAB Group company, <info at kdab.com>. Work sponsored by the LiMux project of the city of Munich
 // Copyright (C) 2018 Nelson Benítez León <nbenitezl at gmail.com>
-// Copyright (C) 2019, 2020 Albert Astals Cid <aacid at kde.org>
+// Copyright (C) 2019-2021 Albert Astals Cid <aacid at kde.org>
 // Copyright (C) 2021 Georgiy Sgibnev <georgiy at sgibnev.com>. Work sponsored by lab50.net.
 //
 //========================================================================
@@ -35,7 +35,7 @@ int UTF16toUCS4(const Unicode *utf16, int utf16Len, Unicode **ucs4_out);
 //   ucs4       - if the number of UCS-4 characters is > 0, allocates and
 //                returns UCS-4 string. Free with gfree.
 //   returns number of UCS-4 characters
-int POPPLER_PRIVATE_EXPORT TextStringToUCS4(const GooString *textStr, Unicode **ucs4);
+int POPPLER_PRIVATE_EXPORT TextStringToUCS4(const std::string &textStr, Unicode **ucs4);
 
 // check if UCS-4 character is valid
 bool UnicodeIsValid(Unicode ucs4);
@@ -76,7 +76,7 @@ uint16_t POPPLER_PRIVATE_EXPORT *utf8ToUtf16(const char *utf8, int *len = nullpt
 // The caller owns the returned pointer.
 //  utf8 - UTF-8 string to convert. An empty string is acceptable.
 // Returns a big endian UTF-16 string with BOM or an empty string without BOM.
-GooString POPPLER_PRIVATE_EXPORT *utf8ToUtf16WithBom(const GooString &utf8);
+GooString POPPLER_PRIVATE_EXPORT *utf8ToUtf16WithBom(const std::string &utf8);
 
 // Count number of UTF-8 bytes required to convert a UTF-16 string to
 // UTF-8 (excluding terminating NULL).
diff --git a/qt5/tests/check_utf_conversion.cpp b/qt5/tests/check_utf_conversion.cpp
index 4df1ca51..0d1a20a1 100644
--- a/qt5/tests/check_utf_conversion.cpp
+++ b/qt5/tests/check_utf_conversion.cpp
@@ -99,8 +99,8 @@ void TestUTFConversion::testUTF()
     QVERIFY(compare(utf16String, s.utf16()));
     free(utf16String);
 
-    GooString gsUtf8(str);
-    std::unique_ptr<GooString> gsUtf16_a(utf8ToUtf16WithBom(gsUtf8));
+    std::string sUtf8(str);
+    std::unique_ptr<GooString> gsUtf16_a(utf8ToUtf16WithBom(sUtf8));
     std::unique_ptr<GooString> gsUtf16_b(Poppler::QStringToUnicodeGooString(s));
     QCOMPARE(gsUtf16_a->cmp(gsUtf16_b.get()), 0);
 
@@ -131,7 +131,7 @@ void TestUTFConversion::testUnicodeToAscii7()
     GooString *goo = Poppler::QStringToUnicodeGooString(QString::fromUtf8("®©©©©©©©©©©©©©©©©©©©©")); // clazy:exclude=qstring-allocations
 
     Unicode *in;
-    const int in_len = TextStringToUCS4(goo, &in);
+    const int in_len = TextStringToUCS4(goo->toStr(), &in);
 
     delete goo;
 
@@ -163,17 +163,17 @@ void TestUTFConversion::testUnicodeToAscii7()
 void TestUTFConversion::testUnicodeLittleEndian()
 {
     uint16_t UTF16LE_hi[5] { 0xFFFE, 0x4800, 0x4900, 0x2100, 0x1126 }; // UTF16-LE "HI!☑"
-    GooString GooUTF16LE(reinterpret_cast<const char *>(UTF16LE_hi), sizeof(UTF16LE_hi));
+    std::string GooUTF16LE(reinterpret_cast<const char *>(UTF16LE_hi), sizeof(UTF16LE_hi));
 
     uint16_t UTF16BE_hi[5] { 0xFEFF, 0x0048, 0x0049, 0x0021, 0x2611 }; // UTF16-BE "HI!☑"
-    GooString GooUTF16BE(reinterpret_cast<const char *>(UTF16BE_hi), sizeof(UTF16BE_hi));
+    std::string GooUTF16BE(reinterpret_cast<const char *>(UTF16BE_hi), sizeof(UTF16BE_hi));
 
     // Let's assert both GooString's are different
-    QVERIFY(GooUTF16LE.cmp(&GooUTF16BE));
+    QVERIFY(GooUTF16LE != GooUTF16BE);
 
     Unicode *UCS4fromLE, *UCS4fromBE;
-    const int len1 = TextStringToUCS4(&GooUTF16LE, &UCS4fromLE);
-    const int len2 = TextStringToUCS4(&GooUTF16BE, &UCS4fromBE);
+    const int len1 = TextStringToUCS4(GooUTF16LE, &UCS4fromLE);
+    const int len2 = TextStringToUCS4(GooUTF16BE, &UCS4fromBE);
 
     // len is 4 because TextStringToUCS4() removes the two leading Byte Order Mark (BOM) code points
     QCOMPARE(len1, len2);
diff --git a/qt6/tests/check_utf_conversion.cpp b/qt6/tests/check_utf_conversion.cpp
index f3110922..c4d3f8db 100644
--- a/qt6/tests/check_utf_conversion.cpp
+++ b/qt6/tests/check_utf_conversion.cpp
@@ -97,8 +97,8 @@ void TestUTFConversion::testUTF()
     QVERIFY(compare(utf16String, s.utf16()));
     free(utf16String);
 
-    GooString gsUtf8(str);
-    std::unique_ptr<GooString> gsUtf16_a(utf8ToUtf16WithBom(gsUtf8));
+    std::string sUtf8(str);
+    std::unique_ptr<GooString> gsUtf16_a(utf8ToUtf16WithBom(sUtf8));
     std::unique_ptr<GooString> gsUtf16_b(Poppler::QStringToUnicodeGooString(s));
     QCOMPARE(gsUtf16_a->cmp(gsUtf16_b.get()), 0);
 
@@ -129,7 +129,7 @@ void TestUTFConversion::testUnicodeToAscii7()
     GooString *goo = Poppler::QStringToUnicodeGooString(QString::fromUtf8("®©©©©©©©©©©©©©©©©©©©©")); // clazy:exclude=qstring-allocations
 
     Unicode *in;
-    const int in_len = TextStringToUCS4(goo, &in);
+    const int in_len = TextStringToUCS4(goo->toStr(), &in);
 
     delete goo;
 
@@ -161,17 +161,17 @@ void TestUTFConversion::testUnicodeToAscii7()
 void TestUTFConversion::testUnicodeLittleEndian()
 {
     uint16_t UTF16LE_hi[5] { 0xFFFE, 0x4800, 0x4900, 0x2100, 0x1126 }; // UTF16-LE "HI!☑"
-    GooString GooUTF16LE(reinterpret_cast<const char *>(UTF16LE_hi), sizeof(UTF16LE_hi));
+    std::string GooUTF16LE(reinterpret_cast<const char *>(UTF16LE_hi), sizeof(UTF16LE_hi));
 
     uint16_t UTF16BE_hi[5] { 0xFEFF, 0x0048, 0x0049, 0x0021, 0x2611 }; // UTF16-BE "HI!☑"
-    GooString GooUTF16BE(reinterpret_cast<const char *>(UTF16BE_hi), sizeof(UTF16BE_hi));
+    std::string GooUTF16BE(reinterpret_cast<const char *>(UTF16BE_hi), sizeof(UTF16BE_hi));
 
     // Let's assert both GooString's are different
-    QVERIFY(GooUTF16LE.cmp(&GooUTF16BE));
+    QVERIFY(GooUTF16LE != GooUTF16BE);
 
     Unicode *UCS4fromLE, *UCS4fromBE;
-    const int len1 = TextStringToUCS4(&GooUTF16LE, &UCS4fromLE);
-    const int len2 = TextStringToUCS4(&GooUTF16BE, &UCS4fromBE);
+    const int len1 = TextStringToUCS4(GooUTF16LE, &UCS4fromLE);
+    const int len2 = TextStringToUCS4(GooUTF16BE, &UCS4fromBE);
 
     // len is 4 because TextStringToUCS4() removes the two leading Byte Order Mark (BOM) code points
     QCOMPARE(len1, len2);
diff --git a/utils/pdfinfo.cc b/utils/pdfinfo.cc
index d47b2564..8e9e26fd 100644
--- a/utils/pdfinfo.cc
+++ b/utils/pdfinfo.cc
@@ -116,7 +116,7 @@ static void printTextString(const GooString *s, const UnicodeMap *uMap)
 {
     Unicode *u;
     char buf[8];
-    int len = TextStringToUCS4(s, &u);
+    int len = TextStringToUCS4(s->toStr(), &u);
     for (int i = 0; i < len; i++) {
         int n = uMap->mapUnicode(u[i], buf, sizeof(buf));
         fwrite(buf, 1, n, stdout);
diff --git a/utils/pdfsig.cc b/utils/pdfsig.cc
index 2f370d26..a1579478 100644
--- a/utils/pdfsig.cc
+++ b/utils/pdfsig.cc
@@ -314,7 +314,7 @@ int main(int argc, char *argv[])
         }
 
         const char *pw = (strlen(password) == 0) ? nullptr : password;
-        const auto rs = std::unique_ptr<GooString>(reason.toStr().empty() ? nullptr : utf8ToUtf16WithBom(reason));
+        const auto rs = std::unique_ptr<GooString>(reason.toStr().empty() ? nullptr : utf8ToUtf16WithBom(reason.toStr()));
 
         if (newSignatureFieldName.getLength() == 0) {
             // Create a random field name, it could be anything but 32 hex numbers should
@@ -365,7 +365,7 @@ int main(int argc, char *argv[])
         if (etsiCAdESdetached)
             ffs->setSignatureType(ETSI_CAdES_detached);
         const char *pw = (strlen(password) == 0) ? nullptr : password;
-        const auto rs = std::unique_ptr<GooString>(reason.toStr().empty() ? nullptr : utf8ToUtf16WithBom(reason));
+        const auto rs = std::unique_ptr<GooString>(reason.toStr().empty() ? nullptr : utf8ToUtf16WithBom(reason.toStr()));
         if (ffs->getNumWidgets() != 1) {
             printf("Unexpected number of widgets for the signature: %d\n", ffs->getNumWidgets());
             return 2;


More information about the poppler mailing list