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

📄 markup.cxx

📁 SP是一个基于GNU C++编译器
💻 CXX
字号:
// Copyright (c) 1995 James Clark// See the file COPYING for copying permission.#ifdef __GNUG__#pragma implementation#endif#include "splib.h"#include "Markup.h"#include "InputSource.h"#include "Location.h"#include "macros.h"#include "Entity.h"#ifdef SP_NAMESPACEnamespace SP_NAMESPACE {#endifMarkupItem::MarkupItem(): type(Markup::delimiter), index(0){}MarkupItem::~MarkupItem(){  switch (type) {  case Markup::entityStart:    delete origin;    break;  case Markup::literal:    delete text;    break;  case Markup::sdLiteral:    delete sdText;    break;  }}MarkupItem::MarkupItem(const MarkupItem &item): type(item.type), index(item.index){  switch (item.type) {  case Markup::entityStart:    origin = new ConstPtr<Origin>(*item.origin);    break;  case Markup::literal:    text = new Text(*item.text);    break;  case Markup::sdLiteral:    sdText = new SdText(*item.sdText);    break;  case Markup::delimiter:    break;  default:    nChars = item.nChars;    break;  }}void MarkupItem::operator=(const MarkupItem &item){  switch (type) {  case Markup::entityStart:    if (item.type == Markup::entityStart) {      *origin = *item.origin;      return;    }    delete origin;    break;  case Markup::literal:    if (item.type == Markup::literal) {      *text = *item.text;      return;    }    delete text;    break;  case Markup::sdLiteral:    if (item.type == Markup::sdLiteral) {      *sdText = *item.sdText;      return;    }    delete sdText;    break;  }  type = item.type;  index = item.index;  switch (item.type) {  case Markup::entityStart:    origin = new ConstPtr<Origin>(*item.origin);    break;  case Markup::literal:    text = new Text(*item.text);    break;  case Markup::sdLiteral:    sdText = new SdText(*item.sdText);    break;  case Markup::delimiter:    break;  default:    nChars = item.nChars;    break;  }}Markup::Markup(){}void Markup::resize(size_t n){  size_t chopChars = 0;  for (size_t i = n; i < items_.size(); i++)    switch (items_[i].type) {    case Markup::reservedName:    case Markup::sdReservedName:    case Markup::name:    case Markup::nameToken:    case Markup::number:    case Markup::attributeValue:    case Markup::s:    case Markup::comment:    case Markup::shortref:      chopChars += items_[i].nChars;      break;    }  items_.resize(n);  chars_.resize(chars_.size() - chopChars);}void Markup::addDelim(Syntax::DelimGeneral d){  items_.resize(items_.size() + 1);  MarkupItem &item = items_.back();  item.type = Markup::delimiter;  item.index = d;}void Markup::addReservedName(Syntax::ReservedName rn, const InputSource *in){  items_.resize(items_.size() + 1);  MarkupItem &item = items_.back();  size_t length = in->currentTokenLength();  item.nChars = length;  item.type = Markup::reservedName;  item.index = rn;  chars_.append(in->currentTokenStart(), length);}void Markup::addReservedName(Syntax::ReservedName rn, const StringC &str){  items_.resize(items_.size() + 1);  MarkupItem &item = items_.back();  item.nChars = str.size();  item.type = Markup::reservedName;  item.index = rn;  chars_.append(str.data(), str.size());}void Markup::addSdReservedName(Sd::ReservedName rn, const InputSource *in){  items_.resize(items_.size() + 1);  MarkupItem &item = items_.back();  size_t length = in->currentTokenLength();  item.nChars = length;  item.type = Markup::sdReservedName;  item.index = rn;  chars_.append(in->currentTokenStart(), length);}void Markup::addSdReservedName(Sd::ReservedName rn,			       const Char *str, size_t length){  items_.resize(items_.size() + 1);  MarkupItem &item = items_.back();  item.nChars = length;  item.type = Markup::sdReservedName;  item.index = rn;  chars_.append(str, length);}void Markup::addS(Char c){  if (items_.size() > 0) {    MarkupItem &item = items_.back();    if (item.type == Markup::s) {      item.nChars += 1;      chars_ += c;      return;    }  }  items_.resize(items_.size() + 1);  MarkupItem &item = items_.back();  item.type = Markup::s;  item.nChars = 1;  chars_ += c;}void Markup::addS(const InputSource *in){  items_.resize(items_.size() + 1);  MarkupItem &item = items_.back();  size_t length = in->currentTokenLength();  item.nChars = length;  item.type = Markup::s;  chars_.append(in->currentTokenStart(), length);}void Markup::addCommentStart(){  items_.resize(items_.size() + 1);  MarkupItem &item = items_.back();  item.type = Markup::comment;  item.nChars = 0;}void Markup::addRefEndRe(){  items_.resize(items_.size() + 1);  MarkupItem &item = items_.back();  item.type = Markup::refEndRe;}void Markup::addCommentChar(Char c){  items_.back().nChars += 1;  chars_ += c;}void Markup::addName(const InputSource *in){  items_.resize(items_.size() + 1);  MarkupItem &item = items_.back();  size_t length = in->currentTokenLength();  item.nChars = length;  item.type = Markup::name;  chars_.append(in->currentTokenStart(), length);}void Markup::addName(const Char *str, size_t length){  items_.resize(items_.size() + 1);  MarkupItem &item = items_.back();  item.nChars = length;  item.type = Markup::name;  chars_.append(str, length);}void Markup::addNumber(const InputSource *in){  items_.resize(items_.size() + 1);  MarkupItem &item = items_.back();  size_t length = in->currentTokenLength();  item.nChars = length;  item.type = Markup::number;  chars_.append(in->currentTokenStart(), length);}void Markup::addNameToken(const InputSource *in){  items_.resize(items_.size() + 1);  MarkupItem &item = items_.back();  size_t length = in->currentTokenLength();  item.nChars = length;  item.type = Markup::nameToken;  chars_.append(in->currentTokenStart(), length);}void Markup::addAttributeValue(const InputSource *in){  items_.resize(items_.size() + 1);  MarkupItem &item = items_.back();  size_t length = in->currentTokenLength();  item.nChars = length;  item.type = Markup::attributeValue;  chars_.append(in->currentTokenStart(), length);}void Markup::addShortref(const InputSource *in){  items_.resize(items_.size() + 1);  MarkupItem &item = items_.back();  size_t length = in->currentTokenLength();  item.nChars = length;  item.type = Markup::shortref;  chars_.append(in->currentTokenStart(), length);}void Markup::addEntityStart(const Ptr<EntityOrigin> &origin){  items_.resize(items_.size() + 1);  MarkupItem &item = items_.back();  item.type = Markup::entityStart;  item.origin = new ConstPtr<Origin>(origin.pointer());}void Markup::addEntityEnd(){  items_.resize(items_.size() + 1);  items_.back().type = Markup::entityEnd;}void Markup::addLiteral(const Text &text){  items_.resize(items_.size() + 1);  MarkupItem &item = items_.back();  item.type = Markup::literal;  item.text = new Text(text);}void Markup::addSdLiteral(const SdText &sdText){  items_.resize(items_.size() + 1);  MarkupItem &item = items_.back();  item.type = Markup::sdLiteral;  item.sdText = new SdText(sdText);}void Markup::changeToAttributeValue(size_t i){  ASSERT(items_[i].type == Markup::name);  items_[i].type = Markup::attributeValue;}void Markup::changeToSdReservedName(size_t i, Sd::ReservedName rn){  ASSERT(items_[i].type == Markup::name);  items_[i].type = Markup::sdReservedName;  items_[i].index = rn;}void Markup::swap(Markup &to){  chars_.swap(to.chars_);  items_.swap(to.items_);}MarkupIter::MarkupIter(const Markup &m): chars_(m.chars_.data()),  items_(m.items_.begin()),  nItems_(m.items_.size()),  index_(0),  charIndex_(0){}void MarkupIter::advance(Location &loc,			 const ConstPtr<Syntax> &syntax){  switch (items_[index_].type) {  case Markup::delimiter:    loc += syntax->delimGeneral(delimGeneral()).size();    break;  case Markup::refEndRe:    loc += 1;    break;  case Markup::reservedName:  case Markup::sdReservedName:  case Markup::name:  case Markup::nameToken:  case Markup::number:  case Markup::attributeValue:  case Markup::s:  case Markup::shortref:    loc += items_[index_].nChars;    charIndex_ += items_[index_].nChars;    break;  case Markup::comment:    loc += items_[index_].nChars + (2 * syntax->delimGeneral(Syntax::dCOM).size());    charIndex_ += items_[index_].nChars;    break;  case Markup::entityStart:    loc = Location(*items_[index_].origin, 0);    break;  case Markup::entityEnd:    {      ConstPtr<Origin> origin(loc.origin());      loc = origin->parent();      loc += origin->refLength();    }    break;  case Markup::literal:    {      const Text &text = *items_[index_].text;      text.endDelimLocation(loc);      Boolean lita;      text.delimType(lita);      loc	+= syntax->delimGeneral(lita ? Syntax::dLITA : Syntax::dLIT).size();    }    break;  case Markup::sdLiteral:    {      const SdText &text = *items_[index_].sdText;      loc = text.endDelimLocation();      loc += 1;    }    break;  }  index_++;}void MarkupIter::advance(){  switch (items_[index_].type) {  case Markup::reservedName:  case Markup::sdReservedName:  case Markup::name:  case Markup::nameToken:  case Markup::number:  case Markup::attributeValue:  case Markup::s:  case Markup::comment:  case Markup::shortref:    charIndex_ += items_[index_].nChars;    break;  }  index_++;}#ifdef SP_NAMESPACE}#endif

⌨️ 快捷键说明

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