1 // Copyright (c) 1994 James Clark
2 // See the file COPYING for copying permission.
3 
4 #ifdef __GNUG__
5 #pragma implementation
6 #endif
7 #include "splib.h"
8 #include "Event.h"
9 #include "Entity.h"
10 #include "Attribute.h"
11 #include "EventQueue.h"
12 
13 #ifdef SP_NAMESPACE
14 namespace SP_NAMESPACE {
15 #endif
16 
copyData()17 void Event::copyData()
18 {
19 }
20 
LocatedEvent(Type type,const Location & location)21 LocatedEvent::LocatedEvent(Type type, const Location &location)
22 : location_(location), Event(type)
23 {
24 }
25 
MarkupEvent(Type type)26 MarkupEvent::MarkupEvent(Type type)
27 : LocatedEvent(type, Location())
28 {
29 }
30 
MarkupEvent(Type type,const Location & loc,Markup * markup)31 MarkupEvent::MarkupEvent(Type type, const Location &loc, Markup *markup)
32 : LocatedEvent(type, loc)
33 {
34   if (markup)
35     markup->swap(markup_);
36 }
37 
StartElementEvent(const ElementType * elementType,const ConstPtr<Dtd> & dtd,AttributeList * attributes,const Location & startLocation,Markup * markup)38 StartElementEvent::StartElementEvent(const ElementType *elementType,
39 				     const ConstPtr<Dtd> &dtd,
40 				     AttributeList *attributes,
41 				     const Location &startLocation,
42 				     Markup *markup)
43 : LocatedEvent(startElement, startLocation),
44   elementType_(elementType),
45   dtd_(dtd),
46   included_(0),
47   copied_(0),
48   markup_(markup),
49   attributes_(attributes)
50 {
51 }
52 
~StartElementEvent()53 StartElementEvent::~StartElementEvent()
54 {
55   if (copied_) {
56     delete attributes_;
57     delete markup_;
58   }
59 }
60 
copyData()61 void StartElementEvent::copyData()
62 {
63   if (!copied_) {
64     {
65       AttributeList *p = new AttributeList;
66       attributes_->swap(*p);
67       attributes_ = p;
68     }
69     if (markup_) {
70       Markup *p = new Markup;
71       markup_->swap(*p);
72       markup_ = p;
73     }
74     copied_ = 1;
75   }
76 }
77 
EndElementEvent(const ElementType * elementType,const ConstPtr<Dtd> & dtd,const Location & startLocation,Markup * markup)78 EndElementEvent::EndElementEvent(const ElementType *elementType,
79 				 const ConstPtr<Dtd> &dtd,
80 				 const Location &startLocation,
81 				 Markup *markup)
82 : LocatedEvent(endElement, startLocation),
83   elementType_(elementType),
84   dtd_(dtd),
85   included_(0),
86   copied_(0),
87   markup_(markup)
88 {
89 }
90 
~EndElementEvent()91 EndElementEvent::~EndElementEvent()
92 {
93   if (copied_)
94     delete markup_;
95 }
96 
copyData()97 void EndElementEvent::copyData()
98 {
99   if (!copied_) {
100     if (markup_) {
101       Markup *p = new Markup;
102       markup_->swap(*p);
103       markup_ = p;
104     }
105     copied_ = 1;
106   }
107 }
108 
DataEvent(Type type,const Char * p,size_t length,const Location & location)109 DataEvent::DataEvent(Type type, const Char *p, size_t length,
110 		     const Location &location)
111 : p_(p),length_(length), LocatedEvent(type, location)
112 {
113 }
114 
entity() const115 const Entity *DataEvent::entity() const
116 {
117   return 0;
118 }
119 
isRe(unsigned long &) const120 Boolean DataEvent::isRe(unsigned long &) const
121 {
122   return 0;
123 }
124 
ImmediateDataEvent(Type type,const Char * p,size_t length,const Location & location,Boolean copy)125 ImmediateDataEvent::ImmediateDataEvent(Type type, const Char *p, size_t length,
126 				       const Location &location,
127 				       Boolean copy)
128 : DataEvent(type, p, length, location), alloc_(0)
129 {
130   if (copy)
131     ImmediateDataEvent::copyData();
132 }
133 
~ImmediateDataEvent()134 ImmediateDataEvent::~ImmediateDataEvent()
135 {
136   if (alloc_)
137     delete [] alloc_;
138 }
139 
copyData()140 void ImmediateDataEvent::copyData()
141 {
142   if (!alloc_) {
143     alloc_ = new Char[length_];
144     memcpy(alloc_, p_, length_*sizeof(Char));
145     p_ = alloc_;
146   }
147 }
148 
ReEvent(const Char * p,const Location & location,unsigned long serial)149 ReEvent::ReEvent(const Char *p, const Location &location, unsigned long serial)
150 : ImmediateDataEvent(characterData, p, 1, location, 0),
151   serial_(serial)
152 {
153 }
154 
isRe(unsigned long & serial) const155 Boolean ReEvent::isRe(unsigned long &serial) const
156 {
157   serial = serial_;
158   return 1;
159 }
160 
DataEntityEvent(Type type,const InternalEntity * entity,const ConstPtr<Origin> & origin)161 DataEntityEvent::DataEntityEvent(Type type, const InternalEntity *entity,
162 				 const ConstPtr<Origin> &origin)
163 : DataEvent(type,
164 	    entity->string().data(),
165 	    entity->string().size(),
166 	    Location(origin, 0))
167 {
168 }
169 
entity() const170 const Entity *DataEntityEvent::entity() const
171 {
172   return location().origin()->asEntityOrigin()->entity();
173 }
174 
CdataEntityEvent(const InternalEntity * entity,const ConstPtr<Origin> & origin)175 CdataEntityEvent::CdataEntityEvent(const InternalEntity *entity,
176 				   const ConstPtr<Origin> &origin)
177 : DataEntityEvent(characterData, entity, origin)
178 {
179 }
180 
SdataEntityEvent(const InternalEntity * entity,const ConstPtr<Origin> & origin)181 SdataEntityEvent::SdataEntityEvent(const InternalEntity *entity,
182 				   const ConstPtr<Origin> &origin)
183 : DataEntityEvent(sdataEntity, entity, origin)
184 {
185 }
186 
MessageEvent(const Message & m)187 MessageEvent::MessageEvent(const Message &m)
188 : Event(Event::message), message_(m)
189 {
190 }
191 
MessageEvent(Message & m)192 MessageEvent::MessageEvent(Message &m)
193 : Event(Event::message)
194 {
195   m.swap(message_);
196 }
197 
~MessageEvent()198 MessageEvent::~MessageEvent()
199 {
200 }
201 
PiEvent(const Char * data,size_t dataLength,const Location & location)202 PiEvent::PiEvent(const Char *data, size_t dataLength, const Location &location)
203 : data_(data), dataLength_(dataLength), LocatedEvent(pi, location)
204 {
205 }
206 
entity() const207 const Entity *PiEvent::entity() const
208 {
209   return 0;
210 }
211 
PiEntityEvent(const PiEntity * entity,const ConstPtr<Origin> & origin)212 PiEntityEvent::PiEntityEvent(const PiEntity *entity,
213 			     const ConstPtr<Origin> &origin)
214 : PiEvent(entity->string().data(), entity->string().size(),
215 	  Location(origin, 0))
216 {
217 }
218 
entity() const219 const Entity *PiEntityEvent::entity() const
220 {
221   return location().origin()->asEntityOrigin()->entity();
222 }
223 
ImmediatePiEvent(StringC & str,const Location & loc)224 ImmediatePiEvent::ImmediatePiEvent(StringC &str, const Location &loc)
225 : PiEvent(str.data(), str.size(), loc)
226 {
227   str.swap(string_);
228 }
229 
ExternalEntityEvent(Type type,const ConstPtr<EntityOrigin> & origin)230 ExternalEntityEvent::ExternalEntityEvent(Type type,
231 					 const ConstPtr<EntityOrigin> &origin)
232 : origin_(origin), Event(type)
233 {
234 }
235 
ExternalDataEntityEvent(const ExternalDataEntity * entity,const ConstPtr<EntityOrigin> & origin)236 ExternalDataEntityEvent::ExternalDataEntityEvent(const ExternalDataEntity *entity,
237 						 const ConstPtr<EntityOrigin> &origin)
238 : dataEntity_(entity), ExternalEntityEvent(externalDataEntity, origin)
239 {
240 }
241 
SubdocEntityEvent(const SubdocEntity * entity,const ConstPtr<EntityOrigin> & origin)242 SubdocEntityEvent::SubdocEntityEvent(const SubdocEntity *entity,
243 				     const ConstPtr<EntityOrigin> &origin)
244 : subdocEntity_(entity), ExternalEntityEvent(subdocEntity, origin)
245 {
246 }
247 
NonSgmlCharEvent(Char c,const Location & location)248 NonSgmlCharEvent::NonSgmlCharEvent(Char c, const Location &location)
249 : LocatedEvent(nonSgmlChar, location), c_(c)
250 {
251 }
252 
AppinfoEvent(const Location & location)253 AppinfoEvent::AppinfoEvent(const Location &location)
254 : LocatedEvent(appinfo, location), appinfoNone_(1)
255 {
256 }
257 
AppinfoEvent(const Text & text,const Location & location)258 AppinfoEvent::AppinfoEvent(const Text &text, const Location &location)
259 : LocatedEvent(appinfo, location), appinfoNone_(0), appinfo_(text)
260 {
261 }
262 
UselinkEvent(const ConstPtr<Lpd> & lpd,const LinkSet * linkSet,Boolean restore,const Location & loc,Markup * markup)263 UselinkEvent::UselinkEvent(const ConstPtr<Lpd> &lpd,
264 			   const LinkSet *linkSet,
265 			   Boolean restore,
266 			   const Location &loc,
267 			   Markup *markup)
268 : MarkupEvent(uselink, loc, markup),
269   lpd_(lpd),
270   linkSet_(linkSet),
271   restore_(restore)
272 {
273 }
274 
UsemapEvent(const ShortReferenceMap * map,Vector<const ElementType * > & elements,const ConstPtr<Dtd> & dtd,const Location & loc,Markup * markup)275 UsemapEvent::UsemapEvent(const ShortReferenceMap *map,
276 			 Vector<const ElementType *> &elements,
277 			 const ConstPtr<Dtd> &dtd,
278 			 const Location &loc,
279 			 Markup *markup)
280 : MarkupEvent(usemap, loc, markup),
281   map_(map),
282   dtd_(dtd)
283 {
284   elements.swap(elements_);
285 }
286 
StartSubsetEvent(Type type,const StringC & name,const ConstPtr<Entity> & entity,Boolean hasInternalSubset,const Location & loc,Markup * markup)287 StartSubsetEvent::StartSubsetEvent(Type type,
288 				   const StringC &name,
289 				   const ConstPtr<Entity> &entity,
290 				   Boolean hasInternalSubset,
291 				   const Location &loc,
292 				   Markup *markup)
293 : name_(name), entity_(entity), hasInternalSubset_(hasInternalSubset),
294   MarkupEvent(type, loc, markup)
295 {
296 }
297 
StartDtdEvent(const StringC & name,const ConstPtr<Entity> & entity,Boolean hasInternalSubset,const Location & loc,Markup * markup)298 StartDtdEvent::StartDtdEvent(const StringC &name,
299 			     const ConstPtr<Entity> &entity,
300 			     Boolean hasInternalSubset,
301 			     const Location &loc,
302 			     Markup *markup)
303 : StartSubsetEvent(startDtd, name, entity, hasInternalSubset, loc, markup)
304 {
305 }
306 
StartLpdEvent(Boolean active,const StringC & name,const ConstPtr<Entity> & entity,Boolean hasInternalSubset,const Location & loc,Markup * markup)307 StartLpdEvent::StartLpdEvent(Boolean active,
308 			     const StringC &name,
309 			     const ConstPtr<Entity> &entity,
310 			     Boolean hasInternalSubset,
311 			     const Location &loc,
312 			     Markup *markup)
313 : StartSubsetEvent(startLpd, name, entity, hasInternalSubset, loc, markup),
314   active_(active)
315 {
316 }
317 
EndDtdEvent(const ConstPtr<Dtd> & dtd,const Location & loc,Markup * markup)318 EndDtdEvent::EndDtdEvent(const ConstPtr<Dtd> &dtd,
319 			 const Location &loc,
320 			 Markup *markup)
321 :  MarkupEvent(endDtd, loc, markup), dtd_(dtd)
322 {
323 }
324 
EndLpdEvent(const ConstPtr<Lpd> & lpd,const Location & loc,Markup * markup)325 EndLpdEvent::EndLpdEvent(const ConstPtr<Lpd> &lpd,
326 			 const Location &loc,
327 			 Markup *markup)
328 :  MarkupEvent(endLpd, loc, markup), lpd_(lpd)
329 {
330 }
331 
EndPrologEvent(const ConstPtr<Dtd> & dtd,const ConstPtr<ComplexLpd> & lpd,Vector<StringC> & simpleLinkNames,Vector<AttributeList> & simpleLinkAttributes,const Location & location)332 EndPrologEvent::EndPrologEvent(const ConstPtr<Dtd> &dtd,
333 			       const ConstPtr<ComplexLpd> &lpd,
334 			       Vector<StringC> &simpleLinkNames,
335 			       Vector<AttributeList> &simpleLinkAttributes,
336 			       const Location &location)
337 : LocatedEvent(endProlog, location), dtd_(dtd), lpd_(lpd)
338 {
339   simpleLinkAttributes.swap(simpleLinkAttributes_);
340   simpleLinkNames.swap(simpleLinkNames_);
341 }
342 
EndPrologEvent(const ConstPtr<Dtd> & dtd,const Location & location)343 EndPrologEvent::EndPrologEvent(const ConstPtr<Dtd> &dtd,
344 			       const Location &location)
345 : LocatedEvent(endProlog, location), dtd_(dtd)
346 {
347 }
348 
SgmlDeclEvent(const ConstPtr<Sd> & sd,const ConstPtr<Syntax> & syntax)349 SgmlDeclEvent::SgmlDeclEvent(const ConstPtr<Sd> &sd,
350 			     const ConstPtr<Syntax> &syntax)
351 
352 : sd_(sd), prologSyntax_(syntax), instanceSyntax_(syntax),
353   nextIndex_(0), MarkupEvent(sgmlDecl)
354 {
355 }
356 
SgmlDeclEvent(const ConstPtr<Sd> & sd,const ConstPtr<Syntax> & prologSyntax,const ConstPtr<Syntax> & instanceSyntax,const ConstPtr<Sd> & refSd,const ConstPtr<Syntax> & refSyntax,Index nextIndex,const StringC & implySystemId,const Location & loc,Markup * markup)357 SgmlDeclEvent::SgmlDeclEvent(const ConstPtr<Sd> &sd,
358 			     const ConstPtr<Syntax> &prologSyntax,
359 			     const ConstPtr<Syntax> &instanceSyntax,
360 			     const ConstPtr<Sd> &refSd,
361 			     const ConstPtr<Syntax> &refSyntax,
362 			     Index nextIndex,
363 			     const StringC &implySystemId,
364 			     const Location &loc,
365 			     Markup *markup)
366 : sd_(sd), prologSyntax_(prologSyntax), instanceSyntax_(instanceSyntax),
367   refSd_(refSd), refSyntax_(refSyntax),
368   nextIndex_(nextIndex), implySystemId_(implySystemId),
369   MarkupEvent(sgmlDecl, loc, markup)
370 {
371 }
372 
CommentDeclEvent(const Location & loc,Markup * markup)373 CommentDeclEvent::CommentDeclEvent(const Location &loc,
374 				   Markup *markup)
375 : MarkupEvent(commentDecl, loc, markup)
376 {
377 }
378 
SSepEvent(const Char * p,size_t length,const Location & location,Boolean copy)379 SSepEvent::SSepEvent(const Char *p, size_t length,
380 		     const Location &location, Boolean copy)
381 : ImmediateDataEvent(sSep, p, length, location, copy)
382 {
383 }
384 
IgnoredRsEvent(Char c,const Location & location)385 IgnoredRsEvent::IgnoredRsEvent(Char c, const Location &location)
386 : LocatedEvent(ignoredRs, location), c_(c)
387 {
388 }
389 
IgnoredReEvent(Char c,const Location & location,unsigned long serial)390 IgnoredReEvent::IgnoredReEvent(Char c, const Location &location,
391 			       unsigned long serial)
392 : LocatedEvent(ignoredRe, location),
393   c_(c),
394   serial_(serial)
395 {
396 }
397 
ReOriginEvent(Char c,const Location & location,unsigned long serial)398 ReOriginEvent::ReOriginEvent(Char c, const Location &location,
399 			     unsigned long serial)
400 : LocatedEvent(reOrigin, location), c_(c), serial_(serial)
401 {
402 }
403 
404 
IgnoredCharsEvent(const Char * p,size_t length,const Location & location,Boolean copy)405 IgnoredCharsEvent::IgnoredCharsEvent(const Char *p, size_t length,
406 				     const Location &location, Boolean copy)
407 : ImmediateDataEvent(ignoredChars, p, length, location, copy)
408 {
409 }
410 
MarkedSectionEvent(Type type,Status status,const Location & loc,Markup * markup)411 MarkedSectionEvent::MarkedSectionEvent(Type type, Status status,
412 				       const Location &loc,
413 				       Markup *markup)
414 : MarkupEvent(type, loc, markup),
415   status_(status)
416 {
417 }
418 
MarkedSectionStartEvent(Status status,const Location & loc,Markup * markup)419 MarkedSectionStartEvent::MarkedSectionStartEvent(Status status,
420 						 const Location &loc,
421 						 Markup *markup)
422 : MarkedSectionEvent(markedSectionStart, status, loc, markup)
423 {
424 }
425 
MarkedSectionEndEvent(Status status,const Location & loc,Markup * markup)426 MarkedSectionEndEvent::MarkedSectionEndEvent(Status status,
427 					     const Location &loc,
428 					     Markup *markup)
429 : MarkedSectionEvent(markedSectionEnd, status, loc, markup)
430 {
431 }
432 
EntityStartEvent(const ConstPtr<EntityOrigin> & origin)433 EntityStartEvent::EntityStartEvent(const ConstPtr<EntityOrigin> &origin)
434 : Event(entityStart), origin_(origin)
435 {
436 }
437 
EntityEndEvent(const Location & location)438 EntityEndEvent::EntityEndEvent(const Location &location)
439 : LocatedEvent(entityEnd, location)
440 {
441 }
442 
EntityDeclEvent(const ConstPtr<Entity> & entity,Boolean ignored,const Location & loc,Markup * markup)443 EntityDeclEvent:: EntityDeclEvent(const ConstPtr<Entity> &entity,
444 				  Boolean ignored, const Location &loc,
445 				  Markup *markup)
446 : MarkupEvent(entityDecl, loc, markup),
447   entity_(entity),
448   ignored_(ignored)
449 {
450 }
451 
NotationDeclEvent(const ConstPtr<Notation> & notation,const Location & loc,Markup * markup)452 NotationDeclEvent:: NotationDeclEvent(const ConstPtr<Notation> &notation,
453 				      const Location &loc,
454 				      Markup *markup)
455 : MarkupEvent(notationDecl, loc, markup), notation_(notation)
456 {
457 }
458 
ElementDeclEvent(Vector<const ElementType * > & elements,const ConstPtr<Dtd> & dtd,const Location & loc,Markup * markup)459 ElementDeclEvent::ElementDeclEvent(Vector<const ElementType *> &elements,
460 				   const ConstPtr<Dtd> &dtd,
461 				   const Location &loc,
462 				   Markup *markup)
463 : MarkupEvent(elementDecl, loc, markup), dtd_(dtd)
464 {
465   elements.swap(elements_);
466 }
467 
AttlistDeclEvent(Vector<const ElementType * > & elements,const ConstPtr<Dtd> & dtd,const Location & loc,Markup * markup)468 AttlistDeclEvent::AttlistDeclEvent(Vector<const ElementType *> &elements,
469 				   const ConstPtr<Dtd> &dtd,
470 				   const Location &loc,
471 				   Markup *markup)
472 : MarkupEvent(attlistDecl, loc, markup), dtd_(dtd)
473 {
474   elements.swap(elements_);
475 }
476 
AttlistNotationDeclEvent(Vector<ConstPtr<Notation>> & notations,const Location & loc,Markup * markup)477 AttlistNotationDeclEvent::AttlistNotationDeclEvent(
478   Vector<ConstPtr<Notation> > &notations, const Location &loc,
479 						   Markup *markup)
480 : MarkupEvent(attlistNotationDecl, loc, markup)
481 {
482   notations.swap(notations_);
483 }
484 
485 LinkAttlistDeclEvent
LinkAttlistDeclEvent(Vector<const ElementType * > & elements,const ConstPtr<Lpd> & lpd,const Location & loc,Markup * markup)486 ::LinkAttlistDeclEvent(Vector<const ElementType *> &elements,
487 		       const ConstPtr<Lpd> &lpd,
488 		       const Location &loc,
489 		       Markup *markup)
490 : MarkupEvent(linkAttlistDecl, loc, markup), lpd_(lpd)
491 {
492   elements.swap(elements_);
493 }
494 
LinkDeclEvent(const LinkSet * linkSet,const ConstPtr<ComplexLpd> & lpd,const Location & loc,Markup * markup)495 LinkDeclEvent::LinkDeclEvent(const LinkSet *linkSet,
496 			     const ConstPtr<ComplexLpd> &lpd,
497 			     const Location &loc,
498 			     Markup *markup)
499 : MarkupEvent(linkDecl, loc, markup), lpd_(lpd), linkSet_(linkSet)
500 {
501 }
502 
IdLinkDeclEvent(const ConstPtr<ComplexLpd> & lpd,const Location & loc,Markup * markup)503 IdLinkDeclEvent::IdLinkDeclEvent(const ConstPtr<ComplexLpd> &lpd,
504 				 const Location &loc,
505 				 Markup *markup)
506 : MarkupEvent(linkDecl, loc, markup), lpd_(lpd)
507 {
508 }
509 
ShortrefDeclEvent(const ShortReferenceMap * map,const ConstPtr<Dtd> & dtd,const Location & loc,Markup * markup)510 ShortrefDeclEvent::ShortrefDeclEvent(const ShortReferenceMap *map,
511 				     const ConstPtr<Dtd> &dtd,
512 				     const Location &loc,
513 				     Markup *markup)
514 : MarkupEvent(shortrefDecl, loc, markup), map_(map), dtd_(dtd)
515 {
516 }
517 
IgnoredMarkupEvent(const Location & loc,Markup * markup)518 IgnoredMarkupEvent::IgnoredMarkupEvent(const Location &loc,
519 				       Markup *markup)
520 : MarkupEvent(ignoredMarkup, loc, markup)
521 {
522 }
523 
EntityDefaultedEvent(const ConstPtr<Entity> & entity,const Location & loc)524 EntityDefaultedEvent::EntityDefaultedEvent(const ConstPtr<Entity> &entity,
525 					   const Location &loc)
526 : LocatedEvent(entityDefaulted, loc), entity_(entity)
527 {
528 }
529 
SgmlDeclEntityEvent(const PublicId & publicId,PublicId::TextClass entityType,const StringC & effectiveSystemId,const Location & loc)530 SgmlDeclEntityEvent::  SgmlDeclEntityEvent(const PublicId &publicId,
531 					   PublicId::TextClass entityType,
532 					   const StringC &effectiveSystemId,
533 					   const Location &loc)
534 : LocatedEvent(sgmlDeclEntity, loc), publicId_(publicId),
535   entityType_(entityType), effectiveSystemId_(effectiveSystemId)
536 {
537 }
538 
~EventHandler()539 EventHandler::~EventHandler()
540 {
541 }
542 
543 // By default, do nothing when an input opens or closes.
inputClosed(InputSource * in)544 void EventHandler::inputClosed(InputSource *in) {}
545 
inputOpened(InputSource * in)546 void EventHandler::inputOpened(InputSource *in) {}
547 
EventQueue()548 EventQueue::EventQueue()
549 {
550 }
551 
552 #define EVENT(c, f) \
553   void EventHandler::f(c *event) { delete event; } \
554   void EventQueue::f(c *event) { append(event); } \
555   void c::handle(EventHandler &handler) { handler.f(this); }
556 #include "events.h"
557 #undef EVENT
558 
Pass1EventHandler()559 Pass1EventHandler::Pass1EventHandler()
560 : hadError_(0), origHandler_(0)
561 {
562 }
563 
init(EventHandler * origHandler)564 void Pass1EventHandler::init(EventHandler *origHandler)
565 {
566   hadError_ = 0;
567   origHandler_ = origHandler;
568 }
569 
message(MessageEvent * event)570 void Pass1EventHandler::message(MessageEvent *event)
571 {
572   if (event->message().isError()) {
573     hadError_ = 1;
574     origHandler_->message(event);
575   }
576   else
577     IQueue<Event>::append(event);
578 }
579 
580 #ifdef SP_NAMESPACE
581 }
582 #endif
583