After too much procrastination, I've decided to merge together all of the 
patches which have been sitting in my inbox for far too long and apply them 
upstream.   Since I've been out of the loop for a while, I thought I'd check 
in with everybody else first before applying (apparently my account still works 
- I'm not sure whether to be honored or frightened.  :-)  ).

-     Garrett

From 1f344144e399170cab43fb1e8f990a2330da5576 Mon Sep 17 00:00:00 2001
From: Garrett Kajmowicz <[email protected]>
Date: Wed, 26 Jan 2011 22:11:10 -0500
Subject: [PATCH] Import a bunch of patches which have been floating around the 'net for too long.
 Split float tests into separate files so they can be executed conditionally.
 Other misc cleanup.


Signed-off-by: Garrett Kajmowicz <[email protected]>
---
 ChangeLog                         |    2 +
 include/associative_base          |   10 +-
 include/cstring                   |   16 +-
 include/limits                    |  172 +++++++++-
 include/map                       |   10 +-
 include/unwind-cxx.h              |  628 ++++++++++++++++++++++++-------------
 src/eh_alloc.cpp                  |    8 +
 src/string.cpp                    |    2 +-
 tests/Makefile                    |    7 +-
 tests/chartraitstest.cpp          |    2 +-
 tests/excepttest.cpp              |    1 +
 tests/iotest.cpp                  |   25 +-
 tests/sstreamtest.cpp             |   10 +-
 tests/testoutput/iotest.good      |   13 +-
 tests/testoutput/iotest.input     |    2 +-
 tests/testoutput/sstreamtest.good |   17 +-
 16 files changed, 641 insertions(+), 284 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 23add41..af66dee 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -6,6 +6,8 @@
 -	Add support for bool limits support
 -	Misc fstream fixes
 -	Add support for comparison between deque iteractors and deque const_iterators
+-	Import a bunch of patches which have been floating around the 'net for too long.
+-	Split float tests into separate files so they can be executed conditionally.
 
 0.2.2
 -	Fixed default flags for ios
diff --git a/include/associative_base b/include/associative_base
index af1dd0c..be59a3e 100644
--- a/include/associative_base
+++ b/include/associative_base
@@ -317,7 +317,7 @@ protected:
 	typedef std::list<ValueType> listtype;
 
 	typename listtype::iterator base_iter;
-	typedef _associative_citer<ValueType, Compare, Allocator> __associative_citer;
+	typedef _associative_citer<ValueType, Compare, Allocator> _citer;
 
 public:
 	_associative_iter() { }
@@ -345,13 +345,13 @@ public:
 	bool operator==(const _associative_iter & m) const{
 		return m.base_iter == base_iter;
 	}
-	bool operator==(const __associative_citer & m) const{
+	bool operator==(const _citer & m) const{
 		return m.base_iter == base_iter;
 	}
 	bool operator!=(const _associative_iter & m) const{
 		return m.base_iter != base_iter;
 	}
-	bool operator!=(const __associative_citer & m) const{
+	bool operator!=(const _citer & m) const{
 		return m.base_iter != base_iter;
 	}
 	_associative_iter & operator++(){
@@ -376,8 +376,8 @@ public:
 		--base_iter;
 		return temp;
 	}
-	operator __associative_citer() const{
-		return __associative_citer(base_iter);
+	operator _citer() const{
+		return _citer(base_iter);
 	}
 	typename listtype::iterator base_iterator(){
 		return base_iter;
diff --git a/include/cstring b/include/cstring
index de8589b..c9536e1 100644
--- a/include/cstring
+++ b/include/cstring
@@ -49,11 +49,17 @@ namespace std{
 	using ::strxfrm;
 
 #ifndef __CORRECT_ISO_CPP_STRING_H_PROTO
-	//Extra definitions required in c++ spec
-
-	inline void* memchr(void* s, int c, size_t n){
-		return memchr(const_cast<const void *>(s), c, n);
-	}
+	// Well, the GNU folks have managed to screw up stuff again.
+	// They've decided to provide C++ definitions in the C std
+	// library.  However, in a feat of almost intelligence, they
+	// decided to wrap those definitions inside of ifdef calls
+	// to ensure that they wouldn't bother anything else.  However,
+	// they assumed that anybody using g++ 4.4 or higher would be
+	// using their libstdc++ as well.  Thus the ifdef is conditional
+	// on compiler version and not library capabilities.
+	// Brilliant.  They implement a non-standard library extension
+	// which depends on inaccurate non-standard compiler extention.
+	// *Sigh*  There are times when I hate working on this project.
 
 	inline char* strchr(char* s, int c){
 		return strchr(const_cast<const char *>(s), c);
diff --git a/include/limits b/include/limits
index e275eb5..19ea923 100644
--- a/include/limits
+++ b/include/limits
@@ -35,6 +35,16 @@ enum float_round_style{
 	round_toward_neg_infinity	= 3
 };
 
+enum float_denorm_style
+{
+	/// Indeterminate at compile time whether denormalized values are allowed.
+	denorm_indeterminate = -1,
+	/// The type does not allow denormalized values.
+	denorm_absent        = 0,
+	/// The type allows denormalized values.
+	denorm_present       = 1
+};
+
 template <int bitsize> struct __bits_to_base_10{
 	static const int size = -1;
 };
@@ -190,6 +200,7 @@ public:
 	static T signaling_NaN();
 };
 
+
 template <> class numeric_limits<unsigned char> {
 public:
 	typedef unsigned char T;
@@ -207,7 +218,7 @@ public:
 	static const bool is_signed = false;
 	static const bool is_integer = true;
 	static const bool is_exact = true;
-	static const bool traps = false;
+	static const bool traps = true;
 	static const bool is_modulo = true;
 	static const bool is_bounded = true;
 
@@ -254,7 +265,7 @@ public:
 	static const bool is_signed = true;
 	static const bool is_integer = true;
 	static const bool is_exact = true;
-	static const bool traps = false;
+	static const bool traps = true;
 	static const bool is_modulo = true;
 	static const bool is_bounded = true;
 
@@ -301,7 +312,7 @@ public:
 	static const bool is_signed = (CHAR_MIN != 0);
 	static const bool is_integer = true;
 	static const bool is_exact = true;
-	static const bool traps = false;
+	static const bool traps = true;
 	static const bool is_modulo = true;
 	static const bool is_bounded = true;
 
@@ -348,7 +359,7 @@ public:
 	static const bool is_signed = false;
 	static const bool is_integer = true;
 	static const bool is_exact = true;
-	static const bool traps = false;
+	static const bool traps = true;
 	static const bool is_modulo = true;
 	static const bool is_bounded = true;
 
@@ -390,12 +401,12 @@ public:
 		return SHRT_MAX;
 	}
 	static const int radix = 2;
-	static const int digits = CHAR_BIT * sizeof(T);
+	static const int digits = (CHAR_BIT * sizeof(T))-1;
 	static const int digits10 = __bits_to_base_10<digits>::size;
 	static const bool is_signed = true;
 	static const bool is_integer = true;
 	static const bool is_exact = true;
-	static const bool traps = false;
+	static const bool traps = true;
 	static const bool is_modulo = true;
 	static const bool is_bounded = true;
 
@@ -442,7 +453,7 @@ public:
 	static const bool is_signed = false;
 	static const bool is_integer = true;
 	static const bool is_exact = true;
-	static const bool traps = false;
+	static const bool traps = true;
 	static const bool is_modulo = true;
 	static const bool is_bounded = true;
 
@@ -484,12 +495,12 @@ public:
 		return INT_MAX;
 	}
 	static const int radix = 2;
-	static const int digits = CHAR_BIT * sizeof(T);
+	static const int digits = (CHAR_BIT * sizeof(T))-1;
 	static const int digits10 = __bits_to_base_10<digits>::size;
 	static const bool is_signed = true;
 	static const bool is_integer = true;
 	static const bool is_exact = true;
-	static const bool traps = false;
+	static const bool traps = true;
 	static const bool is_modulo = true;
 	static const bool is_bounded = true;
 
@@ -536,7 +547,7 @@ public:
 	static const bool is_signed = false;
 	static const bool is_integer = true;
 	static const bool is_exact = true;
-	static const bool traps = false;
+	static const bool traps = true;
 	static const bool is_modulo = true;
 	static const bool is_bounded = true;
 
@@ -578,12 +589,12 @@ public:
 		return LONG_MAX;
 	}
 	static const int radix = 2;
-	static const int digits = CHAR_BIT * sizeof(T);
+	static const int digits = (CHAR_BIT * sizeof(T))-1;
 	static const int digits10 = __bits_to_base_10<digits>::size;
 	static const bool is_signed = true;
 	static const bool is_integer = true;
 	static const bool is_exact = true;
-	static const bool traps = false;
+	static const bool traps = true;
 	static const bool is_modulo = true;
 	static const bool is_bounded = true;
 
@@ -597,7 +608,7 @@ public:
 	}
 	static const int min_exponent10 = 0;
 	static const int max_exponent10 = 0;
-	static const int min_exponent = 0;
+	static const int min_exponent = 0;	
 
 	static const int max_exponent = 0;
 	static const bool has_infinity = false;
@@ -613,6 +624,139 @@ public:
 	static T signaling_NaN();
 };
 
+#ifdef HAVE_LONG_LONG
+template <> class numeric_limits<unsigned long long> {
+	typedef unsigned long long T;
+	/// numeric_limits<unsigned long long> specialization.
+
+	static const bool is_specialized = true;
+ 
+	static T min() { return 0; }
+
+	static T max() { return __LONG_LONG_MAX__ * 2ULL + 1; }
+
+	static const int digits = CHAR_BIT * sizeof(T);
+	static const int digits10 = __bits_to_base_10<digits>::size;
+	static const bool is_signed = false;
+	static const bool is_integer = true;
+	static const bool is_exact = true;
+	static const int radix = 2;
+	static T epsilon() { return 0; }
+	static T round_error() { return 0; }
+
+	static const int min_exponent = 0;
+	static const int min_exponent10 = 0;
+	static const int max_exponent = 0;
+	static const int max_exponent10 = 0;
+ 
+	static const bool has_infinity = false;
+	static const bool has_quiet_NaN = false;
+	static const bool has_signaling_NaN = false;
+	static const float_denorm_style has_denorm = denorm_absent;
+	static const bool has_denorm_loss = false;
+ 
+	static T infinity() { return static_cast<unsigned long long>(0); }
+	static T quiet_NaN() { return static_cast<unsigned long long>(0); }
+	static T signaling_NaN() { return static_cast<unsigned long long>(0); }
+	static T denorm_min() { return static_cast<unsigned long long>(0); }
+
+	static const bool is_iec559 = false;
+	static const bool is_bounded = true;
+	static const bool is_modulo = true;
+
+	static const bool traps = true;
+	static const bool tinyness_before = false;
+	static const float_round_style round_style = round_toward_zero;
+};
+ 
+template <> class numeric_limits<long long> {
+	typedef long long T;
+	/// numeric_limits<long long> specialization.
+
+	static const bool is_specialized = true;
+
+	static T min() { return -__LONG_LONG_MAX__ - 1; }
+	static T max() { return __LONG_LONG_MAX__; }
+
+	static const int digits = (CHAR_BIT * sizeof(T))-1;
+	static const int digits10 = __bits_to_base_10<digits>::size;
+	static const bool is_signed = true;
+	static const bool is_integer = true;
+	static const bool is_exact = true;
+	static const int radix = 2;
+	static T epsilon() { return 0; }
+	static T round_error() { return 0; }
+
+	static const int min_exponent = 0;
+	static const int min_exponent10 = 0;
+	static const int max_exponent = 0;
+	static const int max_exponent10 = 0;
+
+	static const bool has_infinity = false;
+	static const bool has_quiet_NaN = false;
+	static const bool has_signaling_NaN = false;
+	static const float_denorm_style has_denorm = denorm_absent;
+	static const bool has_denorm_loss = false;
+
+	static T infinity() { return static_cast<long long>(0); }
+	static T quiet_NaN() { return static_cast<long long>(0); }
+	static T signaling_NaN() { return static_cast<long long>(0); }
+	static T denorm_min() { return static_cast<long long>(0); }
+
+	static const bool is_iec559 = false;
+	static const bool is_bounded = true;
+	static const bool is_modulo = true;
+
+	static const bool traps = true;
+	static const bool tinyness_before = false;
+	static const float_round_style round_style = round_toward_zero;
+};
+#endif //HAVE_LONG_LONG
+
+
+template <> class numeric_limits<float> {
+	typedef float T;
+
+	/// numeric_limits<float> specialization.
+	static const bool is_specialized = true;
+
+	static T min() { return __FLT_MIN__; }
+	static T max() { return __FLT_MAX__; }
+
+	static const int digits = __FLT_MANT_DIG__;
+	static const int digits10 = __FLT_DIG__;
+	static const bool is_signed = true;
+	static const bool is_integer = false;
+	static const bool is_exact = false;
+	static const int radix = __FLT_RADIX__;
+	static T epsilon() { return __FLT_EPSILON__; }
+	static float round_error() { return 0.5F; }
+
+	static const int min_exponent = __FLT_MIN_EXP__;
+	static const int min_exponent10 = __FLT_MIN_10_EXP__;
+	static const int max_exponent = __FLT_MAX_EXP__;
+	static const int max_exponent10 = __FLT_MAX_10_EXP__;
+
+	static const bool has_infinity = __FLT_HAS_INFINITY__;
+	static const bool has_quiet_NaN = __FLT_HAS_QUIET_NAN__;
+	static const bool has_signaling_NaN = has_quiet_NaN;
+	static const float_denorm_style has_denorm = denorm_absent; //Unknown. Until known, saying no
+	static const bool has_denorm_loss = false; //I don't know, so until I can find out, I'm saying no
+
+	static T infinity() { return __builtin_huge_valf (); }
+	static T quiet_NaN() { return __builtin_nanf (""); }
+	static T signaling_NaN() { return __builtin_nansf (""); }
+	static T denorm_min() throw() { return __FLT_DENORM_MIN__; }
+
+	static const bool is_iec559 = false; //Unknown. Until I can find out, I'm saying no
+	static const bool is_bounded = true;
+	static const bool is_modulo = false;
+
+	static const bool traps = false;
+	static const bool tinyness_before = false;
+	static const float_round_style round_style = round_to_nearest;
+};
+
 template <> class numeric_limits<double> {
 public:
 	typedef double numeric_type;
@@ -654,8 +798,6 @@ public:
 
 
 
-
-
 }
 
 #pragma GCC visibility pop
diff --git a/include/map b/include/map
index 8b7332b..e713afd 100644
--- a/include/map
+++ b/include/map
@@ -239,7 +239,10 @@ protected:
 	template <class Key, class T, class Compare, class Allocator> _UCXXEXPORT bool operator<=
 		(const map<Key,T,Compare,Allocator>& x, const map<Key,T,Compare,Allocator>& y);
 	template <class Key, class T, class Compare, class Allocator> _UCXXEXPORT void swap
-		(map<Key,T,Compare,Allocator>& x, map<Key,T,Compare,Allocator>& y);
+		(map<Key,T,Compare,Allocator>& x, map<Key,T,Compare,Allocator>& y)
+	{
+		x.swap(y);
+	}
 
 
 	template <class Key, class T, class Compare, class Allocator> _UCXXEXPORT bool operator==
@@ -255,7 +258,10 @@ protected:
 	template <class Key, class T, class Compare, class Allocator> _UCXXEXPORT bool operator<=
 		(const multimap<Key,T,Compare,Allocator>& x, const multimap<Key,T,Compare,Allocator>& y);
 	template <class Key, class T, class Compare, class Allocator> _UCXXEXPORT void swap
-		(multimap<Key,T,Compare,Allocator>& x, multimap<Key,T,Compare,Allocator>& y);
+		(multimap<Key,T,Compare,Allocator>& x, multimap<Key,T,Compare,Allocator>& y)
+	{
+		x.swap(y);
+	}
 
 }
 
diff --git a/include/unwind-cxx.h b/include/unwind-cxx.h
index 4a8961a..d7c348f 100644
--- a/include/unwind-cxx.h
+++ b/include/unwind-cxx.h
@@ -1,213 +1,415 @@
-// -*- C++ -*- Exception handling and frame unwind runtime interface routines.
-// Copyright (C) 2001 Free Software Foundation, Inc.
-//
-// This file is part of GCC.
-//
-// GCC is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2, or (at your option)
-// any later version.
-//
-// GCC is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with GCC; see the file COPYING.  If not, write to
-// the Free Software Foundation, 59 Temple Place - Suite 330,
-// Boston, MA 02111-1307, USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction.  Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file does not by itself cause the resulting executable to be covered by
-// the GNU General Public License.  This exception does not however
-// invalidate any other reasons why the executable file might be covered by
-// the GNU General Public License.
-
-// This is derived from the C++ ABI for IA-64.  Where we diverge
-// for cross-architecture compatibility are noted with "@@@".
-
-#ifndef _UNWIND_CXX_H
-#define _UNWIND_CXX_H 1
-
-// Level 2: C++ ABI
-
-#include <typeinfo>
-#include <exception>
-#include <cstddef>
-#include "unwind.h"
-
-#pragma GCC visibility push(default)
-
-namespace __cxxabiv1
-{
-
-// A primary C++ exception object consists of a header, which is a wrapper
-// around an unwind object header with additional C++ specific information,
-// followed by the exception object itself.
-
-struct __cxa_exception
-{ 
-  // Manage the exception object itself.
-  std::type_info *exceptionType;
-  void (*exceptionDestructor)(void *); 
-
-  // The C++ standard has entertaining rules wrt calling set_terminate
-  // and set_unexpected in the middle of the exception cleanup process.
-  std::unexpected_handler unexpectedHandler;
-  std::terminate_handler terminateHandler;
-
-  // The caught exception stack threads through here.
-  __cxa_exception *nextException;
-
-  // How many nested handlers have caught this exception.  A negated
-  // value is a signal that this object has been rethrown.
-  int handlerCount;
-
-  // Cache parsed handler data from the personality routine Phase 1
-  // for Phase 2 and __cxa_call_unexpected.
-  int handlerSwitchValue;
-  const unsigned char *actionRecord;
-  const unsigned char *languageSpecificData;
-  _Unwind_Ptr catchTemp;
-  void *adjustedPtr;
-
-  // The generic exception header.  Must be last.
-  _Unwind_Exception unwindHeader;
-};
-
-
-// A dependent C++ exception object consists of a header, which is a wrapper
-// around an unwind object header with additional C++ specific information,
-// followed by the exception object itself.
-struct __cxa_dependent_exception
-{
-  // The primary exception
-  void *primaryException;
-
-  // The C++ standard has entertaining rules wrt calling set_terminate
-  // and set_unexpected in the middle of the exception cleanup process.
-  std::unexpected_handler unexpectedHandler;
-  std::terminate_handler terminateHandler;
-
-  // The caught exception stack threads through here.
-  __cxa_exception *nextException;
-
-  // How many nested handlers have caught this exception.  A negated
-  // value is a signal that this object has been rethrown.
-  int handlerCount;
-
-  // Cache parsed handler data from the personality routine Phase 1
-  // for Phase 2 and __cxa_call_unexpected.
-  int handlerSwitchValue;
-  const unsigned char *actionRecord;
-  const unsigned char *languageSpecificData;
-  _Unwind_Ptr catchTemp;
-  void *adjustedPtr;
-
-  // The generic exception header.  Must be last.
-  _Unwind_Exception unwindHeader;
-};
-
-
-// Each thread in a C++ program has access to a __cxa_eh_globals object.
-struct __cxa_eh_globals
-{
-  __cxa_exception *caughtExceptions;
-  unsigned int uncaughtExceptions;
-};
-
-
-// The __cxa_eh_globals for the current thread can be obtained by using
-// either of the following functions.  The "fast" version assumes at least
-// one prior call of __cxa_get_globals has been made from the current
-// thread, so no initialization is necessary.
-extern "C" __cxa_eh_globals *__cxa_get_globals () throw();
-extern "C" __cxa_eh_globals *__cxa_get_globals_fast () throw();
-
-// Allocate memory for the primary exception plus the thrown object.
-extern "C" void *__cxa_allocate_exception(std::size_t thrown_size) throw();
-// Allocate memory for dependent exception.
-extern "C" __cxa_dependent_exception *__cxa_allocate_dependent_exception() throw();
-
-// Free the space allocated for the primary exception.
-extern "C" void __cxa_free_exception(void *thrown_exception) throw();
-// Free the space allocated for the dependent exception.
-extern "C" void __cxa_free_dependent_exception(__cxa_dependent_exception *dependent_exception) throw();
-
-// Throw the exception.
-extern "C" void __cxa_throw (void *thrown_exception,
-			     std::type_info *tinfo,
-			     void (*dest) (void *))
-     __attribute__((noreturn));
-
-// Used to implement exception handlers.
-extern "C" void *__cxa_begin_catch (void *) throw();
-extern "C" void __cxa_end_catch ();
-extern "C" void __cxa_rethrow () __attribute__((noreturn));
-
-// These facilitate code generation for recurring situations.
-extern "C" void __cxa_bad_cast ();
-extern "C" void __cxa_bad_typeid ();
-
-// @@@ These are not directly specified by the IA-64 C++ ABI.
-
-// Handles re-checking the exception specification if unexpectedHandler
-// throws, and if bad_exception needs to be thrown.  Called from the
-// compiler.
-extern "C" void __cxa_call_unexpected (void *) __attribute__((noreturn));
-
-// Invokes given handler, dying appropriately if the user handler was
-// so inconsiderate as to return.
-extern void __terminate(std::terminate_handler) __attribute__((noreturn));
-extern void __unexpected(std::unexpected_handler) __attribute__((noreturn));
-
-// The current installed user handlers.
-extern std::terminate_handler __terminate_handler;
-extern std::unexpected_handler __unexpected_handler;
-
-// These are explicitly GNU C++ specific.
-
-// This is the exception class we report -- "GNUCC++\0".
-const _Unwind_Exception_Class __gxx_exception_class
-= ((((((((_Unwind_Exception_Class) 'G' 
-	 << 8 | (_Unwind_Exception_Class) 'N')
-	<< 8 | (_Unwind_Exception_Class) 'U')
-       << 8 | (_Unwind_Exception_Class) 'C')
-      << 8 | (_Unwind_Exception_Class) 'C')
-     << 8 | (_Unwind_Exception_Class) '+')
-    << 8 | (_Unwind_Exception_Class) '+')
-   << 8 | (_Unwind_Exception_Class) '\0');
-
-// GNU C++ personality routine, Version 0.
-extern "C" _Unwind_Reason_Code __gxx_personality_v0
-     (int, _Unwind_Action, _Unwind_Exception_Class,
-      struct _Unwind_Exception *, struct _Unwind_Context *);
-
-// GNU C++ sjlj personality routine, Version 0.
-extern "C" _Unwind_Reason_Code __gxx_personality_sj0
-     (int, _Unwind_Action, _Unwind_Exception_Class,
-      struct _Unwind_Exception *, struct _Unwind_Context *);
-
-// Acquire the C++ exception header from the C++ object.
-static inline __cxa_exception *
-__get_exception_header_from_obj (void *ptr)
-{
-  return reinterpret_cast<__cxa_exception *>(ptr) - 1;
-}
-
-// Acquire the C++ exception header from the generic exception header.
-static inline __cxa_exception *
-__get_exception_header_from_ue (_Unwind_Exception *exc)
-{
-  return reinterpret_cast<__cxa_exception *>(exc + 1) - 1;
-}
-
-} /* namespace __cxxabiv1 */
-
-#pragma GCC visibility pop
-
-#endif // _UNWIND_CXX_H
+// -*- C++ -*- Exception handling and frame unwind runtime interface routines.
+// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
+// Free Software Foundation, Inc.
+//
+// This file is part of GCC.
+//
+// GCC is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 3, or (at your option)
+// any later version.
+//
+// GCC is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// Under Section 7 of GPL version 3, you are granted additional
+// permissions described in the GCC Runtime Library Exception, version
+// 3.1, as published by the Free Software Foundation.
+
+// You should have received a copy of the GNU General Public License and
+// a copy of the GCC Runtime Library Exception along with this program;
+// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+// <http://www.gnu.org/licenses/>.
+
+// This is derived from the C++ ABI for IA-64.  Where we diverge
+// for cross-architecture compatibility are noted with "@@@".
+
+#ifndef _UNWIND_CXX_H
+#define _UNWIND_CXX_H 1
+
+// Level 2: C++ ABI
+
+#include <typeinfo>
+#include <exception>
+#include <cstddef>
+#include "unwind.h"
+//#include <bits/atomic_word.h> Hikes! we don't have this one in uClibc++
+
+#pragma GCC visibility push(default)
+
+namespace __cxxabiv1
+{
+
+// A primary C++ exception object consists of a header, which is a wrapper
+// around an unwind object header with additional C++ specific information,
+// followed by the exception object itself.
+
+struct __cxa_exception
+{
+  // Manage the exception object itself.
+  std::type_info *exceptionType;
+  void (*exceptionDestructor)(void *); 
+
+  // The C++ standard has entertaining rules wrt calling set_terminate
+  // and set_unexpected in the middle of the exception cleanup process.
+  std::unexpected_handler unexpectedHandler;
+  std::terminate_handler terminateHandler;
+
+  // The caught exception stack threads through here.
+  __cxa_exception *nextException;
+
+  // How many nested handlers have caught this exception.  A negated
+  // value is a signal that this object has been rethrown.
+  int handlerCount;
+
+#ifdef __ARM_EABI_UNWINDER__
+  // Stack of exceptions in cleanups.
+  __cxa_exception* nextPropagatingException;
+
+  // The nuber of active cleanup handlers for this exception.
+  int propagationCount;
+#else
+  // Cache parsed handler data from the personality routine Phase 1
+  // for Phase 2 and __cxa_call_unexpected.
+  int handlerSwitchValue;
+  const unsigned char *actionRecord;
+  const unsigned char *languageSpecificData;
+  _Unwind_Ptr catchTemp;
+  void *adjustedPtr;
+#endif
+
+  // The generic exception header.  Must be last.
+  _Unwind_Exception unwindHeader;
+};
+
+/*This ha been commented out only ad a result of the lack of bits/atomic_word.h
+struct __cxa_refcounted_exception
+{
+  // Manage this header.
+  _Atomic_word referenceCount; 
+  // __cxa_exception must be last, and no padding can be after it.
+  __cxa_exception exc;
+};*/
+
+// A dependent C++ exception object consists of a wrapper around an unwind
+// object header with additional C++ specific information, containing a pointer
+// to a primary exception object.
+
+struct __cxa_dependent_exception
+{
+  // The primary exception this thing depends on.
+  void *primaryException;
+
+  // The C++ standard has entertaining rules wrt calling set_terminate
+  // and set_unexpected in the middle of the exception cleanup process.
+  std::unexpected_handler unexpectedHandler;
+  std::terminate_handler terminateHandler;
+
+  // The caught exception stack threads through here.
+  __cxa_exception *nextException;
+
+  // How many nested handlers have caught this exception.  A negated
+  // value is a signal that this object has been rethrown.
+  int handlerCount;
+
+#ifdef __ARM_EABI_UNWINDER__
+  // Stack of exceptions in cleanups.
+  __cxa_exception* nextPropagatingException;
+
+  // The nuber of active cleanup handlers for this exception.
+  int propagationCount;
+#else
+  // Cache parsed handler data from the personality routine Phase 1
+  // for Phase 2 and __cxa_call_unexpected.
+  int handlerSwitchValue;
+  const unsigned char *actionRecord;
+  const unsigned char *languageSpecificData;
+  _Unwind_Ptr catchTemp;
+  void *adjustedPtr;
+#endif
+
+  // The generic exception header.  Must be last.
+  _Unwind_Exception unwindHeader;
+};
+
+// Each thread in a C++ program has access to a __cxa_eh_globals object.
+struct __cxa_eh_globals
+{
+  __cxa_exception *caughtExceptions;
+  unsigned int uncaughtExceptions;
+#ifdef __ARM_EABI_UNWINDER__
+  __cxa_exception* propagatingExceptions;
+#endif
+};
+
+
+// The __cxa_eh_globals for the current thread can be obtained by using
+// either of the following functions.  The "fast" version assumes at least
+// one prior call of __cxa_get_globals has been made from the current
+// thread, so no initialization is necessary.
+extern "C" __cxa_eh_globals *__cxa_get_globals () throw();
+extern "C" __cxa_eh_globals *__cxa_get_globals_fast () throw();
+
+// Allocate memory for the primary exception plus the thrown object.
+extern "C" void *__cxa_allocate_exception(std::size_t thrown_size) throw();
+
+// Free the space allocated for the primary exception.
+extern "C" void __cxa_free_exception(void *thrown_exception) throw();
+
+// Allocate memory for a dependent exception.
+extern "C" __cxa_dependent_exception*
+__cxa_allocate_dependent_exception() throw();
+
+// Free the space allocated for the dependent exception.
+extern "C" void
+__cxa_free_dependent_exception(__cxa_dependent_exception *ex) throw();
+
+// Throw the exception.
+extern "C" void __cxa_throw (void *thrown_exception,
+			     std::type_info *tinfo,
+			     void (*dest) (void *))
+     __attribute__((noreturn));
+
+// Used to implement exception handlers.
+extern "C" void *__cxa_get_exception_ptr (void *) throw();
+extern "C" void *__cxa_begin_catch (void *) throw();
+extern "C" void __cxa_end_catch ();
+extern "C" void __cxa_rethrow () __attribute__((noreturn));
+
+// These facilitate code generation for recurring situations.
+extern "C" void __cxa_bad_cast ();
+extern "C" void __cxa_bad_typeid ();
+
+// @@@ These are not directly specified by the IA-64 C++ ABI.
+
+// Handles re-checking the exception specification if unexpectedHandler
+// throws, and if bad_exception needs to be thrown.  Called from the
+// compiler.
+extern "C" void __cxa_call_unexpected (void *) __attribute__((noreturn));
+extern "C" void __cxa_call_terminate (void*) __attribute__((noreturn));
+
+#ifdef __ARM_EABI_UNWINDER__
+// Arm EABI specified routines.
+typedef enum {
+  ctm_failed = 0,
+  ctm_succeeded = 1,
+  ctm_succeeded_with_ptr_to_base = 2
+} __cxa_type_match_result;
+extern "C" bool __cxa_type_match(_Unwind_Exception*, const std::type_info*,
+				 bool, void**);
+extern "C" void __cxa_begin_cleanup (_Unwind_Exception*);
+extern "C" void __cxa_end_cleanup (void);
+#endif
+
+// Invokes given handler, dying appropriately if the user handler was
+// so inconsiderate as to return.
+extern void __terminate(std::terminate_handler) __attribute__((noreturn));
+extern void __unexpected(std::unexpected_handler) __attribute__((noreturn));
+
+// The current installed user handlers.
+extern std::terminate_handler __terminate_handler;
+extern std::unexpected_handler __unexpected_handler;
+
+// These are explicitly GNU C++ specific.
+
+// Acquire the C++ exception header from the C++ object.
+static inline __cxa_exception *
+__get_exception_header_from_obj (void *ptr)
+{
+  return reinterpret_cast<__cxa_exception *>(ptr) - 1;
+}
+
+// Acquire the C++ exception header from the generic exception header.
+static inline __cxa_exception *
+__get_exception_header_from_ue (_Unwind_Exception *exc)
+{
+  return reinterpret_cast<__cxa_exception *>(exc + 1) - 1;
+}
+
+/*This ha been commented out only ad a result of the lack of bits/atomic_word.h
+// Acquire the C++ refcounted exception header from the C++ object.
+static inline __cxa_refcounted_exception *
+__get_refcounted_exception_header_from_obj (void *ptr)
+{
+  return reinterpret_cast<__cxa_refcounted_exception *>(ptr) - 1;
+}*/
+
+/*This ha been commented out only ad a result of the lack of bits/atomic_word.h
+// Acquire the C++ refcounted exception header from the generic exception
+// header.
+static inline __cxa_refcounted_exception *
+__get_refcounted_exception_header_from_ue (_Unwind_Exception *exc)
+{
+  return reinterpret_cast<__cxa_refcounted_exception *>(exc + 1) - 1;
+}*/
+
+static inline __cxa_dependent_exception *
+__get_dependent_exception_from_ue (_Unwind_Exception *exc)
+{
+  return reinterpret_cast<__cxa_dependent_exception *>(exc + 1) - 1;
+}
+
+#ifdef __ARM_EABI_UNWINDER__
+static inline bool
+__is_gxx_exception_class(_Unwind_Exception_Class c)
+{
+  // TODO: Take advantage of the fact that c will always be word aligned.
+  return c[0] == 'G'
+	 && c[1] == 'N'
+	 && c[2] == 'U'
+	 && c[3] == 'C'
+	 && c[4] == 'C'
+	 && c[5] == '+'
+	 && c[6] == '+'
+	 && (c[7] == '\0' || c[7] == '\x01');
+}
+
+// Only checks for primary or dependent, but not that it is a C++ exception at
+// all.
+static inline bool
+__is_dependent_exception(_Unwind_Exception_Class c)
+{
+  return c[7] == '\x01';
+}
+
+static inline void
+__GXX_INIT_PRIMARY_EXCEPTION_CLASS(_Unwind_Exception_Class c)
+{
+  c[0] = 'G';
+  c[1] = 'N';
+  c[2] = 'U';
+  c[3] = 'C';
+  c[4] = 'C';
+  c[5] = '+';
+  c[6] = '+';
+  c[7] = '\0';
+}
+
+static inline void
+__GXX_INIT_DEPENDENT_EXCEPTION_CLASS(_Unwind_Exception_Class c)
+{
+  c[0] = 'G';
+  c[1] = 'N';
+  c[2] = 'U';
+  c[3] = 'C';
+  c[4] = 'C';
+  c[5] = '+';
+  c[6] = '+';
+  c[7] = '\x01';
+}
+
+static inline bool
+__is_gxx_forced_unwind_class(_Unwind_Exception_Class c)
+{
+  return c[0] == 'G'
+	 && c[1] == 'N'
+	 && c[2] == 'U'
+	 && c[3] == 'C'
+	 && c[4] == 'F'
+	 && c[5] == 'O'
+	 && c[6] == 'R'
+	 && c[7] == '\0';
+}
+
+static inline void
+__GXX_INIT_FORCED_UNWIND_CLASS(_Unwind_Exception_Class c)
+{
+  c[0] = 'G';
+  c[1] = 'N';
+  c[2] = 'U';
+  c[3] = 'C';
+  c[4] = 'F';
+  c[5] = 'O';
+  c[6] = 'R';
+  c[7] = '\0';
+}
+
+static inline void*
+__gxx_caught_object(_Unwind_Exception* eo)
+{
+  return (void*)eo->barrier_cache.bitpattern[0];
+}
+#else // !__ARM_EABI_UNWINDER__
+// This is the primary exception class we report -- "GNUCC++\0".
+const _Unwind_Exception_Class __gxx_primary_exception_class
+= ((((((((_Unwind_Exception_Class) 'G' 
+	 << 8 | (_Unwind_Exception_Class) 'N')
+	<< 8 | (_Unwind_Exception_Class) 'U')
+       << 8 | (_Unwind_Exception_Class) 'C')
+      << 8 | (_Unwind_Exception_Class) 'C')
+     << 8 | (_Unwind_Exception_Class) '+')
+    << 8 | (_Unwind_Exception_Class) '+')
+   << 8 | (_Unwind_Exception_Class) '\0');
+
+// This is the dependent (from std::rethrow_exception) exception class we report
+// "GNUCC++\x01"
+const _Unwind_Exception_Class __gxx_dependent_exception_class
+= ((((((((_Unwind_Exception_Class) 'G' 
+	 << 8 | (_Unwind_Exception_Class) 'N')
+	<< 8 | (_Unwind_Exception_Class) 'U')
+       << 8 | (_Unwind_Exception_Class) 'C')
+      << 8 | (_Unwind_Exception_Class) 'C')
+     << 8 | (_Unwind_Exception_Class) '+')
+    << 8 | (_Unwind_Exception_Class) '+')
+   << 8 | (_Unwind_Exception_Class) '\x01');
+
+static inline bool
+__is_gxx_exception_class(_Unwind_Exception_Class c)
+{
+  return c == __gxx_primary_exception_class
+      || c == __gxx_dependent_exception_class;
+}
+
+// Only checks for primary or dependent, but not that it is a C++ exception at
+// all.
+static inline bool
+__is_dependent_exception(_Unwind_Exception_Class c)
+{
+  return (c & 1);
+}
+
+#define __GXX_INIT_PRIMARY_EXCEPTION_CLASS(c) c = __gxx_primary_exception_class
+#define __GXX_INIT_DEPENDENT_EXCEPTION_CLASS(c) \
+  c = __gxx_dependent_exception_class
+
+// GNU C++ personality routine, Version 0.
+extern "C" _Unwind_Reason_Code __gxx_personality_v0
+     (int, _Unwind_Action, _Unwind_Exception_Class,
+      struct _Unwind_Exception *, struct _Unwind_Context *);
+
+// GNU C++ sjlj personality routine, Version 0.
+extern "C" _Unwind_Reason_Code __gxx_personality_sj0
+     (int, _Unwind_Action, _Unwind_Exception_Class,
+      struct _Unwind_Exception *, struct _Unwind_Context *);
+
+static inline void*
+__gxx_caught_object(_Unwind_Exception* eo)
+{
+  // Bad as it looks, this actually works for dependent exceptions too.
+  __cxa_exception* header = __get_exception_header_from_ue (eo);
+  return header->adjustedPtr;
+}
+#endif // !__ARM_EABI_UNWINDER__
+
+static inline void*
+__get_object_from_ue(_Unwind_Exception* eo) throw()
+{
+  return __is_dependent_exception (eo->exception_class) ?
+    __get_dependent_exception_from_ue (eo)->primaryException :
+    eo + 1;
+}
+
+static inline void *
+__get_object_from_ambiguous_exception(__cxa_exception *p_or_d) throw()
+{
+	return __get_object_from_ue (&p_or_d->unwindHeader);
+}
+
+
+} /* namespace __cxxabiv1 */
+
+#pragma GCC visibility pop
+
+#endif // _UNWIND_CXX_H
diff --git a/src/eh_alloc.cpp b/src/eh_alloc.cpp
index 5098196..9dd733b 100644
--- a/src/eh_alloc.cpp
+++ b/src/eh_alloc.cpp
@@ -51,6 +51,13 @@ extern "C" __cxa_dependent_exception * __cxa_allocate_dependent_exception() thro
 	if (0 == retval){
 		std::terminate();
 	}
+
+	// We have an uncaught exception as soon as we allocate memory.  This
+	// yields uncaught_exception() true during the copy-constructor that
+	// initializes the exception object.  See Issue 475.
+	__cxa_eh_globals *globals = __cxa_get_globals ();
+	globals->uncaughtExceptions += 1;
+
 	memset (retval, 0, sizeof(__cxa_dependent_exception));
 	return retval;
 }
