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