1# mkerrcodes.awk
2# Copyright (C) 2004, 2005, 2006 g10 Code GmbH
3# 
4# This program is free software; you can redistribute it and/or
5# modify it under the terms of the GNU General Public License as
6# published by the Free Software Foundation; either version 2 of
7# the License, or (at your option) any later version.
8#
9# This program is distributed in the hope that it will be useful,
10# but WITHOUT ANY WARRANTY; without even the implied warranty of
11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12# General Public License for more details.
13#
14# You should have received a copy of the GNU General Public License
15# along with this program; if not, write to the Free Software
16# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
17#
18# As a special exception, g10 Code GmbH gives unlimited permission to
19# copy, distribute and modify the lisp source files that are the output
20# of mkerrcodes.awk.  You need not follow the terms of the GNU General
21# Public License when using or distributing such scripts, even though
22# portions of the text of mkerrcodes.awk appear in them.  The GNU
23# General Public License (GPL) does govern all other use of the material
24# that constitutes the mkerrcodes.awk program.
25#
26# Certain portions of the mkerrcodes.awk source text are designed to be
27# copied (in certain cases, depending on the input) into the output of
28# mkerrcodes.awk.  We call these the "data" portions.  The rest of the
29# mkerrcodes.awk source text consists of comments plus executable code
30# that decides which of the data portions to output in any given case.
31# We call these comments and executable code the "non-data" portions.
32# mkerrcodes.awk never copies any of the non-data portions into its output.
33#
34# This special exception to the GPL applies to versions of mkerrcodes.awk
35# released by g10 Code GmbH.  When you make and distribute a modified version
36# of mkerrcodes.awk, you may extend this special exception to the GPL to
37# apply to your modified version as well, *unless* your modified version
38# has the potential to copy into its output some of the text that was the
39# non-data portion of the version that you started with.  (In other words,
40# unless your change moves or copies text from the non-data portions to the
41# data portions.)  If your modification has such potential, you must delete
42# any notice of this special exception to the GPL from your modified version.
43
44# The input file is in the following format:
45# [CODE SYMBOL...]
46# @errnos@
47# [CODE SYMBOL...]
48#
49# The difference between the sections is how symbol is transformed.
50# The second section gets GPG_ERR_ prepended before processing.
51#
52# Comments (starting with # and ending at the end of the line) are removed,
53# as is trailing whitespace.
54
55BEGIN {
56  FS="[ \t]+";
57  print ";;;; Output of mkerrcodes.awk.  DO NOT EDIT.";
58  print "";
59  print ";;; Copyright (C) 2006 g10 Code GmbH";
60  print ";;;";
61  print ";;; This file is part of libgpg-error.";
62  print ";;;";
63  print ";;; libgpg-error is free software; you can redistribute it and/or";
64  print ";;; modify it under the terms of the GNU Lesser General Public License";
65  print ";;; as published by the Free Software Foundation; either version 2.1 of";
66  print ";;; the License, or (at your option) any later version.";
67  print ";;;";
68  print ";;; libgpg-error is distributed in the hope that it will be useful, but";
69  print ";;; WITHOUT ANY WARRANTY; without even the implied warranty of";
70  print ";;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU";
71  print ";;; Lesser General Public License for more details.";
72  print ";;;";
73  print ";;; You should have received a copy of the GNU Lesser General Public";
74  print ";;; License along with libgpg-error; if not, write to the Free";
75  print ";;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA";
76  print ";;; 02111-1307, USA.";
77  print "";
78
79  header = 1;
80  errnos = 0;
81}
82
83/^#/ { next; }
84
85header {
86  if (errnos)
87    {
88      if ($1 ~ /^[0123456789]+$/)
89	{
90	  header = 0;
91
92	  print "";
93	  print "  ;; The following error codes map system errors.";
94	}
95    }
96  else
97    {
98      if ($1 ~ /^[0123456789]+$/)
99	{
100	  header = 0;
101	  
102	  print "(in-package :gpg-error)";
103	  print "";
104	  print ";;; The error code type gpg-err-code-t.";
105	  print "";
106	  print ";;; This is used for system error codes.";
107	  print "(defconstant +gpg-err-system-error+ (ash 1 15))";
108	  print "";
109	  print ";;; This is one more than the largest allowed entry.";
110	  print "(defconstant +gpg-err-code-dim+ 65536)";
111	  print "";
112	  print ";;; A helper macro to have the keyword values evaluated.";
113	  print "(defmacro defcenum-eval (type doc &rest vals)";
114	  print "  `(defcenum ,type ,doc";
115	  print "    ,@(loop for v in vals";
116	  print "            collect `(,(first v) ,(eval (second v))))))";
117	  print "";
118	  print "(defcenum-eval gpg-err-code-t";
119	  print "    \"The GPG error code type.\"";
120	}
121    }
122}
123
124!header {
125  sub (/\#.+/, "");
126  sub (/[ 	]+$/, ""); # Strip trailing space and tab characters.
127
128  if (/^$/)
129    next;
130
131  # The following can happen for GPG_ERR_CODE_DIM.
132  if ($1 == "")
133    next;
134
135  if (/^@errnos@$/)
136    {
137      header = 1;
138      errnos = 1;
139      next;
140    }
141
142  $2 = tolower($2);
143  gsub ("_", "-", $2);
144
145  if (errnos)
146    print "  (:gpg-err-" $2 " (logior +gpg-err-system-error+ " $1 "))";
147  else
148    print "  (:" $2 " " $1 ")";
149}
150
151END {
152  # I am very sorry to break lisp coding style here.
153  print ")";
154}
155