Blame spam/CopyEventHandler.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 "config.h"
Packit 8a864e
#include "CopyEventHandler.h"
Packit 8a864e
#include "macros.h"
Packit 8a864e
Packit 8a864e
#ifdef SP_NAMESPACE
Packit 8a864e
namespace SP_NAMESPACE {
Packit 8a864e
#endif
Packit 8a864e
Packit 8a864e
inline
Packit 8a864e
OutputCharStream &operator<<(OutputCharStream &os, const MarkupIter &iter)
Packit 8a864e
{
Packit 8a864e
  return os.write(iter.charsPointer(), iter.charsLength());
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
#ifdef __GNUG__
Packit 8a864e
inline
Packit 8a864e
#endif
Packit 8a864e
Boolean CopyEventHandler::noOutput()
Packit 8a864e
{
Packit 8a864e
  if (inInstance_) {
Packit 8a864e
    if (normalizeFlags_ & normalizeExpand) {
Packit 8a864e
      if (entityLevel_ >= outputEntityLevel_)
Packit 8a864e
	return 0;
Packit 8a864e
    }
Packit 8a864e
    else {
Packit 8a864e
      if (entityLevel_ == outputEntityLevel_)
Packit 8a864e
	return 0;
Packit 8a864e
    }
Packit 8a864e
  }
Packit 8a864e
  else if (normalizeFlags_ & normalizeIncludeProlog) {
Packit 8a864e
    if (normalizeFlags_ & normalizeExpandProlog) {
Packit 8a864e
      if (entityLevel_ >= outputEntityLevel_)
Packit 8a864e
	return 0;
Packit 8a864e
    }
Packit 8a864e
    else {
Packit 8a864e
      if (entityLevel_ == outputEntityLevel_)
Packit 8a864e
	return 0;
Packit 8a864e
    }
Packit 8a864e
  }
Packit 8a864e
  return 1;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
inline
Packit 8a864e
Boolean CopyEventHandler::doNothing(Event *event)
Packit 8a864e
{
Packit 8a864e
  if (noOutput()) {
Packit 8a864e
    delete event;
Packit 8a864e
    return 1;
Packit 8a864e
  }
Packit 8a864e
  else
Packit 8a864e
    return 0;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
Packit 8a864e
inline
Packit 8a864e
void CopyEventHandler::withNamedCharRef(const StringC &str,
Packit 8a864e
					const Location &loc)
Packit 8a864e
{
Packit 8a864e
  withNamedCharRef(str.data(), str.size(), loc);
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
static
Packit 8a864e
void escape(OutputCharStream &s, Char c)
Packit 8a864e
{
Packit 8a864e
  s << "&#" << (unsigned long)c << ";";
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
CopyEventHandler::CopyEventHandler(OutputCharStream *os,
Packit 8a864e
				   unsigned normalizeFlags,
Packit 8a864e
				   const StringC &outputEntity)
Packit 8a864e
: os_(os), topOs_(os), inInstance_(0), entityLevel_(0),
Packit 8a864e
  normalizeFlags_(normalizeFlags), outputEntity_(outputEntity),
Packit 8a864e
  omittagHoist_(0), inSpecialMarkedSection_(0),
Packit 8a864e
  currentAttributes_(0), emptyElementNormal_(0)
Packit 8a864e
{
Packit 8a864e
  outputEntityLevel_ = outputEntity_.size() == 0 ? 0 : unsigned(-1);
Packit 8a864e
  os_->setEscaper(escape);
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
CopyEventHandler::~CopyEventHandler()
Packit 8a864e
{
Packit 8a864e
  delete os_;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
void CopyEventHandler::markup(const Location &loc,
Packit 8a864e
			      const Markup &markup)
Packit 8a864e
{
Packit 8a864e
  if (!noOutput())
Packit 8a864e
    outputMarkup(loc, markup);
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
void CopyEventHandler::sgmlDecl(SgmlDeclEvent *event)
Packit 8a864e
{
Packit 8a864e
  if (event->implySystemId().size() == 0
Packit 8a864e
      && !event->location().origin().isNull()
Packit 8a864e
      && (normalizeFlags_ & normalizeIncludeProlog)) {
Packit 8a864e
    syntax_ = event->refSyntaxPointer();
Packit 8a864e
    sd_ = event->refSdPointer();
Packit 8a864e
    outputMarkup(event->location(), event->markup());
Packit 8a864e
  }
Packit 8a864e
  syntax_ = event->prologSyntaxPointer();
Packit 8a864e
  instanceSyntax_ = event->instanceSyntaxPointer();
Packit 8a864e
  if (instanceSyntax_->namecaseGeneral())
Packit 8a864e
    instanceSyntax_->generalSubstTable()->inverseTable(lowerSubst_);
Packit 8a864e
  else if (instanceSyntax_->namecaseEntity())
Packit 8a864e
    instanceSyntax_->entitySubstTable()->inverseTable(lowerSubst_);
Packit 8a864e
  sd_ = event->sdPointer();
Packit 8a864e
  emptyElementNormal_ = sd_->emptyElementNormal();
Packit 8a864e
  delete event;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
void CopyEventHandler::endProlog(EndPrologEvent *event)
Packit 8a864e
{
Packit 8a864e
  inInstance_ = 1;
Packit 8a864e
  syntax_ = instanceSyntax_;
Packit 8a864e
  delete event;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
void CopyEventHandler::data(DataEvent *event)
Packit 8a864e
{
Packit 8a864e
  omittagHoist_ = 0;
Packit 8a864e
  if (doNothing(event))
Packit 8a864e
    return;
Packit 8a864e
  if (event->entity())
Packit 8a864e
    entityRef(event->location().origin()->asEntityOrigin());
Packit 8a864e
  else {
Packit 8a864e
    size_t n = event->dataLength();
Packit 8a864e
    unsigned long dummy;
Packit 8a864e
    if (n > 1 || !event->isRe(dummy))
Packit 8a864e
      writeData(event->data(), n, event->location());
Packit 8a864e
  }
Packit 8a864e
  delete event;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
void CopyEventHandler::nonSgmlChar(NonSgmlCharEvent *event)
Packit 8a864e
{
Packit 8a864e
  omittagHoist_ = 0;
Packit 8a864e
  if (doNothing(event))
Packit 8a864e
    return;
Packit 8a864e
  Char c = event->character();
Packit 8a864e
  writeData(&c, 1, event->location());
Packit 8a864e
  delete event;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
void CopyEventHandler::writeData(const Char *p, size_t n,
Packit 8a864e
				 const Location &loc)
Packit 8a864e
{
Packit 8a864e
  const Markup *markupPtr;
Packit 8a864e
  if (n == 1 && loc.origin()->isNumericCharRef(markupPtr)) {
Packit 8a864e
    if (markupPtr)
Packit 8a864e
      outputMarkup(loc.origin()->parent(), *markupPtr);
Packit 8a864e
  }
Packit 8a864e
  else
Packit 8a864e
    withNamedCharRef(p, n, loc);
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
void CopyEventHandler::withNamedCharRef(const Char *p, size_t n,
Packit 8a864e
					const Location &loc)
Packit 8a864e
{
Packit 8a864e
  if (n > 0) {
Packit 8a864e
    const Origin *origin = loc.origin().pointer();
Packit 8a864e
    if (origin) {
Packit 8a864e
      NamedCharRef ref;
Packit 8a864e
      if (origin->isNamedCharRef(loc.index(), ref)) {
Packit 8a864e
	Markup markup;
Packit 8a864e
	markup.addDelim(Syntax::dCRO);
Packit 8a864e
	markup.addName(ref.origName().data(), ref.origName().size());
Packit 8a864e
	switch (ref.refEndType()) {
Packit 8a864e
	case NamedCharRef::endOmitted:
Packit 8a864e
	  break;
Packit 8a864e
	case NamedCharRef::endRE:
Packit 8a864e
	  markup.addRefEndRe();
Packit 8a864e
	  break;
Packit 8a864e
	case NamedCharRef::endRefc:
Packit 8a864e
	  markup.addDelim(Syntax::dREFC);
Packit 8a864e
	  break;
Packit 8a864e
	}
Packit 8a864e
	outputMarkup(Location(loc.origin(), ref.refStartIndex()), markup);
Packit 8a864e
	p++;
Packit 8a864e
	n--;
Packit 8a864e
      }
Packit 8a864e
    }
Packit 8a864e
  }
Packit 8a864e
  os().write(p, n);
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
void CopyEventHandler::reOrigin(ReOriginEvent *event)
Packit 8a864e
{
Packit 8a864e
  omittagHoist_ = 0;
Packit 8a864e
  if (doNothing(event))
Packit 8a864e
    return;
Packit 8a864e
  Char c = event->re();
Packit 8a864e
  withNamedCharRef(&c, 1, event->location());
Packit 8a864e
  delete event;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
void CopyEventHandler::sSep(SSepEvent *event)
Packit 8a864e
{
Packit 8a864e
  if (doNothing(event))
Packit 8a864e
    return;
Packit 8a864e
  withNamedCharRef(event->data(), event->dataLength(), event->location());
Packit 8a864e
  delete event;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
void CopyEventHandler::ignoredRs(IgnoredRsEvent *event)
Packit 8a864e
{
Packit 8a864e
  if (doNothing(event))
Packit 8a864e
    return;
Packit 8a864e
  Char c = event->rs();
Packit 8a864e
  withNamedCharRef(&c, 1, event->location());
Packit 8a864e
  delete event;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
void CopyEventHandler::startElement(StartElementEvent *event)
Packit 8a864e
{
Packit 8a864e
  mustOmitEnd_ = event->mustOmitEnd();
Packit 8a864e
  const Markup *markup = event->markupPtr();
Packit 8a864e
  if (!markup) {
Packit 8a864e
    if (normalizeFlags_ & normalizeExpand) {
Packit 8a864e
      if (outputEntityLevel_ > entityLevel_ - omittagHoist_) {
Packit 8a864e
	delete event;
Packit 8a864e
	return;
Packit 8a864e
      }
Packit 8a864e
      if (omittagHoist_ >= entityStack_.size())
Packit 8a864e
	os_ = topOs_;
Packit 8a864e
    }
Packit 8a864e
    else if (entityLevel_ - omittagHoist_ != outputEntityLevel_) {
Packit 8a864e
      delete event;
Packit 8a864e
      return;
Packit 8a864e
    }
Packit 8a864e
  }
Packit 8a864e
  else {
Packit 8a864e
    omittagHoist_ = 0;
Packit 8a864e
    if (doNothing(event))
Packit 8a864e
      return;
Packit 8a864e
  }
Packit 8a864e
  if (normalizeFlags_ & normalizeExpandAll)
Packit 8a864e
    handleChange();
Packit 8a864e
  if (markup) {
Packit 8a864e
    Boolean hadName = 0;
Packit 8a864e
    Boolean closed = 1;
Packit 8a864e
    MarkupIter iter(*markup);
Packit 8a864e
    while (iter.valid()) {
Packit 8a864e
      switch (iter.type()) {
Packit 8a864e
      case Markup::delimiter:
Packit 8a864e
	switch (iter.delimGeneral()) {
Packit 8a864e
	case Syntax::dTAGC:
Packit 8a864e
	  closed = 1;
Packit 8a864e
	  if (!hadName) {
Packit 8a864e
	    StringC nameBuf;
Packit 8a864e
	    StringC tag(elementTypeOrigName(event->elementType(), nameBuf));
Packit 8a864e
	    if (normalizeFlags_ & normalizeEmptytag) {
Packit 8a864e
	      handleChange();
Packit 8a864e
	      os() << tag;
Packit 8a864e
	      tag.resize(0);
Packit 8a864e
	    }
Packit 8a864e
	    unspecifiedAttributeValues(event->attributes(), tag);
Packit 8a864e
	  }
Packit 8a864e
	  os() << syntax_->delimGeneral(iter.delimGeneral());
Packit 8a864e
	  break;
Packit 8a864e
	case Syntax::dNESTC:
Packit 8a864e
	  closed = 1;
Packit 8a864e
	  if (normalizeFlags_ & normalizeNet) {
Packit 8a864e
	    handleChange();
Packit 8a864e
	    os() << syntax_->delimGeneral(Syntax::dTAGC);
Packit 8a864e
	    break;
Packit 8a864e
	  }
Packit 8a864e
	  // fall through
Packit 8a864e
	default:
Packit 8a864e
	  os() << syntax_->delimGeneral(iter.delimGeneral());
Packit 8a864e
	  break;
Packit 8a864e
	}
Packit 8a864e
	iter.advance();
Packit 8a864e
	break;
Packit 8a864e
      case Markup::name:
Packit 8a864e
	{
Packit 8a864e
	  ASSERT(!hadName);
Packit 8a864e
	  const ElementType *elementType = event->elementType();
Packit 8a864e
	  if (elementType->index() >= elementTypeOrigNames_.size())
Packit 8a864e
	    elementTypeOrigNames_.resize(elementType->index() + 1);
Packit 8a864e
	  StringC &elementTypeOrigName
Packit 8a864e
	    = elementTypeOrigNames_[elementType->index()];
Packit 8a864e
	  if (elementTypeOrigName.size() == 0) {
Packit 8a864e
	    elementTypeOrigName.assign(iter.charsPointer(),
Packit 8a864e
				       iter.charsLength());
Packit 8a864e
	    // add rank if missing
Packit 8a864e
	    elementTypeOrigName.append(event->name().data() +
Packit 8a864e
				       elementTypeOrigName.size(),
Packit 8a864e
				       event->name().size()
Packit 8a864e
				       - elementTypeOrigName.size());
Packit 8a864e
	  }
Packit 8a864e
	  os() << iter;
Packit 8a864e
	  if (normalizeFlags_ & normalizeRank) {
Packit 8a864e
	    for (size_t i = iter.charsLength();
Packit 8a864e
		 i < event->name().size();
Packit 8a864e
		 i++) {
Packit 8a864e
	      handleChange();
Packit 8a864e
	      os().put(event->name()[i]);
Packit 8a864e
	    }
Packit 8a864e
	  }
Packit 8a864e
	  attributeSpecList(iter, event->attributes());
Packit 8a864e
	  hadName = 1;
Packit 8a864e
	}
Packit 8a864e
	break;
Packit 8a864e
      case Markup::s:
Packit 8a864e
	os() << iter;
Packit 8a864e
	iter.advance();
Packit 8a864e
	break;
Packit 8a864e
      default:
Packit 8a864e
	CANNOT_HAPPEN();
Packit 8a864e
      }
Packit 8a864e
    }
Packit 8a864e
    if (!closed && (normalizeFlags_ && normalizeUnclosed)) {
Packit 8a864e
      handleChange();
Packit 8a864e
      os() << syntax_->delimGeneral(Syntax::dTAGC);
Packit 8a864e
    }
Packit 8a864e
  }
Packit 8a864e
  else if (normalizeFlags_ & normalizeOmittag) {
Packit 8a864e
    if (inSpecialMarkedSection_) {
Packit 8a864e
      reportTagInSpecialMarkedSection(event->location());
Packit 8a864e
      return;
Packit 8a864e
    }
Packit 8a864e
    handleChange();
Packit 8a864e
    StringC nameBuf;
Packit 8a864e
    os() << syntax_->delimGeneral(Syntax::dSTAGO)
Packit 8a864e
      << elementTypeOrigName(event->elementType(), nameBuf);
Packit 8a864e
    unspecifiedAttributeValues(event->attributes(), StringC());
Packit 8a864e
    os() << syntax_->delimGeneral(Syntax::dTAGC);
Packit 8a864e
  }
Packit 8a864e
  delete event;
Packit 8a864e
  if (entityStack_.size() > 0 && os_ == topOs_)
Packit 8a864e
    os_ = &entityStack_.back().str;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
void CopyEventHandler::attributeSpecList(MarkupIter &iter,
Packit 8a864e
					 const AttributeList &atts)
Packit 8a864e
{
Packit 8a864e
  size_t nAtt = atts.size();
Packit 8a864e
  unsigned i;
Packit 8a864e
  unsigned *attIndex;
Packit 8a864e
  if (atts.nSpec()) {
Packit 8a864e
    attIndex = new unsigned[atts.nSpec()];
Packit 8a864e
    for (i = 0; i < atts.nSpec(); i++)
Packit 8a864e
      attIndex[i] = unsigned(-1);
Packit 8a864e
    for (i = 0; i < nAtt; i++)
Packit 8a864e
      if (atts.specified(i))
Packit 8a864e
	attIndex[atts.specIndex(i)] = i;
Packit 8a864e
  }
Packit 8a864e
  else
Packit 8a864e
    attIndex = 0;
Packit 8a864e
  Boolean hadAttname = 0;
Packit 8a864e
  i = 0;
Packit 8a864e
  StringC nameBuf;
Packit 8a864e
  for (iter.advance(); iter.valid(); iter.advance())
Packit 8a864e
    switch (iter.type()) {
Packit 8a864e
    case Markup::name:
Packit 8a864e
      os() << iter;
Packit 8a864e
      hadAttname = 1;
Packit 8a864e
      break;
Packit 8a864e
    case Markup::s:
Packit 8a864e
      os() << iter;
Packit 8a864e
      break;
Packit 8a864e
    case Markup::attributeValue:
Packit 8a864e
      if (!hadAttname
Packit 8a864e
	  && attIndex
Packit 8a864e
	  && attIndex[i] != unsigned(-1)
Packit 8a864e
	  && (normalizeFlags_ & (normalizeAttname | normalizeAttvalue))) {
Packit 8a864e
	handleChange();
Packit 8a864e
	os() << generalName(atts.name(attIndex[i]), nameBuf)
Packit 8a864e
	  << syntax_->delimGeneral(Syntax::dVI);
Packit 8a864e
      }
Packit 8a864e
      if (normalizeFlags_ & normalizeAttvalue) {
Packit 8a864e
	handleChange();
Packit 8a864e
	os() << syntax_->delimGeneral(Syntax::dLIT)
Packit 8a864e
	  << iter
Packit 8a864e
	    << syntax_->delimGeneral(Syntax::dLIT);
Packit 8a864e
      }
Packit 8a864e
      else
Packit 8a864e
	os() << iter;
Packit 8a864e
      hadAttname = 0;
Packit 8a864e
      i++;
Packit 8a864e
      break;
Packit 8a864e
    case Markup::literal:
Packit 8a864e
      literal(iter.text());
Packit 8a864e
      i++;
Packit 8a864e
      hadAttname = 0;
Packit 8a864e
      break;
Packit 8a864e
    case Markup::delimiter:
Packit 8a864e
      if (iter.delimGeneral() == Syntax::dVI)
Packit 8a864e
	os() << syntax_->delimGeneral(iter.delimGeneral());
Packit 8a864e
      else {
Packit 8a864e
	unspecifiedAttributeValues(atts, StringC());
Packit 8a864e
	delete [] attIndex;
Packit 8a864e
	return;
Packit 8a864e
      }
Packit 8a864e
      break;
Packit 8a864e
    default:
Packit 8a864e
      CANNOT_HAPPEN();
Packit 8a864e
    }
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
void CopyEventHandler::unspecifiedAttributeValues(const AttributeList &atts,
Packit 8a864e
						  const StringC &beforeFirst)
Packit 8a864e
{
Packit 8a864e
  if (normalizeFlags_ & (normalizeCurrent|normalizeAttspec)) {
Packit 8a864e
    Boolean first = 1;
Packit 8a864e
    size_t nAtt = atts.size();
Packit 8a864e
    StringC nameBuf;
Packit 8a864e
    for (unsigned i = 0; i < nAtt; i++) {
Packit 8a864e
      const Text *text;
Packit 8a864e
      if (!atts.specified(i)
Packit 8a864e
	  && ((normalizeFlags_ & normalizeAttspec)
Packit 8a864e
	      || atts.current(i))
Packit 8a864e
	  && atts.value(i)
Packit 8a864e
	  && (text = atts.value(i)->text()) != 0) {
Packit 8a864e
	if (first) {
Packit 8a864e
	  handleChange();
Packit 8a864e
	  os() << beforeFirst;
Packit 8a864e
	  first = 0;
Packit 8a864e
	}
Packit 8a864e
	os().put(syntax_->standardFunction(Syntax::fSPACE));
Packit 8a864e
	os() << generalName(atts.name(i), nameBuf)
Packit 8a864e
	  << syntax_->delimGeneral(Syntax::dVI);
Packit 8a864e
	Boolean lita;
Packit 8a864e
	if (text->delimType(lita))
Packit 8a864e
	  literal(*text);
Packit 8a864e
	else {
Packit 8a864e
	  if (normalizeFlags_ & normalizeAttvalue) {
Packit 8a864e
	    os() << syntax_->delimGeneral(Syntax::dLIT)
Packit 8a864e
	      << text->string()
Packit 8a864e
		<<  syntax_->delimGeneral(Syntax::dLIT);
Packit 8a864e
	  }
Packit 8a864e
	  else
Packit 8a864e
	    os() << text->string();
Packit 8a864e
	}
Packit 8a864e
      }
Packit 8a864e
    }
Packit 8a864e
  }
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
void CopyEventHandler::literal(const Text &text)
Packit 8a864e
{
Packit 8a864e
  TextIter iter(text);
Packit 8a864e
  TextItem::Type type;
Packit 8a864e
  const Char *p;
Packit 8a864e
  size_t n;
Packit 8a864e
  const Location *loc;
Packit 8a864e
  StringC delim;
Packit 8a864e
  Boolean lita;
Packit 8a864e
  if (!text.delimType(lita))
Packit 8a864e
    CANNOT_HAPPEN();
Packit 8a864e
  delim = syntax_->delimGeneral(lita ? Syntax::dLITA : Syntax::dLIT);
Packit 8a864e
  os() << delim;
Packit 8a864e
  int level = 0;
Packit 8a864e
  while (iter.next(type, p, n, loc)) {
Packit 8a864e
    switch (type) {
Packit 8a864e
    case TextItem::ignore:
Packit 8a864e
    case TextItem::data:
Packit 8a864e
    case TextItem::nonSgml:
Packit 8a864e
      if (!level) {
Packit 8a864e
	const Char *orig;
Packit 8a864e
	if (loc->origin()->origChars(orig))
Packit 8a864e
	  writeData(orig, n, loc->origin()->parent());
Packit 8a864e
	else
Packit 8a864e
	  writeData(p, n, *loc);
Packit 8a864e
      }
Packit 8a864e
      break;
Packit 8a864e
    case TextItem::cdata:
Packit 8a864e
    case TextItem::sdata:
Packit 8a864e
      if (!level)
Packit 8a864e
	entityRef(loc->origin()->asEntityOrigin());
Packit 8a864e
      break;
Packit 8a864e
    case TextItem::entityStart:
Packit 8a864e
      if (!level++)
Packit 8a864e
	entityRef(loc->origin()->asEntityOrigin());
Packit 8a864e
      break;
Packit 8a864e
    case TextItem::entityEnd:
Packit 8a864e
      level--;
Packit 8a864e
      break;
Packit 8a864e
    case TextItem::startDelim:
Packit 8a864e
    case TextItem::endDelim:
Packit 8a864e
    case TextItem::endDelimA:
Packit 8a864e
      break;
Packit 8a864e
    }
Packit 8a864e
  }
Packit 8a864e
  Location delimLoc;
Packit 8a864e
  if (!text.endDelimLocation(delimLoc))
Packit 8a864e
    CANNOT_HAPPEN();
Packit 8a864e
  withNamedCharRef(delim, delimLoc);
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
void CopyEventHandler::endElement(EndElementEvent *event)
Packit 8a864e
{
Packit 8a864e
  if (!emptyElementNormal_ && mustOmitEnd_) {
Packit 8a864e
    delete event;
Packit 8a864e
    mustOmitEnd_ = 0;
Packit 8a864e
    return;
Packit 8a864e
  }
Packit 8a864e
  const Markup *markup = event->markupPtr();
Packit 8a864e
  if (!markup) {
Packit 8a864e
    if (normalizeFlags_ & normalizeExpand) {
Packit 8a864e
      if (outputEntityLevel_ > entityLevel_ - omittagHoist_) {
Packit 8a864e
	delete event;
Packit 8a864e
	return;
Packit 8a864e
      }
Packit 8a864e
      if (omittagHoist_ >= entityStack_.size())
Packit 8a864e
	os_ = topOs_;
Packit 8a864e
    }
Packit 8a864e
    else if (entityLevel_ - omittagHoist_ != outputEntityLevel_) {
Packit 8a864e
      delete event;
Packit 8a864e
      return;
Packit 8a864e
    }
Packit 8a864e
  }
Packit 8a864e
  else {
Packit 8a864e
    omittagHoist_ = 0;
Packit 8a864e
    if (doNothing(event))
Packit 8a864e
      return;
Packit 8a864e
  }
Packit 8a864e
  if (normalizeFlags_ & normalizeExpandAll)
Packit 8a864e
    handleChange();
Packit 8a864e
  if (markup) {
Packit 8a864e
    Boolean closed = 0;
Packit 8a864e
    Boolean hadAttname = 0;
Packit 8a864e
    for (MarkupIter iter(*markup); iter.valid(); iter.advance())
Packit 8a864e
      switch (iter.type()) {
Packit 8a864e
      case Markup::s:
Packit 8a864e
	os() << iter;
Packit 8a864e
	break;
Packit 8a864e
      case Markup::name:
Packit 8a864e
	{
Packit 8a864e
	  os() << iter;
Packit 8a864e
	  for (size_t i = iter.charsLength();
Packit 8a864e
	       i < event->name().size();
Packit 8a864e
	       i++) {
Packit 8a864e
	    handleChange();
Packit 8a864e
	    os().put(event->name()[i]);
Packit 8a864e
	  }
Packit 8a864e
	  hadAttname = 1;
Packit 8a864e
	}
Packit 8a864e
	break;
Packit 8a864e
      case Markup::delimiter:
Packit 8a864e
	if (iter.delimGeneral() == Syntax::dTAGC) {
Packit 8a864e
	  closed = 1;
Packit 8a864e
	  if (!hadAttname
Packit 8a864e
	      && (normalizeFlags_ & normalizeEmptytag)) {
Packit 8a864e
	    handleChange();
Packit 8a864e
	    StringC nameBuf;
Packit 8a864e
	    os() << elementTypeOrigName(event->elementType(), nameBuf);
Packit 8a864e
	  }
Packit 8a864e
	}
Packit 8a864e
	else if (iter.delimGeneral() == Syntax::dNET) {
Packit 8a864e
	  closed = 1;
Packit 8a864e
	  if (normalizeFlags_ & normalizeNet) {
Packit 8a864e
	    handleChange();
Packit 8a864e
	    StringC nameBuf;
Packit 8a864e
	    os() << syntax_->delimGeneral(Syntax::dETAGO)
Packit 8a864e
	         << elementTypeOrigName(event->elementType(), nameBuf)
Packit 8a864e
	         << syntax_->delimGeneral(Syntax::dTAGC);
Packit 8a864e
	    break;
Packit 8a864e
	  }
Packit 8a864e
	}
Packit 8a864e
	os() << syntax_->delimGeneral(iter.delimGeneral());
Packit 8a864e
	break;
Packit 8a864e
      default:
Packit 8a864e
	CANNOT_HAPPEN();
Packit 8a864e
      }
Packit 8a864e
    if (!closed && (normalizeFlags_ & normalizeUnclosed)) {
Packit 8a864e
      handleChange();
Packit 8a864e
      os() << syntax_->delimGeneral(Syntax::dTAGC);
Packit 8a864e
    }
Packit 8a864e
  }
Packit 8a864e
  else if (normalizeFlags_ & normalizeOmittag) {
Packit 8a864e
    if (inSpecialMarkedSection_) {
Packit 8a864e
      reportTagInSpecialMarkedSection(event->location());
Packit 8a864e
      return;
Packit 8a864e
    }
Packit 8a864e
    handleChange();
Packit 8a864e
    StringC nameBuf;
Packit 8a864e
    os() << syntax_->delimGeneral(Syntax::dETAGO)
Packit 8a864e
      << elementTypeOrigName(event->elementType(), nameBuf)
Packit 8a864e
	<< syntax_->delimGeneral(Syntax::dTAGC);
Packit 8a864e
  }
Packit 8a864e
  delete event;
Packit 8a864e
  if (entityStack_.size() > 0 && os_ == topOs_)
Packit 8a864e
    os_ = &entityStack_.back().str;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
void CopyEventHandler::pi(PiEvent *event)
Packit 8a864e
{
Packit 8a864e
  omittagHoist_ = 0;
Packit 8a864e
  if (doNothing(event))
Packit 8a864e
    return;
Packit 8a864e
  if (event->entity())
Packit 8a864e
    entityRef(event->location().origin()->asEntityOrigin());
Packit 8a864e
  else {
Packit 8a864e
    os() << syntax_->delimGeneral(Syntax::dPIO);
Packit 8a864e
    os().write(event->data(), event->dataLength());
Packit 8a864e
    os() << syntax_->delimGeneral(Syntax::dPIC);
Packit 8a864e
  }
Packit 8a864e
  delete event;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
void CopyEventHandler::sdataEntity(SdataEntityEvent *event)
Packit 8a864e
{
Packit 8a864e
  omittagHoist_ = 0;
Packit 8a864e
  if (doNothing(event))
Packit 8a864e
    return;
Packit 8a864e
  entityRef(event->location().origin()->asEntityOrigin());
Packit 8a864e
  delete event;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
void CopyEventHandler::externalDataEntity(ExternalDataEntityEvent *event)
Packit 8a864e
{
Packit 8a864e
  omittagHoist_ = 0;
Packit 8a864e
  if (doNothing(event))
Packit 8a864e
    return;
Packit 8a864e
  entityRef(event->entityOrigin().pointer());
Packit 8a864e
  delete event;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
void CopyEventHandler::subdocEntity(SubdocEntityEvent *event)
Packit 8a864e
{
Packit 8a864e
  omittagHoist_ = 0;
Packit 8a864e
  if (doNothing(event))
Packit 8a864e
    return;
Packit 8a864e
  entityRef(event->entityOrigin().pointer());
Packit 8a864e
  delete event;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
void CopyEventHandler::markedSectionStart(MarkedSectionStartEvent *event)
Packit 8a864e
{
Packit 8a864e
  omittagHoist_ = 0;
Packit 8a864e
  switch (event->status()) {
Packit 8a864e
  case MarkedSectionEvent::rcdata:
Packit 8a864e
  case MarkedSectionEvent::cdata:
Packit 8a864e
    inSpecialMarkedSection_ = 1;
Packit 8a864e
    break;
Packit 8a864e
  default:
Packit 8a864e
    break;
Packit 8a864e
  }
Packit 8a864e
  if (doNothing(event))
Packit 8a864e
    return;
Packit 8a864e
  if (!(normalizeFlags_ & normalizeMarkedSection)
Packit 8a864e
      || (inInstance_ && inSpecialMarkedSection_))
Packit 8a864e
    outputMarkup(event->location(), event->markup());
Packit 8a864e
  else if (inInstance_ && event->status() != MarkedSectionEvent::ignore) {
Packit 8a864e
    // Put an empty comment so that REs aren't changed.
Packit 8a864e
    // With an ignored marked section, sufficent to have comment at the end.
Packit 8a864e
    handleChange();
Packit 8a864e
    os() << syntax_->delimGeneral(Syntax::dMDO)
Packit 8a864e
         << syntax_->delimGeneral(Syntax::dMDC);
Packit 8a864e
  }
Packit 8a864e
  delete event;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
void CopyEventHandler::markedSectionEnd(MarkedSectionEndEvent *event)
Packit 8a864e
{
Packit 8a864e
  omittagHoist_ = 0;
Packit 8a864e
  if (doNothing(event)) {
Packit 8a864e
    inSpecialMarkedSection_ = 0;
Packit 8a864e
    return;
Packit 8a864e
  }
Packit 8a864e
  if (!(normalizeFlags_ & normalizeMarkedSection)
Packit 8a864e
      || (inInstance_ && inSpecialMarkedSection_))
Packit 8a864e
    outputMarkup(event->location(), event->markup());
Packit 8a864e
  else if (inInstance_) {
Packit 8a864e
    // Put an empty comment so that REs aren't changed.
Packit 8a864e
    handleChange();
Packit 8a864e
    os() << syntax_->delimGeneral(Syntax::dMDO)
Packit 8a864e
         << syntax_->delimGeneral(Syntax::dMDC);
Packit 8a864e
  }
Packit 8a864e
  inSpecialMarkedSection_ = 0;
Packit 8a864e
  delete event;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
void CopyEventHandler::ignoredChars(IgnoredCharsEvent *event)
Packit 8a864e
{
Packit 8a864e
  omittagHoist_ = 0;
Packit 8a864e
  if (doNothing(event))
Packit 8a864e
    return;
Packit 8a864e
  if (!(normalizeFlags_ & normalizeMarkedSection))
Packit 8a864e
    os().write(event->data(), event->dataLength());
Packit 8a864e
  delete event;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
void CopyEventHandler::usemap(UsemapEvent *event)
Packit 8a864e
{
Packit 8a864e
  omittagHoist_ = 0;
Packit 8a864e
  if (doNothing(event))
Packit 8a864e
    return;
Packit 8a864e
  if (!(normalizeFlags_ & normalizeShortref))
Packit 8a864e
    outputMarkup(event->location(), event->markup());
Packit 8a864e
  else if (inInstance_) {
Packit 8a864e
    // Put an empty comment so that REs aren't changed.
Packit 8a864e
    handleChange();
Packit 8a864e
    os() << syntax_->delimGeneral(Syntax::dMDO)
Packit 8a864e
         << syntax_->delimGeneral(Syntax::dMDC);
Packit 8a864e
  }
Packit 8a864e
  delete event;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
void CopyEventHandler::uselink(UselinkEvent *event)
Packit 8a864e
{
Packit 8a864e
  omittagHoist_ = 0;
Packit 8a864e
  markup(event->location(), event->markup());
Packit 8a864e
  delete event;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
void CopyEventHandler::startDtd(StartDtdEvent *event)
Packit 8a864e
{
Packit 8a864e
  startSubset(event);
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
void CopyEventHandler::startLpd(StartLpdEvent *event)
Packit 8a864e
{
Packit 8a864e
  startSubset(event);
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
void CopyEventHandler::startSubset(StartSubsetEvent *event)
Packit 8a864e
{
Packit 8a864e
  if (doNothing(event))
Packit 8a864e
    return;
Packit 8a864e
  if (!event->entity().isNull()
Packit 8a864e
      && (normalizeFlags_ & normalizeExpandProlog)) {
Packit 8a864e
    const Markup &m = event->markup();
Packit 8a864e
    for (MarkupIter iter(m); iter.valid(); iter.advance())
Packit 8a864e
      if (iter.type() == Markup::reservedName
Packit 8a864e
	  && (iter.reservedName() == Syntax::rSYSTEM
Packit 8a864e
	      || iter.reservedName() == Syntax::rPUBLIC)) {
Packit 8a864e
	Markup copy(m);
Packit 8a864e
	copy.resize(iter.index());
Packit 8a864e
	outputMarkup(event->location(), copy);
Packit 8a864e
	break;
Packit 8a864e
      }
Packit 8a864e
  }
Packit 8a864e
  else
Packit 8a864e
    outputMarkup(event->location(), event->markup());
Packit 8a864e
  if (event->hasInternalSubset()
Packit 8a864e
      || (normalizeFlags_ & normalizeExpandProlog)) {
Packit 8a864e
    os() << syntax_->delimGeneral(Syntax::dDSO);
Packit 8a864e
    hasInternalSubset_ = 1;
Packit 8a864e
  }
Packit 8a864e
  else
Packit 8a864e
    hasInternalSubset_ = 0;
Packit 8a864e
  delete event;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
void CopyEventHandler::endDtd(EndDtdEvent *event)
Packit 8a864e
{
Packit 8a864e
  endSubset(event);
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
void CopyEventHandler::endLpd(EndLpdEvent *event)
Packit 8a864e
{
Packit 8a864e
  endSubset(event);
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
void CopyEventHandler::endSubset(MarkupEvent *event)
Packit 8a864e
{
Packit 8a864e
  if (doNothing(event))
Packit 8a864e
    return;
Packit 8a864e
  if (hasInternalSubset_)
Packit 8a864e
    os() << syntax_->delimGeneral(Syntax::dDSC);
Packit 8a864e
  outputMarkup(event->location(), event->markup());
Packit 8a864e
  delete event;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
void CopyEventHandler::entityDecl(EntityDeclEvent *event)
Packit 8a864e
{
Packit 8a864e
  currentAttributes_ = 0;
Packit 8a864e
  const ExternalDataEntity *extData = event->entity().asExternalDataEntity();
Packit 8a864e
  if (extData)
Packit 8a864e
    currentAttributes_ = &extData->attributes();
Packit 8a864e
  markup(event->location(), event->markup());
Packit 8a864e
  currentAttributes_ = 0;
Packit 8a864e
  delete event;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
void CopyEventHandler::shortrefDecl(ShortrefDeclEvent *event)
Packit 8a864e
{
Packit 8a864e
  if (doNothing(event))
Packit 8a864e
    return;
Packit 8a864e
  if (!(normalizeFlags_ & normalizeShortref))
Packit 8a864e
    outputMarkup(event->location(), event->markup());
Packit 8a864e
  delete event;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
void CopyEventHandler::entityStart(EntityStartEvent *event)
Packit 8a864e
{
Packit 8a864e
  if (event->entity()->name() == outputEntity_
Packit 8a864e
      && event->entity()->declType() == Entity::generalEntity)
Packit 8a864e
    outputEntityLevel_ = entityLevel_ + 1;
Packit 8a864e
  if (inInstance_ && (normalizeFlags_ & normalizeOmittagHoist)) {
Packit 8a864e
    if (event->entity()->asInternalEntity())
Packit 8a864e
      omittagHoist_++;
Packit 8a864e
    else
Packit 8a864e
      omittagHoist_ = 0;
Packit 8a864e
  }
Packit 8a864e
  if (doNothing(event)) {
Packit 8a864e
    entityLevel_++;
Packit 8a864e
    return;
Packit 8a864e
  }
Packit 8a864e
  entityLevel_++;
Packit 8a864e
  if ((normalizeFlags_ & normalizeExpand)
Packit 8a864e
      && inInstance_
Packit 8a864e
      && entityLevel_ > outputEntityLevel_) {
Packit 8a864e
    entityStack_.resize(entityStack_.size() + 1);
Packit 8a864e
    entityStack_.back().ref = event->entityOrigin();
Packit 8a864e
    os_ = &entityStack_.back().str;
Packit 8a864e
  }
Packit 8a864e
  entityOrigin_ = event->entityOrigin();
Packit 8a864e
  delete event;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
void CopyEventHandler::entityEnd(EntityEndEvent *event)
Packit 8a864e
{
Packit 8a864e
  if (omittagHoist_ > 0)
Packit 8a864e
    omittagHoist_--;
Packit 8a864e
  if (entityLevel_-- == outputEntityLevel_) {
Packit 8a864e
    outputEntityLevel_ = unsigned(-1);
Packit 8a864e
    outputEntity_.resize(0);
Packit 8a864e
  }
Packit 8a864e
  else if (!(normalizeFlags_
Packit 8a864e
	     & (inInstance_ ? normalizeExpand : normalizeExpandProlog))
Packit 8a864e
	   && entityLevel_ == outputEntityLevel_) {
Packit 8a864e
    if (!entityOrigin_.isNull()) {
Packit 8a864e
      switch (entityOrigin_->entity()->declType()) {
Packit 8a864e
      case Entity::doctype:
Packit 8a864e
      case Entity::linktype:
Packit 8a864e
	break;
Packit 8a864e
      default:
Packit 8a864e
	entityRef(entityOrigin_.pointer());
Packit 8a864e
	break;
Packit 8a864e
      }
Packit 8a864e
    }
Packit 8a864e
    entityOrigin_.clear();
Packit 8a864e
  }
Packit 8a864e
  else if ((normalizeFlags_ & normalizeExpand)
Packit 8a864e
	   && inInstance_
Packit 8a864e
	   && entityLevel_ >= outputEntityLevel_) {
Packit 8a864e
    if (entityStack_.size() > 0) {
Packit 8a864e
      ConstPtr<EntityOrigin> origin
Packit 8a864e
	= entityStack_.back().ref;
Packit 8a864e
      entityStack_.resize(entityStack_.size() - 1);
Packit 8a864e
      if (entityStack_.size() > 0)
Packit 8a864e
	os_ = &entityStack_.back().str;
Packit 8a864e
      else
Packit 8a864e
	os_ = topOs_;
Packit 8a864e
      entityRef(origin.pointer());
Packit 8a864e
    }
Packit 8a864e
  }
Packit 8a864e
  delete event;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
void CopyEventHandler::outputMarkup(const Location &loc,
Packit 8a864e
				    const Markup &markup)
Packit 8a864e
{
Packit 8a864e
  int level = 0;
Packit 8a864e
  Boolean first = 1;
Packit 8a864e
  MarkupIter iter(markup);
Packit 8a864e
  while (iter.valid()) {
Packit 8a864e
    switch (iter.type()) {
Packit 8a864e
    case Markup::delimiter:
Packit 8a864e
      if (first)
Packit 8a864e
	withNamedCharRef(syntax_->delimGeneral(iter.delimGeneral()), loc);
Packit 8a864e
      else if (!level) {
Packit 8a864e
	os() << syntax_->delimGeneral(iter.delimGeneral());
Packit 8a864e
	// hack, hack!
Packit 8a864e
	if (iter.delimGeneral() == Syntax::dDSO && currentAttributes_ != 0) {
Packit 8a864e
	  attributeSpecList(iter, *currentAttributes_);
Packit 8a864e
	  first = 0;
Packit 8a864e
	  continue;		// skip the advance
Packit 8a864e
	}
Packit 8a864e
      }
Packit 8a864e
      break;
Packit 8a864e
    case Markup::refEndRe:
Packit 8a864e
      if (!level)
Packit 8a864e
	os().put(syntax_->standardFunction(Syntax::fRE));
Packit 8a864e
      break;
Packit 8a864e
    case Markup::sdReservedName:
Packit 8a864e
      if (!level) {
Packit 8a864e
	if (normalizeFlags_ & normalizeReserved)
Packit 8a864e
	  os() << sd_->reservedName(iter.sdReservedName());
Packit 8a864e
	else
Packit 8a864e
	  os() << iter;
Packit 8a864e
      }
Packit 8a864e
      break;
Packit 8a864e
    case Markup::reservedName:
Packit 8a864e
      if (!level && (normalizeFlags_ & normalizeReserved)) {
Packit 8a864e
	os() << syntax_->reservedName(iter.reservedName());
Packit 8a864e
	break;
Packit 8a864e
      }
Packit 8a864e
    case Markup::shortref:
Packit 8a864e
      if (first) {
Packit 8a864e
	withNamedCharRef(iter.charsPointer(), iter.charsLength(), loc);
Packit 8a864e
	break;
Packit 8a864e
      }
Packit 8a864e
      // fall through
Packit 8a864e
    case Markup::name:
Packit 8a864e
    case Markup::nameToken:
Packit 8a864e
    case Markup::attributeValue:
Packit 8a864e
    case Markup::number:
Packit 8a864e
    case Markup::s:
Packit 8a864e
      if (!level)
Packit 8a864e
	os() << iter;
Packit 8a864e
      break;
Packit 8a864e
    case Markup::comment:
Packit 8a864e
      if (!level)
Packit 8a864e
	os() << syntax_->delimGeneral(Syntax::dCOM)
Packit 8a864e
	     << iter
Packit 8a864e
	     << syntax_->delimGeneral(Syntax::dCOM);
Packit 8a864e
      break;
Packit 8a864e
    case Markup::entityStart:
Packit 8a864e
      if (!level++) {
Packit 8a864e
	const EntityOrigin *origin = iter.entityOrigin();
Packit 8a864e
	// entityStarts in the SGML declaration don't have explicit references
Packit 8a864e
	if (origin->entity())
Packit 8a864e
	  entityRef(origin);
Packit 8a864e
      }
Packit 8a864e
      break;
Packit 8a864e
    case Markup::entityEnd:
Packit 8a864e
      level--;
Packit 8a864e
      break;
Packit 8a864e
    case Markup::literal:
Packit 8a864e
      if (!level)
Packit 8a864e
	literal(iter.text());
Packit 8a864e
      break;
Packit 8a864e
    case Markup::sdLiteral:
Packit 8a864e
      if (!level)
Packit 8a864e
	sdParamLiteral(iter.sdText());
Packit 8a864e
      break;
Packit 8a864e
    default:
Packit 8a864e
      CANNOT_HAPPEN();
Packit 8a864e
    }
Packit 8a864e
    iter.advance();
Packit 8a864e
    first = 0;
Packit 8a864e
  }
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
void CopyEventHandler::sdParamLiteral(const SdText &text)
Packit 8a864e
{
Packit 8a864e
  const StringC &delim = syntax_->delimGeneral(text.lita()
Packit 8a864e
					       ? Syntax::dLITA
Packit 8a864e
					       : Syntax::dLIT);
Packit 8a864e
  os() << delim;
Packit 8a864e
  SdTextIter iter(text);
Packit 8a864e
  const SyntaxChar *p;
Packit 8a864e
  size_t n;
Packit 8a864e
  Location loc;
Packit 8a864e
  while (iter.next(p, n, loc)) {
Packit 8a864e
    const Markup *markupPtr;
Packit 8a864e
    if (n == 1 && loc.origin()->isNumericCharRef(markupPtr)) {
Packit 8a864e
      if (markupPtr)
Packit 8a864e
	outputMarkup(loc.origin()->parent(), *markupPtr);
Packit 8a864e
    }
Packit 8a864e
    else if (n > 0) {
Packit 8a864e
      Char c = Char(*p);
Packit 8a864e
      withNamedCharRef(&c, 1, loc);
Packit 8a864e
      for (++p, --n; n > 0; ++p, --n)
Packit 8a864e
	os().put(Char(*p));
Packit 8a864e
    }
Packit 8a864e
  }
Packit 8a864e
  os() << delim;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
void CopyEventHandler::entityRef(const EntityOrigin *origin)
Packit 8a864e
{
Packit 8a864e
  const Markup *m = origin->markup();
Packit 8a864e
  if (!m)
Packit 8a864e
    return;
Packit 8a864e
  MarkupIter iter(*m);
Packit 8a864e
  if (iter.valid()) {
Packit 8a864e
    iter.advance();
Packit 8a864e
    if (iter.valid()
Packit 8a864e
	&& iter.type() == Markup::shortref
Packit 8a864e
	&& (normalizeFlags_ & normalizeShortref)) {
Packit 8a864e
       handleChange();
Packit 8a864e
       Boolean containsRE = 0;
Packit 8a864e
       Boolean containsRS = 0;
Packit 8a864e
       for (size_t i = 0; i < iter.charsLength(); i++) {
Packit 8a864e
	 Char c = iter.charsPointer()[i];
Packit 8a864e
	 if (c == syntax_->standardFunction(Syntax::fRE))
Packit 8a864e
	   containsRE = 1;
Packit 8a864e
	 else if (c == syntax_->standardFunction(Syntax::fRS))
Packit 8a864e
	   containsRS = 1;
Packit 8a864e
       }
Packit 8a864e
       if (containsRS)
Packit 8a864e
	 os().put(syntax_->standardFunction(Syntax::fRS));
Packit 8a864e
       os() << syntax_->delimGeneral(Syntax::dERO)
Packit 8a864e
	 << origin->entity()->name();
Packit 8a864e
       if (containsRE)
Packit 8a864e
	 os().put(syntax_->standardFunction(Syntax::fRE));
Packit 8a864e
       else
Packit 8a864e
	 os() << syntax_->delimGeneral(Syntax::dREFC);
Packit 8a864e
       return;
Packit 8a864e
     }
Packit 8a864e
  }
Packit 8a864e
  outputMarkup(origin->parent(), *m);
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
const StringC &CopyEventHandler::elementTypeOrigName(const ElementType *type,
Packit 8a864e
						     StringC &buf)
Packit 8a864e
{
Packit 8a864e
  if (type->index() < elementTypeOrigNames_.size()
Packit 8a864e
      && elementTypeOrigNames_[type->index()].size() > 0)
Packit 8a864e
    return elementTypeOrigNames_[type->index()];
Packit 8a864e
  else
Packit 8a864e
    return generalName(type->name(), buf);
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
const StringC &CopyEventHandler::generalName(const StringC &name,
Packit 8a864e
					     StringC &buf)
Packit 8a864e
{
Packit 8a864e
  if ((normalizeFlags_ & normalizeLower)
Packit 8a864e
      && syntax_->namecaseGeneral())
Packit 8a864e
    return lowerCaseName(name, buf);
Packit 8a864e
  else
Packit 8a864e
    return name;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
const StringC &CopyEventHandler::entityName(const StringC &name,
Packit 8a864e
					    StringC &buf)
Packit 8a864e
{
Packit 8a864e
  if ((normalizeFlags_ & normalizeLower)
Packit 8a864e
      && syntax_->namecaseEntity())
Packit 8a864e
    return lowerCaseName(name, buf);
Packit 8a864e
  else
Packit 8a864e
    return name;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
const StringC &CopyEventHandler::lowerCaseName(const StringC &name,
Packit 8a864e
					       StringC &buf)
Packit 8a864e
{
Packit 8a864e
  size_t i;
Packit 8a864e
  for (i = 0; i < name.size(); i++) {
Packit 8a864e
    Char c = lowerSubst_[name[i]];
Packit 8a864e
    if (c != name[i]) {
Packit 8a864e
      buf = name;
Packit 8a864e
      buf[i] = c;
Packit 8a864e
      for (i++; i < name.size(); i++)
Packit 8a864e
	lowerSubst_.subst(buf[i]);
Packit 8a864e
      return buf;
Packit 8a864e
    }
Packit 8a864e
  }
Packit 8a864e
  return name;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
void CopyEventHandler::handleChange()
Packit 8a864e
{
Packit 8a864e
  if (os_ != topOs_) {
Packit 8a864e
    os_ = topOs_;
Packit 8a864e
    for (size_t i = 0; i < entityStack_.size(); i++) {
Packit 8a864e
      StringC tem;
Packit 8a864e
      entityStack_[i].str.flush();
Packit 8a864e
      entityStack_[i].str.extractString(tem);
Packit 8a864e
      os() << tem;
Packit 8a864e
    }
Packit 8a864e
    entityStack_.resize(0);
Packit 8a864e
  }
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
#ifdef SP_NAMESPACE
Packit 8a864e
}
Packit 8a864e
#endif