@@ -58,4 +65,5 @@ extern "C" __cxa_dependent_exception * __cxa_allocate_dependent_exception() thro
 extern "C" void __cxa_free_dependent_exception(__cxa_dependent_exception *vptr) throw(){
 	free( (char *)(vptr) );
 }
+
 }
diff --git a/src/string.cpp b/src/string.cpp
index 1edf69b..e735283 100644
--- a/src/string.cpp
+++ b/src/string.cpp
@@ -84,7 +84,7 @@ namespace std{
 
 	template _UCXXEXPORT string operator+(const string & lhs, const char* rhs);
 	template _UCXXEXPORT string operator+(const char* lhs, const string & rhs);
-	template _UCXXEXPORT string operator+(const string & lhs,	const string & rhs);
+	template _UCXXEXPORT string operator+(const string & lhs, const string & rhs);
 
 	template _UCXXEXPORT bool operator> (const string & lhs, const string & rhs);
 	template _UCXXEXPORT bool operator< (const string & lhs, const string & rhs);
diff --git a/tests/Makefile b/tests/Makefile
index 06f158e..e72ad5b 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -16,6 +16,11 @@ ifneq ($(UCLIBCXX_EXCEPTION_SUPPORT),y)
 TEST_SRCS	:= $(filter-out excepttest.cpp,$(TEST_SRCS))
 endif
 
+ifneq ($(UCLIBCXX_HAS_FLOATS),y)
+TEST_SRCS	:= $(filter-out iofloattest.cpp,$(TEST_SRCS))
+TEST_SRCS	:= $(filter-out sstreamfloattest.cpp,$(TEST_SRCS))
+endif
+
 UTILITY_OBJS	:= $(patsubst %.cpp,%.o, $(UTILITY_SRCS))
 OLDUTILITY_OBJS	:= $(patsubst %.cpp,%-old.o, $(UTILITY_SRCS))
 
@@ -41,7 +46,7 @@ test:	all
 	$(MAKE) -C testoutput test
 
 $(ALLBIN): $(EXOBJS) $(UTILITY_OBJS)
-	$(WR_CXX) $(LDFLAGS) $(UTILITY_OBJS) -o $@ [email protected]
+	$(WR_CXX) $(LDFLAGS) $(UTILITY_OBJS) -save-temps -o $@ [email protected]
 
 $(OLDBIN): $(OLDOBJS) $(OLDUTILITY_OBJS)
 	$(HOSTCXX) $(LDFLAGS) $(UTILITY_OBJS) -o $@ [email protected]
diff --git a/tests/chartraitstest.cpp b/tests/chartraitstest.cpp
index 155bb70..5b9417a 100644
--- a/tests/chartraitstest.cpp
+++ b/tests/chartraitstest.cpp
@@ -168,7 +168,7 @@ template <class T> void testClass(std::string tname){
 		std::cout << "eof() does not work properly for " << tname << std::endl;
 	}
 	
-	i1 == std::char_traits<T>::eof();
+	i1 = std::char_traits<T>::eof();
 	if(std::char_traits<T>::not_eof(i1) != i1){
 		std::cout << "not_eof() works properly for " << tname << std::endl;
 	}else{
diff --git a/tests/excepttest.cpp b/tests/excepttest.cpp
index 4b547c7..0e5c3de 100644
--- a/tests/excepttest.cpp
+++ b/tests/excepttest.cpp
@@ -1,6 +1,7 @@
 #include <exception>
 #include <stdexcept>
 #include <string>
+#include <cstring>
 #include <cstdio>
 
 int main(){
diff --git a/tests/iotest.cpp b/tests/iotest.cpp
index 34b9984..05c6b47 100644
--- a/tests/iotest.cpp
+++ b/tests/iotest.cpp
@@ -6,8 +6,6 @@
 
 #include "testframework.h"
 
-//using namespace std;
-
 std::basic_istream<char, std::char_traits<char> > &
 	myIstreamTestFunction(std::basic_istream<char,std::char_traits<char> >& stream)
 {
@@ -39,26 +37,22 @@ void testFieldWidth() {
 
 	std::cout.setf(std::ios_base::right);
 	std::cout << 5;
-	std::cout << 5.1;
-	std::cout << "5.2";
+	std::cout << "5.1";
 	std::cout << std::endl;
 
 	std::cout.setf(std::ios_base::left);
 	std::cout << 6;
-	std::cout << 6.1;
-	std::cout << "6.2";
+	std::cout << "6.1";
 	std::cout << std::endl;
 
 	std::cout.setf(std::ios_base::internal);
 	std::cout << 7;
-	std::cout << 7.1;
-	std::cout << "7.2";
+	std::cout << "7.1";
 	std::cout << std::endl;
 
 	std::cout.unsetf(std::ios_base::internal | std::ios_base::left | std::ios_base::right);
 	std::cout << 8;
-	std::cout << 8.1;
-	std::cout << "8.2";
+	std::cout << "8.1";
 	std::cout << std::endl;
 
 	// Restore flags from backup	
@@ -76,25 +70,22 @@ int main(){
 
 	std::cout << "Test string: " << temp << std::endl;
 	std::cout.setf(std::ios_base::boolalpha);
-	std::cout.setf(std::ios_base::fixed, std::ios_base::floatfield);
-	std::cout << "This is the number 200:" << 200.1 << std::endl;
 	std::cout << "This is the number 200:" << (short)200 << std::endl;
 	std::cout << "True: " << true << std::endl;
 	
-	float i = 0;
-	long double j = 0;
-
 	void * p = (void *)12345678;
 
+	int i, j;
+
 	std::cout << "Pointer: " << p << std::endl;
-	std::cout << "Please enter two floats:" << std::flush;
+	std::cout << "Please enter two integers:" << std::flush;
 	std::cin >> i >> j;
 
 	std::cout << "You entered: " << i << " " << j << std::endl;
 
 
 	std::cout << "Checking ostream_iterator\n";
-	std::ostream_iterator<double> a(std::cout, " ");
+	std::ostream_iterator<int> a(std::cout, " ");
 
 	std::cout << std::endl << "Checking length of remaining input" << std::flush << std::endl;
 	std::istream::pos_type cur;
diff --git a/tests/sstreamtest.cpp b/tests/sstreamtest.cpp
index 26c9532..e9cfd73 100644
--- a/tests/sstreamtest.cpp
+++ b/tests/sstreamtest.cpp
@@ -5,14 +5,12 @@ int main(){
 	std::cout << "Beginning sstream test\n";
 	
 	std::stringstream a;
-	float f;
 	int i;
 	std::string s;
 	char c;
 
 	a << "Starting testing ";
 	a << 2 ;
-	a << " " << 2.0;
 
 	std::cout << a.str() << std::endl;
 
@@ -28,11 +26,10 @@ int main(){
 
 
 
-	a.str("2.35 5 Test");
+	a.str("5 Test");
 
-	a >> f >> i >> s;
+	a >> i >> s;
 
-	std::cout << "f (should be 2.35): " << f << std::endl;
 	std::cout << "i (should be 5): " << i << std::endl;
 	std::cout << "s (should be Test): " << s << std::endl;
 
@@ -42,7 +39,7 @@ int main(){
 	std::cout <<"Combining read and write activities\n";
 	a.str("Testing data");
 	s = "";
-	a << 2.5 << " ";// << 't' << "T";
+	a << 7 << " ";// << 't' << "T";
 	a >> s;
 	std::cout << "Read out: " << "'" << s << "'" << std::endl;
 	a >> s;
@@ -66,7 +63,6 @@ int main(){
 	
 	o << "Test string ";
 	o << 5 << " ";
-	o << 3.5 << " ";
 	o << "Another test string";
 	o << " " << std::endl << "abcdefghiojklmnopqrstuvwxyz";
 	o << " " << std::endl << "abcdefghiojklmnopqrstuvwxyz";
diff --git a/tests/testoutput/iotest.good b/tests/testoutput/iotest.good
index cf7f5a1..608be62 100644
--- a/tests/testoutput/iotest.good
+++ b/tests/testoutput/iotest.good
@@ -1,23 +1,22 @@
 Hello, World!
 Test string: Test string
-This is the number 200:200.100000
 This is the number 200:200
 True: true
 Pointer: 0xbc614e
-Please enter two floats:You entered: 14564.264648 98347.000000
+Please enter two integers:You entered: 6234 4326
 Checking ostream_iterator
 
 Checking length of remaining input
-Current position in stream: 15
+Current position in stream: 9
 Remaining bytes: 45
 Test of reading istream into a function: 
 Number of characters most recently read in: 0
 Test of reading ios into a function: 
 Good status: true
-         55.1000005.2
-66.1000006.2
-77.1000007.2
-88.1000008.2
+         55.1
+66.1
+77.1
+88.1
 .
 ------------------------------
 Ran 1 tests
diff --git a/tests/testoutput/iotest.input b/tests/testoutput/iotest.input
index 9c759b3..3ac5359 100644
--- a/tests/testoutput/iotest.input
+++ b/tests/testoutput/iotest.input
@@ -1,2 +1,2 @@
-14564.265 98347
+6234 4326
 This is another string which can be read in
diff --git a/tests/testoutput/sstreamtest.good b/tests/testoutput/sstreamtest.good
index 6b35e8b..7a48a21 100644
--- a/tests/testoutput/sstreamtest.good
+++ b/tests/testoutput/sstreamtest.good
@@ -1,28 +1,27 @@
 Beginning sstream test
-Starting testing 2 2
+Starting testing 2
 Character getted: a
 Character getted: b
 input buffer: abcdefg
 Character 0: a, character 1: b
-f (should be 2.35): 2.35
 i (should be 5): 5
 s (should be Test): Test
-Buffer after flag clear: 2.35 5 Test
+Buffer after flag clear: 5 Test
 Combining read and write activities
-Read out: '2.5'
-Read out: 'ing'
-Current buffer value: 2.5 ing data
+Read out: '7'
+Read out: 'sting'
+Current buffer value: 7 sting data
 Appending more text by a number of methods
-String stream text:2.5 trd
+String stream text:7 trd
 
 
 4635
-String stream test:2.5 trd
+String stream test:7 trd
 
 
 4635
 Checking ostringstream
-Test string 5 3.5 Another test string 
+Test string 5 Another test string 
 abcdefghiojklmnopqrstuvwxyz 
 abcdefghiojklmnopqrstuvwxyz 
 abcdefghiojklmnopqrstuvwxyz 
-- 
1.6.3.3

_______________________________________________
uClibc mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/uclibc

Reply via email to