From bf7c6a80705c2b913b63a84349e030f1d9dc8233 Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Sat, 17 Aug 2019 22:13:57 -0400 Subject: Use SparseOHArray in parsing --- libqpdf/QPDFObjectHandle.cc | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/libqpdf/QPDFObjectHandle.cc b/libqpdf/QPDFObjectHandle.cc index 051e5e97..cd03ef1c 100644 --- a/libqpdf/QPDFObjectHandle.cc +++ b/libqpdf/QPDFObjectHandle.cc @@ -19,6 +19,7 @@ #include #include #include +#include #include #include @@ -1715,8 +1716,8 @@ QPDFObjectHandle::parseInternal(PointerHolder input, QPDFObjectHandle object; - std::vector > olist_stack; - olist_stack.push_back(std::vector()); + std::vector olist_stack; + olist_stack.push_back(SparseOHArray()); std::vector state_stack; state_stack.push_back(st_top); std::vector offset_stack; @@ -1728,7 +1729,7 @@ QPDFObjectHandle::parseInternal(PointerHolder input, while (! done) { bool bad = false; - std::vector& olist = olist_stack.back(); + SparseOHArray& olist = olist_stack.back(); parser_state_e state = state_stack.back(); offset = offset_stack.back(); @@ -1828,7 +1829,7 @@ QPDFObjectHandle::parseInternal(PointerHolder input, } else { - olist_stack.push_back(std::vector()); + olist_stack.push_back(SparseOHArray()); state = st_start; offset_stack.push_back(input->tell()); state_stack.push_back( @@ -1883,8 +1884,8 @@ QPDFObjectHandle::parseInternal(PointerHolder input, context, olist.at(olist.size() - 2).getIntValueAsInt(), olist.at(olist.size() - 1).getIntValueAsInt()); - olist.pop_back(); - olist.pop_back(); + olist.remove_last(); + olist.remove_last(); } else if ((value == "endobj") && (state == st_top)) { @@ -1996,7 +1997,7 @@ QPDFObjectHandle::parseInternal(PointerHolder input, setObjectDescriptionFromInput( object, context, object_description, input, input->getLastOffset()); - olist.push_back(object); + olist.append(object); break; case st_top: @@ -2017,7 +2018,9 @@ QPDFObjectHandle::parseInternal(PointerHolder input, state_stack.pop_back(); if (old_state == st_array) { - object = newArray(olist); + // There's no newArray(SparseOHArray) since + // SparseOHArray is not part of the public API. + object = QPDFObjectHandle(new QPDF_Array(olist)); setObjectDescriptionFromInput( object, context, object_description, input, offset); } @@ -2027,13 +2030,13 @@ QPDFObjectHandle::parseInternal(PointerHolder input, // Attempt to recover more or less gracefully from // invalid dictionaries. std::set names; - for (std::vector::iterator iter = - olist.begin(); - iter != olist.end(); ++iter) + size_t n_elements = olist.size(); + for (size_t i = 0; i < n_elements; ++i) { - if ((! (*iter).isIndirect()) && (*iter).isName()) + QPDFObjectHandle oh = olist.at(i); + if ((! oh.isIndirect()) && oh.isName()) { - names.insert((*iter).getName()); + names.insert(oh.getName()); } } @@ -2097,7 +2100,7 @@ QPDFObjectHandle::parseInternal(PointerHolder input, } else { - olist_stack.back().push_back(object); + olist_stack.back().append(object); } } } -- cgit v1.2.3-54-g00ecf