Blame lib/Markup.cxx

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