mirror of
				https://github.com/notepad-plus-plus/notepad-plus-plus.git
				synced 2025-11-03 21:14:08 +01:00 
			
		
		
		
	1. Build Notepad++ with Scintilla static lib (libscintilla.lib) and Boost (v1.76) RegExpr. 2. ARM64 build is available. Fix #5158, close #9594
		
			
				
	
	
		
			214 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			214 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
//Copyright (c) 2006-2010 Emil Dotchevski and Reverge Studios, Inc.
 | 
						|
 | 
						|
//Distributed under the Boost Software License, Version 1.0. (See accompanying
 | 
						|
//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 | 
						|
 | 
						|
#ifndef BOOST_EXCEPTION_0552D49838DD11DD90146B8956D89593
 | 
						|
#define BOOST_EXCEPTION_0552D49838DD11DD90146B8956D89593
 | 
						|
 | 
						|
#include <boost/config.hpp>
 | 
						|
#include <boost/exception/get_error_info.hpp>
 | 
						|
#include <boost/exception/info.hpp>
 | 
						|
#include <boost/utility/enable_if.hpp>
 | 
						|
#ifndef BOOST_NO_RTTI
 | 
						|
#include <boost/core/demangle.hpp>
 | 
						|
#endif
 | 
						|
#include <exception>
 | 
						|
#include <sstream>
 | 
						|
#include <string>
 | 
						|
#ifndef BOOST_NO_EXCEPTIONS
 | 
						|
#include <boost/exception/current_exception_cast.hpp>
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef BOOST_EXCEPTION_ENABLE_WARNINGS
 | 
						|
#if __GNUC__*100+__GNUC_MINOR__>301
 | 
						|
#pragma GCC system_header
 | 
						|
#endif
 | 
						|
#ifdef __clang__
 | 
						|
#pragma clang system_header
 | 
						|
#endif
 | 
						|
#ifdef _MSC_VER
 | 
						|
#pragma warning(push,1)
 | 
						|
#endif
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef BOOST_NO_EXCEPTIONS
 | 
						|
namespace
 | 
						|
boost
 | 
						|
    {
 | 
						|
    namespace
 | 
						|
    exception_detail
 | 
						|
        {
 | 
						|
        std::string diagnostic_information_impl( boost::exception const *, std::exception const *, bool, bool );
 | 
						|
        }
 | 
						|
 | 
						|
    inline
 | 
						|
    std::string
 | 
						|
    current_exception_diagnostic_information( bool verbose=true)
 | 
						|
        {
 | 
						|
        boost::exception const * be=current_exception_cast<boost::exception const>();
 | 
						|
        std::exception const * se=current_exception_cast<std::exception const>();
 | 
						|
        if( be || se )
 | 
						|
            return exception_detail::diagnostic_information_impl(be,se,true,verbose);
 | 
						|
#if defined(__GLIBCXX__) && __cplusplus >= 201103L && !defined(BOOST_NO_RTTI)
 | 
						|
        else if (auto* p=std::current_exception().__cxa_exception_type())
 | 
						|
            return "Dynamic exception type: "+boost::core::demangle(p->name());
 | 
						|
#endif
 | 
						|
        else
 | 
						|
            return "No diagnostic information available.";
 | 
						|
        }
 | 
						|
    }
 | 
						|
#endif
 | 
						|
 | 
						|
namespace
 | 
						|
boost
 | 
						|
    {
 | 
						|
    namespace
 | 
						|
    exception_detail
 | 
						|
        {
 | 
						|
        inline
 | 
						|
        exception const *
 | 
						|
        get_boost_exception( exception const * e )
 | 
						|
            {
 | 
						|
            return e;
 | 
						|
            }
 | 
						|
 | 
						|
        inline
 | 
						|
        exception const *
 | 
						|
        get_boost_exception( ... )
 | 
						|
            {
 | 
						|
            return 0;
 | 
						|
            }
 | 
						|
 | 
						|
        inline
 | 
						|
        std::exception const *
 | 
						|
        get_std_exception( std::exception const * e )
 | 
						|
            {
 | 
						|
            return e;
 | 
						|
            }
 | 
						|
 | 
						|
        inline
 | 
						|
        std::exception const *
 | 
						|
        get_std_exception( ... )
 | 
						|
            {
 | 
						|
            return 0;
 | 
						|
            }
 | 
						|
 | 
						|
        inline
 | 
						|
        char const *
 | 
						|
        get_diagnostic_information( exception const & x, char const * header )
 | 
						|
            {
 | 
						|
#ifndef BOOST_NO_EXCEPTIONS
 | 
						|
            try
 | 
						|
                {
 | 
						|
#endif
 | 
						|
                error_info_container * c=x.data_.get();
 | 
						|
                if( !c )
 | 
						|
                    x.data_.adopt(c=new exception_detail::error_info_container_impl);
 | 
						|
                char const * di=c->diagnostic_information(header);
 | 
						|
                BOOST_ASSERT(di!=0);
 | 
						|
                return di;
 | 
						|
#ifndef BOOST_NO_EXCEPTIONS
 | 
						|
                }
 | 
						|
            catch(...)
 | 
						|
                {
 | 
						|
                return 0;
 | 
						|
                }
 | 
						|
#endif
 | 
						|
            }
 | 
						|
 | 
						|
        inline
 | 
						|
        std::string
 | 
						|
        diagnostic_information_impl( boost::exception const * be, std::exception const * se, bool with_what, bool verbose )
 | 
						|
            {
 | 
						|
            if( !be && !se )
 | 
						|
                return "Unknown exception.";
 | 
						|
#ifndef BOOST_NO_RTTI
 | 
						|
            if( !be )
 | 
						|
                be=dynamic_cast<boost::exception const *>(se);
 | 
						|
            if( !se )
 | 
						|
                se=dynamic_cast<std::exception const *>(be);
 | 
						|
#endif
 | 
						|
            char const * wh=0;
 | 
						|
            if( with_what && se )
 | 
						|
                {
 | 
						|
                wh=se->what();
 | 
						|
                if( be && exception_detail::get_diagnostic_information(*be,0)==wh )
 | 
						|
                    return wh;
 | 
						|
                }
 | 
						|
            std::ostringstream tmp;
 | 
						|
            if( be && verbose )
 | 
						|
                {
 | 
						|
                char const * const * f=get_error_info<throw_file>(*be);
 | 
						|
                int const * l=get_error_info<throw_line>(*be);
 | 
						|
                char const * const * fn=get_error_info<throw_function>(*be);
 | 
						|
                if( !f && !l && !fn )
 | 
						|
                    tmp << "Throw location unknown (consider using BOOST_THROW_EXCEPTION)\n";
 | 
						|
                else
 | 
						|
                    {
 | 
						|
                    if( f )
 | 
						|
                        {
 | 
						|
                        tmp << *f;
 | 
						|
                        if( int const * l=get_error_info<throw_line>(*be) )
 | 
						|
                            tmp << '(' << *l << "): ";
 | 
						|
                        }
 | 
						|
                    tmp << "Throw in function ";
 | 
						|
                    if( char const * const * fn=get_error_info<throw_function>(*be) )
 | 
						|
                        tmp << *fn;
 | 
						|
                    else
 | 
						|
                        tmp << "(unknown)";
 | 
						|
                    tmp << '\n';
 | 
						|
                    }
 | 
						|
                }
 | 
						|
#ifndef BOOST_NO_RTTI
 | 
						|
            if ( verbose )
 | 
						|
                tmp << std::string("Dynamic exception type: ") <<
 | 
						|
                    core::demangle((be?(BOOST_EXCEPTION_DYNAMIC_TYPEID(*be)):(BOOST_EXCEPTION_DYNAMIC_TYPEID(*se))).type_->name()) << '\n';
 | 
						|
#endif
 | 
						|
            if( with_what && se && verbose )
 | 
						|
                tmp << "std::exception::what: " << (wh ? wh : "(null)") << '\n';
 | 
						|
            if( be )
 | 
						|
                if( char const * s=exception_detail::get_diagnostic_information(*be,tmp.str().c_str()) )
 | 
						|
                    if( *s )
 | 
						|
                        return std::string(s);
 | 
						|
            return tmp.str();
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
    template <class T>
 | 
						|
    std::string
 | 
						|
    diagnostic_information( T const & e, bool verbose=true )
 | 
						|
        {
 | 
						|
        return exception_detail::diagnostic_information_impl(exception_detail::get_boost_exception(&e),exception_detail::get_std_exception(&e),true,verbose);
 | 
						|
        }
 | 
						|
 | 
						|
    inline
 | 
						|
    char const *
 | 
						|
    diagnostic_information_what( exception const & e, bool verbose=true ) BOOST_NOEXCEPT_OR_NOTHROW
 | 
						|
        {
 | 
						|
        char const * w=0;
 | 
						|
#ifndef BOOST_NO_EXCEPTIONS
 | 
						|
        try
 | 
						|
            {
 | 
						|
#endif
 | 
						|
            (void) exception_detail::diagnostic_information_impl(&e,0,false,verbose);
 | 
						|
            if( char const * di=exception_detail::get_diagnostic_information(e,0) )
 | 
						|
                return di;
 | 
						|
            else
 | 
						|
                return "Failed to produce boost::diagnostic_information_what()";
 | 
						|
#ifndef BOOST_NO_EXCEPTIONS
 | 
						|
            }
 | 
						|
        catch(
 | 
						|
        ... )
 | 
						|
            {
 | 
						|
            }
 | 
						|
#endif
 | 
						|
        return w;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
#if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)
 | 
						|
#pragma warning(pop)
 | 
						|
#endif
 | 
						|
#endif
 |