1 /* $XConsortium: nsgmls.C /main/1 1996/07/29 17:08:59 cde-hp $ */
2 // Copyright (c) 1994, 1995 James Clark
3 // See the file COPYING for copying permission.
7 #include "MessageEventHandler.h"
8 #include "SgmlsEventHandler.h"
9 #include "RastEventHandler.h"
10 #include "OutputCharStream.h"
12 #include "NsgmlsMessages.h"
13 #include "MessageArg.h"
14 #include "ErrnoMessageArg.h"
15 #include "ParserApp.h"
27 using namespace SP_NAMESPACE;
30 class NsgmlsApp : public ParserApp {
33 int processArguments(int argc, AppChar **argv);
34 ErrorCountEventHandler *makeEventHandler();
35 void processOption(AppChar opt, const AppChar *arg);
36 void allLinkTypesActivated();
38 Boolean suppressOutput_;
40 unsigned outputFlags_;
41 String<AppChar> rastFile_;
42 const AppChar *rastOption_;
46 SP_DEFINE_APP(NsgmlsApp)
48 class PrologMessageEventHandler : public MessageEventHandler {
50 PrologMessageEventHandler(Messenger *messenger);
51 void endProlog(EndPrologEvent *);
54 class XRastEventHandler : public RastEventHandler {
56 XRastEventHandler(SgmlParser *,
57 const AppChar *filename,
58 const StringC &filenameStr,
59 const OutputCodingSystem *,
60 Messenger *messenger);
62 void message(MessageEvent *);
63 void truncateOutput();
64 void allLinkTypesActivated();
66 Messenger *messenger_;
67 // file_ must come before os_ so it gets inited first
69 IosOutputCharStream os_;
70 const AppChar *filename_;
71 const StringC filenameStr_;
74 NsgmlsApp::NsgmlsApp()
84 registerOption('m', SP_T("catalog_sysid"));
85 registerOption('o', SP_T("output_option"));
89 registerOption('t', SP_T("rast_file"));
93 void NsgmlsApp::processOption(AppChar opt, const AppChar *arg)
100 // warn about duplicate entity declarations
101 options_.warnDuplicateEntity = 1;
105 outputFlags_ |= SgmlsEventHandler::outputLine;
108 processOption(SP_T('c'), arg);
115 } outputOptions[] = {
116 { SP_T("line"), SgmlsEventHandler::outputLine },
117 { SP_T("entity"), SgmlsEventHandler::outputEntity },
118 { SP_T("id"), SgmlsEventHandler::outputId },
119 { SP_T("included"), SgmlsEventHandler::outputIncluded },
120 { SP_T("notation-sysid"), SgmlsEventHandler::outputNotationSysid },
123 for (size_t i = 0; i < SIZEOF(outputOptions); i++)
124 if (tcscmp(arg, outputOptions[i].name) == 0) {
125 outputFlags_ |= outputOptions[i].flag;
130 message(NsgmlsMessages::unknownOutputOption,
131 StringMessageArg(convertInput(arg)));
138 // warn about defaulted entity reference
139 options_.warnDefaultEntityReference = 1;
148 // warn about undefined elements
149 options_.warnUndefinedElement = 1;
152 ParserApp::processOption(opt, arg);
157 int NsgmlsApp::processArguments(int argc, AppChar **argv)
161 for (int i = 0; i < argc; i++) {
163 rastFile_.assign(rastOption_, tcslen(rastOption_));
164 rastFile_.append(argv[i], tcslen(argv[i]));
165 rastFile_ += SP_T('\0');
167 int tem = ParserApp::processArguments(1, argv + i);
174 return ParserApp::processArguments(argc, argv);
177 void NsgmlsApp::allLinkTypesActivated()
180 ParserApp::allLinkTypesActivated();
183 ErrorCountEventHandler *NsgmlsApp::makeEventHandler()
186 return new PrologMessageEventHandler(this);
187 else if (rastOption_) {
188 const AppChar *s = batchMode_ ? rastFile_.data() : rastOption_;
189 return new XRastEventHandler(&parser_, s, convertInput(s),
190 outputCodingSystem_, this);
192 else if (suppressOutput_)
193 return new MessageEventHandler(this, &parser_);
195 return new SgmlsEventHandler(&parser_,
201 PrologMessageEventHandler::PrologMessageEventHandler(Messenger *messenger)
202 : MessageEventHandler(messenger)
206 void PrologMessageEventHandler::endProlog(EndPrologEvent *event)
212 XRastEventHandler::XRastEventHandler(SgmlParser *parser,
213 const AppChar *filename,
214 const StringC &filenameStr,
215 const OutputCodingSystem *codingSystem,
216 Messenger *messenger)
217 : RastEventHandler(parser, messenger),
218 messenger_(messenger),
220 filenameStr_(filenameStr)
223 if (!CmdLineApp::openFilebufWrite(file_, filename)) {
224 messenger->message(NsgmlsMessages::cannotOpenOutputError,
225 StringMessageArg(filenameStr),
226 ErrnoMessageArg(errno));
229 os_.open(&file_, codingSystem);
230 setOutputStream(&os_);
233 XRastEventHandler::~XRastEventHandler()
238 void XRastEventHandler::truncateOutput()
243 messenger_->message(NsgmlsMessages::closeOutputError,
244 StringMessageArg(filenameStr_),
245 ErrnoMessageArg(errno));
247 if (!CmdLineApp::openFilebufWrite(file_, filename_)) {
248 messenger_->message(NsgmlsMessages::cannotOpenOutputError,
249 StringMessageArg(filenameStr_),
250 ErrnoMessageArg(errno));
255 void XRastEventHandler::message(MessageEvent *event)
257 messenger_->dispatchMessage(event->message());
258 ErrorCountEventHandler::message(event);