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

📄 entity.cxx

📁 SP是一个基于GNU C++编译器
💻 CXX
字号:
// Copyright (c) 1994 James Clark// See the file COPYING for copying permission.#ifdef __GNUG__#pragma implementation#endif#include "splib.h"#include "Entity.h"#include "ParserState.h"#include "macros.h"#include "InternalInputSource.h"#include "MessageArg.h"#include "ParserMessages.h"#ifdef SP_NAMESPACEnamespace SP_NAMESPACE {#endifEntity::Entity(const StringC &name, DeclType declType, DataType dataType,	       const Location &defLocation): EntityDecl(name, declType, dataType, defLocation),  used_(0), defaulted_(0){}void Entity::generateSystemId(ParserState &){}InternalEntity::InternalEntity(const StringC &name,			       DeclType declType,			       DataType dataType,			       const Location &defLocation,			       Text &text): Entity(name, declType, dataType, defLocation){  text.swap(text_);}PiEntity::PiEntity(const StringC &name, DeclType declType,		   const Location &defLocation, Text &text): InternalEntity(name, declType, pi, defLocation, text){}Entity *PiEntity::copy() const{  return new PiEntity(*this);}InternalDataEntity::InternalDataEntity(const StringC &name, DataType dataType,				       const Location &defLocation, Text &text): InternalEntity(name, generalEntity, dataType, defLocation, text){}InternalCdataEntity::InternalCdataEntity(const StringC &name,					 const Location &defLocation,					 Text &text): InternalDataEntity(name, cdata, defLocation, text){}Entity *InternalCdataEntity::copy() const{  return new InternalCdataEntity(*this);}InternalSdataEntity::InternalSdataEntity(const StringC &name,					 const Location &defLocation,					 Text &text): InternalDataEntity(name, sdata, defLocation, text){}Entity *InternalSdataEntity::copy() const{  return new InternalSdataEntity(*this);}InternalTextEntity::InternalTextEntity(const StringC &name, DeclType declType,				       const Location &defLocation, Text &text,				       Bracketed bracketed): InternalEntity(name, declType, sgmlText, defLocation, text),  bracketed_(bracketed){}Entity *InternalTextEntity::copy() const{  return new InternalTextEntity(*this);}ExternalEntity::ExternalEntity(const StringC &name,			       DeclType declType,			       DataType dataType,			       const Location &defLocation,			       const ExternalId &id): Entity(name, declType, dataType, defLocation), externalId_(id){}const ExternalEntity *ExternalEntity::asExternalEntity() const{  return this;}const StringC *ExternalEntity::systemIdPointer() const{  return externalId_.systemIdString();}const StringC *ExternalEntity::effectiveSystemIdPointer() const{  if (externalId_.effectiveSystemId().size() > 0)    return &externalId_.effectiveSystemId();  return 0;}const StringC *ExternalEntity::publicIdPointer() const{  return externalId_.publicIdString();}void ExternalEntity::generateSystemId(ParserState &parser){  StringC str;  if (parser.entityCatalog().lookup(*this,				    parser.syntax(),				    parser.sd().docCharset(),				    parser.messenger(),				    str))    externalId_.setEffectiveSystem(str);  // Don't generate warning when declType == sgml.  else if (externalId_.publicIdString()) {    if (declType() != sgml)      parser.message(ParserMessages::cannotGenerateSystemIdPublic,		     StringMessageArg(*externalId_.publicIdString()));  }  else {    switch (declType()) {    case generalEntity:      parser.message(ParserMessages::cannotGenerateSystemIdGeneral,		     StringMessageArg(name()));      break;    case parameterEntity:      parser.message(ParserMessages::cannotGenerateSystemIdParameter,		     StringMessageArg(name()));      break;    case doctype:      parser.message(ParserMessages::cannotGenerateSystemIdDoctype,		     StringMessageArg(name()));      break;    case linktype:      parser.message(ParserMessages::cannotGenerateSystemIdLinktype,		     StringMessageArg(name()));      break;    case sgml:      break;    default:      CANNOT_HAPPEN();    }  }}ExternalTextEntity::ExternalTextEntity(const StringC &name,				       DeclType declType,				       const Location &defLocation,				       const ExternalId &id): ExternalEntity(name, declType, sgmlText, defLocation, id){}Entity *ExternalTextEntity::copy() const{  return new ExternalTextEntity(*this);}ExternalNonTextEntity::ExternalNonTextEntity(const StringC &name,					     DataType dataType,					     const Location &defLocation,					     const ExternalId &id): ExternalEntity(name, generalEntity, dataType, defLocation, id){}ExternalDataEntity::ExternalDataEntity(const StringC &name,				       DataType dataType,				       const Location &defLocation,				       const ExternalId &id,				       const ConstPtr<Notation> &nt,				       				       AttributeList &attributes): ExternalNonTextEntity(name, dataType, defLocation, id),  notation_(nt){  attributes.swap(attributes_);}void ExternalDataEntity::setNotation(const ConstPtr<Notation> &notation,				     AttributeList &attributes){  notation_ = notation;  attributes.swap(attributes_);}Entity *ExternalDataEntity::copy() const{  return new ExternalDataEntity(*this);}SubdocEntity::SubdocEntity(const StringC &name,			   const Location &defLocation,			   const ExternalId &id): ExternalNonTextEntity(name, subdoc, defLocation, id){}Entity *SubdocEntity::copy() const{  return new SubdocEntity(*this);}Boolean Entity::isDataOrSubdoc() const{  return 0;}Boolean Entity::isCharacterData() const{  return 0;}const ExternalEntity *Entity::asExternalEntity() const{  return 0;}const ExternalDataEntity *Entity::asExternalDataEntity() const{  return 0;}const SubdocEntity *Entity::asSubdocEntity() const{  return 0;}const InternalEntity *Entity::asInternalEntity() const{  return 0;}void Entity::dsReference(ParserState &parser,			 const Ptr<EntityOrigin> &origin)     const{  normalReference(parser, origin, 1);}void Entity::declReference(ParserState &parser,			   const Ptr<EntityOrigin> &origin)     const{  normalReference(parser, origin, 0);  if (parser.currentMarkup())    parser.currentMarkup()->addEntityStart(origin);}void Entity::contentReference(ParserState &parser,			      const Ptr<EntityOrigin> &origin)     const{  normalReference(parser, origin, 1);}void Entity::rcdataReference(ParserState &parser,			   const Ptr<EntityOrigin> &origin)     const{  normalReference(parser, origin, 1);}void Entity::litReference(Text &, ParserState &parser,			  const Ptr<EntityOrigin> &origin,			  Boolean)     const{  normalReference(parser, origin, 0);}const InternalEntity *InternalEntity::asInternalEntity() const{  return this;}void PiEntity::litReference(Text &, ParserState &parser,			    const Ptr<EntityOrigin> &,			    Boolean) const{  parser.message(ParserMessages::piEntityReference);}void PiEntity::normalReference(ParserState &parser,			       const Ptr<EntityOrigin> &origin,			       Boolean) const{  parser.noteMarkup();  parser.eventHandler().pi(new (parser.eventAllocator())			   PiEntityEvent(this, origin.pointer()));}void PiEntity::declReference(ParserState &parser,			     const Ptr<EntityOrigin> &) const{  parser.message(ParserMessages::piEntityReference);}void PiEntity::rcdataReference(ParserState &parser,			       const Ptr<EntityOrigin> &) const{  parser.message(ParserMessages::piEntityRcdata);}void InternalDataEntity::declReference(ParserState &parser,				       const Ptr<EntityOrigin> &) const{  parser.message(ParserMessages::internalDataEntityReference);}Boolean InternalDataEntity::isDataOrSubdoc() const{  return 1;}void InternalCdataEntity::normalReference(ParserState &parser,					  const Ptr<EntityOrigin> &origin,					  Boolean) const{  checkEntlvl(parser);  if (string().size() > 0) {    parser.noteData();    parser.eventHandler().data(new (parser.eventAllocator())			       CdataEntityEvent(this, origin.pointer()));  }}Boolean InternalCdataEntity::isCharacterData() const{  return string().size() > 0;}void InternalCdataEntity::litReference(Text &text,				       ParserState &parser,				       const Ptr<EntityOrigin> &origin,				       Boolean squeeze) const{  checkEntlvl(parser);  if (squeeze) {    Location loc(origin.pointer(), 0);    text.addEntityStart(loc);    text.addCharsTokenize(text_.string(), loc, parser.syntax().space());    loc += text_.size();    text.addEntityEnd(loc);  }  else    text.addCdata(string(), origin.pointer());}void InternalSdataEntity::normalReference(ParserState &parser,					  const Ptr<EntityOrigin> &origin,					  Boolean) const{  checkEntlvl(parser);  parser.noteData();  parser.eventHandler().sdataEntity(new (parser.eventAllocator())				    SdataEntityEvent(this,						     origin.pointer()));}Boolean InternalSdataEntity::isCharacterData() const{  return 1;}void InternalSdataEntity::litReference(Text &text,				       ParserState &parser,				       const Ptr<EntityOrigin> &origin,				       Boolean squeeze) const{  checkEntlvl(parser);  if (squeeze) {    Location loc(origin.pointer(), 0);    text.addEntityStart(loc);    text.addCharsTokenize(text_.string(), loc, parser.syntax().space());    loc += text_.size();    text.addEntityEnd(loc);  }  else    text.addSdata(string(), origin.pointer());}void InternalTextEntity::normalReference(ParserState &parser,					 const Ptr<EntityOrigin> &origin,					 Boolean generateEvent) const{  checkEntlvl(parser);  if (checkNotOpen(parser)) {    if (generateEvent && parser.wantMarkup())      parser.eventHandler().entityStart(new (parser.eventAllocator())					EntityStartEvent(origin));    parser.pushInput(new (parser.internalAllocator())		     InternalInputSource(text_.string(), origin.pointer()));  }}void InternalTextEntity::litReference(Text &text,				      ParserState &parser,				      const Ptr<EntityOrigin> &origin,				      Boolean) const{  text.addEntityStart(Location(origin.pointer(), 0));  normalReference(parser, origin, 0);}void ExternalTextEntity::normalReference(ParserState &parser,					 const Ptr<EntityOrigin> &origin,					 Boolean generateEvent) const{  checkEntlvl(parser);  if (checkNotOpen(parser)) {    if (generateEvent && parser.wantMarkup())      parser.eventHandler().entityStart(new (parser.eventAllocator())					EntityStartEvent(origin));    if (externalId().effectiveSystemId().size())      parser.pushInput(parser.entityManager()		       .open(externalId().effectiveSystemId(),			     parser.sd().docCharset(),			     origin.pointer(),			     0,			     parser.messenger()));    else      parser.message(ParserMessages::nonExistentEntityRef,		     StringMessageArg(name()),		     defLocation());  }}void ExternalTextEntity::litReference(Text &text,				      ParserState &parser,				      const Ptr<EntityOrigin> &origin,				      Boolean) const{  if (parser.options().warnAttributeValueExternalEntityRef      && declType() == generalEntity)    parser.message(ParserMessages::attributeValueExternalEntityRef);  text.addEntityStart(Location(origin.pointer(), 0));  normalReference(parser, origin, 0);}const ExternalDataEntity *ExternalDataEntity::asExternalDataEntity() const{  return this;}void ExternalDataEntity::contentReference(ParserState &parser,					  const Ptr<EntityOrigin> &origin) const{  if (parser.options().warnExternalDataEntityRef)    parser.message(ParserMessages::externalDataEntityRef);  checkEntlvl(parser);  parser.noteData();  parser.eventHandler().externalDataEntity(new (parser.eventAllocator())					   ExternalDataEntityEvent(this, origin.pointer()));}Boolean ExternalNonTextEntity::isDataOrSubdoc() const{  return 1;}Boolean ExternalNonTextEntity::isCharacterData() const{  return 1;}void ExternalNonTextEntity::normalReference(ParserState &parser,					    const Ptr<EntityOrigin> &,					    Boolean) const{  parser.message(ParserMessages::externalNonTextEntityReference);}void ExternalNonTextEntity::litReference(Text &,					 ParserState &parser,					 const Ptr<EntityOrigin> &,					 Boolean) const{  parser.message(ParserMessages::externalNonTextEntityRcdata);}void ExternalNonTextEntity::rcdataReference(ParserState &parser,					    const Ptr<EntityOrigin> &) const{  parser.message(ParserMessages::externalNonTextEntityRcdata);}void SubdocEntity::contentReference(ParserState &parser,				    const Ptr<EntityOrigin> &origin) const{  checkEntlvl(parser);  parser.noteData();  parser.eventHandler().subdocEntity(new (parser.eventAllocator())				     SubdocEntityEvent(this, origin.pointer()));}const SubdocEntity *SubdocEntity::asSubdocEntity() const{  return this;}IgnoredEntity::IgnoredEntity(const StringC &name, DeclType declType): Entity(name, declType, sgmlText, Location()){}Entity *IgnoredEntity::copy() const{  return new IgnoredEntity(*this);}void IgnoredEntity::declReference(ParserState &parser,				  const Ptr<EntityOrigin> &origin)     const{  if (parser.currentMarkup()) {    parser.currentMarkup()->addEntityStart(origin);    parser.currentMarkup()->addEntityEnd();  }}void IgnoredEntity::litReference(Text &text,				 ParserState &,				 const Ptr<EntityOrigin> &origin,				 Boolean) const{  text.addEntityStart(Location(origin.pointer(), 0));  text.addEntityEnd(Location(origin.pointer(), 0));}void IgnoredEntity::normalReference(ParserState &parser,				    const Ptr<EntityOrigin> &origin,				    Boolean generateEvent) const{  if (generateEvent && parser.wantMarkup()) {    parser.eventHandler().entityStart(new (parser.eventAllocator())				      EntityStartEvent(origin));    Location loc(origin.pointer(), 0);    parser.eventHandler().entityEnd(new (parser.eventAllocator())				    EntityEndEvent(loc));  }}void Entity::checkEntlvl(ParserState &parser){  // -1 because document entity isn't counted  if (parser.inputLevel() - 1 == parser.syntax().entlvl())    parser.message(ParserMessages::entlvl);}Boolean Entity::checkNotOpen(ParserState &parser) const{  if (parser.entityIsOpen(this)) {    parser.message(ParserMessages::recursiveEntityReference,		   StringMessageArg(name()));    return 0;  }  return 1;}#ifdef SP_NAMESPACE}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -