5 # Strip lines from sources files:
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 !=.
11 # * Eliminate all Subversion Id and RCSID() lines.
15 # strip-src [-v <version>] [-i] [-m] [-d] [<file>]
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>.
21 # The -i option will strip all Subversion Id lines from the the source.
23 # The -m option will replace macros like ND2D with real variable name.
25 # The -d (debug) option will give you some output on what the program does.
27 # If <file> is given, read that source file, otherwise stdin.
29 # The result will be output on stdout.
31 require("getopts.pl");
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+)\\)";
41 if (defined($opt_v)) {
48 if (defined($opt_v)) {
49 strip_kversion($opt_v);
50 replace_socketcan($opt_v);
52 if (defined($opt_m)) {
53 replace_macros($opt_v);
57 if (defined($opt_i)) {
62 print if (defined($_));
65 sub replace_socketcan {
69 $lines[$i] =~ s+socketcan/can+linux/can+g;
77 $old = compare($version, "<", "2", "6", "21");
81 if ($lines[$i] =~ /#define ND2D/) {
82 delete_line($i, "<del>");
85 $lines[$i] =~ s/ND2D\(\b(\w+)\b\)/$1\->class_dev.dev/g;
87 $lines[$i] =~ s/ND2D\(\b(\w+)\b\)/$1\->dev.parent/g;
98 if ($lines[$i] =~ /include.*linux(\/can)?\/version\.h/) {
99 delete_line($i, "<del>");
102 if ($lines[$i] =~ /RCSID/) {
103 delete_line($i, "<del>");
104 while ($lines[++$i] eq "\n") {
105 delete_line($i, "<skip>");
109 if ($lines[$i] =~ /\$Id.*\$/) {
110 delete_line($i, "<del>");
111 while ($lines[++$i] eq " *\n") {
112 delete_line($i, "<skip>");
120 my(@states, @levels, @dones, $state, $level, $done, $skip, $i);
128 for $i (1..$#lines) {
130 if ($state == 1 && /$re_if/) {
132 unshift @levels, $level;
133 unshift @states, $state;
134 unshift @dones, $done;
135 $state = compare($version, $1, $2, $3, $4);
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);
143 delete_line($i, "<del>");
144 } elsif ($level == $levels[0] && /^\#else/) {
147 delete_line($i, "<del>");
148 } elsif ($level == $levels[0] && /^\#endif/) {
149 $state = shift @states;
150 $done = shift @dones;
151 $level = shift @levels;
153 delete_line($i, "<del>");
155 while ($skip && $lines[$i+1] eq "\n") {
157 delete_line($i, "<skip>");
161 } elsif (/^\#endif/) {
167 delete_line($i, "<del>");
173 my($version, $op, $major, $minor, $patchlevel) = @_;
175 my($mj, $mn, $pl) = split(/\./, $version);
177 if ($op eq "==" && $mj == $major && $mn == $minor && $pl == $patchlevel) {
179 } elsif ($op eq "!=" &&
180 ($mj != $major || $mn != $minor || $pl != $patchlevel)) {
182 } elsif ($op eq "<" &&
184 $mj == $major && ($mn < $minor ||
185 $mn == $minor && $pl < $patchlevel))) {
187 } elsif ($op eq "<=" &&
189 $mj == $major && ($mn < $minor ||
190 $mn == $minor && $pl <= $patchlevel))) {
192 } elsif ($op eq ">" &&
194 $mj == $major && ($mn > $minor ||
195 $mn == $minor && $pl > $patchlevel))) {
197 } elsif ($op eq ">=" &&
199 $mj == $major && ($mn > $minor ||
200 $mn == $minor && $pl >= $patchlevel))) {
208 my($lineno, $dbg) = @_;
211 $lines[$lineno] = "$dbg\n";
213 undef($lines[$lineno]);