Home | History | Annotate | Download | only in Support
      1 //===---------------------- system_error.cpp ------------------------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This was lifted from libc++ and modified for C++03.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #include "llvm/Support/system_error.h"
     15 #include "llvm/Support/Errno.h"
     16 #include <cstring>
     17 #include <string>
     18 
     19 namespace llvm {
     20 
     21 // class error_category
     22 
     23 error_category::error_category() {
     24 }
     25 
     26 error_category::~error_category() {
     27 }
     28 
     29 error_condition
     30 error_category::default_error_condition(int ev) const {
     31   return error_condition(ev, *this);
     32 }
     33 
     34 bool
     35 error_category::equivalent(int code, const error_condition& condition) const {
     36   return default_error_condition(code) == condition;
     37 }
     38 
     39 bool
     40 error_category::equivalent(const error_code& code, int condition) const {
     41   return *this == code.category() && code.value() == condition;
     42 }
     43 
     44 std::string
     45 _do_message::message(int ev) const {
     46   return std::string(sys::StrError(ev));
     47 }
     48 
     49 class _generic_error_category : public _do_message {
     50 public:
     51   virtual const char* name() const LLVM_OVERRIDE;
     52   virtual std::string message(int ev) const LLVM_OVERRIDE;
     53 };
     54 
     55 const char*
     56 _generic_error_category::name() const {
     57   return "generic";
     58 }
     59 
     60 std::string
     61 _generic_error_category::message(int ev) const {
     62 #ifdef ELAST
     63   if (ev > ELAST)
     64     return std::string("unspecified generic_category error");
     65 #endif  // ELAST
     66   return _do_message::message(ev);
     67 }
     68 
     69 const error_category&
     70 generic_category() {
     71   static _generic_error_category s;
     72   return s;
     73 }
     74 
     75 class _system_error_category : public _do_message {
     76 public:
     77   virtual const char* name() const LLVM_OVERRIDE;
     78   virtual std::string message(int ev) const LLVM_OVERRIDE;
     79   virtual error_condition default_error_condition(int ev) const LLVM_OVERRIDE;
     80 };
     81 
     82 const char*
     83 _system_error_category::name() const {
     84   return "system";
     85 }
     86 
     87 // std::string _system_error_category::message(int ev) const {
     88 // Is in Platform/system_error.inc
     89 
     90 // error_condition _system_error_category::default_error_condition(int ev) const
     91 // Is in Platform/system_error.inc
     92 
     93 const error_category&
     94 system_category() {
     95   static _system_error_category s;
     96   return s;
     97 }
     98 
     99 const error_category&
    100 posix_category() {
    101 #ifdef LLVM_ON_WIN32
    102   return generic_category();
    103 #else
    104   return system_category();
    105 #endif
    106 }
    107 
    108 // error_condition
    109 
    110 std::string
    111 error_condition::message() const {
    112   return _cat_->message(_val_);
    113 }
    114 
    115 // error_code
    116 
    117 std::string
    118 error_code::message() const {
    119   return _cat_->message(_val_);
    120 }
    121 
    122 } // end namespace llvm
    123 
    124 // Include the truly platform-specific parts of this class.
    125 #if defined(LLVM_ON_UNIX)
    126 #include "Unix/system_error.inc"
    127 #endif
    128 #if defined(LLVM_ON_WIN32)
    129 #include "Windows/system_error.inc"
    130 #endif
    131