1 /* $XConsortium: Event.C /main/1 1996/07/29 16:51:15 cde-hp $ */
2 // Copyright (c) 1994 James Clark
3 // See the file COPYING for copying permission.
11 #include "Attribute.h"
12 #include "EventQueue.h"
15 namespace SP_NAMESPACE {
18 void Event::copyData()
22 LocatedEvent::LocatedEvent(Type type, const Location &location)
23 : location_(location), Event(type)
27 MarkupEvent::MarkupEvent(Type type)
28 : LocatedEvent(type, Location())
32 MarkupEvent::MarkupEvent(Type type, const Location &loc, Markup *markup)
33 : LocatedEvent(type, loc)
36 markup->swap(markup_);
39 StartElementEvent::StartElementEvent(const ElementType *elementType,
40 const ConstPtr<Dtd> &dtd,
41 AttributeList *attributes,
42 const Location &startLocation,
44 : LocatedEvent(startElement, startLocation),
45 elementType_(elementType),
50 attributes_(attributes)
54 StartElementEvent::~StartElementEvent()
62 void StartElementEvent::copyData()
66 AttributeList *p = new AttributeList;
67 attributes_->swap(*p);
71 Markup *p = new Markup;
79 EndElementEvent::EndElementEvent(const ElementType *elementType,
80 const ConstPtr<Dtd> &dtd,
81 const Location &startLocation,
83 : LocatedEvent(endElement, startLocation),
84 elementType_(elementType),
92 EndElementEvent::~EndElementEvent()
98 void EndElementEvent::copyData()
102 Markup *p = new Markup;
110 DataEvent::DataEvent(Type type, const Char *p, size_t length,
111 const Location &location)
112 : p_(p),length_(length), LocatedEvent(type, location)
116 const Entity *DataEvent::entity() const
121 Boolean DataEvent::isRe(unsigned long &) const
126 ImmediateDataEvent::ImmediateDataEvent(Type type, const Char *p, size_t length,
127 const Location &location,
129 : DataEvent(type, p, length, location), alloc_(0)
132 ImmediateDataEvent::copyData();
135 ImmediateDataEvent::~ImmediateDataEvent()
141 void ImmediateDataEvent::copyData()
144 alloc_ = new Char[length_];
145 memcpy(alloc_, p_, length_*sizeof(Char));
150 ReEvent::ReEvent(const Char *p, const Location &location, unsigned long serial)
151 : ImmediateDataEvent(characterData, p, 1, location, 0),
156 Boolean ReEvent::isRe(unsigned long &serial) const
162 DataEntityEvent::DataEntityEvent(Type type, const InternalEntity *entity,
163 const ConstPtr<Origin> &origin)
165 entity->string().data(),
166 entity->string().size(),
171 const Entity *DataEntityEvent::entity() const
173 return location().origin()->asEntityOrigin()->entity().pointer();
176 CdataEntityEvent::CdataEntityEvent(const InternalEntity *entity,
177 const ConstPtr<Origin> &origin)
178 : DataEntityEvent(characterData, entity, origin)
182 SdataEntityEvent::SdataEntityEvent(const InternalEntity *entity,
183 const ConstPtr<Origin> &origin)
184 : DataEntityEvent(sdataEntity, entity, origin)
188 MessageEvent::MessageEvent(const Message &m)
189 : Event(Event::message), message_(m)
193 MessageEvent::MessageEvent(Message &m)
194 : Event(Event::message)
199 PiEvent::PiEvent(const Char *data, size_t dataLength, const Location &location)
200 : data_(data), dataLength_(dataLength), LocatedEvent(pi, location)
204 const Entity *PiEvent::entity() const
209 PiEntityEvent::PiEntityEvent(const PiEntity *entity,
210 const ConstPtr<Origin> &origin)
211 : PiEvent(entity->string().data(), entity->string().size(),
216 const Entity *PiEntityEvent::entity() const
218 return location().origin()->asEntityOrigin()->entity().pointer();
221 ImmediatePiEvent::ImmediatePiEvent(StringC &str, const Location &loc)
222 : PiEvent(str.data(), str.size(), loc)
227 ExternalEntityEvent::ExternalEntityEvent(Type type,
228 const ConstPtr<EntityOrigin> &origin)
229 : origin_(origin), Event(type)
233 ExternalDataEntityEvent::ExternalDataEntityEvent(const ExternalDataEntity *entity,
234 const ConstPtr<EntityOrigin> &origin)
235 : dataEntity_(entity), ExternalEntityEvent(externalDataEntity, origin)
239 SubdocEntityEvent::SubdocEntityEvent(const SubdocEntity *entity,
240 const ConstPtr<EntityOrigin> &origin)
241 : subdocEntity_(entity), ExternalEntityEvent(subdocEntity, origin)
245 AppinfoEvent::AppinfoEvent(const Location &location)
246 : LocatedEvent(appinfo, location), appinfoNone_(1)
250 AppinfoEvent::AppinfoEvent(const Text &text, const Location &location)
251 : LocatedEvent(appinfo, location), appinfoNone_(0), appinfo_(text)
255 UselinkEvent::UselinkEvent(const ConstPtr<Lpd> &lpd,
256 const LinkSet *linkSet,
260 : MarkupEvent(uselink, loc, markup),
267 UsemapEvent::UsemapEvent(const ShortReferenceMap *map,
268 Vector<const ElementType *> &elements,
269 const ConstPtr<Dtd> &dtd,
272 : MarkupEvent(usemap, loc, markup),
276 elements.swap(elements_);
279 StartSubsetEvent::StartSubsetEvent(Type type,
281 const ConstPtr<Entity> &entity,
282 Boolean hasInternalSubset,
285 : name_(name), entity_(entity), hasInternalSubset_(hasInternalSubset),
286 MarkupEvent(type, loc, markup)
290 StartDtdEvent::StartDtdEvent(const StringC &name,
291 const ConstPtr<Entity> &entity,
292 Boolean hasInternalSubset,
295 : StartSubsetEvent(startDtd, name, entity, hasInternalSubset, loc, markup)
299 StartLpdEvent::StartLpdEvent(Boolean active,
301 const ConstPtr<Entity> &entity,
302 Boolean hasInternalSubset,
305 : StartSubsetEvent(startLpd, name, entity, hasInternalSubset, loc, markup),
310 EndDtdEvent::EndDtdEvent(const ConstPtr<Dtd> &dtd,
313 : MarkupEvent(endDtd, loc, markup), dtd_(dtd)
317 EndLpdEvent::EndLpdEvent(const ConstPtr<Lpd> &lpd,
320 : MarkupEvent(endLpd, loc, markup), lpd_(lpd)
324 EndPrologEvent::EndPrologEvent(const ConstPtr<Dtd> &dtd,
325 const ConstPtr<ComplexLpd> &lpd,
326 Vector<StringC> &simpleLinkNames,
327 Vector<AttributeList> &simpleLinkAttributes,
328 const Location &location)
329 : LocatedEvent(endProlog, location), dtd_(dtd), lpd_(lpd)
331 simpleLinkAttributes.swap(simpleLinkAttributes_);
332 simpleLinkNames.swap(simpleLinkNames_);
335 EndPrologEvent::EndPrologEvent(const ConstPtr<Dtd> &dtd,
336 const Location &location)
337 : LocatedEvent(endProlog, location), dtd_(dtd)
341 SgmlDeclEvent::SgmlDeclEvent(const ConstPtr<Sd> &sd,
342 const ConstPtr<Syntax> &syntax)
344 : sd_(sd), prologSyntax_(syntax), instanceSyntax_(syntax),
345 nextIndex_(0), MarkupEvent(sgmlDecl)
349 SgmlDeclEvent::SgmlDeclEvent(const ConstPtr<Sd> &sd,
350 const ConstPtr<Syntax> &prologSyntax,
351 const ConstPtr<Syntax> &instanceSyntax,
352 const ConstPtr<Sd> &refSd,
353 const ConstPtr<Syntax> &refSyntax,
355 const StringC &implySystemId,
358 : sd_(sd), prologSyntax_(prologSyntax), instanceSyntax_(instanceSyntax),
359 refSd_(refSd), refSyntax_(refSyntax),
360 nextIndex_(nextIndex), implySystemId_(implySystemId),
361 MarkupEvent(sgmlDecl, loc, markup)
365 CommentDeclEvent::CommentDeclEvent(const Location &loc,
367 : MarkupEvent(commentDecl, loc, markup)
371 SSepEvent::SSepEvent(const Char *p, size_t length,
372 const Location &location, Boolean copy)
373 : ImmediateDataEvent(sSep, p, length, location, copy)
377 IgnoredRsEvent::IgnoredRsEvent(Char c, const Location &location)
378 : LocatedEvent(ignoredRs, location), c_(c)
382 IgnoredReEvent::IgnoredReEvent(Char c, const Location &location,
383 unsigned long serial)
384 : LocatedEvent(ignoredRe, location),
390 ReOriginEvent::ReOriginEvent(Char c, const Location &location,
391 unsigned long serial)
392 : LocatedEvent(reOrigin, location), c_(c), serial_(serial)
397 IgnoredCharsEvent::IgnoredCharsEvent(const Char *p, size_t length,
398 const Location &location, Boolean copy)
399 : ImmediateDataEvent(ignoredChars, p, length, location, copy)
403 MarkedSectionEvent::MarkedSectionEvent(Type type, Status status,
406 : MarkupEvent(type, loc, markup),
411 MarkedSectionStartEvent::MarkedSectionStartEvent(Status status,
414 : MarkedSectionEvent(markedSectionStart, status, loc, markup)
418 MarkedSectionEndEvent::MarkedSectionEndEvent(Status status,
421 : MarkedSectionEvent(markedSectionEnd, status, loc, markup)
425 EntityStartEvent::EntityStartEvent(const ConstPtr<EntityOrigin> &origin)
426 : Event(entityStart), origin_(origin)
430 EntityEndEvent::EntityEndEvent(const Location &location)
431 : LocatedEvent(entityEnd, location)
435 EntityDeclEvent:: EntityDeclEvent(const ConstPtr<Entity> &entity,
436 Boolean ignored, const Location &loc,
438 : MarkupEvent(entityDecl, loc, markup),
444 NotationDeclEvent:: NotationDeclEvent(const ConstPtr<Notation> ¬ation,
447 : MarkupEvent(notationDecl, loc, markup), notation_(notation)
451 ElementDeclEvent::ElementDeclEvent(Vector<const ElementType *> &elements,
452 const ConstPtr<Dtd> &dtd,
455 : MarkupEvent(elementDecl, loc, markup), dtd_(dtd)
457 elements.swap(elements_);
460 AttlistDeclEvent::AttlistDeclEvent(Vector<const ElementType *> &elements,
461 const ConstPtr<Dtd> &dtd,
464 : MarkupEvent(attlistDecl, loc, markup), dtd_(dtd)
466 elements.swap(elements_);
469 AttlistNotationDeclEvent::AttlistNotationDeclEvent(
470 Vector<ConstPtr<Notation> > ¬ations, const Location &loc,
472 : MarkupEvent(attlistNotationDecl, loc, markup)
474 notations.swap(notations_);
478 ::LinkAttlistDeclEvent(Vector<const ElementType *> &elements,
479 const ConstPtr<Lpd> &lpd,
482 : MarkupEvent(linkAttlistDecl, loc, markup), lpd_(lpd)
484 elements.swap(elements_);
487 LinkDeclEvent::LinkDeclEvent(const LinkSet *linkSet,
488 const ConstPtr<ComplexLpd> &lpd,
491 : MarkupEvent(linkDecl, loc, markup), lpd_(lpd), linkSet_(linkSet)
495 IdLinkDeclEvent::IdLinkDeclEvent(const ConstPtr<ComplexLpd> &lpd,
498 : MarkupEvent(linkDecl, loc, markup), lpd_(lpd)
502 ShortrefDeclEvent::ShortrefDeclEvent(const ShortReferenceMap *map,
503 const ConstPtr<Dtd> &dtd,
506 : MarkupEvent(shortrefDecl, loc, markup), map_(map), dtd_(dtd)
510 IgnoredMarkupEvent::IgnoredMarkupEvent(const Location &loc,
512 : MarkupEvent(ignoredMarkup, loc, markup)
516 EntityDefaultedEvent::EntityDefaultedEvent(const ConstPtr<Entity> &entity,
518 : LocatedEvent(entityDefaulted, loc), entity_(entity)
522 SgmlDeclEntityEvent:: SgmlDeclEntityEvent(const PublicId &publicId,
523 PublicId::TextClass entityType,
524 const StringC &effectiveSystemId,
526 : LocatedEvent(sgmlDeclEntity, loc), publicId_(publicId),
527 entityType_(entityType), effectiveSystemId_(effectiveSystemId)
531 EventHandler::~EventHandler()
535 EventQueue::EventQueue()
539 #define EVENT(c, f) \
540 void EventHandler::f(c *event) { delete event; } \
541 void EventQueue::f(c *event) { append(event); } \
542 void c::handle(EventHandler &handler) { handler.f(this); }
546 Pass1EventHandler::Pass1EventHandler()
547 : hadError_(0), origHandler_(0)
551 void Pass1EventHandler::init(EventHandler *origHandler)
554 origHandler_ = origHandler;
557 void Pass1EventHandler::message(MessageEvent *event)
559 if (event->message().isError()) {
561 origHandler_->message(event);
564 IQueue<Event>::append(event);