parseDecl.cxx revision 7c478bd95313f5f23a4c958a745db2134aa03244
// Copyright (c) 1994, 1995 James Clark
// See the file COPYING for copying permission.
#pragma ident "%Z%%M% %I% %E% SMI"
// Prolog, dtd and declaration parsing.
#include "splib.h"
#include "Parser.h"
#include "Param.h"
#include "Markup.h"
#include "ParserMessages.h"
#include "MessageArg.h"
#include "TokenMessageArg.h"
#include "token.h"
#include "macros.h"
#ifdef SP_NAMESPACE
namespace SP_NAMESPACE {
#endif
static AllowedParams
static AllowedParams
static const AllowedParams
{
const unsigned maxTries = 10;
unsigned tries = 0;
do {
if (cancelled()) {
allDone();
return;
}
switch (token) {
case tokenUnrecognized:
if (reportNonSgmlCharacter())
break;
if (hadDtd()) {
currentInput()->ungetToken();
endProlog();
return;
}
{
if (lookingAtStartTag(gi)) {
currentInput()->ungetToken();
return;
}
}
giveUp();
return;
}
break;
case tokenEe:
if (hadDtd()) {
endProlog();
return;
}
allDone();
return;
case tokenMdoMdc:
// empty comment
break;
case tokenMdoCom:
if (!parseCommentDecl())
break;
case tokenMdoNameStart:
if (parseDeclarationName(&name)) {
switch (name) {
if (!parseDoctypeDeclStart())
giveUp();
return;
if (!parseLinktypeDeclStart())
giveUp();
return;
if (!hadDtd())
tries++;
break;
default:
break;
}
}
else
break;
case tokenPio:
if (!parseProcessingInstruction())
break;
case tokenS:
if (eventsWanted().wantPrologMarkup()) {
extendS();
1));
}
break;
default:
}
} while (eventQueueEmpty());
}
{
#if 0
#endif
) {
// We could continue, but there's not a lot of point.
giveUp();
return;
}
if (maybeStartPass2())
else {
if (inputLevel() == 0) {
allDone();
return;
}
if (pass2())
for (size_t i = 0; i < nActiveLink(); i++)
}
else
lpd,
currentLocation()));
}
}
void Parser::prologRecover()
{
unsigned skipCount = 0;
const unsigned skipMax = 250;
for (;;) {
skipCount++;
if (token == tokenUnrecognized) {
return;
}
}
switch (token) {
case tokenUnrecognized:
(void)getChar();
break;
case tokenEe:
return;
case tokenMdoMdc:
case tokenMdoCom:
case tokenMdoNameStart:
case tokenPio:
currentInput()->ungetToken();
return;
case tokenS:
return;
default:
break;
}
}
}
void Parser::doDeclSubset()
{
do {
if (cancelled()) {
allDone();
return;
}
unsigned startLevel = inputLevel();
switch (token) {
case tokenUnrecognized:
if (reportNonSgmlCharacter())
break;
break;
case tokenEe:
if (inputLevel() == specialParseInputLevel()) {
// FIXME have separate messages for each type of special parse
}
if (eventsWanted().wantPrologMarkup())
if (inputLevel() == 2) {
const Entity *e
if (e
// popInputStack may destroy e
if (!(inDtd
: parseLinktypeDeclEnd()))
; // FIXME recover
return;
}
}
if (inputLevel() == 1) {
if (finalPhase() == declSubsetPhase) {
endDtd();
}
else
// Give message before popping stack.
allDone();
}
else
return;
case tokenDsc: // end of declaration subset
// FIXME what's the right location?
if (!referenceDsEntity(currentLocation())) {
; // FIXME recover
}
return;
case tokenMdoNameStart: // named markup declaration
if (parseDeclarationName(&name,
switch (name) {
result = parseAfdrDecl();
break;
if (inDtd)
result = parseElementDecl();
else {
result = 0;
}
break;
result = parseAttlistDecl();
break;
result = parseEntityDecl();
break;
result = parseNotationDecl();
break;
if (inDtd)
result = parseShortrefDecl();
else {
result = 0;
}
break;
if (inDtd)
result = parseUsemapDecl();
else {
result = 0;
}
break;
if (inDtd) {
result = 0;
}
else
result = parseLinkDecl();
break;
if (inDtd) {
result = 0;
}
else
result = parseIdlinkDecl();
break;
result = 0;
break;
default:
result = 0;
break;
}
}
else
result = 0;
if (!result)
break;
case tokenMdoMdc: // empty comment declaration
// empty comment
break;
case tokenMdoCom: // comment declaration
if (!parseCommentDecl())
break;
case tokenMdoDso: // marked section declaration
if (!parseMarkedSectionDeclStart())
break;
case tokenMscMdc:
break;
case tokenPeroGrpo: // parameter entity reference with name group
// fall through
case tokenPeroNameStart: // parameter entity reference
{
}
else
}
break;
case tokenPio: // processing instruction
if (!parseProcessingInstruction())
break;
case tokenS: // white space
if (eventsWanted().wantPrologMarkup()) {
extendS();
1));
}
break;
case tokenIgnoredChar:
// from an ignored marked section
if (eventsWanted().wantPrologMarkup())
1));
break;
case tokenRe:
case tokenRs:
case tokenCroNameStart:
case tokenCroDigit:
case tokenHcroHexDigit:
case tokenEroNameStart:
case tokenEroGrpo:
case tokenChar:
// these can occur in a cdata or rcdata marked section
break;
default:
}
} while (eventQueueEmpty());
}
{
for (;;) {
switch (token) {
case tokenUnrecognized:
(void)getChar();
break;
case tokenEe:
if (inputLevel() <= startLevel)
return;
break;
case tokenMdoCom:
case tokenDsc:
case tokenMdoNameStart:
case tokenMdoMdc:
case tokenMdoDso:
case tokenMscMdc:
case tokenPio:
if (inputLevel() == startLevel) {
currentInput()->ungetToken();
return;
}
break;
default:
break;
}
}
}
{
// This is harder than might be expected since we may not have compiled
// the recognizers for the instance yet.
i++)
return 0;
return 0;
if (!instanceSyntax().isNameStartCharacter(c))
return 0;
do {
} while (instanceSyntax().isNameCharacter(c));
return 1;
}
{
currentInput()->discardInitial();
if (currentMarkup())
}
else {
return 0;
}
}
else if (currentMarkup())
return 1;
}
{
unsigned declInputLevel = inputLevel();
return 0;
if (options().warnElementGroupDecl)
}
else {
}
static AllowedParams
Param::modelGroup);
return 0;
size_t i;
name += rankSuffix;
constRankStems[i] = rankStems[i];
}
static AllowedParams
Param::modelGroup);
if (token == tokenNameStart)
currentInput()->ungetToken();
return 0;
}
else {
}
unsigned char omitFlags = 0;
if (options().warnMinimizationParam)
return 0;
Param::modelGroup);
return 0;
}
else {
}
return 0;
if (options().warnCdataContent)
break;
return 0;
if (options().warnRcdataContent)
break;
&& options().warnShould)
return 0;
break;
return 0;
break;
case Param::modelGroup:
{
// The outermost model group isn't formally a content token.
if (validate()) {
for (i = 0; i < ambiguities.size(); i++) {
const ContentModelAmbiguity &a = ambiguities[i];
}
}
return 0;
}
break;
}
if (rankSuffix.size() > 0)
if (elements[i]->definition() != 0) {
if (validate())
}
else {
}
}
if (currentMarkup()) {
v[i] = elements[i];
currentMarkup()));
}
return 1;
}
const LeafContentToken *to1,
const LeafContentToken *to2,
unsigned ambigAndDepth)
{
if (toType)
else {
}
else {
if (fromType)
else {
}
if (andMatches == 0)
else if (andMatches == 1)
else
}
}
// Check the compatibility of the attribute definition with
// the element definition.
{
if (!validate())
return;
ASSERT(e != 0);
if (p->isConref())
conref = 1;
if (p->isNotation()
}
if (conref) {
#if 0
&& options().warnShould)
#endif
}
}
{
if (!e) {
if (haveDefLpd())
else {
defDtd().insertElementType(e);
}
}
return e;
}
{
if (!r) {
defDtd().insertRankStem(r);
if (e && e->definition() != 0)
}
return r;
}
{
static AllowedParams
return 0;
if (options().warnExclusion)
return 0;
}
if (options().warnInclusion)
if (nE) {
StringMessageArg(e->name()));
}
}
return 0;
}
return 1;
}
{
unsigned declInputLevel = inputLevel();
Boolean anyCurrent = 0;
return 0;
return 0;
attcnt++;
size_t i;
duplicate = 1;
break;
}
return 0;
if (!duplicate) {
if (declaredValue->isId()) {
}
else if (declaredValue->isNotation()) {
}
}
if (tokensPtr) {
for (i = 0; i < nTokens; i++) {
StringMessageArg(tokens[i]));
break;
}
}
}
}
return 0;
if (!duplicate) {
}
return 0;
}
if (haveDefLpd() && !isNotation) {
if (e) {
else
StringMessageArg(e->name()));
}
else
StringMessageArg(e->name()));
}
}
}
else {
if (e) {
else
StringMessageArg(e->name()));
}
}
}
}
else {
defDtd()
if (!isNotation) {
if (e->definition() != 0)
}
}
if (isNotation)
else
}
else {
}
{
// Use block to make sure temporary gets destroyed.
}
= new AttributeDefinitionList(copy,
curAdl->anyCurrent(),
curAdl->notationIndex());
}
// FIXME check for multiple ID and NOTATION attributes
unsigned tem;
}
if (!isNotation) {
if (e->definition() != 0)
}
}
}
}
if (currentMarkup()) {
if (isNotation) {
v[i] = (Notation *)attributed[i];
.attlistNotationDecl(new (eventAllocator())
currentMarkup()));
}
else {
v[i] = (ElementType *)attributed[i];
if (haveDefLpd())
.linkAttlistDecl(new (eventAllocator())
currentMarkup()));
else
currentMarkup()));
}
}
if (isNotation) {
for (;;) {
break;
if (external) {
attributes.finish(*this);
}
}
}
}
return 1;
}
{
static AllowedParams
static AllowedParams
if (!parseParam(haveDefLpd()
return 0;
if (options().warnDataAttributes)
isNotation = 1;
static AllowedParams
if (!parseParam(haveDefLpd()
return 0;
}
else {
}
attributed[0]
}
}
else {
isNotation = 0;
if (options().warnAttlistGroupDecl)
}
else {
}
attributed[0]
}
}
return 1;
}
{
};
return 0;
declaredValue = new CdataDeclaredValue;
break;
declaredValue = new EntityDeclaredValue(0);
break;
break;
declaredValue = new IdDeclaredValue;
allowedFlags = 0;
break;
declaredValue = new IdrefDeclaredValue(0);
allowedFlags = 0;
break;
allowedFlags = 0;
break;
if (options().warnNameDeclaredValue)
break;
if (options().warnNameDeclaredValue)
break;
break;
break;
if (options().warnNumberDeclaredValue)
break;
if (options().warnNumberDeclaredValue)
break;
if (options().warnNutokenDeclaredValue)
break;
if (options().warnNutokenDeclaredValue)
break;
{
return 0;
allowedFlags = 0;
}
break;
case Param::nameTokenGroup:
{
}
break;
default:
}
if (isNotation) {
if (!(allowedFlags & asDataAttribute))
}
return 1;
}
const StringC &attributeName,
{
// default value
static AllowedParams
static AllowedParams
return 0;
{
static AllowedParams
return 0;
unsigned specLength = 0;
*this,
if (declaredValue->isId())
value);
}
break;
case Param::attributeValue:
// falll through
case Param::attributeValueLiteral:
{
unsigned specLength = 0;
*this,
if (declaredValue->isId())
value);
}
break;
declaredValue.extract());
break;
anyCurrent = 1;
if (declaredValue->isId())
if (isNotation)
else if (haveDefLpd())
else if (options().warnCurrent)
break;
if (declaredValue->isId())
declaredValue.extract());
if (isNotation)
else if (haveDefLpd())
else if (options().warnConref)
break;
declaredValue.extract());
break;
default:
}
return 1;
}
// parm contains either system or public
const AllowedParams &endAllow,
unsigned declInputLevel,
ExternalId &id)
{
return 0;
const MessageType1 *err;
err)) {
}
}
return 0;
return 0;
}
return 1;
}
{
unsigned declInputLevel = inputLevel();
return 0;
static AllowedParams
return 0;
return 0;
if (publicId
}
if (!nt->defined()) {
nt->generateSystemId(*this);
if (currentMarkup())
currentMarkup()));
}
return 1;
}
{
unsigned declInputLevel = inputLevel();
static AllowedParams
return 0;
return 0;
}
else {
else if (options().warnDefaultEntityDecl)
}
static AllowedParams
return 0;
if (options().warnInternalCdataEntity)
break;
if (options().warnInternalSdataEntity)
break;
if (options().warnPiEntity)
break;
if (options().warnBracketEntity)
break;
if (options().warnBracketEntity)
break;
if (options().warnBracketEntity)
break;
if (options().warnBracketEntity)
break;
}
return 0;
}
switch (bracketed) {
case InternalTextEntity::starttag:
break;
case InternalTextEntity::endtag:
break;
case InternalTextEntity::ms:
break;
case InternalTextEntity::md:
break;
default:
}
0));
0));
}
return 0;
return 1;
}
switch (dataType) {
break;
break;
break;
break;
default:
break;
}
return 1;
}
unsigned declInputLevel,
{
static AllowedParams
static AllowedParams
return 0;
id));
return 1;
}
return 0;
}
else {
if (options().warnExternalCdataEntity)
break;
if (options().warnExternalSdataEntity)
break;
break;
default:
}
return 0;
return 0;
if (attributes.size() == 0)
return 0;
}
if (attributes.nSpec() == 0)
return 0;
}
else
attributes.finish(*this);
}
return 1;
}
return 1;
}
{
}
}
{
if (haveDefLpd())
defLpd().namePointer(),
else
if (oldEntity == 0
else {
ignored = 1;
if (options().warnDuplicateEntity)
}
}
else {
entity->generateSystemId(*this);
entity->generateSystemId(*this);
}
else {
entity->generateSystemId(*this);
}
else {
ignored = 1;
if (options().warnDuplicateEntity)
}
}
}
if (currentMarkup())
currentMarkup()));
}
{
unsigned declInputLevel = inputLevel();
return 0;
int valid = 1;
if (map->defined()) {
map->defLocation());
valid = 0;
}
else
return 0;
do {
valid = 0;
}
return 0;
if (valid) {
valid = 0;
}
else
}
return 0;
if (valid) {
if (currentMarkup())
currentMarkup()));
}
return 1;
}
{
prettyDelim += *nameP;
}
else
prettyDelim += delim[i];
}
return prettyDelim;
}
{
if (!map) {
}
return map;
}
{
unsigned declInputLevel = inputLevel();
static AllowedParams
return 0;
const ShortReferenceMap *map;
if (inInstance()) {
if (!map)
}
else {
}
}
else
map = &theEmptyMap;
static AllowedParams
return 0;
if (inInstance()) {
return 0;
}
else {
Vector<const ElementType *> v;
v.push_back(e);
if (!e->map())
}
else {
ElementType *e
v[i] = e;
if (!e->map())
}
}
return 0;
if (currentMarkup())
UsemapEvent(map, v,
currentMarkup()));
}
}
else {
if (!inInstance())
else if (map) {
else {
if (currentMarkup()) {
Vector<const ElementType *> v;
UsemapEvent(map, v,
currentMarkup()));
}
}
}
}
return 1;
}
{
if (hadLpd())
unsigned declInputLevel = inputLevel();
return 0;
static AllowedParams
return 0;
return 0;
tem->generateSystemId(*this);
#if 0
.externalEntityDecl(new (eventAllocator())
#endif
}
if (!sd().implydefElement()) {
}
}
// Discard mdc or dso
if (currentMarkup())
currentMarkup()));
// unget the mdc
currentInput()->ungetToken();
(void)parseDoctypeDeclEnd();
return 1;
}
// reference the entity
(void)parseDoctypeDeclEnd();
return 1;
}
}
return 1;
}
{
#if 0
if (currentMarkup()) {
}
#endif
currentMarkup()));
return;
}
// The null location indicates that this is a fake entity.
if (sd().implydefDoctype())
tem->generateSystemId(*this);
else {
// Don't use Entity::generateSystemId because we don't want an error
// if it fails.
currentMarkup()));
return;
}
#if 0
if (currentMarkup()) {
}
#endif
Location(),
id);
}
currentMarkup()));
if (inputLevel() == 1)
else
}
{
endDtd();
if (fake) {
#if 0
if (currentMarkup())
#endif
}
else {
// End DTD before parsing final param so parameter entity reference
// not allowed between ] and >.
return 0;
}
currentMarkup()));
#if 0
if (fake) {
}
#endif
return 1;
}
{
ElementType *p;
int i = 0;
while ((p = elementIter.next()) != 0) {
if (p->definition() == 0) {
if (validate() && !implydefElement())
}
else if (options().warnUndefinedElement)
0,
p->setElementDefinition(def, i++);
}
if (validate())
StringMessageArg(p->name()));
p->setMap(0);
}
}
for (;;) {
if (!map)
break;
for (i = 0; i < nShortref; i++) {
if (entityName) {
}
else {
}
}
}
}
}
}
if (options().warnUnusedParam) {
for (;;) {
break;
}
}
}
if (!validate())
return;
for (;;) {
break;
if (external) {
if (!notation->defined()) {
}
}
}
for (;;) {
break;
}
}
{
{
if (e) {
commonAdl[0] = e->attributeDef();
delete e;
}
}
{
if (!allNotation.isNull()) {
}
}
PackedBoolean(0));
for (;;) {
Attributed *a;
if (!isNotation)
a = elementIter.next();
else
if (!a)
break;
unsigned tem;
tem))
}
}
}
}
}
{
if (e)
delete e;
}
{
if (!n.isNull())
}
}
{
if (!internal)
return 0;
};
size_t j = 0;
j++;
size_t k = 0;
== keyword[k]))
j++, k++;
j++;
return 1;
}
}
return 0;
}
{
unsigned declInputLevel = inputLevel();
return 0;
static AllowedParams
return 0;
simple = 1;
}
else {
simple = 0;
}
}
static AllowedParams
return 0;
if (simple) {
if (!sd().simpleLink())
}
else {
implied = 1;
if (!sd().implicitLink())
}
}
else {
if (simple)
else {
if (!sd().explicitLink())
}
}
static AllowedParams
return 0;
return 0;
tem->generateSystemId(*this);
#if 0
.externalEntityDecl(new (eventAllocator())
#endif
}
if (simple)
else
syntax(),
if (simple) {
nSimple++;
}
else {
Boolean haveImplicit = 0;
Boolean haveExplicit = 0;
size_t i;
for (i = 0; i < nActive; i++) {
haveImplicit = 1;
haveExplicit = 1;
}
if (implied && haveImplicit)
else if (haveExplicit || haveImplicit
else
}
}
// Discard mdc or dso
if (currentMarkup())
name,
currentMarkup()));
// unget the mdc
currentInput()->ungetToken();
(void)parseLinktypeDeclEnd();
return 1;
}
// reference the entity
(void)parseLinktypeDeclEnd();
return 1;
}
}
return 1;
}
{
if (!defComplexLpd().initialLinkSet()->defined())
if (!linkSet->defined())
}
endLpd();
currentMarkup()));
return result;
}
{
return parseLinkSet(0);
}
{
return parseLinkSet(1);
}
// This will only get called if we're defining a complex lpd.
{
return 0;
}
if (idlink) {
if (defComplexLpd().hadIdLinkSet())
else
}
unsigned declInputLevel = inputLevel();
if (idlink) {
return 0;
linkSet = 0;
}
else {
static AllowedParams
return 0;
else
if (linkSet->defined())
static AllowedParams
return 0;
}
do {
if (idlink) {
return 0;
}
return 0;
const ElementType *resultType;
parm,
return 0;
if (resultType) {
const AttributeList *dummy;
else
}
}
else {
SourceLinkRule *linkRule = 0;
if (idlink)
linkRule = &idLinkRule;
else {
}
}
else {
}
static AllowedParams
static AllowedParams
static AllowedParams
if (!parseParam(isExplicit
? allow2e
return 0;
static AllowedParams
return 0;
else
static AllowedParams
static AllowedParams
static AllowedParams
if (!parseParam(isExplicit
? allow3e
return 0;
}
return 0;
else {
else
}
static AllowedParams
static AllowedParams
static AllowedParams
if (!parseParam(isExplicit
? allow4e
return 0;
}
const ElementType *e = assocElementTypes[i];
if (e) {
if (i == 0)
// FIXME recover from this
}
}
return 0;
const ElementType *e = assocElementTypes[i];
}
}
static AllowedParams
if (!parseParam(isExplicit
? allow5e
return 0;
}
else
attributes.finish(*this);
if (isExplicit) {
const ElementType *resultType;
parm,
return 0;
if (!resultImplied)
}
// Install the link rule.
if (idlink) {
}
else {
if (!linkSet->defined()) {
if (assocElementTypes[i])
}
}
}
if (linkSet)
linkSet->setDefined();
if (currentMarkup()) {
if (idlink)
currentMarkup()));
else
currentMarkup()));
}
return 1;
}
{
}
const ElementType *sourceElement,
{
if ((nRules == 1
}
class ResultAttributeSpecModeSetter {
public:
}
~ResultAttributeSpecModeSetter() { clear(); }
void clear() {
if (state_) {
state_ = 0;
}
}
private:
};
const ElementType *&resultType,
{
return 0;
implied = 1;
}
else {
implied = 0;
resultType = e;
static AllowedParams
static AllowedParams
return 0;
if (e)
attDef = e->attributeDef();
return 0;
if (!r.isNull()) {
if (e)
e->setAttributeDef(newAttDef);
}
}
modeSetter.clear();
if (attributes.nSpec() == 0)
return 0;
}
else {
// For entity and notation attributes.
attributes.finish(*this);
modeSetter.clear();
}
}
return 1;
}
{
if (!dtd)
return 0;
if (!e)
return e;
}
{
unsigned declInputLevel = inputLevel();
return 0;
return 0;
return 0;
else {
if (!linkSet) {
return 1;
}
}
else {
linkSet = 0;
restore = 1;
}
currentMarkup()));
else
currentMarkup()));
}
return 1;
}
{
if (!linkSet) {
}
return linkSet;
}
{
if (!inInstance()
&& inputLevel() == 1)
if (markedSectionSpecialLevel() > 0) {
if (inInstance()
: eventsWanted().wantPrologMarkup())
0));
return 1;
}
if (startMarkup(inInstance()
: eventsWanted().wantPrologMarkup(),
currentLocation())) {
discardMarkup = 0;
}
discardMarkup = 1;
}
unsigned declInputLevel = inputLevel();
return 0;
break;
if (options().warnRcdataMarkedSection)
break;
break;
break;
if (options().warnTempMarkedSection)
break;
}
return 0;
}
// FIXME this disallows
// <!entity % e "include [ stuff ">
// ...
// <![ %e; ]]>
// which I think is legal.
if (inputLevel() > declInputLevel)
switch (status) {
case MarkedSectionEvent::include:
break;
case MarkedSectionEvent::cdata:
break;
case MarkedSectionEvent::rcdata:
break;
case MarkedSectionEvent::ignore:
break;
}
if (currentMarkup()) {
}
}
if (discardMarkup)
startMarkup(0, markupLocation());
}
currentMarkup()));
}
return 1;
}
void Parser::handleMarkedSectionEnd()
{
if (markedSectionLevel() == 0)
else {
if (inInstance()
: eventsWanted().wantPrologMarkup()) {
if (markedSectionSpecialLevel() > 1)
0));
else {
switch (currentMode()) {
case cmsMode:
break;
case rcmsMode:
break;
case imsMode:
break;
default:
status = MarkedSectionEvent::include;
break;
}
currentMarkup()));
}
}
}
}
void Parser::emptyCommentDecl()
{
currentMarkup()));
}
if (options().warnEmptyCommentDecl)
}
{
if (startMarkup(inInstance()
? eventsWanted().wantCommentDecls()
: eventsWanted().wantPrologMarkup(),
currentLocation()))
if (!parseComment(comMode))
return 0;
for (;;) {
switch (token) {
case tokenS:
if (currentMarkup())
if (options().warnCommentDeclS)
break;
case tokenCom:
if (!parseComment(comMode))
return 0;
if (options().warnCommentDeclMultiple)
break;
case tokenMdc:
if (currentMarkup())
goto done;
case tokenEe:
return 0;
case tokenUnrecognized:
if (reportNonSgmlCharacter())
break;
// braces to work round Sun C++ 4.0 bug
{
markupLocation());
}
return 0;
default:
// braces to work round Sun C++ 4.0 bug
{
markupLocation());
}
return 0;
}
}
done:
if (currentMarkup())
currentMarkup()));
return 1;
}
{
unsigned declInputLevel = inputLevel();
return 0;
return 0;
currentMarkup()));
return 1;
}
#ifdef SP_NAMESPACE
}
#endif