00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef VCSN_XML_PARSERS_HXX
00019 # define VCSN_XML_PARSERS_HXX
00020
00021 # include <fstream>
00022 # include <cstring>
00023 # include <xercesc/sax2/XMLReaderFactory.hpp>
00024
00025 # include <vaucanson/xml/internal/ios.hh>
00026
00027 namespace vcsn
00028 {
00029 namespace xml
00030 {
00031
00032
00033
00034 const std::string&
00035 Parser::get_xsd_path ()
00036 {
00037 static std::string path;
00038 static const char xsd[] = "vaucanson.xsd";
00039
00040
00041 if (not path.empty())
00042 return path;
00043
00044 const char* base_path = getenv("VCSN_DATA_PATH");
00045
00046 if (base_path == 0)
00047 base_path = VCSN_DATA_PATH;
00048
00049 while (*base_path)
00050 {
00051 const char* sep = strchr(base_path, ':');
00052
00053 if (sep == base_path)
00054 {
00055
00056 ++ base_path;
00057 continue;
00058 }
00059
00060
00061 if (sep > 0)
00062 path = std::string(base_path, sep - base_path);
00063 else
00064 path = std::string(base_path);
00065 path = path + "/" + xsd;
00066 base_path = sep + 1;
00067
00068
00069 if (std::ifstream(path.c_str()).good())
00070 return path;
00071
00072
00073 if (sep == 0)
00074 break;
00075 }
00076
00077
00078 FAIL (std::string("Error: cannot open `") + path + "'.\n"
00079 "Please set VCSN_DATA_PATH to the Vaucanson data directory,\n"
00080 "containing `" + xsd + "'.");
00081 return path;
00082 }
00083
00084 Parser::Parser (bool check)
00085 : parser_(0), eq_()
00086 {
00087 using namespace xercesc;
00088 parser_ = XMLReaderFactory::createXMLReader();
00089
00090 if (check)
00091 {
00092 parser_->setFeature(XMLUni::fgSAX2CoreNameSpaces, true);
00093 parser_->setFeature(XMLUni::fgSAX2CoreValidation, true);
00094 parser_->setFeature(XMLUni::fgXercesSchema, true);
00095 parser_->setFeature(XMLUni::fgXercesSchemaFullChecking, true);
00096 parser_->setFeature(XMLUni::fgXercesValidationErrorAsFatal, true);
00097 parser_->setFeature(XMLUni::fgXercesUseCachedGrammarInParse, true);
00098 parser_->setFeature(XMLUni::fgXercesCacheGrammarFromParse, true);
00099 XMLCh* xsd = transcode(VCSN_XMLNS " " + get_xsd_path());
00100 parser_->setProperty(XMLUni::fgXercesSchemaExternalSchemaLocation, xsd);
00101 XMLString::release(&xsd);
00102 }
00103
00104 err_handler_ = new ErrHandler();
00105 parser_->setErrorHandler(err_handler_);
00106 }
00107
00108 Parser::~Parser ()
00109 {
00110 delete parser_;
00111 delete err_handler_;
00112 }
00113
00114
00115
00116
00117 template <typename Auto>
00118 AutParser<Auto>::AutParser (Auto& a, bool check)
00119 : Parser(check), a_(a)
00120 {
00121 doc_handler_ = new DocAutHandler<Auto>(parser_, *err_handler_, a_, eq_);
00122 parser_->setContentHandler(doc_handler_);
00123 }
00124
00125 template <typename Auto>
00126 AutParser<Auto>::~AutParser ()
00127 {
00128 delete doc_handler_;
00129 }
00130
00131 template <typename Auto>
00132 void
00133 AutParser<Auto>::parse (std::istream& in)
00134 {
00135 CxxInputSource is(&in);
00136 parser_->parse(is);
00137 }
00138
00139
00140
00141
00142 template <typename T>
00143 RegExpParser<T>::RegExpParser (T& r, bool check)
00144 : Parser(check), r_(r)
00145 {
00146 doc_handler_ = new DocRegExpHandler<T>(parser_, *err_handler_, r_, eq_);
00147 parser_->setContentHandler(doc_handler_);
00148 }
00149
00150 template <typename T>
00151 RegExpParser<T>::~RegExpParser ()
00152 {
00153 delete doc_handler_;
00154 }
00155
00156 template <typename T>
00157 void
00158 RegExpParser<T>::parse (std::istream& in)
00159 {
00160 CxxInputSource is(&in);
00161 parser_->parse(is);
00162 }
00163 }
00164 }
00165
00166 #endif // !VCSN_XML_PARSERS_HXX