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"
49 using namespace SP_NAMESPACE;
52 class NsgmlsApp : public ParserApp {
55 int processArguments(int argc, AppChar **argv);
56 ErrorCountEventHandler *makeEventHandler();
57 void processOption(AppChar opt, const AppChar *arg);
58 void allLinkTypesActivated();
60 Boolean suppressOutput_;
62 unsigned outputFlags_;
63 String<AppChar> rastFile_;
64 const AppChar *rastOption_;
68 SP_DEFINE_APP(NsgmlsApp)
70 class PrologMessageEventHandler : public MessageEventHandler {
72 PrologMessageEventHandler(Messenger *messenger);
73 void endProlog(EndPrologEvent *);
76 class XRastEventHandler : public RastEventHandler {
78 XRastEventHandler(SgmlParser *,
79 const AppChar *filename,
80 const StringC &filenameStr,
81 const OutputCodingSystem *,
82 Messenger *messenger);
84 void message(MessageEvent *);
85 void truncateOutput();
86 void allLinkTypesActivated();
88 Messenger *messenger_;
89 // file_ must come before os_ so it gets inited first
91 IosOutputCharStream os_;
92 const AppChar *filename_;
93 const StringC filenameStr_;
96 NsgmlsApp::NsgmlsApp()
106 registerOption('m', SP_T("catalog_sysid"));
107 registerOption('o', SP_T("output_option"));
111 registerOption('t', SP_T("rast_file"));
115 void NsgmlsApp::processOption(AppChar opt, const AppChar *arg)
122 // warn about duplicate entity declarations
123 options_.warnDuplicateEntity = 1;
127 outputFlags_ |= SgmlsEventHandler::outputLine;
130 processOption(SP_T('c'), arg);
137 } outputOptions[] = {
138 { SP_T("line"), SgmlsEventHandler::outputLine },
139 { SP_T("entity"), SgmlsEventHandler::outputEntity },
140 { SP_T("id"), SgmlsEventHandler::outputId },
141 { SP_T("included"), SgmlsEventHandler::outputIncluded },
142 { SP_T("notation-sysid"), SgmlsEventHandler::outputNotationSysid },
145 for (size_t i = 0; i < SIZEOF(outputOptions); i++)
146 if (tcscmp(arg, outputOptions[i].name) == 0) {
147 outputFlags_ |= outputOptions[i].flag;
152 message(NsgmlsMessages::unknownOutputOption,
153 StringMessageArg(convertInput(arg)));
160 // warn about defaulted entity reference
161 options_.warnDefaultEntityReference = 1;
170 // warn about undefined elements
171 options_.warnUndefinedElement = 1;
174 ParserApp::processOption(opt, arg);
179 int NsgmlsApp::processArguments(int argc, AppChar **argv)
183 for (int i = 0; i < argc; i++) {
185 rastFile_.assign(rastOption_, tcslen(rastOption_));
186 rastFile_.append(argv[i], tcslen(argv[i]));
187 rastFile_ += SP_T('\0');
189 int tem = ParserApp::processArguments(1, argv + i);
196 return ParserApp::processArguments(argc, argv);
199 void NsgmlsApp::allLinkTypesActivated()
202 ParserApp::allLinkTypesActivated();
205 ErrorCountEventHandler *NsgmlsApp::makeEventHandler()
208 return new PrologMessageEventHandler(this);
209 else if (rastOption_) {
210 const AppChar *s = batchMode_ ? rastFile_.data() : rastOption_;
211 return new XRastEventHandler(&parser_, s, convertInput(s),
212 outputCodingSystem_, this);
214 else if (suppressOutput_)
215 return new MessageEventHandler(this, &parser_);
217 return new SgmlsEventHandler(&parser_,
223 PrologMessageEventHandler::PrologMessageEventHandler(Messenger *messenger)
224 : MessageEventHandler(messenger)
228 void PrologMessageEventHandler::endProlog(EndPrologEvent *event)
234 XRastEventHandler::XRastEventHandler(SgmlParser *parser,
235 const AppChar *filename,
236 const StringC &filenameStr,
237 const OutputCodingSystem *codingSystem,
238 Messenger *messenger)
239 : RastEventHandler(parser, messenger),
240 messenger_(messenger),
242 filenameStr_(filenameStr)
245 if (!CmdLineApp::openFilebufWrite(file_, filename)) {
246 messenger->message(NsgmlsMessages::cannotOpenOutputError,
247 StringMessageArg(filenameStr),
248 ErrnoMessageArg(errno));
251 os_.open(&file_, codingSystem);
252 setOutputStream(&os_);
255 XRastEventHandler::~XRastEventHandler()
260 void XRastEventHandler::truncateOutput()
265 messenger_->message(NsgmlsMessages::closeOutputError,
266 StringMessageArg(filenameStr_),
267 ErrnoMessageArg(errno));
269 if (!CmdLineApp::openFilebufWrite(file_, filename_)) {
270 messenger_->message(NsgmlsMessages::cannotOpenOutputError,
271 StringMessageArg(filenameStr_),
272 ErrnoMessageArg(errno));
277 void XRastEventHandler::message(MessageEvent *event)
279 messenger_->dispatchMessage(event->message());
280 ErrorCountEventHandler::message(event);