diff -r e20de85af2ee -r ce057bb09d0b ossrv_pub/io_stream_api/inc/stdapis/stlport/stl/_string_io.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ossrv_pub/io_stream_api/inc/stdapis/stlport/stl/_string_io.c Fri Jun 04 16:20:51 2010 +0100 @@ -0,0 +1,358 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + + +#ifndef _STLP_STRING_IO_C +#define _STLP_STRING_IO_C + +#ifndef _STLP_STRING_IO_H +# include +#endif + +#ifndef _STLP_INTERNAL_CTYPE_H +# include +#endif + +# ifdef _STLP_DEBUG +# define basic_string _Nondebug_string +# endif + +_STLP_BEGIN_NAMESPACE + +# if defined (_STLP_OWN_IOSTREAMS) +# define _STLP_USING_IO +# else +# define _STLP_USING_IO _STLP_USING_VENDOR_STD +# endif + +#if defined (_STLP_USE_NEW_IOSTREAMS) + +template +bool _STLP_CALL +__stlp_string_fill(basic_ostream<_CharT, _Traits>& __os, + basic_streambuf<_CharT, _Traits>* __buf, + size_t __n) +{ + _CharT __f = __os.fill(); + size_t __i; + bool __ok = true; + + for (__i = 0; __i < __n; ++__i) + __ok = __ok && !_Traits::eq_int_type(__buf->sputc(__f), _Traits::eof()); + return __ok; +} + +template +basic_ostream<_CharT, _Traits>& _STLP_CALL +operator<<(basic_ostream<_CharT, _Traits>& __os, + const basic_string<_CharT,_Traits,_Alloc>& __s) +{ + + _STLP_USING_IO + typedef basic_ostream<_CharT, _Traits> __ostream; + typename __ostream::sentry __sentry(__os); + bool __ok = false; + + if (__sentry) { + __ok = true; + size_t __n = __s.size(); + size_t __pad_len = 0; + const bool __left = (__os.flags() & __ostream::left) != 0; + const size_t __w = __os.width(0); + basic_streambuf<_CharT, _Traits>* __buf = __os.rdbuf(); + + if (__n < __w) { + __pad_len = __w - __n; + } + + 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) +{ + _STLP_USING_IO + typedef basic_istream<_CharT, _Traits> __istream; + typename __istream::sentry __sentry(__is); + + if (__sentry) { + basic_streambuf<_CharT, _Traits>* __buf = __is.rdbuf(); + typedef ctype<_CharT> _C_type; + +#ifdef _STLP_OWN_IOSTREAMS + // const _C_type& _Ctype = use_facet<_C_type>(__loc); + const _C_type& _Ctype = *(const _C_type*)__is._M_ctype_facet(); +#else +# if defined (_STLP_MSVC) && (_STLP_MSVC <= 1200 ) || defined (__ICL) + const locale& __loc = __is.getloc(); + const _C_type& _Ctype = use_facet(__loc , ( _C_type * ) 0, true); +# elif defined (__SUNPRO_CC) + const locale& __loc = __is.getloc(); + const _C_type& _Ctype = use_facet(__loc , ( _C_type * ) 0); +# else + const locale& __loc = __is.getloc(); + const _C_type& _Ctype = use_facet<_C_type>(__loc); +# endif +#endif + __s.clear(); + size_t __n = __is.width(0); + if (__n == 0) + __n = __STATIC_CAST(size_t,-1); + else + __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; + } +#ifdef __SYMBIAN32__ + else if (__c == '\b') { + __s.pop_back(); + } +#endif + else + __s.push_back(__c); + } + } + + // If we have read no characters, then set failbit. + if (__s.size() == 0) + __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) +{ + _STLP_USING_IO + typedef basic_istream<_CharT, _Traits> __istream; + size_t __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; +} + +#elif ! defined ( _STLP_USE_NO_IOSTREAMS ) + +// (reg) For Watcom IO, _OSTREAM_DLL tells if ostream class is in .exe or in .dll + +template +_OSTREAM_DLL& _STLP_CALL operator<<(_OSTREAM_DLL& __os, + const basic_string<_CharT,_Traits,_Alloc>& __s) +{ + _STLP_USING_IO + streambuf* __buf = __os.rdbuf(); + if (__buf) { + size_t __n = __s.size(); + size_t __pad_len = 0; + const bool __left = (__os.flags() & ios::left) !=0; + const size_t __w = __os.width(); + + if (__n < __w) { + __pad_len = __w - __n; + } + + if (!__left) + __stlp_string_fill(__os, __buf, __pad_len); + + const size_t __nwritten = __buf->sputn(__s.data(), __n); + + if (__left) + __stlp_string_fill(__os, __buf, __pad_len); + + if (__nwritten != __n) + __os.clear(__os.rdstate() | ios::failbit); + + __os.width(0); + } + else + __os.clear(__os.rdstate() | ios::badbit); + + return __os; +} + +template +_ISTREAM_DLL& _STLP_CALL operator>>(_ISTREAM_DLL& __is, basic_string<_CharT,_Traits,_Alloc>& __s) +{ + _STLP_USING_IO + if (!__is) + return __is; + + streambuf* __buf = __is.rdbuf(); + if (__buf) { + + if (__is.flags() & ios::skipws) { + // _CharT __c; + int __c; + do { + __c = __buf->sbumpc(); + } + while (__c != EOF && isspace((unsigned char)__c)); + + if (__c == EOF) { + __is.clear(__is.rdstate() | ios::eofbit | ios::failbit); + } + else { + if (__buf->sputbackc(__c) == EOF) + __is.clear(__is.rdstate() | ios::failbit); + } + } + + // If we arrive at end of file (or fail for some other reason) while + // still discarding whitespace, then we don't try to read the string. + if (__is) { + __s.clear(); + + size_t __n = __is.width(); + if (__n == 0) + __n = __STATIC_CAST(size_t,-1); + else + __s.reserve(__n); + + while (__n-- > 0) { + int __c1 = __buf->sbumpc(); + if (__c1 == EOF) { + __is.clear(__is.rdstate() | ios::eofbit); + break; + } + else { + _CharT __c = _Traits::to_char_type(__c1); + + if (isspace((unsigned char) __c)) { + if (__buf->sputbackc(__c) == EOF) + __is.clear(__is.rdstate() | ios::failbit); + break; + } + else + __s.push_back(__c); + } + } + + // If we have read no characters, then set failbit. + if (__s.size() == 0) + __is.clear(__is.rdstate() | ios::failbit); + } + + __is.width(0); + } + else // We have no streambuf. + __is.clear(__is.rdstate() | ios::badbit); + + return __is; +} + +template +_ISTREAM_DLL& _STLP_CALL getline(_ISTREAM_DLL& __is, + basic_string<_CharT,_Traits,_Alloc>& __s, + _CharT __delim) +{ + _STLP_USING_IO + streambuf* __buf = __is.rdbuf(); + if (__buf) { + size_t __nread = 0; + if (__is) { + __s.clear(); + + while (__nread < __s.max_size()) { + int __c1 = __buf->sbumpc(); + if (__c1 == EOF) { + __is.clear(__is.rdstate() | ios::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.clear(__is.rdstate() | ios::failbit); + } + else + __is.clear(__is.rdstate() | ios::badbit); + + return __is; +} + +# endif /* _STLP_NEW_IOSTREAMS */ + +_STLP_END_NAMESPACE + +// # undef _STLP_USING_IO +# undef basic_string + +#endif