Blame lib/OutputState.cxx

Packit 8a864e
// Copyright (c) 1994 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
#include "splib.h"
Packit 8a864e
#include "OutputState.h"
Packit 8a864e
#include "Event.h"
Packit 8a864e
#include "Allocator.h"
Packit 8a864e
Packit 8a864e
#ifdef SP_NAMESPACE
Packit 8a864e
namespace SP_NAMESPACE {
Packit 8a864e
#endif
Packit 8a864e
Packit 8a864e
OutputState::OutputState()
Packit 8a864e
{
Packit 8a864e
  init();
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
void OutputState::init()
Packit 8a864e
{
Packit 8a864e
  nextSerial_ = 0;
Packit 8a864e
  stack_.clear();
Packit 8a864e
  stack_.insert(new OutputStateLevel);
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
OutputStateLevel::OutputStateLevel()
Packit 8a864e
: state(OutputState::afterStartTag)
Packit 8a864e
{
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
void OutputState::handleRe(EventHandler &handler, Allocator &alloc,
Packit 8a864e
			   const EventsWanted &eventsWanted, Char re,
Packit 8a864e
			   const Location &location)
Packit 8a864e
{
Packit 8a864e
  re_ = re;
Packit 8a864e
  if (eventsWanted.wantInstanceMarkup())
Packit 8a864e
    handler.reOrigin(new (alloc) ReOriginEvent(re_, location, nextSerial_));
Packit 8a864e
  switch (top().state) {
Packit 8a864e
  case afterStartTag:
Packit 8a864e
    // it's the first RE in the element
Packit 8a864e
    if (eventsWanted.wantInstanceMarkup())
Packit 8a864e
      handler.ignoredRe(new (alloc) IgnoredReEvent(re_, location, nextSerial_++));
Packit 8a864e
    top().state = afterRsOrRe;
Packit 8a864e
    break;
Packit 8a864e
  case afterRsOrRe:
Packit 8a864e
  case afterData:
Packit 8a864e
    top().state = pendingAfterRsOrRe;
Packit 8a864e
    top().reLocation = location;
Packit 8a864e
    top().reSerial = nextSerial_++;
Packit 8a864e
    break;
Packit 8a864e
  case pendingAfterRsOrRe:
Packit 8a864e
    // We now know that the pending RE won't be ignored as the last RE.
Packit 8a864e
    handler.data(new (alloc) ReEvent(&re_, top().reLocation, top().reSerial));
Packit 8a864e
    top().state = pendingAfterRsOrRe;
Packit 8a864e
    top().reLocation = location;
Packit 8a864e
    top().reSerial = nextSerial_++;
Packit 8a864e
    break;
Packit 8a864e
  case pendingAfterMarkup:
Packit 8a864e
    // We've had only markup since the last RS or RE, so this
Packit 8a864e
    // RE is ignored.  Note that it's this RE that's ignored, not
Packit 8a864e
    // the pending one.
Packit 8a864e
    if (eventsWanted.wantInstanceMarkup())
Packit 8a864e
      handler.ignoredRe(new (alloc) IgnoredReEvent(re_, location, nextSerial_++));
Packit 8a864e
    top().state = pendingAfterRsOrRe;
Packit 8a864e
    break;
Packit 8a864e
  }
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
void OutputState::noteRs(EventHandler &, Allocator &, const EventsWanted &)
Packit 8a864e
{
Packit 8a864e
  if (top().hasPendingRe())
Packit 8a864e
    top().state = pendingAfterRsOrRe;
Packit 8a864e
  else
Packit 8a864e
    top().state = afterRsOrRe;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
void OutputState::noteMarkup(EventHandler &, Allocator &, const EventsWanted &)
Packit 8a864e
{
Packit 8a864e
  switch (top().state) {
Packit 8a864e
  case afterRsOrRe:
Packit 8a864e
    top().state = afterStartTag;
Packit 8a864e
    break;
Packit 8a864e
  case pendingAfterRsOrRe:
Packit 8a864e
    top().state = pendingAfterMarkup;
Packit 8a864e
    break;
Packit 8a864e
  default:
Packit 8a864e
    break;			// avoid warning
Packit 8a864e
  }
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
void OutputState::noteData(EventHandler &handler, Allocator &alloc,
Packit 8a864e
			   const EventsWanted &)
Packit 8a864e
{
Packit 8a864e
  if (top().hasPendingRe())
Packit 8a864e
    handler.data(new (alloc) ReEvent(&re_, top().reLocation, top().reSerial));
Packit 8a864e
  top().state = afterData;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
void OutputState::noteStartElement(Boolean included,
Packit 8a864e
				   EventHandler &handler, Allocator &alloc,
Packit 8a864e
				   const EventsWanted &)
Packit 8a864e
{
Packit 8a864e
  if (included)
Packit 8a864e
    stack_.insert(new OutputStateLevel);
Packit 8a864e
  else {
Packit 8a864e
    if (top().hasPendingRe())
Packit 8a864e
      handler.data(new (alloc) ReEvent(&re_, top().reLocation, top().reSerial));
Packit 8a864e
    top().state = afterStartTag;
Packit 8a864e
  }
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
void OutputState::noteEndElement(Boolean included, EventHandler &handler,
Packit 8a864e
				 Allocator &alloc,
Packit 8a864e
				 const EventsWanted &eventsWanted)
Packit 8a864e
{
Packit 8a864e
  if (eventsWanted.wantInstanceMarkup() && top().hasPendingRe())
Packit 8a864e
    handler.ignoredRe(new (alloc) IgnoredReEvent(re_, top().reLocation,
Packit 8a864e
						 top().reSerial));
Packit 8a864e
  if (included) {
Packit 8a864e
    delete stack_.get();
Packit 8a864e
    noteMarkup(handler, alloc, eventsWanted);
Packit 8a864e
  }
Packit 8a864e
  else
Packit 8a864e
    top().state = afterData;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
#ifdef SP_NAMESPACE
Packit 8a864e
}
Packit 8a864e
#endif