Commit c62e8e2b285b9b401d6add5a7a0da98c7ea86373

Authored by Jay Berkenbilt
1 parent 3f22bea0

Update for clean compile with POINTERHOLDER_TRANSITION=2

autoconf.mk.in
... ... @@ -22,7 +22,7 @@ LDFLAGS=@LDFLAGS@
22 22 LIBS=@LIBS@
23 23 CPPFLAGS=@CPPFLAGS@
24 24 CXX=@CXX@
25   -CXXFLAGS=@CXXFLAGS@ $(CXXWFLAGS) $(WFLAGS)
  25 +CXXFLAGS=@CXXFLAGS@ $(CXXWFLAGS) $(WFLAGS) -DPOINTERHOLDER_TRANSITION=2
26 26 RPATH=@RPATH@
27 27 AR=@AR@
28 28 RANLIB=@RANLIB@
... ...
examples/pdf-filter-tokens.cc
... ... @@ -220,8 +220,11 @@ int main(int argc, char* argv[])
220 220 // applied. See comments on the filters for additional
221 221 // details.
222 222 QPDFPageObjectHelper& page(*iter);
223   - page.addContentTokenFilter(new StringReverser);
224   - page.addContentTokenFilter(new ColorToGray);
  223 + page.addContentTokenFilter(
  224 + PointerHolder<QPDFObjectHandle::TokenFilter>(
  225 + new StringReverser));
  226 + page.addContentTokenFilter(
  227 + PointerHolder<QPDFObjectHandle::TokenFilter>(new ColorToGray));
225 228 }
226 229  
227 230 QPDFWriter w(pdf, outfilename);
... ...
examples/pdf-invert-images.cc
... ... @@ -139,7 +139,7 @@ int main(int argc, char* argv[])
139 139 qpdf.processFile(infilename, password);
140 140  
141 141 ImageInverter* inv = new ImageInverter;
142   - PointerHolder<QPDFObjectHandle::StreamDataProvider> p = inv;
  142 + auto p = PointerHolder<QPDFObjectHandle::StreamDataProvider>(inv);
