summaryrefslogtreecommitdiff
path: root/sysdeps/nacl/errnos.awk
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/nacl/errnos.awk')
-rw-r--r--sysdeps/nacl/errnos.awk87
1 files changed, 87 insertions, 0 deletions
diff --git a/sysdeps/nacl/errnos.awk b/sysdeps/nacl/errnos.awk
new file mode 100644
index 0000000000..65fa19bd06
--- /dev/null
+++ b/sysdeps/nacl/errnos.awk
@@ -0,0 +1,87 @@
+# Script to produce bits/errno.h for NaCl.
+
+# Copyright (C) 2015 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
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+
+# The GNU C Library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+
+# You should have received a copy of the GNU Lesser General Public
+# License along with the GNU C Library; if not, see
+# <http://www.gnu.org/licenses/>.
+
+BEGIN { maxerrno = 0 }
+
+$1 == "#define" && $2 ~ /NACL_ABI_E[A-Z0-9_]+/ && $3 ~ /[0-9]+/ {
+ ename = $2;
+ sub(/NACL_ABI_/, "", ename);
+ errno = $3 + 0;
+ if (errno > maxerrno) maxerrno = errno;
+ errnos[errno] = ename;
+ errnos_by_name[ename] = errno;
+ if ($4 == "/*" && !(ename in errno_text)) {
+ etext = $5;
+ for (i = 6; i <= NF && $i != "*/"; ++i)
+ etext = etext " " $i;
+ errno_text[ename] = etext;
+ }
+ next;
+}
+
+$1 == "@comment" && $2 == "errno.h" { errnoh=1; next }
+errnoh == 1 && $1 == "@comment" {
+ ++errnoh;
+ etext = $3;
+ for (i = 4; i <= NF; ++i)
+ etext = etext " " $i;
+ next;
+}
+errnoh == 2 && $1 == "@deftypevr" && $2 == "Macro" && $3 == "int" {
+ ename = $4;
+ errno_text[ename] = etext;
+ next;
+}
+
+function define_errno(errno, ename) {
+ etext = errno_text[ename];
+ if (length(ename) < 8) ename = ename "\t";
+ printf "#define\t%s\t%d\t/* %s */\n", ename, errno, etext;
+}
+
+END {
+ print "\
+/* This file generated by errnos.awk. */\n\
+\n\
+#if !defined __Emath_defined && (defined _ERRNO_H || defined __need_Emath)\n\
+#undef __need_Emath\n\
+#define __Emath_defined 1";
+ emath["EDOM"] = emath["EILSEQ"] = emath["ERANGE"] = 1;
+ for (ename in emath) {
+ errno = errnos_by_name[ename];
+ define_errno(errno, ename);
+ delete errnos[errno];
+ }
+ print "\
+#endif\n\
+\n\
+#ifdef _ERRNO_H\n";
+
+ for (i = 1; i <= maxerrno; ++i)
+ if (i in errnos) define_errno(i, errnos[i]);
+
+ print "\n\
+#define EWOULDBLOCK EAGAIN\n\
+#define ENOTSUP EOPNOTSUPP\n\
+\n\
+extern __thread int errno __attribute__ ((__tls_model__ (\"initial-exec\")));\n\
+#define errno errno\n\
+\n\
+#endif";
+}