2 * CDE - Common Desktop Environment
4 * Copyright (c) 1993-2012, The Open Group. All rights reserved.
6 * These libraries and programs are free software; you can
7 * redistribute them and/or modify them under the terms of the GNU
8 * Lesser General Public License as published by the Free Software
9 * Foundation; either version 2 of the License, or (at your option)
12 * These libraries and programs are distributed in the hope that
13 * they will be useful, but WITHOUT ANY WARRANTY; without even the
14 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU Lesser General Public License for more
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with these librararies and programs; if not, write
20 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21 * Floor, Boston, MA 02110-1301 USA
23 /* $XConsortium: ParserState.h /main/1 1996/07/29 17:01:25 cde-hp $ */
24 // Copyright (c) 1994 James Clark
25 // See the file COPYING for copying permission.
27 #ifndef ParserState_INCLUDED
28 #define ParserState_INCLUDED 1
35 #include "Allocator.h"
36 #include "Attribute.h"
42 #include "EntityCatalog.h"
43 #include "EntityManager.h"
45 #include "EventQueue.h"
47 #include "InputSource.h"
53 #include "OpenElement.h"
54 #include "OutputState.h"
55 #include "ParserOptions.h"
57 #include "Recognizer.h"
63 #include "LpdEntityRef.h"
65 #include "ContentState.h"
68 namespace SP_NAMESPACE {
71 class ParserState : public ContentState, public AttributeContext {
81 ParserState(const Ptr<EntityManager> &,
82 const ParserOptions &,
85 void setHandler(EventHandler *, SP_CONST SP_VOLATILE sig_atomic_t *cancelPtr);
87 Boolean inInstance() const;
88 Boolean hadDtd() const;
90 void startDtd(const StringC &);
93 unsigned subdocLevel() const;
94 Boolean haveDefLpd() const;
96 const Ptr<Dtd> &defDtdPointer() const;
97 Boolean haveCurrentDtd() const;
98 const Dtd ¤tDtd() const;
99 const ConstPtr<Dtd> ¤tDtdPointer() const;
100 void startLpd(Ptr<Lpd> &lpd);
103 Ptr<Lpd> &defLpdPointer();
104 Ptr<ComplexLpd> defComplexLpdPointer();
105 size_t nActiveLink() const;
106 const Lpd &activeLpd(size_t i) const;
107 ComplexLpd &defComplexLpd();
108 Ptr<Dtd> lookupDtd(const StringC &name);
110 void activateLinkType(const StringC &);
111 void allLinkTypesActivated();
112 void setResultAttributeSpecMode();
113 void clearResultAttributeSpecMode();
114 Boolean haveApplicableDtd() const;
115 Boolean hadLpd() const;
116 Boolean pass2() const;
117 void setPass2Start();
118 Boolean maybeStartPass2();
119 void checkEntityStability();
120 void noteReferencedEntity(const ConstPtr<Entity> &entity,
122 ConstPtr<Lpd> lookupLpd(const StringC &name) const;
123 Boolean shouldActivateLink(const StringC &) const;
124 Char currentChar() const;
125 const Location ¤tLocation() const;
126 InputSource *currentInput() const;
127 EntityManager &entityManager() const;
128 Ptr<EntityManager> entityManagerPtr() const;
129 const EntityCatalog &entityCatalog() const;
130 ConstPtr<EntityCatalog> entityCatalogPtr() const;
131 void setEntityCatalog(const ConstPtr<EntityCatalog> &);
132 void setSyntax(ConstPtr<Syntax>);
133 void setSyntaxes(ConstPtr<Syntax>, ConstPtr<Syntax>);
134 void setSd(ConstPtr<Sd>);
135 const Syntax &syntax() const;
136 const Syntax &instanceSyntax() const;
137 const ConstPtr<Syntax> &syntaxPointer() const;
138 const ConstPtr<Syntax> &prologSyntaxPointer() const;
139 const ConstPtr<Syntax> &instanceSyntaxPointer() const;
140 const Sd &sd() const;
141 const ConstPtr<Sd> &sdPointer() const;
142 void setPhase(Phase phase);
144 Phase finalPhase() const;
145 Mode currentMode() const;
146 void setRecognizer(Mode, ConstPtr<Recognizer>);
147 void setNormalMap(const XcharMap<PackedBoolean> &);
148 const XcharMap<PackedBoolean> &normalMap() const;
151 Token getToken(Mode mode);
152 StringC currentToken() const;
153 void getCurrentToken(StringC &) const;
154 void getCurrentToken(const SubstTable<Char> *, StringC &) const;
155 unsigned inputLevel() const;
156 unsigned specialParseInputLevel() const;
157 unsigned markedSectionLevel() const;
158 unsigned markedSectionSpecialLevel() const;
159 const Location ¤tMarkedSectionStartLocation() const;
160 Boolean entityIsOpen(const Entity *) const;
161 void popInputStack();
162 void pushInput(InputSource *);
163 Boolean referenceDsEntity(const Location &);
164 void setDsEntity(const ConstPtr<Entity> &);
165 Boolean eventQueueEmpty() const;
166 Event *eventQueueGet();
167 EventHandler &eventHandler();
168 void pushElement(OpenElement *);
169 OpenElement *popSaveElement();
171 void pcdataRecover();
172 Boolean pcdataRecovering() const;
173 ConstPtr<Entity> lookupEntity(Boolean isParameter,
177 Boolean appendCurrentRank(StringC &, const RankStem *) const;
178 void setCurrentRank(const RankStem *, const StringC &);
179 void startMarkedSection(const Location &);
180 void startSpecialMarkedSection(Mode, const Location &);
181 void endMarkedSection();
182 void queueRe(const Location &);
186 void noteStartElement(Boolean included);
187 void noteEndElement(Boolean included);
188 // size of objects allocated with this must not exceed
189 // sizeof(StartElementEvent)
190 Allocator &eventAllocator();
191 // size of objects allocated with this must not exceed
192 // sizeof(OpenElement)
193 Allocator &internalAllocator();
194 AttributeList *allocAttributeList(const ConstPtr<AttributeDefinitionList> &,
197 static void freeEvent(void *);
198 Boolean wantMarkup() const;
199 const EventsWanted &eventsWanted() const;
200 StringC &nameBuffer();
201 typedef NamedTableIter<Id> IdTableIter;
202 IdTableIter idTableIter();
203 const ParserOptions &options() const;
205 void releaseKeptMessages();
206 void discardKeptMessages();
207 Messenger &messenger();
209 Markup *currentMarkup();
210 const Location &markupLocation() const;
211 Markup *startMarkup(Boolean, const Location &);
212 void inheritActiveLinkTypes(const ParserState &parent);
213 Boolean cancelled() const;
216 void setHadAfdrDecl();
217 Boolean hadAfdrDecl() const;
219 // Implementation of AttributeContext.
220 Boolean defineId(const StringC &, const Location &, Location &);
221 void noteIdref(const StringC &, const Location &);
222 void noteCurrentAttribute(size_t, AttributeValue *);
223 ConstPtr<AttributeValue> getCurrentAttribute(size_t) const;
224 ConstPtr<Entity> getAttributeEntity(const StringC &,
226 ConstPtr<Notation> getAttributeNotation(const StringC &,
228 const Syntax &attributeSyntax() const;
231 ParserState(const ParserState &); // undefined
232 void operator=(const ParserState &); // undefined
233 void dispatchMessage(Message &);
234 void dispatchMessage(const Message &);
235 void initMessage(Message &);
236 void queueMessage(MessageEvent *);
237 Id *lookupCreateId(const StringC &);
239 ParserOptions options_;
240 EventHandler *handler_;
241 Pass1EventHandler pass1Handler_;
243 Offset pass2StartOffset_;
244 Boolean hadPass2Start_;
245 EventQueue eventQueue_;
246 OutputState outputState_;
247 ConstPtr<Syntax> prologSyntax_;
248 ConstPtr<Syntax> instanceSyntax_;
250 unsigned subdocLevel_;
251 Ptr<EntityManager> entityManager_;
252 ConstPtr<EntityCatalog> entityCatalog_;
258 Vector<ConstPtr<Lpd> > allLpd_;
259 Vector<ConstPtr<Lpd> > lpd_; // active LPDs
260 Vector<StringC> activeLinkTypes_;
261 Boolean activeLinkTypesSubsted_;
263 Boolean resultAttributeSpecMode_;
265 typedef OwnerTable<LpdEntityRef, LpdEntityRef, LpdEntityRef, LpdEntityRef>
267 typedef OwnerTableIter<LpdEntityRef, LpdEntityRef, LpdEntityRef, LpdEntityRef>
269 LpdEntityRefSet lpdEntityRefs_;
270 // external entity to be referenced at the end of the declaration subset
271 ConstPtr<Entity> dsEntity_;
272 Allocator eventAllocator_;
273 Allocator internalAllocator_;
274 NCVector<Owner<AttributeList> > attributeLists_;
276 Boolean keepingMessages_;
277 IQueue<MessageEvent> keptMessages_;
279 Boolean pcdataRecovering_;
280 // if in a special parse (cdata, rcdata, ignore), the input level
281 // at which the special parse started.
282 unsigned specialParseInputLevel_;
283 Mode specialParseMode_;
284 unsigned markedSectionLevel_;
285 unsigned markedSectionSpecialLevel_;
286 Vector<Location> markedSectionStartLocation_;
287 ConstPtr<Recognizer> recognizers_[nModes];
288 XcharMap<PackedBoolean> normalMap_;
289 unsigned inputLevel_;
290 IList<InputSource> inputStack_;
291 ConstPtr<Dtd> currentDtd_;
292 Vector<Ptr<Dtd> > dtd_;
294 ConstPtr<Syntax> syntax_;
295 Vector<StringC> currentRank_;
296 NamedTable<Id> idTable_;
297 NamedResourceTable<Entity> instanceDefaultedEntityTable_;
298 Vector<ConstPtr<AttributeValue> > currentAttributes_;
299 Markup *currentMarkup_;
301 Location markupLocation_;
302 Boolean hadAfdrDecl_;
303 SP_CONST SP_VOLATILE sig_atomic_t *cancelPtr_;
304 static sig_atomic_t dummyCancel_;
305 static const Location nullLocation_;
309 Messenger &ParserState::messenger()
315 Boolean ParserState::wantMarkup() const
318 ? options_.eventsWanted.wantInstanceMarkup()
319 : options_.eventsWanted.wantPrologMarkup());
323 const EventsWanted &ParserState::eventsWanted() const
325 return options_.eventsWanted;
329 InputSource *ParserState::currentInput() const
331 return inputStack_.head();
335 const Location &ParserState::currentLocation() const
337 InputSource *in = currentInput();
338 return in ? in->currentLocation() : nullLocation_;
342 Boolean ParserState::pcdataRecovering() const
344 return pcdataRecovering_;
348 unsigned ParserState::inputLevel() const
354 unsigned ParserState::specialParseInputLevel() const
356 return specialParseInputLevel_;
360 unsigned ParserState::markedSectionLevel() const
362 return markedSectionLevel_;
366 unsigned ParserState::markedSectionSpecialLevel() const
368 return markedSectionSpecialLevel_;
372 const Location &ParserState::currentMarkedSectionStartLocation() const
374 return markedSectionStartLocation_.back();
378 Char ParserState::currentChar() const
380 return currentInput()->currentTokenStart()[0];
384 StringC ParserState::currentToken() const
386 return StringC(currentInput()->currentTokenStart(),
387 currentInput()->currentTokenLength());
391 void ParserState::getCurrentToken(StringC &str) const
393 InputSource *in = currentInput();
394 str.assign(in->currentTokenStart(), in->currentTokenLength());
398 void ParserState::setRecognizer(Mode mode, ConstPtr<Recognizer> p)
400 recognizers_[mode] = p;
404 void ParserState::setNormalMap(const XcharMap<PackedBoolean> &map)
410 const XcharMap<PackedBoolean> &ParserState::normalMap() const
416 Boolean ParserState::haveDefLpd() const
418 return !defLpd_.isNull();
422 Boolean ParserState::haveCurrentDtd() const
424 return !currentDtd_.isNull();
428 Dtd &ParserState::defDtd()
434 const Dtd &ParserState::currentDtd() const
440 const Ptr<Dtd> &ParserState::defDtdPointer() const
446 const ConstPtr<Dtd> &ParserState::currentDtdPointer() const
452 Boolean ParserState::inInstance() const
458 const Syntax &ParserState::syntax() const
464 const Syntax &ParserState::instanceSyntax() const
466 return *instanceSyntax_;
470 const ConstPtr<Syntax> &ParserState::syntaxPointer() const
476 const ConstPtr<Syntax> &ParserState::instanceSyntaxPointer() const
478 return instanceSyntax_;
482 const ConstPtr<Syntax> &ParserState::prologSyntaxPointer() const
484 return prologSyntax_;
488 const Sd &ParserState::sd() const
494 const ConstPtr<Sd> &ParserState::sdPointer() const
500 void ParserState::setPhase(Phase phase)
506 Mode ParserState::currentMode() const
512 Xchar ParserState::getChar()
514 return inputStack_.head()->get(messenger());
518 void ParserState::skipChar()
524 Token ParserState::getToken(Mode mode)
526 return recognizers_[mode]->recognize(inputStack_.head(), messenger());
530 Boolean ParserState::hadDtd() const
532 return dtd_.size() > 0;
536 Boolean ParserState::eventQueueEmpty() const
538 return eventQueue_.empty();
542 Event *ParserState::eventQueueGet()
544 return eventQueue_.get();
548 ParserState::Phase ParserState::phase() const
554 ParserState::Phase ParserState::finalPhase() const
560 EntityManager &ParserState::entityManager() const
562 return *entityManager_;
566 Ptr<EntityManager> ParserState::entityManagerPtr() const
568 return entityManager_;
572 const EntityCatalog &ParserState::entityCatalog() const
574 return *entityCatalog_;
578 ConstPtr<EntityCatalog> ParserState::entityCatalogPtr() const
580 return entityCatalog_;
584 void ParserState::setEntityCatalog(const ConstPtr<EntityCatalog> &catalog)
586 entityCatalog_ = catalog;
590 void ParserState::setDsEntity(const ConstPtr<Entity> &entity)
596 Allocator &ParserState::eventAllocator()
598 return eventAllocator_;
602 Allocator &ParserState::internalAllocator()
604 return internalAllocator_;
608 StringC &ParserState::nameBuffer()
614 void ParserState::setHandler(EventHandler *handler,
615 SP_CONST SP_VOLATILE sig_atomic_t *cancelPtr)
618 cancelPtr_ = cancelPtr ? cancelPtr : &dummyCancel_;
622 void ParserState::unsetHandler()
624 handler_ = &eventQueue_;
625 cancelPtr_ = &dummyCancel_;
629 void ParserState::queueRe(const Location &location)
631 outputState_.handleRe(*handler_, eventAllocator_, options_.eventsWanted,
632 syntax().standardFunction(Syntax::fRE),
637 void ParserState::noteMarkup()
640 outputState_.noteMarkup(*handler_, eventAllocator_, options_.eventsWanted);
644 void ParserState::noteRs()
646 outputState_.noteRs(*handler_, eventAllocator_, options_.eventsWanted);
650 void ParserState::noteStartElement(Boolean included)
652 outputState_.noteStartElement(included, *handler_, eventAllocator_,
653 options_.eventsWanted);
657 void ParserState::noteEndElement(Boolean included)
659 outputState_.noteEndElement(included, *handler_, eventAllocator_,
660 options_.eventsWanted);
664 void ParserState::noteData()
666 outputState_.noteData(*handler_, eventAllocator_, options_.eventsWanted);
670 unsigned ParserState::subdocLevel() const
676 EventHandler &ParserState::eventHandler()
682 ParserState::IdTableIter ParserState::idTableIter()
684 // Avoid use of typedef to work around MSVC 2.0 bug.
685 return NamedTableIter<Id>(idTable_);
689 const ParserOptions &ParserState::options() const
695 void ParserState::keepMessages()
697 keepingMessages_ = 1;
701 Boolean ParserState::haveApplicableDtd() const
703 return !currentDtd_.isNull();
707 Boolean ParserState::hadLpd() const
713 Boolean ParserState::pass2() const
719 size_t ParserState::nActiveLink() const
725 const Lpd &ParserState::activeLpd(size_t i) const
731 Lpd &ParserState::defLpd()
737 Ptr<Lpd> &ParserState::defLpdPointer()
743 Ptr<ComplexLpd> ParserState::defComplexLpdPointer()
745 return (ComplexLpd *)defLpd_.pointer();
749 ComplexLpd &ParserState::defComplexLpd()
751 return (ComplexLpd &)defLpd();
755 Ptr<Dtd> ParserState::baseDtd()
764 void ParserState::setResultAttributeSpecMode()
766 resultAttributeSpecMode_ = 1;
770 void ParserState::clearResultAttributeSpecMode()
772 resultAttributeSpecMode_ = 0;
776 Markup *ParserState::currentMarkup()
778 return currentMarkup_;
782 const Location &ParserState::markupLocation() const
784 return markupLocation_;
788 Markup *ParserState::startMarkup(Boolean storing, const Location &loc)
790 markupLocation_ = loc;
793 return currentMarkup_ = &markup_;
796 return currentMarkup_ = 0;
800 Boolean ParserState::cancelled() const
802 return *cancelPtr_ != 0;
806 void ParserState::setHadAfdrDecl()
812 Boolean ParserState::hadAfdrDecl() const
821 #endif /* not ParserState_INCLUDED */