update for HEAD-2003091401
[reactos.git] / lib / msvcrt / string / strerror.c
1 /* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
2 #include <msvcrt/string.h>
3 #include <msvcrt/stdlib.h>
4 #include <msvcrt/errno.h>
5
6
7 char __syserr00[] = "No Error";
8 char __syserr01[] = "Operation not permitted (EPERM)";
9 char __syserr02[] = "No such file or directory (ENOENT)";
10 char __syserr03[] = "No such process (ESRCH)";
11 char __syserr04[] = "Interrupted system call (EINTR)";
12 char __syserr05[] = "Input or output error (EIO)";
13 char __syserr06[] = "No such device or address (ENXIO)";
14 char __syserr07[] = "Argument list too long (E2BIG)";
15 char __syserr08[] = "Unable to execute file (ENOEXEC)";
16 char __syserr09[] = "Bad file descriptor (EBADF)";
17 char __syserr10[] = "No child processes (ECHILD)";
18 char __syserr11[] = "Resource temporarily unavailable (EAGAIN)";
19 char __syserr12[] = "Not enough memory (ENOMEM)";
20 char __syserr13[] = "Permission denied (EACCES)";
21 char __syserr14[] = "Bad address (EFAULT)";
22 char __syserr15[] = "Unknown Error: 15";
23 char __syserr16[] = "Resource busy (EBUSY)";
24 char __syserr17[] = "File exists (EEXIST)";
25 char __syserr18[] = "Improper link (EXDEV)";
26 char __syserr19[] = "No such device (ENODEV)";
27 char __syserr20[] = "Not a directory (ENOTDIR)";
28 char __syserr21[] = "Is a directory (EISDIR)";
29 char __syserr22[] = "Invalid argument (EINVAL)";
30 char __syserr23[] = "Too many open files in system (ENFILE)";
31 char __syserr24[] = "Too many open files (EMFILE)";
32 char __syserr25[] = "Inappropriate I/O control operation (ENOTTY)";
33 char __syserr26[] = "Unknown error: 26";
34 char __syserr27[] = "File too large (EFBIG)";
35 char __syserr28[] = "No space left on drive (ENOSPC)";
36 char __syserr29[] = "Invalid seek (ESPIPE)";
37 char __syserr30[] = "Read-only file system (EROFS)";
38 char __syserr31[] = "Too many links (EMLINK)";
39 char __syserr32[] = "Broken pipe (EPIPE)";
40 char __syserr33[] = "Input to function out of range (EDOM)";
41 char __syserr34[] = "Output of function out of range (ERANGE)";
42 char __syserr35[] = "Unknown error: 35";
43 char __syserr36[] = "Resource deadlock avoided (EDEADLK)";
44 char __syserr37[] = "Unknown error: 37";
45 char __syserr38[] = "File name too long (ENAMETOOLONG)";
46 char __syserr39[] = "No locks available (ENOLCK)";
47 char __syserr40[] = "Function not implemented (ENOSYS)";
48 char __syserr41[] = "Directory not empty (ENOTEMPTY)";
49 char __syserr42[] = "Illegal byte sequence (EILSEQ)";
50
51
52
53
54 const char *_sys_errlist[] = {
55 __syserr00, __syserr01, __syserr02, __syserr03, __syserr04,
56 __syserr05, __syserr06, __syserr07, __syserr08, __syserr09,
57 __syserr10, __syserr11, __syserr12, __syserr13, __syserr14,
58 __syserr15, __syserr16, __syserr17, __syserr18, __syserr19,
59 __syserr20, __syserr21, __syserr22, __syserr23, __syserr24,
60 __syserr25, __syserr26, __syserr27, __syserr28, __syserr29,
61 __syserr30, __syserr31, __syserr32, __syserr33, __syserr34,
62 __syserr35, __syserr36, __syserr37, __syserr38, __syserr39,
63 __syserr40, __syserr41, __syserr42
64 };
65
66 int __sys_nerr = sizeof(_sys_errlist) / sizeof(_sys_errlist[0]);
67
68 int* _sys_nerr = &__sys_nerr;
69
70 /*
71  * @implemented
72  */
73 char *strerror(int errnum)
74 {
75   static char ebuf[40];         /* 64-bit number + slop */
76   char *cp;
77   int v=1000000, lz=0;
78
79   if (errnum >= 0 && errnum < __sys_nerr)
80     return((char *)_sys_errlist[errnum]);
81
82   strcpy(ebuf, "Unknown error: ");
83   cp = ebuf + 15;
84   if (errnum < 0)
85   {
86     *cp++ = '-';
87     errnum = -errnum;
88   }
89   while (v)
90   {
91     int d = errnum / v;
92     if (d || lz || (v == 1))
93     {
94       *cp++ = d+'0';
95       lz = 1;
96     }
97     errnum %= v;
98     v /= 10;
99   }
100
101   return ebuf;
102 }
103
104
105 /*
106  * @implemented
107  */
108 char *_strerror(const char *s)
109 {
110         if ( s == NULL )
111                 return strerror(*_errno());
112
113         return strerror(atoi(s));
114 }