#!/usr/bin/perl # # Copyright (C) 2009-2014 Yuki Manabe and Daniel M. German # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # use strict; use Getopt::Std; use File::Basename; my %opts = (); if (!getopts ("vfCcSsGgTtLd",\%opts) or scalar(@ARGV) == 0) { print STDERR "Ninka version 1.3 Usage $0 -fCtTvcgsGd -v verbose -f force all processing -C force creation of comments -c stop after creation of comments -S force creation of sentences -s stop after creation of sentences -G force creation of goodsent -g stop after creation of goodsent -T force creation of senttok -t stop after creation of senttok -L force creation of matching -d delete intermediate files \n"; exit 1; } my $verbose = exists $opts{v}; my $delete = exists $opts{d}; #$delete = 1; my $path = dirname($0); if ($path eq "") { $path = "./"; } my $force = exists $opts{f}; my $forceGood = exists $opts{G}; my $forceSentences = exists $opts{S}; my $forceSentok = exists $opts{T}; my $forceComments = exists $opts{C}; my $forceLicense = exists $opts{L}; #die "Usage $0 " unless $ARGV[0] =~ /\.(c|cpp|java|cc|cxx|h|jl|py|pm|el|pl)$/; my $f = $ARGV[0]; my $original = $f; $f =~ s/'/\\'/g; $f =~ s/\$/\\\$/g; $f =~ s/;/\\;/g; $f =~ s/ /\\ /g; print "Starting: $original;\n" if ($verbose); print "$original;"; my $commentsFile = "${f}.comments"; my $sentencesFile = "${f}.sentences"; my $goodsentFile = "${f}.goodsent"; my $sentokFile = "${f}.senttok"; if (not (-f $original)) { print "ERROR;[${original}] is not a file\n" ; exit 0; } Do_File_Process($original, $commentsFile, ($force or $forceComments), "$path/extComments/extComments.pl -c1 ${f}", "Creating comments file", exists $opts{c}); Do_File_Process($commentsFile, $sentencesFile, ($force or $forceSentences), "$path/splitter/splitter.pl ${commentsFile}", "Splitting sentences", exists $opts{s} ); Do_File_Process( $sentencesFile, $goodsentFile, ($force or $forceGood), "$path/filter/filter.pl ${sentencesFile}", "Filtering good sentences", exists $opts{s} ); Do_File_Process($goodsentFile, $sentokFile, ($force or $forceSentok), "$path/senttok/senttok.pl ${goodsentFile} > ${sentokFile}", "Matching sentences against rules", exists $opts{t} ); print "Matching ${f}.senttok against rules" if ($verbose); execute("$path/matcher/matcher.pl ${f}.senttok > ${f}.license"); print `cat ${f}.license`; unlink("${f}.code"); if ($delete) { unlink("${f}.badsent"); unlink("${f}.comments"); unlink("${f}.goodsent"); unlink("${f}.sentences"); unlink("${f}.senttok"); } exit 0; sub Do_File_Process { my ($input, $output, $force, $cmd, $message, $end) = @_; print "${message}:" if ($verbose); if ($force or newer($input, $output)) { print "Running ${cmd}:" if ($verbose); execute($cmd); } else { print "File [$output] newer than input [$input], not creating:" if ($verbose); } if ($end) { print "Existing after $message" if $verbose; print "\n"; exit 0; } } sub execute { my ($c) = @_; # print "\nTo execute [$c]\n"; my $r = `$c`; my $status = ($? >> 8); die "execution of program [$c] failed: status [$status]" if ($status != 0); return $r; } sub newer { my ($f1, $f2) = @_; my ($f1write) = (stat($f1))[9]; my ($f2write) = (stat($f2))[9]; if (defined $f1write and defined $f2write) { return $f1write > $f2write; } else { return 1; } }