# mkheader.awk
# Copyright (C) 2003, 2004 g10 Code GmbH
# 
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 2 of
# the License, or (at your option) any later version.
#
# This program 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
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
#
# As a special exception, g10 Code GmbH gives unlimited permission to
# copy, distribute and modify the C source files that are the output
# of mkheader.awk.  You need not follow the terms of the GNU General
# Public License when using or distributing such scripts, even though
# portions of the text of mkheader.awk appear in them.  The GNU
# General Public License (GPL) does govern all other use of the material
# that constitutes the mkheader.awk program.
#
# Certain portions of the mkheader.awk source text are designed to be
# copied (in certain cases, depending on the input) into the output of
# mkheader.awk.  We call these the "data" portions.  The rest of the
# mkheader.awk source text consists of comments plus executable code
# that decides which of the data portions to output in any given case.
# We call these comments and executable code the "non-data" portions.
# mkheader.h never copies any of the non-data portions into its output.
#
# This special exception to the GPL applies to versions of mkheader.awk
# released by g10 Code GmbH.  When you make and distribute a modified version
# of mkheader.awk, you may extend this special exception to the GPL to
# apply to your modified version as well, *unless* your modified version
# has the potential to copy into its output some of the text that was the
# non-data portion of the version that you started with.  (In other words,
# unless your change moves or copies text from the non-data portions to the
# data portions.)  If your modification has such potential, you must delete
# any notice of this special exception to the GPL from your modified version.

# This script processes gpg-error.h.in in an awful way.
# Its input is, one after another, the content of the err-sources.h.in file,
# the err-codes.h.in file, the errnos.in file, and then gpg-error.h.in.
# There is nothing fancy about this.
#
# An alternative would be to use getline to get the content of the first three files,
# but then we need to pre-process gpg-error.h.in with configure to get
# at the full path of the files in @srcdir@.

BEGIN {
  FS = "[\t]+";
# sources_nr holds the number of error sources.
  sources_nr = 0;
# codes_nr holds the number of error codes.
  codes_nr = 0;
# errnos_nr holds the number of system errors.
  errnos_nr = 0;
# extra_nr holds the number of extra lines to be included.
  extra_nr = 0

# These variables walk us through our input.
  sources_header = 1;
  sources_body = 0;
  between_sources_and_codes = 0;
  codes_body = 0;
  between_codes_and_errnos = 0;
  errnos_body = 0;
  extra_body = 0;
  gpg_error_h = 0;

  print "/* Output of mkheader.awk.  DO NOT EDIT.  -*- buffer-read-only: t -*- */";
  print "";

}


sources_header {
  if ($1 ~ /^[0123456789]+$/)
    {
      sources_header = 0;
      sources_body = 1;
    }      
}

sources_body {
  sub (/\#.+/, "");
  sub (/[ 	]+$/, ""); # Strip trailing space and tab characters.

  if (/^$/)
    next;

  if ($1 == "")
    {
      sources_body = 0;
      between_sources_and_codes = 1;
    }
  else
    {
# Remember the error source number and symbol of each error source.
      sources_idx[sources_nr] = $1;
      sources_sym[sources_nr] = $2;
      sources_nr++;
    }
}

between_sources_and_codes {
  if ($1 ~ /^[0123456789]+$/)
    {
      between_sources_and_codes = 0;
      codes_body = 1;
    }      
}

codes_body {
  sub (/\#.+/, "");
  sub (/[ 	]+$/, ""); # Strip trailing space and tab characters.

  if (/^$/)
    next;

  if ($1 == "")
    {
      codes_body = 0;
      between_codes_and_errnos = 1;
    }
  else
    {
# Remember the error code number and symbol of each error source.
      codes_idx[codes_nr] = $1;
      codes_sym[codes_nr] = $2;
      codes_nr++;
    }
}

between_codes_and_errnos {
  if ($1 ~ /^[0-9]/)
    {
      between_codes_and_errnos = 0;
      errnos_body = 1;
    }
}

errnos_body {
  sub (/\#.+/, "");
  sub (/[ 	]+$/, ""); # Strip trailing space and tab characters.

  if (/^$/)
    next;

  if ($1 !~ /^[0-9]/)
    {
# Note that this assumes that extra_body.in doesn't start with a digit.
      errnos_body = 0;
      extra_body = 1;
    }
  else
    {
      errnos_idx[errnos_nr] = "GPG_ERR_SYSTEM_ERROR | " $1;
      errnos_sym[errnos_nr] = "GPG_ERR_" $2;
      errnos_nr++;
    }
}

extra_body {
  if (/^##/)
    next

  if (/^EOF/)
    {
      extra_body = 0;
      gpg_error_h = 1;
      next;
    }
  else
    {
      extra_line[extra_nr] = $0;
      extra_nr++;
    }
}

gpg_error_h {
  if ($0 ~ /^@include err-sources/)
    {
      for (i = 0; i < sources_nr; i++)
	{
	  print "    " sources_sym[i] " = " sources_idx[i] ",";
#	  print "#define " sources_sym[i] " (" sources_idx[i] ")";
	}
    }
  else if ($0 ~ /^@include err-codes/)
    {
      for (i = 0; i < codes_nr; i++)
	{
	  print "    " codes_sym[i] " = " codes_idx[i] ",";
#	  print "#define " codes_sym[i] " (" codes_idx[i] ")";
	}
    }
  else if ($0 ~ /^@include errnos/)
    {
      for (i = 0; i < errnos_nr; i++)
       {
         print "    " errnos_sym[i] " = " errnos_idx[i] ",";
#        print "#define " errnos_sym[i] " (" errnos_idx[i] ")";
       }
    }
  else if ($0 ~ /^@include extra-h.in/)
    {
      for (i = 0; i < extra_nr; i++)
	{
            print extra_line[i];
	}
    }
  else
    print;
}
