summaryrefslogtreecommitdiff
path: root/sysdeps/mach/hurd/errnos.awk
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/mach/hurd/errnos.awk')
-rw-r--r--sysdeps/mach/hurd/errnos.awk218
1 files changed, 127 insertions, 91 deletions
diff --git a/sysdeps/mach/hurd/errnos.awk b/sysdeps/mach/hurd/errnos.awk
index 1d15131e81..dc19350eb0 100644
--- a/sysdeps/mach/hurd/errnos.awk
+++ b/sysdeps/mach/hurd/errnos.awk
@@ -1,4 +1,4 @@
-# Copyright (C) 1991-2016 Free Software Foundation, Inc.
+# Copyright (C) 1991-2018 Free Software Foundation, Inc.
# This file is part of the GNU C Library.
# The GNU C Library is free software; you can redistribute it and/or
@@ -16,84 +16,77 @@
# <http://www.gnu.org/licenses/>.
# errno.texinfo contains lines like:
-# @comment errno.h
-# @comment POSIX.1: Function not implemented
-# @deftypevr Macro int ENOSYS
-# @comment errno 123
+# @errno{ENOSYS, 123, Function not implemented}
BEGIN {
- print "/* This file generated by errnos.awk. */";
- print "";
- print "/* The Hurd uses Mach error system 0x10, currently only subsystem 0. */";
- print "#ifndef _HURD_ERRNO";
- print "#define _HURD_ERRNO(n)\t((0x10 << 26) | ((n) & 0x3fff))";
- print "#endif";
+ print "/* This file generated by errnos.awk from";
+ for (i = 1; i < ARGC; i++)
+ {
+ arg = ARGV[i];
+ sub(/.*(manual|include)\//, "", arg)
+ print " " arg;
+ }
+ print " Do not edit this file; edit errnos.awk and regenerate it. */";
print "";
- print "#ifdef _ERRNO_H\n";
- print "enum __error_t_codes\n{";
- print "\t/* The value zero always means success and it is perfectly fine for";
- print "\t code to use 0 explicitly (or implicitly, e.g. via Boolean coercion).";
- print "\t Having an enum entry for zero both makes the debugger print the name";
- print "\t for error_t-typed zero values, and prevents the compiler from";
- print "\t issuing warnings about 'case 0:' in a switch on an error_t-typed";
- print "\t value. */";
- print "\tESUCCESS = 0,"
+ print "#ifndef _BITS_ERRNO_H";
+ print "#define _BITS_ERRNO_H 1";
print "";
- errnoh = 0;
+ print "#if !defined _ERRNO_H";
+ print "# error \"Never include <bits/errno.h> directly; use <errno.h> instead.\"";
+ print "#endif";
+
maxerrno = 0;
+ maxerrlen = 0;
in_mach_errors = "";
- in_math = 0;
- edom = erange = "";
- print "#undef EDOM\n#undef ERANGE";
- lno = 0;
+ seq = 0;
}
-$1 == "@comment" && $2 == "errno.h" { errnoh=1; next }
-$1 == "@comment" && errnoh == 1 \
+/^@errno\{/ \
{
- ++errnoh;
- etext = "";
- for (i = 3; i <= NF; ++i)
- etext = etext " " $i;
- next;
- }
-
-errnoh == 2 && $1 == "@deftypevr" && $2 == "Macro" && $3 == "int" \
- { ++errnoh; e = $4; next; }
-
-errnoh == 3 && $1 == "@comment" && $2 == "errno" {
+ e = substr($1, 8, length($1)-8)
+ if (length(e) > maxerrlen)
+ maxerrlen = length(e);
if (e == "EWOULDBLOCK")
{
- lines[lno++]="#define EWOULDBLOCK EAGAIN /* Operation would block */";
+ econsts[seq] = e;
+ errnos[seq] = "EAGAIN";
+ seq++;
next;
}
- errno = $3 + 0;
+
+ errno = substr($2, 1, length($2)-1) + 0;
if (errno == 0)
next;
- if (errno > maxerrno) maxerrno = errno;
- x = sprintf ("%-40s/*%s */", sprintf ("%-24s%s", "#define\t" e,
- "_HURD_ERRNO (" errno ")"),
- etext);
- if (e == "EDOM")
- edom = x;
- else if (e == "ERANGE")
- erange = x;
- comma[lno] = 1;
- lines[lno++] = sprintf("\t%-16s= _HURD_ERRNO (%d)", e, errno);
- lines[lno++] = x;
+ if (errno > 0x3ffff)
+ {
+ printf("%s:%d: errno value %d too large for the Hurd\n",
+ FILENAME, NR, errno) >> "/dev/stderr";
+ exit 1;
+ }
+ if (errno > maxerrno)
+ maxerrno = errno;
+
+ etext = "";
+ for (i = 3; i <= NF; ++i)
+ etext = etext " " $i;
+ etext = substr(etext, 2, length(etext)-2);
+
+ econsts[seq] = e;
+ errnos[seq] = sprintf("0x%08x", 0x40000000 + errno);
+ etexts[seq] = etext;
+ seq++;
next;
}
-{ errnoh=0 }
NF == 3 && $1 == "#define" && $2 == "MACH_SEND_IN_PROGRESS" \
{
in_mach_errors = FILENAME;
- lines[lno++] = "\n\t/* Errors from <mach/message.h>. */";
+ annot[seq++] = "\n/* Errors from <mach/message.h>. */";
}
NF == 3 && $1 == "#define" && $2 == "KERN_SUCCESS" \
{
in_mach_errors = FILENAME;
- lines[lno++] = "\n\t/* Errors from <mach/kern_return.h>. */";
+ annot[seq++] = "\n/* Errors from <mach/kern_return.h>. */";
next;
}
@@ -102,16 +95,24 @@ in_mach_errors != "" && $2 == "MACH_IPC_COMPAT" \
in_mach_errors = "";
}
+# FIXME: mach/message.h and mach/kern_return.h do include error
+# descriptions which we could slurp, but some of them are very long,
+# we would need to word-wrap them.
in_mach_errors == FILENAME && NF == 3 && $1 == "#define" \
{
- comma[lno] = 1;
- lines[lno++] = sprintf("\t%-32s= %s", "E" $2, $3);
+ e = "E" $2;
+ if (length(e) > maxerrlen)
+ maxerrlen = length(e);
+ econsts[seq] = e;
+ errnos[seq] = $3;
+ etexts[seq] = "";
+ seq++;
}
$1 == "#define" && $2 == "_MACH_MIG_ERRORS_H_" \
{
in_mig_errors = 1;
- lines[lno++] = "\n\t/* Errors from <mach/mig_errors.h>. */";
+ annot[seq++] = "\n/* Errors from <mach/mig_errors.h>. */";
next;
}
in_mig_errors && $1 == "#endif" && $3 == "_MACH_MIG_ERRORS_H_" \
@@ -122,17 +123,23 @@ in_mig_errors && $1 == "#endif" && $3 == "_MACH_MIG_ERRORS_H_" \
(in_mig_errors && $1 == "#define" && $3 <= -300) || \
(in_device_errors && $1 == "#define" && /D_/ && NF > 3) \
{
- comment = "";
- for (i = 4; i <= NF; ++i)
- comment = comment " " $i;
- comma[lno] = 1;
- lines[lno++] = sprintf("%-32s", sprintf ("\t%-24s= %s", "E" $2, $3)) comment;
+ etext = "";
+ for (i = 5; i < NF; ++i)
+ etext = etext " " $i;
+
+ e = "E" $2;
+ if (length(e) > maxerrlen)
+ maxerrlen = length(e);
+ econsts[seq] = e;
+ errnos[seq] = $3;
+ etexts[seq] = substr(etext, 2, length(etext)-1);
+ seq++;
}
$1 == "#define" && $2 == "D_SUCCESS" \
{
in_device_errors = 1;
- lines[lno++] = "\n\t/* Errors from <device/device_types.h>. */";
+ annot[seq++] = "\n/* Errors from <device/device_types.h>. */";
next;
}
in_device_errors && $1 == "#endif" \
@@ -140,36 +147,65 @@ in_device_errors && $1 == "#endif" \
in_device_errors = 0;
}
+function print_errno_enum(maxseq)
+{
+ print "";
+ print "#ifndef __ASSEMBLER__";
+ print "";
+ print "enum __error_t_codes";
+ print "{";
+ print " /* The value zero always means success and it is perfectly fine";
+ print " for code to use 0 explicitly (or implicitly, e.g. via Boolean";
+ print " coercion.) Having an enum entry for zero both makes the";
+ print " debugger print the name for error_t-typed zero values, and";
+ print " prevents the compiler from issuing warnings about 'case 0:'";
+ print " in a switch on an error_t-typed value. */";
+ printf(" %-*s = 0,\n", maxerrlen, "ESUCCESS");
+
+ print "";
+ print " /* The Hurd uses Mach error system 0x10, subsystem 0. */";
+ for (i = 0; i < maxseq; i++)
+ {
+ if (i in annot)
+ print annot[i];
+ else if (i in etexts && etexts[i] != "")
+ printf(" %-*s = %s,\t/* %s */\n",
+ maxerrlen, econsts[i], errnos[i], etexts[i]);
+ else if (errnos[i] != "EAGAIN")
+ printf(" %-*s = %s,\n", maxerrlen, econsts[i], errnos[i]);
+ }
+
+ print "";
+ print " /* Because the C standard requires that errno have type 'int',"
+ print " this enumeration must be a signed type. */";
+ print " __FORCE_ERROR_T_CODES_SIGNED = -1";
+ print "};";
+ print "";
+ print "#endif /* not __ASSEMBLER__ */";
+}
+
+function print_errno_defines(maxseq)
+{
+ print "";
+ print "/* The C standard requires that all of the E-constants be"
+ print " defined as macros. */"
+ print "";
+ for (i = 0; i < maxseq; i++)
+ {
+ if (i in annot)
+ print annot[i];
+ else
+ printf("#define %-*s %s\n", maxerrlen, econsts[i], errnos[i]);
+ }
+ print "";
+ printf("#define _HURD_ERRNOS %d\n", maxerrno+1);
+}
END \
{
- for (i = 0; i < lno - 1; ++i)
- printf "%s%s\n", lines[i], (comma[i] ? "," : "");
- print lines[i];
- print "";
- print "};";
- print "";
- printf "#define\t_HURD_ERRNOS\t%d\n", maxerrno+1;
- print "";
- print "\
-/* User-visible type of error codes. It is ok to use `int' or\n\
- `kern_return_t' for these, but with `error_t' the debugger prints\n\
- symbolic values. */";
- print "#ifdef __USE_GNU";
- print "typedef enum __error_t_codes error_t;"
- print "#define __error_t_defined\t1"
- print "#endif";
- print "";
- print "\
-/* Return the current thread's location for `errno'.\n\
- The syntax of this function allows redeclarations like `int errno'. */\n\
-extern int *__errno_location (void) __THROW __attribute__ ((__const__));\n\
-\n\
-#define errno (*__errno_location ())\n\
-";
- print "#endif /* <errno.h> included. */";
+ print_errno_enum(seq);
+ print_errno_defines(seq);
+
print "";
- print "#if !defined (_ERRNO_H) && defined (__need_Emath)";
- print edom; print erange;
- print "#endif /* <errno.h> not included and need math error codes. */";
+ print "#endif /* bits/errno.h. */";
}