2012-10-10 Liviu Nicoara <[email protected]>
* src/collate.cpp (__rw_strnxfrm): preserved embedded NULs
Index: src/collate.cpp
===================================================================
--- src/collate.cpp (revision 1392832)
+++ src/collate.cpp (working copy)
@@ -547,7 +547,7 @@
_TRY {
// resize the result string to fit itself plus the result
- // of the transformation including the terminatin NUL
+ // of the transformation including the terminating NUL
// appended by strxfrm()
res.resize (res_size + dst_size + 1);
}
@@ -557,36 +557,15 @@
_RETHROW;
}
- // transfor the source string up to the terminating NUL
- size_t xfrm_size =
- strxfrm (&res [0] + res_size, psrc, dst_size + 1);
-
-#if defined _MSC_VER && _MSC_VER < 1400
- // compute the correct value that should have been returned from
- // strxfrm() after the transformation has completed (MSVC strxfrm()
- // returns a bogus result; see PR #29935)
- xfrm_size = strlen (&res [0] + res_size);
-#endif // MSVC < 8.0
-
- // increment the size of the result string by the number
- // of transformed characters excluding the terminating NUL
- // if strxfrm() transforms the empty string into the empty
- // string, keep the terminating NUL, otherwise drop it
- res_size += xfrm_size + (last && !*psrc && !xfrm_size);
-
- _TRY {
- res.resize (res_size);
- }
- _CATCH (...) {
- if (pbuf != buf)
- delete[] pbuf;
- _RETHROW;
- }
+ strxfrm (&res [0] + res_size, psrc, dst_size + 1);
}
if (pbuf != buf)
delete[] pbuf;
+ if (!res.empty ())
+ res.resize (res.size () - 1);
+
return res;
}