| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- #!/usr/bin/env perl
- # This script is a hack. It identifies things which it believes to be
- # constant, then replaces them throughout the code.
- #
- # Constants are identified as properties declared in object notation
- # with values consisting only of capital letters and underscores. If
- # the first character is an underscore, the constant is private, and
- # can be removed entirely.
- #
- # The script dies if any two constants have the same property name but
- # different values.
- my $script = join '', <>;
- # remove comments
- $script =~ s=/\*([^\*]|\*+[^\/])*\*/==g;
- $script =~ s=//.*==g;
- sub preserve {
- my $stuff = shift;
- $stuff =~ s/,//;
- return $stuff;
- }
- my %constants = ();
- sub add_constant {
- my ($name, $value) = @_;
- if (defined $constants{$name} && $constants{$name} ne $value) {
- print STDERR "variant constant $name = $value";
- die;
- } else {
- $constants{$name} = $value;
- #print STDERR "constant: $name = $value\n";
- }
- }
- # find private constants
- while ($script =~
- s/([,\{]) \s* # indicator that this is part of an object
- (_[A-Z0-9_]+) \s* : \s* # all-caps variable name beginning with _
- (\d+|0x[0-9A-Fa-f]+) \s* # numeric value
- ([,\}]) # next part of object
- /preserve "$1$4"/ex) {
- add_constant $2, $3;
- }
- my $script2 = '';
- # find public constants
- while ($script =~
- s/^(.*?) # beginning of script
- ([,\{]) \s* # indicator that this is part of an object
- ([A-Z0-9_]+) \s* : \s* # all-caps variable name
- (\d+|0x[0-9A-Fa-f]+) \s* # numeric value
- ([,\}]) # next part of object([,\{]) \s*
- /$5/esx) {
- $script2 .= "$1$2$3:$4";
- add_constant $3, $4;
- }
- $script = "$script2$script";
- foreach (keys %constants) {
- my $value = $constants{$_};
- $script =~ s/(?:[a-zA-Z0-9_]+\.)+$_(?=[^a-zA-Z0-9_])/$value/g;
- }
- print $script;
|