174 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			174 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | #ifndef BOOST_ARCHIVE_BASIC_XML_GRAMMAR_HPP | ||
|  | #define BOOST_ARCHIVE_BASIC_XML_GRAMMAR_HPP | ||
|  | 
 | ||
|  | // MS compatible compilers support #pragma once | ||
|  | #if defined(_MSC_VER) | ||
|  | # pragma once | ||
|  | #endif | ||
|  | 
 | ||
|  | /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8 | ||
|  | // basic_xml_grammar.hpp | ||
|  | 
 | ||
|  | // (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .  | ||
|  | // Use, modification and distribution is subject to the Boost Software | ||
|  | // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at | ||
|  | // http://www.boost.org/LICENSE_1_0.txt) | ||
|  | 
 | ||
|  | //  See http://www.boost.org for updates, documentation, and revision history. | ||
|  | 
 | ||
|  | // this module is derived from simplexml.cpp - an example shipped as part of | ||
|  | // the spirit parser.  This example contains the following notice: | ||
|  | /*============================================================================= | ||
|  |     simplexml.cpp | ||
|  | 
 | ||
|  |     Spirit V1.3 | ||
|  |     URL: http://spirit.sourceforge.net/ | ||
|  | 
 | ||
|  |     Copyright (c) 2001, Daniel C. Nuffer | ||
|  | 
 | ||
|  |     This software is provided 'as-is', without any express or implied | ||
|  |     warranty. In no event will the copyright holder be held liable for | ||
|  |     any damages arising from the use of this software. | ||
|  | 
 | ||
|  |     Permission is granted to anyone to use this software for any purpose, | ||
|  |     including commercial applications, and to alter it and redistribute | ||
|  |     it freely, subject to the following restrictions: | ||
|  | 
 | ||
|  |     1.  The origin of this software must not be misrepresented; you must | ||
|  |         not claim that you wrote the original software. If you use this | ||
|  |         software in a product, an acknowledgment in the product documentation | ||
|  |         would be appreciated but is not required. | ||
|  | 
 | ||
|  |     2.  Altered source versions must be plainly marked as such, and must | ||
|  |         not be misrepresented as being the original software. | ||
|  | 
 | ||
|  |     3.  This notice may not be removed or altered from any source | ||
|  |         distribution. | ||
|  | =============================================================================*/ | ||
|  | #include <string> | ||
|  | 
 | ||
|  | #include <boost/config.hpp> | ||
|  | #include <boost/detail/workaround.hpp> | ||
|  | 
 | ||
|  | #include <boost/spirit/include/classic_rule.hpp> | ||
|  | #include <boost/spirit/include/classic_chset.hpp> | ||
|  | 
 | ||
|  | #include <boost/archive/basic_archive.hpp> | ||
|  | #include <boost/serialization/tracking.hpp> | ||
|  | #include <boost/serialization/version.hpp> | ||
|  | 
 | ||
|  | namespace boost { | ||
|  | namespace archive { | ||
|  | 
 | ||
|  | /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8 | ||
|  | // XML grammar parsing | ||
|  | 
 | ||
|  | template<class CharType> | ||
|  | class basic_xml_grammar { | ||
|  | public: | ||
|  |     // The following is not necessary according to DR45, but at least | ||
|  |     // one compiler (Compaq C++ 6.5 in strict_ansi mode) chokes otherwise. | ||
|  |     struct return_values; | ||
|  |     friend struct return_values; | ||
|  |      | ||
|  | private: | ||
|  |     typedef typename std::basic_istream<CharType> IStream; | ||
|  |     typedef typename std::basic_string<CharType> StringType; | ||
|  |     typedef typename boost::spirit::classic::chset<CharType> chset_t; | ||
|  |     typedef typename boost::spirit::classic::chlit<CharType> chlit_t; | ||
|  |     typedef typename boost::spirit::classic::scanner< | ||
|  |         typename  std::basic_string<CharType>::iterator | ||
|  |     > scanner_t; | ||
|  |     typedef typename boost::spirit::classic::rule<scanner_t> rule_t; | ||
|  |     // Start grammar definition | ||
|  |     rule_t     | ||
|  |         Reference, | ||
|  |         Eq,  | ||
|  |         STag, | ||
|  |         ETag, | ||
|  |         LetterOrUnderscoreOrColon, | ||
|  |         AttValue,  | ||
|  |         CharRef1,  | ||
|  |         CharRef2,  | ||
|  |         CharRef,  | ||
|  |         AmpRef, | ||
|  |         LTRef, | ||
|  |         GTRef, | ||
|  |         AposRef, | ||
|  |         QuoteRef, | ||
|  |         CharData, | ||
|  |         CharDataChars, | ||
|  |         content, | ||
|  |         AmpName, | ||
|  |         LTName, | ||
|  |         GTName, | ||
|  |         ClassNameChar, | ||
|  |         ClassName, | ||
|  |         Name, | ||
|  |         XMLDecl, | ||
|  |         XMLDeclChars, | ||
|  |         DocTypeDecl, | ||
|  |         DocTypeDeclChars, | ||
|  |         ClassIDAttribute, | ||
|  |         ObjectIDAttribute, | ||
|  |         ClassNameAttribute, | ||
|  |         TrackingAttribute, | ||
|  |         VersionAttribute, | ||
|  |         UnusedAttribute, | ||
|  |         Attribute, | ||
|  |         SignatureAttribute, | ||
|  |         SerializationWrapper, | ||
|  |         NameHead, | ||
|  |         NameTail, | ||
|  |         AttributeList, | ||
|  |         S; | ||
|  | 
 | ||
|  |     // XML Character classes | ||
|  |     chset_t | ||
|  |         BaseChar, | ||
|  |         Ideographic, | ||
|  |         Char,  | ||
|  |         Letter,  | ||
|  |         Digit, | ||
|  |         CombiningChar, | ||
|  |         Extender,  | ||
|  |         Sch, | ||
|  |         NameChar; | ||
|  | 
 | ||
|  |     void init_chset(); | ||
|  | 
 | ||
|  |     bool my_parse( | ||
|  |         IStream & is, | ||
|  |         const rule_t &rule_,  | ||
|  |         const CharType delimiter = L'>' | ||
|  |     ) const ; | ||
|  | public: | ||
|  |     struct return_values { | ||
|  |         StringType object_name; | ||
|  |         StringType contents; | ||
|  |         //class_id_type class_id; | ||
|  |         int_least16_t class_id; | ||
|  |         //object_id_type object_id; | ||
|  |         uint_least32_t object_id; | ||
|  |         //version_type version; | ||
|  |         unsigned int version; | ||
|  |         tracking_type tracking_level; | ||
|  |         StringType class_name; | ||
|  |         return_values() : | ||
|  |             version(0), | ||
|  |             tracking_level(false) | ||
|  |         {} | ||
|  |     } rv; | ||
|  |     bool parse_start_tag(IStream & is) /*const*/; | ||
|  |     bool parse_end_tag(IStream & is) const; | ||
|  |     bool parse_string(IStream & is, StringType & s) /*const*/; | ||
|  |     void init(IStream & is); | ||
|  |     bool windup(IStream & is); | ||
|  |     basic_xml_grammar(); | ||
|  | }; | ||
|  | 
 | ||
|  | } // namespace archive | ||
|  | } // namespace boost | ||
|  | 
 | ||
|  | #endif // BOOST_ARCHIVE_BASIC_XML_GRAMMAR_HPP |