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

📄 extendentitymanager.cxx

📁 SP是一个基于GNU C++编译器
💻 CXX
📖 第 1 页 / 共 4 页
字号:
		     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 + -