chiark / gitweb /
[PATCH] update klibc to version 0.181
[elogind.git] / klibc / klibc / makeerrlist.pl
1 #!/usr/bin/perl
2 #
3 # This creates sys_errlist from <asm/errno.h> through somewhat
4 # heuristic matching.  It presumes the relevant entries are of the form
5 # #define Exxxx <integer> /* comment */
6 #
7
8 use FileHandle;
9
10 %errors  = ();
11 %errmsg  = ();
12 $maxerr  = -1;
13 $rootdir = '../linux/include/'; # Must have trailing /
14
15 sub parse_file($) {
16     my($file) = @_;
17     my($fh) = new FileHandle;
18     my($line, $error, $msg);
19     my($kernelonly) = 0;
20
21     $file = $rootdir.$file;
22
23     print STDERR "opening $file\n" unless ( $quiet );
24
25     if ( !($fh->open("< ".$file)) ) {
26         die "$0: cannot open $file\n";
27     }
28
29     while ( defined($line = <$fh>) ) {
30         if ( $kernelonly ) {
31             if ( $line =~ /^\#\s*endif/ ) {
32                 $kernelonly--;
33             } elsif ( $line =~ /^\#\sif/ ) {
34                 $kernelonly++;
35             }
36         } else {
37             if ( $line =~ /^\#\s*define\s+([A-Z0-9_]+)\s+([0-9]+)\s*\/\*\s*(.*\S)\s*\*\// ) {
38                 $error = $1;
39                 $errno = $2+0;
40                 $msg   = $3;
41                 print STDERR "$error ($errno) => \"$msg\"\n" unless ( $quiet );
42                 $errors{$errno} = $error;
43                 $errmsg{$errno} = $msg;
44                 $maxerr = $errno if ( $errno > $maxerr );
45             } elsif ( $line =~ /^\#\s*include\s+[\<\"](.*)[\>\"]/ ) {
46                 parse_file($1);
47             } elsif ( $line =~ /^\#\s*ifdef\s+__KERNEL__/ ) {
48                 $kernelonly++;
49             }
50         }
51     }
52     close($fh);
53     print STDERR "closing $file\n" unless ( $quiet );
54 }
55          
56 $v = $ENV{'KBUILD_VERBOSE'};
57 $quiet = defined($v) ? !$v : 0;
58
59 foreach $arg ( @ARGV ) {
60     if ( $arg eq '-q' ) {
61         $quiet = 1;
62     } elsif ( $arg =~ /^-(errlist|errnos|maxerr)$/ ) {
63         $type = $arg;
64     } else {
65         die "$0: Unknown option: $arg\n";
66     }
67 }
68
69 parse_file('linux/errno.h');
70
71 if ( $type eq '-errlist' ) {
72     print  "#include <errno.h>\n";
73     printf "const int sys_nerr = %d;\n", $maxerr+1;
74     printf "const char * const sys_errlist[%d] = {\n", $maxerr+1;
75     foreach $e ( sort(keys(%errors)) ) {
76         printf "  [%s] = \"%s\",\n", $errors{$e}, $errmsg{$e};
77     }
78     print "};\n";
79 } elsif ( $type eq '-errnos' ) {
80     print  "#include <errno.h>\n";
81     printf "const int sys_nerr = %d;\n", $maxerr+1;
82     printf "const char * const sys_errlist[%d] = {\n", $maxerr+1;
83     foreach $e ( sort(keys(%errors)) ) {
84         printf "  [%s] = \"%s\",\n", $errors{$e}, $errors{$e};
85     }
86     print "};\n";
87 } elsif ( $type eq '-maxerr' ) {
88     print $maxerr, "\n";
89 }
90
91