#include <exception>
 
typedef enum foo_Result {
    FOO_OK,
    FOO_ERROR1,
    FOO_ERROR2,
    FOO_UNKNOWN
} foo_Result;
 
struct MyException1 { };
struct MyException2 { };
 
foo_Result lippincott()
try
{
    try
    {
        if (std::exception_ptr eptr = std::current_exception())
        {
            std::rethrow_exception(eptr);
        }
        else
        {
            return FOO_UNKNOWN;
        }
    }
    catch (const MyException1&)
    {
        return FOO_ERROR1;
    }
    catch (const MyException2&)
    {
        return FOO_ERROR2;
    }
    catch (...)
    {
        return FOO_UNKNOWN;
    }
}
catch (...)
{
    return FOO_UNKNOWN;
}
 
//////////////////////////
 
void Snafuscate(bool andDie)
{
	if (andDie)
	{
		throw MyException1();
	}
}
 
foo_Result foo_snafuscate(bool andDie)
{
	try
	{
		Snafuscate(andDie);
		return FOO_OK;
	}
	catch (...)
	{
		return lippincott();
	}
}
 
#include <iostream>
 
int main()
{
	foo_Result r1 = foo_snafuscate(false);
	if (r1 == FOO_OK) std::cout << "r1 == FOO_OK\n";
 
	foo_Result r2 = foo_snafuscate(true);
	if (r2 != FOO_OK) std::cout << "r2 != FOO_OK (r2 == " << r2 << ")\n";
}
				I2luY2x1ZGUgPGV4Y2VwdGlvbj4KCnR5cGVkZWYgZW51bSBmb29fUmVzdWx0IHsKICAgIEZPT19PSywKICAgIEZPT19FUlJPUjEsCiAgICBGT09fRVJST1IyLAogICAgRk9PX1VOS05PV04KfSBmb29fUmVzdWx0OwoKc3RydWN0IE15RXhjZXB0aW9uMSB7IH07CnN0cnVjdCBNeUV4Y2VwdGlvbjIgeyB9OwoKZm9vX1Jlc3VsdCBsaXBwaW5jb3R0KCkKdHJ5CnsKICAgIHRyeQogICAgewogICAgICAgIGlmIChzdGQ6OmV4Y2VwdGlvbl9wdHIgZXB0ciA9IHN0ZDo6Y3VycmVudF9leGNlcHRpb24oKSkKICAgICAgICB7CiAgICAgICAgICAgIHN0ZDo6cmV0aHJvd19leGNlcHRpb24oZXB0cik7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBGT09fVU5LTk9XTjsKICAgICAgICB9CiAgICB9CiAgICBjYXRjaCAoY29uc3QgTXlFeGNlcHRpb24xJikKICAgIHsKICAgICAgICByZXR1cm4gRk9PX0VSUk9SMTsKICAgIH0KICAgIGNhdGNoIChjb25zdCBNeUV4Y2VwdGlvbjImKQogICAgewogICAgICAgIHJldHVybiBGT09fRVJST1IyOwogICAgfQogICAgY2F0Y2ggKC4uLikKICAgIHsKICAgICAgICByZXR1cm4gRk9PX1VOS05PV047CiAgICB9Cn0KY2F0Y2ggKC4uLikKewogICAgcmV0dXJuIEZPT19VTktOT1dOOwp9CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKdm9pZCBTbmFmdXNjYXRlKGJvb2wgYW5kRGllKQp7CglpZiAoYW5kRGllKQoJewoJCXRocm93IE15RXhjZXB0aW9uMSgpOwoJfQp9Cgpmb29fUmVzdWx0IGZvb19zbmFmdXNjYXRlKGJvb2wgYW5kRGllKQp7Cgl0cnkKCXsKCQlTbmFmdXNjYXRlKGFuZERpZSk7CgkJcmV0dXJuIEZPT19PSzsKCX0KCWNhdGNoICguLi4pCgl7CgkJcmV0dXJuIGxpcHBpbmNvdHQoKTsKCX0KfQoKI2luY2x1ZGUgPGlvc3RyZWFtPgoKaW50IG1haW4oKQp7Cglmb29fUmVzdWx0IHIxID0gZm9vX3NuYWZ1c2NhdGUoZmFsc2UpOwoJaWYgKHIxID09IEZPT19PSykgc3RkOjpjb3V0IDw8ICJyMSA9PSBGT09fT0tcbiI7CgkKCWZvb19SZXN1bHQgcjIgPSBmb29fc25hZnVzY2F0ZSh0cnVlKTsKCWlmIChyMiAhPSBGT09fT0spIHN0ZDo6Y291dCA8PCAicjIgIT0gRk9PX09LIChyMiA9PSAiIDw8IHIyIDw8ICIpXG4iOwp9