Commit d03ca88275e5f5d83701502f9ab29de833e772db

Authored by m-holger
Committed by Jay Berkenbilt
1 parent dab48544

Refactor QPDFParser::setDescriptionFromInput and rename to setDescription

Set parsed offset at the same time as setting description.
libqpdf/QPDFParser.cc
... ... @@ -3,6 +3,7 @@
3 3 #include <qpdf/QPDF.hh>
4 4 #include <qpdf/QPDFObjGen.hh>
5 5 #include <qpdf/QPDFObjectHandle.hh>
  6 +#include <qpdf/QPDFObject_private.hh>
6 7 #include <qpdf/QTC.hh>
7 8 #include <qpdf/QUtil.hh>
8 9  
... ... @@ -287,8 +288,8 @@ QPDFParser::parse(bool&amp; empty, bool content_stream)
287 288 if (!indirect_ref && !is_null) {
288 289 // No need to set description for direct nulls - they will
289 290 // become implicit.
290   - setDescriptionFromInput(object, input->getLastOffset());
291   - object.setParsedOffset(input->getLastOffset());
  291 + auto os = input->getLastOffset();
  292 + setDescription(object, os, os);
292 293 }
293 294 set_offset = true;
294 295 olist.push_back(is_null ? null_oh : object);
... ... @@ -311,13 +312,12 @@ QPDFParser::parse(bool&amp; empty, bool content_stream)
311 312 state_stack.pop_back();
312 313 if (old_state == st_array) {
313 314 object = QPDFObjectHandle::newArray(olist);
314   - setDescriptionFromInput(object, offset);
  315 + setDescription(object, offset, offset - 1);
315 316 // The `offset` points to the next of "[". Set the rewind
316 317 // offset to point to the beginning of "[". This has been
317 318 // explicitly tested with whitespace surrounding the array start
318 319 // delimiter. getLastOffset points to the array end token and
319 320 // therefore can't be used here.
320   - object.setParsedOffset(offset - 1);
321 321 set_offset = true;
322 322 } else if (old_state == st_dictionary) {
323 323 // Convert list to map. Alternating elements are keys. Attempt
... ... @@ -362,7 +362,7 @@ QPDFParser::parse(bool&amp; empty, bool content_stream)
362 362 "dictionary ended prematurely; "
363 363 "using null as value for last key");
364 364 val = QPDFObjectHandle::newNull();
365   - setDescriptionFromInput(val, offset);
  365 + setDescription(val, offset);
366 366 } else {
367 367 val = olist.at(++i);
368 368 }
... ... @@ -386,13 +386,12 @@ QPDFParser::parse(bool&amp; empty, bool content_stream)
386 386 dict["/Contents"].setParsedOffset(frame.contents_offset);
387 387 }
388 388 object = QPDFObjectHandle::newDictionary(dict);
389   - setDescriptionFromInput(object, offset);
  389 + setDescription(object, offset, offset - 2);
390 390 // The `offset` points to the next of "<<". Set the rewind
391 391 // offset to point to the beginning of "<<". This has been
392 392 // explicitly tested with whitespace surrounding the dictionary
393 393 // start delimiter. getLastOffset points to the dictionary end
394 394 // token and therefore can't be used here.
395   - object.setParsedOffset(offset - 2);
396 395 set_offset = true;
397 396 }
398 397 stack.pop_back();
... ... @@ -408,20 +407,24 @@ QPDFParser::parse(bool&amp; empty, bool content_stream)
408 407 object = QPDFObjectHandle::newNull();
409 408 }
410 409 if (!set_offset) {
411   - setDescriptionFromInput(object, offset);
412   - object.setParsedOffset(offset);
  410 + setDescription(object, offset, offset);
413 411 }
414 412 return object;
415 413 }
416 414  
417 415 void
418   -QPDFParser::setDescriptionFromInput(
419   - QPDFObjectHandle oh, qpdf_offset_t offset) const
  416 +QPDFParser::setDescription(
  417 + QPDFObjectHandle oh,
  418 + qpdf_offset_t descr_offset,
  419 + qpdf_offset_t parsed_offset) const
