⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 genericeventhandler.cxx

📁 SP是一个基于GNU C++编译器
💻 CXX
📖 第 1 页 / 共 2 页
字号:
// 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 + -