|
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 "splib.h"
|
|
Packit |
8a864e |
#include "Boolean.h"
|
|
Packit |
8a864e |
#include "ParserApp.h"
|
|
Packit |
8a864e |
#include "macros.h"
|
|
Packit |
8a864e |
#include "SGMLApplication.h"
|
|
Packit |
8a864e |
#include "ParserEventGeneratorKit.h"
|
|
Packit |
8a864e |
#include "GenericEventHandler.h"
|
|
Packit |
8a864e |
|
|
Packit |
8a864e |
class ParserEventGeneratorKitImpl : public SP_NAMESPACE_SCOPE ParserApp {
|
|
Packit |
8a864e |
public:
|
|
Packit |
8a864e |
SP_NAMESPACE_SCOPE ParserOptions &options() { return options_; }
|
|
Packit |
8a864e |
bool generalEntities;
|
|
Packit |
8a864e |
unsigned refCount;
|
|
Packit |
8a864e |
private:
|
|
Packit |
8a864e |
SP_NAMESPACE_SCOPE ErrorCountEventHandler *makeEventHandler() { return 0; }
|
|
Packit |
8a864e |
};
|
|
Packit |
8a864e |
|
|
Packit |
8a864e |
#ifdef SP_NAMESPACE
|
|
Packit |
8a864e |
namespace SP_NAMESPACE {
|
|
Packit |
8a864e |
#endif
|
|
Packit |
8a864e |
|
|
Packit |
8a864e |
class ParserEventGenerator : public EventGenerator {
|
|
Packit |
8a864e |
public:
|
|
Packit |
8a864e |
ParserEventGenerator(SgmlParser &,
|
|
Packit |
8a864e |
bool generalEntities,
|
|
Packit |
8a864e |
ParserEventGeneratorKitImpl *kit_);
|
|
Packit |
8a864e |
ParserEventGenerator(const SgmlParser &,
|
|
Packit |
8a864e |
const SGMLApplication::Char *,
|
|
Packit |
8a864e |
size_t n,
|
|
Packit |
8a864e |
bool generalEntities,
|
|
Packit |
8a864e |
bool messagesInhibited,
|
|
Packit |
8a864e |
ParserEventGeneratorKitImpl *kit_);
|
|
Packit |
8a864e |
~ParserEventGenerator();
|
|
Packit |
8a864e |
unsigned run(SGMLApplication &);
|
|
Packit |
8a864e |
void inhibitMessages(bool);
|
|
Packit |
8a864e |
void halt();
|
|
Packit |
8a864e |
EventGenerator *
|
|
Packit |
8a864e |
makeSubdocEventGenerator(const SGMLApplication::Char *systemId,
|
|
Packit |
8a864e |
size_t systemIdLength);
|
|
Packit |
8a864e |
private:
|
|
Packit |
8a864e |
SgmlParser parser_;
|
|
Packit |
8a864e |
bool generalEntities_;
|
|
Packit |
8a864e |
bool messagesInhibited_;
|
|
Packit |
8a864e |
sig_atomic_t cancel_;
|
|
Packit |
8a864e |
ParserEventGeneratorKitImpl *kit_;
|
|
Packit |
8a864e |
};
|
|
Packit |
8a864e |
|
|
Packit |
8a864e |
#ifdef SP_NAMESPACE
|
|
Packit |
8a864e |
}
|
|
Packit |
8a864e |
#endif
|
|
Packit |
8a864e |
|
|
Packit |
8a864e |
ParserEventGeneratorKit::ParserEventGeneratorKit()
|
|
Packit |
8a864e |
{
|
|
Packit |
8a864e |
impl_ = new ParserEventGeneratorKitImpl;
|
|
Packit |
8a864e |
impl_->refCount = 1;
|
|
Packit |
8a864e |
impl_->generalEntities = 0;
|
|
Packit |
8a864e |
}
|
|
Packit |
8a864e |
|
|
Packit |
8a864e |
ParserEventGeneratorKit::~ParserEventGeneratorKit()
|
|
Packit |
8a864e |
{
|
|
Packit |
8a864e |
impl_->refCount -= 1;
|
|
Packit |
8a864e |
if (impl_->refCount == 0)
|
|
Packit |
8a864e |
delete impl_;
|
|
Packit |
8a864e |
}
|
|
Packit |
8a864e |
|
|
Packit |
8a864e |
EventGenerator *
|
|
Packit |
8a864e |
ParserEventGeneratorKit::makeEventGenerator(int nFiles,
|
|
Packit |
8a864e |
SP_NAMESPACE_SCOPE ParserApp::AppChar *const *files)
|
|
Packit |
8a864e |
{
|
|
Packit |
8a864e |
SP_NAMESPACE_SCOPE StringC sysid;
|
|
Packit |
8a864e |
if (impl_->makeSystemId(nFiles, files, sysid))
|
|
Packit |
8a864e |
impl_->initParser(sysid);
|
|
Packit |
8a864e |
return new SP_NAMESPACE_SCOPE ParserEventGenerator(impl_->parser(),
|
|
Packit |
8a864e |
impl_->generalEntities,
|
|
Packit |
8a864e |
impl_);
|
|
Packit |
8a864e |
}
|
|
Packit |
8a864e |
|
|
Packit |
8a864e |
void ParserEventGeneratorKit::setProgramName(const SP_NAMESPACE_SCOPE ParserApp::AppChar *prog)
|
|
Packit |
8a864e |
{
|
|
Packit |
8a864e |
if (prog)
|
|
Packit |
8a864e |
impl_->setProgramName(impl_->convertInput(prog));
|
|
Packit |
8a864e |
}
|
|
Packit |
8a864e |
|
|
Packit |
8a864e |
void ParserEventGeneratorKit::setOption(Option opt)
|
|
Packit |
8a864e |
{
|
|
Packit |
8a864e |
switch (opt) {
|
|
Packit |
8a864e |
case showOpenEntities:
|
|
Packit |
8a864e |
impl_->processOption('e', 0);
|
|
Packit |
8a864e |
break;
|
|
Packit |
8a864e |
case showOpenElements:
|
|
Packit |
8a864e |
impl_->processOption('g', 0);
|
|
Packit |
8a864e |
break;
|
|
Packit |
8a864e |
case outputCommentDecls:
|
|
Packit |
8a864e |
impl_->options().eventsWanted.addCommentDecls();
|
|
Packit |
8a864e |
break;
|
|
Packit |
8a864e |
case outputMarkedSections:
|
|
Packit |
8a864e |
impl_->options().eventsWanted.addMarkedSections();
|
|
Packit |
8a864e |
break;
|
|
Packit |
8a864e |
case outputGeneralEntities:
|
|
Packit |
8a864e |
impl_->generalEntities = 1;
|
|
Packit |
8a864e |
break;
|
|
Packit |
8a864e |
case mapCatalogDocument:
|
|
Packit |
8a864e |
impl_->processOption('C', 0);
|
|
Packit |
8a864e |
break;
|
|
Packit |
8a864e |
case restrictFileReading:
|
|
Packit |
8a864e |
impl_->processOption('R', 0);
|
|
Packit |
8a864e |
break;
|
|
Packit |
8a864e |
case showErrorNumbers:
|
|
Packit |
8a864e |
impl_->processOption('n', 0);
|
|
Packit |
8a864e |
break;
|
|
Packit |
8a864e |
}
|
|
Packit |
8a864e |
}
|
|
Packit |
8a864e |
|
|
Packit |
8a864e |
void ParserEventGeneratorKit::setOption(OptionWithArg opt,
|
|
Packit |
8a864e |
const SP_NAMESPACE_SCOPE ParserApp::AppChar *arg)
|
|
Packit |
8a864e |
{
|
|
Packit |
8a864e |
switch (opt) {
|
|
Packit |
8a864e |
case addCatalog:
|
|
Packit |
8a864e |
impl_->processOption('c', arg);
|
|
Packit |
8a864e |
break;
|
|
Packit |
8a864e |
case includeParam:
|
|
Packit |
8a864e |
impl_->processOption('i', arg);
|
|
Packit |
8a864e |
break;
|
|
Packit |
8a864e |
case enableWarning:
|
|
Packit |
8a864e |
impl_->processOption('w', arg);
|
|
Packit |
8a864e |
break;
|
|
Packit |
8a864e |
case addSearchDir:
|
|
Packit |
8a864e |
impl_->processOption('D', arg);
|
|
Packit |
8a864e |
break;
|
|
Packit |
8a864e |
case activateLink:
|
|
Packit |
8a864e |
impl_->processOption('a', arg);
|
|
Packit |
8a864e |
break;
|
|
Packit |
8a864e |
case architecture:
|
|
Packit |
8a864e |
impl_->processOption('A', arg);
|
|
Packit |
8a864e |
break;
|
|
Packit |
8a864e |
}
|
|
Packit |
8a864e |
}
|
|
Packit |
8a864e |
|
|
Packit |
8a864e |
#ifdef SP_NAMESPACE
|
|
Packit |
8a864e |
namespace SP_NAMESPACE {
|
|
Packit |
8a864e |
#endif
|
|
Packit |
8a864e |
|
|
Packit |
8a864e |
ParserEventGenerator::ParserEventGenerator(SgmlParser &parser,
|
|
Packit |
8a864e |
bool generalEntities,
|
|
Packit |
8a864e |
ParserEventGeneratorKitImpl *kit)
|
|
Packit |
8a864e |
: generalEntities_(generalEntities),
|
|
Packit |
8a864e |
messagesInhibited_(0),
|
|
Packit |
8a864e |
cancel_(0),
|
|
Packit |
8a864e |
kit_(kit)
|
|
Packit |
8a864e |
{
|
|
Packit |
8a864e |
parser_.swap(parser);
|
|
Packit |
8a864e |
kit_->refCount += 1;
|
|
Packit |
8a864e |
}
|
|
Packit |
8a864e |
|
|
Packit |
8a864e |
ParserEventGenerator::ParserEventGenerator(const SgmlParser &parser,
|
|
Packit |
8a864e |
const SGMLApplication::Char *s,
|
|
Packit |
8a864e |
size_t n,
|
|
Packit |
8a864e |
bool generalEntities,
|
|
Packit |
8a864e |
bool messagesInhibited,
|
|
Packit |
8a864e |
ParserEventGeneratorKitImpl *kit)
|
|
Packit |
8a864e |
: generalEntities_(generalEntities),
|
|
Packit |
8a864e |
messagesInhibited_(messagesInhibited),
|
|
Packit |
8a864e |
cancel_(0),
|
|
Packit |
8a864e |
kit_(kit)
|
|
Packit |
8a864e |
{
|
|
Packit |
8a864e |
kit_->refCount += 1;
|
|
Packit |
8a864e |
SgmlParser::Params params;
|
|
Packit |
8a864e |
params.parent = &parse;;
|
|
Packit |
8a864e |
params.sysid.assign(s, n);
|
|
Packit |
8a864e |
params.entityType = SgmlParser::Params::subdoc;
|
|
Packit |
8a864e |
parser_.init(params);
|
|
Packit |
8a864e |
}
|
|
Packit |
8a864e |
|
|
Packit |
8a864e |
void ParserEventGenerator::halt()
|
|
Packit |
8a864e |
{
|
|
Packit |
8a864e |
cancel_ = 1;
|
|
Packit |
8a864e |
}
|
|
Packit |
8a864e |
|
|
Packit |
8a864e |
ParserEventGenerator::~ParserEventGenerator()
|
|
Packit |
8a864e |
{
|
|
Packit |
8a864e |
kit_->refCount -= 1;
|
|
Packit |
8a864e |
if (kit_->refCount == 0)
|
|
Packit |
8a864e |
delete kit_;
|
|
Packit |
8a864e |
}
|
|
Packit |
8a864e |
|
|
Packit |
8a864e |
unsigned ParserEventGenerator::run(SGMLApplication &app)
|
|
Packit |
8a864e |
{
|
|
Packit |
8a864e |
MsgGenericEventHandler handler(app, generalEntities_,
|
|
Packit |
8a864e |
*kit_, &messagesInhibited_);
|
|
Packit |
8a864e |
kit_->parseAll(parser_, handler, &cancel_);
|
|
Packit |
8a864e |
return handler.errorCount();
|
|
Packit |
8a864e |
}
|
|
Packit |
8a864e |
|
|
Packit |
8a864e |
void ParserEventGenerator::inhibitMessages(bool b)
|
|
Packit |
8a864e |
{
|
|
Packit |
8a864e |
messagesInhibited_ = b;
|
|
Packit |
8a864e |
}
|
|
Packit |
8a864e |
|
|
Packit |
8a864e |
EventGenerator *
|
|
Packit |
8a864e |
ParserEventGenerator::makeSubdocEventGenerator(const SGMLApplication::Char *s,
|
|
Packit |
8a864e |
size_t n)
|
|
Packit |
8a864e |
{
|
|
Packit |
8a864e |
return new ParserEventGenerator(parser_, s, n, generalEntities_,
|
|
Packit |
8a864e |
messagesInhibited_, kit_);
|
|
Packit |
8a864e |
}
|
|
Packit |
8a864e |
|
|
Packit |
8a864e |
#ifdef SP_NAMESPACE
|
|
Packit |
8a864e |
}
|
|
Packit |
8a864e |
#endif
|