📄 extendentitymanager.cxx
字号:
StringMessageArg(token)); hadTracking = 1; } else if (matchKey(token, "ZAPEOF")) { if (sos.storageManager->requiredCodingSystem()) mgr_.message(EntityManagerMessages::fsiZapeofNotApplicable); else if (hadZapeof) mgr_.message(EntityManagerMessages::fsiDuplicateAttribute, StringMessageArg(token)); else if (gotValue) { if (matchKey(value, "ZAPEOF")) sos.zapEof = 1; else if (matchKey(value, "NOZAPEOF")) sos.zapEof = 0; else mgr_.message(EntityManagerMessages::fsiBadZapeof, StringMessageArg(value)); } else sos.zapEof = 1; hadZapeof = 1; } else if (matchKey(token, "NOZAPEOF")) { if (sos.storageManager->requiredCodingSystem()) mgr_.message(EntityManagerMessages::fsiZapeofNotApplicable); else if (hadZapeof) mgr_.message(EntityManagerMessages::fsiDuplicateAttribute, StringMessageArg(idCharset_.execToDesc("ZAPEOF"))); else if (gotValue) mgr_.message(EntityManagerMessages::fsiValueAsName, StringMessageArg(token)); else sos.zapEof = 0; hadZapeof = 1; } else if (matchKey(token, "SEARCH")) { if (hadSearch) mgr_.message(EntityManagerMessages::fsiDuplicateAttribute, StringMessageArg(token)); else if (gotValue) { if (matchKey(value, "SEARCH")) sos.search = 1; else if (matchKey(value, "NOSEARCH")) sos.search = 0; else mgr_.message(EntityManagerMessages::fsiBadSearch, StringMessageArg(value)); } else sos.search = 1; hadSearch = 1; } else if (matchKey(token, "NOSEARCH")) { if (hadSearch) mgr_.message(EntityManagerMessages::fsiDuplicateAttribute, StringMessageArg(idCharset_.execToDesc("SEARCH"))); else if (gotValue) mgr_.message(EntityManagerMessages::fsiValueAsName, StringMessageArg(token)); else sos.search = 0; hadSearch = 1; } else if (matchKey(token, "FOLD")) { if (!neutral) mgr_.message(EntityManagerMessages::fsiFoldNotNeutral); else if (hadFold) mgr_.message(EntityManagerMessages::fsiDuplicateAttribute, StringMessageArg(token)); else if (gotValue) { if (matchKey(value, "FOLD")) fold = 1; else if (matchKey(value, "NOFOLD")) fold = 0; else mgr_.message(EntityManagerMessages::fsiBadFold, StringMessageArg(value)); } else fold = 1; hadFold = 1; } else if (matchKey(token, "NOFOLD")) { if (!neutral) mgr_.message(EntityManagerMessages::fsiFoldNotNeutral); else if (hadFold) mgr_.message(EntityManagerMessages::fsiDuplicateAttribute, StringMessageArg(idCharset_.execToDesc("FOLD"))); else if (gotValue) mgr_.message(EntityManagerMessages::fsiValueAsName, StringMessageArg(token)); else fold = 0; hadFold = 1; } else if (matchKey(token, "SMCRD")) { if (hadSmcrd) mgr_.message(EntityManagerMessages::fsiDuplicateAttribute, StringMessageArg(token)); else if (gotValue) { if (value.size() == 0) smcrd = -1; else if (value.size() == 1) smcrd = value[0]; else mgr_.message(EntityManagerMessages::fsiBadSmcrd, StringMessageArg(value)); } else mgr_.message(EntityManagerMessages::fsiMissingValue, StringMessageArg(token)); hadSmcrd = 1; } else if (matchKey(token, "RECORDS")) { if (sos.storageManager->requiresCr()) mgr_.message(EntityManagerMessages::fsiRecordsNotApplicable); else if (hadRecords) mgr_.message(EntityManagerMessages::fsiDuplicateAttribute, StringMessageArg(token)); else if (gotValue) { if (!lookupRecords(value, sos.records)) mgr_.message(EntityManagerMessages::fsiUnsupportedRecords, StringMessageArg(value)); } else mgr_.message(EntityManagerMessages::fsiMissingValue, StringMessageArg(token)); hadRecords = 1; } else if (matchKey(token, "SOIBASE")) { if (hadBase) mgr_.message(EntityManagerMessages::fsiDuplicateAttribute, StringMessageArg(token)); else if (gotValue) value.swap(sos.baseId); else { mgr_.message(EntityManagerMessages::fsiMissingValue, StringMessageArg(token)); sos.baseId.resize(0); } hadBase = 1; } else if (lookupRecords(token, records)) { if (sos.storageManager->requiresCr()) mgr_.message(EntityManagerMessages::fsiRecordsNotApplicable); else if (hadRecords) mgr_.message(EntityManagerMessages::fsiDuplicateAttribute, StringMessageArg(idCharset_.execToDesc("RECORDS"))); else if (!gotValue) sos.records = records; else mgr_.message(EntityManagerMessages::fsiValueAsName, StringMessageArg(token)); hadRecords = 1; } else if (matchKey(token, "NOTRACK")) { if (hadTracking) mgr_.message(EntityManagerMessages::fsiDuplicateAttribute, StringMessageArg(idCharset_.execToDesc("TRACKING"))); else if (!gotValue) sos.notrack = 1; else mgr_.message(EntityManagerMessages::fsiValueAsName, StringMessageArg(token)); hadTracking = 1; } else if (matchKey(token, "TRACK")) { if (hadTracking) mgr_.message(EntityManagerMessages::fsiDuplicateAttribute, StringMessageArg(idCharset_.execToDesc("TRACKING"))); else if (gotValue) mgr_.message(EntityManagerMessages::fsiValueAsName, StringMessageArg(token)); hadTracking = 1; } else mgr_.message(gotValue ? EntityManagerMessages::fsiUnsupportedAttribute : EntityManagerMessages::fsiUnsupportedAttributeToken, StringMessageArg(token)); } if (hadBase && sos.baseId.size() > 0) { convertId(sos.baseId, smcrd, sos.storageManager); if (neutral) { if (!sos.storageManager->transformNeutral(sos.baseId, fold, mgr_)) sos.baseId.resize(0); } } if (!hadZapeof && hadRecords && sos.records == StorageObjectSpec::asis) sos.zapEof = 0; return 1;}FSIParser::RecordType FSIParser::recordTypeTable[] = { { "FIND", StorageObjectSpec::find }, { "ASIS", StorageObjectSpec::asis }, { "CR", StorageObjectSpec::cr }, { "LF", StorageObjectSpec::lf }, { "CRLF", StorageObjectSpec::crlf }};const char *FSIParser::recordsName(StorageObjectSpec::Records records){ for (size_t i = 0; i < SIZEOF(recordTypeTable); i++) if (records == recordTypeTable[i].value) return recordTypeTable[i].name; return 0;}Boolean FSIParser::lookupRecords(const StringC &token, StorageObjectSpec::Records &result){ for (size_t i = 0; i < SIZEOF(recordTypeTable); i++) if (matchKey(token, recordTypeTable[i].name)) { result = recordTypeTable[i].value; return 1; } return 0;}void FSIParser::setDefaults(StorageObjectSpec &sos){ if (sos.storageManager->requiresCr()) sos.records = StorageObjectSpec::cr; else if (isNdata_ || (defSpec_ && defSpec_->records == StorageObjectSpec::asis)) sos.records = StorageObjectSpec::asis; if (isNdata_ || (defSpec_ && !defSpec_->zapEof)) sos.zapEof = 0; if (defSpec_ && defSpec_->storageManager == sos.storageManager) { if (defId_) sos.baseId = *defId_; else { sos.baseId = defSpec_->specId; sos.storageManager->resolveRelative(defSpec_->baseId, sos.baseId, 0); } } sos.codingSystem = sos.storageManager->requiredCodingSystem(); if (sos.codingSystem) { sos.zapEof = 0; // hack sos.codingSystemType = StorageObjectSpec::special; } else { sos.codingSystem = em_->defaultCodingSystem_; sos.codingSystemType = (em_->internalCharsetIsDocCharset_ ? StorageObjectSpec::bctf : StorageObjectSpec::encoding); if (isNdata_) { sos.codingSystem = em_->codingSystemKit_->identityInputCodingSystem(); sos.codingSystemType = StorageObjectSpec::special; } else if (defSpec_) { sos.codingSystem = defSpec_->codingSystem; sos.codingSystemName = defSpec_->codingSystemName; sos.codingSystemType = defSpec_->codingSystemType; } }}Boolean FSIParser::parseAttribute(StringC &token, Boolean &gotValue, StringC &value){ Xchar c = get(); while (isS(c)) c = get(); if (c == -1) { return 0; } token.resize(0); if (matchChar(c, '>')) return 1; if (matchChar(c, '"') || matchChar(c, '\'') || matchChar(c, '=')) return 0; for (;;) { token += c; c = get(); if (c == -1) return 0; if (isS(c)) break; if (matchChar(c, '>') || matchChar(c, '=')) break; } while (isS(c)) c = get(); if (c == -1) return 0; if (!matchChar(c, '=')) { unget(); gotValue = 0; return 1; } gotValue = 1; value.resize(0); c = get(); while (isS(c)) c = get(); if (matchChar(c, '>') || matchChar(c, '=')) return 0; if (matchChar(c, '"') || matchChar(c, '\'')) { Char lit = c; for (;;) { Xchar c = get(); if (c == lit) break; if (c == -1) return 0; if (matchChar(c, '\n')) ; else if (matchChar(c, '\r') || matchChar(c, '\t')) value += idCharset_.execToDesc(' '); else value += c; } uncharref(value); } else { for (;;) { value += c; c = get(); if (c == -1) return 0; if (isS(c)) break; if (matchChar(c, '>') || matchChar(c, '=')) { unget(); break; } } } return 1;}void FSIParser::uncharref(StringC &str){ size_t j = 0; size_t i = 0; while (i < str.size()) { int digit; if (matchChar(str[i], '&') && i + 2 < str.size() && matchChar(str[i + 1], '#') && convertDigit(str[i + 2], digit)) { unsigned long val = digit; i += 3; while (i < str.size() && convertDigit(str[i], digit)) { val = val*10 + digit; i++; } str[j++] = val; if (i < str.size() && matchChar(str[i], ';')) i++; } else str[j++] = str[i++]; } str.resize(j);}Boolean FSIParser::convertId(StringC &id, Xchar smcrd, const StorageManager *sm){ const CharsetInfo *smCharset = sm->idCharset(); StringC newId; size_t i = 0; while (i < id.size()) { UnivChar univ; WideChar wide; ISet<WideChar> wideSet; int digit; if (Xchar(id[i]) == smcrd && i + 1 < id.size() && convertDigit(id[i + 1], digit)) { i += 2; Char val = digit; while (i < id.size() && convertDigit(id[i], digit)) { val = val*10 + digit; i++; } newId += val; if (i < id.size() && matchChar(id[i], ';')) i++; } else if (smCharset) { if (!idCharset_.descToUniv(id[i++], univ)) return 0; if (univ == UnivCharsetDesc::rs) ; else if (univ == UnivCharsetDesc::re && sm->reString()) newId += *sm->reString(); else if (smCharset->univToDesc(univ, wide, wideSet) != 1 || wide > charMax) return 0; // FIXME give error else newId += Char(wide); } else newId += id[i++]; } newId.swap(id); return 1;}ParsedSystemId:: ParsedSystemId(){}staticvoid unparseSoi(const StringC &soi, const CharsetInfo *idCharset, const CharsetInfo &resultCharset, StringC &result, Boolean &needSmcrd);void ParsedSystemId::unparse(const CharsetInfo &resultCharset, Boolean isNdata, StringC &result) const{ size_t len = size(); result.resize(0); size_t i; for (i = 0; i < maps.size(); i++) { if (maps[i].type == Map::catalogDocument) result += resultCharset.execToDesc("<CATALOG>"); else if (maps[i].type == Map::catalogPublic) { result += resultCharset.execToDesc("<CATALOG PUBLIC=\""); result += maps[i].publicId; result += resultCharset.execToDesc("\">"); } } for (i = 0; i < len; i++) { const StorageObjectSpec &sos = (*this)[i]; result += resultCharset.execToDesc('<'); result += resultCharset.execToDesc(sos.storageManager->type()); if (sos.notrack) result += resultCharset.execToDesc(" NOTRACK"); if (!sos.search) result += resultCharset.execToDesc(" NOSEARCH"); if (!sos.storageManager->requiresCr() && sos.records != (isNdata ? StorageObjectSpec::asis : StorageObjectSpec::find)) { result += resultCharset.execToDesc(' '); result += resultCharset.execToDesc(FSIParser::recordsName(sos.records)); } if (sos.codingSystemName && sos.codingSystemType != StorageObjectSpec::special) { if (!sos.zapEof) result += resultCharset.execToDesc(" NOZAPEOF"); result += resultCharset.execToDesc(sos.codingSystemType == StorageObjectSpec::bctf ? " BCTF=" : " ENCODING="); result += resultCharset.execToDesc(sos.codingSystemName); } Boolean needSmcrd = 0; if (sos.baseId.size() != 0) { result += resultCharset.execToDesc(" SOIBASE='"); unparseSoi(sos.baseId, sos.storageManager->idCharset(), resultCharset, result, needSmcrd); result += resultCharset.execToDesc('\''); } StringC tem; unparseSoi(sos.specId, sos.storageManager->idCharset(), resultCharset, tem, needSmcrd); if (needSmcrd) result += resultCharset.execToDesc(" SMCRD='^'"); result += resultCharset.execToDesc('>'); result += tem; }}void unparseSoi(const StringC &soi, const CharsetInfo *idCharset, const CharsetInfo &resultCharset, StringC &result, Boolean &needSmcrd){ if (!idCharset) { for (size_t i = 0; i < soi.size(); i++) { char buf[32]; sprintf(buf, "&#%lu;", (unsigned long)soi[i]); result += resultCharset.execToDesc(buf); } return; } for (size_t i = 0; i < soi.size(); i++) { UnivChar univ; WideChar to; ISet<WideChar> toSet; if (!idCharset->descToUniv(soi[i], univ) || univ >= 127 || univ < 32 || univ == 36 // $ || univ == 96 // `#ifndef MSDOS_FILENAMES || univ == 92 // backslash#endif || univ == 94 // ^ || resultCharset.univToDesc(univ, to, toSet) != 1) { needSmcrd = 1; char buf[32]; sprintf(buf, "^%lu;", (unsigned long)soi[i]); result += resultCharset.execToDesc(buf); } else { switch (univ) { case 34: // double quote case 35: // # case 39: // apostrophe case 60: // < { char buf[32]; sprintf(buf, "&#%lu;", (unsigned long)to); result += resultCharset.execToDesc(buf); } break; default: result += Char(to); break; } } }}#ifdef SP_NAMESPACE}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -