--- misc/STLport-4.5-0119/src/vc7.mak	Sun Jul 29 22:02:16 2001
+++ misc/build/STLport-4.5-0119/src/vc7.mak	Mon Jun  2 10:32:02 2008
@@ -1,5 +1,5 @@
 #
-# STLport makefile for VC++ 7 (.NET)
+# STLport makefile for VC++ 7/8/9 (.NET)
 #
 
 CXX=cl.exe
@@ -6,15 +6,16 @@
 CC=cl.exe
 RC=rc
 
-LIB_BASENAME=stlport_vc7
+LIB_BASENAME=stlport_vc71
+
 COMP=VC7
 
 # EXTRA_COMMON_FLAGS=/D "_MBCS"
-EXTRA_COMMON_FLAGS=/FI "vc_warning_disable.h" /D "_MBCS"
+EXTRA_COMMON_FLAGS=/TP /FI "vc_warning_disable.h" /D "_MBCS" /D "_CRT_SECURE_NO_DEPRECATE" /D "_CRT_NONSTDC_NO_DEPRECATE"
 EXTRA_DEBUG_FLAGS=
 EXTRA_NDEBUG_FLAGS=
 
-all: platform all_static all_dynamic 
+all: platform all_static all_dynamic
 
 !INCLUDE vc_common.mak
 
--- misc/STLport-4.5-0119/src/vc_common.mak	Wed Apr 10 05:55:31 2002
+++ misc/build/STLport-4.5-0119/src/vc_common.mak	Mon Jun  2 10:32:02 2008
@@ -27,7 +27,7 @@
 DYNEXT=dll
 STEXT=lib
 
-PATH_SEP=\\
+PATH_SEP=\ 
 
 MKDIR=-mkdir
 LINK_OUT=/out:
@@ -51,7 +51,7 @@
 #
 
 # FLAGS_COMMON =/nologo /c /W3 /GR /GX /D "WIN32" /D "_WINDOWS" /I "$(STLPORT_DIR)" $(EXTRA_COMMON_FLAGS)
-FLAGS_COMMON =/nologo /c /Zi /W3 /GR /GX /D "WIN32" /D "_WINDOWS" /I "$(STLPORT_DIR)" $(EXTRA_COMMON_FLAGS)
+FLAGS_COMMON =/nologo /c /Zi /W3 /GR $(EXFLAGS) /D "WIN32" /D "_WINDOWS" /I "$(STLPORT_DIR)" $(EXTRA_COMMON_FLAGS)
 FLAGS_COMMON_static = $(FLAGS_COMMON) /FD  /D "_STLP_NO_FORCE_INSTANTIATE"
 FLAGS_COMMON_dynamic = $(FLAGS_COMMON)
 
--- misc/STLport-4.5-0119/stlport/config/_epilog.h	Thu Sep  6 00:11:36 2001
+++ misc/build/STLport-4.5-0119/stlport/config/_epilog.h	Mon Jun  2 10:32:02 2008
@@ -4,6 +4,7 @@
 #  pragma option pop
 #  pragma option -w-8062
 # else
+#  pragma pack(push,8)
 #  if !(defined (_STLP_MSVC) && (_STLP_MSVC < 1200))
 #   pragma warning (pop)
 #  endif
--- misc/STLport-4.5-0119/stlport/config/_prolog.h	Sun Oct 28 21:26:44 2001
+++ misc/build/STLport-4.5-0119/stlport/config/_prolog.h	Mon Jun  2 10:32:02 2008
@@ -7,10 +7,17 @@
 #  endif
 # else
 # if !(defined (_STLP_MSVC) && (_STLP_MSVC < 1200))
-#  pragma warning(push)
+   // Disable "warning C4702: unreachable code" and "warning C4710: function not
+   // inlined" globally, as they are only issued at the end of the compilation
+   // unit.  Then locally disable as many warnings as possible, plus "warning
+   // C4555: expression has no effect; expected expression with side-effect":
+#  pragma warning(disable:4702 4710)
+#  pragma warning(push,1)
+#  pragma warning(disable:4555)
 # endif
 # pragma pack(push,8)
 # include <config/_msvc_warnings_off.h>
+# pragma pack(pop)
 # endif
 
 
--- misc/STLport-4.5-0119/stlport/config/stl_msvc.h	Sat Dec 28 07:12:58 2002
+++ misc/build/STLport-4.5-0119/stlport/config/stl_msvc.h	Mon Jun  2 10:34:54 2008
@@ -66,10 +66,15 @@
 #   define _STLP_DEFAULTCHAR __stl_char
 #  endif /* (_STLP_MSVC < 1100 ) */
 
-#  define _STLP_NO_TYPENAME_ON_RETURN_TYPE 1 
+# if (_STLP_MSVC <= 1300)
+#  define _STLP_NO_TYPENAME_ON_RETURN_TYPE 1
+# endif
+# if (_STLP_MSVC > 1300)
+#    define _STLP_NO_METHOD_SPECIALIZATION 1
+# endif
 //  using ::func_name results in ambiguity
 
-# if (_STLP_MSVC <= 1300) 
+# if (_STLP_MSVC <= 1310)
 
 // boris : not defining this macro for SP5 causes other problems
 // #  if !defined (_MSC_FULL_VER) || (_MSC_FULL_VER < 12008804 )
@@ -94,7 +99,7 @@
 # endif /* _STLP_MSVC */
 
 
-# if (_MSC_VER <= 1300) 
+# if (_MSC_VER <= 1500)
 
 #  define _STLP_VENDOR_GLOBAL_CSTD
 // They included the necessary coding,
@@ -129,7 +134,7 @@
 # if defined (_STLP_MSVC) && ( _STLP_MSVC < 1200 ) /* VC++ 6.0 */
 // #  define _STLP_NO_MEMBER_TEMPLATES 1
 // #  define _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS 1
-#  define _STLP_NON_TYPE_TMPL_PARAM_BUG 1 
+#  define _STLP_NON_TYPE_TMPL_PARAM_BUG 1
 #  define _STLP_THROW_RETURN_BUG 1
 # endif
 
@@ -178,8 +183,8 @@
 # ifdef __ICL
 #  define _STLP_LIB_BASENAME "stlport_icl"
 # else
-# if (_MSC_VER >= 1300) 
-#   define _STLP_LIB_BASENAME "stlport_vc7"
+# if (_MSC_VER > 1300)
+#   define _STLP_LIB_BASENAME "stlport_vc71"
 # elif (_MSC_VER >= 1200)
 //#   ifdef _UNICODE
 //#    define _STLP_LIB_BASENAME "stlport_vc6_unicode"
--- misc/STLport-4.5-0119/stlport/cstdio	Sun Dec  2 23:17:40 2001
+++ misc/build/STLport-4.5-0119/stlport/cstdio	Mon Jun  2 10:32:02 2008
@@ -42,7 +42,7 @@
 #  define stderr	(&_STLP_VENDOR_CSTD::__files[2])
 # endif
 
-#  if defined (_STLP_MSVC) || defined (__ICL)
+#  if defined (_STLP_MSVC) && (_MSC_VER <= 1310) || defined (__ICL)
 inline
 int vsnprintf(char *s1, size_t n, const char *s2, va_list v)
 {
@@ -110,7 +110,7 @@
 using _STLP_VENDOR_CSTD::vfprintf;
 using _STLP_VENDOR_CSTD::vprintf;
 using _STLP_VENDOR_CSTD::vsprintf;
-#   if (defined (__MWERKS__) || defined (_STLP_MSVC) || defined (__ICL) || \
+#   if (defined (__MWERKS__) || (defined (_STLP_MSVC) && (_MSC_VER <= 1310)) || defined (__ICL) || \
 ( defined (__BORLANDC__) && __BORLANDC__ > 0x530))
 using _STLP_VENDOR_CSTD::vsnprintf;
 #   endif
--- misc/STLport-4.5-0119/stlport/list	Wed Apr 10 05:55:34 2002
+++ misc/build/STLport-4.5-0119/stlport/list	Mon Jun  2 10:32:02 2008
@@ -37,7 +37,14 @@
 
 #ifndef _STLP_INTERNAL_LIST_H
 # include <stl/_list.h>
+#if ( _MSC_VER > 1200 )
+_STLP_BEGIN_NAMESPACE
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+_STLP_EXPORT_TEMPLATE_CLASS allocator<void*>;
+# endif
+_STLP_END_NAMESPACE
 #endif
+#endif
 
 #if defined (_STLP_WHOLE_VENDOR_STD)
 # include _STLP_NATIVE_HEADER(list)
--- misc/STLport-4.5-0119/stlport/stl/_cmath.h	Mon Oct 28 17:18:49 2002
+++ misc/build/STLport-4.5-0119/stlport/stl/_cmath.h	Mon Jun  2 10:32:02 2008
@@ -50,7 +50,7 @@
   static inline _Tp _do_tan(const _Tp& __x)     { return _STLP_VENDOR_CSTD::tan(__x); } 
   static inline _Tp _do_tanh(const _Tp& __x)    { return _STLP_VENDOR_CSTD::tanh(__x); } 
   static inline _Tp _do_exp(const _Tp& __x)     { return _STLP_VENDOR_CSTD::exp(__x); } 
-  static inline _Tp _do_hypot(const _Tp& __x, const _Tp& __y)   { return _STLP_VENDOR_CSTD::hypot(__x, __y); } 
+  static inline _Tp _do_hypot(const _Tp& __x, const _Tp& __y)   { return hypot(__x, __y); } 
 };
 
 #  define _STLP_DO_ABS(_Tp)   _STL_math_proxy<_Tp>::_do_abs
--- misc/STLport-4.5-0119/stlport/stl/_deque.c	Thu Sep 12 22:46:59 2002
+++ misc/build/STLport-4.5-0119/stlport/stl/_deque.c	Mon Jun  2 10:32:02 2008
@@ -26,6 +26,10 @@
 #ifndef _STLP_DEQUE_C
 # define _STLP_DEQUE_C
 
+#if defined(_MSC_VER) && (_MSC_VER > 1310)
+#pragma warning(disable:4701)
+#endif
+
 # ifndef _STLP_INTERNAL_DEQUE_H
 #  include <stl/_deque.h>
 # endif
--- misc/STLport-4.5-0119/stlport/stl/_hashtable.h	Thu Sep 12 22:46:59 2002
+++ misc/build/STLport-4.5-0119/stlport/stl/_hashtable.h	Mon Jun  2 10:32:02 2008
@@ -9,13 +9,13 @@
  * Copyright (c) 1997
  * Moscow Center for SPARC Technology
  *
- * Copyright (c) 1999 
+ * Copyright (c) 1999
  * Boris Fomitchev
  *
  * This material is provided "as is", with absolutely no warranty expressed
  * or implied. Any use is at your own risk.
  *
- * Permission to use or copy this software for any purpose is hereby granted 
+ * Permission to use or copy this software for any purpose is hereby granted
  * without fee, provided the above notices are retained on all copies.
  * Permission to modify the code and to distribute modified code is granted,
  * provided the above notices are retained, and a notice that the code was
@@ -66,7 +66,7 @@
   _Self* _M_next;
   _Val _M_val;
   __TRIVIAL_STUFF(_Hashtable_node)
-};  
+};
 
 // some compilers require the names of template parameters to be the same
 template <class _Val, class _Key, class _HF,
@@ -84,7 +84,7 @@
   _Node* _M_cur;
   _Hashtable* _M_ht;
 
-  _Hashtable_iterator(_Node* __n, _Hashtable* __tab) 
+  _Hashtable_iterator(_Node* __n, _Hashtable* __tab)
     : _M_cur(__n), _M_ht(__tab) {}
   _Hashtable_iterator() {}
 
@@ -96,7 +96,7 @@
           class _ExK, class _EqK, class _All>
 struct _Ht_iterator : public _Hashtable_iterator< _Val, _Key,_HF, _ExK,_EqK,_All>
 {
-  
+
   typedef _Hashtable_iterator<_Val,_Key,_HF,_ExK,_EqK,_All> _Base;
 
   //  typedef _Ht_iterator<_Val, _Nonconst_traits<_Val>,_Key,_HF,_ExK,_EqK,_All> iterator;
@@ -116,11 +116,11 @@
   _Ht_iterator(const _Node* __n, const _Hashtable* __tab) :
     _Hashtable_iterator<_Val,_Key,_HF,_ExK,_EqK,_All>((_Node*)__n, (_Hashtable*)__tab) {}
   _Ht_iterator() {}
-  _Ht_iterator(const _Ht_iterator<_Val, _Nonconst_traits<_Val>,_Key,_HF,_ExK,_EqK,_All>& __it) : 
+  _Ht_iterator(const _Ht_iterator<_Val, _Nonconst_traits<_Val>,_Key,_HF,_ExK,_EqK,_All>& __it) :
     _Hashtable_iterator<_Val,_Key,_HF,_ExK,_EqK,_All>(__it) {}
 
-  reference operator*() const { 
-      return this->_M_cur->_M_val; 
+  reference operator*() const {
+      return this->_M_cur->_M_val;
   }
   _STLP_DEFINE_ARROW_OPERATOR
 
@@ -138,19 +138,19 @@
 
 template <class _Val, class _Traits, class _Traits1, class _Key, class _HF,
           class _ExK, class _EqK, class _All>
-inline bool 
-operator==(const _Ht_iterator<_Val, _Traits,_Key,_HF,_ExK,_EqK,_All>& __x, 
-	   const _Ht_iterator<_Val, _Traits1,_Key,_HF,_ExK,_EqK,_All>& __y) { 
-  return __x._M_cur == __y._M_cur; 
+inline bool
+operator==(const _Ht_iterator<_Val, _Traits,_Key,_HF,_ExK,_EqK,_All>& __x,
+	   const _Ht_iterator<_Val, _Traits1,_Key,_HF,_ExK,_EqK,_All>& __y) {
+  return __x._M_cur == __y._M_cur;
 }
 
 #ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE
 template <class _Val, class _Key, class _HF,
           class _ExK, class _EqK, class _All>
-inline bool 
-operator!=(const _Hashtable_iterator<_Val,_Key,_HF,_ExK,_EqK,_All>& __x, 
-	   const _Hashtable_iterator<_Val,_Key,_HF,_ExK,_EqK,_All>& __y) { 
-  return __x._M_cur != __y._M_cur; 
+inline bool
+operator!=(const _Hashtable_iterator<_Val,_Key,_HF,_ExK,_EqK,_All>& __x,
+	   const _Hashtable_iterator<_Val,_Key,_HF,_ExK,_EqK,_All>& __y) {
+  return __x._M_cur != __y._M_cur;
 }
 #else
 
@@ -166,10 +166,10 @@
 
 template <class _Val, class _Key, class _HF,
           class _ExK, class _EqK, class _All>
-inline bool 
-operator!=(const _Ht_iterator<_Val, _Nonconst_traits<_Val>,_Key,_HF,_ExK,_EqK,_All>& __x, 
-	   const _Ht_iterator<_Val, _Const_traits<_Val>,_Key,_HF,_ExK,_EqK,_All>& __y) { 
-  return __x._M_cur != __y._M_cur; 
+inline bool
+operator!=(const _Ht_iterator<_Val, _Nonconst_traits<_Val>,_Key,_HF,_ExK,_EqK,_All>& __x,
+	   const _Ht_iterator<_Val, _Const_traits<_Val>,_Key,_HF,_ExK,_EqK,_All>& __y) {
+  return __x._M_cur != __y._M_cur;
 }
 #endif
 
@@ -189,8 +189,10 @@
   static const size_t _M_list[__stl_num_primes];
 };
 
-# if defined (_STLP_USE_TEMPLATE_EXPORT) 
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+#if ( _MSC_VER < 1300 )
 _STLP_EXPORT_TEMPLATE_CLASS _Stl_prime<bool>;
+#endif
 # endif
 
 typedef _Stl_prime<bool> _Stl_prime_type;
@@ -200,8 +202,8 @@
 //  do.  If we're using standard-conforming allocators, then a hashtable
 //  unconditionally has a member variable to hold its allocator, even if
 //  it so happens that all instances of the allocator type are identical.
-// This is because, for hashtables, this extra storage is negligible.  
-//  Additionally, a base class wouldn't serve any other purposes; it 
+// This is because, for hashtables, this extra storage is negligible.
+//  Additionally, a base class wouldn't serve any other purposes; it
 //  wouldn't, for example, simplify the exception-handling code.
 template <class _Val, class _Key, class _HF,
           class _ExK, class _EqK, class _All>
--- misc/STLport-4.5-0119/stlport/stl/_istream.h	Sun Apr  7 04:35:42 2002
+++ misc/build/STLport-4.5-0119/stlport/stl/_istream.h	Mon Jun  2 10:32:02 2008
@@ -257,44 +257,44 @@
 
 template <class _CharT, class _Traits>
 inline basic_istream<_CharT, _Traits>& _STLP_CALL  
-operator>>(basic_istream<_CharT, _Traits>& __in, _CharT& __c) {
-  __in._M_formatted_get(__c);
-  return __in;
+operator>>(basic_istream<_CharT, _Traits>& ___in, _CharT& __c) {
+  ___in._M_formatted_get(__c);
+  return ___in;
 }
 
 template <class _Traits>
 inline basic_istream<char, _Traits>& _STLP_CALL  
-operator>>(basic_istream<char, _Traits>& __in, unsigned char& __c) {
-  __in._M_formatted_get(__REINTERPRET_CAST(char&,__c));
-  return __in;
+operator>>(basic_istream<char, _Traits>& ___in, unsigned char& __c) {
+  ___in._M_formatted_get(__REINTERPRET_CAST(char&,__c));
+  return ___in;
 }
 
 template <class _Traits>
 inline basic_istream<char, _Traits>& _STLP_CALL 
-operator>>(basic_istream<char, _Traits>& __in, signed char& __c) {
-  __in._M_formatted_get(__REINTERPRET_CAST(char&,__c));
-  return __in;
+operator>>(basic_istream<char, _Traits>& ___in, signed char& __c) {
+  ___in._M_formatted_get(__REINTERPRET_CAST(char&,__c));
+  return ___in;
 }
 
 template <class _CharT, class _Traits>
 inline basic_istream<_CharT, _Traits>& _STLP_CALL 
-operator>>(basic_istream<_CharT, _Traits>& __in, _CharT* __s) {
-  __in._M_formatted_get(__s);
-  return __in;
+operator>>(basic_istream<_CharT, _Traits>& ___in, _CharT* __s) {
+  ___in._M_formatted_get(__s);
+  return ___in;
 }
 
 template <class _Traits>
 inline basic_istream<char, _Traits>& _STLP_CALL 
-operator>>(basic_istream<char, _Traits>& __in, unsigned char* __s) {
-  __in._M_formatted_get(__REINTERPRET_CAST(char*,__s));
-  return __in;
+operator>>(basic_istream<char, _Traits>& ___in, unsigned char* __s) {
+  ___in._M_formatted_get(__REINTERPRET_CAST(char*,__s));
+  return ___in;
 }
 
 template <class _Traits>
 inline basic_istream<char, _Traits>& _STLP_CALL 
-operator>>(basic_istream<char, _Traits>& __in, signed char* __s) {
-  __in._M_formatted_get(__REINTERPRET_CAST(char*,__s));
-  return __in;
+operator>>(basic_istream<char, _Traits>& ___in, signed char* __s) {
+  ___in._M_formatted_get(__REINTERPRET_CAST(char*,__s));
+  return ___in;
 }
 
 //----------------------------------------------------------------------
--- misc/STLport-4.5-0119/stlport/stl/_monetary.c	Thu Sep 12 22:47:00 2002
+++ misc/build/STLport-4.5-0119/stlport/stl/_monetary.c	Mon Jun  2 10:32:02 2008
@@ -86,7 +86,7 @@
 
 template <class _InIt, class _OuIt, class _CharT>
 bool
-__get_monetary_value(_InIt& __first, _InIt __last, _OuIt __out,
+__get_monetary_value(_InIt& __first, _InIt __last, _OuIt ___out,
                      const ctype<_CharT>& _c_type,
                      _CharT   __point,
                      int      __frac_digits,
@@ -104,7 +104,7 @@
   while (__first != __last) {
     if (_c_type.is(ctype_base::digit, *__first)) {
       ++__current_group_size;
-      *__out++ = *__first++;
+      *___out++ = *__first++;
     }
     else if (__group_sizes_end) {
       if (*__first == __sep) {
@@ -129,7 +129,7 @@
     
     if (__first == __last || *__first != __point) {
       for (int __digits = 0; __digits != __frac_digits; ++__digits)
-        *__out++ = _CharT('0');
+        *___out++ = _CharT('0');
       return true; // OK not to have decimal point
     }
   }
@@ -139,7 +139,7 @@
   size_t __digits = 0;
 
   while (__first != __last && _c_type.is(ctype_base::digit, *__first)) {
-      *__out++ = *__first++;
+      *___out++ = *__first++;
      ++__digits;
   }
 
@@ -202,7 +202,7 @@
   bool __is_positive = true;
   bool __symbol_required = (__str.flags() & ios_base::showbase) !=0;
   string_type __buf;
-  back_insert_iterator<string_type> __out(__buf);
+  back_insert_iterator<string_type> ___out(__buf);
 //  pair<iter_type, bool> __result;
 
   for (__i = 0; __i < 4; ++__i) {
@@ -293,7 +293,7 @@
       _CharT __sep = __grouping.size() == 0 ? _CharT() : 
 	__intl ? __punct_intl.thousands_sep() : __punct.thousands_sep();
 
-      __result = __get_monetary_value(__s, __end, __out, __c_type,
+      __result = __get_monetary_value(__s, __end, ___out, __c_type,
                                       __point, __frac_digits,
                                       __sep,
                                       __grouping, __syntax_ok);      
--- misc/STLport-4.5-0119/stlport/stl/_num_get.c	Thu Sep 12 22:47:00 2002
+++ misc/build/STLport-4.5-0119/stlport/stl/_num_get.c	Mon Jun  2 10:32:02 2008
@@ -60,7 +60,7 @@
 
 template <class _InputIter, class _CharT>
 int 
-_M_get_base_or_zero(_InputIter& __in, _InputIter& __end, ios_base& __str, _CharT*)
+_M_get_base_or_zero(_InputIter& ___in, _InputIter& __end, ios_base& __str, _CharT*)
 {
   _CharT __atoms[5];
   const ctype<_CharT>& __c_type = *(const ctype<_CharT>*)__str._M_ctype_facet();
@@ -68,14 +68,14 @@
   __c_type.widen(__narrow_atoms, __narrow_atoms + 5, __atoms);
 
   bool __negative = false;
-  _CharT __c = *__in;
+  _CharT __c = *___in;
 
   if (__c == __atoms[1] /* __xminus_char */ ) {
     __negative = true;
-    ++__in;
+    ++___in;
   }
   else if (__c == __atoms[0] /* __xplus_char */ ) 
-    ++__in;
+    ++___in;
 
 
   int __base;
@@ -92,21 +92,21 @@
     break;
   case ios_base::hex:
     __base = 16;
-    if (__in != __end && *__in == __atoms[2] /* __zero_char */ ) {
-      ++__in;
-      if (__in != __end &&
-          (*__in == __atoms[3] /* __x_char */ || *__in == __atoms[4] /* __X_char */ ))
-        ++__in;
+    if (___in != __end && *___in == __atoms[2] /* __zero_char */ ) {
+      ++___in;
+      if (___in != __end &&
+          (*___in == __atoms[3] /* __x_char */ || *___in == __atoms[4] /* __X_char */ ))
+        ++___in;
       else
         __valid_zero = 1; // That zero is valid by itself.
     }
     break;
   default:
-    if (__in != __end && *__in == __atoms[2] /* __zero_char */ ) {
-      ++__in;
-      if (__in != __end &&
-          (*__in == __atoms[3] /* __x_char */ || *__in == __atoms[4] /* __X_char */ )) {
-        ++__in;
+    if (___in != __end && *___in == __atoms[2] /* __zero_char */ ) {
+      ++___in;
+      if (___in != __end &&
+          (*___in == __atoms[3] /* __x_char */ || *___in == __atoms[4] /* __X_char */ )) {
+        ++___in;
         __base = 16;
       }
       else
@@ -252,7 +252,7 @@
 
 template <class _InputIter, class _Integer, class _CharT>
 _InputIter _STLP_CALL
-_M_do_get_integer(_InputIter& __in, _InputIter& __end, ios_base& __str,
+_M_do_get_integer(_InputIter& ___in, _InputIter& __end, ios_base& __str,
                   ios_base::iostate& __err, _Integer& __val, _CharT* __pc) 
 {
 
@@ -265,12 +265,12 @@
   const numpunct<_CharT>& __numpunct = *(const numpunct<_CharT>*)__str._M_numpunct_facet();
   const string& __grouping = __str._M_grouping(); // cached copy
 
-  const int __base_or_zero = _M_get_base_or_zero(__in, __end, __str, __pc);
+  const int __base_or_zero = _M_get_base_or_zero(___in, __end, __str, __pc);
   int  __got = __base_or_zero & 1;
 
   bool __result;
 
-  if (__in == __end) {      // We may have already read a 0.  If so,
+  if (___in == __end) {      // We may have already read a 0.  If so,
 
     if (__got > 0) {       // the result is 0 even if we're at eof.
       __val = 0;
@@ -285,19 +285,19 @@
 
 #if defined(__HP_aCC) && (__HP_aCC == 1)
      if (_IsSigned)
-       __result = __get_integer(__in, __end, __base,  __val, __got, __negative, __numpunct.thousands_sep(), __grouping, __true_type() );
+       __result = __get_integer(___in, __end, __base,  __val, __got, __negative, __numpunct.thousands_sep(), __grouping, __true_type() );
      else
-      __result = __get_integer(__in, __end, __base,  __val, __got, __negative, __numpunct.thousands_sep(), __grouping, __false_type() );
+      __result = __get_integer(___in, __end, __base,  __val, __got, __negative, __numpunct.thousands_sep(), __grouping, __false_type() );
 #else
-    __result = __get_integer(__in, __end, __base,  __val, __got, __negative, __numpunct.thousands_sep(), __grouping, _IsSigned());
+    __result = __get_integer(___in, __end, __base,  __val, __got, __negative, __numpunct.thousands_sep(), __grouping, _IsSigned());
 # endif
   }
 
   __err = __STATIC_CAST(ios_base::iostate, __result ? ios_base::goodbit : ios_base::failbit);
 
-  if (__in == __end)
+  if (___in == __end)
     __err |= ios_base::eofbit;
-  return __in;
+  return ___in;
 }
 
 // _M_read_float and its helper functions.
@@ -376,7 +376,7 @@
 
 template <class _InputIter, class _CharT>
 bool _STLP_CALL
-_M_read_float(string& __buf, _InputIter& __in, _InputIter& __end, ios_base& __s, _CharT*)
+_M_read_float(string& __buf, _InputIter& ___in, _InputIter& __end, ios_base& __s, _CharT*)
 {
   // Create a string, copying characters of the form 
   // [+-]? [0-9]* .? [0-9]* ([eE] [+-]? [0-9]+)?
@@ -404,20 +404,20 @@
   _Initialize_get_float(__ct, __xplus, __xminus, __pow_e, __pow_E, __digits);
 
   // Get an optional sign
-  __in = __copy_sign(__in, __end, __buf, __xplus, __xminus);
+  ___in = __copy_sign(___in, __end, __buf, __xplus, __xminus);
 
   // Get an optional string of digits.
   if (__grouping.size() != 0)
-    __digits_before_dot = __copy_grouped_digits(__in, __end, __buf, __digits,
+    __digits_before_dot = __copy_grouped_digits(___in, __end, __buf, __digits,
 						__sep, __grouping, __grouping_ok);
   else
-    __digits_before_dot = __copy_digits(__in, __end, __buf, __digits);
+    __digits_before_dot = __copy_digits(___in, __end, __buf, __digits);
 
   // Get an optional decimal point, and an optional string of digits.
-  if (__in != __end && *__in == __dot) {
+  if (___in != __end && *___in == __dot) {
     __buf.push_back('.');
-    ++__in;
-    __digits_after_dot = __copy_digits(__in, __end, __buf, __digits);
+    ++___in;
+    __digits_after_dot = __copy_digits(___in, __end, __buf, __digits);
   }
 
   // There have to be some digits, somewhere.
@@ -424,11 +424,11 @@
   __ok = __digits_before_dot || __digits_after_dot;
   
   // Get an optional exponent.
-  if (__ok && __in != __end && (*__in == __pow_e || *__in == __pow_E)) {
+  if (__ok && ___in != __end && (*___in == __pow_e || *___in == __pow_E)) {
     __buf.push_back('e');
-    ++__in;
-    __in = __copy_sign(__in, __end, __buf, __xplus, __xminus);
-    __ok = __copy_digits(__in, __end, __buf, __digits);
+    ++___in;
+    ___in = __copy_sign(___in, __end, __buf, __xplus, __xminus);
+    __ok = __copy_digits(___in, __end, __buf, __digits);
     // If we have an exponent then the sign 
     // is optional but the digits aren't.
   }
@@ -466,7 +466,7 @@
 # ifndef _STLP_NO_BOOL
 template <class _CharT, class _InputIter>
 _InputIter
-num_get<_CharT, _InputIter>::do_get(_InputIter __in, _InputIter __end,
+num_get<_CharT, _InputIter>::do_get(_InputIter ___in, _InputIter __end,
                                     ios_base& __s,
                                     ios_base::iostate& __err, bool& __x) const
 {
@@ -482,8 +482,8 @@
     bool __false_ok = true;
 
     size_t __n = 0;
-    for ( ; __in != __end; ++__in) {
-      _CharT __c = *__in;
+    for ( ; ___in != __end; ++___in) {
+      _CharT __c = *___in;
       __true_ok  = __true_ok  && (__c == __truename[__n]);
       __false_ok = __false_ok && (__c == __falsename[__n]);
       ++__n;
@@ -491,7 +491,7 @@
       if ((!__true_ok && !__false_ok) ||
           (__true_ok  && __n >= __truename.size()) ||
           (__false_ok && __n >= __falsename.size())) {
-	++__in;
+	++___in;
         break;
       }
     }
@@ -505,15 +505,15 @@
     else
       __err = ios_base::failbit;
 
-    if (__in == __end)
+    if (___in == __end)
       __err |= ios_base::eofbit;
 
-    return __in;
+    return ___in;
   }
 
   else {
     long __lx;
-    _InputIter __tmp = this->do_get(__in, __end, __s, __err, __lx);
+    _InputIter __tmp = this->do_get(___in, __end, __s, __err, __lx);
     if (!(__err & ios_base::failbit)) {
       if (__lx == 0)
         __x = false;
@@ -531,16 +531,16 @@
 # ifdef _STLP_FIX_LIBRARY_ISSUES
 template <class _CharT, class _InputIter>  
 _InputIter 
-num_get<_CharT, _InputIter>::do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+num_get<_CharT, _InputIter>::do_get(_InputIter ___in, _InputIter __end, ios_base& __str,
                                     ios_base::iostate& __err, short& __val) const {
-  return _M_do_get_integer(__in, __end, __str, __err, __val, (_CharT*)0 );
+  return _M_do_get_integer(___in, __end, __str, __err, __val, (_CharT*)0 );
 }
 
 template <class _CharT, class _InputIter>  
 _InputIter 
-num_get<_CharT, _InputIter>::do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+num_get<_CharT, _InputIter>::do_get(_InputIter ___in, _InputIter __end, ios_base& __str,
                                     ios_base::iostate& __err, int& __val) const {
-  return _M_do_get_integer(__in, __end, __str, __err, __val, (_CharT*)0 );
+  return _M_do_get_integer(___in, __end, __str, __err, __val, (_CharT*)0 );
 }
 
 # endif
@@ -547,83 +547,83 @@
 
 template <class _CharT, class _InputIter>  
 _InputIter 
-num_get<_CharT, _InputIter>::do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+num_get<_CharT, _InputIter>::do_get(_InputIter ___in, _InputIter __end, ios_base& __str,
                                     ios_base::iostate& __err, long& __val) const {
-  return _M_do_get_integer(__in, __end, __str, __err, __val, (_CharT*)0 );
+  return _M_do_get_integer(___in, __end, __str, __err, __val, (_CharT*)0 );
 }
 
 template <class _CharT, class _InputIter>  
 _InputIter 
-num_get<_CharT, _InputIter>::do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+num_get<_CharT, _InputIter>::do_get(_InputIter ___in, _InputIter __end, ios_base& __str,
                                     ios_base::iostate& __err,
                                     unsigned short& __val) const {
-  return _M_do_get_integer(__in, __end, __str, __err, __val, (_CharT*)0 );
+  return _M_do_get_integer(___in, __end, __str, __err, __val, (_CharT*)0 );
 }
 
 template <class _CharT, class _InputIter>  
 _InputIter 
-num_get<_CharT, _InputIter>::do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+num_get<_CharT, _InputIter>::do_get(_InputIter ___in, _InputIter __end, ios_base& __str,
                                     ios_base::iostate& __err, 
                                     unsigned int& __val) const {
-  return _M_do_get_integer(__in, __end, __str, __err, __val, (_CharT*)0 );
+  return _M_do_get_integer(___in, __end, __str, __err, __val, (_CharT*)0 );
 }
 
 template <class _CharT, class _InputIter>  
 _InputIter 
-num_get<_CharT, _InputIter>::do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+num_get<_CharT, _InputIter>::do_get(_InputIter ___in, _InputIter __end, ios_base& __str,
                                     ios_base::iostate& __err,
                                     unsigned long& __val) const {
-  return _M_do_get_integer(__in, __end, __str, __err, __val, (_CharT*)0 );
+  return _M_do_get_integer(___in, __end, __str, __err, __val, (_CharT*)0 );
 }
 
 
 template <class _CharT, class _InputIter>  
 _InputIter 
-num_get<_CharT, _InputIter>::do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+num_get<_CharT, _InputIter>::do_get(_InputIter ___in, _InputIter __end, ios_base& __str,
                                     ios_base::iostate& __err,
                                     float& __val) const {
   string __buf ;
-  bool __ok = _M_read_float(__buf, __in, __end, __str, (_CharT*)0 );
+  bool __ok = _M_read_float(__buf, ___in, __end, __str, (_CharT*)0 );
   __string_to_float(__buf, __val);  
   __err = __STATIC_CAST(ios_base::iostate, __ok ? ios_base::goodbit : ios_base::failbit);
-  if (__in == __end)
+  if (___in == __end)
     __err |= ios_base::eofbit;
-  return __in;
+  return ___in;
 }
 
 template <class _CharT, class _InputIter>  
 _InputIter 
-num_get<_CharT, _InputIter>::do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+num_get<_CharT, _InputIter>::do_get(_InputIter ___in, _InputIter __end, ios_base& __str,
                                     ios_base::iostate& __err, 
                                     double& __val) const {
   string __buf ;
-  bool __ok = _M_read_float(__buf, __in, __end, __str, (_CharT*)0 );
+  bool __ok = _M_read_float(__buf, ___in, __end, __str, (_CharT*)0 );
   __string_to_float(__buf, __val);
   __err = __STATIC_CAST(ios_base::iostate, __ok ? ios_base::goodbit : ios_base::failbit);
-  if (__in == __end)
+  if (___in == __end)
     __err |= ios_base::eofbit;
-  return __in;
+  return ___in;
 }
 
 #ifndef _STLP_NO_LONG_DOUBLE
 template <class _CharT, class _InputIter>  
 _InputIter 
-num_get<_CharT, _InputIter>::do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+num_get<_CharT, _InputIter>::do_get(_InputIter ___in, _InputIter __end, ios_base& __str,
 				    ios_base::iostate& __err,
                                     long double& __val) const {
   string __buf ;
-  bool __ok = _M_read_float(__buf, __in, __end, __str, (_CharT*)0 );
+  bool __ok = _M_read_float(__buf, ___in, __end, __str, (_CharT*)0 );
   __string_to_float(__buf, __val);
   __err = __STATIC_CAST(ios_base::iostate, __ok ? ios_base::goodbit : ios_base::failbit);
-  if (__in == __end)
+  if (___in == __end)
     __err |= ios_base::eofbit;
-  return __in;
+  return ___in;
 }
 #endif /* _STLP_LONG_DOUBLE */
 
 template <class _CharT, class _InputIter>  
 _InputIter 
-num_get<_CharT, _InputIter>::do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+num_get<_CharT, _InputIter>::do_get(_InputIter ___in, _InputIter __end, ios_base& __str,
                            ios_base::iostate& __err,
                            void*& __p) const {
 # if defined(_STLP_LONG_LONG)&&!defined(__MRC__)		//*ty 12/07/2001 - MrCpp can not cast from long long to void*
@@ -631,7 +631,7 @@
 # else
   unsigned long __val;
 # endif
-    iter_type __tmp = _M_do_get_integer(__in, __end, __str, __err, __val, (_CharT*)0 );
+    iter_type __tmp = _M_do_get_integer(___in, __end, __str, __err, __val, (_CharT*)0 );
     if (!(__err & ios_base::failbit))
       __p = __REINTERPRET_CAST(void*,__val);
     return __tmp;
@@ -642,18 +642,18 @@
 
 template <class _CharT, class _InputIter>  
 _InputIter 
-num_get<_CharT, _InputIter>::do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+num_get<_CharT, _InputIter>::do_get(_InputIter ___in, _InputIter __end, ios_base& __str,
                                     ios_base::iostate& __err,
                                     _STLP_LONG_LONG& __val) const {
-  return _M_do_get_integer(__in, __end, __str, __err, __val, (_CharT*)0 );
+  return _M_do_get_integer(___in, __end, __str, __err, __val, (_CharT*)0 );
 }
 
 template <class _CharT, class _InputIter>  
 _InputIter 
-num_get<_CharT, _InputIter>::do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+num_get<_CharT, _InputIter>::do_get(_InputIter ___in, _InputIter __end, ios_base& __str,
                                     ios_base::iostate& __err,
                                     unsigned _STLP_LONG_LONG& __val) const {
-  return _M_do_get_integer(__in, __end, __str, __err, __val, (_CharT*)0 );
+  return _M_do_get_integer(___in, __end, __str, __err, __val, (_CharT*)0 );
 }
 
 #endif /* _STLP_LONG_LONG */
--- misc/STLport-4.5-0119/stlport/stl/_num_get.h	Mon Nov 26 19:37:00 2001
+++ misc/build/STLport-4.5-0119/stlport/stl/_num_get.h	Mon Jun  2 10:32:02 2008
@@ -58,79 +58,79 @@
   explicit num_get(size_t __refs = 0): locale::facet(__refs) {}
     
 # ifndef _STLP_NO_BOOL
-  _InputIter get(_InputIter __in, _InputIter __end, ios_base& __str,
+  _InputIter get(_InputIter ___in, _InputIter __end, ios_base& __str,
                 ios_base::iostate& __err, bool& __val) const {
-    return do_get(__in, __end, __str, __err, __val);
+    return do_get(___in, __end, __str, __err, __val);
   }
 # endif
 
 # ifdef _STLP_FIX_LIBRARY_ISSUES
-  _InputIter get(_InputIter __in, _InputIter __end, ios_base& __str,
+  _InputIter get(_InputIter ___in, _InputIter __end, ios_base& __str,
                 ios_base::iostate& __err, short& __val) const {
-    return do_get(__in, __end, __str, __err, __val);
+    return do_get(___in, __end, __str, __err, __val);
   }
 
-  _InputIter get(_InputIter __in, _InputIter __end, ios_base& __str,
+  _InputIter get(_InputIter ___in, _InputIter __end, ios_base& __str,
                 ios_base::iostate& __err, int& __val) const {
-    return do_get(__in, __end, __str, __err, __val);
+    return do_get(___in, __end, __str, __err, __val);
   }
 # endif
 
-  _InputIter get(_InputIter __in, _InputIter __end, ios_base& __str,
+  _InputIter get(_InputIter ___in, _InputIter __end, ios_base& __str,
                 ios_base::iostate& __err, long& __val) const {
-    return do_get(__in, __end, __str, __err, __val);
+    return do_get(___in, __end, __str, __err, __val);
   }
 
-  _InputIter get(_InputIter __in, _InputIter __end, ios_base& __str,
+  _InputIter get(_InputIter ___in, _InputIter __end, ios_base& __str,
                 ios_base::iostate& __err, unsigned short& __val) const {
-    return do_get(__in, __end, __str, __err, __val);
+    return do_get(___in, __end, __str, __err, __val);
   }
 
-  _InputIter get(_InputIter __in, _InputIter __end, ios_base& __str,
+  _InputIter get(_InputIter ___in, _InputIter __end, ios_base& __str,
                 ios_base::iostate& __err, unsigned int& __val) const {
-    return do_get(__in, __end, __str, __err, __val);
+    return do_get(___in, __end, __str, __err, __val);
   }
 
-  _InputIter get(_InputIter __in, _InputIter __end, ios_base& __str,
+  _InputIter get(_InputIter ___in, _InputIter __end, ios_base& __str,
                 ios_base::iostate& __err, unsigned long& __val) const {
-    return do_get(__in, __end, __str, __err, __val);
+    return do_get(___in, __end, __str, __err, __val);
   }
 
 #ifdef _STLP_LONG_LONG
 
-  _InputIter get(_InputIter __in, _InputIter __end, ios_base& __str,
+  _InputIter get(_InputIter ___in, _InputIter __end, ios_base& __str,
                 ios_base::iostate& __err, _STLP_LONG_LONG& __val) const {
-    return do_get(__in, __end, __str, __err, __val);
+    return do_get(___in, __end, __str, __err, __val);
   }
 
-  _InputIter get(_InputIter __in, _InputIter __end, ios_base& __str,
+  _InputIter get(_InputIter ___in, _InputIter __end, ios_base& __str,
                 ios_base::iostate& __err, unsigned _STLP_LONG_LONG& __val) const {
-    return do_get(__in, __end, __str, __err, __val);
+    return do_get(___in, __end, __str, __err, __val);
   }
 
 #endif /* _STLP_LONG_LONG */
 
-  _InputIter get(_InputIter __in, _InputIter __end, ios_base& __str,
+  _InputIter get(_InputIter ___in, _InputIter __end, ios_base& __str,
                  ios_base::iostate& __err, float& __val) const {
-    return do_get(__in, __end, __str, __err, __val);
+    return do_get(___in, __end, __str, __err, __val);
   }
 
-  _InputIter get(_InputIter __in, _InputIter __end, ios_base& __str,
+  _InputIter get(_InputIter ___in, _InputIter __end, ios_base& __str,
                 ios_base::iostate& __err, double& __val) const {
-    return do_get(__in, __end, __str, __err, __val);
+    return do_get(___in, __end, __str, __err, __val);
   }
 
 # ifndef _STLP_NO_LONG_DOUBLE
 
-  _InputIter get(_InputIter __in, _InputIter __end, ios_base& __str,
+  _InputIter get(_InputIter ___in, _InputIter __end, ios_base& __str,
                 ios_base::iostate& __err, long double& __val) const {
-    return do_get(__in, __end, __str, __err, __val);
+    return do_get(___in, __end, __str, __err, __val);
   }
 # endif
 
-  _InputIter get(_InputIter __in, _InputIter __end, ios_base& __str,
+  _InputIter get(_InputIter ___in, _InputIter __end, ios_base& __str,
                 ios_base::iostate& __err, void*& __val) const {
-    return do_get(__in, __end, __str, __err, __val);
+    return do_get(___in, __end, __str, __err, __val);
   }
 
   _STLP_STATIC_MEMBER_DECLSPEC static locale::id id;
@@ -143,43 +143,43 @@
   typedef numpunct<_CharT>     _Numpunct;
 
 # ifndef _STLP_NO_BOOL
-  virtual _InputIter do_get(_InputIter __in, _InputIter __end,
+  virtual _InputIter do_get(_InputIter ___in, _InputIter __end,
                            ios_base& __str, ios_base::iostate& __err, bool& __val) const;
 # endif
 
-  virtual _InputIter do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+  virtual _InputIter do_get(_InputIter ___in, _InputIter __end, ios_base& __str,
                            ios_base::iostate& __err, long& __val) const;
-  virtual _InputIter do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+  virtual _InputIter do_get(_InputIter ___in, _InputIter __end, ios_base& __str,
                            ios_base::iostate& __err, unsigned short& __val) const;
-  virtual _InputIter do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+  virtual _InputIter do_get(_InputIter ___in, _InputIter __end, ios_base& __str,
                            ios_base::iostate& __err, unsigned int& __val) const;
-  virtual _InputIter do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+  virtual _InputIter do_get(_InputIter ___in, _InputIter __end, ios_base& __str,
                            ios_base::iostate& __err, unsigned long& __val) const;
 # ifdef _STLP_FIX_LIBRARY_ISSUES
   // issue 118 : those are actually not supposed to be here
-  virtual _InputIter do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+  virtual _InputIter do_get(_InputIter ___in, _InputIter __end, ios_base& __str,
                            ios_base::iostate& __err, short& __val) const;
-  virtual _InputIter do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+  virtual _InputIter do_get(_InputIter ___in, _InputIter __end, ios_base& __str,
                            ios_base::iostate& __err, int& __val) const;
 # endif
-  virtual _InputIter do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+  virtual _InputIter do_get(_InputIter ___in, _InputIter __end, ios_base& __str,
                           ios_base::iostate& __err, float& __val) const;
-  virtual _InputIter do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+  virtual _InputIter do_get(_InputIter ___in, _InputIter __end, ios_base& __str,
                            ios_base::iostate& __err, double& __val) const;
-  virtual _InputIter do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+  virtual _InputIter do_get(_InputIter ___in, _InputIter __end, ios_base& __str,
                            ios_base::iostate& __err,
                            void*& __p) const;
 
 #ifndef _STLP_NO_LONG_DOUBLE
-  virtual _InputIter do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+  virtual _InputIter do_get(_InputIter ___in, _InputIter __end, ios_base& __str,
                            ios_base::iostate& __err, long double& __val) const;
 #endif /* _STLP_LONG_DOUBLE */
 
 #ifdef _STLP_LONG_LONG
 
-  virtual _InputIter do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+  virtual _InputIter do_get(_InputIter ___in, _InputIter __end, ios_base& __str,
                             ios_base::iostate& __err, _STLP_LONG_LONG& __val) const;
-  virtual _InputIter do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+  virtual _InputIter do_get(_InputIter ___in, _InputIter __end, ios_base& __str,
                            ios_base::iostate& __err, unsigned _STLP_LONG_LONG& __val) const;
 #endif /* _STLP_LONG_LONG */
 
--- misc/STLport-4.5-0119/stlport/stl/_num_put.c	Thu Sep 12 22:47:01 2002
+++ misc/build/STLport-4.5-0119/stlport/stl/_num_put.c	Mon Jun  2 10:32:02 2008
@@ -45,29 +45,29 @@
 template <class _CharT, class _OutputIter>
 _OutputIter  _STLP_CALL
 __copy_float_and_fill(const _CharT* __first, const _CharT* __last,
-                      _OutputIter __out,
+                      _OutputIter ___out,
                       ios_base::fmtflags __flags,
                       streamsize __width, _CharT __fill,
                       _CharT __xplus, _CharT __xminus) {
   if (__width <= __last - __first)
-    return copy(__first, __last, __out);
+    return copy(__first, __last, ___out);
   else {
     streamsize __pad = __width - (__last - __first);
     ios_base::fmtflags __dir = __flags & ios_base::adjustfield;
 
     if (__dir == ios_base::left) {
-      __out = copy(__first, __last, __out);
-      return fill_n(__out, __pad, __fill);
+      ___out = copy(__first, __last, ___out);
+      return fill_n(___out, __pad, __fill);
     }
     else if (__dir == ios_base::internal && __first != __last &&
              (*__first == __xplus || *__first == __xminus)) {
-      *__out++ = *__first++;
-      __out = fill_n(__out, __pad, __fill);
-      return copy(__first, __last, __out);
+      *___out++ = *__first++;
+      ___out = fill_n(___out, __pad, __fill);
+      return copy(__first, __last, ___out);
     }
     else {
-      __out = fill_n(__out, __pad, __fill);
-      return copy(__first, __last, __out);
+      ___out = fill_n(___out, __pad, __fill);
+      return copy(__first, __last, ___out);
     }
   }
 }
@@ -76,7 +76,7 @@
 // Helper routine for wchar_t
 template <class _OutputIter>
 _OutputIter  _STLP_CALL
-__put_float(char* __ibuf, char* __iend, _OutputIter __out,
+__put_float(char* __ibuf, char* __iend, _OutputIter ___out,
             ios_base& __f, wchar_t __fill,
             wchar_t __decimal_point,
             wchar_t __sep, const string& __grouping)
@@ -107,7 +107,7 @@
     __eend = __wbuf + __len;
   }
 
-  return __copy_float_and_fill(__wbuf, __eend, __out,
+  return __copy_float_and_fill(__wbuf, __eend, ___out,
                                __f.flags(), __f.width(0), __fill,
                                __ct.widen('+'), __ct.widen('-')); 
 }
@@ -116,7 +116,7 @@
 // Helper routine for char
 template <class _OutputIter>
 _OutputIter  _STLP_CALL
-__put_float(char* __ibuf, char* __iend, _OutputIter __out,
+__put_float(char* __ibuf, char* __iend, _OutputIter ___out,
             ios_base& __f, char __fill,
             char __decimal_point,
             char __sep, const string& __grouping)
@@ -133,7 +133,7 @@
     __iend = __ibuf + __len;
   }
 
-  return __copy_float_and_fill(__ibuf, __iend, __out,
+  return __copy_float_and_fill(__ibuf, __iend, ___out,
                                __f.flags(), __f.width(0), __fill, '+', '-');
 }
 
@@ -158,37 +158,37 @@
 template <class _CharT, class _OutputIter>
 _OutputIter _STLP_CALL
 __copy_integer_and_fill(const _CharT* __buf, ptrdiff_t __len,
-                        _OutputIter __out,
+                        _OutputIter ___out,
                         ios_base::fmtflags __flg, streamsize __wid, _CharT __fill,
                         _CharT __xplus, _CharT __xminus)
 {
   if (__len >= __wid)
-    return copy(__buf, __buf + __len, __out);
+    return copy(__buf, __buf + __len, ___out);
   else {
     ptrdiff_t __pad = __wid - __len;
     ios_base::fmtflags __dir = __flg & ios_base::adjustfield;
 
     if (__dir == ios_base::left) {
-      __out = copy(__buf, __buf + __len, __out);
-      return fill_n(__out, __pad, __fill);
+      ___out = copy(__buf, __buf + __len, ___out);
+      return fill_n(___out, __pad, __fill);
     }
     else if (__dir == ios_base::internal && __len != 0 &&
              (__buf[0] == __xplus || __buf[0] == __xminus)) {
-      *__out++ = __buf[0];
-      __out = fill_n(__out, __pad, __fill);
-      return copy(__buf + 1, __buf + __len, __out);
+      *___out++ = __buf[0];
+      ___out = fill_n(___out, __pad, __fill);
+      return copy(__buf + 1, __buf + __len, ___out);
     }
     else if (__dir == ios_base::internal && __len >= 2 &&
              (__flg & ios_base::showbase) &&
              (__flg & ios_base::basefield) == ios_base::hex) {
-      *__out++ = __buf[0];
-      *__out++ = __buf[1];
-      __out = fill_n(__out, __pad, __fill);
-      return copy(__buf + 2, __buf + __len, __out);
+      *___out++ = __buf[0];
+      *___out++ = __buf[1];
+      ___out = fill_n(___out, __pad, __fill);
+      return copy(__buf + 2, __buf + __len, ___out);
     }
     else {
-      __out = fill_n(__out, __pad, __fill);
-      return copy(__buf, __buf + __len, __out);
+      ___out = fill_n(___out, __pad, __fill);
+      return copy(__buf, __buf + __len, ___out);
     }
   }
 }
--- misc/STLport-4.5-0119/stlport/stl/_sstream.c	Thu Sep 12 22:47:04 2002
+++ misc/build/STLport-4.5-0119/stlport/stl/_sstream.c	Mon Jun  2 10:32:02 2008
@@ -337,22 +337,22 @@
             ios_base::seekdir __dir,
             ios_base::openmode __mode)
 {
-  bool __in  = false;
-  bool __out = false;
+  bool ___in  = false;
+  bool ___out = false;
   
   if ((__mode & (ios_base::in | ios_base::out)) == (ios_base::in | ios_base::out) ) {
     if (__dir == ios_base::beg || __dir == ios_base::end)
-      __in = __out = true;
+      ___in = ___out = true;
   }
   else if (__mode & ios_base::in)
-    __in = true;
+    ___in = true;
   else if (__mode & ios_base::out)
-    __out = true;
+    ___out = true;
 
-  if (!__in && !__out)
+  if (!___in && !___out)
     return pos_type(off_type(-1));
-  else if ((__in  && (!(_M_mode & ios_base::in) || this->gptr() == 0)) ||
-           (__out && (!(_M_mode & ios_base::out) || this->pptr() == 0)))
+  else if ((___in  && (!(_M_mode & ios_base::in) || this->gptr() == 0)) ||
+           (___out && (!(_M_mode & ios_base::out) || this->pptr() == 0)))
     return pos_type(off_type(-1));
 
   if ((_M_mode & ios_base::out) && !(_M_mode & ios_base::in))
@@ -367,7 +367,7 @@
     __newoff = _M_str.size();
     break;
   case ios_base::cur:
-    __newoff = __in ? this->gptr() - this->eback() 
+    __newoff = ___in ? this->gptr() - this->eback() 
                     : this->pptr() - this->pbase();
     break;
   default:
@@ -376,7 +376,7 @@
 
   __off += __newoff;
 
-  if (__in) {
+  if (___in) {
     ptrdiff_t __n = this->egptr() - this->eback();
 
     if (__off < 0 || __off > __n)
@@ -385,7 +385,7 @@
       this->setg(this->eback(), this->eback() + __off, this->eback() + __n);
   }
 
-  if (__out) {
+  if (___out) {
     ptrdiff_t __n = this->epptr() - this->pbase();
 
     if (__off < 0 || __off > __n)
@@ -404,11 +404,11 @@
 basic_stringbuf<_CharT, _Traits, _Alloc>
   ::seekpos(pos_type __pos, ios_base::openmode __mode)
 {
-  bool __in  = (__mode & ios_base::in) != 0;
-  bool __out = (__mode & ios_base::out) != 0;
+  bool ___in  = (__mode & ios_base::in) != 0;
+  bool ___out = (__mode & ios_base::out) != 0;
 
-  if ((__in  && (!(_M_mode & ios_base::in) || this->gptr() == 0)) ||
-      (__out && (!(_M_mode & ios_base::out) || this->pptr() == 0)))
+  if ((___in  && (!(_M_mode & ios_base::in) || this->gptr() == 0)) ||
+      (___out && (!(_M_mode & ios_base::out) || this->pptr() == 0)))
     return pos_type(off_type(-1));
 
   const off_type __n = __pos - pos_type(off_type(0));
@@ -415,13 +415,13 @@
   if ((_M_mode & ios_base::out) && !(_M_mode & ios_base::in))
     _M_append_buffer();
 
-  if (__in) {
+  if (___in) {
     if (__n < 0 || __n > this->egptr() - this->eback())
       return pos_type(off_type(-1));
     this->setg(this->eback(), this->eback() + __n, this->egptr());
   }
 
-  if (__out) {
+  if (___out) {
     if (__n < 0 || size_t(__n) > _M_str.size())
       return pos_type(off_type(-1));
 
--- misc/STLport-4.5-0119/stlport/stl/_time_facets.c	Thu Sep 12 22:47:07 2002
+++ misc/build/STLport-4.5-0119/stlport/stl/_time_facets.c	Mon Jun  2 10:32:02 2008
@@ -328,7 +328,7 @@
 # ifndef _STLP_NO_WCHAR_T
 template <class _OuIt>
 _OuIt _STLP_CALL
-__put_time(char * __first, char * __last, _OuIt __out,
+__put_time(char * __first, char * __last, _OuIt ___out,
            const ios_base& __s, wchar_t) {
     const ctype<wchar_t>& __ct = *(ctype<wchar_t>*)__s._M_ctype_facet();
     wchar_t __wbuf[64];
@@ -335,7 +335,7 @@
     __ct.widen(__first, __last, __wbuf);
     ptrdiff_t __len = __last - __first;
     wchar_t * __eend = __wbuf + __len;
-    return copy((wchar_t*)__wbuf, __eend, __out);
+    return copy((wchar_t*)__wbuf, __eend, ___out);
 }
 # endif
 
--- misc/STLport-4.5-0119/stlport/stl/_time_facets.h	Wed Aug 29 00:55:47 2001
+++ misc/build/STLport-4.5-0119/stlport/stl/_time_facets.h	Mon Jun  2 10:32:02 2008
@@ -198,14 +198,14 @@
                        const _Time_Info& __table, const tm* __t);
 
 template <class _OuIt>
-inline _OuIt _STLP_CALL __put_time(char * __first, char * __last, _OuIt __out,
+inline _OuIt _STLP_CALL __put_time(char * __first, char * __last, _OuIt ___out,
                                    const ios_base& /* __loc */, char) {
-    return copy(__first, __last, __out);
+    return copy(__first, __last, ___out);
 }
 
 # ifndef _STLP_NO_WCHAR_T
 template <class _OuIt>
-_OuIt _STLP_CALL __put_time(char * __first, char * __last, _OuIt __out,
+_OuIt _STLP_CALL __put_time(char * __first, char * __last, _OuIt ___out,
                             const ios_base& __s, wchar_t);
 # endif
 
--- misc/STLport-4.5-0119/stlport/stl/debug/_debug.c	Thu Sep 12 22:47:08 2002
+++ misc/build/STLport-4.5-0119/stlport/stl/debug/_debug.c	Mon Jun  2 10:32:02 2008
@@ -82,7 +82,7 @@
 template <class _Iterator>
 bool _STLP_CALL  __check_range(const _Iterator& __it, 
                                const _Iterator& __start, const _Iterator& __finish) {
-    _STLP_VERBOSE_RETURN(__in_range(__it,__start, __finish), 
+    _STLP_VERBOSE_RETURN(___in_range(__it,__start, __finish), 
                          _StlMsg_NOT_IN_RANGE_1)
     return true;
 }
@@ -90,7 +90,7 @@
 template <class _Iterator>
 bool _STLP_CALL  __check_range(const _Iterator& __first, const _Iterator& __last, 
                                const _Iterator& __start, const _Iterator& __finish) {
-    _STLP_VERBOSE_RETURN(__in_range(__first, __last, __start, __finish), 
+    _STLP_VERBOSE_RETURN(___in_range(__first, __last, __start, __finish), 
                          _StlMsg_NOT_IN_RANGE_2)
     return true;
 }
--- misc/STLport-4.5-0119/stlport/stl/debug/_debug.h	Thu Sep 12 22:47:09 2002
+++ misc/build/STLport-4.5-0119/stlport/stl/debug/_debug.h	Mon Jun  2 10:32:03 2008
@@ -227,7 +227,7 @@
 
 // Note : that means in range [i1, i2].
 template <class _Iterator>
-inline bool  _STLP_CALL __in_range(const _Iterator& _It, const _Iterator& __i1,
+inline bool  _STLP_CALL ___in_range(const _Iterator& _It, const _Iterator& __i1,
                                    const _Iterator& __i2) { 
     return __valid_range(__i1,_It,_STLP_ITERATOR_CATEGORY(__i1, _Iterator)) && 
         __valid_range(_It,__i2,_STLP_ITERATOR_CATEGORY(_It, _Iterator));
@@ -234,7 +234,7 @@
 }
 
 template <class _Iterator>
-inline bool  _STLP_CALL __in_range(const _Iterator& __first, const _Iterator& __last, 
+inline bool  _STLP_CALL ___in_range(const _Iterator& __first, const _Iterator& __last, 
                                    const _Iterator& __start, const _Iterator& __finish) { 
     return __valid_range(__first,__last,_STLP_ITERATOR_CATEGORY(__first, _Iterator)) &&
         __valid_range(__start,__first,_STLP_ITERATOR_CATEGORY(__first, _Iterator)) && 
--- misc/STLport-4.5-0119/stlport/stl/debug/_deque.h	Fri May  4 04:11:54 2001
+++ misc/build/STLport-4.5-0119/stlport/stl/debug/_deque.h	Mon Jun  2 10:32:03 2008
@@ -121,9 +121,9 @@
   explicit _DBG_deque(const allocator_type& __a = allocator_type()) :
     _STLP_DEQUE_SUPER(__a), _M_iter_list(_Get_base()) {}
   _DBG_deque(const _Self& __x) : _STLP_DEQUE_SUPER(__x), _M_iter_list(_Get_base()) {}
-  _DBG_deque(size_type __n, const value_type& __value,
+  _DBG_deque(size_type __n, const value_type& ___value,
         const allocator_type& __a = allocator_type()) : 
-    _STLP_DEQUE_SUPER(__n, __value, __a), _M_iter_list(_Get_base()) {}
+    _STLP_DEQUE_SUPER(__n, ___value, __a), _M_iter_list(_Get_base()) {}
   explicit _DBG_deque(size_type __n) : _STLP_DEQUE_SUPER(__n), _M_iter_list(_Get_base()) {}
 
 #ifdef _STLP_MEMBER_TEMPLATES
--- misc/STLport-4.5-0119/stlport/stl/debug/_list.h	Wed May 30 05:45:43 2001
+++ misc/build/STLport-4.5-0119/stlport/stl/debug/_list.h	Mon Jun  2 10:32:03 2008
@@ -79,9 +79,9 @@
   _Base* _Get_base() { return (_Base*)this; }
   explicit _DBG_list(const allocator_type& __a = allocator_type()) :
     _STLP_DBG_LIST_BASE(__a), _M_iter_list(_Get_base()) {}
-  _DBG_list(size_type __n, const _Tp& __value,
+  _DBG_list(size_type __n, const _Tp& ___value,
 	    const allocator_type& __a = allocator_type())
-    : _STLP_DBG_LIST_BASE(__n, __value, __a), _M_iter_list(_Get_base()) {}
+    : _STLP_DBG_LIST_BASE(__n, ___value, __a), _M_iter_list(_Get_base()) {}
   explicit _DBG_list(size_type __n)
     : _STLP_DBG_LIST_BASE(__n), _M_iter_list(_Get_base()) {}
   
@@ -219,13 +219,13 @@
 
   void resize(size_type __new_size) { this->resize(__new_size, _Tp()); }
 
-  void remove(const _Tp& __value) {
+  void remove(const _Tp& ___value) {
     typename _Base::iterator __first = _Base::begin();
     typename _Base::iterator __last = _Base::end();
     while (__first != __last) {
       typename _Base::iterator __next = __first;
       ++__next;
-      if (__value == *__first) erase(iterator(&_M_iter_list,__first));
+      if (___value == *__first) erase(iterator(&_M_iter_list,__first));
       __first = __next;
     }
   }
--- misc/STLport-4.5-0119/stlport/stl/debug/_vector.h	Mon Oct 28 16:09:32 2002
+++ misc/build/STLport-4.5-0119/stlport/stl/debug/_vector.h	Mon Jun  2 10:32:03 2008
@@ -141,9 +141,9 @@
   explicit _DBG_vector(const allocator_type& __a = allocator_type())
     : _STLP_DBG_VECTOR_BASE(__a), _M_iter_list((const _Base*)this)  {}
 
-  _DBG_vector(size_type __n, const _Tp& __value,
+  _DBG_vector(size_type __n, const _Tp& ___value,
          const allocator_type& __a = allocator_type()) 
-    : _STLP_DBG_VECTOR_BASE(__n, __value, __a), _M_iter_list((const _Base*)this) {}
+    : _STLP_DBG_VECTOR_BASE(__n, ___value, __a), _M_iter_list((const _Base*)this) {}
 
   explicit _DBG_vector(size_type __n)
     : _STLP_DBG_VECTOR_BASE(__n), _M_iter_list((const _Base*)this) {}
