ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

strerror.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.