]>
git.ipfire.org Git - thirdparty/cups.git/blob - pdftops/Parser.cxx
1 //========================================================================
5 // Copyright 1996 Derek B. Noonburg
7 //========================================================================
10 #pragma implementation
24 Parser::Parser(XRef
*xrefA
, Lexer
*lexerA
) {
39 Object
*Parser::getObj(Object
*obj
,
40 Guchar
*fileKey
, int keyLength
,
41 int objNum
, int objGen
) {
43 Object
*Parser::getObj(Object
*obj
) {
56 // refill buffer after inline image data
66 if (buf1
.isCmd("[")) {
69 while (!buf1
.isCmd("]") && !buf1
.isEOF())
71 obj
->arrayAdd(getObj(&obj2
, fileKey
, keyLength
, objNum
, objGen
));
73 obj
->arrayAdd(getObj(&obj2
));
76 error(getPos(), "End of file inside array");
79 // dictionary or stream
80 } else if (buf1
.isCmd("<<")) {
83 while (!buf1
.isCmd(">>") && !buf1
.isEOF()) {
85 error(getPos(), "Dictionary key must be a name object");
88 key
= copyString(buf1
.getName());
90 if (buf1
.isEOF() || buf1
.isError())
93 obj
->dictAdd(key
, getObj(&obj2
, fileKey
, keyLength
, objNum
, objGen
));
95 obj
->dictAdd(key
, getObj(&obj2
));
100 error(getPos(), "End of file inside dictionary");
101 if (buf2
.isCmd("stream")) {
102 if ((str
= makeStream(obj
))) {
103 obj
->initStream(str
);
104 #ifndef NO_DECRYPTION
106 str
->getBaseStream()->doDecryption(fileKey
, keyLength
,
118 // indirect reference or integer
119 } else if (buf1
.isInt()) {
122 if (buf1
.isInt() && buf2
.isCmd("R")) {
123 obj
->initRef(num
, buf1
.getInt());
130 #ifndef NO_DECRYPTION
132 } else if (buf1
.isString() && fileKey
) {
134 s
= obj
->getString();
135 decrypt
= new Decrypt(fileKey
, keyLength
, objNum
, objGen
);
136 for (i
= 0, p
= obj
->getString()->getCString();
139 *p
= decrypt
->decryptByte(*p
);
154 Stream
*Parser::makeStream(Object
*dict
) {
157 int pos
, endPos
, length
;
159 // get stream start position
160 lexer
->skipToNextLine();
161 pos
= lexer
->getPos();
164 dict
->dictLookup("Length", &obj
);
166 length
= obj
.getInt();
169 error(getPos(), "Bad 'Length' attribute in stream");
174 // check for length in damaged file
175 if ((endPos
= xref
->getStreamEnd(pos
)) >= 0) {
176 length
= endPos
- pos
;
180 str
= lexer
->getStream()->getBaseStream()->makeSubStream(pos
, length
, dict
);
183 str
= str
->addFilters(dict
);
185 // skip over stream data
186 lexer
->setPos(pos
+ length
);
188 // refill token buffers and check for 'endstream'
189 shift(); // kill '>>'
190 shift(); // kill 'stream'
191 if (buf1
.isCmd("endstream"))
194 error(getPos(), "Missing 'endstream'");
199 void Parser::shift() {
202 } else if (buf2
.isCmd("ID")) {
203 lexer
->skipChar(); // skip char after 'ID' command
208 if (inlineImg
> 0) // don't buffer inline image data
211 lexer
->getObj(&buf2
);