1 /* $XConsortium: EntityApp.C /main/1 1996/07/29 16:49:57 cde-hp $ */
2 // Copyright (c) 1996 James Clark
3 // See the file COPYING for copying permission.
10 #include "EntityApp.h"
16 #include "ISO8859InputCodingSystem.h"
19 #include "PosixStorage.h"
20 #include "URLStorage.h"
21 #include "LiteralStorage.h"
22 #include "ExtendEntityManager.h"
23 #include "SOEntityCatalog.h"
24 #include "CodingSystem.h"
27 #ifndef SGML_SEARCH_PATH_DEFAULT
28 #define SGML_SEARCH_PATH_DEFAULT SP_T("")
31 #ifndef SGML_CATALOG_FILES_DEFAULT
32 #define SGML_CATALOG_FILES_DEFAULT SP_T("")
33 #endif /* not SGML_CATALOG_FILES_DEFAULT */
36 namespace SP_NAMESPACE {
39 #ifdef MSDOS_FILENAMES
40 const Char FILE_SEP = ';';
42 const Char FILE_SEP = ':';
46 static ISO8859InputCodingSystem iso8859_2InputCodingSystem(2);
47 static ISO8859InputCodingSystem iso8859_3InputCodingSystem(3);
48 static ISO8859InputCodingSystem iso8859_4InputCodingSystem(4);
49 static ISO8859InputCodingSystem iso8859_5InputCodingSystem(5);
50 static ISO8859InputCodingSystem iso8859_6InputCodingSystem(6);
51 static ISO8859InputCodingSystem iso8859_7InputCodingSystem(7);
52 static ISO8859InputCodingSystem iso8859_8InputCodingSystem(8);
53 static ISO8859InputCodingSystem iso8859_9InputCodingSystem(9);
57 const InputCodingSystem *cs;
58 } inputCodingSystems[] = {
59 { "IS8859-2", &iso8859_2InputCodingSystem },
60 { "IS8859-3", &iso8859_3InputCodingSystem },
61 { "IS8859-4", &iso8859_4InputCodingSystem },
62 { "IS8859-5", &iso8859_5InputCodingSystem },
63 { "IS8859-6", &iso8859_6InputCodingSystem },
64 { "IS8859-7", &iso8859_7InputCodingSystem },
65 { "IS8859-8", &iso8859_8InputCodingSystem },
66 { "IS8859-9", &iso8859_9InputCodingSystem },
69 #endif /* SP_MULTI_BYTE */
72 static UnivCharsetDesc::Range range = { 0, 65536, 0 };
74 static UnivCharsetDesc::Range range = { 0, 256, 0 };
77 EntityApp::EntityApp()
78 : mapCatalogDocument_(0),
79 systemCharset_(UnivCharsetDesc(&range, 1))
81 registerOption('c', SP_T("catalog_sysid"));
83 registerOption('D', SP_T("dir"));
86 void EntityApp::processOption(AppChar opt, const AppChar *arg)
90 catalogSysids_.push_back(arg);
93 mapCatalogDocument_ = 1;
96 searchDirs_.push_back(arg);
99 CmdLineApp::processOption(opt, arg);
104 int EntityApp::processArguments(int argc, AppChar **argv)
107 if (!makeSystemId(argc, argv, sysid))
109 return processSysid(sysid);
112 Boolean EntityApp::makeSystemId(int nFiles, AppChar *const *files,
115 Vector<StringC> filenames(nFiles == 0 ? 1 : nFiles);
117 for (i = 0; i < nFiles; i++)
118 filenames[i] = convertInput(tcscmp(files[i], SP_T("-")) == 0
122 filenames[0] = convertInput(SP_T("<OSFD>0"));
123 return entityManager()->mergeSystemIds(filenames,
131 Ptr<ExtendEntityManager> &EntityApp::entityManager()
133 if (!entityManager_.isNull())
134 return entityManager_;
135 PosixStorageManager *sm
136 = new PosixStorageManager("OSFILE",
137 systemCharset_.desc(),
138 #ifndef SP_WIDE_SYSTEM
143 for (i = 0; i < searchDirs_.size(); i++)
144 sm->addSearchDir(convertInput(searchDirs_[i]));
146 const AppChar *e = tgetenv(SP_T("SGML_SEARCH_PATH"));
148 e = SGML_SEARCH_PATH_DEFAULT;
150 StringC str(convertInput(e));
154 if (i == str.size() || str[i] == FILE_SEP) {
155 sm->addSearchDir(StringC(str.data() + start,
167 entityManager_ = ExtendEntityManager::make(sm, codingSystem());
169 ->registerStorageManager(new PosixFdStorageManager("OSFD",
170 systemCharset_.desc()));
171 entityManager_->registerStorageManager(new URLStorageManager("URL"));
172 entityManager_->registerStorageManager(new LiteralStorageManager("LITERAL"));
175 const CodingSystem *p = codingSystem(i, s);
178 entityManager_->registerCodingSystem(s, p);
181 for (i = 0; i < SIZEOF(inputCodingSystems); i++)
182 entityManager_->registerCodingSystem(inputCodingSystems[i].name,
183 inputCodingSystems[i].cs);
186 for (i = 0; i < catalogSysids_.size(); i++)
187 // filenames specified on command-line must exist
188 v.push_back(convertInput(catalogSysids_[i]));
190 const AppChar *e = tgetenv(SP_T("SGML_CATALOG_FILES"));
192 e = SGML_CATALOG_FILES_DEFAULT;
194 StringC str(convertInput(e));
198 if (i == str.size() || str[i] == FILE_SEP) {
199 v.push_back(StringC(str.data() + start,
210 entityManager_->setCatalogManager(SOCatalogManager::make(v,
211 catalogSysids_.size(),
214 return entityManager_;