1 //========================================================================
5 // Copyright 1996 Derek B. Noonburg
7 //========================================================================
10 #pragma implementation
20 Parser::Parser(Lexer *lexer1) {
33 Object *Parser::getObj(Object *obj) {
39 // refill buffer after inline image data
49 if (buf1.isCmd("[")) {
52 while (!buf1.isCmd("]") && !buf1.isEOF())
53 obj->arrayAdd(getObj(&obj2));
55 error(getPos(), "End of file inside array");
58 // dictionary or stream
59 } else if (buf1.isCmd("<<")) {
62 while (!buf1.isCmd(">>") && !buf1.isEOF()) {
64 error(getPos(), "Dictionary key must be a name object");
67 key = copyString(buf1.getName());
69 if (buf1.isEOF() || buf1.isError())
71 obj->dictAdd(key, getObj(&obj2));
75 error(getPos(), "End of file inside dictionary");
76 if (buf2.isCmd("stream")) {
77 if ((str = makeStream(obj))) {
87 // indirect reference or integer
88 } else if (buf1.isInt()) {
91 if (buf1.isInt() && buf2.isCmd("R")) {
92 obj->initRef(num, buf1.getInt());
108 Stream *Parser::makeStream(Object *dict) {
113 // get stream start position
114 lexer->skipToNextLine();
115 pos = lexer->getPos();
118 dict->dictLookup("Length", &obj);
120 length = obj.getInt();
123 error(getPos(), "Bad 'Length' attribute in stream");
129 str = lexer->getStream()->getBaseStream()->makeSubStream(pos, length, dict);
132 str = str->addFilters(dict);
134 // skip over stream data
135 lexer->setPos(pos + length);
137 // refill token buffers and check for 'endstream'
138 shift(); // kill '>>'
139 shift(); // kill 'stream'
140 if (buf1.isCmd("endstream"))
143 error(getPos(), "Missing 'endstream'");
148 void Parser::shift() {
151 } else if (buf2.isCmd("ID")) {
152 lexer->skipChar(); // skip char after 'ID' command
157 if (inlineImg > 0) // don't buffer inline image data
160 lexer->getObj(&buf2);