📄 genericeventhandler.cxx
字号:
// Copyright (c) 1996 James Clark// See the file COPYING for copying permission.#ifdef __GNUG__#pragma implementation#endif#include "splib.h"#include "GenericEventHandler.h"#include "macros.h"#include "ExtendEntityManager.h"#ifdef SP_NAMESPACEnamespace SP_NAMESPACE {#endifclass SpOpenEntity : public SGMLApplication::OpenEntity {public: SpOpenEntity(const ConstPtr<Origin> &origin); SGMLApplication::Location location(SGMLApplication::Position) const;private: ConstPtr<Origin> origin_; StorageObjectLocation soLoc_;};inlinevoid GenericEventHandler::freeAll(){ if (allocBlocks_) freeAll1();}inlinevoid GenericEventHandler::clearNotation(SGMLApplication::Notation &to){ clearString(to.name);}inlinevoid GenericEventHandler::setLocation(SGMLApplication::Position &pos, const Location &loc){ if (lastOrigin_ != loc.origin()) setLocation1(pos, loc); else pos = loc.index();}GenericEventHandler::GenericEventHandler(SGMLApplication &app, bool generalEntities): app_(&app), generalEntities_(generalEntities), freeBlocks_(0), allocBlocks_(0), firstBlockSpare_(0), firstBlockUsed_(0){}GenericEventHandler::~GenericEventHandler(){ freeAll(); while (freeBlocks_) { Block *tem = freeBlocks_; freeBlocks_ = freeBlocks_->next; delete [] tem->mem; delete tem; }}void GenericEventHandler::freeAll1(){ Block **p; for (p = &allocBlocks_; *p; p = &(*p)->next) ; *p = freeBlocks_; freeBlocks_ = allocBlocks_; allocBlocks_ = 0; if (freeBlocks_) firstBlockSpare_ = freeBlocks_->size; else firstBlockSpare_ = 0; firstBlockUsed_ = 0;}void *GenericEventHandler::allocate(size_t n){ if (n == 0) return 0; // round up to avoid alignment problems n = (n + sizeof(char *) - 1) & ~(sizeof(char *) - 1); enum { BIG = 1024 }; if (n > firstBlockSpare_) { if (freeBlocks_ && firstBlockUsed_) { Block *tem = freeBlocks_; freeBlocks_ = freeBlocks_->next; tem->next = allocBlocks_; allocBlocks_ = tem; } if (!freeBlocks_ || freeBlocks_->size < n) { Block *tem = new Block; tem->size = n < BIG ? int(BIG) : n; tem->mem = new char[tem->size]; tem->next = freeBlocks_; freeBlocks_ = tem; } firstBlockUsed_ = 0; firstBlockSpare_ = freeBlocks_->size; } char *tem = freeBlocks_->mem + firstBlockUsed_; firstBlockUsed_ += n; firstBlockSpare_ -= n; return tem;}void GenericEventHandler::startElement(StartElementEvent *event){ SGMLApplication::StartElementEvent appEvent; setString(appEvent.gi, event->name()); const ElementDefinition *def = event->elementType()->definition(); switch (def->declaredContent()) { case ElementDefinition::modelGroup: appEvent.contentType = (def->compiledModelGroup()->containsPcdata() ? SGMLApplication::StartElementEvent::mixed : SGMLApplication::StartElementEvent::element); break; case ElementDefinition::any: appEvent.contentType = SGMLApplication::StartElementEvent::mixed; break; case ElementDefinition::cdata: appEvent.contentType = SGMLApplication::StartElementEvent::cdata; break; case ElementDefinition::rcdata: appEvent.contentType = SGMLApplication::StartElementEvent::rcdata; break; case ElementDefinition::empty: appEvent.contentType = SGMLApplication::StartElementEvent::empty; break; } appEvent.included = event->included(); appEvent.nAttributes = event->attributes().size(); if (appEvent.nAttributes != 0) { if (event->attributes().conref()) appEvent.contentType = SGMLApplication::StartElementEvent::empty; setAttributes(appEvent.attributes, event->attributes()); } setLocation(appEvent.pos, event->location()); app_->startElement(appEvent); freeAll(); delete event;}void GenericEventHandler::endElement(EndElementEvent *event){ SGMLApplication::EndElementEvent appEvent; setString(appEvent.gi, event->name()); setLocation(appEvent.pos, event->location()); app_->endElement(appEvent); delete event;}void GenericEventHandler::data(DataEvent *event){ SGMLApplication::DataEvent appEvent; appEvent.data.ptr = event->data(); appEvent.data.len = event->dataLength(); setLocation(appEvent.pos, event->location()); app_->data(appEvent); delete event;}void GenericEventHandler::pi(PiEvent *event){ SGMLApplication::PiEvent appEvent; appEvent.data.ptr = event->data(); appEvent.data.len = event->dataLength(); const Entity *entity = event->entity(); if (entity) setString(appEvent.entityName, entity->name()); else appEvent.entityName.len = 0; setLocation(appEvent.pos, event->location()); app_->pi(appEvent); delete event;}void GenericEventHandler::sdataEntity(SdataEntityEvent *event){ SGMLApplication::SdataEvent appEvent; appEvent.text.ptr = event->data(); appEvent.text.len = event->dataLength(); setString(appEvent.entityName, event->entity()->name()); // Don't want location of chars in entity. setLocation(appEvent.pos, event->location().origin()->parent()); app_->sdata(appEvent); delete event;}void GenericEventHandler::externalDataEntity(ExternalDataEntityEvent *event){ SGMLApplication::ExternalDataEntityRefEvent appEvent; setEntity(appEvent.entity, *event->entity()); setLocation(appEvent.pos, event->location()); app_->externalDataEntityRef(appEvent); freeAll(); delete event;}void GenericEventHandler::subdocEntity(SubdocEntityEvent *event){ SGMLApplication::SubdocEntityRefEvent appEvent; setEntity(appEvent.entity, *event->entity()); setLocation(appEvent.pos, event->location()); app_->subdocEntityRef(appEvent); freeAll(); delete event;}void GenericEventHandler::nonSgmlChar(NonSgmlCharEvent *event){ SGMLApplication::NonSgmlCharEvent appEvent; appEvent.c = event->character(); setLocation(appEvent.pos, event->location()); app_->nonSgmlChar(appEvent); delete event;}void GenericEventHandler::startDtd(StartDtdEvent *event){ SGMLApplication::StartDtdEvent appEvent; setString(appEvent.name, event->name()); const Entity *entity = event->entity().pointer(); if (entity) { appEvent.haveExternalId = 1; setExternalId(appEvent.externalId, entity->asExternalEntity()->externalId()); } else appEvent.haveExternalId = 0; setLocation(appEvent.pos, event->location()); app_->startDtd(appEvent); freeAll(); delete event;}void GenericEventHandler::endDtd(EndDtdEvent *event){ SGMLApplication::EndDtdEvent appEvent; setString(appEvent.name, event->dtd().name()); setLocation(appEvent.pos, event->location()); app_->endDtd(appEvent); delete event;}void GenericEventHandler::endProlog(EndPrologEvent *event){ if (generalEntities_) { SGMLApplication::GeneralEntityEvent entityEvent; const Dtd &dtd = event->dtd(); Dtd::ConstEntityIter iter(dtd.generalEntityIter()); for (;;) { const Entity *entity = iter.nextTemp(); if (!entity) break; setEntity(entityEvent.entity, *entity); app_->generalEntity(entityEvent); } freeAll(); } SGMLApplication::EndPrologEvent appEvent; setLocation(appEvent.pos, event->location()); app_->endProlog(appEvent); delete event;}void GenericEventHandler::entityDefaulted(EntityDefaultedEvent *event){ if (generalEntities_) { SGMLApplication::GeneralEntityEvent appEvent; setEntity(appEvent.entity, event->entity()); app_->generalEntity(appEvent); } delete event;}void GenericEventHandler::appinfo(AppinfoEvent *event){ SGMLApplication::AppinfoEvent appEvent; const StringC *str; if (event->literal(str)) { setString(appEvent.string, *str); appEvent.none = 0; } else appEvent.none = 1; setLocation(appEvent.pos, event->location()); app_->appinfo(appEvent); delete event;}void GenericEventHandler::commentDecl(CommentDeclEvent *event){ SGMLApplication::CommentDeclEvent appEvent; appEvent.nComments = 0; { for (MarkupIter iter(event->markup()); iter.valid(); iter.advance()) if (iter.type() == Markup::comment) appEvent.nComments++; } SGMLApplication::CharString *comments = (SGMLApplication::CharString *)allocate(appEvent.nComments * 2 * sizeof(SGMLApplication::CharString)); appEvent.comments = comments; appEvent.seps = appEvent.comments + appEvent.nComments; size_t i = 0; for (MarkupIter iter(event->markup()); iter.valid(); iter.advance()) switch (iter.type()) { case Markup::comment: comments[i].ptr = iter.charsPointer(); comments[i].len = iter.charsLength(); clearString(comments[appEvent.nComments + i]); i++; break; case Markup::s: comments[appEvent.nComments + i - 1].ptr = iter.charsPointer(); comments[appEvent.nComments + i - 1].len = iter.charsLength(); break; default: break; } setLocation(appEvent.pos, event->location()); app_->commentDecl(appEvent); freeAll(); delete event;}void GenericEventHandler::markedSectionStart(MarkedSectionStartEvent *event){ SGMLApplication::MarkedSectionStartEvent appEvent; unsigned depth = 0; appEvent.nParams = 0; { for (MarkupIter iter(event->markup()); iter.valid(); iter.advance()) switch (iter.type()) { case Markup::reservedName: if (!depth) appEvent.nParams++; break; case Markup::entityStart: if (!depth) appEvent.nParams++; depth++; break; case Markup::entityEnd: depth--; break; default: break; } } SGMLApplication::MarkedSectionStartEvent::Param *params = (SGMLApplication::MarkedSectionStartEvent::Param *) allocate(appEvent.nParams * sizeof(appEvent.params[0])); appEvent.params = params; size_t i = 0; for (MarkupIter iter(event->markup()); iter.valid(); iter.advance()) switch (iter.type()) { case Markup::reservedName: if (!depth) { switch (iter.reservedName()) { case Syntax::rTEMP: params[i].type = SGMLApplication::MarkedSectionStartEvent::Param::temp; break; case Syntax::rINCLUDE: params[i].type = SGMLApplication::MarkedSectionStartEvent::Param::include; break; case Syntax::rRCDATA: params[i].type = SGMLApplication::MarkedSectionStartEvent::Param::rcdata; break; case Syntax::rCDATA: params[i].type = SGMLApplication::MarkedSectionStartEvent::Param::cdata; break; case Syntax::rIGNORE: params[i].type = SGMLApplication::MarkedSectionStartEvent::Param::ignore; break; default: CANNOT_HAPPEN(); } clearString(params[i].entityName); i++; } break; case Markup::entityStart: if (!depth) { params[i].type = SGMLApplication::MarkedSectionStartEvent::Param::entityRef; setString(params[i].entityName, iter.entityOrigin()->entity()->name()); i++; } depth++; break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -