0
0
mirror of https://github.com/netwide-assembler/nasm.git synced 2025-10-10 00:25:06 -04:00
Files
nasm/tools/spdx.pl
2025-10-01 12:05:34 -07:00

87 lines
2.2 KiB
Perl
Executable File

#!/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;