xref: /minix/lib/libc/gen/errlist.awk (revision 0a6a1f1d)
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	#__MINIX: We have more error numbers...
89	if (number < errno) {
90		printf("error number mismatch %d != %d\n", number, errno) > "/dev/stderr";
91		exit(1);
92	}
93	#__MINIX:start
94	while(errno < number) {
95		perror("UNDEFINED", errno, "Undefined error: " errno);
96		errno++;
97	}
98	#__MINIX:end
99	perror(name, number, desc);
100	errno++;
101}
102END {
103	printf("};\n\n");
104	if (!concat) {
105		printf("const int sys_nerr = sizeof(errlist) / sizeof(errlist[0]);\n");
106		printf("const char * const *sys_errlist = errlist;\n");
107	} else {
108		printf("static const int concat_nerr = %d;\n", errno);
109		printf("static const unsigned short concat_offset[] = {\n");
110		offsets[errno++] = offset;
111		for (j = 0; j < errno; j++) {
112			printf("\t%d,\n", offsets[j]);
113		}
114		printf("};\n");
115		if (offset > 65535) {
116			printf("Total errlist size doesn't fit into 16bit\n") > "/dev/stderr";
117			exit(1);
118		}
119	}
120}
121