Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenstrerror.c
Go to the documentation of this file.
00001 /* 00002 * msvcrt.dll errno functions 00003 * 00004 * Copyright 2000 Jon Griffiths 00005 * 00006 * This library is free software; you can redistribute it and/or 00007 * modify it under the terms of the GNU Lesser General Public 00008 * License as published by the Free Software Foundation; either 00009 * version 2.1 of the License, or (at your option) any later version. 00010 * 00011 * This library is distributed in the hope that it will be useful, 00012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00014 * Lesser General Public License for more details. 00015 * 00016 * You should have received a copy of the GNU Lesser General Public 00017 * License along with this library; if not, write to the Free Software 00018 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 00019 */ 00020 00021 #include <precomp.h> 00022 00023 char __syserr00[] = "No Error"; 00024 char __syserr01[] = "Operation not permitted (EPERM)"; 00025 char __syserr02[] = "No such file or directory (ENOENT)"; 00026 char __syserr03[] = "No such process (ESRCH)"; 00027 char __syserr04[] = "Interrupted system call (EINTR)"; 00028 char __syserr05[] = "Input or output error (EIO)"; 00029 char __syserr06[] = "No such device or address (ENXIO)"; 00030 char __syserr07[] = "Argument list too long (E2BIG)"; 00031 char __syserr08[] = "Unable to execute file (ENOEXEC)"; 00032 char __syserr09[] = "Bad file descriptor (EBADF)"; 00033 char __syserr10[] = "No child processes (ECHILD)"; 00034 char __syserr11[] = "Resource temporarily unavailable (EAGAIN)"; 00035 char __syserr12[] = "Not enough memory (ENOMEM)"; 00036 char __syserr13[] = "Permission denied (EACCES)"; 00037 char __syserr14[] = "Bad address (EFAULT)"; 00038 char __syserr15[] = "Unknown Error: 15"; 00039 char __syserr16[] = "Resource busy (EBUSY)"; 00040 char __syserr17[] = "File exists (EEXIST)"; 00041 char __syserr18[] = "Improper link (EXDEV)"; 00042 char __syserr19[] = "No such device (ENODEV)"; 00043 char __syserr20[] = "Not a directory (ENOTDIR)"; 00044 char __syserr21[] = "Is a directory (EISDIR)"; 00045 char __syserr22[] = "Invalid argument (EINVAL)"; 00046 char __syserr23[] = "Too many open files in system (ENFILE)"; 00047 char __syserr24[] = "Too many open files (EMFILE)"; 00048 char __syserr25[] = "Inappropriate I/O control operation (ENOTTY)"; 00049 char __syserr26[] = "Unknown error: 26"; 00050 char __syserr27[] = "File too large (EFBIG)"; 00051 char __syserr28[] = "No space left on drive (ENOSPC)"; 00052 char __syserr29[] = "Invalid seek (ESPIPE)"; 00053 char __syserr30[] = "Read-only file system (EROFS)"; 00054 char __syserr31[] = "Too many links (EMLINK)"; 00055 char __syserr32[] = "Broken pipe (EPIPE)"; 00056 char __syserr33[] = "Input to function out of range (EDOM)"; 00057 char __syserr34[] = "Output of function out of range (ERANGE)"; 00058 char __syserr35[] = "Unknown error: 35"; 00059 char __syserr36[] = "Resource deadlock avoided (EDEADLK)"; 00060 char __syserr37[] = "Unknown error: 37"; 00061 char __syserr38[] = "File name too long (ENAMETOOLONG)"; 00062 char __syserr39[] = "No locks available (ENOLCK)"; 00063 char __syserr40[] = "Function not implemented (ENOSYS)"; 00064 char __syserr41[] = "Directory not empty (ENOTEMPTY)"; 00065 char __syserr42[] = "Illegal byte sequence (EILSEQ)"; 00066 00067 char *_sys_errlist[] = { 00068 __syserr00, __syserr01, __syserr02, __syserr03, __syserr04, 00069 __syserr05, __syserr06, __syserr07, __syserr08, __syserr09, 00070 __syserr10, __syserr11, __syserr12, __syserr13, __syserr14, 00071 __syserr15, __syserr16, __syserr17, __syserr18, __syserr19, 00072 __syserr20, __syserr21, __syserr22, __syserr23, __syserr24, 00073 __syserr25, __syserr26, __syserr27, __syserr28, __syserr29, 00074 __syserr30, __syserr31, __syserr32, __syserr33, __syserr34, 00075 __syserr35, __syserr36, __syserr37, __syserr38, __syserr39, 00076 __syserr40, __syserr41, __syserr42 00077 }; 00078 00079 int _sys_nerr = sizeof(_sys_errlist) / sizeof(_sys_errlist[0]) - 1; 00080 00081 /********************************************************************* 00082 * strerror (MSVCRT.@) 00083 */ 00084 char* CDECL strerror(int err) 00085 { 00086 thread_data_t *data = msvcrt_get_thread_data(); 00087 00088 if (!data->strerror_buffer) 00089 if (!(data->strerror_buffer = malloc(256))) return NULL; 00090 00091 if (err < 0 || err > _sys_nerr) err = _sys_nerr; 00092 strcpy( data->strerror_buffer, _sys_errlist[err] ); 00093 return data->strerror_buffer; 00094 } 00095 00096 /********************************************************************** 00097 * strerror_s (MSVCRT.@) 00098 */ 00099 int CDECL strerror_s(char *buffer, size_t numberOfElements, int errnum) 00100 { 00101 char *ptr; 00102 00103 if (!buffer || !numberOfElements) 00104 { 00105 *_errno() = EINVAL; 00106 return EINVAL; 00107 } 00108 00109 if (errnum < 0 || errnum > _sys_nerr) 00110 errnum = _sys_nerr; 00111 00112 ptr = _sys_errlist[errnum]; 00113 while (*ptr && numberOfElements > 1) 00114 { 00115 *buffer++ = *ptr++; 00116 numberOfElements--; 00117 } 00118 00119 *buffer = '\0'; 00120 return 0; 00121 } 00122 00123 /********************************************************************** 00124 * _strerror (MSVCRT.@) 00125 */ 00126 char* CDECL _strerror(const char* str) 00127 { 00128 thread_data_t *data = msvcrt_get_thread_data(); 00129 int err; 00130 00131 if (!data->strerror_buffer) 00132 if (!(data->strerror_buffer = malloc(256))) return NULL; 00133 00134 err = data->thread_errno; 00135 if (err < 0 || err > _sys_nerr) err = _sys_nerr; 00136 00137 if (str && *str) 00138 sprintf( data->strerror_buffer, "%s: %s\n", str, _sys_errlist[err] ); 00139 else 00140 sprintf( data->strerror_buffer, "%s\n", _sys_errlist[err] ); 00141 00142 return data->strerror_buffer; 00143 } 00144 00145 /********************************************************************* 00146 * perror (MSVCRT.@) 00147 */ 00148 void CDECL perror(const char* str) 00149 { 00150 int err = *_errno(); 00151 if (err < 0 || err > _sys_nerr) err = _sys_nerr; 00152 00153 if (str && *str) 00154 { 00155 _write( 2, str, strlen(str) ); 00156 _write( 2, ": ", 2 ); 00157 } 00158 _write( 2, _sys_errlist[err], strlen(_sys_errlist[err]) ); 00159 _write( 2, "\n", 1 ); 00160 } 00161 00162 /********************************************************************* 00163 * _wcserror_s (MSVCRT.@) 00164 */ 00165 int CDECL _wcserror_s(wchar_t* buffer, size_t nc, int err) 00166 { 00167 if (!MSVCRT_CHECK_PMT(buffer != NULL) || !MSVCRT_CHECK_PMT(nc > 0)) 00168 { 00169 _set_errno(EINVAL); 00170 return EINVAL; 00171 } 00172 if (err < 0 || err > _sys_nerr) err = _sys_nerr; 00173 MultiByteToWideChar(CP_ACP, 0, _sys_errlist[err], -1, buffer, nc); 00174 return 0; 00175 } 00176 00177 /********************************************************************* 00178 * _wcserror (MSVCRT.@) 00179 */ 00180 wchar_t* CDECL _wcserror(int err) 00181 { 00182 thread_data_t *data = msvcrt_get_thread_data(); 00183 00184 if (!data->wcserror_buffer) 00185 if (!(data->wcserror_buffer = malloc(256 * sizeof(wchar_t)))) return NULL; 00186 _wcserror_s(data->wcserror_buffer, 256, err); 00187 return data->wcserror_buffer; 00188 } 00189 00190 /********************************************************************** 00191 * __wcserror_s (MSVCRT.@) 00192 */ 00193 int CDECL __wcserror_s(wchar_t* buffer, size_t nc, const wchar_t* str) 00194 { 00195 int err; 00196 static const WCHAR colonW[] = {':', ' ', '\0'}; 00197 static const WCHAR nlW[] = {'\n', '\0'}; 00198 size_t len; 00199 00200 err = *_errno(); 00201 if (err < 0 || err > _sys_nerr) err = _sys_nerr; 00202 00203 len = MultiByteToWideChar(CP_ACP, 0, _sys_errlist[err], -1, NULL, 0) + 1 /* \n */; 00204 if (str && *str) len += lstrlenW(str) + 2 /* ': ' */; 00205 if (len > nc) 00206 { 00207 MSVCRT_INVALID_PMT("buffer[nc] is too small"); 00208 _set_errno(ERANGE); 00209 return ERANGE; 00210 } 00211 if (str && *str) 00212 { 00213 lstrcpyW(buffer, str); 00214 lstrcatW(buffer, colonW); 00215 } 00216 else buffer[0] = '\0'; 00217 len = lstrlenW(buffer); 00218 MultiByteToWideChar(CP_ACP, 0, _sys_errlist[err], -1, buffer + len, 256 - len); 00219 lstrcatW(buffer, nlW); 00220 00221 return 0; 00222 } 00223 00224 /********************************************************************** 00225 * __wcserror (MSVCRT.@) 00226 */ 00227 wchar_t* CDECL __wcserror(const wchar_t* str) 00228 { 00229 thread_data_t *data = msvcrt_get_thread_data(); 00230 int err; 00231 00232 if (!data->wcserror_buffer) 00233 if (!(data->wcserror_buffer = malloc(256 * sizeof(wchar_t)))) return NULL; 00234 00235 err = __wcserror_s(data->wcserror_buffer, 256, str); 00236 if (err) FIXME("bad wcserror call (%d)\n", err); 00237 00238 return data->wcserror_buffer; 00239 } Generated on Sat May 26 2012 04:35:36 for ReactOS by
1.7.6.1
|