Blame include/CmdLineApp.h

Packit 8a864e
// Copyright (c) 1996 James Clark, 1999 Matthias Clasen
Packit 8a864e
// See the file COPYING for copying permission.
Packit 8a864e
Packit 8a864e
#ifndef CmdLineApp_INCLUDED
Packit 8a864e
#define CmdLineApp_INCLUDED 1
Packit 8a864e
Packit 8a864e
#ifdef SP_XML
Packit 8a864e
#define SP_REPORTER_CLASS XMLMessageReporter
Packit 8a864e
#else
Packit 8a864e
#define SP_REPORTER_CLASS MessageReporter
Packit 8a864e
#endif
Packit 8a864e
Packit 8a864e
#ifdef __GNUG__
Packit 8a864e
#pragma interface
Packit 8a864e
#endif
Packit 8a864e
Packit 8a864e
#include "MessageReporter.h"
Packit 8a864e
#include "Vector.h"
Packit 8a864e
#include "StringOf.h"
Packit 8a864e
#include "Boolean.h"
Packit 8a864e
#include "CodingSystem.h"
Packit 8a864e
#include "OutputByteStream.h"
Packit 8a864e
#include "OutputCharStream.h"
Packit 8a864e
#include "CodingSystemKit.h"
Packit 8a864e
#include "Options.h"
Packit 8a864e
Packit 8a864e
#ifdef SP_WIDE_SYSTEM
Packit 8a864e
// for wchar_t
Packit 8a864e
#include <stddef.h>
Packit 8a864e
#endif
Packit 8a864e
Packit 8a864e
#ifdef SP_NAMESPACE
Packit 8a864e
namespace SP_NAMESPACE {
Packit 8a864e
#endif
Packit 8a864e
Packit 8a864e
class SP_API CmdLineApp  : public SP_REPORTER_CLASS {
Packit 8a864e
public:
Packit 8a864e
#ifdef SP_WIDE_SYSTEM
Packit 8a864e
  typedef wchar_t AppChar;
Packit 8a864e
#else
Packit 8a864e
  typedef char AppChar;
Packit 8a864e
#endif
Packit 8a864e
  CmdLineApp(const char *requiredInternalCode = 0);
Packit 8a864e
  int run(int argc, AppChar **argv);
Packit 8a864e
  virtual int processOptions(int argc, AppChar **argv, int &nextArg);
Packit 8a864e
  virtual void processOption(AppChar opt, const AppChar *arg);
Packit 8a864e
  virtual int processArguments(int argc, AppChar **files) = 0;
Packit 8a864e
  static const MessageType2 &openFileErrorMessage();
Packit 8a864e
  static const MessageType2 &closeFileErrorMessage();
Packit 8a864e
  void usage();
Packit 8a864e
  const CodingSystem *codingSystem();
Packit 8a864e
  const CodingSystem *outputCodingSystem();
Packit 8a864e
  const CharsetInfo &systemCharset();
Packit 8a864e
  ConstPtr<InputCodingSystemKit> inputCodingSystemKit();
Packit 8a864e
  StringC convertInput(const AppChar *s);
Packit 8a864e
  OutputCharStream *makeStdOut();
Packit 8a864e
  OutputCharStream *makeStdErr();
Packit 8a864e
protected:
Packit 8a864e
  virtual void registerOption(AppChar c, const AppChar *name, 
Packit 8a864e
                              const MessageType1 &doc;;
Packit 8a864e
  virtual void registerOption(AppChar c, const AppChar *name, 
Packit 8a864e
                              const MessageFragment &arg, 
Packit 8a864e
                              const MessageType1 &doc;;
Packit 8a864e
  virtual void changeOptionRegistration(AppChar oldc, AppChar newc);
Packit 8a864e
  virtual void registerUsage(const MessageType1 &u);
Packit 8a864e
  virtual void registerInfo(const MessageType1 &i, bool pre = 0);
Packit 8a864e
  // This is for backwards compability. Note that the second argument is the */
Packit 8a864e
  // argument name and not the long option name as above.
Packit 8a864e
  virtual void registerOption(AppChar c, const AppChar* argName =0);
Packit 8a864e
  virtual int init(int argc, AppChar **argv);
Packit 8a864e
  void resetCodingSystemKit();
Packit 8a864e
  static Boolean stringMatches(const AppChar *s, const char *key);
Packit 8a864e
  const AppChar *errorFile_;
Packit 8a864e
  const CodingSystem *outputCodingSystem_;
Packit 8a864e
  Vector<LongOption<AppChar> > opts_;
Packit 8a864e
  Vector<MessageType1> optDocs_;
Packit 8a864e
  Vector<MessageFragment> optArgs_;
Packit 8a864e
  Vector<MessageType1> usages_;
Packit 8a864e
  Vector<MessageType1> preInfos_;
Packit 8a864e
  Vector<MessageType1> infos_;
Packit 8a864e
  Boolean internalCharsetIsDocCharset_;
Packit 8a864e
  Ptr<CodingSystemKit> codingSystemKit_;
Packit 8a864e
  enum {
Packit 8a864e
    normalAction,
Packit 8a864e
    usageAction
Packit 8a864e
  };
Packit 8a864e
  int action_;
Packit 8a864e
private:
Packit 8a864e
  Boolean getMessageText(const MessageFragment &, StringC &);
Packit 8a864e
  void initCodingSystem(const char *requiredInternalCode);
Packit 8a864e
  const CodingSystem *lookupCodingSystem(const AppChar *codingName);
Packit 8a864e
  const CodingSystem *codingSystem_;
Packit 8a864e
};
Packit 8a864e
Packit 8a864e
#ifdef SP_WIDE_SYSTEM
Packit 8a864e
#define SP_DEFINE_APP(CLASS) \
Packit 8a864e
  extern "C" \
Packit 8a864e
  wmain(int argc, wchar_t **argv) { CLASS app; return app.run(argc, argv); }
Packit 8a864e
#else
Packit 8a864e
#define SP_DEFINE_APP(CLASS) \
Packit 8a864e
 extern "C" \
Packit 8a864e
 int main(int argc, char **argv) { CLASS app; return app.run(argc, argv); }
Packit 8a864e
#endif
Packit 8a864e
Packit 8a864e
inline
Packit 8a864e
const CodingSystem *CmdLineApp::codingSystem()
Packit 8a864e
{
Packit 8a864e
  return codingSystem_;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
inline
Packit 8a864e
const CodingSystem *CmdLineApp::outputCodingSystem()
Packit 8a864e
{
Packit 8a864e
  return outputCodingSystem_;
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
inline
Packit 8a864e
ConstPtr<InputCodingSystemKit> CmdLineApp::inputCodingSystemKit()
Packit 8a864e
{
Packit 8a864e
  return codingSystemKit_.pointer();
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
inline
Packit 8a864e
const CharsetInfo &CmdLineApp::systemCharset()
Packit 8a864e
{
Packit 8a864e
  return codingSystemKit_->systemCharset();
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
#ifdef SP_NAMESPACE
Packit 8a864e
}
Packit 8a864e
#endif
Packit 8a864e
Packit 8a864e
#endif /* not CmdLineApp_INCLUDED */