| #!/usr/bin/perl |
| # SPDX-License-Identifier: BSD-2-Clause |
| # Copyright 2025 The NASM Authors - All Rights Reserved |
| |
| # |
| # Convert ultra-verbose in-file copyright statements to SPDX tags; |
| # strip trailing whitespace while we are at it... |
| # |
| use strict; |
| use integer; |
| |
| # Strip excessive comment barriers for the purpose of matching |
| sub stripcom($) { |
| my($l) = @_; |
| |
| $l =~ s/^(\S+) -+( \*)?$/$1/; |
| $l =~ s/^ \* -+( \*\/)$/$1/; # Tail comment in C block |
| return $1; |
| } |
| |
| foreach my $file (@ARGV) { |
| open(my $in, '<', $file) or die "$0: $file: $!\n"; |
| |
| my @lines = (); |
| my $copy; |
| my $ctail; |
| my $cpfx; |
| my $modified = 0; |
| |
| while (defined(my $ll = <$in>)) { |
| (my $l = $ll) =~ s/\s+$//; |
| $modified = 1 if ($l."\n" ne $ll); |
| |
| if ($l =~ /^(\s*\S+)\s+(Copyright [1-2].*)?$/) { |
| $copy = $2; |
| $ctail = $cpfx = $1; |
| $ctail = ' */' if ($cpfx eq ' *'); # C-style block comment |
| } elsif (defined($ctail) && (stripcom($l) eq $ctail)) { |
| # End of copyright comment. Walk backwards through the |
| # lines looking for the beginning. |
| while (scalar(@lines) && $lines[-1] =~ /^\Q$cpfx\E(\s.*)?/) { |
| pop(@lines); |
| } |
| |
| # Now the first line left is the start of the comment body; |
| # for line comments the entire comment is gone, but for a |
| # C-style block comment the comment start marker remains. |
| |
| my $npfx = $cpfx.' '; |
| $npfx = '# ' if ($npfx eq '## '); # Change ## to # |
| my $nsuf = ''; |
| |
| # Change C block comments to inline comments |
| if ($ctail eq ' */') { |
| pop(@lines) if ($lines[-1] =~ /^\/\*/); |
| $npfx = '/* '; |
| $nsuf = ' */'; |
| } |
| my @hdr = (); |
| # Shebang and emacs mode lines should be left at the top |
| while (scalar(@lines) && $lines[0] =~ /^(?:\#\!|.*\-\*\-)/) { |
| push(@hdr, shift(@lines)); |
| } |
| push(@hdr, $npfx.'SPDX-License-Identifier: BSD-2-Clause'.$nsuf); |
| push(@hdr, $npfx.$copy.$nsuf); |
| unshift(@lines, @hdr); |
| undef $ctail; |
| $modified = 1; |
| next; |
| } |
| |
| push(@lines, $l) if (defined($l)); |
| } |
| close($in); |
| |
| while (scalar(@lines) && $lines[-1] =~ /^\s*$/) { |
| pop(@lines); |
| $modified = 1; |
| } |
| next unless ($modified); |
| |
| open(my $out, '>', $file) or die "$0: $file: $!\n"; |
| print $out map { "$_\n" } @lines; |
| close($out); |
| } |
| exit 0; |