124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik#!/usr/bin/perl -w
224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik# This script was originally based on the script of the same name from
324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik# the KDE SDK (by dfaure@kde.org)
424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik#
524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik# This version is
624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik#   Copyright (C) 2007, 2008 Adam D. Barratt
724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik#   Copyright (C) 2012 Francesco Poli
824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik#
924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik# This program is free software; you can redistribute it and/or modify
1024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik# it under the terms of the GNU General Public License as published by
1124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik# the Free Software Foundation; either version 2 of the License, or
1224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik# (at your option) any later version.
1324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik#
1424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik# This program is distributed in the hope that it will be useful,
1524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik# but WITHOUT ANY WARRANTY; without even the implied warranty of
1624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik# GNU General Public License for more details.
1824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik#
1924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik# You should have received a copy of the GNU General Public License along
2024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik# with this program. If not, see <http://www.gnu.org/licenses/>.
2124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
2224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik=head1 NAME
2324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
2424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiklicensecheck - simple license checker for source files
2524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
2624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik=head1 SYNOPSIS
2724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
2824385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikB<licensecheck> B<--help>|B<--version>
2924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
3024385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikB<licensecheck> [B<--no-conf>] [B<--verbose>] [B<--copyright>]
3124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik[B<-l>|B<--lines=>I<N>] [B<-i>|B<--ignore=>I<regex>] [B<-c>|B<--check=>I<regex>]
3224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik[B<-m>|B<--machine>] [B<-r>|B<--recursive>]
3324385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikI<list of files and directories to check>
3424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
3524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik=head1 DESCRIPTION
3624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
3724385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikB<licensecheck> attempts to determine the license that applies to each file
3824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikpassed to it, by searching the start of the file for text belonging to
3924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikvarious licenses.
4024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
4124385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikIf any of the arguments passed are directories, B<licensecheck> will add
4224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikthe files contained within to the list of files to process.
4324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
4424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik=head1 OPTIONS
4524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
4624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik=over 4
4724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
4824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik=item B<--verbose>, B<--no-verbose>
4924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
5024385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikSpecify whether to output the text being processed from each file before
5124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikthe corresponding license information.
5224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
5324385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikDefault is to be quiet.
5424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
5524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik=item B<-l=>I<N>, B<--lines=>I<N>
5624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
5724385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikSpecify the number of lines of each file's header which should be parsed
5824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikfor license information. (Default is 60).
5924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
6024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik=item B<-i=>I<regex>, B<--ignore=>I<regex>
6124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
6224385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikWhen processing the list of files and directories, the regular
6324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikexpression specified by this option will be used to indicate those which
6424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikshould not be considered (e.g. backup files, VCS metadata).
6524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
6624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik=item B<-r>, B<--recursive>
6724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
6824385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikSpecify that the contents of directories should be added
6924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikrecursively.
7024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
7124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik=item B<-c=>I<regex>, B<--check=>I<regex>
7224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
7324385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikSpecify a pattern against which filenames will be matched in order to
7424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikdecide which files to check the license of.
7524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
7624385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikThe default includes common source files.
7724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
7824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik=item B<--copyright>
7924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
8024385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikAlso display copyright text found within the file
8124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
8224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik=item B<-m>, B<--machine>
8324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
8424385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikDisplay the information in a machine readable way, i.e. in the form
8524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik<file><tab><license>[<tab><copyright>] so that it can be easily sorted
8624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikand/or filtered, e.g. with the B<awk> and B<sort> commands.
8724385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikNote that using the B<--verbose> option will kill the readability.
8824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
8924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik=item B<--no-conf>, B<--noconf>
9024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
9124385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikDo not read any configuration files. This can only be used as the first
9224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikoption given on the command-line.
9324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
9424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik=back
9524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
9624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik=head1 CONFIGURATION VARIABLES
9724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
9824385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikThe two configuration files F</etc/devscripts.conf> and
9924385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikF<~/.devscripts> are sourced by a shell in that order to set
10024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikconfiguration variables.  Command line options can be used to override
10124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikconfiguration file settings.  Environment variable settings are
10224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikignored for this purpose.  The currently recognised variables are:
10324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
10424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik=over 4
10524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
10624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik=item B<LICENSECHECK_VERBOSE>
10724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
10824385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikIf this is set to I<yes>, then it is the same as the B<--verbose> command
10924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikline parameter being used. The default is I<no>.
11024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
11124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik=item B<LICENSECHECK_PARSELINES>
11224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
11324385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikIf this is set to a positive number then the specified number of lines
11424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikat the start of each file will be read whilst attempting to determine
11524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikthe license(s) in use.  This is equivalent to the B<--lines> command line
11624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikoption.
11724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
11824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik=back
11924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
12024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik=head1 LICENSE
12124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
12224385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikThis code is copyright by Adam D. Barratt <I<adam@adam-barratt.org.uk>>,
12324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikall rights reserved; based on a script of the same name from the KDE
12424385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikSDK, which is copyright by <I<dfaure@kde.org>>.
12524385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikThis program comes with ABSOLUTELY NO WARRANTY.
12624385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikYou are free to redistribute this code under the terms of the GNU
12724385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikGeneral Public License, version 2 or later.
12824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
12924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik=head1 AUTHOR
13024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
13124385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikAdam D. Barratt <adam@adam-barratt.org.uk>
13224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
13324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik=cut
13424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
13524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikuse strict;
13624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikuse warnings;
13724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikuse Getopt::Long qw(:config gnu_getopt);
13824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikuse File::Basename;
13924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikuse Tie::File;
14024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikuse Fcntl 'O_RDONLY';
14124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
14224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiksub fatal($);
14324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiksub parse_copyright($);
14424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiksub parselicense($);
14524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiksub remove_comments($);
14624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
14724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikmy $progname = basename($0);
14824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
14924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik# From dpkg-source
15024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikmy $default_ignore_regex = '
15124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik# Ignore general backup files
15224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik(?:^|/).*~$|
15324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik# Ignore emacs recovery files
15424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik(?:^|/)\.#.*$|
15524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik# Ignore vi swap files
15624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik(?:^|/)\..*\.swp$|
15724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik# Ignore baz-style junk files or directories
15824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik(?:^|/),,.*(?:$|/.*$)|
15924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik# File-names that should be ignored (never directories)
16024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik(?:^|/)(?:DEADJOE|\.cvsignore|\.arch-inventory|\.bzrignore|\.gitignore)$|
16124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik# File or directory names that should be ignored
16224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik(?:^|/)(?:CVS|RCS|\.deps|\{arch\}|\.arch-ids|\.svn|\.hg|_darcs|\.git|
16324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik\.shelf|_MTN|\.bzr(?:\.backup|tags)?)(?:$|/.*$)
16424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik';
16524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
16624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik# Take out comments and newlines
16724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik$default_ignore_regex =~ s/^#.*$//mg;
16824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik$default_ignore_regex =~ s/\n//sg;
16924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
17024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikmy $default_check_regex = '\.(c(c|pp|xx)?|h(h|pp|xx)?|f(77|90)?|p(l|m)|xs|sh|php|py(|x)|rb|java|vala|el|sc(i|e)|cs|pas|inc|dtd|xsl|mod|m|tex|mli?)$';
17124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
17224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikmy $modified_conf_msg;
17324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
17424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikmy ($opt_verbose, $opt_lines, $opt_noconf) = ('', '', '');
17524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikmy $opt_ignore_regex = $default_ignore_regex;
17624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikmy $opt_check_regex = $default_check_regex;
17724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikmy $opt_recursive = 0;
17824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikmy $opt_copyright = 0;
17924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikmy $opt_machine = 0;
18024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikmy ($opt_help, $opt_version);
18124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikmy $def_lines = 60;
18224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
18324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik# Read configuration files and then command line
18424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik# This is boilerplate
18524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
18624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikif (@ARGV and $ARGV[0] =~ /^--no-?conf$/) {
18724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    $modified_conf_msg = "  (no configuration files read)";
18824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    shift;
18924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik} else {
19024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    my @config_files = ('/etc/devscripts.conf', '~/.devscripts');
19124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    my %config_vars = (
19224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		       'LICENSECHECK_VERBOSE' => 'no',
19324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		       'LICENSECHECK_PARSELINES' => $def_lines,
19424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik		      );
19524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    my %config_default = %config_vars;
19624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
19724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    my $shell_cmd;
19824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    # Set defaults
19924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    foreach my $var (keys %config_vars) {
20024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	$shell_cmd .= qq[$var="$config_vars{$var}";\n];
20124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    }
20224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    $shell_cmd .= 'for file in ' . join(" ", @config_files) . "; do\n";
20324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    $shell_cmd .= '[ -f $file ] && . $file; done;' . "\n";
20424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    # Read back values
20524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    foreach my $var (keys %config_vars) { $shell_cmd .= "echo \$$var;\n" }
20624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    my $shell_out = `/bin/bash -c '$shell_cmd'`;
20724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    @config_vars{keys %config_vars} = split /\n/, $shell_out, -1;
20824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
20924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    # Check validity
21024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    $config_vars{'LICENSECHECK_VERBOSE'} =~ /^(yes|no)$/
21124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	or $config_vars{'LICENSECHECK_VERBOSE'} = 'no';
21224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    $config_vars{'LICENSECHECK_PARSELINES'} =~ /^[1-9][0-9]*$/
21324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	or $config_vars{'LICENSECHECK_PARSELINES'} = $def_lines;
21424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
21524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    foreach my $var (sort keys %config_vars) {
21624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if ($config_vars{$var} ne $config_default{$var}) {
21724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	    $modified_conf_msg .= "  $var=$config_vars{$var}\n";
21824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
21924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    }
22024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    $modified_conf_msg ||= "  (none)\n";
22124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    chomp $modified_conf_msg;
22224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
22324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    $opt_verbose = $config_vars{'LICENSECHECK_VERBOSE'} eq 'yes' ? 1 : 0;
22424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    $opt_lines = $config_vars{'LICENSECHECK_PARSELINES'};
22524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik}
22624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
22724385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikGetOptions("help|h" => \$opt_help,
22824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	   "version|v" => \$opt_version,
22924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	   "verbose!" => \$opt_verbose,
23024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	   "lines|l=i" => \$opt_lines,
23124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	   "ignore|i=s" => \$opt_ignore_regex,
23224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	   "recursive|r" => \$opt_recursive,
23324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	   "check|c=s" => \$opt_check_regex,
23424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	   "copyright" => \$opt_copyright,
23524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	   "machine|m" => \$opt_machine,
23624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	   "noconf" => \$opt_noconf,
23724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	   "no-conf" => \$opt_noconf,
23824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	   )
23924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    or die "Usage: $progname [options] filelist\nRun $progname --help for more details\n";
24024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
24124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik$opt_lines = $def_lines if $opt_lines !~ /^[1-9][0-9]*$/;
24224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
24324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikif ($opt_noconf) {
24424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    fatal "--no-conf is only acceptable as the first command-line option!";
24524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik}
24624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikif ($opt_help) { help(); exit 0; }
24724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikif ($opt_version) { version(); exit 0; }
24824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
24924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikdie "Usage: $progname [options] filelist\nRun $progname --help for more details\n" unless @ARGV;
25024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
25124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik$opt_lines = $def_lines if not defined $opt_lines;
25224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
25324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikmy @files = ();
25424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikmy @find_args = ();
25524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikmy $files_count = @ARGV;
25624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
25724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikpush @find_args, qw(-not ( -path */LayoutTests/* -prune ) );
25824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikpush @find_args, qw(-not ( -path */out/Debug/* -prune ) );
25924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikpush @find_args, qw(-not ( -path */out/Release/* -prune ) );
26024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikpush @find_args, qw(-not ( -path .git* -prune ) );
26124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikpush @find_args, qw(-not ( -path .svn* -prune ) );
26224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
26324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikpush @find_args, qw(-maxdepth 1) unless $opt_recursive;
26424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikpush @find_args, qw(-follow -type f -print);
26524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
26624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikwhile (@ARGV) {
26724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    my $file = shift @ARGV;
26824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
26924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    if (-d $file) {
27024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	open FIND, '-|', 'find', $file, @find_args
27124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	    or die "$progname: couldn't exec find: $!\n";
27224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
27324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	while (<FIND>) {
27424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	    chomp;
27524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	    next unless m%$opt_check_regex%;
27624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	    # Skip empty files
27724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	    next if (-z $_);
27824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	    push @files, $_ unless m%$opt_ignore_regex%;
27924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
28024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	close FIND;
28124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    } else {
28224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	next unless ($files_count == 1) or $file =~ m%$opt_check_regex%;
28324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	push @files, $file unless $file =~ m%$opt_ignore_regex%;
28424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    }
28524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik}
28624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
28724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikwhile (@files) {
28824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    my $file = shift @files;
28924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    my $header = '';
29024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    my $copyright_match;
29124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    my $copyright = '';
29224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    my $license = '';
29324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    my %copyrights;
29424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
29524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    open (F, "<$file") or die "Unable to access $file\n";
29624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    while (<F>) {
29724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik        last if ($. > $opt_lines);
29824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik        $header .= $_;
29924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    }
30024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    close(F);
30124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
30224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    $copyright = join(" / ", values %copyrights);
30324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
30424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    print qq(----- $file header -----\n$header----- end header -----\n\n)
30524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if $opt_verbose;
30624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
30724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    remove_comments($header);
30824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    $license = parselicense($header);
30924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
31024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    # If no license in header, check footer (slow, because read file backwards)
31124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    # Need for instance for Perl files, which often use the footer
31224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    if ($license eq "UNKNOWN") {
31324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik        my $footer = '';
31424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik        tie(my @file_lines, "Tie::File", $file, autochomp => 0, mode => O_RDONLY) or die("Unable to access $file\n");
31524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik        # Avoid indexing error if header is entire file
31624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik        if ($#file_lines >= $opt_lines) {
31724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik            foreach (@file_lines[-$opt_lines .. -1]) {
31824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik                $footer .= $_;
31924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik            }
32024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik        }
32124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik        print qq(----- $file footer -----\n$header----- end footer -----\n\n)
32224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik            if $opt_verbose;
32324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik        remove_comments($footer);
32424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik        $license = parselicense($footer);
32524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    }
32624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
32724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    if ($opt_machine) {
32824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	print "$file\t$license";
32924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	print "\t" . ($copyright or "*No copyright*") if $opt_copyright;
33024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	print "\n";
33124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    } else {
33224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	print "$file: ";
33324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	print "*No copyright* " unless $copyright;
33424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	print $license . "\n";
33524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	print "  [Copyright: " . $copyright . "]\n"
33624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	  if $copyright and $opt_copyright;
33724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	print "\n" if $opt_copyright;
33824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    }
33924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik}
34024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
34124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiksub remove_comments($) {
34224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    $_ = $_[0];
34324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    # Remove Fortran comments
34424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    s/^[cC] //gm;
34524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    # Remove .ASM comments
34624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    s#^;\*?##gm;
34724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    # Remove .S comments
34824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    s#^@ ##gm;
34924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    # Remove new lines
35024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    tr/\t\r\n/ /;
35124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    # Remove C / C++ comments
35224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    s#(\*/|/[/*])##g;
35324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    # Remove all characters not matching search
35424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    tr% A-Za-z.,@;0-9\(\)/-%%cd;
35524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    # Collapse multiple spaces into single space
35624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    tr/ //s;
35724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    $_[0] = $_;
35824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik}
35924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
36024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiksub parse_copyright($) {
36124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    my $copyright = '';
36224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    my $match;
36324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
36424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    my $copyright_indicator_regex = '
36524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	(?:copyright	# The full word
36624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	|copr\.		# Legally-valid abbreviation
36724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	|\x{00a9}	# Unicode character COPYRIGHT SIGN
36824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	|\xc2\xa9	# Unicode copyright sign encoded in iso8859
36924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	|\(c\)		# Legally-null representation of sign
37024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	)';
37124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    my $copyright_disindicator_regex = '
37224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	\b(?:info(?:rmation)?	# Discussing copyright information
37324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	|notice			# Discussing the notice
37424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	|and|or                 # Part of a sentence
37524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	)\b';
37624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
37724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    if (m%$copyright_indicator_regex(?::\s*|\s+)(\S.*)$%ix) {
37824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	$match = $1;
37924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
38024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	# Ignore lines matching "see foo for copyright information" etc.
38124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if ($match !~ m%^\s*$copyright_disindicator_regex%ix) {
38224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	    # De-cruft
38324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	    $match =~ s/([,.])?\s*$//;
38424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	    $match =~ s/$copyright_indicator_regex//igx;
38524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	    $match =~ s/^\s+//;
38624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	    $match =~ s/\s{2,}/ /g;
38724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	    $match =~ s/\\@/@/g;
38824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	    $copyright = $match;
38924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
39024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    }
39124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
39224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    return $copyright;
39324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik}
39424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
39524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiksub help {
39624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik   print <<"EOF";
39724385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikUsage: $progname [options] filename [filename ...]
39824385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikValid options are:
39924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik   --help, -h             Display this message
40024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik   --version, -v          Display version and copyright info
40124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik   --no-conf, --noconf    Don't read devscripts config files; must be
40224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik                          the first option given
40324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik   --verbose              Display the header of each file before its
40424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik                            license information
40524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik   --lines, -l            Specify how many lines of the file header
40624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik                            should be parsed for license information
40724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik                            (Default: $def_lines)
40824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik   --check, -c            Specify a pattern indicating which files should
40924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik                             be checked
41024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik                             (Default: '$default_check_regex')
41124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik   --machine, -m          Display in a machine readable way (good for awk)
41224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik   --recursive, -r        Add the contents of directories recursively
41324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik   --copyright            Also display the file's copyright
41424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik   --ignore, -i           Specify that files / directories matching the
41524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik                            regular expression should be ignored when
41624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik                            checking files
41724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik                            (Default: '$default_ignore_regex')
41824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
41924385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikDefault settings modified by devscripts configuration files:
42024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik$modified_conf_msg
42124385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikEOF
42224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik}
42324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
42424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiksub version {
42524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    print <<"EOF";
42624385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikThis is $progname, from the Debian devscripts package, version ###VERSION###
42724385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikCopyright (C) 2007, 2008 by Adam D. Barratt <adam\@adam-barratt.org.uk>; based
42824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craikon a script of the same name from the KDE SDK by <dfaure\@kde.org>.
42924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
43024385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikThis program comes with ABSOLUTELY NO WARRANTY.
43124385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikYou are free to redistribute this code under the terms of the
43224385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikGNU General Public License, version 2, or (at your option) any
43324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiklater version.
43424385dbd2e4e893fe6ed411b3dbec947d956a599Chris CraikEOF
43524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik}
43624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
43724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiksub parselicense($) {
43824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    my ($licensetext) = @_;
43924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
44024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    my $gplver = "";
44124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    my $lgplver = "";
44224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    my $extrainfo = "";
44324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    my $license = "";
44424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
44524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    if ($licensetext =~ /version ([^, ]+?)[.,]? (?:\(?only\)?.? )?(?:of the GNU (Affero )?General Public License )?(as )?published by the Free Software Foundation/i or
44624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	$licensetext =~ /GNU (?:Affero )?General Public License (?:as )?published by the Free Software Foundation; version ([^, ]+?)[.,]? /i or
44724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	$licensetext =~ /GNU (?:Affero )?General Public License,? [Vv]ersion (\d+(?:\.\d+)?)[ \.]/) {
44824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	$gplver = " (v$1)";
44924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    } elsif ($licensetext =~ /either version ([^ ]+)(?: of the License)?, or \(at your option\) any later version/) {
45024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	$gplver = " (v$1 or later)";
45124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    }
45224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
45324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    if ($licensetext =~ /version ([^, ]+?)[.,]? (?:or later|or any later version) (?:of the GNU (?:Lesser |Library )General Public License )(as )?published by the Free Software Foundation/i or
45424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	$licensetext =~ /(?:GNU (?:Lesser |Library )|(?:Lesser|Library) GNU )General Public License (?:(?:as )?published by the Free Software Foundation;)?,? (?:either )?[Vv]ersion ([^, ]+?)(?: of the license)?[.,]? (?:or later|or (?:\(at your option\) )?any later version)/i or
45524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	$licensetext =~ /GNU (?:Lesser |Library )General Public License(?: \(LGPL\))?,? [Vv]ersion (\d+(?:\.\d+)?)[ \.]/) {
45624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	$lgplver = " (v$1 or later)";
45724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    }
45824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
45924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    if ($licensetext =~ /permission (?:is (also granted|given))? to link (the code of )?this program with (any edition of )?(Qt|the Qt library)/i) {
46024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	$extrainfo = " (with Qt exception)$extrainfo"
46124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    }
46224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
46324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    if ($licensetext =~ /(All changes made in this file will be lost|DO NOT (EDIT|delete this file)|Generated (automatically|by|from)|generated.*file)/i) {
46424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	$license = "GENERATED FILE";
46524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    }
46624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
46724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    if ($licensetext =~ /is (free software.? you can redistribute it and\/or modify it|licensed) under the terms of (version [^ ]+ of )?the (GNU (Library |Lesser )General Public License|LGPL)/i or
46824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik        $licensetext =~ /(is distributed|may be used|can redistribute).*terms.*(LGPL|(Lesser|Library) GNU General Public License)/) {
46924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik        if ($lgplver) {
47024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	    $license = "LGPL$lgplver$extrainfo $license";
47124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik        } else {
47224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	    $license = "LGPL (unversioned/unknown version) $license";
47324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik        }
47424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    }
47524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
47624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    if ($licensetext =~ /is free software.? you (can|may) redistribute it and\/or modify it under the terms of (?:version [^ ]+ (?:\(?only\)? )?of )?the GNU General Public License/i) {
47724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	$license = "GPL$gplver$extrainfo $license";
47824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    } elsif ($licensetext =~ /is distributed under the terms of the GNU General Public License,/
47924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	and $gplver) {
48024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	$license = "GPL$gplver$extrainfo $license";
48124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    } elsif ($licensetext =~ /is distributed.*terms.*[^L]GPL/) {
48224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik        if ($gplver) {
48324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	    $license = "GPL$gplver$extrainfo $license";
48424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik        } else {
48524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	    $license = "GPL (unversioned/unknown version) $license";
48624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik        }
48724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    }
48824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
48924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    if ($licensetext =~ /This file is part of the .*Qt GUI Toolkit. This file may be distributed under the terms of the Q Public License as defined/) {
49024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	$license = "QPL (part of Qt) $license";
49124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    } elsif ($licensetext =~ /may be distributed under the terms of the Q Public License as defined/) {
49224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	$license = "QPL $license";
49324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    }
49424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
49524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    if ($licensetext =~ /opensource\.org\/licenses\/mit/) {
49624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	$license = "MIT/X11 (BSD like) $license";
49724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    } elsif ($licensetext =~ /Permission is hereby granted, free of charge, to any person obtaining a copy of this software and(\/or)? associated documentation files \(the (Software|Materials)\), to deal in the (Software|Materials)/) {
49824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	$license = "MIT/X11 (BSD like) $license";
49924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    } elsif ($licensetext =~ /Permission is hereby granted, without written agreement and without license or royalty fees, to use, copy, modify, and distribute this software and its documentation for any purpose/) {
50024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	$license = "MIT/X11 (BSD like) $license";
50124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    } elsif ($licensetext =~ /Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee/) {
50224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	$license = "MIT/X11 (BSD like) $license";
50324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    } elsif ($licensetext  =~ /MIT .* License/) {
50424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	$license = "MIT/X11 (BSD like) $license";
50524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    }
50624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
50724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    if ($licensetext  =~ /This file is part of the Independent JPEG Group(')?s software.*For conditions of distribution and use, see the accompanying README file/i) {
50824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	$license = "Independent JPEG Group License $license";
50924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    }
51024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
51124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    if ($licensetext  =~ /the University of Illinois Open Source License/){
51224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	$license = "University of Illinois/NCSA Open Source License (BSD like) $license";
51324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    }
51424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
51524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    if ($licensetext  =~ /Permission to use, copy, modify, and(\/or)? distribute this software (and its documentation )?for any purpose (with or )?without fee is hereby granted, provided.*(copyright|entire) notice.*all copies/i) {
51624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	$license = "ISC $license";
51724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    }
51824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
51924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    if ($licensetext =~ /THIS SOFTWARE IS PROVIDED .*AS IS AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY/ ||
52024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik        $licensetext =~ /THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL- ITY/) {
52124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	if ($licensetext =~ /All advertising materials mentioning features or use of this software must display the following/) {
52224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	    $license = "BSD (4 clause) $license";
52324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	} elsif ($licensetext =~ /be used to endorse or promote products derived from this software/) {
52424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	    $license = "BSD (3 clause) $license";
52524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	} elsif ($licensetext =~ /Redistributions of source code must retain the above copyright notice/) {
52624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	    $license = "BSD (2 clause) $license";
52724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	} else {
52824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	    $license = "BSD $license";
52924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	}
53024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    } elsif ($licensetext =~ /Use of this source code is governed by a BSD-style license/) {
53124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik        $license = "BSD-like $license";
53224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    } elsif ($licensetext =~ /BSD terms apply/) {
53324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik        $license = "BSD-like $license";
53424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    } elsif ($licensetext =~ /subject to the BSD License/) {
53524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik        # TODO(sbc): remove this case once we fix: http://crbug.com/177268
53624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik        $license = "BSD-like $license";
53724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    } elsif ($licensetext =~ /license BSD/) {
53824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik        $license = "BSD-like $license";
53924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    } elsif ($licensetext =~ /GOVERNED BY A BSD-STYLE SOURCE LICENSE/) {
54024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik        $license = "BSD-like $license";
54124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    } elsif ($licensetext =~ /BSD 3-Clause license/) {
54224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik        $license = "BSD (3 clause) $license";
54324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    }
54424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
54524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    if ($licensetext =~ /Mozilla Public License( Version|, v.) ([^ ]+[^., ]),?/) {
54624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	$license = "MPL (v$2) $license";
54724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    }
54824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
54924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    if ($licensetext =~ /Released under the terms of the Artistic License ([^ ]+)/) {
55024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	$license = "Artistic (v$1) $license";
55124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    }
55224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
55324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    if ($licensetext =~ /is free software under the Artistic [Ll]icense/) {
55424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	$license = "Artistic $license";
55524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    }
55624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
55724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    if ($licensetext =~ /This (program|library) is free software; you can redistribute it and\/or modify it under the same terms as Perl itself/) {
55824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	$license = "Perl $license";
55924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    }
56024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
56124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    if ($licensetext =~ /under the terms of the Apache ([^ ]+) License OR version 2 of the GNU/) {
56224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	$license = "Apache (v$1) GPL (v2) $license";
56324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    } elsif ($licensetext =~ /under the Apache License, Version ([^ ]+)/) {
56424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	$license = "Apache (v$1) $license";
56524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    }
56624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
56724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    if ($licensetext =~ /(THE BEER-WARE LICENSE)/i) {
56824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	$license = "Beerware $license";
56924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    }
57024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
57124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    if ($licensetext =~ /This source file is subject to version ([^ ]+) of the PHP license/) {
57224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	$license = "PHP (v$1) $license";
57324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    }
57424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
57524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    if ($licensetext =~ /under the terms of the CeCILL /) {
57624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	$license = "CeCILL $license";
57724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    }
57824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
57924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    if ($licensetext =~ /under the terms of the CeCILL-([^ ]+) /) {
58024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	$license = "CeCILL-$1 $license";
58124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    }
58224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
58324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    if ($licensetext =~ /under the SGI Free Software (B License|License B)/) {
58424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	$license = "SGI Free Software License B $license";
58524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    }
58624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
58724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    if ($licensetext =~ /(in|into) the public domain/i) {
58824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	$license = "Public domain $license";
58924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    }
59024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
59124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    if ($licensetext =~ /terms of the Common Development and Distribution License(, Version ([^(]+))? \(the License\)/) {
59224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	$license = "CDDL " . ($1 ? "(v$2) " : '') . $license;
59324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    }
59424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
59524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    if ($licensetext =~ /Microsoft Permissive License \(Ms-PL\)/) {
59624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik        $license = "Ms-PL $license";
59724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    }
59824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
59924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    if ($licensetext =~ /as defined in and that are subject to the Apple Public Source License([ ,-]+Version ([^ ]+)?(\.))/) {
60024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	$license = "APSL " . ($1 ? "(v$2) " : '') . $license;
60124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    } elsif ($licensetext =~ /provided that if you redistribute the Apple Software in its entirety and without modifications, you must retain this notice and the following text and disclaimers in all such redistributions of the Apple Software/) {
60224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	# https://fedoraproject.org/wiki/Licensing/Apple_MIT_License
60324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	$license = "Apple MIT $license";
60424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    }
60524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
60624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    if ($licensetext =~ /Permission is hereby granted, free of charge, to any person or organization obtaining a copy of the software and accompanying documentation covered by this license \([\"]?the Software[\"]?\)/ or
60724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	$licensetext =~ /Boost Software License([ ,-]+Version ([^ ]+)?(\.))/i) {
60824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	$license = "BSL " . ($1 ? "(v$2) " : '') . $license;
60924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    }
61024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
61124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    if ($licensetext =~ /PYTHON SOFTWARE FOUNDATION LICENSE (VERSION ([^ ]+))/i) {
61224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	$license = "PSF " . ($1 ? "(v$2) " : '') . $license;
61324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    }
61424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
61524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    if ($licensetext =~ /The origin of this software must not be misrepresented.*Altered source versions must be plainly marked as such.*This notice may not be removed or altered from any source distribution/ or
61624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik        $licensetext =~ /see copyright notice in zlib\.h/) {
61724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik	$license = "zlib/libpng $license";
61824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    } elsif ($licensetext =~ /This code is released under the libpng license/) {
61924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik        $license = "libpng $license";
62024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    }
62124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
62224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    if ($licensetext =~ /under MIT license/) {
62324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik        $license = "MIT/X11 (BSD like) $license";
62424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    }
62524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
62624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    if ($licensetext =~ /License MIT(-| )License/) {
62724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik        $license = "MIT/X11 (BSD like) $license";
62824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    }
62924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
63024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    if ($licensetext =~ /As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice/) {
63124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik        $license = $license . "with Bison parser exception";
63224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    }
63324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
63424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    if ($licensetext =~ /As a special exception to the GNU General Public License, if you distribute this file as part of a program or library that is built using GNU Libtool, you may include this file under the same distribution terms that you use for the rest of that program/) {
63524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik        $license = $license . "with libtool exception";
63624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    }
63724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
63824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    if ($licensetext =~ /These materials are protected by copyright laws and contain material proprietary to the Khronos Group, Inc\. You may use these materials for implementing Khronos specifications, without altering or removing any trademark, copyright or other notice from the specification/) {
63924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik        $license = $license . "Khronos Group";
64024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    }
64124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
64224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    if ($licensetext =~ /This file is part of the FreeType project, and may only be used(,)? modified(,)? and distributed under the terms of the FreeType project license, LICENSE\.TXT\. By continuing to use, modify, or distribute this file you indicate that you have read the license and understand and accept it fully/) {
64324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik        $license = "FreeType (BSD like) $license";
64424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    }
64524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    if ($licensetext =~ /This software, and all works of authorship, whether in source or object code form as indicated by the copyright notice.*is made available, and may only be used, modified, and distributed under the FreeType Project License, LICENSE\.TXT\. Additionally, subject to the terms and conditions of the FreeType Project License, each contributor to the Work hereby grants to any individual or legal entity exercising permissions granted by the FreeType Project License and this section.*a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable.*patent license to make/) {
64624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik        $license = "FreeType (BSD like) with patent clause $license";
64724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    }
64824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
64924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    if ($licensetext =~ /Anti-Grain Geometry.*Permission to copy, use, modify, sell and distribute this software is granted provided this copyright notice appears in all copies. This software is provided as is without express or impl/) {
65024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik        $license = "Anti-Grain Geometry $license";
65124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    }
65224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
65324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    if ($licensetext =~ /Developed at SunSoft, a Sun Microsystems, Inc\. business\. Permission to use, copy, modify, and distribute this software is freely granted, provided that this notice is preserved\./) {
65424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik        $license = "SunSoft (BSD like) $license";
65524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    }
65624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
65724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    $license = "UNKNOWN" unless $license;
65824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
65924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    # Remove trailing spaces.
66024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    $license =~ s/\s+$//;
66124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
66224385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    return $license;
66324385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik}
66424385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik
66524385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craiksub fatal($) {
66624385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    my ($pack,$file,$line);
66724385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    ($pack,$file,$line) = caller();
66824385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    (my $msg = "$progname: fatal error at line $line:\n@_\n") =~ tr/\0//d;
66924385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    $msg =~ s/\n\n$/\n/;
67024385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik    die $msg;
67124385dbd2e4e893fe6ed411b3dbec947d956a599Chris Craik}
672