|
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
|