blob: 38fbd2f1291191c231458503172f721a2505fb9f [file] [log] [blame]
#! /usr/bin/perl
require 'getopts.pl';
use strict;
use Getopt::Long;
use File::Copy;
# options
my @optlist = ("h|help!","v|verbose!");
my $result = GetOptions @optlist;
our ($opt_h, $opt_v);
# -h option || check the number of arguments
if ($opt_h || @ARGV < 2 || @ARGV > 4) {
usage();
exit 1;
}
# get arguments
my $prolog_file = $ARGV[0];
my $command_file = $ARGV[1];
my $prolog = $ARGV[2];
my $prolog_system = $ARGV[3];
# check arguments
if (! -e $prolog_file) {
&error("File $prolog_file does not exist");
}
if (! $prolog) {
$prolog = "prolog";
}
if (! $prolog_system) {
$prolog_system = "Unknown";
}
# main
my $nosuffix = $prolog_file;
$nosuffix =~ s/.pl$//g;
my $cmd_temp = $nosuffix . ".txt";
if ($prolog_system eq "SICStus" || $prolog_system eq "SWI-Prolog") { # SICStus or SWI-Prolog
my $wam;
my $dump;
my $goal;
my $goal2;
if ($prolog_system eq "SICStus") {
$wam = $nosuffix . ".ql";
$dump = $nosuffix . ".sav";
#$goal = "\"[operators], fcompile(\'$prolog_file\'), load(\'$wam\'), save_program(\'$dump\', main), halt.\"";
$goal = "\"[operators], fcompile([\'$prolog_file\',system]), load(\'$wam\'), load(system), save_program(\'$dump\', main), halt.\"";
$goal2 = "load(\'$wam\'), main.";
}
if ($prolog_system eq "SWI-Prolog") {
$wam = $nosuffix . ".qlf";
$dump = $nosuffix . ".qsav";
# $goal = "\"[operators], qcompile(\'$prolog_file\'), load_files(\'$wam\'), qsave_program(\'$dump\', [goal=main]), halt.\"";
$goal = "\"[operators], qcompile([\'$prolog_file\',system]), load_files(\'$wam\'), load_files(system),qsave_program(\'$dump\', [goal=main]), halt.\"";
$goal2 = "load_files(\'$wam\'), main.";
}
&message("unlink $wam, $dump");
unlink $wam, $dump;
my $cmd = "echo $goal | $prolog";
if (! $opt_v) {# check -v option
$cmd .= " 2> /dev/null";
}
&message("making $wam, $dump");
&message($cmd);
system($cmd);
if (-e $dump) { # saving program succeeds
unlink $wam;
&message("making $command_file");
&mk_command($command_file, $cmd_temp, undef, $dump, undef, undef);
chmod 0755, $command_file;
exit 0;
} elsif (-e $wam) { # compilation succeeds, but saving program fails
&message("making $command_file");
&mk_command($command_file, $cmd_temp, $goal2, $prolog, undef, undef);
chmod 0755, $command_file;
exit 0;
} else {
&error("$0 fails");
}
} elsif ($prolog_system eq "PrologCafe") {
my $file;
my $system_opts;
my $system_args;
# set $system_opts
#$system_opts = "-cp \\\$PLCAFEDIR/lang.jar:\\\$PLCAFEDIR/builtin.jar:\\\$PLCAFEDIR/compiler.jar";
$system_opts = "-cp \\\$PLCAFEDIR/plcafe.jar";
if ($prolog_file =~ m|.*/(.*).pl$|i) {
$file = $1;
} else {
&error("invalid prolog file found, $prolog_file");
}
# set $system_args
$system_args = "jp.ac.kobe_u.cs.prolog.lang.PrologMain jp.ac.kobe_u.cs.prolog.compiler.$file:main";
&message("making $command_file");
&mk_command($command_file, $cmd_temp, undef, $prolog, $system_opts, $system_args);
chmod 0755, $command_file;
exit 0;
} else {
my $goal3 = "[\'$prolog_file\',system], main.";
# my $goal3 = "[\'$prolog_file\'], main.";
&message("making $command_file");
&mk_command($command_file, $cmd_temp, $goal3, $prolog, undef, undef);
chmod 0755, $command_file;
exit 0;
}
exit 0;
# sub
sub usage {
print "\nUsage: $0 [-options] prolog_file command_file [prolog] [prolog_system]\n";
print "\n where options include:\n";
print "\t-h -help : print this help message\n";
print "\t-v -verbose : enable verbose output\n";
print "\n where prolog is the command of Prolog system:\n";
print "\t(ex.) sicstus, pl, swipl, prolog...\n";
print "\n where prolog_system include:\n";
print "\tSICStus\n";
print "\tSWI-Prolog\n\n";
}
sub message {
my ($x) = @_;
if ($opt_v) { # check -v option
print "\% $x\n";
}
}
sub error {
my ($x) = @_;
print "\% ERROR: $x\n";
exit(1);
}
sub mk_command {
my ($command_file, $command_temp, @val) = @_;
my @key = ("goal", "system", "system_opts", "system_args");
copy($command_temp, $command_file) || &error("can not copy $command_temp to $command_file");
open(OUT, ">>$command_file") || &error("can not open $command_file");
print OUT "sub init {\n";
print OUT "\t%env = (\n";
for (my $i=0; $i < scalar(@key); $i++) {
next if (! $val[$i]);
print OUT "\t\t\"$key[$i]\", \"$val[$i]\",\n";
}
print OUT "\t)\n";
print OUT "}\n";
close(OUT) || &error("can not close $command_file");
}