1218885Sdim//===---------------------- system_error.cpp ------------------------------===// 2218885Sdim// 3218885Sdim// The LLVM Compiler Infrastructure 4218885Sdim// 5218885Sdim// This file is distributed under the University of Illinois Open Source 6218885Sdim// License. See LICENSE.TXT for details. 7218885Sdim// 8218885Sdim//===----------------------------------------------------------------------===// 9218885Sdim// 10218885Sdim// This was lifted from libc++ and modified for C++03. 11218885Sdim// 12218885Sdim//===----------------------------------------------------------------------===// 13218885Sdim 14218885Sdim#include "llvm/Support/system_error.h" 15218885Sdim#include "llvm/Support/Errno.h" 16249423Sdim#include <cstring> 17218885Sdim#include <string> 18218885Sdim 19218885Sdimnamespace llvm { 20218885Sdim 21218885Sdim// class error_category 22218885Sdim 23218885Sdimerror_category::error_category() { 24218885Sdim} 25218885Sdim 26218885Sdimerror_category::~error_category() { 27218885Sdim} 28218885Sdim 29218885Sdimerror_condition 30218885Sdimerror_category::default_error_condition(int ev) const { 31218885Sdim return error_condition(ev, *this); 32218885Sdim} 33218885Sdim 34218885Sdimbool 35218885Sdimerror_category::equivalent(int code, const error_condition& condition) const { 36218885Sdim return default_error_condition(code) == condition; 37218885Sdim} 38218885Sdim 39218885Sdimbool 40218885Sdimerror_category::equivalent(const error_code& code, int condition) const { 41218885Sdim return *this == code.category() && code.value() == condition; 42218885Sdim} 43218885Sdim 44218885Sdimstd::string 45218885Sdim_do_message::message(int ev) const { 46218885Sdim return std::string(sys::StrError(ev)); 47218885Sdim} 48218885Sdim 49218885Sdimclass _generic_error_category : public _do_message { 50218885Sdimpublic: 51243830Sdim virtual const char* name() const LLVM_OVERRIDE; 52243830Sdim virtual std::string message(int ev) const LLVM_OVERRIDE; 53218885Sdim}; 54218885Sdim 55218885Sdimconst char* 56218885Sdim_generic_error_category::name() const { 57218885Sdim return "generic"; 58218885Sdim} 59218885Sdim 60218885Sdimstd::string 61218885Sdim_generic_error_category::message(int ev) const { 62218885Sdim#ifdef ELAST 63218885Sdim if (ev > ELAST) 64218885Sdim return std::string("unspecified generic_category error"); 65218885Sdim#endif // ELAST 66218885Sdim return _do_message::message(ev); 67218885Sdim} 68218885Sdim 69218885Sdimconst error_category& 70218885Sdimgeneric_category() { 71218885Sdim static _generic_error_category s; 72218885Sdim return s; 73218885Sdim} 74218885Sdim 75218885Sdimclass _system_error_category : public _do_message { 76218885Sdimpublic: 77243830Sdim virtual const char* name() const LLVM_OVERRIDE; 78243830Sdim virtual std::string message(int ev) const LLVM_OVERRIDE; 79243830Sdim virtual error_condition default_error_condition(int ev) const LLVM_OVERRIDE; 80218885Sdim}; 81218885Sdim 82218885Sdimconst char* 83218885Sdim_system_error_category::name() const { 84218885Sdim return "system"; 85218885Sdim} 86218885Sdim 87218885Sdim// std::string _system_error_category::message(int ev) const { 88218885Sdim// Is in Platform/system_error.inc 89218885Sdim 90218885Sdim// error_condition _system_error_category::default_error_condition(int ev) const 91218885Sdim// Is in Platform/system_error.inc 92218885Sdim 93218885Sdimconst error_category& 94218885Sdimsystem_category() { 95218885Sdim static _system_error_category s; 96218885Sdim return s; 97218885Sdim} 98218885Sdim 99218885Sdimconst error_category& 100218885Sdimposix_category() { 101218885Sdim#ifdef LLVM_ON_WIN32 102218885Sdim return generic_category(); 103218885Sdim#else 104218885Sdim return system_category(); 105218885Sdim#endif 106218885Sdim} 107218885Sdim 108218885Sdim// error_condition 109218885Sdim 110218885Sdimstd::string 111218885Sdimerror_condition::message() const { 112218885Sdim return _cat_->message(_val_); 113218885Sdim} 114218885Sdim 115218885Sdim// error_code 116218885Sdim 117218885Sdimstd::string 118218885Sdimerror_code::message() const { 119218885Sdim return _cat_->message(_val_); 120218885Sdim} 121218885Sdim 122218885Sdim} // end namespace llvm 123218885Sdim 124218885Sdim// Include the truly platform-specific parts of this class. 125218885Sdim#if defined(LLVM_ON_UNIX) 126218885Sdim#include "Unix/system_error.inc" 127218885Sdim#endif 128218885Sdim#if defined(LLVM_ON_WIN32) 129218885Sdim#include "Windows/system_error.inc" 130218885Sdim#endif 131