You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stdcxx.apache.org by fa...@apache.org on 2008/02/22 18:00:00 UTC
svn commit: r630250 - in /stdcxx/trunk: include/istream include/istream.cc
include/ostream include/rw/_stringio.c include/rw/_stringio.cc
include/rw/_stringio.h include/string src/export.cpp
Author: faridz
Date: Fri Feb 22 08:59:56 2008
New Revision: 630250
URL: http://svn.apache.org/viewvc?rev=630250&view=rev
Log:
2008-02-22 Farid Zaripov <fa...@epam.com>
STDCXX-375
* include/string: Declarations of the string inserter's and extractor's
are moved to #included <rw/_stringio.h>.
* include/ostream: Definition of the inline string inserter moved to
#included <rw/_stringio.h>.
* include/istream: Definition of the inline std::getline() moved to
#included <rw/_stringio.h>.
* include/istream.cc: Definitions of the string extractor's are moved
to rw/_stringio.cc file.
* include/rw/_stringio.h: New header file with declarations of the
string inserter's and extractor's.
* include/rw/_stringio.cc: New file with definitions of the string extractors.
* include/rw/_stringio.c: New file for compilers with implicit
inclusion feature.
* src/export/cpp: #included <rw/_stringio.h> and <rw/_stringio.cc>.
Added:
stdcxx/trunk/include/rw/_stringio.c (with props)
stdcxx/trunk/include/rw/_stringio.cc (with props)
stdcxx/trunk/include/rw/_stringio.h (with props)
Modified:
stdcxx/trunk/include/istream
stdcxx/trunk/include/istream.cc
stdcxx/trunk/include/ostream
stdcxx/trunk/include/string
stdcxx/trunk/src/export.cpp
Modified: stdcxx/trunk/include/istream
URL: http://svn.apache.org/viewvc/stdcxx/trunk/include/istream?rev=630250&r1=630249&r2=630250&view=diff
==============================================================================
--- stdcxx/trunk/include/istream (original)
+++ stdcxx/trunk/include/istream Fri Feb 22 08:59:56 2008
@@ -522,16 +522,6 @@
}
-// 21.3.7.9 - defined here, declared inline in <string>
-template<class _CharT, class _Traits, class _Allocator>
-inline basic_istream<_CharT, _Traits>&
-getline (basic_istream<_CharT, _Traits>& __is,
- basic_string<_CharT, _Traits, _Allocator>& __str)
-{
- return getline (__is, __str, __is.widen ('\n'));
-}
-
-
// 27.6.1.5
template<class _CharT, class _Traits /* = char_traits<_CharT> */>
class basic_iostream
@@ -570,12 +560,6 @@
_RWSTD_INSTANTIATE_2 (class _RWSTD_TI_EXPORT
basic_istream<char, char_traits<char> >);
-_RWSTD_INSTANTIATE_FUN_1 (_RWSTD_TI_EXPORT istream&
- operator>> (istream&, string&));
-
-_RWSTD_INSTANTIATE_FUN_1 (_RWSTD_TI_EXPORT istream&
- getline (istream&, string&, char));
-
#endif // _RWSTD_INSTANTIATE (_BASIC_ISTREAM, _CHAR)
#if _RWSTD_INSTANTIATE (_BASIC_ISTREAM, _WCHAR_T)
@@ -583,11 +567,6 @@
_RWSTD_INSTANTIATE_2 (class _RWSTD_TI_EXPORT
basic_istream<wchar_t, char_traits<wchar_t> >);
-_RWSTD_INSTANTIATE_FUN_1 (_RWSTD_TI_EXPORT wistream&
- operator>> (wistream&, wstring&));
-
-_RWSTD_INSTANTIATE_FUN_1 (_RWSTD_TI_EXPORT wistream&
- getline (wistream&, wstring&, wchar_t));
#endif // _RWSTD_INSTANTIATE (_BASIC_ISTREAM, _WCHAR_T)
} // namespace std
@@ -596,5 +575,12 @@
#if _RWSTD_DEFINE_TEMPLATE_LAST (_BASIC_ISTREAM)
# include <istream.cc>
#endif // _RWSTD_DEFINE_TEMPLATE_LAST (_BASIC_ISTREAM)
+
+
+#ifndef _RWSTD_STRING_EXTRACTORS_INCLUDED
+# define _RWSTD_INCLUDE_STRING_EXTRACTORS
+# include <rw/_stringio.h>
+#endif // _RWSTD_STRING_EXTRACTORS_INCLUDED
+
#endif // _RWSTD_ISTREAM_INCLUDED
Modified: stdcxx/trunk/include/istream.cc
URL: http://svn.apache.org/viewvc/stdcxx/trunk/include/istream.cc?rev=630250&r1=630249&r2=630250&view=diff
==============================================================================
--- stdcxx/trunk/include/istream.cc (original)
+++ stdcxx/trunk/include/istream.cc Fri Feb 22 08:59:56 2008
@@ -780,374 +780,6 @@
}
-// 21.3.7.9 - defined here, declared in <string>
-_EXPORT
-template<class _CharT, class _Traits, class _Allocator>
-basic_istream<_CharT, _Traits>&
-operator>> (basic_istream<_CharT, _Traits>& __is,
- basic_string<_CharT, _Traits, _Allocator>& __str)
-{
- _RWSTD_ASSERT (0 != __is.rdbuf ());
-
- const _TYPENAME basic_istream<_CharT, _Traits>::sentry
- __ipfx (__is /* , noskipws = false */);
-
- ios_base::iostate __err = ios_base::goodbit;
-
- typedef _RWSTD_SIZE_T _SizeT;
-
- // count of characters read from stream
- _SizeT __gcount = 0;
-
- _TRY {
-
- if (__ipfx) {
-
- __str.clear ();
-
- // maximum number of characters we can read
- _RWSTD_SIZE_T __n =
- __is.width () ? __is.width () : __str.max_size ();
-
- basic_streambuf<_CharT, _Traits>* const __rdbuf = __is.rdbuf ();
-
- const ctype<_CharT> &__ctp =
- _USE_FACET (ctype<_CharT>, __is.getloc ());
-
-#ifndef _RWSTD_NO_FRIEND_TEMPLATE
-
- while (__n != 0) {
-
- const _CharT* const __gptr = __rdbuf->gptr ();
- const _CharT* const __egptr = __rdbuf->egptr ();
-
- // maximum number of characters would want to extract
- _SizeT __navail = __egptr - __gptr;
- if (__n < __navail)
- __navail = __n;
-
- if (__navail) {
-
- // find the delimeter in the squence if it exists, or
- // get pointer to end of sequence
- const _CharT* __pdel = __gptr;
- for (/**/; __pdel != __egptr; ++__pdel) {
-
- const _TYPENAME _Traits::int_type
- __c = _Traits::to_int_type(*__pdel);
-
- if (_Traits::eq_int_type (__c, _Traits::eof ())) {
- __err = ios_base::eofbit;
- break;
- }
-
- if (__ctp.is (__ctp.space, *__pdel))
- break;
- }
-
- // __pdel is either pointing to a delimiter or one past
- // the end of the input stream get area. if it is past
- // the end, then set it to null.
- if (__pdel == __egptr) {
- __pdel = 0;
- }
-
- if (__pdel) {
- __navail = __pdel - __gptr + 1;
- __n -= __navail - 1;
- }
- else if (__n == __navail)
- __n -= --__navail;
- else
- __n -= __navail;
-
- // store characters excluding the delimiter
- __str.append (__gptr, __navail - !!__pdel);
-
- __gcount += __navail;
-
- // advance gptr() by the number of extracted
- // characters, including the delimiter
- __rdbuf->gbump (__navail);
-
- // we found a delimiter before the end of the get area,
- // break out of outer loop
- if (__pdel) {
- break;
- }
-
- if (2 > __n && _SizeT (__egptr - __gptr) != __navail) {
- __err = ios_base::failbit;
- break;
- }
- }
- else {
-
- // n data in buffer, trigger underflow()
- // note that streambuf may be unbuffered
- const _TYPENAME _Traits::int_type
- __c = __rdbuf->sgetc ();
-
- if (_Traits::eq_int_type (__c, _Traits::eof ())) {
- __err = ios_base::eofbit;
- break;
- }
-
- // convert to char_type so that isspace works correctly
- const _TYPENAME _Traits::char_type
- __ch = _Traits::to_char_type (__c);
-
- if (__ctp.is (__ctp.space, __ch))
- break;
-
- __str.push_back (__ch);
- --__n;
-
- __rdbuf->sbumpc ();
-
- // increment gcount only _after_ sbumpc() but _before_
- // the subsequent call to sgetc() to correctly reflect
- // the number of extracted characters in the presence
- // of exceptions thrown from streambuf virtuals
- ++__gcount;
- }
- }
-
-#else // if defined (_RWSTD_NO_FRIEND_TEMPLATE)
-
- for ( ; __n != 0; ) {
-
- const _TYPENAME _Traits::int_type
- __c (__rdbuf->sgetc ());
-
- if (_Traits::eq_int_type (__c, _Traits::eof ())) {
- __err = ios_base::eofbit;
- break;
- }
-
- // convert to char_type so that isspace works correctly
- const _TYPENAME _Traits::char_type
- __ch = _Traits::to_char_type (__c);
-
- if (__ctp.is (__ctp.space, __ch))
- break;
-
- __str.push_back (__ch);
- --__n;
-
- __rdbuf->sbumpc ();
-
- // increment gcount only _after_ sbumpc() but _before_
- // the subsequent call to sgetc() to correctly reflect
- // the number of extracted characters in the presence
- // of exceptions thrown from streambuf virtuals
- ++__gcount;
- }
-
-#endif // if defined (_RWSTD_NO_FRIEND_TEMPLATE)
-
- __is.width (0);
- }
- }
- _CATCH (...) {
- __is.setstate (ios_base::badbit | _RW::__rw_rethrow);
- }
-
- if (!__gcount)
- __err |= ios_base::failbit;
-
- if (__err)
- __is.setstate (__err);
-
- return __is;
-}
-
-
-// 21.3.7.9 - defined here, declared in <string>
-_EXPORT
-template<class _CharT, class _Traits, class _Allocator>
-basic_istream<_CharT, _Traits>&
-getline (basic_istream<_CharT, _Traits>& __is,
- basic_string<_CharT, _Traits, _Allocator>& __str,
- _CharT __delim)
-{
- _RWSTD_ASSERT (0 != __is.rdbuf ());
-
- const _TYPENAME basic_istream<_CharT, _Traits>::sentry
- __ipfx (__is, true /* noskipws */);
-
-#ifndef _RWSTD_NO_FRIEND_TEMPLATE
-
- ios_base::iostate __err = ios_base::goodbit;
-
- typedef _RWSTD_SIZE_T _SizeT;
-
- _SizeT __gcount = 0;
-
- if (__ipfx) {
-
- __str.clear ();
-
- // carefuly handle arithmetic overflow
- _SizeT __n = __str.max_size ();
- if (__n + _SizeT (1))
- ++__n;
-
- basic_streambuf<_CharT, _Traits>* const __rdbuf = __is.rdbuf ();
-
- _TRY {
-
- for ( ; ; ) {
-
- typedef _TYPENAME _Traits::int_type int_type;
-
- const _CharT* const __gptr = __rdbuf->gptr ();
- const _CharT* const __egptr = __rdbuf->egptr ();
-
- // compute the lesser of the number of characters in the
- // stream buffer and the size of the destination buffer
- _SizeT __navail = __egptr - __gptr;
- if (__n < __navail)
- __navail = __n;
-
- if (__navail) {
-
- // find the delimiter in the sequence if it exists
- const _CharT* const __pdel =
- _Traits::find (__gptr, __navail, __delim);
-
- if (__pdel) {
- __navail = __pdel - __gptr + 1;
- __n -= __navail - 1;
- }
- else if (__n == __navail)
- __n -= --__navail;
- else
- __n -= __navail;
-
- // store characters excluding the delimiter
- __str.append (__gptr, __navail - !!__pdel);
-
- __gcount += __navail;
-
- // advance gptr() by the number of extracted
- // characters, including the delimiter
- __rdbuf->gbump (__navail);
-
- if (__pdel) {
- break;
- }
-
- if (2 > __n && _SizeT (__egptr - __gptr) != __navail) {
- __err = ios_base::failbit;
- break;
- }
- }
- else {
-
- // no data in buffer, trigger underflow()
- // note that streambuf may be unbuffered
- const int_type __c (__rdbuf->sgetc ());
-
- if (_Traits::eq_int_type (__c, _Traits::eof ())) {
- __err = ios_base::eofbit;
- break;
- }
-
- const _CharT __ch = _Traits::to_char_type (__c);
- if (_Traits::eq (__ch, __delim)) {
- __rdbuf->sbumpc ();
- __gcount++;
- break;
- }
-
- if (2 > __n) {
- __err = ios_base::failbit;
- break;
- }
-
- __str += __ch;
- --__n;
-
- __rdbuf->sbumpc ();
-
- // increment gcount only _after_ sbumpc() but _before_
- // the subsequent call to sgetc() to correctly reflect
- // the number of extracted characters in the presence
- // of exceptions thrown from streambuf virtuals
- ++__gcount;
- }
- }
- }
- _CATCH (...) {
- __is.setstate (ios_base::badbit | _RW::__rw_rethrow);
- }
- }
-
- if (!__gcount)
- __err |= ios_base::failbit;
-
-#else // if defined (_RWSTD_NO_FRIEND_TEMPLATE)
-
- ios_base::iostate __err = ios_base::failbit;
-
- if (__ipfx) {
-
- _TRY {
-
- __str.clear ();
-
- const _RWSTD_SIZE_T __max_size = __str.max_size ();
-
- // FIXME: code commented out to work around an HP aCC 3.14.10
- // bug #JAGac86264
-
- // typedef _TYPENAME
- // basic_string<_CharT, _Traits, _Allocator>::size_type
-
- for ( ; ; ) {
-
- const _TYPENAME _Traits::int_type
- __c (__is.rdbuf ()->sgetc ());
-
- if (_Traits::eq_int_type (__c, _Traits::eof ())) {
- // 21.3.7.9, p7
- if (__str.size ())
- __err = ios_base::eofbit;
- else
- __err = ios_base::eofbit | ios_base::failbit;
-
- break;
- }
-
- if (_Traits::eq (_Traits::to_char_type (__c), __delim)) {
- __is.rdbuf ()->sbumpc ();
- __err = ios_base::goodbit;
- break;
- }
-
- if (__max_size <= __str.size ())
- break;
-
- __str.push_back (_Traits::to_char_type (__c));
-
- __is.rdbuf ()->sbumpc ();
- }
- }
- _CATCH (...) {
- __is.setstate (ios_base::badbit | _RW::__rw_rethrow);
- }
- }
-
-#endif // _RWSTD_NO_FRIEND_TEMPLATE
-
- if (__err)
- __is.setstate (__err);
-
- return __is;
-}
-
-
#ifdef _RWSTD_NO_UNDEFINED_TEMPLATES
template <class _CharT, class _Traits>
Modified: stdcxx/trunk/include/ostream
URL: http://svn.apache.org/viewvc/stdcxx/trunk/include/ostream?rev=630250&r1=630249&r2=630250&view=diff
==============================================================================
--- stdcxx/trunk/include/ostream (original)
+++ stdcxx/trunk/include/ostream Fri Feb 22 08:59:56 2008
@@ -484,18 +484,6 @@
}
-// 21.3.7.9, p3 - defined here, declared inline in <string>
-template<class _CharT, class _Traits, class _Allocator>
-inline basic_ostream<_CharT, _Traits>&
-operator<< (basic_ostream<_CharT, _Traits> & __strm,
- const basic_string<_CharT, _Traits, _Allocator> &__str)
-{
- _RW::__rw_insert (__strm, __str.data (), __str.length (),
- __strm.width ());
- return __strm;
-}
-
-
#if defined (_MSC_VER) && _MSC_VER < 1310
// working around an MSVC bug that causes it to pick the member
@@ -573,6 +561,12 @@
#if _RWSTD_DEFINE_TEMPLATE_LAST (_BASIC_OSTREAM)
# include <ostream.cc>
#endif // _RWSTD_DEFINE_TEMPLATE_LAST (_BASIC_OSTREAM)
+
+
+#ifndef _RWSTD_STRING_INSERTER_INCLUDED
+# define _RWSTD_INCLUDE_STRING_INSERTER
+# include <rw/_stringio.h>
+#endif // _RWSTD_STRING_INSERTER_INCLUDED
#endif // _RWSTD_OSTREAM_INCLUDED
Added: stdcxx/trunk/include/rw/_stringio.c
URL: http://svn.apache.org/viewvc/stdcxx/trunk/include/rw/_stringio.c?rev=630250&view=auto
==============================================================================
--- stdcxx/trunk/include/rw/_stringio.c (added)
+++ stdcxx/trunk/include/rw/_stringio.c Fri Feb 22 08:59:56 2008
@@ -0,0 +1,29 @@
+/***************************************************************************
+ *
+ * rw/_stringio.c
+ *
+ * $Id$
+ *
+ ***************************************************************************
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ * implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ *
+ * Copyright 1994-2008 Rogue Wave Software.
+ *
+ **************************************************************************/
+
+#include <rw/_stringio.cc>
Propchange: stdcxx/trunk/include/rw/_stringio.c
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: stdcxx/trunk/include/rw/_stringio.c
------------------------------------------------------------------------------
svn:keywords = Id
Added: stdcxx/trunk/include/rw/_stringio.cc
URL: http://svn.apache.org/viewvc/stdcxx/trunk/include/rw/_stringio.cc?rev=630250&view=auto
==============================================================================
--- stdcxx/trunk/include/rw/_stringio.cc (added)
+++ stdcxx/trunk/include/rw/_stringio.cc Fri Feb 22 08:59:56 2008
@@ -0,0 +1,399 @@
+/***************************************************************************
+ *
+ * _stringio.cc - definitions of the string extractors
+ *
+ * $Id$
+ *
+ ***************************************************************************
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ * implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ *
+ * Copyright 1994-2008 Rogue Wave Software.
+ *
+ **************************************************************************/
+
+
+_RWSTD_NAMESPACE (std) {
+
+
+_EXPORT
+template<class _CharT, class _Traits, class _Allocator>
+basic_istream<_CharT, _Traits>&
+operator>> (basic_istream<_CharT, _Traits>& __is,
+ basic_string<_CharT, _Traits, _Allocator>& __str)
+{
+ _RWSTD_ASSERT (0 != __is.rdbuf ());
+
+ const _TYPENAME basic_istream<_CharT, _Traits>::sentry
+ __ipfx (__is /* , noskipws = false */);
+
+ ios_base::iostate __err = ios_base::goodbit;
+
+ typedef _RWSTD_SIZE_T _SizeT;
+
+ // count of characters read from stream
+ _SizeT __gcount = 0;
+
+ _TRY {
+
+ if (__ipfx) {
+
+ __str.clear ();
+
+ // maximum number of characters we can read
+ _RWSTD_SIZE_T __n =
+ __is.width () ? __is.width () : __str.max_size ();
+
+ basic_streambuf<_CharT, _Traits>* const __rdbuf = __is.rdbuf ();
+
+ const ctype<_CharT> &__ctp =
+ _USE_FACET (ctype<_CharT>, __is.getloc ());
+
+#ifndef _RWSTD_NO_FRIEND_TEMPLATE
+
+ while (__n != 0) {
+
+ const _CharT* const __gptr = __rdbuf->gptr ();
+ const _CharT* const __egptr = __rdbuf->egptr ();
+
+ // maximum number of characters would want to extract
+ _SizeT __navail = __egptr - __gptr;
+ if (__n < __navail)
+ __navail = __n;
+
+ if (__navail) {
+
+ // find the delimeter in the squence if it exists, or
+ // get pointer to end of sequence
+ const _CharT* __pdel = __gptr;
+ for (/**/; __pdel != __egptr; ++__pdel) {
+
+ const _TYPENAME _Traits::int_type
+ __c = _Traits::to_int_type(*__pdel);
+
+ if (_Traits::eq_int_type (__c, _Traits::eof ())) {
+ __err = ios_base::eofbit;
+ break;
+ }
+
+ if (__ctp.is (__ctp.space, *__pdel))
+ break;
+ }
+
+ // __pdel is either pointing to a delimiter or one past
+ // the end of the input stream get area. if it is past
+ // the end, then set it to null.
+ if (__pdel == __egptr) {
+ __pdel = 0;
+ }
+
+ if (__pdel) {
+ __navail = __pdel - __gptr + 1;
+ __n -= __navail - 1;
+ }
+ else if (__n == __navail)
+ __n -= --__navail;
+ else
+ __n -= __navail;
+
+ // store characters excluding the delimiter
+ __str.append (__gptr, __navail - !!__pdel);
+
+ __gcount += __navail;
+
+ // advance gptr() by the number of extracted
+ // characters, including the delimiter
+ __rdbuf->gbump (__navail);
+
+ // we found a delimiter before the end of the get area,
+ // break out of outer loop
+ if (__pdel) {
+ break;
+ }
+
+ if (2 > __n && _SizeT (__egptr - __gptr) != __navail) {
+ __err = ios_base::failbit;
+ break;
+ }
+ }
+ else {
+
+ // n data in buffer, trigger underflow()
+ // note that streambuf may be unbuffered
+ const _TYPENAME _Traits::int_type
+ __c = __rdbuf->sgetc ();
+
+ if (_Traits::eq_int_type (__c, _Traits::eof ())) {
+ __err = ios_base::eofbit;
+ break;
+ }
+
+ // convert to char_type so that isspace works correctly
+ const _TYPENAME _Traits::char_type
+ __ch = _Traits::to_char_type (__c);
+
+ if (__ctp.is (__ctp.space, __ch))
+ break;
+
+ __str.push_back (__ch);
+ --__n;
+
+ __rdbuf->sbumpc ();
+
+ // increment gcount only _after_ sbumpc() but _before_
+ // the subsequent call to sgetc() to correctly reflect
+ // the number of extracted characters in the presence
+ // of exceptions thrown from streambuf virtuals
+ ++__gcount;
+ }
+ }
+
+#else // if defined (_RWSTD_NO_FRIEND_TEMPLATE)
+
+ for ( ; __n != 0; ) {
+
+ const _TYPENAME _Traits::int_type
+ __c (__rdbuf->sgetc ());
+
+ if (_Traits::eq_int_type (__c, _Traits::eof ())) {
+ __err = ios_base::eofbit;
+ break;
+ }
+
+ // convert to char_type so that isspace works correctly
+ const _TYPENAME _Traits::char_type
+ __ch = _Traits::to_char_type (__c);
+
+ if (__ctp.is (__ctp.space, __ch))
+ break;
+
+ __str.push_back (__ch);
+ --__n;
+
+ __rdbuf->sbumpc ();
+
+ // increment gcount only _after_ sbumpc() but _before_
+ // the subsequent call to sgetc() to correctly reflect
+ // the number of extracted characters in the presence
+ // of exceptions thrown from streambuf virtuals
+ ++__gcount;
+ }
+
+#endif // if defined (_RWSTD_NO_FRIEND_TEMPLATE)
+
+ __is.width (0);
+ }
+ }
+ _CATCH (...) {
+ __is.setstate (ios_base::badbit | _RW::__rw_rethrow);
+ }
+
+ if (!__gcount)
+ __err |= ios_base::failbit;
+
+ if (__err)
+ __is.setstate (__err);
+
+ return __is;
+}
+
+
+_EXPORT
+template<class _CharT, class _Traits, class _Allocator>
+basic_istream<_CharT, _Traits>&
+getline (basic_istream<_CharT, _Traits>& __is,
+ basic_string<_CharT, _Traits, _Allocator>& __str,
+ _CharT __delim)
+{
+ _RWSTD_ASSERT (0 != __is.rdbuf ());
+
+ const _TYPENAME basic_istream<_CharT, _Traits>::sentry
+ __ipfx (__is, true /* noskipws */);
+
+#ifndef _RWSTD_NO_FRIEND_TEMPLATE
+
+ ios_base::iostate __err = ios_base::goodbit;
+
+ typedef _RWSTD_SIZE_T _SizeT;
+
+ _SizeT __gcount = 0;
+
+ if (__ipfx) {
+
+ __str.clear ();
+
+ // carefuly handle arithmetic overflow
+ _SizeT __n = __str.max_size ();
+ if (__n + _SizeT (1))
+ ++__n;
+
+ basic_streambuf<_CharT, _Traits>* const __rdbuf = __is.rdbuf ();
+
+ _TRY {
+
+ for ( ; ; ) {
+
+ typedef _TYPENAME _Traits::int_type int_type;
+
+ const _CharT* const __gptr = __rdbuf->gptr ();
+ const _CharT* const __egptr = __rdbuf->egptr ();
+
+ // compute the lesser of the number of characters in the
+ // stream buffer and the size of the destination buffer
+ _SizeT __navail = __egptr - __gptr;
+ if (__n < __navail)
+ __navail = __n;
+
+ if (__navail) {
+
+ // find the delimiter in the sequence if it exists
+ const _CharT* const __pdel =
+ _Traits::find (__gptr, __navail, __delim);
+
+ if (__pdel) {
+ __navail = __pdel - __gptr + 1;
+ __n -= __navail - 1;
+ }
+ else if (__n == __navail)
+ __n -= --__navail;
+ else
+ __n -= __navail;
+
+ // store characters excluding the delimiter
+ __str.append (__gptr, __navail - !!__pdel);
+
+ __gcount += __navail;
+
+ // advance gptr() by the number of extracted
+ // characters, including the delimiter
+ __rdbuf->gbump (__navail);
+
+ if (__pdel) {
+ break;
+ }
+
+ if (2 > __n && _SizeT (__egptr - __gptr) != __navail) {
+ __err = ios_base::failbit;
+ break;
+ }
+ }
+ else {
+
+ // no data in buffer, trigger underflow()
+ // note that streambuf may be unbuffered
+ const int_type __c (__rdbuf->sgetc ());
+
+ if (_Traits::eq_int_type (__c, _Traits::eof ())) {
+ __err = ios_base::eofbit;
+ break;
+ }
+
+ const _CharT __ch = _Traits::to_char_type (__c);
+ if (_Traits::eq (__ch, __delim)) {
+ __rdbuf->sbumpc ();
+ __gcount++;
+ break;
+ }
+
+ if (2 > __n) {
+ __err = ios_base::failbit;
+ break;
+ }
+
+ __str += __ch;
+ --__n;
+
+ __rdbuf->sbumpc ();
+
+ // increment gcount only _after_ sbumpc() but _before_
+ // the subsequent call to sgetc() to correctly reflect
+ // the number of extracted characters in the presence
+ // of exceptions thrown from streambuf virtuals
+ ++__gcount;
+ }
+ }
+ }
+ _CATCH (...) {
+ __is.setstate (ios_base::badbit | _RW::__rw_rethrow);
+ }
+ }
+
+ if (!__gcount)
+ __err |= ios_base::failbit;
+
+#else // if defined (_RWSTD_NO_FRIEND_TEMPLATE)
+
+ ios_base::iostate __err = ios_base::failbit;
+
+ if (__ipfx) {
+
+ _TRY {
+
+ __str.clear ();
+
+ const _RWSTD_SIZE_T __max_size = __str.max_size ();
+
+ // FIXME: code commented out to work around an HP aCC 3.14.10
+ // bug #JAGac86264
+
+ // typedef _TYPENAME
+ // basic_string<_CharT, _Traits, _Allocator>::size_type
+
+ for ( ; ; ) {
+
+ const _TYPENAME _Traits::int_type
+ __c (__is.rdbuf ()->sgetc ());
+
+ if (_Traits::eq_int_type (__c, _Traits::eof ())) {
+ // 21.3.7.9, p7
+ if (__str.size ())
+ __err = ios_base::eofbit;
+ else
+ __err = ios_base::eofbit | ios_base::failbit;
+
+ break;
+ }
+
+ if (_Traits::eq (_Traits::to_char_type (__c), __delim)) {
+ __is.rdbuf ()->sbumpc ();
+ __err = ios_base::goodbit;
+ break;
+ }
+
+ if (__max_size <= __str.size ())
+ break;
+
+ __str.push_back (_Traits::to_char_type (__c));
+
+ __is.rdbuf ()->sbumpc ();
+ }
+ }
+ _CATCH (...) {
+ __is.setstate (ios_base::badbit | _RW::__rw_rethrow);
+ }
+ }
+
+#endif // _RWSTD_NO_FRIEND_TEMPLATE
+
+ if (__err)
+ __is.setstate (__err);
+
+ return __is;
+}
+
+
+} // namespace std
Propchange: stdcxx/trunk/include/rw/_stringio.cc
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: stdcxx/trunk/include/rw/_stringio.cc
------------------------------------------------------------------------------
svn:keywords = Id
Added: stdcxx/trunk/include/rw/_stringio.h
URL: http://svn.apache.org/viewvc/stdcxx/trunk/include/rw/_stringio.h?rev=630250&view=auto
==============================================================================
--- stdcxx/trunk/include/rw/_stringio.h (added)
+++ stdcxx/trunk/include/rw/_stringio.h Fri Feb 22 08:59:56 2008
@@ -0,0 +1,149 @@
+// -*- C++ -*-
+/***************************************************************************
+ *
+ * _stringio.h - declarations of the string extractors
+ *
+ * This is an internal header file used to implement the C++ Standard
+ * Library. It should never be #included directly by a program.
+ *
+ * $Id$
+ *
+ ***************************************************************************
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ * implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ *
+ * Copyright 2003-2006 Rogue Wave Software.
+ *
+ **************************************************************************/
+
+#if __GNUG__ >= 3
+# pragma GCC system_header
+#endif // gcc >= 3
+
+#ifndef _RWSTD_RW_STRINGIO_H_INCLUDED
+#define _RWSTD_RW_STRINGIO_H_INCLUDED
+
+
+_RWSTD_NAMESPACE (std) {
+
+
+_EXPORT
+template<class _CharT, class _Traits, class _Allocator>
+basic_istream<_CharT, _Traits>&
+operator>> (basic_istream<_CharT, _Traits>&,
+ basic_string<_CharT, _Traits, _Allocator>&);
+
+
+_EXPORT
+template<class _CharT, class _Traits, class _Allocator>
+basic_istream<_CharT, _Traits>&
+getline (basic_istream<_CharT, _Traits>&,
+ basic_string<_CharT, _Traits, _Allocator>&,
+ _CharT);
+
+
+template<class _CharT, class _Traits, class _Allocator>
+inline basic_istream<_CharT, _Traits>&
+getline (basic_istream<_CharT, _Traits>& __is,
+ basic_string<_CharT, _Traits, _Allocator>& __str);
+
+
+template<class _CharT, class _Traits, class _Allocator>
+inline basic_ostream<_CharT, _Traits>&
+operator<< (basic_ostream<_CharT, _Traits>&,
+ const basic_string<_CharT, _Traits, _Allocator>&);
+
+
+} // namespace std
+
+
+#endif // _RWSTD_RW_STRINGIO_H_INCLUDED
+
+
+#if !defined (_RWSTD_STRING_INSERTER_INCLUDED) \
+ && defined (_RWSTD_INCLUDE_STRING_INSERTER)
+# define _RWSTD_STRING_INSERTER_INCLUDED
+
+_RWSTD_NAMESPACE (std) {
+
+template<class _CharT, class _Traits, class _Allocator>
+inline basic_ostream<_CharT, _Traits>&
+operator<< (basic_ostream<_CharT, _Traits>& __os,
+ const basic_string<_CharT, _Traits, _Allocator>& __str)
+{
+ return _RW::__rw_insert (__os, __str.data (), __str.length (),
+ __os.width ());
+}
+
+} // namespace std
+
+#endif // !_RWSTD_STRING_INSERTER_INCLUDED
+
+
+#if !defined (_RWSTD_STRING_EXTRACTORS_INCLUDED) \
+ && defined (_RWSTD_INCLUDE_STRING_EXTRACTORS)
+# define _RWSTD_STRING_EXTRACTORS_INCLUDED
+
+
+_RWSTD_NAMESPACE (std) {
+
+template<class _CharT, class _Traits, class _Allocator>
+inline basic_istream<_CharT, _Traits>&
+getline (basic_istream<_CharT, _Traits>& __is,
+ basic_string<_CharT, _Traits, _Allocator>& __str)
+{
+ return getline (__is, __str, __is.widen ('\n'));
+}
+
+} // namespace std
+
+
+# if _RWSTD_DEFINE_TEMPLATE_FIRST (_BASIC_ISTREAM)
+# include <rw/_stringio.cc>
+# endif // _RWSTD_DEFINE_TEMPLATE_FIRST (_BASIC_ISTREAM)
+
+
+_RWSTD_NAMESPACE (std) {
+
+#if _RWSTD_INSTANTIATE (_BASIC_ISTREAM, _CHAR)
+
+_RWSTD_INSTANTIATE_FUN_1 (_RWSTD_TI_EXPORT istream&
+ operator>> (istream&, string&));
+
+_RWSTD_INSTANTIATE_FUN_1 (_RWSTD_TI_EXPORT istream&
+ getline (istream&, string&, char));
+
+#endif // _RWSTD_INSTANTIATE (_BASIC_ISTREAM, _CHAR)
+
+#if _RWSTD_INSTANTIATE (_BASIC_ISTREAM, _WCHAR_T)
+
+_RWSTD_INSTANTIATE_FUN_1 (_RWSTD_TI_EXPORT wistream&
+ operator>> (wistream&, wstring&));
+
+_RWSTD_INSTANTIATE_FUN_1 (_RWSTD_TI_EXPORT wistream&
+ getline (wistream&, wstring&, wchar_t));
+#endif // _RWSTD_INSTANTIATE (_BASIC_ISTREAM, _WCHAR_T)
+
+} // namespace std
+
+
+# if _RWSTD_DEFINE_TEMPLATE_LAST (_BASIC_ISTREAM)
+# include <rw/_stringio.cc>
+# endif // _RWSTD_DEFINE_TEMPLATE_LAST (_BASIC_ISTREAM)
+
+
+#endif // !_RWSTD_STRING_EXTRACTORS_INCLUDED
Propchange: stdcxx/trunk/include/rw/_stringio.h
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: stdcxx/trunk/include/rw/_stringio.h
------------------------------------------------------------------------------
svn:keywords = Id
Modified: stdcxx/trunk/include/string
URL: http://svn.apache.org/viewvc/stdcxx/trunk/include/string?rev=630250&r1=630249&r2=630250&view=diff
==============================================================================
--- stdcxx/trunk/include/string (original)
+++ stdcxx/trunk/include/string Fri Feb 22 08:59:56 2008
@@ -1509,38 +1509,12 @@
}
-// 21.3.7.9 - declared here, defined in <istream.cc>
-_EXPORT
-template<class _CharT, class _Traits, class _Allocator>
-basic_istream<_CharT, _Traits>&
-operator>> (basic_istream<_CharT, _Traits>&,
- basic_string<_CharT, _Traits, _Allocator>&);
-
-
-// 21.3.7.9 - declared here, defined in <istream.cc>
-_EXPORT
-template<class _CharT, class _Traits, class _Allocator>
-basic_istream<_CharT, _Traits>&
-getline (basic_istream<_CharT, _Traits>&,
- basic_string<_CharT, _Traits, _Allocator>&,
- _CharT);
-
-
-// 21.3.7.9 - declared here, defined inline in <istream>
-template<class _CharT, class _Traits, class _Allocator>
-inline basic_istream<_CharT, _Traits>&
-getline (basic_istream<_CharT, _Traits>&,
- basic_string<_CharT, _Traits, _Allocator>&);
-
-
-// 21.3.7.9, p3 - declared here, defined inline in <ostream>
-template<class _CharT, class _Traits, class _Allocator>
-inline basic_ostream<_CharT, _Traits>&
-operator<< (basic_ostream<_CharT, _Traits>&,
- const basic_string<_CharT, _Traits, _Allocator>&);
+} // namespace std
-} // namespace std
+#ifndef _RWSTD_RW_STRINGIO_H_INCLUDED
+# include <rw/_stringio.h>
+#endif // _RWSTD_RW_STRINGIO_H_INCLUDED
_RWSTD_NAMESPACE (__rw) {
Modified: stdcxx/trunk/src/export.cpp
URL: http://svn.apache.org/viewvc/stdcxx/trunk/src/export.cpp?rev=630250&r1=630249&r2=630250&view=diff
==============================================================================
--- stdcxx/trunk/src/export.cpp (original)
+++ stdcxx/trunk/src/export.cpp Fri Feb 22 08:59:56 2008
@@ -114,6 +114,9 @@
#include <rw/_basic_ios.h>
#include <rw/_basic_ios.cc>
+#include <rw/_stringio.h>
+#include <rw/_stringio.cc>
+
#include <rw/_heap.h>
#include <rw/_heap.cc>