diff options
Diffstat (limited to 'butl/utility.cxx')
-rw-r--r-- | butl/utility.cxx | 143 |
1 files changed, 0 insertions, 143 deletions
diff --git a/butl/utility.cxx b/butl/utility.cxx deleted file mode 100644 index 03045da..0000000 --- a/butl/utility.cxx +++ /dev/null @@ -1,143 +0,0 @@ -// file : butl/utility.cxx -*- C++ -*- -// copyright : Copyright (c) 2014-2017 Code Synthesis Ltd -// license : MIT; see accompanying LICENSE file - -#include <butl/utility> - -#ifdef _WIN32 -# include <butl/win32-utility> -#endif - -#include <string> -#include <ostream> -#include <system_error> - -namespace butl -{ - using namespace std; - -#ifndef __cpp_lib_uncaught_exceptions - -#ifdef __cpp_thread_local - thread_local -#else - __thread -#endif - bool exception_unwinding_dtor_ = false; - -#ifdef _WIN32 - bool& - exception_unwinding_dtor () {return exception_unwinding_dtor_;} -#endif - -#endif - - [[noreturn]] void - throw_generic_error (int errno_code, const char* what) - { - if (what == nullptr) - throw system_error (errno_code, generic_category ()); - else - throw system_error (errno_code, generic_category (), what); - } - - [[noreturn]] void -#ifndef _WIN32 - throw_system_error (int system_code, int) - { - throw system_error (system_code, system_category ()); -#else - throw_system_error (int system_code, int fallback_errno_code) - { - // Here we work around MinGW libstdc++ that interprets Windows system error - // codes (for example those returned by GetLastError()) as errno codes. The - // resulting system_error description will have the following form: - // - // <system_code description>: <fallback_errno_code description> - // - // Also note that the fallback-related description suffix is stripped by - // our custom operator<<(ostream, exception) for the common case (see - // below). - // - throw system_error (fallback_errno_code, - system_category (), - win32::error_msg (system_code)); -#endif - } -} - -namespace std -{ - using namespace butl; - - ostream& - operator<< (ostream& o, const exception& e) - { - const char* d (e.what ()); - const char* s (d); - - // Strip the leading junk (colons and spaces). - // - // Note that error descriptions for ios_base::failure exceptions thrown by - // fdstream can have the ': ' prefix for libstdc++ (read more in comment - // for throw_ios_failure()). - // - for (; *s == ' ' || *s == ':'; ++s) ; - - // Strip the trailing junk (periods, spaces, newlines). - // - // Note that msvcrt adds some junk like this: - // - // Invalid data.\r\n - // - size_t n (string::traits_type::length (s)); - for (; n > 0; --n) - { - switch (s[n-1]) - { - case '\r': - case '\n': - case '.': - case ' ': continue; - } - - break; - } - - // Strip the suffix for system_error thrown by - // throw_system_error(system_code) on Windows. For example for the - // ERROR_INVALID_DATA error code the original description will be - // 'Invalid data. : Success' for MinGW libstdc++ and - // 'Invalid data. : Success.' for msvcrt. - // - if (n >= 11 && - string::traits_type::compare (s + n - 11, ". : Success", 11) == 0) - n -= 11; - - // Lower-case the first letter if the beginning looks like a word (the - // second character is the lower-case letter or space). - // - char c; - bool lc (n > 0 && alpha (c = s[0]) && c == ucase (c) && - (n == 1 || (alpha (c = s[1]) && c == lcase (c)) || c == ' ')); - - // Print the description as is if no adjustment is required. - // - if (!lc && s == d && s[n] == '\0') - o << d; - else - { - // We need to produce the resulting description and then write it - // with a single formatted output operation. - // - string r (s, n); - - if (lc) - r[0] = lcase (r[0]); - - o << r; - } - - return o; - } -} |