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