138 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			138 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
 | |
| // basic_text_iprimitive.ipp:
 | |
| 
 | |
| // (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
 | |
| // Distributed under 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.
 | |
| 
 | |
| #include <cstddef> // size_t, NULL
 | |
| #include <limits> // NULL
 | |
| 
 | |
| #include <boost/config.hpp>
 | |
| #if defined(BOOST_NO_STDC_NAMESPACE)
 | |
| namespace std{ 
 | |
|     using ::size_t; 
 | |
| } // namespace std
 | |
| #endif
 | |
| 
 | |
| #include <boost/serialization/throw_exception.hpp>
 | |
| 
 | |
| #include <boost/archive/basic_text_iprimitive.hpp>
 | |
| 
 | |
| #include <boost/archive/iterators/remove_whitespace.hpp>
 | |
| #include <boost/archive/iterators/istream_iterator.hpp>
 | |
| #include <boost/archive/iterators/binary_from_base64.hpp>
 | |
| #include <boost/archive/iterators/transform_width.hpp>
 | |
| 
 | |
| namespace boost {
 | |
| namespace archive {
 | |
| 
 | |
| namespace detail {
 | |
|     template<class CharType>
 | |
|     static inline bool is_whitespace(CharType c);
 | |
| 
 | |
|     template<>
 | |
|     inline bool is_whitespace(char t){
 | |
|         return 0 != std::isspace(t);
 | |
|     }
 | |
| 
 | |
|     #ifndef BOOST_NO_CWCHAR
 | |
|     template<>
 | |
|     inline bool is_whitespace(wchar_t t){
 | |
|         return 0 != std::iswspace(t);
 | |
|     }
 | |
|     #endif
 | |
| } // detail
 | |
| 
 | |
| // translate base64 text into binary and copy into buffer
 | |
| // until buffer is full.
 | |
| template<class IStream>
 | |
| BOOST_ARCHIVE_OR_WARCHIVE_DECL void
 | |
| basic_text_iprimitive<IStream>::load_binary(
 | |
|     void *address, 
 | |
|     std::size_t count
 | |
| ){
 | |
|     typedef typename IStream::char_type CharType;
 | |
|     
 | |
|     if(0 == count)
 | |
|         return;
 | |
|         
 | |
|     BOOST_ASSERT(
 | |
|         static_cast<std::size_t>((std::numeric_limits<std::streamsize>::max)())
 | |
|         > (count + sizeof(CharType) - 1)/sizeof(CharType)
 | |
|     );
 | |
|         
 | |
|     if(is.fail())
 | |
|         boost::serialization::throw_exception(
 | |
|             archive_exception(archive_exception::input_stream_error)
 | |
|         );
 | |
|     // convert from base64 to binary
 | |
|     typedef typename
 | |
|         iterators::transform_width<
 | |
|             iterators::binary_from_base64<
 | |
|                 iterators::remove_whitespace<
 | |
|                     iterators::istream_iterator<CharType>
 | |
|                 >
 | |
|                 ,typename IStream::int_type
 | |
|             >
 | |
|             ,8
 | |
|             ,6
 | |
|             ,CharType
 | |
|         > 
 | |
|         binary;
 | |
|         
 | |
|     binary i = binary(iterators::istream_iterator<CharType>(is));
 | |
| 
 | |
|     char * caddr = static_cast<char *>(address);
 | |
|     
 | |
|     // take care that we don't increment anymore than necessary
 | |
|     while(count-- > 0){
 | |
|         *caddr++ = static_cast<char>(*i++);
 | |
|     }
 | |
| 
 | |
|     // skip over any excess input
 | |
|     for(;;){
 | |
|         typename IStream::int_type r;
 | |
|         r = is.get();
 | |
|         if(is.eof())
 | |
|             break;
 | |
|         if(detail::is_whitespace(static_cast<CharType>(r)))
 | |
|             break;
 | |
|     }
 | |
| }
 | |
|     
 | |
| template<class IStream>
 | |
| BOOST_ARCHIVE_OR_WARCHIVE_DECL
 | |
| basic_text_iprimitive<IStream>::basic_text_iprimitive(
 | |
|     IStream  &is_,
 | |
|     bool no_codecvt
 | |
| ) :
 | |
|     is(is_),
 | |
|     flags_saver(is_),
 | |
|     precision_saver(is_),
 | |
| #ifndef BOOST_NO_STD_LOCALE
 | |
|     codecvt_null_facet(1),
 | |
|     archive_locale(is.getloc(), & codecvt_null_facet),
 | |
|     locale_saver(is)
 | |
| {
 | |
|     if(! no_codecvt){
 | |
|         is_.sync();
 | |
|         is_.imbue(archive_locale);
 | |
|     }
 | |
|     is_ >> std::noboolalpha;
 | |
| }
 | |
| #else
 | |
| {}
 | |
| #endif
 | |
| 
 | |
| template<class IStream>
 | |
| BOOST_ARCHIVE_OR_WARCHIVE_DECL
 | |
| basic_text_iprimitive<IStream>::~basic_text_iprimitive(){
 | |
| }
 | |
| 
 | |
| } // namespace archive
 | |
| } // namespace boost
 | 
