]> rtime.felk.cvut.cz Git - socketcan-devel.git/blob - strip-src
net/can bugfix: use after free bug in can protocol drivers
[socketcan-devel.git] / strip-src
1 #!/usr/bin/perl
2 #
3 # $Id$ 
4 #
5 # Strip lines from sources files:
6
7 # * Eliminate CPP conditional compilation for different kernel version, i.e.
8 #   eliminate all occurences of #if LINUX_VERSION_CODE < KERNEL_VERSION(...)
9 #   and likewise for <=, >, >=, ==, and !=.
10 #
11 # * Eliminate all Subversion Id and RCSID() lines.
12 #
13 # Call the program as
14 #
15 #     strip-src [-v <version>] [-i] [-d] [<file>]
16 #
17 # The -v option will generate a source file for specified kernel version
18 # where <version> is the kernel version you want the code to be generated
19 # for, in the form <major>.<minor>.<patchlevel>.
20 #
21 # The -i option will strip all Subversion Id lines from the the source.
22 #
23 # The -d (debug) option will give you some output on what the program does.
24 #
25 # If <file> is given, read that source file, otherwise stdin.
26 #
27 # The result will be output on stdout.
28
29 require("getopts.pl");
30
31 $re_if = "^\\#if LINUX_VERSION_CODE (==|!=|<|<=|>|>=) " .
32     "KERNEL_VERSION\\((\\d+),(\\d+),(\\d+)\\)";
33 $re_elif = "^\\#elif LINUX_VERSION_CODE (==|!=|<|<=|>|>=) " .
34     "KERNEL_VERSION\\((\\d+),(\\d+),(\\d+)\\)";
35
36 Getopts("div:");
37 $debug = $opt_d;
38
39 if (defined($opt_v)) {
40     $version = $opt_v;
41 }
42
43 @lines = <>;
44 unshift(@lines, "");
45
46 if (defined($opt_v)) {
47     strip_kversion($opt_v);
48 }
49
50 if (defined($opt_i)) {
51     strip_id();
52 }
53
54 for (@lines) {
55     print if (defined($_));
56 }
57
58 sub strip_id {
59     my($i);
60     
61     for $i (0..$#lines) {
62         
63         if ($lines[$i] =~ /include.*linux(\/can)?\/version\.h/) {
64             delete_line($i, "<del>");
65         }
66         
67         if ($lines[$i] =~ /RCSID/) {
68             delete_line($i, "<del>");
69             while ($lines[++$i] eq "\n") {
70                 delete_line($i, "<skip>");
71             }
72         }
73
74         if ($lines[$i] =~ /\$Id.*\$/) {
75             delete_line($i, "<del>");
76             while ($lines[++$i] eq " *\n") {
77                 delete_line($i, "<skip>");
78             }
79         }
80     }
81 }
82
83
84 sub strip_kversion {
85     my($version) = @_;
86     my($i, $state, $skip, $level);
87
88     $level   = 0;
89     $state   = -1;
90
91     for $i (1..$#lines) {
92         $_ = $lines[$i];
93         if ($state == -1) {
94             if (/$re_if/) {
95                 $state = compare($version, $1, $2, $3, $4);
96                 $done  = $state;
97                 delete_line($i, "<del>");
98                 $skip = ($lines[$i-1] eq "\n");
99             }
100         } else {
101             if ($level == 0 && /$re_elif/) {
102                 $state = compare($version, $1, $2, $3, $4);
103                 $state &= !$done;
104                 $done  |= $state;
105                 delete_line($i, "<del>");
106             } elsif ($level == 0 && /^\#else/) {
107                 $state  = !$done;
108                 $done  |= $state;
109                 delete_line($i, "<del>");
110             } elsif ($level == 0 && /^\#endif/) {
111                 $state = -1;
112                 delete_line($i, "<del>");
113
114                 while ($skip && $lines[$i+1] eq "\n") {
115                     $i++;
116                     delete_line($i, "<skip>");
117                 }
118             } elsif (/^\#if/) {
119                 $level++;
120                 delete_line($i, "<del>");
121             } elsif (/^\#endif/) {
122                 $level--;
123                 delete_line($i, "<del>");
124             } elsif ($state == 1) {
125                 $skip = 0;
126             } else {
127                 delete_line($i, "<del>");
128             }
129         }
130     }
131 }
132
133 sub compare {
134     my($version, $op, $major, $minor, $patchlevel) = @_;
135
136     my($mj, $mn, $pl) = split(/\./, $version);
137
138     if ($op eq "==" && $mj == $major && $mn == $minor && $pl == $patchlevel) {
139         return 1;
140     } elsif ($op eq "!=" &&
141              ($mj != $major || $mn != $minor || $pl != $patchlevel)) {
142         return 1;
143     } elsif ($op eq "<" &&
144              ($mj < $major ||
145               $mj == $major && ($mn < $minor || 
146                                 $mn == $minor && $pl < $patchlevel))) {
147         return 1;
148     } elsif ($op eq "<=" &&
149              ($mj < $major ||
150               $mj == $major && ($mn < $minor || 
151                                 $mn == $minor && $pl <= $patchlevel))) {
152         return 1;
153     } elsif ($op eq ">" &&
154              ($mj > $major ||
155               $mj == $major && ($mn > $minor || 
156                                 $mn == $minor && $pl > $patchlevel))) {
157         return 1;
158     } elsif ($op eq ">=" &&
159              ($mj > $major ||
160               $mj == $major && ($mn > $minor || 
161                                 $mn == $minor && $pl >= $patchlevel))) {
162         return 1;
163     } else {
164         return 0;
165     }
166 }
167
168 sub delete_line {
169     my($lineno, $dbg) = @_;
170     
171     if ($debug) {
172         $lines[$lineno] = "$dbg\n";
173     } else {
174         undef($lines[$lineno]);
175     }
176 }