lib/scripts/mirabelle
author boehmes
Fri, 31 Jul 2009 23:31:11 +0200
changeset 32298 8ffc607c345d
permissions -rwxr-xr-x
added Mirabelle
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
32298
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
     1
#!/usr/bin/perl -w
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
     2
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
     3
use strict;
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
     4
use File::Basename;
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
     5
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
     6
# Taken from http://www.skywayradio.com/tech/perl/trim_blanks.html
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
     7
sub trim {
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
     8
    my @out = @_;
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
     9
    for (@out) {
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    10
        s/^\s+//;
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    11
        s/\s+$//;
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    12
    }
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    13
    return wantarray ? @out : $out[0];
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    14
}
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    15
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    16
sub quote {
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    17
    my $str = pop;
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    18
    return "\"" . $str . "\"";
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    19
}
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    20
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    21
sub print_usage_and_quit {
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    22
    print STDERR "Usage: mirabelle actions file1.thy...\n" .
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    23
                 "  actions: action1:...:actionN\n" .
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    24
                 "  action: name or name[key1=value1,...,keyM=valueM]\n";
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    25
    exit 1;
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    26
}
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    27
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    28
my $num_args = $#ARGV + 1;
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    29
if ($num_args < 2) {
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    30
    print_usage_and_quit();
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    31
}
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    32
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    33
my @action_names;
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    34
my @action_settings;
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    35
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    36
foreach (split(/:/, $ARGV[0])) {
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    37
    my %settings;
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    38
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    39
    $_ =~ /([^[]*)(?:\[(.*)\])?/;
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    40
    my ($name, $settings_str) = ($1, $2 || "");
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    41
    my @setting_strs = split(/,/, $settings_str);
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    42
    foreach (@setting_strs) {
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    43
        $_ =~ /(.*)=(.*)/;
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    44
	    my $key = $1;
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    45
	    my $value = $2;
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    46
	    $settings{trim($key)} = trim($value);
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    47
    }
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    48
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    49
    push @action_names, trim($name);
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    50
    push @action_settings, \%settings;
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    51
}
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    52
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    53
my $output_path = "/tmp/mirabelle"; # FIXME: generate path
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    54
my $mirabellesetup_thy_name = $output_path . "/MirabelleSetup";
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    55
my $mirabellesetup_file = $mirabellesetup_thy_name . ".thy";
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    56
my $mirabelle_log_file = $output_path . "/mirabelle.log";
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    57
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    58
mkdir $output_path, 0755;
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    59
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    60
open(FILE, ">$mirabellesetup_file")
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    61
    || die "Could not create file '$mirabellesetup_file'";
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    62
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    63
my $invoke_lines;
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    64
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    65
for my $i (0 .. $#action_names) { 
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    66
    my $settings_str = "";
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    67
    my $settings = $action_settings[$i];
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    68
    my $key;
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    69
    my $value;
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    70
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    71
    while (($key, $value) = each(%$settings)) {
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    72
        $settings_str .= "(" . quote ($key) . ", " . quote ($value) . "), ";
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    73
    }
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    74
    $settings_str =~ s/, $//;
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    75
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    76
    $invoke_lines .= "setup {* Mirabelle.invoke \"$action_names[$i]\" ";
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    77
    $invoke_lines .= "[$settings_str] *}\n"
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    78
}
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    79
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    80
print FILE <<EOF;
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    81
theory MirabelleSetup
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    82
imports Mirabelle
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    83
begin
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    84
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    85
setup {* Mirabelle.set_logfile "$mirabelle_log_file" *}
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    86
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    87
$invoke_lines
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    88
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    89
end
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    90
EOF
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    91
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    92
my $root_text = "";
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    93
my @new_thy_files;
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    94
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    95
for my $i (1 .. $num_args - 1) {
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    96
    my $old_thy_file = $ARGV[$i];
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    97
    my ($base, $dir, $ext) = fileparse($old_thy_file, "\.thy");
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    98
    my $new_thy_name = $base . "Mirabelle";
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
    99
    my $new_thy_file = $dir . $new_thy_name . $ext;
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
   100
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
   101
    open(OLD_FILE, "<$old_thy_file")
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
   102
        || die "Cannot open file $old_thy_file";
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
   103
    my @lines = <OLD_FILE>;
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
   104
    close(OLD_FILE);
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
   105
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
   106
    my $thy_text = join("", @lines);
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
   107
    my $old_len = length($thy_text);
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
   108
    $thy_text =~ s/\btheory\b[^\n]*\s*\bimports\s/theory $new_thy_name\nimports "$mirabellesetup_thy_name" /gm;
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
   109
    die "No 'imports' found" if length($thy_text) == $old_len;
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
   110
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
   111
    open(NEW_FILE, ">$new_thy_file");
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
   112
    print NEW_FILE $thy_text;
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
   113
    close(NEW_FILE);
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
   114
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
   115
    $root_text .= "use_thy \"" . $dir . $new_thy_name . "\";\n";
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
   116
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
   117
    push @new_thy_files, $new_thy_file;
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
   118
}
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
   119
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
   120
my $root_file = "ROOT_mirabelle.ML";
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
   121
open(ROOT_FILE, ">$root_file") || die "Cannot open file $root_file";
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
   122
print ROOT_FILE $root_text;
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
   123
close(ROOT_FILE);
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
   124
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
   125
system "isabelle-process -e 'use \"ROOT_mirabelle.ML\";' -f -q HOL";
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
   126
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
   127
# unlink $mirabellesetup_file;
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
   128
unlink $root_file;
8ffc607c345d added Mirabelle
boehmes
parents:
diff changeset
   129
unlink @new_thy_files;