1 // Copyright (c) 1996 James Clark
2 // See the file COPYING for copying permission.
3 #pragma ident "%Z%%M% %I% %E% SMI"
4
5 #ifndef CmdLineApp_INCLUDED
6 #define CmdLineApp_INCLUDED 1
7
8 #ifdef __GNUG__
9 #pragma interface
10 #endif
11
12 #include "MessageReporter.h"
13 #include "Vector.h"
14 #include "StringOf.h"
15 #include "Boolean.h"
16 #include "CodingSystem.h"
17 #include "OutputByteStream.h"
18 #include "OutputCharStream.h"
19 #include "CodingSystemKit.h"
20
21 #ifdef SP_WIDE_SYSTEM
22 // for wchar_t
23 #include <stddef.h>
24 #endif
25
26 #ifdef SP_NAMESPACE
27 namespace SP_NAMESPACE {
28 #endif
29
30 class SP_API CmdLineApp : public MessageReporter {
31 public:
32 #ifdef SP_WIDE_SYSTEM
33 typedef wchar_t AppChar;
34 #else
35 typedef char AppChar;
36 #endif
37 CmdLineApp(const char *requiredInternalCode = 0);
38 int run(int argc, AppChar **argv);
39 virtual int processOptions(int argc, AppChar **argv, int &nextArg);
40 virtual void processOption(AppChar opt, const AppChar *arg);
41 virtual int processArguments(int argc, AppChar **files) = 0;
42 static const MessageType2 &openFileErrorMessage();
43 static const MessageType2 &closeFileErrorMessage();
44 StringC usageString();
45 const CodingSystem *codingSystem();
46 const CodingSystem *outputCodingSystem();
47 const CharsetInfo &systemCharset();
48 ConstPtr<InputCodingSystemKit> inputCodingSystemKit();
49 StringC convertInput(const AppChar *s);
50 OutputCharStream *makeStdOut();
51 OutputCharStream *makeStdErr();
52 protected:
53 virtual void registerOption(AppChar c, const AppChar *argName = 0);
54 virtual int init(int argc, AppChar **argv);
55 void resetCodingSystemKit();
56 static Boolean stringMatches(const AppChar *s, const char *key);
57 const AppChar *errorFile_;
58 const CodingSystem *outputCodingSystem_;
59 String<AppChar> optstr_;
60 Vector<const AppChar *> optArgNames_;
61 Boolean internalCharsetIsDocCharset_;
62 Ptr<CodingSystemKit> codingSystemKit_;
63 private:
64 Boolean getMessageText(const MessageFragment &, StringC &);
65 void initCodingSystem(const char *requiredInternalCode);
66 const CodingSystem *lookupCodingSystem(const AppChar *codingName);
67 const CodingSystem *codingSystem_;
68 };
69
70 #ifdef SP_WIDE_SYSTEM
71 #define SP_DEFINE_APP(CLASS) \
72 extern "C" \
73 wmain(int argc, wchar_t **argv) { CLASS app; return app.run(argc, argv); }
74 #else
75 #define SP_DEFINE_APP(CLASS) \
76 int main(int argc, char **argv) { CLASS app; return app.run(argc, argv); }
77 #endif
78
79 inline
codingSystem()80 const CodingSystem *CmdLineApp::codingSystem()
81 {
82 return codingSystem_;
83 }
84
85 inline
outputCodingSystem()86 const CodingSystem *CmdLineApp::outputCodingSystem()
87 {
88 return outputCodingSystem_;
89 }
90
91 inline
inputCodingSystemKit()92 ConstPtr<InputCodingSystemKit> CmdLineApp::inputCodingSystemKit()
93 {
94 return codingSystemKit_.pointer();
95 }
96
97 inline
systemCharset()98 const CharsetInfo &CmdLineApp::systemCharset()
99 {
100 return codingSystemKit_->systemCharset();
101 }
102
103 #ifdef SP_NAMESPACE
104 }
105 #endif
106
107 #endif /* not CmdLineApp_INCLUDED */
108