]> rtime.felk.cvut.cz Git - socketcan-devel.git/blob - strip-src
974ce0205bc654e3bbb437a5270a83508b4c6b14
[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 LINUX_VERSION_CODE (<|<=|>|>=) " .
32     "KERNEL_VERSION\\((\\d+),(\\d+),(\\d+)\\)";
33
34 Getopts("div:");
35 $debug = $opt_d;
36
37 if (defined($opt_v)) {
38     $version = $opt_v;
39 }
40
41 @lines = <>;
42 unshift(@lines, "");
43
44 if (defined($opt_v)) {
45     strip_kversion($opt_v);
46 }
47
48 if (defined($opt_i)) {
49     strip_id();
50 }
51
52 for (@lines) {
53     print if (defined($_));
54 }
55
56 sub strip_id {
57     my($i);
58     
59     for $i (0..$#lines) {
60         
61         if ($lines[$i] =~ /include.*linux(\/can)?\/version\.h/) {
62             delete_line($i, "<del>");
63         }
64         
65         if ($lines[$i] =~ /RCSID/) {
66             delete_line($i, "<del>");
67             while ($lines[++$i] eq "\n") {
68                 delete_line($i, "<skip>");
69             }
70         }
71
72         if ($lines[$i] =~ /\$Id.*\$/) {
73             delete_line($i, "<del>");
74             while ($lines[++$i] eq " *\n") {
75                 delete_line($i, "<skip>");
76             }
77         }
78     }
79 }
80
81
82 sub strip_kversion {
83     my($version) = @_;
84     my($i, $state, $skip, $level);
85
86     $level   = 0;
87     $state   = -1;
88
89     for ($i = 1; $i <= $#lines; $i++) {
90         $_ = $lines[$i];
91         if ($state == -1) {
92             if (/$re/) {
93                 $state = compare($version, $1, $2, $3, $4);
94                 delete_line($i, "<del>");
95                 $skip = ($lines[$i-1] eq "\n");
96             }
97         } else {
98             if ($level == 0 && /^\#else/) {
99                 $state = !$state;
100                 delete_line($i, "<del>");
101             } elsif ($level == 0 && /^\#endif/) {
102                 $state = -1;
103                 delete_line($i, "<del>");
104
105                 while ($skip && $lines[$i+1] eq "\n") {
106                     $i++;
107                     delete_line($i, "<skip>");
108                 }
109             } elsif (/^\#if/) {
110                 $level++;
111                 delete_line($i, "<del>");
112             } elsif (/^\#endif/) {
113                 $level--;
114                 delete_line($i, "<del>");
115             } elsif ($state == 1) {
116                 $skip = 0;
117             } else {
118                 delete_line($i, "<del>");
119             }
120         }
121     }
122 }
123
124 sub compare {
125     my($version, $op, $major, $minor, $patchlevel) = @_;
126
127     my($mj, $mn, $pl) = split(/\./, $version);
128     
129     if ($op eq "<" &&
130         ($mj < $major ||
131          $mj == $major && ($mn < $minor || 
132                            $mn == $minor && $pl < $patchlevel))) {
133         return 1;
134     } elsif ($op eq "<=" &&
135              ($mj < $major ||
136               $mj == $major && ($mn < $minor || 
137                                 $mn == $minor && $pl <= $patchlevel))) {
138         return 1;
139     } elsif ($op eq ">" &&
140              ($mj > $major ||
141               $mj == $major && ($mn > $minor || 
142                                 $mn == $minor && $pl > $patchlevel))) {
143         return 1;
144     } elsif ($op eq ">=" &&
145              ($mj > $major ||
146               $mj == $major && ($mn > $minor || 
147                                 $mn == $minor && $pl >= $patchlevel))) {
148         return 1;
149     } else {
150         return 0;
151     }
152 }
153
154 sub delete_line {
155     my($lineno, $dbg) = @_;
156     
157     if ($debug) {
158         $lines[$lineno] = "$dbg\n";
159     } else {
160         undef($lines[$lineno]);
161     }
162 }