GNU Octave  9.1.0
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
oct-errno.in.cc
Go to the documentation of this file.
1 // %NO_EDIT_WARNING%
2 
3 ////////////////////////////////////////////////////////////////////////
4 //
5 // Copyright (C) 2005-2024 The Octave Project Developers
6 //
7 // See the file COPYRIGHT.md in the top-level directory of this
8 // distribution or <https://octave.org/copyright/>.
9 //
10 // This file is part of Octave.
11 //
12 // Octave is free software: you can redistribute it and/or modify it
13 // under the terms of the GNU General Public License as published by
14 // the Free Software Foundation, either version 3 of the License, or
15 // (at your option) any later version.
16 //
17 // Octave is distributed in the hope that it will be useful, but
18 // WITHOUT ANY WARRANTY; without even the implied warranty of
19 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 // GNU General Public License for more details.
21 //
22 // You should have received a copy of the GNU General Public License
23 // along with Octave; see the file COPYING. If not, see
24 // <https://www.gnu.org/licenses/>.
25 //
26 ////////////////////////////////////////////////////////////////////////
27 
28 #if defined (HAVE_CONFIG_H)
29 # include "config.h"
30 #endif
31 
32 #include <cerrno>
33 
34 #include "singleton-cleanup.h"
35 
36 #include "oct-errno.h"
37 #include "oct-map.h"
38 #include "error.h"
39 
40 octave_errno *octave_errno::s_instance = nullptr;
41 
43 {
44  struct errno_struct
45  {
46  const char *name;
47  int value;
48  };
49 
50  static errno_struct errno_codes[] =
51  {
52  // POSIX.
53 
54 #if defined (E2BIG)
55  { "E2BIG", E2BIG },
56 #endif
57 #if defined (EACCES)
58  { "EACCES", EACCES },
59 #endif
60 #if defined (EADDRINUSE)
61  { "EADDRINUSE", EADDRINUSE },
62 #endif
63 #if defined (EADDRNOTAVAIL)
64  { "EADDRNOTAVAIL", EADDRNOTAVAIL },
65 #endif
66 #if defined (EAFNOSUPPORT)
67  { "EAFNOSUPPORT", EAFNOSUPPORT },
68 #endif
69 #if defined (EAGAIN)
70  { "EAGAIN", EAGAIN },
71 #endif
72 #if defined (EALREADY)
73  { "EALREADY", EALREADY },
74 #endif
75 #if defined (EBADF)
76  { "EBADF", EBADF },
77 #endif
78 #if defined (EBUSY)
79  { "EBUSY", EBUSY },
80 #endif
81 #if defined (ECHILD)
82  { "ECHILD", ECHILD },
83 #endif
84 #if defined (ECONNABORTED)
85  { "ECONNABORTED", ECONNABORTED },
86 #endif
87 #if defined (ECONNREFUSED)
88  { "ECONNREFUSED", ECONNREFUSED },
89 #endif
90 #if defined (ECONNRESET)
91  { "ECONNRESET", ECONNRESET },
92 #endif
93 #if defined (EDEADLK)
94  { "EDEADLK", EDEADLK },
95 #endif
96 #if defined (EDESTADDRREQ)
97  { "EDESTADDRREQ", EDESTADDRREQ },
98 #endif
99 #if defined (EDOM)
100  { "EDOM", EDOM },
101 #endif
102 #if defined (EDQUOT)
103  { "EDQUOT", EDQUOT },
104 #endif
105 #if defined (EEXIST)
106  { "EEXIST", EEXIST },
107 #endif
108 #if defined (EFAULT)
109  { "EFAULT", EFAULT },
110 #endif
111 #if defined (EFBIG)
112  { "EFBIG", EFBIG },
113 #endif
114 #if defined (EHOSTDOWN)
115  { "EHOSTDOWN", EHOSTDOWN },
116 #endif
117 #if defined (EHOSTUNREACH)
118  { "EHOSTUNREACH", EHOSTUNREACH },
119 #endif
120 #if defined (EINPROGRESS)
121  { "EINPROGRESS", EINPROGRESS },
122 #endif
123 #if defined (EINTR)
124  { "EINTR", EINTR },
125 #endif
126 #if defined (EINVAL)
127  { "EINVAL", EINVAL },
128 #endif
129 #if defined (EIO)
130  { "EIO", EIO },
131 #endif
132 #if defined (EISCONN)
133  { "EISCONN", EISCONN },
134 #endif
135 #if defined (EISDIR)
136  { "EISDIR", EISDIR },
137 #endif
138 #if defined (ELOOP)
139  { "ELOOP", ELOOP },
140 #endif
141 #if defined (EMFILE)
142  { "EMFILE", EMFILE },
143 #endif
144 #if defined (EMLINK)
145  { "EMLINK", EMLINK },
146 #endif
147 #if defined (EMSGSIZE)
148  { "EMSGSIZE", EMSGSIZE },
149 #endif
150 #if defined (ENAMETOOLONG)
151  { "ENAMETOOLONG", ENAMETOOLONG },
152 #endif
153 #if defined (ENETDOWN)
154  { "ENETDOWN", ENETDOWN },
155 #endif
156 #if defined (ENETRESET)
157  { "ENETRESET", ENETRESET },
158 #endif
159 #if defined (ENETUNREACH)
160  { "ENETUNREACH", ENETUNREACH },
161 #endif
162 #if defined (ENFILE)
163  { "ENFILE", ENFILE },
164 #endif
165 #if defined (ENOBUFS)
166  { "ENOBUFS", ENOBUFS },
167 #endif
168 #if defined (ENODEV)
169  { "ENODEV", ENODEV },
170 #endif
171 #if defined (ENOENT)
172  { "ENOENT", ENOENT },
173 #endif
174 #if defined (ENOEXEC)
175  { "ENOEXEC", ENOEXEC },
176 #endif
177 #if defined (ENOLCK)
178  { "ENOLCK", ENOLCK },
179 #endif
180 #if defined (ENOMEM)
181  { "ENOMEM", ENOMEM },
182 #endif
183 #if defined (ENOPROTOOPT)
184  { "ENOPROTOOPT", ENOPROTOOPT },
185 #endif
186 #if defined (ENOSPC)
187  { "ENOSPC", ENOSPC },
188 #endif
189 #if defined (ENOSYS)
190  { "ENOSYS", ENOSYS },
191 #endif
192 #if defined (ENOTBLK)
193  { "ENOTBLK", ENOTBLK },
194 #endif
195 #if defined (ENOTCONN)
196  { "ENOTCONN", ENOTCONN },
197 #endif
198 #if defined (ENOTDIR)
199  { "ENOTDIR", ENOTDIR },
200 #endif
201 #if defined (ENOTEMPTY)
202  { "ENOTEMPTY", ENOTEMPTY },
203 #endif
204 #if defined (ENOTSOCK)
205  { "ENOTSOCK", ENOTSOCK },
206 #endif
207 #if defined (ENOTTY)
208  { "ENOTTY", ENOTTY },
209 #endif
210 #if defined (ENXIO)
211  { "ENXIO", ENXIO },
212 #endif
213 #if defined (EOPNOTSUPP)
214  { "EOPNOTSUPP", EOPNOTSUPP },
215 #endif
216 #if defined (EPERM)
217  { "EPERM", EPERM },
218 #endif
219 #if defined (EPFNOSUPPORT)
220  { "EPFNOSUPPORT", EPFNOSUPPORT },
221 #endif
222 #if defined (EPIPE)
223  { "EPIPE", EPIPE },
224 #endif
225 #if defined (EPROTONOSUPPORT)
226  { "EPROTONOSUPPORT", EPROTONOSUPPORT },
227 #endif
228 #if defined (EPROTOTYPE)
229  { "EPROTOTYPE", EPROTOTYPE },
230 #endif
231 #if defined (ERANGE)
232  { "ERANGE", ERANGE },
233 #endif
234 #if defined (EREMOTE)
235  { "EREMOTE", EREMOTE },
236 #endif
237 #if defined (ERESTART)
238  { "ERESTART", ERESTART },
239 #endif
240 #if defined (EROFS)
241  { "EROFS", EROFS },
242 #endif
243 #if defined (ESHUTDOWN)
244  { "ESHUTDOWN", ESHUTDOWN },
245 #endif
246 #if defined (ESOCKTNOSUPPORT)
247  { "ESOCKTNOSUPPORT", ESOCKTNOSUPPORT },
248 #endif
249 #if defined (ESPIPE)
250  { "ESPIPE", ESPIPE },
251 #endif
252 #if defined (ESRCH)
253  { "ESRCH", ESRCH },
254 #endif
255 #if defined (ESTALE)
256  { "ESTALE", ESTALE },
257 #endif
258 #if defined (ETIMEDOUT)
259  { "ETIMEDOUT", ETIMEDOUT },
260 #endif
261 #if defined (ETOOMANYREFS)
262  { "ETOOMANYREFS", ETOOMANYREFS },
263 #endif
264 #if defined (ETXTBSY)
265  { "ETXTBSY", ETXTBSY },
266 #endif
267 #if defined (EUSERS)
268  { "EUSERS", EUSERS },
269 #endif
270 #if defined (EWOULDBLOCK)
271  { "EWOULDBLOCK", EWOULDBLOCK },
272 #endif
273 #if defined (EXDEV)
274  { "EXDEV", EXDEV },
275 #endif
276 
277  // Others (duplicates are OK).
278 
279  @SYSDEP_ERRNO_LIST@
280 
281  { nullptr, 0 },
282  };
283 
284  // Stuff them all in a map for fast access.
285 
286  errno_struct *ptr = errno_codes;
287 
288  while (ptr->name)
289  {
290  m_errno_tbl[ptr->name] = ptr->value;
291  ptr++;
292  }
293 }
294 
295 bool
297 {
298  bool retval = true;
299 
300  if (! s_instance)
301  {
302  s_instance = new octave_errno ();
304  }
305 
306  return retval;
307 }
308 
309 int
310 octave_errno::lookup (const std::string& name)
311 {
312  return (instance_ok ()) ? s_instance->do_lookup (name) : -1;
313 }
314 
317 {
318  return (instance_ok ()) ? s_instance->do_list () : octave_scalar_map ();
319 }
320 
321 int
322 octave_errno::do_lookup (const std::string& name)
323 {
324  return (m_errno_tbl.find (name) != m_errno_tbl.end ()) ? m_errno_tbl[name]
325  : -1;
326 }
327 
329 octave_errno::do_list ()
330 {
331  octave_scalar_map retval;
332 
333  for (const auto& p : m_errno_tbl)
334  {
335  retval.assign (p.first, p.second);
336  }
337 
338  return retval;
339 }
static octave_scalar_map list()
Definition: oct-errno.cc:718
static void cleanup_instance()
Definition: oct-errno.h:52
static int lookup(const std::string &name)
Definition: oct-errno.cc:712
static bool instance_ok()
Definition: oct-errno.cc:698
void assign(const std::string &k, const octave_value &val)
Definition: oct-map.h:230
static void add(fptr f)