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