aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog3
-rw-r--r--include/qpdf/QPDFTokenizer.hh1
-rw-r--r--libqpdf/QPDFTokenizer.cc27
-rw-r--r--qpdf/qtest/qpdf/good14.out26
-rw-r--r--qpdf/qtest/qpdf/good14.pdf23
-rw-r--r--qpdf/qtest/qpdf/good14.qdf45
-rw-r--r--qpdf/qtest/qpdf/tokens-maxlen.out804
-rw-r--r--qpdf/qtest/qpdf/tokens-no-ignorable.out390
-rw-r--r--qpdf/qtest/qpdf/tokens.out804
-rw-r--r--qpdf/qtest/qpdf/tokens.pdfbin9438 -> 9503 bytes
10 files changed, 1084 insertions, 1039 deletions
diff --git a/ChangeLog b/ChangeLog
index 42598e8a..0fa9d10b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
2018-08-05 Jay Berkenbilt <ejb@ql.org>
+ * Bug fix: end of line characters were not properly handled inside
+ strings in some cases. Fixes #226.
+
* Bug fix: infinite loop on progress reporting for very small
files. Fixes #230.
diff --git a/include/qpdf/QPDFTokenizer.hh b/include/qpdf/QPDFTokenizer.hh
index eb9215aa..09205052 100644
--- a/include/qpdf/QPDFTokenizer.hh
+++ b/include/qpdf/QPDFTokenizer.hh
@@ -229,6 +229,7 @@ class QPDFTokenizer
bool string_ignoring_newline;
char bs_num_register[4];
bool last_char_was_bs;
+ bool last_char_was_cr;
};
PointerHolder<Members> m;
};
diff --git a/libqpdf/QPDFTokenizer.cc b/libqpdf/QPDFTokenizer.cc
index 9c2a1e05..e1399d82 100644
--- a/libqpdf/QPDFTokenizer.cc
+++ b/libqpdf/QPDFTokenizer.cc
@@ -34,6 +34,7 @@ QPDFTokenizer::Members::reset()
string_depth = 0;
string_ignoring_newline = false;
last_char_was_bs = false;
+ last_char_was_cr = false;
}
QPDFTokenizer::Members::~Members()
@@ -217,6 +218,7 @@ QPDFTokenizer::presentCharacter(char ch)
memset(this->m->bs_num_register, '\0',
sizeof(this->m->bs_num_register));
this->m->last_char_was_bs = false;
+ this->m->last_char_was_cr = false;
this->m->state = st_in_string;
}
else if (ch == '<')
@@ -334,8 +336,7 @@ QPDFTokenizer::presentCharacter(char ch)
}
else if (this->m->state == st_in_string)
{
- if (this->m->string_ignoring_newline &&
- (! ((ch == '\r') || (ch == '\n'))))
+ if (this->m->string_ignoring_newline && (ch != '\n'))
{
this->m->string_ignoring_newline = false;
}
@@ -353,9 +354,10 @@ QPDFTokenizer::presentCharacter(char ch)
bs_num_count = 0;
}
- if (this->m->string_ignoring_newline && ((ch == '\r') || (ch == '\n')))
+ if (this->m->string_ignoring_newline && (ch == '\n'))
{
// ignore
+ this->m->string_ignoring_newline = false;
}
else if (ch_is_octal &&
(this->m->last_char_was_bs || (bs_num_count > 0)))
@@ -386,8 +388,10 @@ QPDFTokenizer::presentCharacter(char ch)
this->m->val += '\f';
break;
- case '\r':
case '\n':
+ break;
+
+ case '\r':
this->m->string_ignoring_newline = true;
break;
@@ -417,11 +421,26 @@ QPDFTokenizer::presentCharacter(char ch)
this->m->type = tt_string;
this->m->state = st_token_ready;
}
+ else if (ch == '\r')
+ {
+ // CR by itself is converted to LF
+ this->m->val += '\n';
+ }
+ else if (ch == '\n')
+ {
+ // CR LF is converted to LF
+ if (! this->m->last_char_was_cr)
+ {
+ this->m->val += ch;
+ }
+ }
else
{
this->m->val += ch;
}
+ this->m->last_char_was_cr =
+ ((! this->m->string_ignoring_newline) && (ch == '\r'));
this->m->last_char_was_bs =
((! this->m->last_char_was_bs) && (ch == '\\'));
}
diff --git a/qpdf/qtest/qpdf/good14.out b/qpdf/qtest/qpdf/good14.out
index 73181721..2ac91d53 100644
--- a/qpdf/qtest/qpdf/good14.out
+++ b/qpdf/qtest/qpdf/good14.out
@@ -6,7 +6,7 @@ A B
one
two
three lines
-(string with \r\nCRNL)
+(string with \nCRLF and\nCR and\nLF)
and another
indentation
(\001B%DEF)<01>
@@ -21,7 +21,7 @@ This stream does end with a newline.
// bad tokens preserved
// comments
// indentation
-// CR/NL inside string literal -- changed to \r or \n, newline follows
+// CR, CR/LF, LF inside string literal -- changed to \n
// whitespace in hexstring (removed)
// strings normalized
// newlines normalized
@@ -33,17 +33,17 @@ This stream does end with a newline.
/good name
/bad#00name
-WARNING: good14.pdf (offset 860): content normalization encountered bad tokens
-WARNING: good14.pdf (offset 860): Resulting stream data may be corrupted but is may still useful for manual inspection. For more information on this warning, search for content normalization in the manual.
+WARNING: good14.pdf (offset 874): content normalization encountered bad tokens
+WARNING: good14.pdf (offset 874): Resulting stream data may be corrupted but is may still useful for manual inspection. For more information on this warning, search for content normalization in the manual.
-- stream 2 --
(This stream ends with a \001 bad token
-WARNING: good14.pdf (offset 1316): content normalization encountered bad tokens
-WARNING: good14.pdf (offset 1316): normalized content ended with a bad token; you may be able to resolve this by coalescing content streams in combination with normalizing content. From the command line, specify --coalesce-contents
-WARNING: good14.pdf (offset 1316): Resulting stream data may be corrupted but is may still useful for manual inspection. For more information on this warning, search for content normalization in the manual.
+WARNING: good14.pdf (offset 1315): content normalization encountered bad tokens
+WARNING: good14.pdf (offset 1315): normalized content ended with a bad token; you may be able to resolve this by coalescing content streams in combination with normalizing content. From the command line, specify --coalesce-contents
+WARNING: good14.pdf (offset 1315): Resulting stream data may be corrupted but is may still useful for manual inspection. For more information on this warning, search for content normalization in the manual.
-- stream 3 --
-<AB XWARNING: good14.pdf (offset 1406): content normalization encountered bad tokens
-WARNING: good14.pdf (offset 1406): normalized content ended with a bad token; you may be able to resolve this by coalescing content streams in combination with normalizing content. From the command line, specify --coalesce-contents
-WARNING: good14.pdf (offset 1406): Resulting stream data may be corrupted but is may still useful for manual inspection. For more information on this warning, search for content normalization in the manual.
+<AB XWARNING: good14.pdf (offset 1405): content normalization encountered bad tokens
+WARNING: good14.pdf (offset 1405): normalized content ended with a bad token; you may be able to resolve this by coalescing content streams in combination with normalizing content. From the command line, specify --coalesce-contents
+WARNING: good14.pdf (offset 1405): Resulting stream data may be corrupted but is may still useful for manual inspection. For more information on this warning, search for content normalization in the manual.
-- stream 4 --
(ends with a name)
/ThisMustBeLast-- stream 5 --
@@ -54,7 +54,7 @@ BI
ID
<506f7
461746f>
-WARNING: good14.pdf (offset 1549): content normalization encountered bad tokens
-WARNING: good14.pdf (offset 1549): normalized content ended with a bad token; you may be able to resolve this by coalescing content streams in combination with normalizing content. From the command line, specify --coalesce-contents
-WARNING: good14.pdf (offset 1549): Resulting stream data may be corrupted but is may still useful for manual inspection. For more information on this warning, search for content normalization in the manual.
+WARNING: good14.pdf (offset 1548): content normalization encountered bad tokens
+WARNING: good14.pdf (offset 1548): normalized content ended with a bad token; you may be able to resolve this by coalescing content streams in combination with normalizing content. From the command line, specify --coalesce-contents
+WARNING: good14.pdf (offset 1548): Resulting stream data may be corrupted but is may still useful for manual inspection. For more information on this warning, search for content normalization in the manual.
test 3 done
diff --git a/qpdf/qtest/qpdf/good14.pdf b/qpdf/qtest/qpdf/good14.pdf
index da70e82f..e4d1cc83 100644
--- a/qpdf/qtest/qpdf/good14.pdf
+++ b/qpdf/qtest/qpdf/good14.pdf
@@ -70,7 +70,8 @@ B % here is another with CR
A B
one two three lines
(string with
-CRNL) and another
+CRLF and CR and
+LF) and another
indentation
(B%DEF)()
<8A
@@ -78,14 +79,14 @@ CRNL) and another
(a\000b) <4D4F4F>endstream endobj
8 0 obj
-<< /Length 385 >>
+<< /Length 370 >>
stream
This stream does end with a newline.
// tests:
// bad tokens preserved
// comments
// indentation
-// CR/NL inside string literal -- changed to \r or \n, newline follows
+// CR, CR/LF, LF inside string literal -- changed to \n
// whitespace in hexstring (removed)
// strings normalized
// newlines normalized
@@ -101,7 +102,7 @@ endstream
endobj
9 0 obj
-181
+195
endobj
10 0 obj
@@ -148,17 +149,17 @@ xref
0000000439 00000 n
0000000474 00000 n
0000000592 00000 n
-0000000827 00000 n
-0000001263 00000 n
-0000001283 00000 n
-0000001374 00000 n
-0000001430 00000 n
-0000001515 00000 n
+0000000841 00000 n
+0000001262 00000 n
+0000001282 00000 n
+0000001373 00000 n
+0000001429 00000 n
+0000001514 00000 n
trailer <<
/Size 14
/Root 1 0 R
/QStreams [ 7 0 R 8 0 R 10 0 R 11 0 R 12 0 R 13 0 R ]
>>
startxref
-1670
+1669
%%EOF
diff --git a/qpdf/qtest/qpdf/good14.qdf b/qpdf/qtest/qpdf/good14.qdf
index c1e5d3c6..cb386198 100644
--- a/qpdf/qtest/qpdf/good14.qdf
+++ b/qpdf/qtest/qpdf/good14.qdf
@@ -21,7 +21,8 @@ B % here is another with CR
A B
one two three lines
(string with
-CRNL) and another
+CRLF and CR and
+LF) and another
indentation
(B%DEF)()
<8A
@@ -32,7 +33,7 @@ endobj
%QDF: ignore_newline
3 0 obj
-181
+195
endobj
%% Original object ID: 8 0
@@ -46,7 +47,7 @@ This stream does end with a newline.
// bad tokens preserved
// comments
// indentation
-// CR/NL inside string literal -- changed to \r or \n, newline follows
+// CR, CR/LF, LF inside string literal -- changed to \n
// whitespace in hexstring (removed)
// strings normalized
// newlines normalized
@@ -62,7 +63,7 @@ endstream
endobj
5 0 obj
-385
+370
endobj
%% Original object ID: 10 0
@@ -206,23 +207,23 @@ xref
0000000000 65535 f
0000000052 00000 n
0000000134 00000 n
-0000000392 00000 n
-0000000439 00000 n
-0000000879 00000 n
-0000000927 00000 n
-0000001022 00000 n
-0000001069 00000 n
-0000001151 00000 n
-0000001197 00000 n
-0000001310 00000 n
-0000001358 00000 n
-0000001518 00000 n
-0000001566 00000 n
-0000001677 00000 n
-0000001924 00000 n
-0000002025 00000 n
-0000002072 00000 n
-0000002218 00000 n
+0000000406 00000 n
+0000000453 00000 n
+0000000878 00000 n
+0000000926 00000 n
+0000001021 00000 n
+0000001068 00000 n
+0000001150 00000 n
+0000001196 00000 n
+0000001309 00000 n
+0000001357 00000 n
+0000001517 00000 n
+0000001565 00000 n
+0000001676 00000 n
+0000001923 00000 n
+0000002024 00000 n
+0000002071 00000 n
+0000002217 00000 n
trailer <<
/QStreams [
2 0 R
@@ -237,5 +238,5 @@ trailer <<
/ID [<31415926535897932384626433832795><31415926535897932384626433832795>]
>>
startxref
-2254
+2253
%%EOF
diff --git a/qpdf/qtest/qpdf/tokens-maxlen.out b/qpdf/qtest/qpdf/tokens-maxlen.out
index 6eb8072b..eb5dd8d7 100644
--- a/qpdf/qtest/qpdf/tokens-maxlen.out
+++ b/qpdf/qtest/qpdf/tokens-maxlen.out
@@ -181,352 +181,352 @@ skipping to endstream
7121: space: \x0a
7122: word: stream
skipping to endstream
-7404: word: endstream
-7413: space: \x0a
-7414: word: endobj
-7420: space: \x0a\x0a
-7422: integer: 44
-7424: space:
-7425: integer: 0
-7426: space:
-7427: word: obj
-7430: space: \x0a
-7431: integer: 275
-7434: space: \x0a
-7435: word: endobj
-7441: space: \x0a\x0a
-7443: comment: %% Contents for page 5
-7465: space: \x0a
-7466: comment: %% Original object ID: 41 0
-7493: space: \x0a
-7494: integer: 45
-7496: space:
-7497: integer: 0
-7498: space:
-7499: word: obj
-7502: space: \x0a
-7503: dict_open: <<
-7505: space: \x0a
-7508: name: /Length
-7515: space:
-7516: integer: 46
-7518: space:
-7519: integer: 0
-7520: space:
-7521: word: R
-7522: space: \x0a
-7523: dict_close: >>
-7525: space: \x0a
-7526: word: stream
+7469: word: endstream
+7478: space: \x0a
+7479: word: endobj
+7485: space: \x0a\x0a
+7487: integer: 44
+7489: space:
+7490: integer: 0
+7491: space:
+7492: word: obj
+7495: space: \x0a
+7496: integer: 340
+7499: space: \x0a
+7500: word: endobj
+7506: space: \x0a\x0a
+7508: comment: %% Contents for page 5
+7530: space: \x0a
+7531: comment: %% Original object ID: 41 0
+7558: space: \x0a
+7559: integer: 45
+7561: space:
+7562: integer: 0
+7563: space:
+7564: word: obj
+7567: space: \x0a
+7568: dict_open: <<
+7570: space: \x0a
+7573: name: /Length
+7580: space:
+7581: integer: 46
+7583: space:
+7584: integer: 0
+7585: space:
+7586: word: R
+7587: space: \x0a
+7588: dict_close: >>
+7590: space: \x0a
+7591: word: stream
skipping to endstream
-7601: word: endstream
-7610: space: \x0a
-7611: word: endobj
-7617: space: \x0a
-7618: comment: %QDF: ignore_newline
-7638: space: \x0a\x0a
-7640: integer: 46
-7642: space:
-7643: integer: 0
-7644: space:
-7645: word: obj
-7648: space: \x0a
-7649: integer: 67
-7651: space: \x0a
-7652: word: endobj
-7658: space: \x0a\x0a
-7660: comment: %% Contents for page 6
+7666: word: endstream
+7675: space: \x0a
+7676: word: endobj
7682: space: \x0a
-7683: comment: %% Original object ID: 42 0
-7710: space: \x0a
-7711: integer: 47
-7713: space:
-7714: integer: 0
-7715: space:
-7716: word: obj
-7719: space: \x0a
-7720: dict_open: <<
-7722: space: \x0a
-7725: name: /Length
-7732: space:
-7733: integer: 48
-7735: space:
-7736: integer: 0
-7737: space:
-7738: word: R
-7739: space: \x0a
-7740: dict_close: >>
-7742: space: \x0a
-7743: word: stream
+7683: comment: %QDF: ignore_newline
+7703: space: \x0a\x0a
+7705: integer: 46
+7707: space:
+7708: integer: 0
+7709: space:
+7710: word: obj
+7713: space: \x0a
+7714: integer: 67
+7716: space: \x0a
+7717: word: endobj
+7723: space: \x0a\x0a
+7725: comment: %% Contents for page 6
+7747: space: \x0a
+7748: comment: %% Original object ID: 42 0
+7775: space: \x0a
+7776: integer: 47
+7778: space:
+7779: integer: 0
+7780: space:
+7781: word: obj
+7784: space: \x0a
+7785: dict_open: <<
+7787: space: \x0a
+7790: name: /Length
+7797: space:
+7798: integer: 48
+7800: space:
+7801: integer: 0
+7802: space:
+7803: word: R
+7804: space: \x0a
+7805: dict_close: >>
+7807: space: \x0a
+7808: word: stream
skipping to endstream
-7794: word: endstream
-7803: space: \x0a
-7804: word: endobj
-7810: space: \x0a\x0a
-7812: integer: 48
-7814: space:
-7815: integer: 0
-7816: space:
-7817: word: obj
-7820: space: \x0a
-7821: integer: 44
-7823: space: \x0a
-7824: word: endobj
-7830: space: \x0a\x0a
-7832: comment: %% Contents for page 7
-7854: space: \x0a
-7855: comment: %% Original object ID: 43 0
-7882: space: \x0a
-7883: integer: 49
-7885: space:
-7886: integer: 0
-7887: space:
-7888: word: obj
-7891: space: \x0a
-7892: dict_open: <<
-7894: space: \x0a
-7897: name: /Length
-7904: space:
-7905: integer: 50
-7907: space:
-7908: integer: 0
-7909: space:
-7910: word: R
-7911: space: \x0a
-7912: dict_close: >>
-7914: space: \x0a
-7915: word: stream
+7859: word: endstream
+7868: space: \x0a
+7869: word: endobj
+7875: space: \x0a\x0a
+7877: integer: 48
+7879: space:
+7880: integer: 0
+7881: space:
+7882: word: obj
+7885: space: \x0a
+7886: integer: 44
+7888: space: \x0a
+7889: word: endobj
+7895: space: \x0a\x0a
+7897: comment: %% Contents for page 7
+7919: space: \x0a
+7920: comment: %% Original object ID: 43 0
+7947: space: \x0a
+7948: integer: 49
+7950: space:
+7951: integer: 0
+7952: space:
+7953: word: obj
+7956: space: \x0a
+7957: dict_open: <<
+7959: space: \x0a
+7962: name: /Length
+7969: space:
+7970: integer: 50
+7972: space:
+7973: integer: 0
+7974: space:
+7975: word: R
+7976: space: \x0a
+7977: dict_close: >>
+7979: space: \x0a
+7980: word: stream
skipping to endstream
-8241: word: endstream
-8250: space: \x0a
-8251: word: endobj
-8257: space: \x0a
-8258: comment: %QDF: ignore_newline
-8278: space: \x0a\x0a
-8280: integer: 50
-8282: space:
-8283: integer: 0
-8284: space:
-8285: word: obj
-8288: space: \x0a
-8289: integer: 318
-8292: space: \x0a
-8293: word: endobj
-8299: space: \x0a\x0a
-8301: comment: %% Contents for page 8
-8323: space: \x0a
-8324: comment: %% Original object ID: 44 0
-8351: space: \x0a
-8352: integer: 51
-8354: space:
-8355: integer: 0
-8356: space:
-8357: word: obj
-8360: space: \x0a
-8361: dict_open: <<
-8363: space: \x0a
-8366: name: /Length
-8373: space:
-8374: integer: 52
-8376: space:
-8377: integer: 0
-8378: space:
-8379: word: R
-8380: space: \x0a
-8381: dict_close: >>
-8383: space: \x0a
-8384: word: stream
+8306: word: endstream
+8315: space: \x0a
+8316: word: endobj
+8322: space: \x0a
+8323: comment: %QDF: ignore_newline
+8343: space: \x0a\x0a
+8345: integer: 50
+8347: space:
+8348: integer: 0
+8349: space:
+8350: word: obj
+8353: space: \x0a
+8354: integer: 318
+8357: space: \x0a
+8358: word: endobj
+8364: space: \x0a\x0a
+8366: comment: %% Contents for page 8
+8388: space: \x0a
+8389: comment: %% Original object ID: 44 0
+8416: space: \x0a
+8417: integer: 51
+8419: space:
+8420: integer: 0
+8421: space:
+8422: word: obj
+8425: space: \x0a
+8426: dict_open: <<
+8428: space: \x0a
+8431: name: /Length
+8438: space:
+8439: integer: 52
+8441: space:
+8442: integer: 0
+8443: space:
+8444: word: R
+8445: space: \x0a
+8446: dict_close: >>
+8448: space: \x0a
+8449: word: stream
skipping to endstream
-8435: word: endstream
-8444: space: \x0a
-8445: word: endobj
-8451: space: \x0a\x0a
-8453: integer: 52
-8455: space:
-8456: integer: 0
-8457: space:
-8458: word: obj
-8461: space: \x0a
-8462: integer: 44
-8464: space: \x0a
-8465: word: endobj
-8471: space: \x0a\x0a
-8473: comment: %% Contents for page 9
-8495: space: \x0a
-8496: comment: %% Original object ID: 45 0
-8523: space: \x0a
-8524: integer: 53
-8526: space:
-8527: integer: 0
-8528: space:
-8529: word: obj
-8532: space: \x0a
-8533: dict_open: <<
-8535: space: \x0a
-8538: name: /Length
-8545: space:
-8546: integer: 54
-8548: space:
-8549: integer: 0
-8550: space:
-8551: word: R
-8552: space: \x0a
-8553: dict_close: >>
-8555: space: \x0a
-8556: word: stream
+8500: word: endstream
+8509: space: \x0a
+8510: word: endobj
+8516: space: \x0a\x0a
+8518: integer: 52
+8520: space:
+8521: integer: 0
+8522: space:
+8523: word: obj
+8526: space: \x0a
+8527: integer: 44
+8529: space: \x0a
+8530: word: endobj
+8536: space: \x0a\x0a
+8538: comment: %% Contents for page 9
+8560: space: \x0a
+8561: comment: %% Original object ID: 45 0
+8588: space: \x0a
+8589: integer: 53
+8591: space:
+8592: integer: 0
+8593: space:
+8594: word: obj
+8597: space: \x0a
+8598: dict_open: <<
+8600: space: \x0a
+8603: name: /Length
+8610: space:
+8611: integer: 54
+8613: space:
+8614: integer: 0
+8615: space:
+8616: word: R
+8617: space: \x0a
+8618: dict_close: >>
+8620: space: \x0a
+8621: word: stream
skipping to endstream
-8607: word: endstream
-8616: space: \x0a
-8617: word: endobj
-8623: space: \x0a\x0a
-8625: integer: 54
-8627: space:
-8628: integer: 0
-8629: space:
-8630: word: obj
-8633: space: \x0a
-8634: integer: 44
-8636: space: \x0a
-8637: word: endobj
-8643: space: \x0a\x0a
-8645: comment: %% Contents for page 10
-8668: space: \x0a
-8669: comment: %% Original object ID: 46 0
-8696: space: \x0a
-8697: integer: 55
-8699: space:
-8700: integer: 0
-8701: space:
-8702: word: obj
-8705: space: \x0a
-8706: dict_open: <<
-8708: space: \x0a
-8711: name: /Length
-8718: space:
-8719: integer: 56
-8721: space:
-8722: integer: 0
-8723: space:
-8724: word: R
-8725: space: \x0a
-8726: dict_close: >>
-8728: space: \x0a
-8729: word: stream
+8672: word: endstream
+8681: space: \x0a
+8682: word: endobj
+8688: space: \x0a\x0a
+8690: integer: 54
+8692: space:
+8693: integer: 0
+8694: space:
+8695: word: obj
+8698: space: \x0a
+8699: integer: 44
+8701: space: \x0a
+8702: word: endobj
+8708: space: \x0a\x0a
+8710: comment: %% Contents for page 10
+8733: space: \x0a
+8734: comment: %% Original object ID: 46 0
+8761: space: \x0a
+8762: integer: 55
+8764: space:
+8765: integer: 0
+8766: space:
+8767: word: obj
+8770: space: \x0a
+8771: dict_open: <<
+8773: space: \x0a
+8776: name: /Length
+8783: space:
+8784: integer: 56
+8786: space:
+8787: integer: 0
+8788: space:
+8789: word: R
+8790: space: \x0a
+8791: dict_close: >>
+8793: space: \x0a
+8794: word: stream
skipping to endstream
-8780: word: endstream
-8789: space: \x0a
-8790: word: endobj
-8796: space: \x0a\x0a
-8798: integer: 56
-8800: space:
-8801: integer: 0
-8802: space:
-8803: word: obj
-8806: space: \x0a
-8807: integer: 44
-8809: space: \x0a
-8810: word: endobj
-8816: space: \x0a\x0a
-8818: comment: %% Contents for page 11
-8841: space: \x0a
-8842: comment: %% Original object ID: 47 0
-8869: space: \x0a
-8870: integer: 57
-8872: space:
-8873: integer: 0
-8874: space:
-8875: word: obj
-8878: space: \x0a
-8879: dict_open: <<
-8881: space: \x0a
-8884: name: /Length
-8891: space:
-8892: integer: 58
-8894: space:
-8895: integer: 0
-8896: space:
-8897: word: R
-8898: space: \x0a
-8899: dict_close: >>
-8901: space: \x0a
-8902: word: stream
+8845: word: endstream
+8854: space: \x0a
+8855: word: endobj
+8861: space: \x0a\x0a
+8863: integer: 56
+8865: space:
+8866: integer: 0
+8867: space:
+8868: word: obj
+8871: space: \x0a
+8872: integer: 44
+8874: space: \x0a
+8875: word: endobj
+8881: space: \x0a\x0a
+8883: comment: %% Contents for page 11
+8906: space: \x0a
+8907: comment: %% Original object ID: 47 0
+8934: space: \x0a
+8935: integer: 57
+8937: space:
+8938: integer: 0
+8939: space:
+8940: word: obj
+8943: space: \x0a
+8944: dict_open: <<
+8946: space: \x0a
+8949: name: /Length
+8956: space:
+8957: integer: 58
+8959: space:
+8960: integer: 0
+8961: space:
+8962: word: R
+8963: space: \x0a
+8964: dict_close: >>
+8966: space: \x0a
+8967: word: stream
skipping to endstream
-8953: word: endstream
-8962: space: \x0a
-8963: word: endobj
-8969: space: \x0a\x0a
-8971: integer: 58
-8973: space:
-8974: integer: 0
-8975: space:
-8976: word: obj
-8979: space: \x0a
-8980: integer: 44
-8982: space: \x0a
-8983: word: endobj
-8989: space: \x0a\x0a
-8991: integer: 59
-8993: space:
-8994: integer: 0
-8995: space:
-8996: word: obj
-8999: space: \x0a
-9000: dict_open: <<
-9002: space: \x0a
-9005: name: /Type
-9010: space:
-9011: name: /XRef
-9016: space: \x0a
-9019: name: /Length
-9026: space:
-9027: integer: 240
-9030: space: \x0a
-9033: name: /W
-9035: space:
-9036: array_open: [
-9037: space:
-9038: integer: 1
-9039: space:
-9040: integer: 2
-9041: space:
-9042: integer: 1
-9043: space:
-9044: array_close: ]
-9045: space: \x0a
-9048: name: /Root
-9053: space:
-9054: integer: 2
-9055: space:
-9056: integer: 0
-9057: space:
-9058: word: R
-9059: space: \x0a
-9062: name: /Size
-9067: space:
-9068: integer: 60
-9070: space: \x0a
-9073: name: /ID
-9076: space:
-9077: array_open: [
-9078: string: \x88\x04\x8e\x17\xc9a\xe0\x94\xff\xec\xe9\x8c\xb8\x8cF\xd0 (raw: <88048e17c961e094ffece98cb88c46d0>)
-9112: string: \xed\xd6\x0f\xe8\xee\x87\xf8\x871\xa8o\x81\x9f\xe6Q\x99 (raw: <edd60fe8ee87f88731a86f819fe65199>)
-9146: array_close: ]
-9147: space: \x0a
-9148: dict_close: >>
-9150: space: \x0a
-9151: word: stream
+9018: word: endstream
+9027: space: \x0a
+9028: word: endobj
+9034: space: \x0a\x0a
+9036: integer: 58
+9038: space:
+9039: integer: 0
+9040: space:
+9041: word: obj
+9044: space: \x0a
+9045: integer: 44
+9047: space: \x0a
+9048: word: endobj
+9054: space: \x0a\x0a
+9056: integer: 59
+9058: space:
+9059: integer: 0
+9060: space:
+9061: word: obj
+9064: space: \x0a
+9065: dict_open: <<
+9067: space: \x0a
+9070: name: /Type
+9075: space:
+9076: name: /XRef
+9081: space: \x0a
+9084: name: /Length
+9091: space:
+9092: integer: 240
+9095: space: \x0a
+9098: name: /W
+9100: space:
+9101: array_open: [
+9102: space:
+9103: integer: 1
+9104: space:
+9105: integer: 2
+9106: space:
+9107: integer: 1
+9108: space:
+9109: array_close: ]
+9110: space: \x0a
+9113: name: /Root
+9118: space:
+9119: integer: 2
+9120: space:
+9121: integer: 0
+9122: space:
+9123: word: R
+9124: space: \x0a
+9127: name: /Size
+9132: space:
+9133: integer: 60
+9135: space: \x0a
+9138: name: /ID
+9141: space:
+9142: array_open: [
+9143: string: \x88\x04\x8e\x17\xc9a\xe0\x94\xff\xec\xe9\x8c\xb8\x8cF\xd0 (raw: <88048e17c961e094ffece98cb88c46d0>)
+9177: string: \xed\xd6\x0f\xe8\xee\x87\xf8\x871\xa8o\x81\x9f\xe6Q\x99 (raw: <edd60fe8ee87f88731a86f819fe65199>)
+9211: array_close: ]
+9212: space: \x0a
+9213: dict_close: >>
+9215: space: \x0a
+9216: word: stream
skipping to endstream
-9399: word: endstream
-9408: space: \x0a
-9409: word: endobj
-9415: space: \x0a\x0a
-9417: word: startxref
-9426: space: \x0a
-9427: integer: 8991
-9431: space: \x0a
-9432: comment: %%EOF
-9437: space: \x0a
-9438: eof
+9464: word: endstream
+9473: space: \x0a
+9474: word: endobj
+9480: space: \x0a\x0a
+9482: word: startxref
+9491: space: \x0a
+9492: integer: 9056
+9496: space: \x0a
+9497: comment: %%EOF
+9502: space: \x0a
+9503: eof
--- END FILE ---
--- BEGIN PAGE 1 ---
0: word: BT
@@ -659,69 +659,77 @@ skipping to endstream
58: space: \x0a
61: string: quack (raw: (qu\\x0dack))
70: space: \x0a
-73: integer: 72
-75: space:
-76: integer: 720
-79: space:
-80: word: Td
-82: space: \x0a
-85: real: 3.14
-89: space: \x0a
-92: real: 3.
-94: space: \x0a
-97: real: .14
-100: space: \x0a
-103: real: +3.14
-108: space: \x0a
-111: real: +3.
-114: space: \x0a
-117: real: +.14
-121: space: \x0a
-124: real: -3.14
-129: space: \x0a
-132: real: -3.
+73: string: qu\x0aack (raw: (qu\\x0d\x0a\x0dack))
+84: space: \x0a
+87: string: qu\x0aack (raw: (qu\\x0d\x0dack))
+97: space: \x0a
+100: string: qu\x0a\x0a\x0a\x0a\x0a\x0aack (raw: (qu\\x0a\x0a\x0d\x0a\x0a\x0d\x0d\x0a\x0aack))
+117: space: \x0a
+120: string: qu\x0a\x0a\x0a\x0a\x0a\x0aack (raw: (qu\x0a\x0d\x0a\x0a\x0d\x0d\x0a\x0aack))
135: space: \x0a
-138: real: -.14
-142: space: \x0a
-145: integer: +16059
-151: space: \x0a
-154: integer: -16059
-160: space: \x0a
-163: word: +.
+138: integer: 72
+140: space:
+141: integer: 720
+144: space:
+145: word: Td
+147: space: \x0a
+150: real: 3.14
+154: space: \x0a
+157: real: 3.
+159: space: \x0a
+162: real: .14
165: space: \x0a
-168: bad: <fade\x0aET (invalid character (T) in hexstring)
-176: space: \x0a
-177: bad: ) (unexpected ))
-178: bad: > (unexpected >)
-179: word: quack
-184: space:
-185: bad: /name#oops (invalid name token)
-195: space:
-196: name: /name (raw: /n#61me)
-203: space:
-204: word: one
-207: space:
-208: bool: true
-212: space:
-213: word: two
-216: space:
-217: bool: false
-222: space:
-223: word: three
-228: space:
-229: null: null
-233: space:
-234: word: four
-238: space: \x0a
-239: word: !@#$^&
-245: brace_open: {
-246: brace_close: }
-247: word: *-_+=
-252: space: \x0a
-253: word: abc123def3.14true
-270: space: \x0a
-271: bad: <ff\x0a (EOF while reading token)
-275: eof
+168: real: +3.14
+173: space: \x0a
+176: real: +3.
+179: space: \x0a
+182: real: +.14
+186: space: \x0a
+189: real: -3.14
+194: space: \x0a
+197: real: -3.
+200: space: \x0a
+203: real: -.14
+207: space: \x0a
+210: integer: +16059
+216: space: \x0a
+219: integer: -16059
+225: space: \x0a
+228: word: +.
+230: space: \x0a
+233: bad: <fade\x0aET (invalid character (T) in hexstring)
+241: space: \x0a
+242: bad: ) (unexpected ))
+243: bad: > (unexpected >)
+244: word: quack
+249: space:
+250: bad: /name#oops (invalid name token)
+260: space:
+261: name: /name (raw: /n#61me)
+268: space:
+269: word: one
+272: space:
+273: bool: true
+277: space:
+278: word: two
+281: space:
+282: bool: false
+287: space:
+288: word: three
+293: space:
+294: null: null
+298: space:
+299: word: four
+303: space: \x0a
+304: word: !@#$^&
+310: brace_open: {
+311: brace_close: }
+312: word: *-_+=
+317: space: \x0a
+318: word: abc123def3.14true
+335: space: \x0a
+336: bad: <ff\x0a (EOF while reading token)
+340: eof
--- END PAGE 4 ---
--- BEGIN PAGE 5 ---
0: word: BT
diff --git a/qpdf/qtest/qpdf/tokens-no-ignorable.out b/qpdf/qtest/qpdf/tokens-no-ignorable.out
index 3bbef579..ca977b8c 100644
--- a/qpdf/qtest/qpdf/tokens-no-ignorable.out
+++ b/qpdf/qtest/qpdf/tokens-no-ignorable.out
@@ -81,172 +81,172 @@ skipping to endstream
7119: dict_close: >>
7122: word: stream
skipping to endstream
-7404: word: endstream
-7414: word: endobj
-7422: integer: 44
-7425: integer: 0
-7427: word: obj
-7431: integer: 275
-7435: word: endobj
-7494: integer: 45
-7497: integer: 0
-7499: word: obj
-7503: dict_open: <<
-7508: name: /Length
-7516: integer: 46
-7519: integer: 0
-7521: word: R
-7523: dict_close: >>
-7526: word: stream
+7469: word: endstream
+7479: word: endobj
+7487: integer: 44
+7490: integer: 0
+7492: word: obj
+7496: integer: 340
+7500: word: endobj
+7559: integer: 45
+7562: integer: 0
+7564: word: obj
+7568: dict_open: <<
+7573: name: /Length
+7581: integer: 46
+7584: integer: 0
+7586: word: R
+7588: dict_close: >>
+7591: word: stream
skipping to endstream
-7601: word: endstream
-7611: word: endobj
-7640: integer: 46
-7643: integer: 0
-7645: word: obj
-7649: integer: 67
-7652: word: endobj
-7711: integer: 47
-7714: integer: 0
-7716: word: obj
-7720: dict_open: <<
-7725: name: /Length
-7733: integer: 48
-7736: integer: 0
-7738: word: R
-7740: dict_close: >>
-7743: word: stream
+7666: word: endstream
+7676: word: endobj
+7705: integer: 46
+7708: integer: 0
+7710: word: obj
+7714: integer: 67
+7717: word: endobj
+7776: integer: 47
+7779: integer: 0
+7781: word: obj
+7785: dict_open: <<
+7790: name: /Length
+7798: integer: 48
+7801: integer: 0
+7803: word: R
+7805: dict_close: >>
+7808: word: stream
skipping to endstream
-7794: word: endstream
-7804: word: endobj
-7812: integer: 48
-7815: integer: 0
-7817: word: obj
-7821: integer: 44
-7824: word: endobj
-7883: integer: 49
-7886: integer: 0
-7888: word: obj
-7892: dict_open: <<
-7897: name: /Length
-7905: integer: 50
-7908: integer: 0
-7910: word: R
-7912: dict_close: >>
-7915: word: stream
+7859: word: endstream
+7869: word: endobj
+7877: integer: 48
+7880: integer: 0
+7882: word: obj
+7886: integer: 44
+7889: word: endobj
+7948: integer: 49
+7951: integer: 0
+7953: word: obj
+7957: dict_open: <<
+7962: name: /Length
+7970: integer: 50
+7973: integer: 0
+7975: word: R
+7977: dict_close: >>
+7980: word: stream
skipping to endstream
-8241: word: endstream
-8251: word: endobj
-8280: integer: 50
-8283: integer: 0
-8285: word: obj
-8289: integer: 318
-8293: word: endobj
-8352: integer: 51
-8355: integer: 0
-8357: word: obj
-8361: dict_open: <<
-8366: name: /Length
-8374: integer: 52
-8377: integer: 0
-8379: word: R
-8381: dict_close: >>
-8384: word: stream
+8306: word: endstream
+8316: word: endobj
+8345: integer: 50
+8348: integer: 0
+8350: word: obj
+8354: integer: 318
+8358: word: endobj
+8417: integer: 51
+8420: integer: 0
+8422: word: obj
+8426: dict_open: <<
+8431: name: /Length
+8439: integer: 52
+8442: integer: 0
+8444: word: R
+8446: dict_close: >>
+8449: word: stream
skipping to endstream
-8435: word: endstream
-8445: word: endobj
-8453: integer: 52
-8456: integer: 0
-8458: word: obj
-8462: integer: 44
-8465: word: endobj
-8524: integer: 53
-8527: integer: 0
-8529: word: obj
-8533: dict_open: <<
-8538: name: /Length
-8546: integer: 54
-8549: integer: 0
-8551: word: R
-8553: dict_close: >>
-8556: word: stream
+8500: word: endstream
+8510: word: endobj
+8518: integer: 52
+8521: integer: 0
+8523: word: obj
+8527: integer: 44
+8530: word: endobj
+8589: integer: 53
+8592: integer: 0
+8594: word: obj
+8598: dict_open: <<
+8603: name: /Length
+8611: integer: 54
+8614: integer: 0
+8616: word: R
+8618: dict_close: >>
+8621: word: stream
skipping to endstream
-8607: word: endstream
-8617: word: endobj
-8625: integer: 54
-8628: integer: 0
-8630: word: obj
-8634: integer: 44
-8637: word: endobj
-8697: integer: 55
-8700: integer: 0
-8702: word: obj
-8706: dict_open: <<
-8711: name: /Length
-8719: integer: 56
-8722: integer: 0
-8724: word: R
-8726: dict_close: >>
-8729: word: stream
+8672: word: endstream
+8682: word: endobj
+8690: integer: 54
+8693: integer: 0
+8695: word: obj
+8699: integer: 44
+8702: word: endobj
+8762: integer: 55
+8765: integer: 0
+8767: word: obj
+8771: dict_open: <<
+8776: name: /Length
+8784: integer: 56
+8787: integer: 0
+8789: word: R
+8791: dict_close: >>
+8794: word: stream
skipping to endstream
-8780: word: endstream
-8790: word: endobj
-8798: integer: 56
-8801: integer: 0
-8803: word: obj
-8807: integer: 44
-8810: word: endobj
-8870: integer: 57
-8873: integer: 0
-8875: word: obj
-8879: dict_open: <<
-8884: name: /Length
-8892: integer: 58
-8895: integer: 0
-8897: word: R
-8899: dict_close: >>
-8902: word: stream
+8845: word: endstream
+8855: word: endobj
+8863: integer: 56
+8866: integer: 0
+8868: word: obj
+8872: integer: 44
+8875: word: endobj
+8935: integer: 57
+8938: integer: 0
+8940: word: obj
+8944: dict_open: <<
+8949: name: /Length
+8957: integer: 58
+8960: integer: 0
+8962: word: R
+8964: dict_close: >>
+8967: word: stream
skipping to endstream
-8953: word: endstream
-8963: word: endobj
-8971: integer: 58
-8974: integer: 0
-8976: word: obj
-8980: integer: 44
-8983: word: endobj
-8991: integer: 59
-8994: integer: 0
-8996: word: obj
-9000: dict_open: <<
-9005: name: /Type
-9011: name: /XRef
-9019: name: /Length
-9027: integer: 240
-9033: name: /W
-9036: array_open: [
-9038: integer: 1
-9040: integer: 2
-9042: integer: 1
-9044: array_close: ]
-9048: name: /Root
-9054: integer: 2
-9056: integer: 0
-9058: word: R
-9062: name: /Size
-9068: integer: 60
-9073: name: /ID
-9077: array_open: [
-9078: string: \x88\x04\x8e\x17\xc9a\xe0\x94\xff\xec\xe9\x8c\xb8\x8cF\xd0 (raw: <88048e17c961e094ffece98cb88c46d0>)
-9112: string: \xed\xd6\x0f\xe8\xee\x87\xf8\x871\xa8o\x81\x9f\xe6Q\x99 (raw: <edd60fe8ee87f88731a86f819fe65199>)
-9146: array_close: ]
-9148: dict_close: >>
-9151: word: stream
+9018: word: endstream
+9028: word: endobj
+9036: integer: 58
+9039: integer: 0
+9041: word: obj
+9045: integer: 44
+9048: word: endobj
+9056: integer: 59
+9059: integer: 0
+9061: word: obj
+9065: dict_open: <<
+9070: name: /Type
+9076: name: /XRef
+9084: name: /Length
+9092: integer: 240
+9098: name: /W
+9101: array_open: [
+9103: integer: 1
+9105: integer: 2
+9107: integer: 1
+9109: array_close: ]
+9113: name: /Root
+9119: integer: 2
+9121: integer: 0
+9123: word: R
+9127: name: /Size
+9133: integer: 60
+9138: name: /ID
+9142: array_open: [
+9143: string: \x88\x04\x8e\x17\xc9a\xe0\x94\xff\xec\xe9\x8c\xb8\x8cF\xd0 (raw: <88048e17c961e094ffece98cb88c46d0>)
+9177: string: \xed\xd6\x0f\xe8\xee\x87\xf8\x871\xa8o\x81\x9f\xe6Q\x99 (raw: <edd60fe8ee87f88731a86f819fe65199>)
+9211: array_close: ]
+9213: dict_close: >>
+9216: word: stream
skipping to endstream
-9399: word: endstream
-9409: word: endobj
-9417: word: startxref
-9427: integer: 8991
-9438: eof
+9464: word: endstream
+9474: word: endobj
+9482: word: startxref
+9492: integer: 9056
+9503: eof
--- END FILE ---
--- BEGIN PAGE 1 ---
0: word: BT
@@ -325,41 +325,45 @@ skipping to endstream
36: string: quack (raw: (qu\\x0d\x0aack))
49: string: quack (raw: (qu\\x0aack))
61: string: quack (raw: (qu\\x0dack))
-73: integer: 72
-76: integer: 720
-80: word: Td
-85: real: 3.14
-92: real: 3.
-97: real: .14
-103: real: +3.14
-111: real: +3.
-117: real: +.14
-124: real: -3.14
-132: real: -3.
-138: real: -.14
-145: integer: +16059
-154: integer: -16059
-163: word: +.
-168: bad: <fade\x0aET (invalid character (T) in hexstring)
-177: bad: ) (unexpected ))
-178: bad: > (unexpected >)
-179: word: quack
-185: bad: /name#oops (invalid name token)
-196: name: /name (raw: /n#61me)
-204: word: one
-208: bool: true
-213: word: two
-217: bool: false
-223: word: three
-229: null: null
-234: word: four
-239: word: !@#$^&
-245: brace_open: {
-246: brace_close: }
-247: word: *-_+=
-253: word: abc123def3.14true
-271: bad: <ff\x0a (EOF while reading token)
-275: eof
+73: string: qu\x0aack (raw: (qu\\x0d\x0a\x0dack))
+87: string: qu\x0aack (raw: (qu\\x0d\x0dack))
+100: string: qu\x0a\x0a\x0a\x0a\x0a\x0aack (raw: (qu\\x0a\x0a\x0d\x0a\x0a\x0d\x0d\x0a\x0aack))
+120: string: qu\x0a\x0a\x0a\x0a\x0a\x0aack (raw: (qu\x0a\x0d\x0a\x0a\x0d\x0d\x0a\x0aack))
+138: integer: 72
+141: integer: 720
+145: word: Td
+150: real: 3.14
+157: real: 3.
+162: real: .14
+168: real: +3.14
+176: real: +3.
+182: real: +.14
+189: real: -3.14
+197: real: -3.
+203: real: -.14
+210: integer: +16059
+219: integer: -16059
+228: word: +.
+233: bad: <fade\x0aET (invalid character (T) in hexstring)
+242: bad: ) (unexpected ))
+243: bad: > (unexpected >)
+244: word: quack
+250: bad: /name#oops (invalid name token)
+261: name: /name (raw: /n#61me)
+269: word: one
+273: bool: true
+278: word: two
+282: bool: false
+288: word: three
+294: null: null
+299: word: four
+304: word: !@#$^&
+310: brace_open: {
+311: brace_close: }
+312: word: *-_+=
+318: word: abc123def3.14true
+336: bad: <ff\x0a (EOF while reading token)
+340: eof
--- END PAGE 4 ---
--- BEGIN PAGE 5 ---
0: word: BT
diff --git a/qpdf/qtest/qpdf/tokens.out b/qpdf/qtest/qpdf/tokens.out
index ee1f6d3e..9151f593 100644
--- a/qpdf/qtest/qpdf/tokens.out
+++ b/qpdf/qtest/qpdf/tokens.out
@@ -181,352 +181,352 @@ skipping to endstream
7121: space: \x0a
7122: word: stream
skipping to endstream
-7404: word: endstream
-7413: space: \x0a
-7414: word: endobj
-7420: space: \x0a\x0a
-7422: integer: 44
-7424: space:
-7425: integer: 0
-7426: space:
-7427: word: obj
-7430: space: \x0a
-7431: integer: 275
-7434: space: \x0a
-7435: word: endobj
-7441: space: \x0a\x0a
-7443: comment: %% Contents for page 5
-7465: space: \x0a
-7466: comment: %% Original object ID: 41 0
-7493: space: \x0a
-7494: integer: 45
-7496: space:
-7497: integer: 0
-7498: space:
-7499: word: obj
-7502: space: \x0a
-7503: dict_open: <<
-7505: space: \x0a
-7508: name: /Length
-7515: space:
-7516: integer: 46
-7518: space:
-7519: integer: 0
-7520: space:
-7521: word: R
-7522: space: \x0a
-7523: dict_close: >>
-7525: space: \x0a
-7526: word: stream
+7469: word: endstream
+7478: space: \x0a
+7479: word: endobj
+7485: space: \x0a\x0a
+7487: integer: 44
+7489: space:
+7490: integer: 0
+7491: space:
+7492: word: obj
+7495: space: \x0a
+7496: integer: 340
+7499: space: \x0a
+7500: word: endobj
+7506: space: \x0a\x0a
+7508: comment: %% Contents for page 5
+7530: space: \x0a
+7531: comment: %% Original object ID: 41 0
+7558: space: \x0a
+7559: integer: 45
+7561: space:
+7562: integer: 0
+7563: space:
+7564: word: obj
+7567: space: \x0a
+7568: dict_open: <<
+7570: space: \x0a
+7573: name: /Length
+7580: space:
+7581: integer: 46
+7583: space:
+7584: integer: 0
+7585: space:
+7586: word: R
+7587: space: \x0a
+7588: dict_close: >>
+7590: space: \x0a
+7591: word: stream
skipping to endstream
-7601: word: endstream
-7610: space: \x0a
-7611: word: endobj
-7617: space: \x0a
-7618: comment: %QDF: ignore_newline
-7638: space: \x0a\x0a
-7640: integer: 46
-7642: space:
-7643: integer: 0
-7644: space:
-7645: word: obj
-7648: space: \x0a
-7649: integer: 67
-7651: space: \x0a
-7652: word: endobj
-7658: space: \x0a\x0a
-7660: comment: %% Contents for page 6
+7666: word: endstream
+7675: space: \x0a
+7676: word: endobj
7682: space: \x0a
-7683: comment: %% Original object ID: 42 0
-7710: space: \x0a
-7711: integer: 47
-7713: space:
-7714: integer: 0
-7715: space:
-7716: word: obj
-7719: space: \x0a
-7720: dict_open: <<
-7722: space: \x0a
-7725: name: /Length
-7732: space:
-7733: integer: 48
-7735: space:
-7736: integer: 0
-7737: space:
-7738: word: R
-7739: space: \x0a
-7740: dict_close: >>
-7742: space: \x0a
-7743: word: stream
+7683: comment: %QDF: ignore_newline
+7703: space: \x0a\x0a
+7705: integer: 46
+7707: space:
+7708: integer: 0
+7709: space:
+7710: word: obj
+7713: space: \x0a
+7714: integer: 67
+7716: space: \x0a
+7717: word: endobj
+7723: space: \x0a\x0a
+7725: comment: %% Contents for page 6
+7747: space: \x0a
+7748: comment: %% Original object ID: 42 0
+7775: space: \x0a
+7776: integer: 47
+7778: space:
+7779: integer: 0
+7780: space:
+7781: word: obj
+7784: space: \x0a
+7785: dict_open: <<
+7787: space: \x0a
+7790: name: /Length
+7797: space:
+7798: integer: 48
+7800: space:
+7801: integer: 0
+7802: space:
+7803: word: R
+7804: space: \x0a
+7805: dict_close: >>
+7807: space: \x0a
+7808: word: stream
skipping to endstream
-7794: word: endstream
-7803: space: \x0a
-7804: word: endobj
-7810: space: \x0a\x0a
-7812: integer: 48
-7814: space:
-7815: integer: 0
-7816: space:
-7817: word: obj
-7820: space: \x0a
-7821: integer: 44
-7823: space: \x0a
-7824: word: endobj
-7830: space: \x0a\x0a
-7832: comment: %% Contents for page 7
-7854: space: \x0a
-7855: comment: %% Original object ID: 43 0
-7882: space: \x0a
-7883: integer: 49
-7885: space:
-7886: integer: 0
-7887: space:
-7888: word: obj
-7891: space: \x0a
-7892: dict_open: <<
-7894: space: \x0a
-7897: name: /Length
-7904: space:
-7905: integer: 50
-7907: space:
-7908: integer: 0
-7909: space:
-7910: word: R
-7911: space: \x0a
-7912: dict_close: >>
-7914: space: \x0a
-7915: word: stream
+7859: word: endstream
+7868: space: \x0a
+7869: word: endobj
+7875: space: \x0a\x0a
+7877: integer: 48
+7879: space:
+7880: integer: 0
+7881: space:
+7882: word: obj
+7885: space: \x0a
+7886: integer: 44
+7888: space: \x0a
+7889: word: endobj
+7895: space: \x0a\x0a
+7897: comment: %% Contents for page 7
+7919: space: \x0a
+7920: comment: %% Original object ID: 43 0
+7947: space: \x0a
+7948: integer: 49
+7950: space:
+7951: integer: 0
+7952: space:
+7953: word: obj
+7956: space: \x0a
+7957: dict_open: <<
+7959: space: \x0a
+7962: name: /Length
+7969: space:
+7970: integer: 50
+7972: space:
+7973: integer: 0
+7974: space:
+7975: word: R
+7976: space: \x0a
+7977: dict_close: >>
+7979: space: \x0a
+7980: word: stream
skipping to endstream
-8241: word: endstream
-8250: space: \x0a
-8251: word: endobj
-8257: space: \x0a
-8258: comment: %QDF: ignore_newline
-8278: space: \x0a\x0a
-8280: integer: 50
-8282: space:
-8283: integer: 0
-8284: space:
-8285: word: obj
-8288: space: \x0a
-8289: integer: 318
-8292: space: \x0a
-8293: word: endobj
-8299: space: \x0a\x0a
-8301: comment: %% Contents for page 8
-8323: space: \x0a
-8324: comment: %% Original object ID: 44 0
-8351: space: \x0a
-8352: integer: 51
-8354: space:
-8355: integer: 0
-8356: space:
-8357: word: obj
-8360: space: \x0a
-8361: dict_open: <<
-8363: space: \x0a
-8366: name: /Length
-8373: space:
-8374: integer: 52
-8376: space:
-8377: integer: 0
-8378: space:
-8379: word: R
-8380: space: \x0a
-8381: dict_close: >>
-8383: space: \x0a
-8384: word: stream
+8306: word: endstream
+8315: space: \x0a
+8316: word: endobj
+8322: space: \x0a
+8323: comment: %QDF: ignore_newline
+8343: space: \x0a\x0a
+8345: integer: 50
+8347: space:
+8348: integer: 0
+8349: space:
+8350: word: obj
+8353: space: \x0a
+8354: integer: 318
+8357: space: \x0a
+8358: word: endobj
+8364: space: \x0a\x0a
+8366: comment: %% Contents for page 8
+8388: space: \x0a
+8389: comment: %% Original object ID: 44 0
+8416: space: \x0a
+8417: integer: 51
+8419: space:
+8420: integer: 0
+8421: space:
+8422: word: obj
+8425: space: \x0a
+8426: dict_open: <<
+8428: space: \x0a
+8431: name: /Length
+8438: space:
+8439: integer: 52
+8441: space:
+8442: integer: 0
+8443: space:
+8444: word: R
+8445: space: \x0a
+8446: dict_close: >>
+8448: space: \x0a
+8449: word: stream
skipping to endstream
-8435: word: endstream
-8444: space: \x0a
-8445: word: endobj
-8451: space: \x0a\x0a
-8453: integer: 52
-8455: space:
-8456: integer: 0
-8457: space:
-8458: word: obj
-8461: space: \x0a
-8462: integer: 44
-8464: space: \x0a
-8465: word: endobj
-8471: space: \x0a\x0a
-8473: comment: %% Contents for page 9
-8495: space: \x0a
-8496: comment: %% Original object ID: 45 0
-8523: space: \x0a
-8524: integer: 53
-8526: space:
-8527: integer: 0
-8528: space:
-8529: word: obj
-8532: space: \x0a
-8533: dict_open: <<
-8535: space: \x0a
-8538: name: /Length
-8545: space:
-8546: integer: 54
-8548: space:
-8549: integer: 0
-8550: space:
-8551: word: R
-8552: space: \x0a
-8553: dict_close: >>
-8555: space: \x0a
-8556: word: stream
+8500: word: endstream
+8509: space: \x0a
+8510: word: endobj
+8516: space: \x0a\x0a
+8518: integer: 52
+8520: space:
+8521: integer: 0
+8522: space:
+8523: word: obj
+8526: space: \x0a
+8527: integer: 44
+8529: space: \x0a
+8530: word: endobj
+8536: space: \x0a\x0a
+8538: comment: %% Contents for page 9
+8560: space: \x0a
+8561: comment: %% Original object ID: 45 0
+8588: space: \x0a
+8589: integer: 53
+8591: space:
+8592: integer: 0
+8593: space:
+8594: word: obj
+8597: space: \x0a
+8598: dict_open: <<
+8600: space: \x0a
+8603: name: /Length
+8610: space:
+8611: integer: 54
+8613: space:
+8614: integer: 0
+8615: space:
+8616: word: R
+8617: space: \x0a
+8618: dict_close: >>
+8620: space: \x0a
+8621: word: stream
skipping to endstream
-8607: word: endstream
-8616: space: \x0a
-8617: word: endobj
-8623: space: \x0a\x0a
-8625: integer: 54
-8627: space:
-8628: integer: 0
-8629: space:
-8630: word: obj
-8633: space: \x0a
-8634: integer: 44
-8636: space: \x0a
-8637: word: endobj
-8643: space: \x0a\x0a
-8645: comment: %% Contents for page 10
-8668: space: \x0a
-8669: comment: %% Original object ID: 46 0
-8696: space: \x0a
-8697: integer: 55
-8699: space:
-8700: integer: 0
-8701: space:
-8702: word: obj
-8705: space: \x0a
-8706: dict_open: <<
-8708: space: \x0a
-8711: name: /Length
-8718: space:
-8719: integer: 56
-8721: space:
-8722: integer: 0
-8723: space:
-8724: word: R
-8725: space: \x0a
-8726: dict_close: >>
-8728: space: \x0a
-8729: word: stream
+8672: word: endstream
+8681: space: \x0a
+8682: word: endobj
+8688: space: \x0a\x0a
+8690: integer: 54
+8692: space:
+8693: integer: 0
+8694: space:
+8695: word: obj
+8698: space: \x0a
+8699: integer: 44
+8701: space: \x0a
+8702: word: endobj
+8708: space: \x0a\x0a
+8710: comment: %% Contents for page 10
+8733: space: \x0a
+8734: comment: %% Original object ID: 46 0
+8761: space: \x0a
+8762: integer: 55
+8764: space:
+8765: integer: 0
+8766: space:
+8767: word: obj
+8770: space: \x0a
+8771: dict_open: <<
+8773: space: \x0a
+8776: name: /Length
+8783: space:
+8784: integer: 56
+8786: space:
+8787: integer: 0
+8788: space:
+8789: word: R
+8790: space: \x0a
+8791: dict_close: >>
+8793: space: \x0a
+8794: word: stream
skipping to endstream
-8780: word: endstream
-8789: space: \x0a
-8790: word: endobj
-8796: space: \x0a\x0a
-8798: integer: 56
-8800: space:
-8801: integer: 0
-8802: space:
-8803: word: obj
-8806: space: \x0a
-8807: integer: 44
-8809: space: \x0a
-8810: word: endobj
-8816: space: \x0a\x0a
-8818: comment: %% Contents for page 11
-8841: space: \x0a
-8842: comment: %% Original object ID: 47 0
-8869: space: \x0a
-8870: integer: 57
-8872: space:
-8873: integer: 0
-8874: space:
-8875: word: obj
-8878: space: \x0a
-8879: dict_open: <<
-8881: space: \x0a
-8884: name: /Length
-8891: space:
-8892: integer: 58
-8894: space:
-8895: integer: 0
-8896: space:
-8897: word: R
-8898: space: \x0a
-8899: dict_close: >>
-8901: space: \x0a
-8902: word: stream
+8845: word: endstream
+8854: space: \x0a
+8855: word: endobj
+8861: space: \x0a\x0a
+8863: integer: 56
+8865: space:
+8866: integer: 0
+8867: space:
+8868: word: obj
+8871: space: \x0a
+8872: integer: 44
+8874: space: \x0a
+8875: word: endobj
+8881: space: \x0a\x0a
+8883: comment: %% Contents for page 11
+8906: space: \x0a
+8907: comment: %% Original object ID: 47 0
+8934: space: \x0a
+8935: integer: 57
+8937: space:
+8938: integer: 0
+8939: space:
+8940: word: obj
+8943: space: \x0a
+8944: dict_open: <<
+8946: space: \x0a
+8949: name: /Length
+8956: space:
+8957: integer: 58
+8959: space:
+8960: integer: 0
+8961: space:
+8962: word: R
+8963: space: \x0a
+8964: dict_close: >>
+8966: space: \x0a
+8967: word: stream
skipping to endstream
-8953: word: endstream
-8962: space: \x0a
-8963: word: endobj
-8969: space: \x0a\x0a
-8971: integer: 58
-8973: space:
-8974: integer: 0
-8975: space:
-8976: word: obj
-8979: space: \x0a
-8980: integer: 44
-8982: space: \x0a
-8983: word: endobj
-8989: space: \x0a\x0a
-8991: integer: 59
-8993: space:
-8994: integer: 0
-8995: space:
-8996: word: obj
-8999: space: \x0a
-9000: dict_open: <<
-9002: space: \x0a
-9005: name: /Type
-9010: space:
-9011: name: /XRef
-9016: space: \x0a
-9019: name: /Length
-9026: space:
-9027: integer: 240
-9030: space: \x0a
-9033: name: /W
-9035: space:
-9036: array_open: [
-9037: space:
-9038: integer: 1
-9039: space:
-9040: integer: 2
-9041: space:
-9042: integer: 1
-9043: space:
-9044: array_close: ]
-9045: space: \x0a
-9048: name: /Root
-9053: space:
-9054: integer: 2
-9055: space:
-9056: integer: 0
-9057: space:
-9058: word: R
-9059: space: \x0a
-9062: name: /Size
-9067: space:
-9068: integer: 60
-9070: space: \x0a
-9073: name: /ID
-9076: space:
-9077: array_open: [
-9078: string: \x88\x04\x8e\x17\xc9a\xe0\x94\xff\xec\xe9\x8c\xb8\x8cF\xd0 (raw: <88048e17c961e094ffece98cb88c46d0>)
-9112: string: \xed\xd6\x0f\xe8\xee\x87\xf8\x871\xa8o\x81\x9f\xe6Q\x99 (raw: <edd60fe8ee87f88731a86f819fe65199>)
-9146: array_close: ]
-9147: space: \x0a
-9148: dict_close: >>
-9150: space: \x0a
-9151: word: stream
+9018: word: endstream
+9027: space: \x0a
+9028: word: endobj
+9034: space: \x0a\x0a
+9036: integer: 58
+9038: space:
+9039: integer: 0
+9040: space:
+9041: word: obj
+9044: space: \x0a
+9045: integer: 44
+9047: space: \x0a
+9048: word: endobj
+9054: space: \x0a\x0a
+9056: integer: 59
+9058: space:
+9059: integer: 0
+9060: space:
+9061: word: obj
+9064: space: \x0a
+9065: dict_open: <<
+9067: space: \x0a
+9070: name: /Type
+9075: space:
+9076: name: /XRef
+9081: space: \x0a
+9084: name: /Length
+9091: space:
+9092: integer: 240
+9095: space: \x0a
+9098: name: /W
+9100: space:
+9101: array_open: [
+9102: space:
+9103: integer: 1
+9104: space:
+9105: integer: 2
+9106: space:
+9107: integer: 1
+9108: space:
+9109: array_close: ]
+9110: space: \x0a
+9113: name: /Root
+9118: space:
+9119: integer: 2
+9120: space:
+9121: integer: 0
+9122: space:
+9123: word: R
+9124: space: \x0a
+9127: name: /Size
+9132: space:
+9133: integer: 60
+9135: space: \x0a
+9138: name: /ID
+9141: space:
+9142: array_open: [
+9143: string: \x88\x04\x8e\x17\xc9a\xe0\x94\xff\xec\xe9\x8c\xb8\x8cF\xd0 (raw: <88048e17c961e094ffece98cb88c46d0>)
+9177: string: \xed\xd6\x0f\xe8\xee\x87\xf8\x871\xa8o\x81\x9f\xe6Q\x99 (raw: <edd60fe8ee87f88731a86f819fe65199>)
+9211: array_close: ]
+9212: space: \x0a
+9213: dict_close: >>
+9215: space: \x0a
+9216: word: stream
skipping to endstream
-9399: word: endstream
-9408: space: \x0a
-9409: word: endobj
-9415: space: \x0a\x0a
-9417: word: startxref
-9426: space: \x0a
-9427: integer: 8991
-9431: space: \x0a
-9432: comment: %%EOF
-9437: space: \x0a
-9438: eof
+9464: word: endstream
+9473: space: \x0a
+9474: word: endobj
+9480: space: \x0a\x0a
+9482: word: startxref
+9491: space: \x0a
+9492: integer: 9056
+9496: space: \x0a
+9497: comment: %%EOF
+9502: space: \x0a
+9503: eof
--- END FILE ---
--- BEGIN PAGE 1 ---
0: word: BT
@@ -659,69 +659,77 @@ skipping to endstream
58: space: \x0a
61: string: quack (raw: (qu\\x0dack))
70: space: \x0a
-73: integer: 72
-75: space:
-76: integer: 720
-79: space:
-80: word: Td
-82: space: \x0a
-85: real: 3.14
-89: space: \x0a
-92: real: 3.
-94: space: \x0a
-97: real: .14
-100: space: \x0a
-103: real: +3.14
-108: space: \x0a
-111: real: +3.
-114: space: \x0a
-117: real: +.14
-121: space: \x0a
-124: real: -3.14
-129: space: \x0a
-132: real: -3.
+73: string: qu\x0aack (raw: (qu\\x0d\x0a\x0dack))
+84: space: \x0a
+87: string: qu\x0aack (raw: (qu\\x0d\x0dack))
+97: space: \x0a
+100: string: qu\x0a\x0a\x0a\x0a\x0a\x0aack (raw: (qu\\x0a\x0a\x0d\x0a\x0a\x0d\x0d\x0a\x0aack))
+117: space: \x0a
+120: string: qu\x0a\x0a\x0a\x0a\x0a\x0aack (raw: (qu\x0a\x0d\x0a\x0a\x0d\x0d\x0a\x0aack))
135: space: \x0a
-138: real: -.14
-142: space: \x0a
-145: integer: +16059
-151: space: \x0a
-154: integer: -16059
-160: space: \x0a
-163: word: +.
+138: integer: 72
+140: space:
+141: integer: 720
+144: space:
+145: word: Td
+147: space: \x0a
+150: real: 3.14
+154: space: \x0a
+157: real: 3.
+159: space: \x0a
+162: real: .14
165: space: \x0a
-168: bad: <fade\x0aET (invalid character (T) in hexstring)
-176: space: \x0a
-177: bad: ) (unexpected ))
-178: bad: > (unexpected >)
-179: word: quack
-184: space:
-185: bad: /name#oops (invalid name token)
-195: space:
-196: name: /name (raw: /n#61me)
-203: space:
-204: word: one
-207: space:
-208: bool: true
-212: space:
-213: word: two
-216: space:
-217: bool: false
-222: space:
-223: word: three
-228: space:
-229: null: null
-233: space:
-234: word: four
-238: space: \x0a
-239: word: !@#$^&
-245: brace_open: {
-246: brace_close: }
-247: word: *-_+=
-252: space: \x0a
-253: word: abc123def3.14true
-270: space: \x0a
-271: bad: <ff\x0a (EOF while reading token)
-275: eof
+168: real: +3.14
+173: space: \x0a
+176: real: +3.
+179: space: \x0a
+182: real: +.14
+186: space: \x0a
+189: real: -3.14
+194: space: \x0a
+197: real: -3.
+200: space: \x0a
+203: real: -.14
+207: space: \x0a
+210: integer: +16059
+216: space: \x0a
+219: integer: -16059
+225: space: \x0a
+228: word: +.
+230: space: \x0a
+233: bad: <fade\x0aET (invalid character (T) in hexstring)
+241: space: \x0a
+242: bad: ) (unexpected ))
+243: bad: > (unexpected >)
+244: word: quack
+249: space:
+250: bad: /name#oops (invalid name token)
+260: space:
+261: name: /name (raw: /n#61me)
+268: space:
+269: word: one
+272: space:
+273: bool: true
+277: space:
+278: word: two
+281: space:
+282: bool: false
+287: space:
+288: word: three
+293: space:
+294: null: null
+298: space:
+299: word: four
+303: space: \x0a
+304: word: !@#$^&
+310: brace_open: {
+311: brace_close: }
+312: word: *-_+=
+317: space: \x0a
+318: word: abc123def3.14true
+335: space: \x0a
+336: bad: <ff\x0a (EOF while reading token)
+340: eof
--- END PAGE 4 ---
--- BEGIN PAGE 5 ---
0: word: BT
diff --git a/qpdf/qtest/qpdf/tokens.pdf b/qpdf/qtest/qpdf/tokens.pdf
index a7157eef..e9278c4c 100644
--- a/qpdf/qtest/qpdf/tokens.pdf
+++ b/qpdf/qtest/qpdf/tokens.pdf
Binary files differ