X-Git-Url: http://git.buserror.net/cgi-bin/gitweb.cgi?p=polintos%2Fscott%2Fpriv.git;a=blobdiff_plain;f=include%2Fc%2B%2B%2Fstl%2Fstl%2F_string_io.c;fp=include%2Fc%2B%2B%2Fstl%2Fstl%2F_string_io.c;h=84b18736b573d0a1fadcda8596794142d7be4bb8;hp=0000000000000000000000000000000000000000;hb=173d8903eb9d51a4ea7d7fa3e52dc86c9bb6d4f1;hpb=b024710fe2b60cd4a42a8993b61333d6cdb56ca3 diff --git a/include/c++/stl/stl/_string_io.c b/include/c++/stl/stl/_string_io.c new file mode 100644 index 0000000..84b1873 --- /dev/null +++ b/include/c++/stl/stl/_string_io.c @@ -0,0 +1,172 @@ +#ifndef _STLP_STRING_IO_C +#define _STLP_STRING_IO_C + +#ifndef _STLP_STRING_IO_H +# include +#endif + +#ifndef _STLP_INTERNAL_CTYPE_H +# include +#endif + +_STLP_BEGIN_NAMESPACE + +template +bool _STLP_CALL +__stlp_string_fill(basic_ostream<_CharT, _Traits>& __os, + basic_streambuf<_CharT, _Traits>* __buf, + streamsize __n) { + _CharT __f = __os.fill(); + for (streamsize __i = 0; __i < __n; ++__i) { + if (_Traits::eq_int_type(__buf->sputc(__f), _Traits::eof())) + return false; + } + return true; +} + + +template +basic_ostream<_CharT, _Traits>& _STLP_CALL +operator << (basic_ostream<_CharT, _Traits>& __os, + const basic_string<_CharT,_Traits,_Alloc>& __s) { + typedef basic_ostream<_CharT, _Traits> __ostream; + typedef typename basic_string<_CharT, _Traits, _Alloc>::size_type size_type; + + // The hypothesis of this implementation is that size_type is unsigned: + _STLP_STATIC_ASSERT(__STATIC_CAST(size_type, -1) > 0) + + typename __ostream::sentry __sentry(__os); + bool __ok = false; + + if (__sentry) { + __ok = true; + size_type __n = __s.size(); + const bool __left = (__os.flags() & __ostream::left) != 0; + const streamsize __w = __os.width(0); + basic_streambuf<_CharT, _Traits>* __buf = __os.rdbuf(); + + const bool __need_pad = (((sizeof(streamsize) > sizeof(size_t)) && (__STATIC_CAST(streamsize, __n) < __w)) || + ((sizeof(streamsize) <= sizeof(size_t)) && (__n < __STATIC_CAST(size_t, __w)))); + streamsize __pad_len = __need_pad ? __w - __n : 0; + + if (!__left) + __ok = __stlp_string_fill(__os, __buf, __pad_len); + + __ok = __ok && (__buf->sputn(__s.data(), streamsize(__n)) == streamsize(__n)); + + if (__left) + __ok = __ok && __stlp_string_fill(__os, __buf, __pad_len); + } + + if (!__ok) + __os.setstate(__ostream::failbit); + + return __os; +} + +template +basic_istream<_CharT, _Traits>& _STLP_CALL +operator >> (basic_istream<_CharT, _Traits>& __is, + basic_string<_CharT,_Traits, _Alloc>& __s) { + typedef basic_istream<_CharT, _Traits> __istream; + typedef typename basic_string<_CharT, _Traits, _Alloc>::size_type size_type; + + // The hypothesis of this implementation is that size_type is unsigned: + _STLP_STATIC_ASSERT(__STATIC_CAST(size_type, -1) > 0) + + typename __istream::sentry __sentry(__is); + + if (__sentry) { + basic_streambuf<_CharT, _Traits>* __buf = __is.rdbuf(); + typedef ctype<_CharT> _C_type; + + const locale& __loc = __is.getloc(); + const _C_type& _Ctype = use_facet<_C_type>(__loc); + __s.clear(); + streamsize __width = __is.width(0); + size_type __n; + if (__width <= 0) + __n = __s.max_size(); + /* __width can only overflow size_type if sizeof(streamsize) > sizeof(size_type) + * because here we know that __width is positive and the stattic assertion check + * that size_type is unsigned. + */ + else if (sizeof(streamsize) > sizeof(size_type) && + (__width > __STATIC_CAST(streamsize, __s.max_size()))) + __n = 0; + else { + __n = __STATIC_CAST(size_type, __width); + __s.reserve(__n); + } + + while (__n-- > 0) { + typename _Traits::int_type __c1 = __buf->sbumpc(); + if (_Traits::eq_int_type(__c1, _Traits::eof())) { + __is.setstate(__istream::eofbit); + break; + } + else { + _CharT __c = _Traits::to_char_type(__c1); + + if (_Ctype.is(_C_type::space, __c)) { + if (_Traits::eq_int_type(__buf->sputbackc(__c), _Traits::eof())) + __is.setstate(__istream::failbit); + break; + } + else + __s.push_back(__c); + } + } + + // If we have read no characters, then set failbit. + if (__s.empty()) + __is.setstate(__istream::failbit); + } + else + __is.setstate(__istream::failbit); + + return __is; +} + +template +basic_istream<_CharT, _Traits>& _STLP_CALL +getline(basic_istream<_CharT, _Traits>& __is, + basic_string<_CharT,_Traits,_Alloc>& __s, + _CharT __delim) { + typedef basic_istream<_CharT, _Traits> __istream; + typedef typename basic_string<_CharT, _Traits, _Alloc>::size_type size_type; + size_type __nread = 0; + typename basic_istream<_CharT, _Traits>::sentry __sentry(__is, true); + if (__sentry) { + basic_streambuf<_CharT, _Traits>* __buf = __is.rdbuf(); + __s.clear(); + + while (__nread < __s.max_size()) { + int __c1 = __buf->sbumpc(); + if (_Traits::eq_int_type(__c1, _Traits::eof())) { + __is.setstate(__istream::eofbit); + break; + } + else { + ++__nread; + _CharT __c = _Traits::to_char_type(__c1); + if (!_Traits::eq(__c, __delim)) + __s.push_back(__c); + else + break; // Character is extracted but not appended. + } + } + } + if (__nread == 0 || __nread >= __s.max_size()) + __is.setstate(__istream::failbit); + + return __is; +} + +_STLP_END_NAMESPACE + +#endif + +// Local Variables: +// mode:C++ +// End: