1#! /usr/bin/awk -f
2#         $NetBSD: errlist.awk,v 1.4 2010/12/16 22:52:32 joerg Exp $
3#
4# Copyright (c) 2010 The NetBSD Foundation, Inc.
5# All rights reserved.
6#
7# This code is derived from software contributed to The NetBSD Foundation
8# by Christos Zoulas.
9#
10# Redistribution and use in source and binary forms, with or without
11# modification, are permitted provided that the following conditions
12# are met:
13# 1. Redistributions of source code must retain the above copyright
14#    notice, this list of conditions and the following disclaimer.
15# 2. Redistributions in binary form must reproduce the above copyright
16#    notice, this list of conditions and the following disclaimer in the
17#    documentation and/or other materials provided with the distribution.
18# 3. All advertising materials mentioning features or use of this software
19#    must display the following acknowledgement:
20#        This product includes software developed by the NetBSD
21#        Foundation, Inc. and its contributors.
22# 4. Neither the name of The NetBSD Foundation nor the names of its
23#    contributors may be used to endorse or promote products derived
24#    from this software without specific prior written permission.
25#
26# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
27# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
28# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
30# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36# POSSIBILITY OF SUCH DAMAGE.
37#
38function tabs(desc) {
39          l = length(desc) + 3;
40          if (concat)
41                    l++
42          if (l < 16)
43                    return "\t\t\t\t";
44          else if (l < 24)
45                    return "\t\t\t";
46          else if (l < 32)
47                    return "\t\t";
48          else if (l < 40)
49                    return "\t";
50          else
51                    return "";
52}
53function perror(name, number, desc)
54{
55          if (!concat) {
56                    printf("\t\"%s\",%s/* %d - %s */\n", desc, tabs(desc), number, name);
57          } else {
58                    offsets[number] = offset;
59                    offset += length(desc) + 1;
60                    printf("\t\"%s\\0\"%s/* %d - %s */\n", desc, tabs(desc), number, name);
61          }
62}
63BEGIN {
64          printf("/* Automatically generated file; do not edit */\n");
65          printf("#include <sys/cdefs.h>\n");
66          printf("__RCSID(\"$NetBSD: errlist.awk,v 1.4 2010/12/16 22:52:32 joerg Exp $\");\n");
67          printf("#include <errno.h>\n");
68          if (!concat) {
69                    printf("static const char *const errlist[] = {\n");
70          } else {
71                    printf("static const char concat_errlist[] = {\n");
72                    offset = 0;
73          }
74          perror("ENOERROR", 0, "Undefined error: 0");
75          errno = 1;
76}
77/^#define/ {
78          name = $2;
79          if (name == "ELAST")
80                    next;
81          number = $3;
82          if (number < 0 || number == "EAGAIN")
83                    next;
84          desc = $0;
85          i1 = index(desc, "/*") + 3;
86          l = length(desc);
87          desc = substr(desc, i1, l - i1 - 2);
88          if (number != errno) {
89                    printf("error number mismatch %d != %d\n", number, errno) > "/dev/stderr";
90                    exit(1);
91          }
92          perror(name, number, desc);
93          errno++;
94}
95END {
96          printf("};\n\n");
97          if (!concat) {
98                    printf("const int sys_nerr = sizeof(errlist) / sizeof(errlist[0]);\n");
99                    printf("const char * const *sys_errlist = errlist;\n");
100          } else {
101                    printf("static const int concat_nerr = %d;\n", errno);
102                    printf("static const unsigned short concat_offset[] = {\n");
103                    offsets[errno++] = offset;
104                    for (j = 0; j < errno; j++) {
105                              printf("\t%d,\n", offsets[j]);
106                    }
107                    printf("};\n");
108                    if (offset > 65535) {
109                              printf("Total errlist size doesn't fit into 16bit\n") > "/dev/stderr";
110                              exit(1);
111                    }
112          }
113}
114