X-Git-Url: http://rtime.felk.cvut.cz/gitweb/socketcan-devel.git/blobdiff_plain/6d49ea9d4e3d2978c75e1380d298ecaf344950cb..dd9a4336edfb3c48675b185deefe0e449abfede6:/strip-src diff --git a/strip-src b/strip-src index d6f59eb..1e5ea2b 100755 --- a/strip-src +++ b/strip-src @@ -1,24 +1,26 @@ #!/usr/bin/perl # -# $Id$ +# $Id$ # # Strip lines from sources files: -# +# # * Eliminate CPP conditional compilation for different kernel version, i.e. # eliminate all occurences of #if LINUX_VERSION_CODE < KERNEL_VERSION(...) -# and likewise for <=, >, and >=. +# and likewise for <=, >, >=, ==, and !=. # -# * Eliminate all Subversion $Id$ and RCSID() lines. +# * Eliminate all Subversion Id and RCSID() lines. # # Call the program as # -# strip-src [-v ] [-i] [-d] [] +# strip-src [-v ] [-i] [-m] [-d] [] # # The -v option will generate a source file for specified kernel version # where is the kernel version you want the code to be generated # for, in the form ... # -# The -i option will strip all Subversion $Id$ lines from the the source. +# The -i option will strip all Subversion Id lines from the the source. +# +# The -m option will replace macros like ND2D with real variable name. # # The -d (debug) option will give you some output on what the program does. # @@ -28,10 +30,12 @@ require("getopts.pl"); -$re = "^\\#if LINUX_VERSION_CODE (<|<=|>|>=) " . +$re_if = "^\\#if LINUX_VERSION_CODE (==|!=|<|<=|>|>=) " . + "KERNEL_VERSION\\((\\d+),(\\d+),(\\d+)\\)"; +$re_elif = "^\\#elif LINUX_VERSION_CODE (==|!=|<|<=|>|>=) " . "KERNEL_VERSION\\((\\d+),(\\d+),(\\d+)\\)"; -Getopts("div:"); +Getopts("dimv:"); $debug = $opt_d; if (defined($opt_v)) { @@ -43,6 +47,11 @@ unshift(@lines, ""); if (defined($opt_v)) { strip_kversion($opt_v); + replace_socketcan($opt_v); + + if (defined($opt_m)) { + replace_macros($opt_v); + } } if (defined($opt_i)) { @@ -53,63 +62,109 @@ for (@lines) { print if (defined($_)); } +sub replace_socketcan { + my($i); + + for $i (0..$#lines) { + $lines[$i] =~ s+socketcan/can+linux/can+g; + } +} + +sub replace_macros { + my($version) = @_; + my($i); + + $old = compare($version, "<", "2", "6", "21"); + + for $i (0..$#lines) { + + if ($lines[$i] =~ /#define ND2D/) { + delete_line($i, ""); + } else { + if ($old) { + $lines[$i] =~ s/ND2D\(\b(\w+)\b\)/$1\->class_dev.dev/g; + } else { + $lines[$i] =~ s/ND2D\(\b(\w+)\b\)/$1\->dev.parent/g; + } + } + } +} + sub strip_id { my($i); - + for $i (0..$#lines) { - + if ($lines[$i] =~ /include.*linux(\/can)?\/version\.h/) { delete_line($i, ""); } - - if ($lines[$i] =~ /RCSID/ || $lines[$i] =~ /\$Id.*\$/) { + + if ($lines[$i] =~ /RCSID/) { delete_line($i, ""); while ($lines[++$i] eq "\n") { delete_line($i, ""); } } + + if ($lines[$i] =~ /\$Id.*\$/) { + delete_line($i, ""); + while ($lines[++$i] eq " *\n") { + delete_line($i, ""); + } + } } } - sub strip_kversion { my($version) = @_; - my($i, $state, $skip, $level); + my(@states, @levels, @dones, $state, $level, $done, $skip, $i); - $level = 0; - $state = -1; + @levels = (); + @states = (); + $state = 1; + $level = 0; + $done = 0; - for ($i = 1; $i <= $#lines; $i++) { + for $i (1..$#lines) { $_ = $lines[$i]; - if ($state == -1) { - if (/$re/) { - $state = compare($version, $1, $2, $3, $4); - delete_line($i, ""); - $skip = ($lines[$i-1] eq "\n"); + if ($state == 1 && /$re_if/) { + $level++; + unshift @levels, $level; + unshift @states, $state; + unshift @dones, $done; + $state = compare($version, $1, $2, $3, $4); + $done = $state; + delete_line($i, ""); + $skip = ($lines[$i-1] eq "\n"); + } elsif ($level == $levels[0] && /$re_elif/) { + $state = compare($version, $1, $2, $3, $4); + $state &= !$done; + $done |= $state; + delete_line($i, ""); + } elsif ($level == $levels[0] && /^\#else/) { + $state = !$done; + $done |= $state; + delete_line($i, ""); + } elsif ($level == $levels[0] && /^\#endif/) { + $state = shift @states; + $done = shift @dones; + $level = shift @levels; + $level--; + delete_line($i, ""); + + while ($skip && $lines[$i+1] eq "\n") { + $i++; + delete_line($i, ""); } + } elsif (/^\#if/) { + $level++; + } elsif (/^\#endif/) { + $level--; + } + if ($state == 1) { + $skip = 0; } else { - if ($level == 0 && /^\#else/) { - $state = !$state; - delete_line($i, ""); - } elsif ($level == 0 && /^\#endif/) { - $state = -1; - delete_line($i, ""); - - while ($skip && $lines[$i+1] eq "\n") { - $i++; - delete_line($i, ""); - } - } elsif (/^\#if/) { - $level++; - delete_line($i, ""); - } elsif (/^\#endif/) { - $level--; - delete_line($i, ""); - } elsif ($state == 1) { - $skip = 0; - } else { - delete_line($i, ""); - } + delete_line($i, ""); } } } @@ -118,25 +173,30 @@ sub compare { my($version, $op, $major, $minor, $patchlevel) = @_; my($mj, $mn, $pl) = split(/\./, $version); - - if ($op eq "<" && - ($mj < $major || - $mj == $major && ($mn < $minor || - $mn == $minor && $pl < $patchlevel))) { + + if ($op eq "==" && $mj == $major && $mn == $minor && $pl == $patchlevel) { + return 1; + } elsif ($op eq "!=" && + ($mj != $major || $mn != $minor || $pl != $patchlevel)) { + return 1; + } elsif ($op eq "<" && + ($mj < $major || + $mj == $major && ($mn < $minor || + $mn == $minor && $pl < $patchlevel))) { return 1; } elsif ($op eq "<=" && ($mj < $major || - $mj == $major && ($mn < $minor || + $mj == $major && ($mn < $minor || $mn == $minor && $pl <= $patchlevel))) { return 1; } elsif ($op eq ">" && ($mj > $major || - $mj == $major && ($mn > $minor || + $mj == $major && ($mn > $minor || $mn == $minor && $pl > $patchlevel))) { return 1; } elsif ($op eq ">=" && ($mj > $major || - $mj == $major && ($mn > $minor || + $mj == $major && ($mn > $minor || $mn == $minor && $pl >= $patchlevel))) { return 1; } else { @@ -146,7 +206,7 @@ sub compare { sub delete_line { my($lineno, $dbg) = @_; - + if ($debug) { $lines[$lineno] = "$dbg\n"; } else {