ossrv_pub/io_stream_api/inc/stdapis/stlport/stl/_string_io.c
changeset 31 ce057bb09d0b
child 34 5fae379060a7
--- /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 <stl/_string_io.h>
+#endif
+
+#ifndef _STLP_INTERNAL_CTYPE_H
+# include <stl/_ctype.h>
+#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 <class _CharT, class _Traits>
+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 <class _CharT, class _Traits, class _Alloc>
+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 <class _CharT, class _Traits, class _Alloc>
+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 <class _CharT, class _Traits, class _Alloc>    
+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 <class _CharT, class _Traits, class _Alloc>
+_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 <class _CharT, class _Traits, class _Alloc>
+_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 <class _CharT, class _Traits, class _Alloc>    
+_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