Blame lib/ParserEventGeneratorKit.cxx

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