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