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 23die "usage: $0 file.c | file.h\n" if scalar(@ARGV) == 0; 24 25# prepare the "convert me" file 26open(CM, ">$convertme") or die "convertme.pl $!"; 27print CM "#!/usr/bin/perl -p -i\n\n"; 28 29# process each file passed on the cmd line 30while (<>) { 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 79close(CM); 80chmod 0755, $convertme; 81 82# print a helpful help message 83print "Done. Scheduled name changes are in $convertme.\n"; 84print "Please review/modify it and then type ./$convertme to do the search & replace.\n"; 85