# Copyright (C) 1991-2014 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/>.

# errno.texinfo contains lines like:
# @comment errno.h
# @comment POSIX.1: Function not implemented
# @deftypevr Macro int ENOSYS
# @comment errno 123

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 "";
    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 "";
    errnoh = 0;
    maxerrno = 0;
    in_mach_errors = "";
    in_math = 0;
    edom = erange = "";
    print "#undef EDOM\n#undef ERANGE";
    lno = 0;
  }

$1 == "@comment" && $2 == "errno.h" { errnoh=1; next }
$1 == "@comment" && errnoh == 1 \
  {
    ++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" {
    if (e == "EWOULDBLOCK")
      {
	lines[lno++]="#define EWOULDBLOCK EAGAIN /* Operation would block */";
	next;
      }
    errno = $3 + 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;
    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>.  */";
  }
NF == 3 && $1 == "#define" && $2 == "KERN_SUCCESS" \
  {
    in_mach_errors = FILENAME;
    lines[lno++] = "\n\t/* Errors from <mach/kern_return.h>.  */";
    next;
  }

in_mach_errors != "" && $2 == "MACH_IPC_COMPAT" \
  {
    in_mach_errors = "";
  }

in_mach_errors == FILENAME && NF == 3 && $1 == "#define" \
  {
    comma[lno] = 1;
    lines[lno++] = sprintf("\t%-32s= %s", "E" $2, $3);
  }

$1 == "#define" && $2 == "_MACH_MIG_ERRORS_H_" \
  {
    in_mig_errors = 1;
    lines[lno++] = "\n\t/* Errors from <mach/mig_errors.h>.  */";
    next;
  }
in_mig_errors && $1 == "#endif" && $3 == "_MACH_MIG_ERRORS_H_" \
  {
    in_mig_errors = 0;
  }

(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;
  }

$1 == "#define" && $2 == "D_SUCCESS" \
  {
    in_device_errors = 1;
    lines[lno++] = "\n\t/* Errors from <device/device_types.h>.  */";
    next;
  }
in_device_errors && $1 == "#endif" \
  {
    in_device_errors = 0;
  }


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 "";
    print "#if !defined (_ERRNO_H) && defined (__need_Emath)";
    print edom; print erange;
    print "#endif /* <errno.h> not included and need math error codes.  */";
  }
