[821] | 1 | #!/usr/bin/perl -w
|
---|
| 2 | #
|
---|
| 3 | # @(#) mk2knr.pl - generates a perl script that converts lexemes to K&R-style
|
---|
| 4 | #
|
---|
| 5 | # How to use this script:
|
---|
| 6 | # - In the busybox directory type 'examples/mk2knr.pl files-to-convert'
|
---|
| 7 | # - Review the 'convertme.pl' script generated and remove / edit any of the
|
---|
| 8 | # substitutions in there (please especially check for false positives)
|
---|
| 9 | # - Type './convertme.pl same-files-as-before'
|
---|
| 10 | # - Compile and see if it works
|
---|
| 11 | #
|
---|
| 12 | # BUGS: This script does not ignore strings inside comments or strings inside
|
---|
| 13 | # quotes (it probably should).
|
---|
| 14 |
|
---|
| 15 | # set this to something else if you want
|
---|
| 16 | $convertme = 'convertme.pl';
|
---|
| 17 |
|
---|
| 18 | # internal-use variables (don't touch)
|
---|
| 19 | $convert = 0;
|
---|
| 20 | %converted = ();
|
---|
| 21 |
|
---|
| 22 | # if no files were specified, print usage
|
---|
| 23 | die "usage: $0 file.c | file.h\n" if scalar(@ARGV) == 0;
|
---|
| 24 |
|
---|
| 25 | # prepare the "convert me" file
|
---|
| 26 | open(CM, ">$convertme") or die "convertme.pl $!";
|
---|
| 27 | print CM "#!/usr/bin/perl -p -i\n\n";
|
---|
| 28 |
|
---|
| 29 | # process each file passed on the cmd line
|
---|
| 30 | while (<>) {
|
---|
| 31 |
|
---|
| 32 | # if the line says "getopt" in it anywhere, we don't want to muck with it
|
---|
| 33 | # because option lists tend to include strings like "cxtzvOf:" which get
|
---|
| 34 | # matched by the "check for mixed case" regexps below
|
---|
| 35 | next if /getopt/;
|
---|
| 36 |
|
---|
| 37 | # tokenize the string into just the variables
|
---|
| 38 | while (/([a-zA-Z_][a-zA-Z0-9_]*)/g) {
|
---|
| 39 | $var = $1;
|
---|
| 40 |
|
---|
| 41 | # ignore the word "BusyBox"
|
---|
| 42 | next if ($var =~ /BusyBox/);
|
---|
| 43 |
|
---|
| 44 | # this checks for javaStyle or szHungarianNotation
|
---|
| 45 | $convert++ if ($var =~ /^[a-z]+[A-Z][a-z]+/);
|
---|
| 46 |
|
---|
| 47 | # this checks for PascalStyle
|
---|
| 48 | $convert++ if ($var =~ /^[A-Z][a-z]+[A-Z][a-z]+/);
|
---|
| 49 |
|
---|
| 50 | # if we want to add more checks, we can add 'em here, but the above
|
---|
| 51 | # checks catch "just enough" and not too much, so prolly not.
|
---|
| 52 |
|
---|
| 53 | if ($convert) {
|
---|
| 54 | $convert = 0;
|
---|
| 55 |
|
---|
| 56 | # skip ahead if we've already dealt with this one
|
---|
| 57 | next if ($converted{$var});
|
---|
| 58 |
|
---|
| 59 | # record that we've dealt with this var
|
---|
| 60 | $converted{$var} = 1;
|
---|
| 61 |
|
---|
| 62 | print CM "s/\\b$var\\b/"; # more to come in just a minute
|
---|
| 63 |
|
---|
| 64 | # change the first letter to lower-case
|
---|
| 65 | $var = lcfirst($var);
|
---|
| 66 |
|
---|
| 67 | # put underscores before all remaining upper-case letters
|
---|
| 68 | $var =~ s/([A-Z])/_$1/g;
|
---|
| 69 |
|
---|
| 70 | # now change the remaining characters to lower-case
|
---|
| 71 | $var = lc($var);
|
---|
| 72 |
|
---|
| 73 | print CM "$var/g;\n";
|
---|
| 74 | }
|
---|
| 75 | }
|
---|
| 76 | }
|
---|
| 77 |
|
---|
| 78 | # tidy up and make the $convertme script executable
|
---|
| 79 | close(CM);
|
---|
| 80 | chmod 0755, $convertme;
|
---|
| 81 |
|
---|
| 82 | # print a helpful help message
|
---|
| 83 | print "Done. Scheduled name changes are in $convertme.\n";
|
---|
| 84 | print "Please review/modify it and then type ./$convertme to do the search & replace.\n";
|
---|