1 /* Copyright (C) 1991-2021 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3 
4    The GNU C Library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Lesser General Public
6    License as published by the Free Software Foundation; either
7    version 2.1 of the License, or (at your option) any later version.
8 
9    The GNU C Library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Lesser General Public License for more details.
13 
14    You should have received a copy of the GNU Lesser General Public
15    License along with the GNU C Library; if not, see
16    <https://www.gnu.org/licenses/>.  */
17 
18 #include <stdio.h>
19 #include <errno.h>
20 #include <libintl.h>
21 #include <array_length.h>
22 
23 #ifndef ERR_MAP
24 # define ERR_MAP(n) n
25 #endif
26 
27 const char *const _sys_errlist_internal[] =
28   {
29 #define _S(n, str)         [ERR_MAP(n)] = str,
30 #include <errlist.h>
31 #undef _S
32   };
33 
34 const char *
__get_errlist(int errnum)35 __get_errlist (int errnum)
36 {
37   int mapped = ERR_MAP (errnum);
38   if (mapped >= 0 && mapped < array_length (_sys_errlist_internal))
39     return _sys_errlist_internal[mapped];
40   return NULL;
41 }
42 
43 static const union sys_errname_t
44 {
45   struct
46   {
47 #define MSGSTRFIELD1(line) str##line
48 #define MSGSTRFIELD(line)  MSGSTRFIELD1(line)
49 #define _S(n, str)         char MSGSTRFIELD(__LINE__)[sizeof(#n)];
50 #include <errlist.h>
51 #undef _S
52   };
53   char str[0];
54 } _sys_errname = { {
55 #define _S(n, s) #n,
56 #include <errlist.h>
57 #undef _S
58 } };
59 
60 static const unsigned short _sys_errnameidx[] =
61 {
62 #define _S(n, s) \
63   [ERR_MAP(n)] = offsetof(union sys_errname_t, MSGSTRFIELD(__LINE__)),
64 #include <errlist.h>
65 #undef _S
66 };
67 
68 const char *
__get_errname(int errnum)69 __get_errname (int errnum)
70 {
71   int mapped = ERR_MAP (errnum);
72   if (mapped < 0 || mapped >= array_length (_sys_errnameidx)
73       || (mapped > 0 && _sys_errnameidx[mapped] == 0))
74     return NULL;
75   return _sys_errname.str + _sys_errnameidx[mapped];
76 }
77 
78 #include <errlist-compat.c>
79