143 143  
144 144 // For each page...
145 145 std::vector<QPDFPageObjectHelper> pages =
... ...
fuzz/qpdf_fuzzer.cc
... ... @@ -47,9 +47,9 @@ FuzzHelper::FuzzHelper(unsigned char const* data, size_t size) :
47 47 PointerHolder<QPDF>
48 48 FuzzHelper::getQpdf()
49 49 {
50   - PointerHolder<InputSource> is =
51   - new BufferInputSource("fuzz input", &this->input_buffer);
52   - PointerHolder<QPDF> qpdf = new QPDF();
  50 + auto is = PointerHolder<InputSource>(
  51 + new BufferInputSource("fuzz input", &this->input_buffer));
  52 + auto qpdf = make_pointer_holder<QPDF>();
53 53 qpdf->processInputSource(is);
54 54 return qpdf;
55 55 }
... ... @@ -57,7 +57,7 @@ FuzzHelper::getQpdf()
57 57 PointerHolder<QPDFWriter>
58 58 FuzzHelper::getWriter(PointerHolder<QPDF> qpdf)
59 59 {
60   - PointerHolder<QPDFWriter> w = new QPDFWriter(*qpdf);
  60 + auto w = make_pointer_holder<QPDFWriter>(*qpdf);
61 61 w->setOutputPipeline(&this->discard);
62 62 w->setDecodeLevel(qpdf_dl_all);
63 63 return w;
... ...
include/qpdf/Buffer.hh
... ... @@ -24,7 +24,9 @@
24 24  
25 25 #include <qpdf/DLL.h>
26 26 #include <qpdf/PointerHolder.hh>
  27 +
27 28 #include <stddef.h>
  29 +#include <memory>
28 30  
29 31 class Buffer
30 32 {
... ...
include/qpdf/ClosedFileInputSource.hh
... ... @@ -31,6 +31,8 @@
31 31 #include <qpdf/InputSource.hh>
32 32 #include <qpdf/PointerHolder.hh>
33 33  
  34 +#include <memory>
  35 +
34 36 class FileInputSource;
35 37  
36 38 class ClosedFileInputSource: public InputSource
... ...
include/qpdf/InputSource.hh
... ... @@ -25,8 +25,10 @@
25 25 #include <qpdf/DLL.h>
26 26 #include <qpdf/Types.h>
27 27 #include <qpdf/PointerHolder.hh>
  28 +
28 29 #include <stdio.h>
29 30 #include <string>
  31 +#include <memory>
30 32  
31 33 class QPDF_DLL_CLASS InputSource
32 34 {
... ...
include/qpdf/JSON.hh
... ... @@ -37,6 +37,7 @@
37 37  
38 38 #include <qpdf/DLL.h>
39 39 #include <qpdf/PointerHolder.hh>
  40 +
40 41 #include <string>
41 42 #include <map>
42 43 #include <vector>
... ...
include/qpdf/Pipeline.hh
... ... @@ -46,7 +46,9 @@
46 46  
47 47 #include <qpdf/DLL.h>
48 48 #include <qpdf/PointerHolder.hh>
  49 +
49 50 #include <string>
  51 +#include <memory>
50 52  
51 53 class QPDF_DLL_CLASS Pipeline
52 54 {
... ...
include/qpdf/Pl_Buffer.hh
... ... @@ -37,6 +37,8 @@
37 37 #include <qpdf/PointerHolder.hh>
38 38 #include <qpdf/Buffer.hh>
39 39  
  40 +#include <memory>
  41 +
40 42 class Pl_Buffer: public Pipeline
41 43 {
42 44 public:
... ...
include/qpdf/Pl_QPDFTokenizer.hh
... ... @@ -29,6 +29,8 @@
29 29 #include <qpdf/QPDFObjectHandle.hh>
30 30 #include <qpdf/Pl_Buffer.hh>
31 31  
  32 +#include <memory>
  33 +
32 34 // Tokenize the incoming text using QPDFTokenizer and pass the tokens
33 35 // in turn to a QPDFObjectHandle::TokenFilter object. All bytes of
34 36 // incoming content will be included in exactly one token and passed
... ...
include/qpdf/QPDFObjectHandle.hh
... ... @@ -31,6 +31,7 @@
31 31 #include <set>
32 32 #include <map>
33 33 #include <functional>
  34 +#include <memory>
34 35  
35 36 #include <qpdf/QPDFObjGen.hh>
36 37 #include <qpdf/PointerHolder.hh>
... ...
include/qpdf/QPDFTokenizer.hh
... ... @@ -26,8 +26,10 @@
26 26  
27 27 #include <qpdf/InputSource.hh>
28 28 #include <qpdf/PointerHolder.hh>
  29 +
29 30 #include <string>
30 31 #include <stdio.h>
  32 +#include <memory>
31 33  
32 34 class QPDFTokenizer
33 35 {
... ...
libqpdf/Buffer.cc
... ... @@ -57,7 +57,7 @@ Buffer::copy(Buffer const&amp; rhs)
57 57 {
58 58 if (this != &rhs)
59 59 {
60   - this->m = new Members(rhs.m->size, 0, true);
  60 + this->m = PointerHolder<Members>(new Members(rhs.m->size, 0, true));
61 61 if (this->m->size)
62 62 {
63 63 memcpy(this->m->buf, rhs.m->buf, this->m->size);
... ...
libqpdf/ClosedFileInputSource.cc
... ... @@ -27,7 +27,7 @@ ClosedFileInputSource::before()
27 27 {
28 28 if (0 == this->m->fis.get())
29 29 {
30   - this->m->fis = new FileInputSource();
  30 + this->m->fis = make_pointer_holder<FileInputSource>();
31 31 this->m->fis->setFilename(this->m->filename.c_str());
32 32 this->m->fis->seek(this->m->offset, SEEK_SET);
33 33 this->m->fis->setLastOffset(this->last_offset);
... ...
libqpdf/FileInputSource.cc
... ... @@ -27,7 +27,7 @@ FileInputSource::FileInputSource() :
27 27 void
28 28 FileInputSource::setFilename(char const* filename)
29 29 {
30   - this->m = new Members(true);
  30 + this->m = PointerHolder<Members>(new Members(true));
31 31 this->m->filename = filename;
32 32 this->m->file = QUtil::safe_fopen(filename, "rb");
33 33 }
... ... @@ -36,7 +36,7 @@ void
36 36 FileInputSource::setFile(
37 37 char const* description, FILE* filep, bool close_file)
38 38 {
39   - this->m = new Members(close_file);
  39 + this->m = PointerHolder<Members>(new Members(close_file));
40 40 this->m->filename = description;
41 41 this->m->file = filep;
42 42 this->seek(0, SEEK_SET);
... ...
libqpdf/Pl_Buffer.cc
... ... @@ -31,14 +31,14 @@ Pl_Buffer::write(unsigned char* buf, size_t len)
31 31 {
32 32 if (this->m->data.get() == 0)
33 33 {
34   - this->m->data = new Buffer(len);
  34 + this->m->data = make_pointer_holder<Buffer>(len);
35 35 }
36 36 size_t cur_size = this->m->data->getSize();
37 37 size_t left = cur_size - this->m->total_size;
38 38 if (left < len)
39 39 {
40 40 size_t new_size = std::max(this->m->total_size + len, 2 * cur_size);
41   - PointerHolder<Buffer> b = new Buffer(new_size);
  41 + auto b = make_pointer_holder<Buffer>(new_size);
42 42 memcpy(b->getBuffer(), this->m->data->getBuffer(), this->m->total_size);
43 43 this->m->data = b;
44 44 }
... ... @@ -108,5 +108,5 @@ Pl_Buffer::getMallocBuffer(unsigned char **buf, size_t* len)
108 108 {
109 109 *buf = nullptr;
110 110 }
111   - this->m = new Members();
  111 + this->m = PointerHolder<Members>(new Members());
112 112 }
... ...
libqpdf/Pl_QPDFTokenizer.cc
... ... @@ -43,10 +43,10 @@ void
43 43 Pl_QPDFTokenizer::finish()
44 44 {
45 45 this->m->buf.finish();
46   - PointerHolder<InputSource> input =
  46 + auto input = PointerHolder<InputSource>(
47 47 new BufferInputSource("tokenizer data",
48   - this->m->buf.getBuffer(), true);
49   -
  48 + this->m->buf.getBuffer(), true));
  49 +
50 50 while (true)
51 51 {
52 52 QPDFTokenizer::Token token = this->m->tokenizer.readToken(
... ...
libqpdf/QPDF.cc
... ... @@ -269,7 +269,7 @@ QPDF::processFile(char const* filename, char const* password)
269 269 {
270 270 FileInputSource* fi = new FileInputSource();
271 271 fi->setFilename(filename);
272   - processInputSource(fi, password);
  272 + processInputSource(PointerHolder<InputSource>(fi), password);
273 273 }
274 274  
275 275 void
... ... @@ -278,7 +278,7 @@ QPDF::processFile(char const* description, FILE* filep,
278 278 {
279 279 FileInputSource* fi = new FileInputSource();
280 280 fi->setFile(description, filep, close_file);
281   - processInputSource(fi, password);
  281 + processInputSource(PointerHolder<InputSource>(fi), password);
282 282 }
283 283  
284 284 void
... ... @@ -287,10 +287,11 @@ QPDF::processMemoryFile(char const* description,
287 287 char const* password)
288 288 {
289 289 processInputSource(
290   - new BufferInputSource(
291   - description,
292   - new Buffer(QUtil::unsigned_char_pointer(buf), length),
293   - true),
  290 + PointerHolder<InputSource>(
  291 + new BufferInputSource(
  292 + description,
  293 + new Buffer(QUtil::unsigned_char_pointer(buf), length),
  294 + true)),
294 295 password);
295 296 }
296 297  
... ... @@ -305,7 +306,7 @@ QPDF::processInputSource(PointerHolder&lt;InputSource&gt; source,
305 306 void
306 307 QPDF::closeInputSource()
307 308 {
308   - this->m->file = new InvalidInputSource();
  309 + this->m->file = PointerHolder<InputSource>(new InvalidInputSource());
309 310 }
310 311  
311 312 void
... ... @@ -425,7 +426,8 @@ QPDF::findHeader()
425 426 // offsets in the file are such that 0 points to the
426 427 // beginning of the header.
427 428 QTC::TC("qpdf", "QPDF global offset");
428   - this->m->file = new OffsetInputSource(this->m->file, global_offset);
  429 + this->m->file = PointerHolder<InputSource>(
  430 + new OffsetInputSource(this->m->file, global_offset));
429 431 }
430 432 }
431 433 return valid;
... ... @@ -1607,7 +1609,8 @@ QPDF::readObject(PointerHolder&lt;InputSource&gt; input,
1607 1609 StringDecrypter* decrypter = 0;
1608 1610 if (this->m->encp->encrypted && (! in_object_stream))
1609 1611 {
1610   - decrypter_ph = new StringDecrypter(this, objid, generation);
  1612 + decrypter_ph = make_pointer_holder<StringDecrypter>(
  1613 + this, objid, generation);
1611 1614 decrypter = decrypter_ph.get();
1612 1615 }
1613 1616 QPDFObjectHandle object = QPDFObjectHandle::parse(
... ... @@ -2105,7 +2108,7 @@ QPDF::resolve(int objid, int generation)
2105 2108 "loop detected resolving object " +
2106 2109 QUtil::int_to_string(objid) + " " +
2107 2110 QUtil::int_to_string(generation)));
2108   - return new QPDF_Null;
  2111 + return PointerHolder<QPDFObject>(new QPDF_Null);
2109 2112 }
2110 2113 ResolveRecorder rr(this, og);
2111 2114  
... ... @@ -2231,10 +2234,11 @@ QPDF::resolveObjectsInStream(int obj_stream_number)
2231 2234 std::map<int, int> offsets;
2232 2235  
2233 2236 PointerHolder<Buffer> bp = obj_stream.getStreamData(qpdf_dl_specialized);
2234   - PointerHolder<InputSource> input = new BufferInputSource(
2235   - this->m->file->getName() +
2236   - " object stream " + QUtil::int_to_string(obj_stream_number),
2237   - bp.get());
  2237 + auto input = PointerHolder<InputSource>(
  2238 + new BufferInputSource(
  2239 + this->m->file->getName() +
  2240 + " object stream " + QUtil::int_to_string(obj_stream_number),
  2241 + bp.get()));
2238 2242  
2239 2243 for (int i = 0; i < n; ++i)
2240 2244 {
... ... @@ -2630,7 +2634,9 @@ QPDF::copyStreamData(QPDFObjectHandle result, QPDFObjectHandle foreign)
2630 2634 {
2631 2635 this->m->copied_stream_data_provider =
2632 2636 new CopiedStreamDataProvider(*this);
2633   - this->m->copied_streams = this->m->copied_stream_data_provider;
  2637 + this->m->copied_streams =
  2638 + PointerHolder<QPDFObjectHandle::StreamDataProvider>(
  2639 + this->m->copied_stream_data_provider);
2634 2640 }
2635 2641 QPDFObjGen local_og(result.getObjGen());
2636 2642 // Copy information from the foreign stream so we can pipe its
... ... @@ -2686,8 +2692,8 @@ QPDF::copyStreamData(QPDFObjectHandle result, QPDFObjectHandle foreign)
2686 2692 }
2687 2693 else
2688 2694 {
2689   - PointerHolder<ForeignStreamData> foreign_stream_data =
2690   - new ForeignStreamData(
  2695 + auto foreign_stream_data =
  2696 + make_pointer_holder<ForeignStreamData>(
2691 2697 foreign_stream_qpdf->m->encp,
2692 2698 foreign_stream_qpdf->m->file,
2693 2699 foreign.getObjectID(),
... ...
libqpdf/QPDFAcroFormDocumentHelper.cc
... ... @@ -768,7 +768,7 @@ QPDFAcroFormDocumentHelper::adjustDefaultAppearances(
768 768 ResourceReplacer rr(dr_map, rf.getNamesByResourceType());
769 769 Pl_Buffer buf_pl("filtered DA");
770 770 da_stream.filterAsContents(&rr, &buf_pl);
771   - PointerHolder<Buffer> buf = buf_pl.getBuffer();
  771 + auto buf = buf_pl.getBufferSharedPointer();
772 772 std::string new_da(
773 773 reinterpret_cast<char*>(buf->getBuffer()), buf->getSize());
774 774 obj.replaceKey("/DA", QPDFObjectHandle::newString(new_da));
... ... @@ -871,7 +871,7 @@ QPDFAcroFormDocumentHelper::adjustAppearanceStream(
871 871 QTC::TC("qpdf", "QPDFAcroFormDocumentHelper AP parse error");
872 872 }
873 873 auto rr = new ResourceReplacer(dr_map, rf.getNamesByResourceType());
874   - PointerHolder<QPDFObjectHandle::TokenFilter> tf = rr;
  874 + auto tf = PointerHolder<QPDFObjectHandle::TokenFilter>(rr);
875 875 stream.addTokenFilter(tf);
876 876 }
877 877 catch (std::exception& e)
... ... @@ -902,7 +902,7 @@ QPDFAcroFormDocumentHelper::transformAnnotations(
902 902 }
903 903 else if ((from_qpdf != &this->qpdf) && (! from_afdh))
904 904 {
905   - afdhph = new QPDFAcroFormDocumentHelper(*from_qpdf);
  905 + afdhph = make_pointer_holder<QPDFAcroFormDocumentHelper>(*from_qpdf);
906 906 from_afdh = afdhph.get();
907 907 }
908 908 bool foreign = (from_qpdf != &this->qpdf);
... ...
libqpdf/QPDFFormFieldObjectHelper.cc
... ... @@ -1008,5 +1008,7 @@ QPDFFormFieldObjectHelper::generateTextAppearance(
1008 1008 opt.at(i) = (*encoder)(opt.at(i), '?');
1009 1009 }
1010 1010  
1011   - AS.addTokenFilter(new ValueSetter(DA, V, opt, tf, bbox));
  1011 + AS.addTokenFilter(
  1012 + PointerHolder<QPDFObjectHandle::TokenFilter>(
  1013 + new ValueSetter(DA, V, opt, tf, bbox)));
1012 1014 }
... ...
libqpdf/QPDFJob.cc
... ... @@ -2854,14 +2854,14 @@ QPDFJob::handlePageSpecs(
2854 2854 {
2855 2855 QTC::TC("qpdf", "QPDFJob keep files open n");
2856 2856 cis = new ClosedFileInputSource(page_spec.filename.c_str());
2857   - is = cis;
  2857 + is = PointerHolder<InputSource>(cis);
2858 2858 cis->stayOpen(true);
2859 2859 }
2860 2860 else
2861 2861 {
2862 2862 QTC::TC("qpdf", "QPDFJob keep files open y");
2863 2863 FileInputSource* fis = new FileInputSource();
2864   - is = fis;
  2864 + is = PointerHolder<InputSource>(fis);
2865 2865 fis->setFilename(page_spec.filename.c_str());
2866 2866 }
2867 2867 std::shared_ptr<QPDF> qpdf_ph = processInputSource(is, password);
... ... @@ -3489,9 +3489,10 @@ QPDFJob::setWriterOptions(QPDF&amp; pdf, QPDFWriter&amp; w)
3489 3489 if (m->progress && m->outfilename)
3490 3490 {
3491 3491 w.registerProgressReporter(
3492   - new ProgressReporter(
3493   - *(this->m->cout), this->m->message_prefix,
3494   - m->outfilename.get()));
  3492 + PointerHolder<QPDFWriter::ProgressReporter>(
  3493 + new ProgressReporter(
  3494 + *(this->m->cout), this->m->message_prefix,
  3495 + m->outfilename.get())));
3495 3496 }
3496 3497 }
3497 3498  
... ...
libqpdf/QPDFObjectHandle.cc
... ... @@ -1603,7 +1603,7 @@ QPDFObjectHandle::replaceStreamData(std::string const&amp; data,
1603 1603 QPDFObjectHandle const& decode_parms)
1604 1604 {
1605 1605 assertStream();
1606   - PointerHolder<Buffer> b = new Buffer(data.length());
  1606 + auto b = make_pointer_holder<Buffer>(data.length());
1607 1607 unsigned char* bp = b->getBuffer();
1608 1608 memcpy(bp, data.c_str(), data.length());
1609 1609 dynamic_cast<QPDF_Stream*>(obj.get())->replaceStreamData(
... ... @@ -1659,7 +1659,8 @@ QPDFObjectHandle::replaceStreamData(std::function&lt;void(Pipeline*)&gt; provider,
1659 1659 QPDFObjectHandle const& decode_parms)
1660 1660 {
1661 1661 assertStream();
1662   - PointerHolder<StreamDataProvider> sdp = new FunctionProvider(provider);
  1662 + auto sdp = PointerHolder<StreamDataProvider>(
  1663 + new FunctionProvider(provider));
1663 1664 dynamic_cast<QPDF_Stream*>(obj.get())->replaceStreamData(
1664 1665 sdp, filter, decode_parms);
1665 1666 }
... ... @@ -1671,7 +1672,8 @@ QPDFObjectHandle::replaceStreamData(
1671 1672 QPDFObjectHandle const& decode_parms)
1672 1673 {
1673 1674 assertStream();
1674   - PointerHolder<StreamDataProvider> sdp = new FunctionProvider(provider);
  1675 + auto sdp = PointerHolder<StreamDataProvider>(
  1676 + new FunctionProvider(provider));
1675 1677 dynamic_cast<QPDF_Stream*>(obj.get())->replaceStreamData(
1676 1678 sdp, filter, decode_parms);
1677 1679 }
... ... @@ -1886,8 +1888,8 @@ QPDFObjectHandle::coalesceContentStreams()
1886 1888 QPDFObjectHandle new_contents = newStream(qpdf);
1887 1889 this->replaceKey("/Contents", new_contents);
1888 1890  
1889   - PointerHolder<StreamDataProvider> provider =
1890   - new CoalesceProvider(*this, contents);
  1891 + auto provider = PointerHolder<StreamDataProvider>(
  1892 + new CoalesceProvider(*this, contents));
1891 1893 new_contents.replaceStreamData(provider, newNull(), newNull());
1892 1894 }
1893 1895  
... ... @@ -1976,8 +1978,8 @@ QPDFObjectHandle::parse(QPDF* context,
1976 1978 std::string const& object_str,
1977 1979 std::string const& object_description)
1978 1980 {
1979   - PointerHolder<InputSource> input =
1980   - new BufferInputSource("parsed object", object_str);
  1981 + auto input = PointerHolder<InputSource>(
  1982 + new BufferInputSource("parsed object", object_str));
1981 1983 QPDFTokenizer tokenizer;
1982 1984 bool empty = false;
1983 1985 QPDFObjectHandle result =
... ... @@ -2103,7 +2105,7 @@ QPDFObjectHandle::parseContentStream_internal(
2103 2105 Pl_Buffer buf("concatenated stream data buffer");
2104 2106 std::string all_description;
2105 2107 pipeContentStreams(&buf, description, all_description);
2106   - PointerHolder<Buffer> stream_data = buf.getBuffer();
  2108 + auto stream_data = buf.getBufferSharedPointer();
2107 2109 callbacks->contentSize(stream_data->getSize());
2108 2110 try
2109 2111 {
... ... @@ -2125,8 +2127,8 @@ QPDFObjectHandle::parseContentStream_data(
2125 2127 QPDF* context)
2126 2128 {
2127 2129 size_t stream_length = stream_data->getSize();
2128   - PointerHolder<InputSource> input =
2129   - new BufferInputSource(description, stream_data.get());
  2130 + auto input = PointerHolder<InputSource>(
  2131 + new BufferInputSource(description, stream_data.get()));
2130 2132 QPDFTokenizer tokenizer;
2131 2133 tokenizer.allowEOF();
2132 2134 bool empty = false;
... ... @@ -3078,32 +3080,32 @@ QPDFObjectHandle::copyObject(std::set&lt;QPDFObjGen&gt;&amp; visited,
3078 3080 if (isBool())
3079 3081 {
3080 3082 QTC::TC("qpdf", "QPDFObjectHandle clone bool");
3081   - new_obj = new QPDF_Bool(getBoolValue());
  3083 + new_obj = PointerHolder<QPDFObject>(new QPDF_Bool(getBoolValue()));
3082 3084 }
3083 3085 else if (isNull())
3084 3086 {
3085 3087 QTC::TC("qpdf", "QPDFObjectHandle clone null");
3086   - new_obj = new QPDF_Null();
  3088 + new_obj = PointerHolder<QPDFObject>(new QPDF_Null());
3087 3089 }
3088 3090 else if (isInteger())
3089 3091 {
3090 3092 QTC::TC("qpdf", "QPDFObjectHandle clone integer");
3091   - new_obj = new QPDF_Integer(getIntValue());
  3093 + new_obj = PointerHolder<QPDFObject>(new QPDF_Integer(getIntValue()));
3092 3094 }
3093 3095 else if (isReal())
3094 3096 {
3095 3097 QTC::TC("qpdf", "QPDFObjectHandle clone real");
3096   - new_obj = new QPDF_Real(getRealValue());
  3098 + new_obj = PointerHolder<QPDFObject>(new QPDF_Real(getRealValue()));
3097 3099 }
3098 3100 else if (isName())
3099 3101 {
3100 3102 QTC::TC("qpdf", "QPDFObjectHandle clone name");
3101   - new_obj = new QPDF_Name(getName());
  3103 + new_obj = PointerHolder<QPDFObject>(new QPDF_Name(getName()));
3102 3104 }
3103 3105 else if (isString())
3104 3106 {
3105 3107 QTC::TC("qpdf", "QPDFObjectHandle clone string");
3106   - new_obj = new QPDF_String(getStringValue());
  3108 + new_obj = PointerHolder<QPDFObject>(new QPDF_String(getStringValue()));
3107 3109 }
3108 3110 else if (isArray())
3109 3111 {
... ... @@ -3121,7 +3123,7 @@ QPDFObjectHandle::copyObject(std::set&lt;QPDFObjGen&gt;&amp; visited,
3121 3123 first_level_only, stop_at_streams);
3122 3124 }
3123 3125 }
3124   - new_obj = new QPDF_Array(items);
  3126 + new_obj = PointerHolder<QPDFObject>(new QPDF_Array(items));
3125 3127 }
3126 3128 else if (isDictionary())
3127 3129 {
... ... @@ -3140,7 +3142,7 @@ QPDFObjectHandle::copyObject(std::set&lt;QPDFObjGen&gt;&amp; visited,
3140 3142 first_level_only, stop_at_streams);
3141 3143 }
3142 3144 }
3143   - new_obj = new QPDF_Dictionary(items);
  3145 + new_obj = PointerHolder<QPDFObject>(new QPDF_Dictionary(items));
3144 3146 }
3145 3147 else
3146 3148 {
... ... @@ -3461,7 +3463,7 @@ QPDFObjectHandle::dereference()
3461 3463 {
3462 3464 // QPDF::resolve never returns an uninitialized object, but
3463 3465 // check just in case.
3464   - this->obj = new QPDF_Null();
  3466 + this->obj = PointerHolder<QPDFObject>(new QPDF_Null());
3465 3467 }
3466 3468 else if (dynamic_cast<QPDF_Reserved*>(obj.get()))
3467 3469 {
... ...
libqpdf/QPDFOutlineDocumentHelper.cc
... ... @@ -114,7 +114,8 @@ QPDFOutlineDocumentHelper::resolveNamedDest(QPDFObjectHandle name)
114 114 if (dests.isDictionary())
115 115 {
116 116 this->m->names_dest =
117   - new QPDFNameTreeObjectHelper(dests, this->qpdf);
  117 + make_pointer_holder<QPDFNameTreeObjectHelper>(
  118 + dests, this->qpdf);
118 119 }
119 120 }
120 121 }
... ...
libqpdf/QPDFOutlineObjectHelper.cc
... ... @@ -34,7 +34,7 @@ QPDFOutlineObjectHelper::QPDFOutlineObjectHelper(
34 34 while (! cur.isNull())
35 35 {
36 36 QPDFOutlineObjectHelper new_ooh(cur, dh, 1 + depth);
37   - new_ooh.m->parent = new QPDFOutlineObjectHelper(*this);
  37 + new_ooh.m->parent = make_pointer_holder<QPDFOutlineObjectHelper>(*this);
38 38 this->m->kids.push_back(new_ooh);
39 39 cur = cur.getKey("/Next");
40 40 }
... ...
libqpdf/QPDFPageLabelDocumentHelper.cc
... ... @@ -17,7 +17,7 @@ QPDFPageLabelDocumentHelper::QPDFPageLabelDocumentHelper(QPDF&amp; qpdf) :
17 17 QPDFObjectHandle root = qpdf.getRoot();
18 18 if (root.hasKey("/PageLabels"))
19 19 {
20   - this->m->labels = new QPDFNumberTreeObjectHelper(
  20 + this->m->labels = make_pointer_holder<QPDFNumberTreeObjectHelper>(
21 21 root.getKey("/PageLabels"), this->qpdf);
22 22 }
23 23 }
... ...
libqpdf/QPDFPageObjectHelper.cc
... ... @@ -258,7 +258,7 @@ InlineImageTracker::handleToken(QPDFTokenizer::Token const&amp; token)
258 258 std::string name = resources.getUniqueResourceName(
259 259 "/IIm", this->min_suffix);
260 260 QPDFObjectHandle image = QPDFObjectHandle::newStream(
261   - this->qpdf, b.getBuffer());
  261 + this->qpdf, b.getBufferSharedPointer());
262 262 image.replaceDict(dict);
263 263 resources.getKey("/XObject").replaceKey(name, image);
264 264 write(name);
... ... @@ -521,7 +521,7 @@ QPDFPageObjectHelper::externalizeInlineImages(size_t min_size, bool shallow)
521 521 if (this->oh.isFormXObject())
522 522 {
523 523 this->oh.replaceStreamData(
524   - b.getBuffer(),
  524 + b.getBufferSharedPointer(),
525 525 QPDFObjectHandle::newNull(),
526 526 QPDFObjectHandle::newNull());
527 527 }
... ... @@ -530,7 +530,8 @@ QPDFPageObjectHelper::externalizeInlineImages(size_t min_size, bool shallow)
530 530 this->oh.replaceKey(
531 531 "/Contents",
532 532 QPDFObjectHandle::newStream(
533   - this->oh.getOwningQPDF(), b.getBuffer()));
  533 + this->oh.getOwningQPDF(),
  534 + b.getBufferSharedPointer()));
534 535 }
535 536 }
536 537 }
... ... @@ -914,8 +915,8 @@ QPDFPageObjectHelper::getFormXObjectForPage(bool handle_transformations)
914 915 " XObject created from page will not work");
915 916 }
916 917 newdict.replaceKey("/BBox", bbox);
917   - PointerHolder<QPDFObjectHandle::StreamDataProvider> provider =
918   - new ContentProvider(this->oh);
  918 + auto provider = PointerHolder<QPDFObjectHandle::StreamDataProvider>(
  919 + new ContentProvider(this->oh));
919 920 result.replaceStreamData(
920 921 provider, QPDFObjectHandle::newNull(), QPDFObjectHandle::newNull());
921 922 QPDFObjectHandle rotate_obj = getAttribute("/Rotate", false);
... ... @@ -1221,7 +1222,7 @@ QPDFPageObjectHelper::flattenRotation(QPDFAcroFormDocumentHelper* afdh)
1221 1222 PointerHolder<QPDFAcroFormDocumentHelper> afdhph;
1222 1223 if (! afdh)
1223 1224 {
1224   - afdhph = new QPDFAcroFormDocumentHelper(*qpdf);
  1225 + afdhph = make_pointer_holder<QPDFAcroFormDocumentHelper>(*qpdf);
1225 1226 afdh = afdhph.get();
1226 1227 }
1227 1228 afdh->transformAnnotations(
... ... @@ -1269,7 +1270,7 @@ QPDFPageObjectHelper::copyAnnotations(
1269 1270 PointerHolder<QPDFAcroFormDocumentHelper> from_afdhph;
1270 1271 if (! afdh)
1271 1272 {
1272   - afdhph = new QPDFAcroFormDocumentHelper(*this_qpdf);
  1273 + afdhph = make_pointer_holder<QPDFAcroFormDocumentHelper>(*this_qpdf);
1273 1274 afdh = afdhph.get();
1274 1275 }
1275 1276 if (this_qpdf == from_qpdf)
... ... @@ -1287,7 +1288,8 @@ QPDFPageObjectHelper::copyAnnotations(
1287 1288 }
1288 1289 else
1289 1290 {
1290   - from_afdhph = new QPDFAcroFormDocumentHelper(*from_qpdf);
  1291 + from_afdhph =
  1292 + make_pointer_holder<QPDFAcroFormDocumentHelper>(*from_qpdf);
1291 1293 from_afdh = from_afdhph.get();
1292 1294 }
1293 1295  
... ...
libqpdf/QPDFWriter.cc
... ... @@ -1108,7 +1108,7 @@ QPDFWriter::PipelinePopper::~PipelinePopper()
1108 1108 Pl_Buffer* buf = dynamic_cast<Pl_Buffer*>(p);
1109 1109 if (bp && buf)
1110 1110 {
1111   - *bp = buf->getBuffer();
  1111 + *bp = buf->getBufferSharedPointer();
1112 1112 }
1113 1113 delete p;
1114 1114 }
... ... @@ -1918,7 +1918,7 @@ QPDFWriter::unparseObject(QPDFObjectHandle object, int level,
1918 1918 this->m->cur_data_key.length());
1919 1919 pl.write(QUtil::unsigned_char_pointer(val), val.length());
1920 1920 pl.finish();
1921   - PointerHolder<Buffer> buf = bufpl.getBuffer();
  1921 + auto buf = bufpl.getBufferSharedPointer();
1922 1922 val = QPDF_String(
1923 1923 std::string(reinterpret_cast<char*>(buf->getBuffer()),
1924 1924 buf->getSize())).unparse(true);
... ... @@ -3231,8 +3231,8 @@ QPDFWriter::writeLinearized()
3231 3231 // Write file in two passes. Part numbers refer to PDF spec 1.4.
3232 3232  
3233 3233 FILE* lin_pass1_file = 0;
3234   - PointerHolder<PipelinePopper> pp_pass1 = new PipelinePopper(this);
3235   - PointerHolder<PipelinePopper> pp_md5 = new PipelinePopper(this);
  3234 + auto pp_pass1 = make_pointer_holder<PipelinePopper>(this);
  3235 + auto pp_md5 = make_pointer_holder<PipelinePopper>(this);
3236 3236 for (int pass = 1; pass <= 2; ++pass)
3237 3237 {
3238 3238 if (pass == 1)
... ... @@ -3623,7 +3623,7 @@ QPDFWriter::registerProgressReporter(PointerHolder&lt;ProgressReporter&gt; pr)
3623 3623 void
3624 3624 QPDFWriter::writeStandard()
3625 3625 {
3626   - PointerHolder<PipelinePopper> pp_md5 = new PipelinePopper(this);
  3626 + auto pp_md5 = make_pointer_holder<PipelinePopper>(this);
3627 3627 if (this->m->deterministic_id)
3628 3628 {
3629 3629 pushMD5Pipeline(*pp_md5);
... ...
libqpdf/QPDF_Stream.cc
... ... @@ -251,7 +251,7 @@ QPDF_Stream::getStreamData(qpdf_stream_decode_level_e decode_level)
251 251 "getStreamData called on unfilterable stream");
252 252 }
253 253 QTC::TC("qpdf", "QPDF_Stream getStreamData");
254   - return buf.getBuffer();
  254 + return buf.getBufferSharedPointer();
255 255 }
256 256  
257 257 PointerHolder<Buffer>
... ... @@ -265,7 +265,7 @@ QPDF_Stream::getRawStreamData()
265 265 "error getting raw stream data");
266 266 }
267 267 QTC::TC("qpdf", "QPDF_Stream getRawStreamData");
268   - return buf.getBuffer();
  268 + return buf.getBufferSharedPointer();
269 269 }
270 270  
271 271 bool
... ... @@ -479,7 +479,7 @@ QPDF_Stream::pipeStreamData(Pipeline* pipeline, bool* filterp,
479 479  
480 480 if (encode_flags & qpdf_ef_normalize)
481 481 {
482   - normalizer = new ContentNormalizer();
  482 + normalizer = make_pointer_holder<ContentNormalizer>();
483 483 new_pipeline = std::make_shared<Pl_QPDFTokenizer>(
484 484 "normalizer", normalizer.get(), pipeline);
485 485 to_delete.push_back(new_pipeline);
... ...
libqpdf/QPDF_encryption.cc
... ... @@ -245,7 +245,7 @@ process_with_aes(std::string const&amp; key,
245 245 aes.write(QUtil::unsigned_char_pointer(data), data.length());
246 246 }
247 247 aes.finish();
248   - PointerHolder<Buffer> bufp = buffer.getBuffer();
  248 + auto bufp = buffer.getBufferSharedPointer();
249 249 if (outlength == 0)
250 250 {
251 251 outlength = bufp->getSize();
... ... @@ -1200,7 +1200,7 @@ QPDF::decryptString(std::string&amp; str, int objid, int generation)
1200 1200 key.length());
1201 1201 pl.write(QUtil::unsigned_char_pointer(str), str.length());
1202 1202 pl.finish();
1203   - PointerHolder<Buffer> buf = bufpl.getBuffer();
  1203 + auto buf = bufpl.getBufferSharedPointer();
1204 1204 str = std::string(reinterpret_cast<char*>(buf->getBuffer()),
1205 1205 buf->getSize());
1206 1206 }
... ...
libqpdf/QPDF_linearization.cc
... ... @@ -313,7 +313,7 @@ QPDF::readLinearizationData()
313 313 QPDFObjectHandle HS = H0.getKey("/S"); // shared object
314 314 QPDFObjectHandle HO = H0.getKey("/O"); // outline
315 315  
316   - PointerHolder<Buffer> hbp = pb.getBuffer();
  316 + auto hbp = pb.getBufferSharedPointer();
317 317 Buffer* hb = hbp.get();
318 318 unsigned char const* h_buf = hb->getBuffer();
319 319 size_t h_size = hb->getSize();
... ... @@ -2282,5 +2282,5 @@ QPDF::generateHintStream(std::map&lt;int, QPDFXRefEntry&gt; const&amp; xref,
2282 2282 }
2283 2283 c.finish();
2284 2284  
2285   - hint_buffer = hint_stream.getBuffer();
  2285 + hint_buffer = hint_stream.getBufferSharedPointer();
2286 2286 }
... ...
libqpdf/qpdf-c.cc
... ... @@ -104,12 +104,13 @@ static void call_read_memory(qpdf_data qpdf)
104 104 // must set qpdf->filename
105 105 static void call_init_write(qpdf_data qpdf)
106 106 {
107   - qpdf->qpdf_writer = new QPDFWriter(*(qpdf->qpdf), qpdf->filename);
  107 + qpdf->qpdf_writer = make_pointer_holder<QPDFWriter>(
  108 + *(qpdf->qpdf), qpdf->filename);
108 109 }
109 110  
110 111 static void call_init_write_memory(qpdf_data qpdf)
111 112 {
112   - qpdf->qpdf_writer = new QPDFWriter(*(qpdf->qpdf));
  113 + qpdf->qpdf_writer = make_pointer_holder<QPDFWriter>(*(qpdf->qpdf));
113 114 qpdf->qpdf_writer->setOutputMemory();
114 115 }
115 116  
... ... @@ -137,17 +138,19 @@ static QPDF_ERROR_CODE trap_errors(
137 138 }
138 139 catch (QPDFExc& e)
139 140 {
140   - qpdf->error = new QPDFExc(e);
  141 + qpdf->error = make_pointer_holder<QPDFExc>(e);
141 142 status |= QPDF_ERRORS;
142 143 }
143 144 catch (std::runtime_error& e)
144 145 {
145   - qpdf->error = new QPDFExc(qpdf_e_system, "", "", 0, e.what());
  146 + qpdf->error = make_pointer_holder<QPDFExc>(
  147 + qpdf_e_system, "", "", 0, e.what());
146 148 status |= QPDF_ERRORS;
147 149 }
148 150 catch (std::exception& e)
149 151 {
150   - qpdf->error = new QPDFExc(qpdf_e_internal, "", "", 0, e.what());
  152 + qpdf->error = make_pointer_holder<QPDFExc>(
  153 + qpdf_e_internal, "", "", 0, e.what());
151 154 status |= QPDF_ERRORS;
152 155 }
153 156  
... ... @@ -169,7 +172,7 @@ qpdf_data qpdf_init()
169 172 {
170 173 QTC::TC("qpdf", "qpdf-c called qpdf_init");
171 174 qpdf_data qpdf = new _qpdf_data();
172   - qpdf->qpdf = new QPDF();
  175 + qpdf->qpdf = make_pointer_holder<QPDF>();
173 176 return qpdf;
174 177 }
175 178  
... ... @@ -240,7 +243,8 @@ qpdf_error qpdf_next_warning(qpdf_data qpdf)
240 243 {
241 244 if (qpdf_more_warnings(qpdf))
242 245 {
243   - qpdf->tmp_error.exc = new QPDFExc(qpdf->warnings.front());
  246 + qpdf->tmp_error.exc = make_pointer_holder<QPDFExc>(
  247 + qpdf->warnings.front());
244 248 qpdf->warnings.pop_front();
245 249 QTC::TC("qpdf", "qpdf-c qpdf_next_warning returned warning");
246 250 return &qpdf->tmp_error;
... ... @@ -543,7 +547,7 @@ static void qpdf_get_buffer_internal(qpdf_data qpdf)
543 547 {
544 548 if (qpdf->write_memory && (qpdf->output_buffer == 0))
545 549 {
546   - qpdf->output_buffer = qpdf->qpdf_writer->getBuffer();
  550 + qpdf->output_buffer = qpdf->qpdf_writer->getBufferSharedPointer();
547 551 }
548 552 }
549 553  
... ... @@ -852,7 +856,8 @@ void qpdf_register_progress_reporter(
852 856 {
853 857 QTC::TC("qpdf", "qpdf-c registered progress reporter");
854 858 qpdf->qpdf_writer->registerProgressReporter(
855   - new ProgressReporter(report_progress, data));
  859 + PointerHolder<QPDFWriter::ProgressReporter>(
  860 + new ProgressReporter(report_progress, data)));
856 861 }
857 862  
858 863 QPDF_ERROR_CODE qpdf_write(qpdf_data qpdf)
... ... @@ -911,7 +916,7 @@ static qpdf_oh
911 916 new_object(qpdf_data qpdf, QPDFObjectHandle const& qoh)
912 917 {
913 918 qpdf_oh oh = ++qpdf->next_oh; // never return 0
914   - qpdf->oh_cache[oh] = new QPDFObjectHandle(qoh);
  919 + qpdf->oh_cache[oh] = make_pointer_holder<QPDFObjectHandle>(qoh);
915 920 return oh;
916 921 }
917 922  
... ...
libtests/concatenate.cc
... ... @@ -20,12 +20,12 @@ int main(int argc, char* argv[])
20 20 pipeStringAndFinish(&concat, "-two-");
21 21 concat.manualFinish();
22 22  
23   - PointerHolder<Buffer> b1_buf = b1.getBuffer();
  23 + auto b1_buf = b1.getBufferSharedPointer();
24 24 Pl_Buffer b2("uncompressed");
25 25 Pl_Flate inflate("uncompress", &b2, Pl_Flate::a_inflate);
26 26 inflate.write(b1_buf->getBuffer(), b1_buf->getSize());
27 27 inflate.finish();
28   - PointerHolder<Buffer> b2_buf = b2.getBuffer();
  28 + auto b2_buf = b2.getBufferSharedPointer();
29 29 std::string result(reinterpret_cast<char*>(b2_buf->getBuffer()),
30 30 b2_buf->getSize());
31 31 if (result == "-one--two-")
... ...
libtests/input_source.cc
... ... @@ -65,8 +65,8 @@ int main()
65 65 // Overlap so that the first check() would advance past the start
66 66 // of the next match
67 67 memcpy(b + 2037, "potato potato salad ", 20);
68   - PointerHolder<InputSource> is =
69   - new BufferInputSource("test buffer input source", b1.get());
  68 + auto is = PointerHolder<InputSource>(
  69 + new BufferInputSource("test buffer input source", b1.get()));
70 70 Finder f1(is, "salad");
71 71 check("find potato salad", true,
72 72 is->findFirst("potato", 0, 0, f1));
... ...
libtests/qutil.cc
... ... @@ -545,7 +545,7 @@ void read_from_file_test()
545 545 Pl_Buffer b2("buffer");
546 546 // QUtil::file_provider also exercises QUtil::pipe_file
547 547 QUtil::file_provider("other-file")(&b2);
548   - PointerHolder<Buffer> buf2 = b2.getBuffer();
  548 + auto buf2 = b2.getBufferSharedPointer();
549 549 assert(buf2->getSize() == size);
550 550 assert(memcmp(buf2->getBuffer(), p, size) == 0);
551 551 }
... ...
qpdf/test_driver.cc
... ... @@ -294,7 +294,7 @@ static void test_0_1(QPDF&amp; pdf, char const* arg2)
294 294 std::cout << "Raw stream data:" << std::endl;
295 295 std::cout.flush();
296 296 QUtil::binary_stdout();
297   - PointerHolder<Pl_StdioFile> out = new Pl_StdioFile("raw", stdout);
  297 + auto out = make_pointer_holder<Pl_StdioFile>("raw", stdout);
298 298 qtest.pipeStreamData(out.get(), 0, qpdf_dl_none);
299 299  
300 300 std::cout << std::endl << "Uncompressed stream data:" << std::endl;
... ... @@ -302,7 +302,7 @@ static void test_0_1(QPDF&amp; pdf, char const* arg2)
302 302 {
303 303 std::cout.flush();
304 304 QUtil::binary_stdout();
305   - out = new Pl_StdioFile("filtered", stdout);
  305 + out = make_pointer_holder<Pl_StdioFile>("filtered", stdout);
306 306 qtest.pipeStreamData(out.get(), 0, qpdf_dl_all);
307 307 std::cout << std::endl << "End of stream data" << std::endl;
308 308 }
... ... @@ -343,7 +343,7 @@ static void test_2(QPDF&amp; pdf, char const* arg2)
343 343 QPDFObjectHandle page = kids.getArrayItem(1); // second page
344 344 QPDFObjectHandle contents = page.getKey("/Contents");
345 345 QUtil::binary_stdout();
346   - PointerHolder<Pl_StdioFile> out = new Pl_StdioFile("filtered", stdout);
  346 + auto out = make_pointer_holder<Pl_StdioFile>("filtered", stdout);
347 347 contents.pipeStreamData(out.get(), 0, qpdf_dl_generalized);
348 348 }
349 349  
... ... @@ -356,8 +356,8 @@ static void test_3(QPDF&amp; pdf, char const* arg2)
356 356 std::cout << "-- stream " << i << " --" << std::endl;
357 357 std::cout.flush();
358 358 QUtil::binary_stdout();
359   - PointerHolder<Pl_StdioFile> out =
360   - new Pl_StdioFile("tokenized stream", stdout);
  359 + auto out = make_pointer_holder<Pl_StdioFile>(
  360 + "tokenized stream", stdout);
361 361 stream.pipeStreamData(out.get(),
362 362 qpdf_ef_normalize, qpdf_dl_generalized);
363 363 }
... ... @@ -538,11 +538,11 @@ static void test_8(QPDF&amp; pdf, char const* arg2)
538 538 p2.write(QUtil::unsigned_char_pointer("new data for stream\n"),
539 539 20); // no null!
540 540 p2.finish();
541   - PointerHolder<Buffer> b = p1.getBuffer();
  541 + auto b = p1.getBufferSharedPointer();
542 542 // This is a bogus way to use StreamDataProvider, but it does
543 543 // adequately test its functionality.
544 544 Provider* provider = new Provider(b);
545   - PointerHolder<QPDFObjectHandle::StreamDataProvider> p = provider;
  545 + auto p = PointerHolder<QPDFObjectHandle::StreamDataProvider>(provider);
546 546 qstream.replaceStreamData(
547 547 p, QPDFObjectHandle::newName("/FlateDecode"),
548 548 QPDFObjectHandle::newNull());
... ... @@ -572,7 +572,7 @@ static void test_9(QPDF&amp; pdf, char const* arg2)
572 572 {
573 573 QPDFObjectHandle root = pdf.getRoot();
574 574 // Explicitly exercise the Buffer version of newStream
575   - PointerHolder<Buffer> buf = new Buffer(20);
  575 + auto buf = make_pointer_holder<Buffer>(20U);
576 576 unsigned char* bp = buf->getBuffer();
577 577 memcpy(bp, "data for new stream\n", 20); // no null!
578 578 QPDFObjectHandle qstream = QPDFObjectHandle::newStream(
... ... @@ -1100,9 +1100,9 @@ static void test_27(QPDF&amp; pdf, char const* arg2)
1100 1100 pl.write(QUtil::unsigned_char_pointer("new data for stream\n"),
1101 1101 20); // no null!
1102 1102 pl.finish();
1103   - PointerHolder<Buffer> b = pl.getBuffer();
  1103 + auto b = pl.getBufferSharedPointer();
1104 1104 Provider* provider = new Provider(b);
1105   - p1 = provider;
  1105 + p1 = decltype(p1)(provider);
1106 1106 }
1107 1107 // Create a stream that uses a provider in empty1 and copy it
1108 1108 // to empty2. It is copied from empty2 to the final pdf.
... ... @@ -1129,9 +1129,9 @@ static void test_27(QPDF&amp; pdf, char const* arg2)
1129 1129 "more data for stream\n"),
1130 1130 21); // no null!
1131 1131 pl.finish();
1132   - PointerHolder<Buffer> b = pl.getBuffer();
  1132 + auto b = pl.getBufferSharedPointer();
1133 1133 Provider* provider = new Provider(b);
1134   - p2 = provider;
  1134 + p2 = decltype(p2)(provider);
1135 1135 }
1136 1136 QPDF empty3;
1137 1137 empty3.emptyPDF();
... ... @@ -1315,7 +1315,7 @@ static void test_33(QPDF&amp; pdf, char const* arg2)
1315 1315 w.setStaticID(true);
1316 1316 w.setOutputPipeline(&p);
1317 1317 w.write();
1318   - PointerHolder<Buffer> b = p.getBuffer();
  1318 + auto b = p.getBufferSharedPointer();
1319 1319 FILE* f = QUtil::safe_fopen("a.pdf", "wb");
1320 1320 fwrite(b->getBuffer(), b->getSize(), 1, f);
1321 1321 fclose(f);
... ... @@ -1414,7 +1414,7 @@ static void test_36(QPDF&amp; pdf, char const* arg2)
1414 1414 Pl_Buffer p1("buffer");
1415 1415 Pl_Flate p2("compress", &p1, Pl_Flate::a_inflate);
1416 1416 stream.pipeStreamData(&p2, 0, qpdf_dl_none);
1417   - PointerHolder<Buffer> buf = p1.getBuffer();
  1417 + auto buf = p1.getBufferSharedPointer();
1418 1418 std::string data = std::string(
1419 1419 reinterpret_cast<char const*>(buf->getBuffer()),
1420 1420 buf->getSize());
... ... @@ -1497,7 +1497,8 @@ static void test_41(QPDF&amp; pdf, char const* arg2)
1497 1497 pages.begin();
1498 1498 iter != pages.end(); ++iter)
1499 1499 {
1500   - (*iter).addContentTokenFilter(new TokenFilter);
  1500 + (*iter).addContentTokenFilter(
  1501 + PointerHolder<QPDFObjectHandle::TokenFilter>(new TokenFilter()));
1501 1502 }
1502 1503 QPDFWriter w(pdf, "a.pdf");
1503 1504 w.setQDFMode(true);
... ... @@ -2727,11 +2728,15 @@ static void test_72(QPDF&amp; pdf, char const* arg2)
2727 2728 Pl_Buffer b("buffer");
2728 2729 if (i == 0)
2729 2730 {
2730   - fx1.addContentTokenFilter(new TokenFilter);
  2731 + fx1.addContentTokenFilter(
  2732 + PointerHolder<QPDFObjectHandle::TokenFilter>(
  2733 + new TokenFilter()));
2731 2734 }
2732 2735 else
2733 2736 {
2734   - fx1.getObjectHandle().addTokenFilter(new TokenFilter);
  2737 + fx1.getObjectHandle().addTokenFilter(
  2738 + PointerHolder<QPDFObjectHandle::TokenFilter>(
  2739 + new TokenFilter()));
2735 2740 }
2736 2741 fx1.pipeContents(&b);
2737 2742 std::unique_ptr<Buffer> buf(b.getBuffer());
... ... @@ -2890,7 +2895,7 @@ static void test_76(QPDF&amp; pdf, char const* arg2)
2890 2895 p.write(QUtil::unsigned_char_pointer("from buffer"), 11);
2891 2896 p.finish();
2892 2897 auto efs3 = QPDFEFStreamObjectHelper::createEFStream(
2893   - pdf, p.getBuffer());
  2898 + pdf, p.getBufferSharedPointer());
2894 2899 efs3.setSubtype("text/plain");
2895 2900 efdh.replaceEmbeddedFile(
2896 2901 "att2", QPDFFileSpecObjectHelper::createFileSpec(
... ... @@ -3007,7 +3012,7 @@ static void test_79(QPDF&amp; pdf, char const* arg2)
3007 3012 Pl_Buffer b("buffer");
3008 3013 b.write(QUtil::unsigned_char_pointer("from buffer"), 11);
3009 3014 b.finish();
3010   - PointerHolder<Buffer> bp = b.getBuffer();
  3015 + auto bp = b.getBufferSharedPointer();
3011 3016 auto s3 = QPDFObjectHandle::newStream(&pdf, bp);
3012 3017  
3013 3018 std::vector<QPDFObjectHandle> streams = {s1, s2, s3};
... ...
qpdf/test_renumber.cc
... ... @@ -300,7 +300,7 @@ int main(int argc, char *argv[])
300 300  
301 301 std::map<QPDFObjGen, QPDFXRefEntry> xrefs_w
302 302 = w.getWrittenXRefTable();
303   - PointerHolder<Buffer> buf = w.getBuffer();
  303 + auto buf = w.getBufferSharedPointer();
304 304  
305 305 QPDF qpdf_ren;
306 306 qpdf_ren.processMemoryFile("renumbered",
... ...
qpdf/test_tokenizer.cc
... ... @@ -205,7 +205,7 @@ static void process(char const* filename, bool include_ignorable,
205 205 // Tokenize file, skipping streams
206 206 FileInputSource* fis = new FileInputSource();
207 207 fis->setFilename(filename);
208   - is = fis;
  208 + is = PointerHolder<InputSource>(fis);
209 209 dump_tokens(is, "FILE", max_len, include_ignorable, true, false);
210 210  
211 211 // Tokenize content streams, skipping inline images
... ... @@ -220,10 +220,10 @@ static void process(char const* filename, bool include_ignorable,
220 220 ++pageno;
221 221 Pl_Buffer plb("buffer");
222 222 (*iter).pipeContents(&plb);
223   - PointerHolder<Buffer> content_data = plb.getBuffer();
  223 + auto content_data = plb.getBufferSharedPointer();
224 224 BufferInputSource* bis = new BufferInputSource(
225 225 "content data", content_data.get());
226   - is = bis;
  226 + is = PointerHolder<InputSource>(bis);
227 227 dump_tokens(is, "PAGE " + QUtil::int_to_string(pageno),
228 228 max_len, include_ignorable, false, true);
229 229 }
... ... @@ -241,7 +241,7 @@ static void process(char const* filename, bool include_ignorable,
241 241 (*iter).getStreamData(qpdf_dl_specialized);
242 242 BufferInputSource* bis = new BufferInputSource(
243 243 "object stream data", b.get());
244   - is = bis;
  244 + is = PointerHolder<InputSource>(bis);
245 245 dump_tokens(is, "OBJECT STREAM " +
246 246 QUtil::int_to_string((*iter).getObjectID()),
247 247 max_len, include_ignorable, false, false);
... ...
zlib-flate/zlib-flate.cc
... ... @@ -75,9 +75,8 @@ int main(int argc, char* argv[])
75 75  
76 76 QUtil::binary_stdout();
77 77 QUtil::binary_stdin();
78   - PointerHolder<Pl_StdioFile> out = new Pl_StdioFile("stdout", stdout);
79   - PointerHolder<Pl_Flate> flate =
80   - new Pl_Flate("flate", out.get(), action);
  78 + auto out = make_pointer_holder<Pl_StdioFile>("stdout", stdout);
  79 + auto flate = make_pointer_holder<Pl_Flate>("flate", out.get(), action);
81 80 bool warn = false;
82 81 flate->setWarnCallback([&warn](char const* msg, int code) {
83 82 warn = true;
... ...