#!/usr/bin/perl ## -------------------------------------------------------------------------- ## ## Copyright 1996-2009 The NASM Authors - All Rights Reserved ## See the file AUTHORS included with the NASM distribution for ## the specific copyright holders. ## ## Redistribution and use in source and binary forms, with or without ## modification, are permitted provided that the following ## conditions are met: ## ## * Redistributions of source code must retain the above copyright ## notice, this list of conditions and the following disclaimer. ## * Redistributions in binary form must reproduce the above ## copyright notice, this list of conditions and the following ## disclaimer in the documentation and/or other materials provided ## with the distribution. ## ## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND ## CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, ## INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF ## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE ## DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT ## NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; ## LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ## HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN ## CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR ## OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, ## EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ## ## -------------------------------------------------------------------------- # # Sync the output file list between Makefiles # Use the mkdep.pl parameters to get the filename syntax # # The first file is the source file; the other ones target. # %def_hints = ('object-ending' => '.o', 'path-separator' => '/', 'continuation' => "\\"); sub do_transform($$) { my($l, $h) = @_; my($ps) = $$h{'path-separator'}; $l =~ s/\x01/$$h{'object-ending'}/g; $l =~ s/\x03/$$h{'continuation'}/g; if ($ps eq '') { # Remove the path separator and the preceeding directory $l =~ s/[^\s\=]*\x02//g; } else { # Convert the path separator $l =~ s/\x02/$ps/g; } return $l; } undef %line_lists; $first = 1; $first_file = $ARGV[0]; die unless (defined($first_file)); foreach $file (@ARGV) { open(FILE, '<', $file) or die; # First, read the syntax hints %hints = %def_hints; while (defined($line = )) { if ( $line =~ /^\s*\#\s*@([a-z0-9-]+):\s*\"([^\"]*)\"/ ) { $hints{$1} = $2; } } # Read and process the file seek(FILE,0,0); @lines = (); undef $processing; while (defined($line = )) { chomp $line; if (defined($processing)) { if ($line =~ /^\#-- End ([^-\#]*[^-#\s]) --\#$/) { if ($1 ne $processing) { die "$0: $file: Mismatched Begin and End lines (\"$processing\" -> \"$1\"\n"; } push(@lines, $line."\n"); undef $processing; } elsif ($first) { my $xl = $line; my $oe = "\Q$hints{'object-ending'}"; my $ps = "\Q$hints{'path-separator'}"; my $cn = "\Q$hints{'continuation'}"; $xl =~ s/${oe}(\s|$)/\x01$1/g; $xl =~ s/${ps}/\x02/g; $xl =~ s/${cn}$/\x03/; push(@{$line_lists{$processing}}, $xl); push(@lines, $line); } } else { push(@lines, $line."\n"); if ($line =~ '#-- Begin ([^-\#]*[^-#\s]) --#') { $processing = $1; if ($first) { if (defined($line_lists{$processing})) { die "$0: $file: Repeated Begin block: $processing\n"; } $line_lists{$processing} = []; } elsif (!$first) { if (!defined($line_lists{$processing})) { die "$0: $file: Begin block without template\n"; } push(@lines, "# Edit in $first_file, not here!\n"); foreach $l (@{$line_lists{$processing}}) { push(@lines, do_transform($l, \%hints)."\n"); } } } } } close(FILE); # Write the file back out if (!$first) { open(FILE, '>', $file) or die; print FILE @lines; close(FILE); } undef @lines; $first = 0; }