LLVM API Documentation

Windows/system_error.inc
Go to the documentation of this file.
00001 //===- llvm/Support/Win32/system_error.inc - Windows error_code --*- C++ -*-===//
00002 //
00003 //                     The LLVM Compiler Infrastructure
00004 //
00005 // This file is distributed under the University of Illinois Open Source
00006 // License. See LICENSE.TXT for details.
00007 //
00008 //===----------------------------------------------------------------------===//
00009 //
00010 // This file provides the Windows specific implementation of the error_code
00011 // and error_condition classes.
00012 //
00013 //===----------------------------------------------------------------------===//
00014 
00015 //===----------------------------------------------------------------------===//
00016 //=== WARNING: Implementation here must contain only generic Windows code that
00017 //===          is guaranteed to work on *all* Windows variants.
00018 //===----------------------------------------------------------------------===//
00019 
00020 #include <windows.h>
00021 #include <winerror.h>
00022 
00023 using namespace llvm;
00024 
00025 std::string
00026 _system_error_category::message(int ev) const {
00027   LPVOID lpMsgBuf = 0;
00028   DWORD retval = ::FormatMessageA(
00029     FORMAT_MESSAGE_ALLOCATE_BUFFER |
00030     FORMAT_MESSAGE_FROM_SYSTEM |
00031     FORMAT_MESSAGE_IGNORE_INSERTS,
00032     NULL,
00033     ev,
00034     MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
00035     (LPSTR) &lpMsgBuf,
00036     0,
00037     NULL);
00038   if (retval == 0) {
00039     ::LocalFree(lpMsgBuf);
00040     return std::string("Unknown error");
00041   }
00042 
00043   std::string str( static_cast<LPCSTR>(lpMsgBuf) );
00044   ::LocalFree(lpMsgBuf);
00045 
00046   while (str.size()
00047      && (str[str.size()-1] == '\n' || str[str.size()-1] == '\r'))
00048     str.erase( str.size()-1 );
00049   if (str.size() && str[str.size()-1] == '.')
00050     str.erase( str.size()-1 );
00051   return str;
00052 }
00053 
00054 // I'd rather not double the line count of the following.
00055 #define MAP_ERR_TO_COND(x, y) case x: return make_error_condition(errc::y)
00056 
00057 error_condition
00058 _system_error_category::default_error_condition(int ev) const {
00059   switch (ev) {
00060   MAP_ERR_TO_COND(0, success);
00061   // Windows system -> posix_errno decode table  ---------------------------//
00062   // see WinError.h comments for descriptions of errors
00063   MAP_ERR_TO_COND(ERROR_ACCESS_DENIED,       permission_denied);
00064   MAP_ERR_TO_COND(ERROR_ALREADY_EXISTS,      file_exists);
00065   MAP_ERR_TO_COND(ERROR_BAD_UNIT,            no_such_device);
00066   MAP_ERR_TO_COND(ERROR_BUFFER_OVERFLOW,     filename_too_long);
00067   MAP_ERR_TO_COND(ERROR_BUSY,                device_or_resource_busy);
00068   MAP_ERR_TO_COND(ERROR_BUSY_DRIVE,          device_or_resource_busy);
00069   MAP_ERR_TO_COND(ERROR_CANNOT_MAKE,         permission_denied);
00070   MAP_ERR_TO_COND(ERROR_CANTOPEN,            io_error);
00071   MAP_ERR_TO_COND(ERROR_CANTREAD,            io_error);
00072   MAP_ERR_TO_COND(ERROR_CANTWRITE,           io_error);
00073   MAP_ERR_TO_COND(ERROR_CURRENT_DIRECTORY,   permission_denied);
00074   MAP_ERR_TO_COND(ERROR_DEV_NOT_EXIST,       no_such_device);
00075   MAP_ERR_TO_COND(ERROR_DEVICE_IN_USE,       device_or_resource_busy);
00076   MAP_ERR_TO_COND(ERROR_DIR_NOT_EMPTY,       directory_not_empty);
00077   MAP_ERR_TO_COND(ERROR_DIRECTORY,           invalid_argument);
00078   MAP_ERR_TO_COND(ERROR_DISK_FULL,           no_space_on_device);
00079   MAP_ERR_TO_COND(ERROR_FILE_EXISTS,         file_exists);
00080   MAP_ERR_TO_COND(ERROR_FILE_NOT_FOUND,      no_such_file_or_directory);
00081   MAP_ERR_TO_COND(ERROR_HANDLE_DISK_FULL,    no_space_on_device);
00082   MAP_ERR_TO_COND(ERROR_HANDLE_EOF,          value_too_large);
00083   MAP_ERR_TO_COND(ERROR_INVALID_ACCESS,      permission_denied);
00084   MAP_ERR_TO_COND(ERROR_INVALID_DRIVE,       no_such_device);
00085   MAP_ERR_TO_COND(ERROR_INVALID_FUNCTION,    function_not_supported);
00086   MAP_ERR_TO_COND(ERROR_INVALID_HANDLE,      invalid_argument);
00087   MAP_ERR_TO_COND(ERROR_INVALID_NAME,        invalid_argument);
00088   MAP_ERR_TO_COND(ERROR_LOCK_VIOLATION,      no_lock_available);
00089   MAP_ERR_TO_COND(ERROR_LOCKED,              no_lock_available);
00090   MAP_ERR_TO_COND(ERROR_NEGATIVE_SEEK,       invalid_argument);
00091   MAP_ERR_TO_COND(ERROR_NOACCESS,            permission_denied);
00092   MAP_ERR_TO_COND(ERROR_NOT_ENOUGH_MEMORY,   not_enough_memory);
00093   MAP_ERR_TO_COND(ERROR_NOT_READY,           resource_unavailable_try_again);
00094   MAP_ERR_TO_COND(ERROR_NOT_SAME_DEVICE,     cross_device_link);
00095   MAP_ERR_TO_COND(ERROR_OPEN_FAILED,         io_error);
00096   MAP_ERR_TO_COND(ERROR_OPEN_FILES,          device_or_resource_busy);
00097   MAP_ERR_TO_COND(ERROR_OPERATION_ABORTED,   operation_canceled);
00098   MAP_ERR_TO_COND(ERROR_OUTOFMEMORY,         not_enough_memory);
00099   MAP_ERR_TO_COND(ERROR_PATH_NOT_FOUND,      no_such_file_or_directory);
00100   MAP_ERR_TO_COND(ERROR_BAD_NETPATH,         no_such_file_or_directory);
00101   MAP_ERR_TO_COND(ERROR_READ_FAULT,          io_error);
00102   MAP_ERR_TO_COND(ERROR_RETRY,               resource_unavailable_try_again);
00103   MAP_ERR_TO_COND(ERROR_SEEK,                io_error);
00104   MAP_ERR_TO_COND(ERROR_SHARING_VIOLATION,   permission_denied);
00105   MAP_ERR_TO_COND(ERROR_TOO_MANY_OPEN_FILES, too_many_files_open);
00106   MAP_ERR_TO_COND(ERROR_WRITE_FAULT,         io_error);
00107   MAP_ERR_TO_COND(ERROR_WRITE_PROTECT,       permission_denied);
00108   MAP_ERR_TO_COND(ERROR_SEM_TIMEOUT,         timed_out);
00109   MAP_ERR_TO_COND(WSAEACCES,                 permission_denied);
00110   MAP_ERR_TO_COND(WSAEADDRINUSE,             address_in_use);
00111   MAP_ERR_TO_COND(WSAEADDRNOTAVAIL,          address_not_available);
00112   MAP_ERR_TO_COND(WSAEAFNOSUPPORT,           address_family_not_supported);
00113   MAP_ERR_TO_COND(WSAEALREADY,               connection_already_in_progress);
00114   MAP_ERR_TO_COND(WSAEBADF,                  bad_file_descriptor);
00115   MAP_ERR_TO_COND(WSAECONNABORTED,           connection_aborted);
00116   MAP_ERR_TO_COND(WSAECONNREFUSED,           connection_refused);
00117   MAP_ERR_TO_COND(WSAECONNRESET,             connection_reset);
00118   MAP_ERR_TO_COND(WSAEDESTADDRREQ,           destination_address_required);
00119   MAP_ERR_TO_COND(WSAEFAULT,                 bad_address);
00120   MAP_ERR_TO_COND(WSAEHOSTUNREACH,           host_unreachable);
00121   MAP_ERR_TO_COND(WSAEINPROGRESS,            operation_in_progress);
00122   MAP_ERR_TO_COND(WSAEINTR,                  interrupted);
00123   MAP_ERR_TO_COND(WSAEINVAL,                 invalid_argument);
00124   MAP_ERR_TO_COND(WSAEISCONN,                already_connected);
00125   MAP_ERR_TO_COND(WSAEMFILE,                 too_many_files_open);
00126   MAP_ERR_TO_COND(WSAEMSGSIZE,               message_size);
00127   MAP_ERR_TO_COND(WSAENAMETOOLONG,           filename_too_long);
00128   MAP_ERR_TO_COND(WSAENETDOWN,               network_down);
00129   MAP_ERR_TO_COND(WSAENETRESET,              network_reset);
00130   MAP_ERR_TO_COND(WSAENETUNREACH,            network_unreachable);
00131   MAP_ERR_TO_COND(WSAENOBUFS,                no_buffer_space);
00132   MAP_ERR_TO_COND(WSAENOPROTOOPT,            no_protocol_option);
00133   MAP_ERR_TO_COND(WSAENOTCONN,               not_connected);
00134   MAP_ERR_TO_COND(WSAENOTSOCK,               not_a_socket);
00135   MAP_ERR_TO_COND(WSAEOPNOTSUPP,             operation_not_supported);
00136   MAP_ERR_TO_COND(WSAEPROTONOSUPPORT,        protocol_not_supported);
00137   MAP_ERR_TO_COND(WSAEPROTOTYPE,             wrong_protocol_type);
00138   MAP_ERR_TO_COND(WSAETIMEDOUT,              timed_out);
00139   MAP_ERR_TO_COND(WSAEWOULDBLOCK,            operation_would_block);
00140   default: return error_condition(ev, system_category());
00141   }
00142 }