51 lines
1.7 KiB
Perl
51 lines
1.7 KiB
Perl
#!/usr/local/bin/perl -pi
|
|
|
|
# Beek - 970910
|
|
# Perl, as a language, is far from my favorite. However, this task is
|
|
# a good example of the kind of thing it is great at. It would be hard
|
|
# to express this anywhere nearly as concisely in any other language.
|
|
|
|
# Note: This script isn't guaranteed to get things 100% correct, but it
|
|
# does do a pretty good job of guessing what is meant, and the remaining
|
|
# cases shouldn't be hard to fix by hand.
|
|
#
|
|
# As an example, it gets every instance of 'static' in the Lima mudlib
|
|
# correct (all 513 of them!).
|
|
#
|
|
# Example usage:
|
|
#
|
|
# find mudlib -name "*.c" -print | xargs /path/to/this/script
|
|
|
|
# Note that there is no checking whether things appear in quotes, which is
|
|
# probably the most likely way this can mess up.
|
|
#
|
|
# if it contains an open (, which is not part of a ({, ([, or (:, then it
|
|
# is a function prototype or definition
|
|
#
|
|
# Note: this is wrong for initializers that contain (. For example
|
|
# static object this = this_object(); Perhaps we should handle =
|
|
# first ...
|
|
if (/\([^{[:]/) {
|
|
s/static/protected/;
|
|
}
|
|
# commas and assignments are pretty clear indictations of variables. Note
|
|
# that we don't have to worry about commas in argument lists since we have
|
|
# already handled lines with (, which must appear between static and any comma.
|
|
elsif (/,/ || /=/) {
|
|
s/static/nosave/;
|
|
}
|
|
# static with a ; on the same line implies the entire line is here. If it
|
|
# was a prototype, it had a (. Must be a variable.
|
|
elsif (/;/) {
|
|
s/static/nosave/;
|
|
}
|
|
# This handles the common practice of doing things like:
|
|
#
|
|
# static
|
|
# void create() {
|
|
#
|
|
# which is more common than most other uses of static alone on a line
|
|
else {
|
|
s/static/protected/;
|
|
}
|