lib/scripts/fixheaders.pl
author huffman
Wed, 06 Jul 2005 00:08:57 +0200
changeset 16701 abd0abd66387
parent 16471 c487e7e8865f
permissions -rw-r--r--
add keywords cpodef, pcpodef (for HOLCF)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
16471
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
     1
#!/usr/bin/env perl -w
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
     2
#
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
     3
# $Id$
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
     4
# Author: Florian Haftmann, TUM
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
     5
#
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
     6
# DESCRIPTION: migrates theory header (of new-style theories) to non-deprecated syntax
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
     7
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
     8
use strict;
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
     9
use File::Find;
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    10
use File::Basename;
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    11
use File::Copy;
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    12
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    13
# configuration
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    14
my @suffices = ('\.thy');
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    15
my $backupsuffix = '~~';
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    16
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    17
# migrator function
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    18
sub fixheaders {
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    19
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    20
    my ($file) = @_;
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    21
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    22
    open(ISTREAM, $file) or die $!;
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    23
    my @content = <ISTREAM>;
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    24
    close ISTREAM or die $!;
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    25
    my $content = join("", @content);
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    26
    $_ = $content;
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    27
    if (m!^theory!cgoms) {
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    28
        my $prelude = $`;
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    29
        my $thyheader = "theory";
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    30
        $thyheader .= skip_wscomment();
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    31
        if (m!\G(\S+)!cgoms) {
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    32
            $thyheader .= $1;
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    33
            $thyheader .= skip_wscomment();
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    34
            if (m!\G(?:imports|=)!cgoms) {
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    35
                $thyheader .= "imports";
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    36
                $thyheader .= skip_wscomment() || " ";
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    37
                while (m/\G(?!uses|files|begin|:)/cgoms && m!\G(?:[\w_]+|"[^"]+")!cgoms) {
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    38
                    $thyheader .= $&;
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    39
                    $thyheader .= skip_wscomment();
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    40
                    if (m!\G\+!cgoms) {
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    41
                        m!\G ?!cgoms;
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    42
                    }
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    43
                    $thyheader .= skip_wscomment();
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    44
                }
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    45
            }
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    46
            if (m!\G(?:files|uses)!cgoms) {
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    47
                $thyheader .= "uses";
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    48
                $thyheader .= skip_wscomment();
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    49
                while (m/\G(?!begin|:)/cgoms && m!\G(\("[^"]+"\)|"[^"]+"|[^"\s]+)!cgoms) {
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    50
                    $thyheader .= $&;
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    51
                    $thyheader .= skip_wscomment();
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    52
                }
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    53
            }
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    54
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    55
            if (m!\G(?:begin|:)!cgoms) {
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    56
                my $postlude = $';
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    57
                if ($& eq ":") {
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    58
                    $thyheader .= " ";
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    59
                }
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    60
                $thyheader .=  "begin";
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    61
                my $newcontent = "$prelude$thyheader$postlude";
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    62
                if ($content ne $newcontent) {
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    63
                    print STDERR "fixing $file\n";
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    64
                    my $backupfile = "$file$backupsuffix";
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    65
                    if (! -f $backupfile) {
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    66
                        rename $file, $backupfile or die $!;
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    67
                    }
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    68
                    open(OSTREAM, ">$file") or die $!;
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    69
                    print OSTREAM $newcontent;
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    70
                    close(OSTREAM) or die $!;
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    71
                }
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    72
            }
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    73
        }
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    74
    }
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    75
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    76
}
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    77
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    78
# utility functions
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    79
sub skip_wscomment {
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    80
    my $commentlevel = 0;
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    81
    my @skipped = ();
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    82
    while () {
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    83
        if (m!\G\(\*!cgoms) {
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    84
            push(@skipped, $&);
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    85
            $commentlevel++;
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    86
        } elsif ($commentlevel > 0) {
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    87
            if (m!\G\*\)!cgoms) {
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    88
                push(@skipped, $&);
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    89
                $commentlevel--;
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    90
            } elsif (m/\G(?:
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    91
                        \*(?!\))|\((?!\*)|[^(*]
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    92
                       )*/cgomsx) {
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    93
                push(@skipped, $&);
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    94
            } else {
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    95
                die "probably incorrectly nested comment";
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    96
            }
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    97
        } elsif (m!\G\s+!cgoms) {
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    98
            push(@skipped, $&);
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
    99
        } else {
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
   100
            return join('', @skipped);
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
   101
        }
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
   102
    }
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
   103
}
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
   104
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
   105
# main
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
   106
foreach my $file (@ARGV) {
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
   107
    eval {
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
   108
        fixheaders($file);
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
   109
    };
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
   110
    if ($@) {
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
   111
        print STDERR "*** fixheaders $file: ", $@, "\n";
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
   112
    }
c487e7e8865f added fixheaders
haftmann
parents:
diff changeset
   113
}