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

📄 messagereporter.cxx

📁 SP是一个基于GNU C++编译器
💻 CXX
字号:
// Copyright (c) 1994, 1995 James Clark// See the file COPYING for copying permission.#ifdef __GNUG__#pragma implementation#endif#include "splib.h"#include "MessageReporter.h"#include "MessageReporterMessages.h"#include "ExtendEntityManager.h"#include "StorageManager.h"#include "macros.h"#include <string.h>#ifdef SP_NAMESPACEnamespace SP_NAMESPACE {#endifconst OutputCharStream::Newline nl = OutputCharStream::newline;MessageReporter::MessageReporter(OutputCharStream *os): os_(os), options_(0){}MessageReporter::~MessageReporter(){  delete os_;}void MessageReporter::setMessageStream(OutputCharStream *os){  if (os != os_) {    delete os_;    os_ = os;  }}void MessageReporter::addOption(Option option){  options_ |= option;}void MessageReporter::dispatchMessage(const Message &message){  Offset off;  const ExternalInfo *externalInfo = locationHeader(message.loc, off);  if (programName_.size())    os() << programName_ << ':';  if (externalInfo) {    printLocation(externalInfo, off);    os() << ':';  }  if (options_ & messageNumbers)    os() << (unsigned long)message.type->module() << "."       << (unsigned long)message.type->number() << ":";  switch (message.type->severity()) {  case MessageType::info:    formatFragment(MessageReporterMessages::infoTag, os());    break;  case MessageType::warning:    formatFragment(MessageReporterMessages::warningTag, os());    break;  case MessageType::quantityError:    formatFragment(MessageReporterMessages::quantityErrorTag, os());    break;  case MessageType::idrefError:    formatFragment(MessageReporterMessages::idrefErrorTag, os());    break;  case MessageType::error:    formatFragment(MessageReporterMessages::errorTag, os());    break;  default:    CANNOT_HAPPEN();  }  os() << ": ";  formatMessage(*message.type, message.args, os());  os() << nl;  if (!message.auxLoc.origin().isNull()) {    Offset off;    const ExternalInfo *externalInfo = locationHeader(message.auxLoc, off);    if (programName_.size())      os() << programName_ << ':';    if (externalInfo) {      printLocation(externalInfo, off);      os() << ": ";    }    formatMessage(message.type->auxFragment(), message.args, os());    os() << nl;  }  if ((options_ & openElements) && message.openElementInfo.size() > 0) {    if (programName_.size())      os() << programName_ << ':';    if (externalInfo) {      printLocation(externalInfo, off);      os() << ": ";    }    formatFragment(MessageReporterMessages::openElements, os());    os() << ':';    formatOpenElements(message.openElementInfo, os());    os() << nl;  }  os().flush();}// Note this is written so as not to change any reference counts.const ExternalInfo *MessageReporter::locationHeader(const Location &loc,						    Offset &off){  return locationHeader(loc.origin().pointer(), loc.index(), off);}const ExternalInfo *MessageReporter::locationHeader(const Origin *origin,						    Index index,						    Offset &off){   if (!(options_ & openEntities)) {    while (origin) {      const ExternalInfo *externalInfo = origin->externalInfo();      if (externalInfo) {  	off = origin->startOffset(index);	return externalInfo;      }      const Location &loc = origin->parent();      if (loc.origin().isNull()) {	if (!origin->defLocation(origin->startOffset(index), origin, index))	  break;      }      else {	index = loc.index() + origin->refLength();	origin = loc.origin().pointer();      }    }  }  else {    Boolean doneHeader = 0;    while (origin) {      if (origin->entityName() || origin->parent().origin().isNull()) {	if (!doneHeader) {	  Offset parentOff;	  const Location &parentLoc = origin->parent();	  const ExternalInfo *parentInfo	    = locationHeader(parentLoc.origin().pointer(),			     parentLoc.index() + origin->refLength(),			     parentOff);	  if (parentInfo) {	    StringC text;	    if (getMessageText(origin->entityName()			       ? MessageReporterMessages::inNamedEntity			       : MessageReporterMessages::inUnnamedEntity,				text)) {	      for (size_t i = 0; i < text.size(); i++) {		if (text[i] == '%') {		  if (i + 1 < text.size()) {		    i++;		    if (text[i] == '1')		      os() << *origin->entityName();		    else if (text[i] == '2')		      printLocation(parentInfo, parentOff);		    else if (text[i] >= '3' && text[i] <= '9')		      ;		    else		      os().put(text[i]);		  }		}		else		  os().put(text[i]);	      }	      os() << nl;	    }	  }	  doneHeader = 1;	}	off = origin->startOffset(index);	const ExternalInfo *externalInfo = origin->externalInfo();	if (externalInfo)	  return externalInfo;	if (!origin->defLocation(off, origin, index))	  break;      }      else {	const Location &loc = origin->parent();	index = loc.index() + origin->refLength();	origin = loc.origin().pointer();      }    }  }  return 0;}void MessageReporter::printLocation(const ExternalInfo *externalInfo,				    Offset off){  if (!externalInfo) {    formatFragment(MessageReporterMessages::invalidLocation, os());    return;  }  StorageObjectLocation soLoc;  if (!ExtendEntityManager::externalize(externalInfo, off, soLoc)) {    formatFragment(MessageReporterMessages::invalidLocation, os());    return;  }  if (strcmp(soLoc.storageObjectSpec->storageManager->type(), "OSFILE") != 0)    os() << '<' << soLoc.storageObjectSpec->storageManager->type() << '>';  os() << soLoc.actualStorageId;  if (soLoc.lineNumber == (unsigned long)-1) {    os() << ": ";    formatFragment(MessageReporterMessages::offset, os());    os() << soLoc.storageObjectOffset;  }  else {    os() << ':' << soLoc.lineNumber;    if (soLoc.columnNumber != 0 && soLoc.columnNumber != (unsigned long)-1)      os() << ':' << soLoc.columnNumber - 1;  }#if 0  if (soLoc.byteIndex != (unsigned long)-1)    os() << ':' << soLoc.byteIndex;#endif}Boolean MessageReporter::getMessageText(const MessageFragment &frag,					StringC &str){  const char *p = frag.text();  if (!p)    return 0;  str.resize(0);  for (; *p; p++)    str += Char((unsigned char)*p);  return 1;}#ifdef SP_NAMESPACE}#endif

⌨️ 快捷键说明

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