1 # Copyright (C) 1991-2024 Free Software Foundation, Inc.
2 # This file is part of the GNU C Library.
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.
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.
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/>.
18 # errno.texinfo contains lines like:
19 # @errno{ENOSYS, 123, Function not implemented}
22 print "/* This file generated by errnos.awk from";
23 for (i =
1; i
< ARGC; i
++)
26 sub(/.
*(manual
|include
|-gnu
)\
//, "", arg
);
27 if (arg ~
/.
*errnos.d
/) continue;
30 print " Do not edit this file; edit errnos.awk and regenerate it. */";
32 print "#ifndef _BITS_ERRNO_H";
33 print "#define _BITS_ERRNO_H 1";
35 print "#if !defined _ERRNO_H";
36 print "# error \"Never include <bits/errno.h> directly; use <errno.h> instead.\"";
47 e =
substr($
1, 8, length($
1)-8)
48 if (length(e
) > maxerrlen
)
49 maxerrlen =
length(e
);
50 if (e ==
"EWOULDBLOCK")
53 errnos
[seq
] =
"EAGAIN";
58 errno =
substr($
2, 1, length($
2)-1) + 0;
63 printf("%s:%d: errno value %d too large for the Hurd\n",
64 FILENAME, NR, errno) >> "/dev/stderr";
71 for (i =
3; i
<=
NF; ++i
)
73 etext =
substr(etext
, 2, length(etext
)-2);
76 errnos
[seq
] =
sprintf("0x%08x", 0x40000000 + errno);
82 NF ==
3 && $
1 ==
"#define" && $
2 ==
"MACH_SEND_IN_PROGRESS" \
84 in_mach_errors =
FILENAME;
85 annot
[seq
++] =
"\n/* Errors from <mach/message.h>. */";
87 NF ==
3 && $
1 ==
"#define" && $
2 ==
"KERN_SUCCESS" \
89 in_mach_errors =
FILENAME;
90 annot
[seq
++] =
"\n/* Errors from <mach/kern_return.h>. */";
94 in_mach_errors
!= "" && $
2 ==
"MACH_IPC_COMPAT" \
99 # FIXME: mach/message.h and mach/kern_return.h do include error
100 # descriptions which we could slurp, but some of them are very long,
101 # we would need to word-wrap them.
102 in_mach_errors ==
FILENAME && NF ==
3 && $
1 ==
"#define" \
105 if (length(e
) > maxerrlen
)
106 maxerrlen =
length(e
);
113 $
1 ==
"#define" && $
2 ==
"_MACH_MIG_ERRORS_H_" \
116 annot
[seq
++] =
"\n/* Errors from <mach/mig_errors.h>. */";
119 in_mig_errors
&& $
1 ==
"#endif" && $
3 ==
"_MACH_MIG_ERRORS_H_" \
124 (in_mig_errors
&& $
1 ==
"#define" && $
3 <=
-300) || \
125 (in_device_errors
&& $
1 ==
"#define" && /D_
/ && NF > 3) \
128 for (i =
5; i
< NF; ++i
)
129 etext = etext
" " $i
;
132 if (length(e
) > maxerrlen
)
133 maxerrlen =
length(e
);
136 etexts
[seq
] =
substr(etext
, 2, length(etext
)-1);
140 $
1 ==
"#define" && $
2 ==
"D_SUCCESS" \
142 in_device_errors =
1;
143 annot
[seq
++] =
"\n/* Errors from <device/device_types.h>. */";
146 in_device_errors
&& $
1 ==
"#endif" \
148 in_device_errors =
0;
151 function print_errno_enum
(maxseq
)
154 print "#ifndef __ASSEMBLER__";
156 print "enum __error_t_codes";
158 print " /* The value zero always means success and it is perfectly fine";
159 print " for code to use 0 explicitly (or implicitly, e.g. via Boolean";
160 print " coercion.) Having an enum entry for zero both makes the";
161 print " debugger print the name for error_t-typed zero values, and";
162 print " prevents the compiler from issuing warnings about 'case 0:'";
163 print " in a switch on an error_t-typed value. */";
164 printf(" %-*s = 0,\n", maxerrlen
, "ESUCCESS");
167 print " /* The Hurd uses Mach error system 0x10, subsystem 0. */";
168 for (i =
0; i
< maxseq
; i
++)
172 else if (i in etexts
&& etexts
[i
] != "")
173 printf(" %-*s = %s,\t/* %s */\n",
174 maxerrlen
, econsts
[i
], errnos
[i
], etexts
[i
]);
175 else if (errnos
[i
] != "EAGAIN")
176 printf(" %-*s = %s,\n", maxerrlen
, econsts
[i
], errnos
[i
]);
180 print " /* Because the C standard requires that errno have type 'int',"
181 print " this enumeration must be a signed type. */";
182 print " __FORCE_ERROR_T_CODES_SIGNED = -1";
185 print "#endif /* not __ASSEMBLER__ */";
188 function print_errno_defines
(maxseq
)
191 print "/* The C standard requires that all of the E-constants be"
192 print " defined as macros. */"
194 for (i =
0; i
< maxseq
; i
++)
199 printf("#define %-*s %s\n", maxerrlen
, econsts
[i
], errnos
[i
]);
202 printf("#define _HURD_ERRNOS %d\n", maxerrno
+1);
207 print_errno_enum
(seq
);
208 print_errno_defines
(seq
);
211 print "#endif /* bits/errno.h. */";