420 420 {
421   - oh.setObjectDescription(
422   - context,
423   - (input->getName() + ", " + object_description + " at offset " +
424   - std::to_string(offset)));
  421 + if (auto& obj = oh.obj) {
  422 + obj->setDescription(
  423 + context,
  424 + (input->getName() + ", " + object_description + " at offset " +
  425 + std::to_string(descr_offset)),
  426 + parsed_offset);
  427 + }
425 428 }
426 429  
427 430 void
... ...
libqpdf/QPDF_Stream.cc
... ... @@ -124,8 +124,9 @@ QPDF_Stream::QPDF_Stream(
124 124 "object for dictionary");
125 125 }
126 126 setDescription(
127   - qpdf, qpdf->getFilename() + ", stream object " + og.unparse(' '));
128   - this->parsed_offset = offset;
  127 + qpdf,
  128 + qpdf->getFilename() + ", stream object " + og.unparse(' '),
  129 + offset);
129 130 }
130 131  
131 132 std::shared_ptr<QPDFObject>
... ... @@ -282,9 +283,10 @@ QPDF_Stream::getStreamJSON(
282 283 }
283 284  
284 285 void
285   -QPDF_Stream::setDescription(QPDF* qpdf, std::string const& description)
  286 +QPDF_Stream::setDescription(
  287 + QPDF* qpdf, std::string const& description, qpdf_offset_t offset)
286 288 {
287   - this->QPDFValue::setDescription(qpdf, description);
  289 + this->QPDFValue::setDescription(qpdf, description, offset);
288 290 setDictDescription();
289 291 }
290 292  
... ...
libqpdf/qpdf/QPDFObject_private.hh
... ... @@ -70,9 +70,10 @@ class QPDFObject
70 70 }
71 71  
72 72 void
73   - setDescription(QPDF* qpdf, std::string const& description)
  73 + setDescription(
  74 + QPDF* qpdf, std::string const& description, qpdf_offset_t offset = -1)
74 75 {
75   - return value->setDescription(qpdf, description);
  76 + return value->setDescription(qpdf, description, offset);
76 77 }
77 78 bool
78 79 getDescription(QPDF*& qpdf, std::string& description)
... ...
libqpdf/qpdf/QPDFParser.hh
... ... @@ -40,9 +40,11 @@ class QPDFParser
40 40 void warn(qpdf_offset_t offset, std::string const& msg) const;
41 41 void warn(std::string const& msg) const;
42 42 static void warn(QPDF*, QPDFExc const&);
43   - void setParsedOffset(qpdf_offset_t offset);
44   - void
45   - setDescriptionFromInput(QPDFObjectHandle oh, qpdf_offset_t offset) const;
  43 +
  44 + void setDescription(
  45 + QPDFObjectHandle oh,
  46 + qpdf_offset_t descr_offset,
  47 + qpdf_offset_t parsed_offset = -1) const;
46 48 std::shared_ptr<InputSource> input;
47 49 std::string const& object_description;
48 50 QPDFTokenizer& tokenizer;
... ...
libqpdf/qpdf/QPDFValue.hh
... ... @@ -24,10 +24,12 @@ class QPDFValue
24 24 virtual std::string unparse() = 0;
25 25 virtual JSON getJSON(int json_version) = 0;
26 26 virtual void
27   - setDescription(QPDF* qpdf_p, std::string const& description)
  27 + setDescription(
  28 + QPDF* qpdf_p, std::string const& description, qpdf_offset_t offset)
28 29 {
29 30 qpdf = qpdf_p;
30 31 object_description = description;
  32 + setParsedOffset(offset);
31 33 }
32 34 bool
33 35 getDescription(QPDF*& qpdf_p, std::string& description)
... ...
libqpdf/qpdf/QPDF_Stream.hh
... ... @@ -26,7 +26,8 @@ class QPDF_Stream: public QPDFValue
26 26 virtual std::shared_ptr<QPDFObject> copy(bool shallow = false);
27 27 virtual std::string unparse();
28 28 virtual JSON getJSON(int json_version);
29   - virtual void setDescription(QPDF*, std::string const&);
  29 + virtual void
  30 + setDescription(QPDF*, std::string const&, qpdf_offset_t offset);
30 31 virtual void disconnect();
31 32 QPDFObjectHandle getDict() const;
32 33 bool isDataModified() const;
... ...