diff options
author | Zack Weinberg <zackw@panix.com> | 2017-06-22 18:28:45 -0400 |
---|---|---|
committer | Zack Weinberg <zackw@panix.com> | 2017-06-22 18:28:45 -0400 |
commit | 09e65f085e8491db0ada73c558ffe8dc296ade47 (patch) | |
tree | c31ff4f8f871bab4762248bffc9c3c508037ef61 /sysdeps/mach | |
parent | bf7aa82eab0f1f9c78d39cf57a3f6b25eefc47c1 (diff) | |
download | glibc-09e65f085e8491db0ada73c558ffe8dc296ade47.tar.gz glibc-09e65f085e8491db0ada73c558ffe8dc296ade47.tar.xz glibc-09e65f085e8491db0ada73c558ffe8dc296ade47.zip |
Add pretty-printer for errno. zack/errno-prettyprint
This patch adds the actual pretty-printer for errno. I could have used Python's built-in errno module to get the symbolic names for the constants, but it seemed better to do something entirely under our control, so there's a .pysym file generated from errnos.texi, with a hook that allows the Hurd to add additional constants. Then a .py module is generated from that plus errno.h in the usual manner; many thanks to the authors of the .pysym mechanism. There is also a test which verifies that the .py file (not the .pysym file) covers all of the constants defined in errno.h. hurd-add-errno-constants.awk has been manually tested, but the makefile logic that runs it has not been tested. * stdlib/errno-printer.py: New pretty-printer. * stdlib/test-errno-constants.py: New special test. * stdlib/test-errno-printer.c, stdlib/test-errno-printer.py: New pretty-printer test. * stdlib/make-errno-constants.awk: New script to generate the .pysym file needed by errno-printer.py. * stdlib/Makefile: Install, run, and test all of the above, as appropriate. * sysdeps/mach/hurd/hurd-add-errno-constants.awk: New script to add Mach/Hurd-specific errno constants to the .pysym file used by stdlib/errno-printer.py. * sysdeps/mach/hurd/Makefile: Hook hurd-add-errno-constants.awk into the generation of that .pysym file.
Diffstat (limited to 'sysdeps/mach')
-rw-r--r-- | sysdeps/mach/hurd/Makefile | 10 | ||||
-rw-r--r-- | sysdeps/mach/hurd/hurd-add-errno-constants.awk | 80 |
2 files changed, 90 insertions, 0 deletions
diff --git a/sysdeps/mach/hurd/Makefile b/sysdeps/mach/hurd/Makefile index 13bdf5c7c9..5171425650 100644 --- a/sysdeps/mach/hurd/Makefile +++ b/sysdeps/mach/hurd/Makefile @@ -98,6 +98,16 @@ $(common-objpfx)stamp-errnos: $(hurd)/errnos.awk $(errno.texinfo) \ touch $@ common-generated += errnos.d stamp-errnos + +# Augmentations to the errno pretty-printer. +ifeq ($(subdir),stdlib) +define sysd-add-errno-constants +$(AWK) -f $(hurd)/hurd-add-errno-constants.awk $(mach-errnos-deps) +endef +$(objpfx)errno_constants.pysym: \ + $(hurd)/hurd-add-errno-constants.awk $(mach-errnos-deps) +endif + # We install the real libc.a as libcrt.a and as libc.a we install a linker # script which does -( -lcrt -lmachuser -lhurduser -). diff --git a/sysdeps/mach/hurd/hurd-add-errno-constants.awk b/sysdeps/mach/hurd/hurd-add-errno-constants.awk new file mode 100644 index 0000000000..0d51766c97 --- /dev/null +++ b/sysdeps/mach/hurd/hurd-add-errno-constants.awk @@ -0,0 +1,80 @@ +# Add Hurd-specific constants to errno_constants.pysym. +# Copyright (C) 2017 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/>. + +# On the Hurd, errno.h defines E-constants corresponding to a number of +# Mach low-level errors. Add these to the set of values recognized by +# stdlib/errno-printer.py. This script must be kept in sync with errnos.awk. + +BEGIN { + in_mach_errors = ""; + in_mig_errors = 0; + in_device_errors = 0; +} + +function emit_subhead() +{ + header = FILENAME; + sub(/.*include\//, "", header); + printf("\n-- Errors from <%s>\n", header); +} + +NF == 3 && $1 == "#define" && $2 == "MACH_SEND_IN_PROGRESS" \ + { + in_mach_errors = FILENAME; + emit_subhead(); + } +NF == 3 && $1 == "#define" && $2 == "KERN_SUCCESS" \ + { + in_mach_errors = FILENAME; + emit_subhead(); + next; + } +in_mach_errors != "" && $2 == "MACH_IPC_COMPAT" \ + { + in_mach_errors = ""; + next; + } + +$1 == "#define" && $2 == "_MACH_MIG_ERRORS_H_" \ + { + in_mig_errors = 1; + emit_subhead(); + next; + } +in_mig_errors && $1 == "#endif" && $3 == "_MACH_MIG_ERRORS_H_" \ + { + in_mig_errors = 0; + } + +$1 == "#define" && $2 == "D_SUCCESS" \ + { + in_device_errors = 1; + emit_subhead(); + next; + } +in_device_errors && $1 == "#endif" \ + { + in_device_errors = 0; + } + +(in_mach_errors == FILENAME && NF == 3 && $1 == "#define") || \ +(in_mig_errors && $1 == "#define" && $3 <= -300) || \ +(in_device_errors && $1 == "#define" && $2 ~ /D_/ && NF > 3) \ + { + print "E" $2; + } |