]> rtime.felk.cvut.cz Git - socketcan-devel.git/blob - strip-src
Add kernel version depency for Kernel 3.1.x which extended __rtnl_register().
[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] [-m] [-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 -m option will replace macros like ND2D with real variable name.
24 #
25 # The -d (debug) option will give you some output on what the program does.
26 #
27 # If <file> is given, read that source file, otherwise stdin.
28 #
29 # The result will be output on stdout.
30
31 require("getopts.pl");
32
33 $re_if = "^\\#if LINUX_VERSION_CODE (==|!=|<|<=|>|>=) " .
34     "KERNEL_VERSION\\((\\d+),(\\d+),(\\d+)\\)";
35 $re_elif = "^\\#elif LINUX_VERSION_CODE (==|!=|<|<=|>|>=) " .
36     "KERNEL_VERSION\\((\\d+),(\\d+),(\\d+)\\)";
37
38 Getopts("dimv:");
39 $debug = $opt_d;
40
41 if (defined($opt_v)) {
42     $version = $opt_v;
43 }
44
45 @lines = <>;
46 unshift(@lines, "");
47
48 if (defined($opt_v)) {
49     strip_kversion($opt_v);
50     replace_socketcan($opt_v);
51
52     if (defined($opt_m)) {
53         replace_macros($opt_v);
54     }
55 }
56
57 if (defined($opt_i)) {
58     strip_id();
59 }
60
61 for (@lines) {
62     print if (defined($_));
63 }
64
65 sub replace_socketcan {
66     my($i);
67
68     for $i (0..$#lines) {
69         $lines[$i] =~ s+socketcan/can+linux/can+g;
70     }
71 }
72
73 sub replace_macros {
74     my($version) = @_;
75     my($i);
76
77     $old = compare($version, "<", "2", "6", "21");
78
79     for $i (0..$#lines) {
80
81         if ($lines[$i] =~ /#define ND2D/) {
82             delete_line($i, "<del>");
83         } else {
84             if ($old) {
85                 $lines[$i] =~ s/ND2D\(\b(\w+)\b\)/$1\->class_dev.dev/g;
86             } else {
87                 $lines[$i] =~ s/ND2D\(\b(\w+)\b\)/$1\->dev.parent/g;
88             }
89         }
90     }
91 }
92
93 sub strip_id {
94     my($i);
95
96     for $i (0..$#lines) {
97
98         if ($lines[$i] =~ /include.*linux(\/can)?\/version\.h/) {
99             delete_line($i, "<del>");
100         }
101
102         if ($lines[$i] =~ /RCSID/) {
103             delete_line($i, "<del>");
104             while ($lines[++$i] eq "\n") {
105                 delete_line($i, "<skip>");
106             }
107         }
108
109         if ($lines[$i] =~ /\$Id.*\$/) {
110             delete_line($i, "<del>");
111             while ($lines[++$i] eq " *\n") {
112                 delete_line($i, "<skip>");
113             }
114         }
115     }
116 }
117
118 sub strip_kversion {
119     my($version) = @_;
120     my(@states, @levels, @dones, $state, $level, $done, $skip, $i);
121
122     @levels = ();
123     @states = ();
124     $state  = 1;
125     $level  = 0;
126     $done   = 0;
127
128     for $i (1..$#lines) {
129         $_ = $lines[$i];
130         if ($state == 1 && /$re_if/) {
131             $level++;
132             unshift @levels, $level;
133             unshift @states, $state;
134             unshift @dones,  $done;
135             $state = compare($version, $1, $2, $3, $4);
136             $done  = $state;
137             delete_line($i, "<del>");
138             $skip = ($lines[$i-1] eq "\n");
139         } elsif ($level == $levels[0] && /$re_elif/) {
140             $state = compare($version, $1, $2, $3, $4);
141             $state &= !$done;
142             $done  |= $state;
143             delete_line($i, "<del>");
144         } elsif ($level == $levels[0] && /^\#else/) {
145             $state  = !$done;
146             $done  |= $state;
147             delete_line($i, "<del>");
148         } elsif ($level == $levels[0] && /^\#endif/) {
149             $state = shift @states;
150             $done  = shift @dones;
151             $level = shift @levels;
152             $level--;
153             delete_line($i, "<del>");
154
155             while ($skip && $lines[$i+1] eq "\n") {
156                 $i++;
157                 delete_line($i, "<skip>");
158             }
159         } elsif (/^\#if/) {
160             $level++;
161         } elsif (/^\#endif/) {
162             $level--;
163         }
164         if ($state == 1) {
165             $skip = 0;
166         } else {
167             delete_line($i, "<del>");
168         }
169     }
170 }
171
172 sub compare {
173     my($version, $op, $major, $minor, $patchlevel) = @_;
174
175     my($mj, $mn, $pl) = split(/\./, $version);
176
177     if ($op eq "==" && $mj == $major && $mn == $minor && $pl == $patchlevel) {
178         return 1;
179     } elsif ($op eq "!=" &&
180              ($mj != $major || $mn != $minor || $pl != $patchlevel)) {
181         return 1;
182     } elsif ($op eq "<" &&
183              ($mj < $major ||
184               $mj == $major && ($mn < $minor ||
185                                 $mn == $minor && $pl < $patchlevel))) {
186         return 1;
187     } elsif ($op eq "<=" &&
188              ($mj < $major ||
189               $mj == $major && ($mn < $minor ||
190                                 $mn == $minor && $pl <= $patchlevel))) {
191         return 1;
192     } elsif ($op eq ">" &&
193              ($mj > $major ||
194               $mj == $major && ($mn > $minor ||
195                                 $mn == $minor && $pl > $patchlevel))) {
196         return 1;
197     } elsif ($op eq ">=" &&
198              ($mj > $major ||
199               $mj == $major && ($mn > $minor ||
200                                 $mn == $minor && $pl >= $patchlevel))) {
201         return 1;
202     } else {
203         return 0;
204     }
205 }
206
207 sub delete_line {
208     my($lineno, $dbg) = @_;
209
210     if ($debug) {
211         $lines[$lineno] = "$dbg\n";
212     } else {
213         undef($lines[$lineno]);
214     }
215 }