Commit 55ee55394c1434da62c01e01a537eee5aa909eba
1 parent
ba453ba4
Use inline image token in content parser
Showing
1 changed file
with
19 additions
and
30 deletions
libqpdf/QPDFObjectHandle.cc
| ... | ... | @@ -907,42 +907,31 @@ QPDFObjectHandle::parseContentStream_internal(PointerHolder<Buffer> stream_data, |
| 907 | 907 | // terminated the token. Read until end of inline image. |
| 908 | 908 | char ch; |
| 909 | 909 | input->read(&ch, 1); |
| 910 | - char buf[4]; | |
| 911 | - memset(buf, '\0', sizeof(buf)); | |
| 912 | - bool done = false; | |
| 913 | - std::string inline_image; | |
| 914 | - while (! done) | |
| 910 | + tokenizer.expectInlineImage(); | |
| 911 | + QPDFTokenizer::Token t = tokenizer.readToken(input, description, true); | |
| 912 | + if (t.getType() == QPDFTokenizer::tt_bad) | |
| 915 | 913 | { |
| 916 | - if (input->read(&ch, 1) == 0) | |
| 917 | - { | |
| 918 | - QTC::TC("qpdf", "QPDFObjectHandle EOF in inline image"); | |
| 919 | - throw QPDFExc(qpdf_e_damaged_pdf, input->getName(), | |
| 920 | - "stream data", input->tell(), | |
| 921 | - "EOF found while reading inline image"); | |
| 922 | - } | |
| 923 | - inline_image += ch; | |
| 924 | - memmove(buf, buf + 1, sizeof(buf) - 1); | |
| 925 | - buf[sizeof(buf) - 1] = ch; | |
| 926 | - if (strchr(" \t\n\v\f\r", buf[0]) && | |
| 927 | - (buf[1] == 'E') && | |
| 928 | - (buf[2] == 'I') && | |
| 929 | - strchr(" \t\n\v\f\r", buf[3])) | |
| 914 | + QTC::TC("qpdf", "QPDFObjectHandle EOF in inline image"); | |
| 915 | + throw QPDFExc(qpdf_e_damaged_pdf, input->getName(), | |
| 916 | + "stream data", input->tell(), | |
| 917 | + "EOF found while reading inline image"); | |
| 918 | + } | |
| 919 | + else | |
| 920 | + { | |
| 921 | + // Skip back over EI | |
| 922 | + input->seek(-3, SEEK_CUR); | |
| 923 | + std::string inline_image = t.getRawValue(); | |
| 924 | + for (int i = 0; i < 4; ++i) | |
| 930 | 925 | { |
| 931 | - // We've found an EI operator. | |
| 932 | - done = true; | |
| 933 | - input->seek(-3, SEEK_CUR); | |
| 934 | - for (int i = 0; i < 4; ++i) | |
| 926 | + if (inline_image.length() > 0) | |
| 935 | 927 | { |
| 936 | - if (inline_image.length() > 0) | |
| 937 | - { | |
| 938 | - inline_image.erase(inline_image.length() - 1); | |
| 939 | - } | |
| 928 | + inline_image.erase(inline_image.length() - 1); | |
| 940 | 929 | } |
| 941 | 930 | } |
| 931 | + QTC::TC("qpdf", "QPDFObjectHandle inline image token"); | |
| 932 | + callbacks->handleObject( | |
| 933 | + QPDFObjectHandle::newInlineImage(inline_image)); | |
| 942 | 934 | } |
| 943 | - QTC::TC("qpdf", "QPDFObjectHandle inline image token"); | |
| 944 | - callbacks->handleObject( | |
| 945 | - QPDFObjectHandle::newInlineImage(inline_image)); | |
| 946 | 935 | } |
| 947 | 936 | } |
| 948 | 937 | } | ... | ... |