use git commit id as version
[litex.git] / software / libbase / errno.c
1 #include <string.h>
2 #include <errno.h>
3
4 int errno;
5
6 /************************************************************************
7 * Based on: lib/string/lib_strerror.c
8 *
9 * Copyright (C) 2007, 2009, 2011 Gregory Nutt. All rights reserved.
10 * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
11 *
12 * Redistribution and use in source and binary forms, with or without
13 * modification, are permitted provided that the following conditions
14 * are met:
15 *
16 * 1. Redistributions of source code must retain the above copyright
17 * notice, this list of conditions and the following disclaimer.
18 * 2. Redistributions in binary form must reproduce the above copyright
19 * notice, this list of conditions and the following disclaimer in
20 * the documentation and/or other materials provided with the
21 * distribution.
22 * 3. Neither the name NuttX nor the names of its contributors may be
23 * used to endorse or promote products derived from this software
24 * without specific prior written permission.
25 *
26 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
27 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
28 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
29 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
30 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
31 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
32 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
33 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
34 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
35 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
36 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
37 * POSSIBILITY OF SUCH DAMAGE.
38 *
39 ************************************************************************/
40
41 struct errno_strmap_s
42 {
43 int errnum;
44 char *str;
45 };
46
47 /* This table maps all error numbers to descriptive strings.
48 * The only assumption that the code makes with regard to this
49 * this table is that it is order by error number.
50 *
51 * The size of this table is quite large. Its size can be
52 * reduced by eliminating some of the more obscure error
53 * strings.
54 */
55
56 struct errno_strmap_s g_errnomap[] =
57 {
58 { EPERM, EPERM_STR },
59 { ENOENT, ENOENT_STR },
60 { ESRCH, ESRCH_STR },
61 { EINTR, EINTR_STR },
62 { EIO, EIO_STR },
63 { ENXIO, ENXIO_STR },
64 { E2BIG, E2BIG_STR },
65 { ENOEXEC, ENOEXEC_STR },
66 { EBADF, EBADF_STR },
67 { ECHILD, ECHILD_STR },
68 { EAGAIN, EAGAIN_STR },
69 { ENOMEM, ENOMEM_STR },
70 { EACCES, EACCES_STR },
71 { EFAULT, EFAULT_STR },
72 { ENOTBLK, ENOTBLK_STR },
73 { EBUSY, EBUSY_STR },
74 { EEXIST, EEXIST_STR },
75 { EXDEV, EXDEV_STR },
76 { ENODEV, ENODEV_STR },
77 { ENOTDIR, ENOTDIR_STR },
78 { EISDIR, EISDIR_STR },
79 { EINVAL, EINVAL_STR },
80 { ENFILE, ENFILE_STR },
81 { EMFILE, EMFILE_STR },
82 { ENOTTY, ENOTTY_STR },
83 { ETXTBSY, ETXTBSY_STR },
84 { EFBIG, EFBIG_STR },
85 { ENOSPC, ENOSPC_STR },
86 { ESPIPE, ESPIPE_STR },
87 { EROFS, EROFS_STR },
88 { EMLINK, EMLINK_STR },
89 { EPIPE, EPIPE_STR },
90 { EDOM, EDOM_STR },
91 { ERANGE, ERANGE_STR },
92 { EDEADLK, EDEADLK_STR },
93 { ENAMETOOLONG, ENAMETOOLONG_STR },
94 { ENOLCK, ENOLCK_STR },
95 { ENOSYS, ENOSYS_STR },
96 { ENOTEMPTY, ENOTEMPTY_STR },
97 { ELOOP, ELOOP_STR },
98 { ENOMSG, ENOMSG_STR },
99 { EIDRM, EIDRM_STR },
100 { ECHRNG, ECHRNG_STR },
101 { EL2NSYNC, EL2NSYNC_STR },
102 { EL3HLT, EL3HLT_STR },
103 { EL3RST, EL3RST_STR },
104 { ELNRNG, ELNRNG_STR },
105 { EUNATCH, EUNATCH_STR },
106 { ENOCSI, ENOCSI_STR },
107 { EL2HLT, EL2HLT_STR },
108 { EBADE, EBADE_STR },
109 { EBADR, EBADR_STR },
110 { EXFULL, EXFULL_STR },
111 { ENOANO, ENOANO_STR },
112 { EBADRQC, EBADRQC_STR },
113 { EBADSLT, EBADSLT_STR },
114 { EBFONT, EBFONT_STR },
115 { ENOSTR, ENOSTR_STR },
116 { ENODATA, ENODATA_STR },
117 { ETIME, ETIME_STR },
118 { ENOSR, ENOSR_STR },
119 { ENONET, ENONET_STR },
120 { ENOPKG, ENOPKG_STR },
121 { EREMOTE, EREMOTE_STR },
122 { ENOLINK, ENOLINK_STR },
123 { EADV, EADV_STR },
124 { ESRMNT, ESRMNT_STR },
125 { ECOMM, ECOMM_STR },
126 { EPROTO, EPROTO_STR },
127 { EMULTIHOP, EMULTIHOP_STR },
128 { EDOTDOT, EDOTDOT_STR },
129 { EBADMSG, EBADMSG_STR },
130 { EOVERFLOW, EOVERFLOW_STR },
131 { ENOTUNIQ, ENOTUNIQ_STR },
132 { EBADFD, EBADFD_STR },
133 { EREMCHG, EREMCHG_STR },
134 { ELIBACC, ELIBACC_STR },
135 { ELIBBAD, ELIBBAD_STR },
136 { ELIBSCN, ELIBSCN_STR },
137 { ELIBMAX, ELIBMAX_STR },
138 { ELIBEXEC, ELIBEXEC_STR },
139 { EILSEQ, EILSEQ_STR },
140 { ERESTART, ERESTART_STR },
141 { ESTRPIPE, ESTRPIPE_STR },
142 { EUSERS, EUSERS_STR },
143 { ENOTSOCK, ENOTSOCK_STR },
144 { EDESTADDRREQ, EDESTADDRREQ_STR },
145 { EMSGSIZE, EMSGSIZE_STR },
146 { EPROTOTYPE, EPROTOTYPE_STR },
147 { ENOPROTOOPT, ENOPROTOOPT_STR },
148 { EPROTONOSUPPORT, EPROTONOSUPPORT_STR },
149 { ESOCKTNOSUPPORT, ESOCKTNOSUPPORT_STR },
150 { EOPNOTSUPP, EOPNOTSUPP_STR },
151 { EPFNOSUPPORT, EPFNOSUPPORT_STR },
152 { EAFNOSUPPORT, EAFNOSUPPORT_STR },
153 { EADDRINUSE, EADDRINUSE_STR },
154 { EADDRNOTAVAIL, EADDRNOTAVAIL_STR },
155 { ENETDOWN, ENETDOWN_STR },
156 { ENETUNREACH, ENETUNREACH_STR },
157 { ENETRESET, ENETRESET_STR },
158 { ECONNABORTED, ECONNABORTED_STR },
159 { ECONNRESET, ECONNRESET_STR },
160 { ENOBUFS, ENOBUFS_STR },
161 { EISCONN, EISCONN_STR },
162 { ENOTCONN, ENOTCONN_STR },
163 { ESHUTDOWN, ESHUTDOWN_STR },
164 { ETOOMANYREFS, ETOOMANYREFS_STR },
165 { ETIMEDOUT, ETIMEDOUT_STR },
166 { ECONNREFUSED, ECONNREFUSED_STR },
167 { EHOSTDOWN, EHOSTDOWN_STR },
168 { EHOSTUNREACH, EHOSTUNREACH_STR },
169 { EALREADY, EALREADY_STR },
170 { EINPROGRESS, EINPROGRESS_STR },
171 { ESTALE, ESTALE_STR },
172 { EUCLEAN, EUCLEAN_STR },
173 { ENOTNAM, ENOTNAM_STR },
174 { ENAVAIL, ENAVAIL_STR },
175 { EISNAM, EISNAM_STR },
176 { EREMOTEIO, EREMOTEIO_STR },
177 { EDQUOT, EDQUOT_STR },
178 { ENOMEDIUM, ENOMEDIUM_STR },
179 { EMEDIUMTYPE, EMEDIUMTYPE_STR }
180 };
181
182 #define NERRNO_STRS (sizeof(g_errnomap) / sizeof(struct errno_strmap_s))
183
184 char *strerror(int errnum)
185 {
186 int ndxlow = 0;
187 int ndxhi = NERRNO_STRS - 1;
188 int ndxmid;
189
190 do
191 {
192 ndxmid = (ndxlow + ndxhi) >> 1;
193 if (errnum > g_errnomap[ndxmid].errnum)
194 {
195 ndxlow = ndxmid + 1;
196 }
197 else if (errnum < g_errnomap[ndxmid].errnum)
198 {
199 ndxhi = ndxmid - 1;
200 }
201 else
202 {
203 return g_errnomap[ndxmid].str;
204 }
205 }
206 while (ndxlow <= ndxhi);
207 return "Unknown error";
208 }