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

📄 arcengine.cxx

📁 SP是一个基于GNU C++编译器
💻 CXX
📖 第 1 页 / 共 4 页
字号:
    return;  }  else {    currentLocation_ = event->location();    for (size_t i = 0; i < arcProcessors_.size(); i++) {      if (arcProcessors_[i].valid() && arcProcessors_[i].processData()) {	const Entity *entity = event->entity();	arcProcessors_[i].docHandler()	  .sdataEntity(new (alloc_)		       SdataEntityEvent(entity->asInternalEntity(),					event->location().origin()));      }    }  }  DelegateEventHandler::sdataEntity(event);}void ArcEngineImpl::externalDataEntity(ExternalDataEntityEvent *event){  if (!gatheringContent_) {    currentLocation_ = event->location();    for (size_t i = 0; i < arcProcessors_.size(); i++) {      if (arcProcessors_[i].valid()	  && arcProcessors_[i].processData()) {	ConstPtr<Entity> entity	  = arcProcessors_[i].dtdPointer()	    ->lookupEntity(0, event->entity()->name());	if (!entity.isNull()) {	  ConstPtr<EntityOrigin> oldOrigin = event->entityOrigin();	  Owner<Markup> markup;	  if (oldOrigin->markup())	    markup = new Markup(*oldOrigin->markup());	  ConstPtr<EntityOrigin> newOrigin	    = EntityOrigin::make(entity,				 oldOrigin->parent(),				 oldOrigin->refLength(),				 markup);	  arcProcessors_[i].docHandler()	    .externalDataEntity(new (alloc_)				ExternalDataEntityEvent(entity->asExternalDataEntity(),							newOrigin));	}	// otherwise entity is not architectural      }    }  }  DelegateEventHandler::externalDataEntity(event);}void ArcEngineImpl::endElement(EndElementEvent *event){  while (gatheringContent_) {    if (--gatheringContent_ > 0) {      DelegateEventHandler::endElement(event);      return;    }    delegateTo_ = delegateHandler();    // Clear out eventQueue_ in case handling the events    // causes events to be queued again.    IQueue<Event> tem;    tem.swap(eventQueue_);    while (!tem.empty())      tem.get()->handle(*this);  }  currentLocation_ = event->location();  for (size_t i = 0; i < arcProcessors_.size(); i++)    if (arcProcessors_[i].valid())      arcProcessors_[i].processEndElement(*event, alloc_);  DelegateEventHandler::endElement(event);  if (haveLinkProcess_)    linkProcess_.endElement();}void ArcEngineImpl::uselink(UselinkEvent *event){  if (!gatheringContent_)    linkProcess_.uselink(event->linkSet(),			 event->restore(),			 event->lpd().pointer());  DelegateEventHandler::uselink(event);}void ArcEngineImpl::dispatchMessage(const Message &msg){  mgr_->dispatchMessage(msg);}void ArcEngineImpl::dispatchMessage(Message &msg){  mgr_->dispatchMessage(msg);}void ArcEngineImpl::initMessage(Message &msg){  mgr_->initMessage(msg);  msg.loc = currentLocation_;}ArcProcessor::ArcProcessor(): errorIdref_(1), docHandler_(0), arcAuto_(1),  arcDtdIsParam_(0){}void ArcProcessor::setName(const StringC &name){  name_ = name;}const Syntax &ArcProcessor::attributeSyntax() const{  return *docSyntax_;}ConstPtr<Notation> ArcProcessor::getAttributeNotation(const StringC &name,						      const Location &){  if (!metaDtd_.isNull())    return metaDtd_->lookupNotation(name);  return 0;}ConstPtr<Entity> ArcProcessor::getAttributeEntity(const StringC &name,						  const Location &){  // FIXME What about default entity  if (!metaDtd_.isNull())    return metaDtd_->lookupEntity(0, name);  return 0;}void ArcProcessor::noteCurrentAttribute(size_t i, AttributeValue *value){  if (valid_)    currentAttributes_[i] = value;}ConstPtr<AttributeValue> ArcProcessor::getCurrentAttribute(size_t i) const{  return currentAttributes_[i];}// This code is the same as in the main parser.// Once handling of ID/IDREF in architectures has been clarified.// Maybe factor out into AttributeContext.Boolean ArcProcessor::defineId(const StringC &str, const Location &loc,			       Location &prevLoc){  if (!valid_)    return 1;  Id *id = lookupCreateId(str);  if (id->defined()) {    prevLoc = id->defLocation();    return 0;  }  id->define(loc);  return 1;}void ArcProcessor::noteIdref(const StringC &str, const Location &loc){  if (!valid_ || !errorIdref_)    return;  Id *id = lookupCreateId(str);  if (!id->defined())    id->addPendingRef(loc);}Id *ArcProcessor::lookupCreateId(const StringC &name){  Id *id = idTable_.lookup(name);  if (!id) {    id = new Id(name);    idTable_.insert(id);  }  return id;}void ArcProcessor::checkIdrefs(){  NamedTableIter<Id> iter(idTable_);  Id *id;  while ((id = iter.next()) != 0) {    for (size_t i = 0; i < id->pendingRefs().size(); i++) {      Messenger::setNextLocation(id->pendingRefs()[i]);      message(ArcEngineMessages::missingId, StringMessageArg(id->name()));    }  }}void ArcProcessor::init(const EndPrologEvent &event,			const ConstPtr<Sd> &sd,			const ConstPtr<Syntax> &syntax,			const SgmlParser *parentParser,			Messenger *mgr,			const Vector<StringC> &superName,			ArcDirector &director,			const volatile sig_atomic_t *cancelPtr){  director_ = &director;  mgr_ = mgr;  docSyntax_ = syntax;  docSd_ = sd;  mgr_ = mgr;  valid_ = 0;  docDtd_ = event.dtdPointer();  metaSyntax_ = docSyntax_;  mayDefaultAttribute_ = 1;  docSyntax_->generalSubstTable()->subst(name_);  Vector<StringC> docName(superName);  docName.push_back(name_);  ConstPtr<Notation> notation;  notation = docDtd_->lookupNotation(name_);  if (!notation.isNull()) {    ConstPtr<AttributeDefinitionList> notAttDef = notation->attributeDef();    attributeList_.init(notAttDef);    attributeList_.finish(*this);    supportAttributes(attributeList_);  }  else    message(ArcEngineMessages::noArcNotation, StringMessageArg(name_));  ArcEngineImpl *engine    = new ArcEngineImpl(*mgr, parentParser, director, cancelPtr,			notation.pointer(),			docName,			docSyntax_->generalSubstTable());  docHandler_ = engine;  ownEventHandler_ = engine;  if (supportAtts_[rArcDocF].size() == 0)    supportAtts_[rArcDocF] = name_;  if (supportAtts_[rArcFormA].size() == 0)    supportAtts_[rArcFormA] = name_;  rniContent_ = docSyntax_->delimGeneral(Syntax::dRNI);  rniContent_ += sd->execToInternal("CONTENT");  rniDefault_ = docSyntax_->delimGeneral(Syntax::dRNI);  rniDefault_ += docSyntax_->reservedName(Syntax::rDEFAULT);  rniArcCont_ = metaSyntax_->delimGeneral(Syntax::dRNI);  rniArcCont_ += sd->execToInternal("ARCCONT");  ConstPtr<Entity> dtdent = makeDtdEntity(notation.pointer());  if (dtdent.isNull())    return;  StringC sysid = dtdent->asExternalEntity()->externalId().effectiveSystemId();  if (sysid.size() == 0      && !parentParser->entityCatalog().lookup(*dtdent,					       *docSyntax_,					       sd->internalCharset(),					       *mgr_,					       sysid)) {    message(ArcEngineMessages::arcGenerateSystemId,	    StringMessageArg(name_));    return;  }  docHandler_->sgmlDecl(new SgmlDeclEvent(sd, syntax));  docHandler_->startDtd(new StartDtdEvent(dtdent->name(),					  dtdent,					  0,					  event.location(),					  0));  SgmlParser::Params params;  params.entityType = SgmlParser::Params::dtd;  params.sysid = sysid;  params.parent = parentParser;  ParserOptions options = parentParser->options();  errorIdref_ = options.errorIdref;  options.errorAfdr = 0;  options.includes = arcOpts_;  params.options = &options;  params.sd = docSd_;  if (metaSyntax_->reservedName(Syntax::rALL).size() == 0) {    Ptr<Syntax> tem(new Syntax(*metaSyntax_));    tem->setName(Syntax::rALL, docSd_->execToInternal("ALL"));    metaSyntax_ = tem;  }  params.prologSyntax = metaSyntax_;  params.instanceSyntax = metaSyntax_;  params.doctypeName = dtdent->name();  SgmlParser parser(params);  parser.parseAll(*docHandler_, cancelPtr);  Ptr<Dtd> baseDtd = parser.baseDtd();  if (baseDtd.isNull()      || baseDtd->documentElementType()->definition()->undefined())    return;  metaDtd_ = baseDtd;  metaMapCache_.resize(docDtd_->nElementTypeIndex());  mungeMetaDtd(*baseDtd, *docDtd_);  docHandler_->endDtd(new EndDtdEvent(metaDtd_, event.location(), 0));  startContent(*metaDtd_);  currentAttributes_.resize(metaDtd_->nCurrentAttribute());  valid_ = 1;  docHandler_->endProlog(new EndPrologEvent(metaDtd_, event.location()));  if (engine->nBases() == 0)    docHandler_ = engine->delegateHandler();}void ArcProcessor::mungeMetaDtd(Dtd &metaDtd, const Dtd &docDtd){  if (supportAtts_[rArcDataF].size() > 0      && metaDtd.lookupNotation(supportAtts_[rArcDataF]).isNull()) {    Messenger::message(ArcEngineMessages::noArcDataF,		       StringMessageArg(supportAtts_[rArcDataF]));    metaDtd.insertNotation(new Notation(supportAtts_[rArcDataF],					metaDtd.namePointer(),					metaDtd.isBase()));  }  // FIXME check for ArcAutoF  Dtd::ConstEntityIter iter(docDtd.generalEntityIter());  for (;;) {    ConstPtr<Entity> ent = iter.next();    if (ent.isNull())      break;    Ptr<Entity> copy(ent->copy());    if (!copy->asExternalDataEntity()	|| mungeDataEntity(*(ExternalDataEntity *)copy.pointer()))      metaDtd.insertEntity(copy, 1);  }}Boolean ArcProcessor::mungeDataEntity(ExternalDataEntity &entity){  const MetaMap &map = buildMetaMap(0,				    entity.notation(),				    entity.attributes(),				    0,				    0);  if (!map.attributed)    return 0;  AttributeList atts;  const Notation *notation = (const Notation *)map.attributed;  ConstPtr<AttributeValue> arcContent;  if (mapAttributes(entity.attributes(), 0, 0, atts, arcContent, map)) {    // FIXME check arcContent    entity.setNotation((Notation *)notation, atts);    return 1;  }  // FIXME error tried to use #CONTENT  return 0;}ConstPtr<Entity> ArcProcessor::makeDtdEntity(const Notation *){  if (!supportAtts_[rArcDTD].size()) {    mgr_->message(ArcEngineMessages::noArcDTDAtt);    return 0;  }  ConstPtr<Entity> entity = docDtd_->lookupEntity(arcDtdIsParam_,						  supportAtts_[rArcDTD]);  if (entity.isNull()) {    mgr_->message(arcDtdIsParam_		  ? ArcEngineMessages::arcDtdNotDeclaredParameter		  : ArcEngineMessages::arcDtdNotDeclaredParameter,		  StringMessageArg(supportAtts_[rArcDTD]));    return 0;  }  if (!entity->asExternalEntity()) {    mgr_->message(ArcEngineMessages::arcDtdNotExternal,		  StringMessageArg(supportAtts_[rArcDTD]));    return 0;  }  ExternalId externalId(entity->asExternalEntity()->externalId());#if 0  // Use the public identifier of the notation to find the meta-DTD.  if (externalId.effectiveSystemId().size() == 0 && notation) {    if (notation->externalId().effectiveSystemId().size()) {      StringC tem(notation->externalId().effectiveSystemId());      externalId.setEffectiveSystem(tem);    }    else  if (!externalId.publicId()) {      const PublicId *pubid = notation->externalId().publicId();      PublicId::OwnerType ownerType;      if (pubid && pubid->getOwnerType(ownerType)) {	Text pubidText;	unsigned textClassPos = 2;	if (ownerType != PublicId::ISO)	  textClassPos += 3;	StringC owner;	pubid->getOwner(owner);	textClassPos += owner.size();	pubidText.addChars(pubid->string().data(),			   textClassPos,			   pubid->text().charLocation(0));	pubidText.addChars(docSd_->execToInternal("DTD"),			   pubid->text().charLocation(textClassPos));	for (; textClassPos < pubid->string().size(); textClassPos++)	  if (pubid->string()[textClassPos] == docSyntax_->space())	    break;	pubidText.addChars(pubid->string().data() + textClassPos,			   pubid->string().size() - textClassPos,			   pubid->text().charLocation(textClassPos));	const MessageType1 *msg;	externalId.setPublic(pubidText, docSd_->internalCharset(),			     docSyntax_->space(), msg);      }    }  }#endif  return new ExternalTextEntity(supportAtts_[rArcDocF],				Entity::doctype,				entity->defLocation(),				externalId);}void ArcProcessor::supportAttributes(const AttributeList &atts){  static const char *const s[] = {    "ArcFormA",    "ArcNamrA",    "ArcSuprA",    "ArcIgnDA",    "ArcDocF",    "ArcSuprF",    "ArcBridF",    "ArcDataF",    "ArcAuto",    "ArcIndr",    "ArcDTD",    "ArcQuant",    };  for (size_t i = 0; i < SIZEOF(s); i++) {    StringC attName(docSd_->execToInternal(s[i]));    docSyntax_->generalSubstTable()->subst(attName);    unsigned ind;    if (atts.attributeIndex(attName, ind)) {      const AttributeValue *value = atts.value(ind);      if (value) {	const Text *textP = value->text();	// FIXME check for empty value	if (textP) {	  supportAtts_[i] = textP->string();	  switch (i) {	  case rArcQuant:	    processArcQuant(*textP);	    break;	  case rArcAuto:	    docSyntax_->generalSubstTable()->subst(supportAtts_[i]);	    if (supportAtts_[i] == docSd_->execToInternal("ARCAUTO"))	      arcAuto_ = 1;	    else if (supportAtts_[i] == docSd_->execToInternal("NARCAUTO"))	      arcAuto_ = 0;	    else

⌨️ 快捷键说明

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