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