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

📄 soentitycatalog.cxx

📁 SP是一个基于GNU C++编译器
💻 CXX
📖 第 1 页 / 共 3 页
字号:
    substTable_.addSubst(lc, uc);    categoryTable_.setChar(lc, min);    categoryTable_.setChar(uc, min);  }  for (p = sChars; *p; p++)    categoryTable_.setChar(charset.execToDesc(*p), s);  for (p = minChars; *p; p++)    categoryTable_.setChar(charset.execToDesc(*p), min);  for (p = wwwMinChars; *p; p++) {    WideChar c;    ISet<WideChar> set;    if (charset.univToDesc(*p, c, set) > 0 && c <= Char(-1))      categoryTable_.setChar(Char(c), min);  }  categoryTable_.setChar(charset.execToDesc('\''), lita);  categoryTable_.setChar(charset.execToDesc('"'), lit);  minus_ = charset.execToDesc('-');  categoryTable_.setChar(minus_, minus);  tab_ = charset.execToDesc('\t');  re_ = charset.execToDesc('\r');  rs_ = charset.execToDesc('\n');  space_ = charset.execToDesc(' ');  categoryTable_.setEe(eof);}void CatalogParser::parseCatalog(const StringC &sysid,				 Boolean mustExist,				 const CharsetInfo &sysidCharset,				 const CharsetInfo &catalogCharset,				 InputSourceOrigin *origin,				 SOEntityCatalog *catalog,				 Messenger &mgr){  const Ptr<ExtendEntityManager> &em = catalog->entityManager();  in_ = em->open(sysid, sysidCharset, origin,		 mustExist ? 0 : ExtendEntityManager::mayNotExist, mgr);  if (!in_)    return;  catalog_ = catalog;  mgr_ = &mgr;  override_ = 0;  Boolean recovering = false;  Vector<StringC> subSysids;  Vector<Location> subSysidLocs;  for (;;) {    Param parm = parseParam();    if (parm == nameParam) {      upcase(param_);      Boolean wasRecovering = recovering;      recovering = false;      if (param_ == publicKey_)	parsePublic();      else if (param_ == systemKey_)	parseSystem();      else if (param_ == entityKey_)	parseNameMap(EntityDecl::generalEntity);      else if (param_ == doctypeKey_)	parseNameMap(EntityDecl::doctype);      else if (param_ == linktypeKey_)	parseNameMap(EntityDecl::linktype);      else if (param_ == notationKey_)	parseNameMap(EntityDecl::notation);      else if (param_ == sgmlKey_)	parseNameMap(EntityDecl::sgml);      else if (param_ == sgmlDeclKey_) {	if (parseArg())	  catalog_->setSgmlDecl(param_, paramLoc_);      }      else if (param_ == documentKey_) {	if (parseArg())	  catalog_->setDocument(param_, paramLoc_);      }      else if (param_ == overrideKey_)	parseOverride();      else if (param_ == catalogKey_) {	if (parseArg()) {	  if (inLoop(paramLoc_))	    break;	  subSysids.resize(subSysids.size() + 1);	  param_.swap(subSysids.back());	  subSysidLocs.push_back(paramLoc_);	}      }      else if (param_ == baseKey_) {	if (parseArg()) {	  StringC tem;	  if (em->expandSystemId(param_,				 paramLoc_,				 0,				 catalogCharset,				 0,				 mgr,				 tem)) {	    InputSource *in = em->open(tem,				       catalogCharset,				       InputSourceOrigin::make(paramLoc_),				       0,				       mgr);	    if (in && (in->get(mgr) != InputSource::eE || !in->accessError()))	      catalog->setBase(in->currentLocation());	  }	}      }      else if (param_ == delegateKey_)	parseDelegate();      else if (param_ == dtddeclKey_)	parseDtddecl();      else {	if (!wasRecovering && parseParam() == eofParam)	  break;	recovering = true;      }    }    else if (parm == eofParam)      break;    else if (!recovering) {      recovering = true;      message(CatalogMessages::nameExpected);    }  }  delete in_;  catalog->endCatalog();  for (size_t i = 0; i < subSysids.size(); i++) {    StringC tem;    if (em->expandSystemId(subSysids[i], subSysidLocs[i], 0, catalogCharset,			   0, mgr, tem))      parseCatalog(tem, 1, catalogCharset, catalogCharset,		   InputSourceOrigin::make(subSysidLocs[i]), catalog, mgr);  }}Boolean CatalogParser::inLoop(const Location &loc){  const InputSourceOrigin *origin = paramLoc_.origin()->asInputSourceOrigin();  if (!origin)    return 0;  const ExternalInfo *info = origin->externalInfo();  if (!info)    return 0;  StorageObjectLocation soLoc;  if (!ExtendEntityManager::externalize(info,					origin->startOffset(paramLoc_.index()),					soLoc))    return 0;  for (;;) {    const Location &parent = origin->parent();    if (parent.origin().isNull())      break;    origin = parent.origin()->asInputSourceOrigin();    if (!origin)      break;    const ExternalInfo *info1 = origin->externalInfo();    if (info1) {      StorageObjectLocation soLoc1;      if (ExtendEntityManager::externalize(info1,					   origin->startOffset(parent.index()),					   soLoc1)) {	if (soLoc.storageObjectSpec->storageManager	    == soLoc1.storageObjectSpec->storageManager	    && soLoc.actualStorageId == soLoc1.actualStorageId) {	  setNextLocation(loc.origin()->parent());	  message(CatalogMessages::inLoop);	  return 1;	}      }    }  }  return 0;}void CatalogParser::parseOverride(){  if (parseParam() != nameParam) {    message(CatalogMessages::overrideYesOrNo);    return;  }  upcase(param_);  if (param_ == yesKey_)    override_ = 1;  else if (param_ == noKey_)    override_ = 0;  else    message(CatalogMessages::overrideYesOrNo);}void CatalogParser::parsePublic(){  if (parseParam(minimumLiteral) != literalParam) {    message(CatalogMessages::literalExpected);    return;  }  StringC publicId;  param_.swap(publicId);  if (!parseArg())    return;  catalog_->addPublicId(publicId, param_, paramLoc_, override_);}void CatalogParser::parseDelegate(){  if (parseParam(minimumLiteral) != literalParam) {    message(CatalogMessages::literalExpected);    return;  }  StringC publicId;  param_.swap(publicId);  if (!parseArg())    return;  catalog_->addDelegate(publicId, param_, paramLoc_, override_);}void CatalogParser::parseDtddecl(){  message(CatalogMessages::dtddeclNotSupported);  if (parseParam(minimumLiteral) != literalParam) {    message(CatalogMessages::literalExpected);    return;  }  if (!parseArg())    return;}void CatalogParser::parseSystem(){  if (!parseArg())    return;  StringC systemId;  param_.swap(systemId);  Param parm = parseParam();  if (parm == nameParam)    message(CatalogMessages::systemShouldQuote);  else if (parm != literalParam) {    message(CatalogMessages::literalExpected);    return;  }  catalog_->addSystemId(systemId, param_, paramLoc_);}void CatalogParser::parseNameMap(EntityDecl::DeclType declType){  if (!parseArg())    return;  StringC name;  param_.swap(name);  if (!parseArg())    return;  catalog_->addName(name, declType, param_, paramLoc_, override_);}Boolean CatalogParser::parseArg(){  Param parm = parseParam();  if (parm != nameParam && parm != literalParam) {    message(CatalogMessages::nameOrLiteralExpected);    return false;  }  return true;}CatalogParser::Param CatalogParser::parseParam(unsigned flags){  for (;;) {    Xchar c = get();    switch (categoryTable_[c]) {    case eof:      return eofParam;    case lit:    case lita:      parseLiteral(c, flags);      return literalParam;    case s:      break;    case nul:      message(CatalogMessages::nulChar);      break;    case minus:      c = get();      if (c == minus_) {	skipComment();	break;      }      unget();      // fall through    default:      parseName();      return nameParam;    }  }}void CatalogParser::skipComment(){  for (;;) {    Xchar c = get();    if (c == minus_) {      c = get();      if (c == minus_)	break;    }    if (c == InputSource::eE) {      message(CatalogMessages::eofInComment);      break;    }  }}void CatalogParser::parseLiteral(Char delim, unsigned flags){  paramLoc_ = in_->currentLocation();  enum { no, yesBegin, yesMiddle } skipping = yesBegin;  param_.resize(0);  for (;;) {    Xchar c = get();    if (c == InputSource::eE) {      message(CatalogMessages::eofInLiteral);      break;    }    if (Char(c) == delim)      break;    if (flags & minimumLiteral) {      if (!isMinimumData(c))	message(CatalogMessages::minimumData);      if (c == rs_)	;      else if (c == space_ || c == re_) {	if (skipping == no) {	  param_ += space_;	  skipping = yesMiddle;	}      }      else {	skipping = no;	param_ += Char(c);      }    }    else      param_ += Char(c);  }  if (skipping == yesMiddle)    param_.resize(param_.size() - 1);}void CatalogParser::parseName(){  paramLoc_ = in_->currentLocation();  size_t length;  for (length = 1;; length++) {    Xchar c = in_->tokenChar(messenger());    int cat = categoryTable_[c];    if (cat == eof || cat == s)      break;    // FIXME maybe check for LIT or LITA    if (cat == nul)      message(CatalogMessages::nulChar);  }  in_->endToken(length);  param_.assign(in_->currentTokenStart(), in_->currentTokenLength());}void CatalogParser::upcase(StringC &str){  for (size_t i = 0; i < str.size(); i++)    substTable_.subst(str[i]);}void CatalogParser::dispatchMessage(const Message &msg){  mgr_->dispatchMessage(msg);}void CatalogParser::dispatchMessage(Message &msg){  mgr_->dispatchMessage(msg);}void CatalogParser::initMessage(Message &msg){  msg.loc = in_->currentLocation();}#ifdef SP_NAMESPACE}#endif

⌨️ 快捷键说明

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