📄 soentitycatalog.cxx
字号:
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 + -