2 * CDE - Common Desktop Environment
4 * Copyright (c) 1993-2012, The Open Group. All rights reserved.
6 * These libraries and programs are free software; you can
7 * redistribute them and/or modify them under the terms of the GNU
8 * Lesser General Public License as published by the Free Software
9 * Foundation; either version 2 of the License, or (at your option)
12 * These libraries and programs are distributed in the hope that
13 * they will be useful, but WITHOUT ANY WARRANTY; without even the
14 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU Lesser General Public License for more
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with these librararies and programs; if not, write
20 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21 * Floor, Boston, MA 02110-1301 USA
23 /* $XConsortium: nsgmls.C /main/1 1996/07/29 17:08:59 cde-hp $ */
24 // Copyright (c) 1994, 1995 James Clark
25 // See the file COPYING for copying permission.
29 #include "MessageEventHandler.h"
30 #include "SgmlsEventHandler.h"
31 #include "RastEventHandler.h"
32 #include "OutputCharStream.h"
34 #include "NsgmlsMessages.h"
35 #include "MessageArg.h"
36 #include "ErrnoMessageArg.h"
37 #include "ParserApp.h"
41 #if defined(linux) || defined(CSRG_BASED)
54 using namespace SP_NAMESPACE;
57 class NsgmlsApp : public ParserApp {
60 int processArguments(int argc, AppChar **argv);
61 ErrorCountEventHandler *makeEventHandler();
62 void processOption(AppChar opt, const AppChar *arg);
63 void allLinkTypesActivated();
65 Boolean suppressOutput_;
67 unsigned outputFlags_;
68 String<AppChar> rastFile_;
69 const AppChar *rastOption_;
73 SP_DEFINE_APP(NsgmlsApp)
75 class PrologMessageEventHandler : public MessageEventHandler {
77 PrologMessageEventHandler(Messenger *messenger);
78 void endProlog(EndPrologEvent *);
81 class XRastEventHandler : public RastEventHandler {
83 XRastEventHandler(SgmlParser *,
84 const AppChar *filename,
85 const StringC &filenameStr,
86 const OutputCodingSystem *,
87 #if defined(linux) || defined(CSRG_BASED)
88 ::Messenger *messenger);
90 Messenger *messenger);
93 void message(MessageEvent *);
94 void truncateOutput();
95 void allLinkTypesActivated();
97 #if defined(linux) || defined(CSRG_BASED)
98 ::Messenger *messenger_;
100 Messenger *messenger_;
102 // file_ must come before os_ so it gets inited first
104 IosOutputCharStream os_;
105 const AppChar *filename_;
106 const StringC filenameStr_;
109 NsgmlsApp::NsgmlsApp()
110 : suppressOutput_(0),
119 registerOption('m', SP_T("catalog_sysid"));
120 registerOption('o', SP_T("output_option"));
124 registerOption('t', SP_T("rast_file"));
128 void NsgmlsApp::processOption(AppChar opt, const AppChar *arg)
135 // warn about duplicate entity declarations
136 options_.warnDuplicateEntity = 1;
140 outputFlags_ |= SgmlsEventHandler::outputLine;
143 processOption(SP_T('c'), arg);
150 } outputOptions[] = {
151 { SP_T("line"), SgmlsEventHandler::outputLine },
152 { SP_T("entity"), SgmlsEventHandler::outputEntity },
153 { SP_T("id"), SgmlsEventHandler::outputId },
154 { SP_T("included"), SgmlsEventHandler::outputIncluded },
155 { SP_T("notation-sysid"), SgmlsEventHandler::outputNotationSysid },
158 for (size_t i = 0; i < SIZEOF(outputOptions); i++)
159 if (tcscmp(arg, outputOptions[i].name) == 0) {
160 outputFlags_ |= outputOptions[i].flag;
165 message(NsgmlsMessages::unknownOutputOption,
166 StringMessageArg(convertInput(arg)));
173 // warn about defaulted entity reference
174 options_.warnDefaultEntityReference = 1;
183 // warn about undefined elements
184 options_.warnUndefinedElement = 1;
187 ParserApp::processOption(opt, arg);
192 int NsgmlsApp::processArguments(int argc, AppChar **argv)
196 for (int i = 0; i < argc; i++) {
198 rastFile_.assign(rastOption_, tcslen(rastOption_));
199 rastFile_.append(argv[i], tcslen(argv[i]));
200 rastFile_ += SP_T('\0');
202 int tem = ParserApp::processArguments(1, argv + i);
209 return ParserApp::processArguments(argc, argv);
212 void NsgmlsApp::allLinkTypesActivated()
215 ParserApp::allLinkTypesActivated();
218 ErrorCountEventHandler *NsgmlsApp::makeEventHandler()
221 return new PrologMessageEventHandler(this);
222 else if (rastOption_) {
223 const AppChar *s = batchMode_ ? rastFile_.data() : rastOption_;
224 return new XRastEventHandler(&parser_, s, convertInput(s),
225 outputCodingSystem_, this);
227 else if (suppressOutput_)
228 return new MessageEventHandler(this, &parser_);
230 return new SgmlsEventHandler(&parser_,
236 PrologMessageEventHandler::PrologMessageEventHandler(Messenger *messenger)
237 : MessageEventHandler(messenger)
241 void PrologMessageEventHandler::endProlog(EndPrologEvent *event)
247 XRastEventHandler::XRastEventHandler(SgmlParser *parser,
248 const AppChar *filename,
249 const StringC &filenameStr,
250 const OutputCodingSystem *codingSystem,
251 #if defined(linux) || defined(CSRG_BASED)
252 ::Messenger *messenger)
254 ::Messenger *messenger)
256 : RastEventHandler(parser, messenger),
257 messenger_(messenger),
259 filenameStr_(filenameStr)
262 if (!CmdLineApp::openFilebufWrite(file_, filename)) {
263 messenger->message(NsgmlsMessages::cannotOpenOutputError,
264 StringMessageArg(filenameStr),
265 ErrnoMessageArg(errno));
268 os_.open(&file_, codingSystem);
269 setOutputStream(&os_);
272 XRastEventHandler::~XRastEventHandler()
277 void XRastEventHandler::truncateOutput()
282 messenger_->message(NsgmlsMessages::closeOutputError,
283 StringMessageArg(filenameStr_),
284 ErrnoMessageArg(errno));
286 if (!CmdLineApp::openFilebufWrite(file_, filename_)) {
287 messenger_->message(NsgmlsMessages::cannotOpenOutputError,
288 StringMessageArg(filenameStr_),
289 ErrnoMessageArg(errno));
294 void XRastEventHandler::message(MessageEvent *event)
296 messenger_->dispatchMessage(event->message());
297 ErrorCountEventHandler::message(event);