# 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
# 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:
# @errno{ENOSYS, 123, Function not implemented}

BEGIN {
    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 "#ifndef _BITS_ERRNO_H";
    print "#define _BITS_ERRNO_H 1";
    print "";
    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 = "";
    seq = 0;
  }

/^@errno\{/ \
  {
    e = substr($1, 8, length($1)-8)
    if (length(e) > maxerrlen)
      maxerrlen = length(e);
    if (e == "EWOULDBLOCK")
      {
	econsts[seq] = e;
	errnos[seq] = "EAGAIN";
	seq++;
	next;
      }

    errno = substr($2, 1, length($2)-1) + 0;
    if (errno == 0)
      next;
    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;
  }

NF == 3 && $1 == "#define" && $2 == "MACH_SEND_IN_PROGRESS" \
  {
    in_mach_errors = FILENAME;
    annot[seq++] = "\n/* Errors from <mach/message.h>.  */";
  }
NF == 3 && $1 == "#define" && $2 == "KERN_SUCCESS" \
  {
    in_mach_errors = FILENAME;
    annot[seq++] = "\n/* Errors from <mach/kern_return.h>.  */";
    next;
  }

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" \
  {
    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;
    annot[seq++] = "\n/* 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) \
  {
    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;
    annot[seq++] = "\n/* Errors from <device/device_types.h>.  */";
    next;
  }
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 "/* User-visible type of error codes.  It is ok to use 'int' or";
  print "   'kern_return_t' for these, but with 'error_t' the debugger prints";
  print "   symbolic values.  */";
  print "# if !defined __error_t_defined && defined __USE_GNU";
  print "#  define __error_t_defined 1";
  print "typedef enum __error_t_codes error_t;"
  print "# endif";
  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 \
  {
    print_errno_enum(seq);
    print_errno_defines(seq);

    print "";
    print "#endif /* bits/errno.h.  */";
  }
