Blame lib/Lpd.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 "Lpd.h"
Packit 8a864e
Packit 8a864e
#ifdef SP_NAMESPACE
Packit 8a864e
namespace SP_NAMESPACE {
Packit 8a864e
#endif
Packit 8a864e
Packit 8a864e
Lpd::Lpd(const StringC &name, Type type, const Location &location,
Packit 8a864e
	 const Ptr<Dtd> &sourceDtd)
Packit 8a864e
: name_(new StringResource<Char>(name)), type_(type), location_(location),
Packit 8a864e
  active_(0), sourceDtd_(sourceDtd)
Packit 8a864e
{
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
Lpd::~Lpd()
Packit 8a864e
{
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
SimpleLpd::SimpleLpd(const StringC &name, const Location &location,
Packit 8a864e
		     const Ptr<Dtd> &sourceDtd)
Packit 8a864e
: Lpd(name, simpleLink, location, sourceDtd)
Packit 8a864e
{
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
ResultElementSpec::ResultElementSpec()
Packit 8a864e
: elementType(0)
Packit 8a864e
{
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
void ResultElementSpec::swap(ResultElementSpec &to)
Packit 8a864e
{
Packit 8a864e
  attributeList.swap(to.attributeList);
Packit 8a864e
  {
Packit 8a864e
    const ElementType *tem = to.elementType;
Packit 8a864e
    to.elementType = elementType;
Packit 8a864e
    elementType = tem;
Packit 8a864e
  }
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
SourceLinkRule::SourceLinkRule()
Packit 8a864e
: uselink_(0), postlink_(0), postlinkRestore_(0)
Packit 8a864e
{
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
void SourceLinkRule::swap(SourceLinkRule &to)
Packit 8a864e
{
Packit 8a864e
  linkAttributes_.swap(to.linkAttributes_);
Packit 8a864e
  resultElementSpec_.swap(to.resultElementSpec_);
Packit 8a864e
  {
Packit 8a864e
    const LinkSet *tem = to.uselink_;
Packit 8a864e
    to.uselink_ = uselink_;
Packit 8a864e
    uselink_ = tem;
Packit 8a864e
  }
Packit 8a864e
  {
Packit 8a864e
    const LinkSet *tem = to.postlink_;
Packit 8a864e
    to.postlink_ = postlink_;
Packit 8a864e
    postlink_ = tem;
Packit 8a864e
  }
Packit 8a864e
  {
Packit 8a864e
    Boolean tem = to.postlinkRestore_;
Packit 8a864e
    to.postlinkRestore_ = postlinkRestore_;
Packit 8a864e
    postlinkRestore_ = tem;
Packit 8a864e
  }
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
SourceLinkRuleResource::SourceLinkRuleResource()
Packit 8a864e
{
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
LinkSet::LinkSet(const StringC &name, const Dtd *dtd)
Packit 8a864e
: Named(name), defined_(0), linkRules_(dtd ? dtd->nElementTypeIndex() : 0)
Packit 8a864e
{
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
LinkSet::~LinkSet() {}
Packit 8a864e
Packit 8a864e
void LinkSet::addLinkRule(const ElementType *element,
Packit 8a864e
			  const ConstPtr<SourceLinkRuleResource> &rule)
Packit 8a864e
{
Packit 8a864e
  linkRules_[element->index()].push_back(rule);
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
void LinkSet::addImplied(const ElementType *element, AttributeList &attributes)
Packit 8a864e
{
Packit 8a864e
  impliedSourceLinkRules_.resize(impliedSourceLinkRules_.size() + 1);
Packit 8a864e
  ResultElementSpec &result = impliedSourceLinkRules_.back();
Packit 8a864e
  result.elementType = element;
Packit 8a864e
  result.attributeList = attributes;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
Boolean LinkSet::impliedResultAttributes(const ElementType *resultType,
Packit 8a864e
					 const AttributeList *&attributes)
Packit 8a864e
{
Packit 8a864e
  for (size_t i = 0; i < impliedSourceLinkRules_.size(); i++)
Packit 8a864e
    if (impliedSourceLinkRules_[i].elementType == resultType) {
Packit 8a864e
      attributes = &impliedSourceLinkRules_[i].attributeList;
Packit 8a864e
      return 1;
Packit 8a864e
    }
Packit 8a864e
  return 0;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
size_t LinkSet::nLinkRules(const ElementType *e) const
Packit 8a864e
{
Packit 8a864e
  if (e->index() >= linkRules_.size())
Packit 8a864e
    return 0;
Packit 8a864e
  return linkRules_[e->index()].size();
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
IdLinkRule::IdLinkRule()
Packit 8a864e
{
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
Boolean IdLinkRule::isAssociatedWith(const ElementType *e) const
Packit 8a864e
{
Packit 8a864e
  for (size_t i = 0; i < assocElementTypes_.size(); i++)
Packit 8a864e
    if (assocElementTypes_[i] == e)
Packit 8a864e
      return 1;
Packit 8a864e
  return 0;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
void IdLinkRule::setAssocElementTypes(Vector<const ElementType *> &v)
Packit 8a864e
{
Packit 8a864e
  v.swap(assocElementTypes_);
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
void IdLinkRule::swap(IdLinkRule &to)
Packit 8a864e
{
Packit 8a864e
  SourceLinkRule::swap(to);
Packit 8a864e
  assocElementTypes_.swap(to.assocElementTypes_);
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
IdLinkRuleGroup::IdLinkRuleGroup(const StringC &name)
Packit 8a864e
: Named(name)
Packit 8a864e
{
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
void IdLinkRuleGroup::addLinkRule(IdLinkRule &rule)
Packit 8a864e
{
Packit 8a864e
  linkRules_.resize(linkRules_.size() + 1);
Packit 8a864e
  rule.swap(linkRules_.back());
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
ComplexLpd::ComplexLpd(const StringC &name, Type type,
Packit 8a864e
		       const Location &location,
Packit 8a864e
		       const Syntax &syntax,
Packit 8a864e
		       const Ptr<Dtd> &sourceDtd,
Packit 8a864e
		       const Ptr<Dtd> &resultDtd)
Packit 8a864e
: Lpd(name, type, location, sourceDtd), resultDtd_(resultDtd),
Packit 8a864e
  hadIdLinkSet_(0), nAttributeDefinitionList_(0),
Packit 8a864e
  initialLinkSet_(syntax.rniReservedName(Syntax::rINITIAL),
Packit 8a864e
		  sourceDtd.pointer()),
Packit 8a864e
  emptyLinkSet_(syntax.rniReservedName(Syntax::rEMPTY),
Packit 8a864e
		sourceDtd.pointer()),
Packit 8a864e
  linkAttributeDefs_(sourceDtd.isNull() ? 0 : sourceDtd->nElementTypeIndex())
Packit 8a864e
{
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
ComplexLpd::~ComplexLpd() {}
Packit 8a864e
Packit 8a864e
IdLinkRuleGroup *ComplexLpd::lookupCreateIdLink(const StringC &id)
Packit 8a864e
{
Packit 8a864e
  IdLinkRuleGroup *group = idLinkTable_.lookup(id);
Packit 8a864e
  if (!group) {
Packit 8a864e
    group = new IdLinkRuleGroup(id);
Packit 8a864e
    idLinkTable_.insert(group);
Packit 8a864e
  }
Packit 8a864e
  return group;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
Packit 8a864e
Packit 8a864e
#ifdef SP_NAMESPACE
Packit 8a864e
}
Packit 8a864e
#endif