Blame include/Syntax.h

Packit 8a864e
// Copyright (c) 1994 James Clark
Packit 8a864e
// See the file COPYING for copying permission.
Packit 8a864e
Packit 8a864e
#ifndef Syntax_INCLUDED
Packit 8a864e
#define Syntax_INCLUDED 1
Packit 8a864e
#ifdef __GNUG__
Packit 8a864e
#pragma interface
Packit 8a864e
#endif
Packit 8a864e
Packit 8a864e
#include "types.h"
Packit 8a864e
#include "Boolean.h"
Packit 8a864e
#include "ISet.h"
Packit 8a864e
#include "StringC.h"
Packit 8a864e
#include "SubstTable.h"
Packit 8a864e
#include "HashTable.h"
Packit 8a864e
#include "Vector.h"
Packit 8a864e
#include "Resource.h"
Packit 8a864e
#include "XcharMap.h"
Packit 8a864e
#include "EntityCatalog.h"
Packit 8a864e
Packit 8a864e
#ifdef SP_NAMESPACE
Packit 8a864e
namespace SP_NAMESPACE {
Packit 8a864e
#endif
Packit 8a864e
Packit 8a864e
class Sd;
Packit 8a864e
class CharsetInfo;
Packit 8a864e
Packit 8a864e
class SP_API Syntax : public Resource, public EntityCatalog::Syntax {
Packit 8a864e
public:
Packit 8a864e
  enum ReservedName {
Packit 8a864e
    rALL,
Packit 8a864e
    rANY,
Packit 8a864e
    rATTLIST,
Packit 8a864e
    rCDATA,
Packit 8a864e
    rCONREF,
Packit 8a864e
    rCURRENT,
Packit 8a864e
    rDATA,
Packit 8a864e
    rDEFAULT,
Packit 8a864e
    rDOCTYPE,
Packit 8a864e
    rELEMENT,
Packit 8a864e
    rEMPTY,
Packit 8a864e
    rENDTAG,
Packit 8a864e
    rENTITIES,
Packit 8a864e
    rENTITY,
Packit 8a864e
    rFIXED,
Packit 8a864e
    rID,
Packit 8a864e
    rIDLINK,
Packit 8a864e
    rIDREF,
Packit 8a864e
    rIDREFS,
Packit 8a864e
    rIGNORE,
Packit 8a864e
    rIMPLICIT,
Packit 8a864e
    rIMPLIED,
Packit 8a864e
    rINCLUDE,
Packit 8a864e
    rINITIAL,
Packit 8a864e
    rLINK,
Packit 8a864e
    rLINKTYPE,
Packit 8a864e
    rMD,
Packit 8a864e
    rMS,
Packit 8a864e
    rNAME,
Packit 8a864e
    rNAMES,
Packit 8a864e
    rNDATA,
Packit 8a864e
    rNMTOKEN,
Packit 8a864e
    rNMTOKENS,
Packit 8a864e
    rNOTATION,
Packit 8a864e
    rNUMBER,
Packit 8a864e
    rNUMBERS,
Packit 8a864e
    rNUTOKEN,
Packit 8a864e
    rNUTOKENS,
Packit 8a864e
    rO,
Packit 8a864e
    rPCDATA,
Packit 8a864e
    rPI,
Packit 8a864e
    rPOSTLINK,
Packit 8a864e
    rPUBLIC,
Packit 8a864e
    rRCDATA,
Packit 8a864e
    rRE,
Packit 8a864e
    rREQUIRED,
Packit 8a864e
    rRESTORE,
Packit 8a864e
    rRS,
Packit 8a864e
    rSDATA,
Packit 8a864e
    rSHORTREF,
Packit 8a864e
    rSIMPLE,
Packit 8a864e
    rSPACE,
Packit 8a864e
    rSTARTTAG,
Packit 8a864e
    rSUBDOC,
Packit 8a864e
    rSYSTEM,
Packit 8a864e
    rTEMP,
Packit 8a864e
    rUSELINK,
Packit 8a864e
    rUSEMAP
Packit 8a864e
  };
Packit 8a864e
  enum { nNames = rUSEMAP + 1 };
Packit 8a864e
  enum Quantity {
Packit 8a864e
    qATTCNT,
Packit 8a864e
    qATTSPLEN,
Packit 8a864e
    qBSEQLEN,
Packit 8a864e
    qDTAGLEN,
Packit 8a864e
    qDTEMPLEN,
Packit 8a864e
    qENTLVL,
Packit 8a864e
    qGRPCNT,
Packit 8a864e
    qGRPGTCNT,
Packit 8a864e
    qGRPLVL,
Packit 8a864e
    qLITLEN,
Packit 8a864e
    qNAMELEN,
Packit 8a864e
    qNORMSEP,
Packit 8a864e
    qPILEN,
Packit 8a864e
    qTAGLEN,
Packit 8a864e
    qTAGLVL
Packit 8a864e
  };
Packit 8a864e
  enum { nQuantity = qTAGLVL + 1 };
Packit 8a864e
  enum { unlimited = 100000000 };
Packit 8a864e
  enum DelimGeneral {
Packit 8a864e
    dAND,
Packit 8a864e
    dCOM,
Packit 8a864e
    dCRO,
Packit 8a864e
    dDSC,
Packit 8a864e
    dDSO,
Packit 8a864e
    dDTGC,
Packit 8a864e
    dDTGO,
Packit 8a864e
    dERO,
Packit 8a864e
    dETAGO,
Packit 8a864e
    dGRPC,
Packit 8a864e
    dGRPO,
Packit 8a864e
    dHCRO, // WWW TC addition
Packit 8a864e
    dLIT,
Packit 8a864e
    dLITA,
Packit 8a864e
    dMDC,
Packit 8a864e
    dMDO,
Packit 8a864e
    dMINUS,
Packit 8a864e
    dMSC,
Packit 8a864e
    dNET,
Packit 8a864e
    dNESTC, // WWW TC addition
Packit 8a864e
    dOPT,
Packit 8a864e
    dOR,
Packit 8a864e
    dPERO,
Packit 8a864e
    dPIC,
Packit 8a864e
    dPIO,
Packit 8a864e
    dPLUS,
Packit 8a864e
    dREFC,
Packit 8a864e
    dREP,
Packit 8a864e
    dRNI,
Packit 8a864e
    dSEQ,
Packit 8a864e
    dSTAGO,
Packit 8a864e
    dTAGC,
Packit 8a864e
    dVI
Packit 8a864e
  };
Packit 8a864e
  enum { nDelimGeneral = dVI + 1 };
Packit 8a864e
  enum StandardFunction {
Packit 8a864e
    fRE,
Packit 8a864e
    fRS,
Packit 8a864e
    fSPACE
Packit 8a864e
  };
Packit 8a864e
  enum FunctionClass {
Packit 8a864e
    cFUNCHAR,
Packit 8a864e
    cSEPCHAR,
Packit 8a864e
    cMSOCHAR,
Packit 8a864e
    cMSICHAR,
Packit 8a864e
    cMSSCHAR
Packit 8a864e
  };
Packit 8a864e
  enum Set {
Packit 8a864e
    nameStart,
Packit 8a864e
    digit,
Packit 8a864e
    hexDigit,
Packit 8a864e
    nmchar,			// LCNMCHAR or UCNMCHAR
Packit 8a864e
    s,
Packit 8a864e
    blank,
Packit 8a864e
    sepchar,
Packit 8a864e
    minimumData,
Packit 8a864e
    significant,
Packit 8a864e
    functionChar,		// function character
Packit 8a864e
    sgmlChar
Packit 8a864e
  };
Packit 8a864e
  enum { nSet = sgmlChar + 1 };
Packit 8a864e
  enum Category {
Packit 8a864e
    otherCategory = 0,
Packit 8a864e
    sCategory = 01,
Packit 8a864e
    nameStartCategory = 02,
Packit 8a864e
    digitCategory = 04,
Packit 8a864e
    otherNameCategory = 010
Packit 8a864e
    };
Packit 8a864e
Packit 8a864e
  Syntax(const Sd &);
Packit 8a864e
  virtual ~Syntax();
Packit 8a864e
  Boolean lookupFunctionChar(const StringC &, Char *) const;
Packit 8a864e
  HashTableIter<StringC,Char> functionIter() const;
Packit 8a864e
  Boolean charFunctionName(Char c, const StringC *&name) const;
Packit 8a864e
  Boolean lookupReservedName(const StringC &, ReservedName *) const;
Packit 8a864e
  const StringC &reservedName(ReservedName) const;
Packit 8a864e
  StringC rniReservedName(ReservedName) const;
Packit 8a864e
  Number quantity(Quantity) const;
Packit 8a864e
  Char standardFunction(int) const;
Packit 8a864e
  Boolean getStandardFunction(int, Char &) const;
Packit 8a864e
  const StringC &delim() const;
Packit 8a864e
  const ISet<Char> *charSet(int i) const;
Packit 8a864e
  const SubstTable *generalSubstTable() const;
Packit 8a864e
  const SubstTable *entitySubstTable() const;
Packit 8a864e
  const SubstTable &upperSubstTable() const;
Packit 8a864e
  Boolean namecaseGeneral() const;
Packit 8a864e
  Boolean namecaseEntity() const;
Packit 8a864e
  const StringC &peroDelim() const;
Packit 8a864e
  const StringC &delimGeneral(int) const;
Packit 8a864e
  const StringC &delimShortrefComplex(size_t) const;
Packit 8a864e
  const ISet<Char> &delimShortrefSimple() const;
Packit 8a864e
  int nDelimShortrefComplex() const;
Packit 8a864e
  Boolean isValidShortref(const StringC &) const;
Packit 8a864e
  Boolean hasShortrefs() const;
Packit 8a864e
  Boolean isNameCharacter(Xchar) const;
Packit 8a864e
  Boolean isNameStartCharacter(Xchar) const;
Packit 8a864e
  Boolean isDigit(Xchar) const;
Packit 8a864e
  Boolean isHexDigit(Xchar) const;
Packit 8a864e
  Boolean isS(Xchar) const;
Packit 8a864e
  Boolean isB(Xchar c) const;
Packit 8a864e
  Category charCategory(Xchar) const;
Packit 8a864e
  Boolean isSgmlChar(Xchar) const;
Packit 8a864e
  size_t attcnt() const;
Packit 8a864e
  size_t attsplen() const;
Packit 8a864e
  size_t namelen() const;
Packit 8a864e
  size_t penamelen() const;
Packit 8a864e
  size_t litlen() const;
Packit 8a864e
  size_t normsep() const;
Packit 8a864e
  size_t dtemplen() const;
Packit 8a864e
  size_t grpcnt() const;
Packit 8a864e
  size_t grpgtcnt() const;
Packit 8a864e
  size_t grplvl() const;
Packit 8a864e
  size_t taglvl() const;
Packit 8a864e
  size_t taglen() const;
Packit 8a864e
  size_t entlvl() const;
Packit 8a864e
  size_t pilen() const;
Packit 8a864e
  Char space() const;
Packit 8a864e
  
Packit 8a864e
  void setStandardFunction(StandardFunction, Char);
Packit 8a864e
  void enterStandardFunctionNames();
Packit 8a864e
  void addFunctionChar(const StringC &, FunctionClass, Char);
Packit 8a864e
  void setNamecaseGeneral(Boolean);
Packit 8a864e
  void setNamecaseEntity(Boolean);
Packit 8a864e
  void setDelimGeneral(int, const StringC &);
Packit 8a864e
  void addDelimShortref(const StringC &, const CharsetInfo &);
Packit 8a864e
  void addDelimShortrefs(const ISet<Char> &shortrefChars,
Packit 8a864e
			 const CharsetInfo &charset);
Packit 8a864e
  void addNameCharacters(const ISet<Char> &);
Packit 8a864e
  void addNameStartCharacters(const ISet<Char> &);
Packit 8a864e
  void addSubst(Char lc, Char uc);
Packit 8a864e
  void addShunchar(Char);
Packit 8a864e
  void setShuncharControls();
Packit 8a864e
  void setQuantity(int, Number);
Packit 8a864e
  void setName(int, const StringC &);
Packit 8a864e
  void setSgmlChar(const ISet<Char> &);
Packit 8a864e
  void implySgmlChar(const Sd &);
Packit 8a864e
  // :: is for Watcom 10.0a
Packit 8a864e
  void checkSgmlChar(const Sd &,
Packit 8a864e
		     const ::SP_NAMESPACE_SCOPE Syntax *otherSyntax,
Packit 8a864e
		     Boolean invalidUseDocumentCharset,
Packit 8a864e
		     ISet<WideChar> &invalid)
Packit 8a864e
       const;
Packit 8a864e
  static int referenceQuantity(Quantity);
Packit 8a864e
  const XcharMap<unsigned char> &markupScanTable() const;
Packit 8a864e
  Boolean multicode() const;
Packit 8a864e
  void addEntity(const StringC &, Char);
Packit 8a864e
  size_t nEntities() const;
Packit 8a864e
  const StringC &entityName(size_t) const;
Packit 8a864e
  Char entityChar(size_t) const;
Packit 8a864e
private:
Packit 8a864e
  void subst(Char, Char);
Packit 8a864e
  void checkUnivControlChar(UnivChar univChar,
Packit 8a864e
			    const CharsetInfo &docCharset,
Packit 8a864e
			    const ::SP_NAMESPACE_SCOPE Syntax *otherSyntax,
Packit 8a864e
			    ISet<WideChar> &invalid) const;
Packit 8a864e
Packit 8a864e
  ISet<Char> shunchar_;
Packit 8a864e
  PackedBoolean shuncharControls_;
Packit 8a864e
  ISet<Char> set_[nSet];
Packit 8a864e
  Char standardFunction_[3];
Packit 8a864e
  PackedBoolean standardFunctionValid_[3];
Packit 8a864e
  Boolean namecaseGeneral_;
Packit 8a864e
  Boolean namecaseEntity_;
Packit 8a864e
  StringC delimGeneral_[nDelimGeneral];
Packit 8a864e
  Vector<StringC> delimShortrefComplex_;
Packit 8a864e
  ISet<Char> delimShortrefSimple_;
Packit 8a864e
  StringC names_[nNames];
Packit 8a864e
  Number quantity_[nQuantity];
Packit 8a864e
  HashTable<StringC,int> nameTable_;
Packit 8a864e
  HashTable<StringC,Char> functionTable_;
Packit 8a864e
  SubstTable upperSubst_;
Packit 8a864e
  SubstTable identitySubst_;
Packit 8a864e
  const SubstTable *generalSubst_;
Packit 8a864e
  const SubstTable *entitySubst_;
Packit 8a864e
  XcharMap<unsigned char> categoryTable_;
Packit 8a864e
  Boolean multicode_;
Packit 8a864e
  XcharMap<unsigned char> markupScanTable_;
Packit 8a864e
  Boolean hasMarkupScanTable_;
Packit 8a864e
  Vector<StringC> entityNames_;
Packit 8a864e
  StringC entityChars_;
Packit 8a864e
  static const int referenceQuantity_[];
Packit 8a864e
};
Packit 8a864e
Packit 8a864e
inline Number Syntax::quantity(Quantity q) const
Packit 8a864e
{
Packit 8a864e
  return quantity_[q];
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
inline void Syntax::setQuantity(int i, Number n)
Packit 8a864e
{
Packit 8a864e
  quantity_[i] = n;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
inline const SubstTable *Syntax::generalSubstTable() const
Packit 8a864e
{
Packit 8a864e
  return generalSubst_;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
inline const SubstTable *Syntax::entitySubstTable() const
Packit 8a864e
{
Packit 8a864e
  return entitySubst_;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
inline int Syntax::nDelimShortrefComplex() const
Packit 8a864e
{
Packit 8a864e
  return int(delimShortrefComplex_.size());
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
inline const StringC &Syntax::delimGeneral(int i) const
Packit 8a864e
{
Packit 8a864e
  return delimGeneral_[i];
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
inline const StringC &Syntax::delimShortrefComplex(size_t i) const
Packit 8a864e
{
Packit 8a864e
  return delimShortrefComplex_[i];
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
inline const ISet<Char> &Syntax::delimShortrefSimple() const
Packit 8a864e
{
Packit 8a864e
  return delimShortrefSimple_;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
inline Boolean Syntax::hasShortrefs() const
Packit 8a864e
{
Packit 8a864e
  return delimShortrefComplex_.size() > 0 || !delimShortrefSimple_.isEmpty();
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
inline Char Syntax::standardFunction(int i) const
Packit 8a864e
{
Packit 8a864e
  return standardFunction_[i];
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
inline Boolean Syntax::getStandardFunction(int i, Char &result) const
Packit 8a864e
{
Packit 8a864e
  if (standardFunctionValid_[i]) {
Packit 8a864e
    result = standardFunction_[i];
Packit 8a864e
    return 1;
Packit 8a864e
  }
Packit 8a864e
  else
Packit 8a864e
    return 0;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
inline const ISet<Char> *Syntax::charSet(int i) const
Packit 8a864e
{
Packit 8a864e
  return &set_[i];
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
inline Boolean Syntax::isNameCharacter(Xchar c) const
Packit 8a864e
{
Packit 8a864e
  return categoryTable_[c] >= nameStartCategory;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
inline Boolean Syntax::isNameStartCharacter(Xchar c) const
Packit 8a864e
{
Packit 8a864e
  return categoryTable_[c] == nameStartCategory;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
inline Boolean Syntax::isDigit(Xchar c) const
Packit 8a864e
{
Packit 8a864e
  return categoryTable_[c] == digitCategory;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
inline Boolean Syntax::isS(Xchar c) const
Packit 8a864e
{
Packit 8a864e
  return categoryTable_[c] == sCategory;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
inline Boolean Syntax::isB(Xchar c) const
Packit 8a864e
{
Packit 8a864e
  return (categoryTable_[c] == sCategory
Packit 8a864e
	  && !(standardFunctionValid_[fRE] && c == standardFunction_[fRE])
Packit 8a864e
	  && !(standardFunctionValid_[fRS] && c == standardFunction_[fRS]));
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
inline Syntax::Category Syntax::charCategory(Xchar c) const
Packit 8a864e
{
Packit 8a864e
  return Category(categoryTable_[c]);
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
inline Boolean Syntax::isSgmlChar(Xchar c) const
Packit 8a864e
{
Packit 8a864e
  return c >= 0 && set_[sgmlChar].contains(Char(c));
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
inline const StringC &Syntax::reservedName(ReservedName i) const
Packit 8a864e
{
Packit 8a864e
  return names_[i];
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
inline size_t Syntax::attcnt() const
Packit 8a864e
{
Packit 8a864e
  return quantity(Syntax::qATTCNT);
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
inline size_t Syntax::attsplen() const
Packit 8a864e
{
Packit 8a864e
  return quantity(Syntax::qATTSPLEN);
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
inline size_t Syntax::namelen() const
Packit 8a864e
{
Packit 8a864e
  return quantity(Syntax::qNAMELEN);
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
inline size_t Syntax::penamelen() const
Packit 8a864e
{
Packit 8a864e
  return quantity(Syntax::qNAMELEN) - delimGeneral(Syntax::dPERO).size();
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
inline size_t Syntax::litlen() const
Packit 8a864e
{
Packit 8a864e
  return quantity(Syntax::qLITLEN);
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
inline size_t Syntax::normsep() const
Packit 8a864e
{
Packit 8a864e
  return quantity(Syntax::qNORMSEP);
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
inline size_t Syntax::dtemplen() const
Packit 8a864e
{
Packit 8a864e
  return quantity(Syntax::qDTEMPLEN);
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
inline size_t Syntax::grpcnt() const
Packit 8a864e
{
Packit 8a864e
  return quantity(Syntax::qGRPCNT);
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
inline size_t Syntax::grpgtcnt() const
Packit 8a864e
{
Packit 8a864e
  return quantity(Syntax::qGRPGTCNT);
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
inline size_t Syntax::grplvl() const
Packit 8a864e
{
Packit 8a864e
  return quantity(Syntax::qGRPLVL);
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
inline size_t Syntax::taglvl() const
Packit 8a864e
{
Packit 8a864e
  return quantity(Syntax::qTAGLVL);
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
inline size_t Syntax::taglen() const
Packit 8a864e
{
Packit 8a864e
  return quantity(Syntax::qTAGLEN);
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
inline size_t Syntax::entlvl() const
Packit 8a864e
{
Packit 8a864e
  return quantity(Syntax::qENTLVL);
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
inline size_t Syntax::pilen() const
Packit 8a864e
{
Packit 8a864e
  return quantity(Syntax::qPILEN);
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
inline Char Syntax::space() const
Packit 8a864e
{
Packit 8a864e
  return standardFunction(Syntax::fSPACE);
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
inline void Syntax::setSgmlChar(const ISet<Char> &set)
Packit 8a864e
{
Packit 8a864e
  set_[sgmlChar] = set;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
inline int Syntax::referenceQuantity(Quantity i)
Packit 8a864e
{
Packit 8a864e
  return referenceQuantity_[i];
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
inline void Syntax::setShuncharControls()
Packit 8a864e
{
Packit 8a864e
  shuncharControls_ = 1;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
inline const XcharMap<unsigned char> &Syntax::markupScanTable() const
Packit 8a864e
{
Packit 8a864e
  return markupScanTable_;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
inline Boolean Syntax::multicode() const
Packit 8a864e
{
Packit 8a864e
  return multicode_;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
inline Boolean Syntax::namecaseGeneral() const
Packit 8a864e
{
Packit 8a864e
  return namecaseGeneral_;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
inline Boolean Syntax::namecaseEntity() const
Packit 8a864e
{
Packit 8a864e
  return namecaseEntity_;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
inline size_t Syntax::nEntities() const
Packit 8a864e
{
Packit 8a864e
  return entityNames_.size();
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
inline const StringC &Syntax::entityName(size_t i) const
Packit 8a864e
{
Packit 8a864e
  return entityNames_[i];
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
inline Char Syntax::entityChar(size_t i) const
Packit 8a864e
{
Packit 8a864e
  return entityChars_[i];
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
#ifdef SP_NAMESPACE
Packit 8a864e
}
Packit 8a864e
#endif
Packit 8a864e
Packit 8a864e
#endif /* Syntax_INCLUDED */