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> ¬ation,
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> > ¬ations, 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