]> git.donarmstrong.com Git - lilypond.git/blobdiff - bin/convert-mudela
release: 0.0.70pre
[lilypond.git] / bin / convert-mudela
index ff7b4c28642f73fea18831601c4e80caf8d90daa..744059c67c357ce701446a64147c2473c825ac2a 100755 (executable)
 #!/usr/bin/perl -w
 
-=head1 NAME
+=head1 TODO
 
-convert-mudela  - convert mudela to newer versions
+    detect \lyrics and \melodic, and do substitution accordingly.
+    count <> and {} ?
 
-=head1 SYNOPSIS
+Ugh . Perl sux. Anybody for Python?
+    
+=cut    
 
-       convert-mudela --from=FROM_PATCHLEVEL --to=TO_PATCHLEVEL
 
-=head1 DESCRIPTION
 
-convert-mudela sequentially applies different mudela-conversions to
-upgrade a Mudela input file from FROM_PATCHLEVEL to TO_PATCHLEVEL
+#
+# version of "supporting" engine, not mudela conversions.
+# 
 
-=head1 OPTIONS
 
-=over 4
 
-=item B<--output>
 
-The output file to write
+$convert_mudela_version = "0.1.1";
 
-=item B<--edit> 
+use Getopt::Long;
 
-Do an inline edit of the input file. override B<--output>
 
-=item B<--show-rules>
+sub version_compare
+{
+    local ($a,$b)=@_;
+    return &cmpver;
+}
+    
 
-shows all known conversions.
+sub  cmpver 
+{      
+       my(@a)= split /\./,$a;
+       my(@b)= split /\./,$b;
 
-=item B<--from>=FROM_PATCHLEVEL
+       for $i (0,1,2) {
+           return $a[$i] <=> $b[$i] if ($a[$i] != $b[$i]);
+       }
+       return $a cmp $b;
+}
 
-=item B<--to>=TO_PATCHLEVEL
+sub version_string_conv
+{
+    my ($from_version, $to_version) = @_;
+    s/\version \"$from_version\"/\version \"$to_version\"/g;
+}
 
-=back
+################################################################
 
-=cut
+sub no_conv
+{
+}
+sub convert_0_0_52_to_0_0_53
+{
 
+    s/include \"/$1\\include \"/g;
+}
 
-use Getopt::Long;
-sub 
-    version_string_conv
+  
+sub convert_0_0_54_to_0_0_55
 {
-    my ($from_version, $to_version) = @_;
-    s/\version \"0.0.$from_version\"/\version \"0.0.$to_version\"/g;
+    s/%{/% {/g;
 }
 
-sub
-    conv_pl0_0_50_pl0_0_52
+  
+sub convert_0_0_53_to_0_0_54
 {
+    print STDERR "Not smart enough to convert \\transpose\n"    if (/\\transpose/) ;
+}
+
+# we-re not at 58 yet, but this is at least one of the rules
+sub convert_0_0_55_to_0_0_56
+{
+    s/\"\|\|\"/\"|.\"/g;
+}
+
+sub convert_0_0_56_to_0_0_57
+{
+    s/\(([ \]\[|\t-\.>]|\\[<!>a-z]+)*\)/\~ $1/g;
+}
+
+sub convert_0_0_57_to_0_0_58
+{
+    s/\[ *([^\[\]]*)\] *([1-9]*) *\/ *([1-9]*)/[$2\/$3 $1]1\/1/g;
+}
+
+sub convert_0_0_58_to_0_0_58
+{
+    die "Not smart enough to convert 0.0.58 to 0.0.59\n";
+}
+
+sub convert_0_0_59_to_0_0_60
+{
+    s/(\\unitspace [0-9.mcptin\\ ]+|\\geometric [0-9.]+|\\width [0-9.mcp\\tin]+)/$1;/g;
+    s/(\\output \"[^\"]+\")/$1;/;
+    s/(\\tempo  [0-9: ]+)/$1;/;
+}
+
+###############################################################
+
+sub    last_conversion
+{
+    my @v = &versions;
+    return pop @v;
 }
+sub identify
+{
+    
+    print STDERR "This is convert-mudela " . $convert_mudela_version . 
+       " (up to mudela version ", last_conversion,     ")\n";
+}
+  
+  
+ sub usage
+  {
+     print STDERR "Usage: convert-mudela [options] [mudela-file]...\n"
+     . "Convert old mudela source from mudela-file or stdin\n\n"
+     . "Options:\n"
+     . "  -e, --edit             perform in-place conversion\n"
+     . "  -f, --from=PATHLEVEL   use source version 0.0.PATCHLEVEL\n"
+     . "  -h, --help             print this help\n"
+     . "  -o, --output=FILE      name output file\n"
+     . "  -s, --show-rules       print all known conversion rules\n"
+     . "  -t, --to=VERSION    convert to version VERSION\n"
+  }
+      
+
+my %minor_conversions = ("0.0.50" => \&no_conv,
+                        "0.0.52" => \&convert_0_0_50_to_0_0_52,
+                        "0.0.53" => \&convert_0_0_52_to_0_0_53,
+                        "0.0.54" => \&convert_0_0_53_to_0_0_54,
+                        "0.0.55" => \&convert_0_0_54_to_0_0_55,
+                        "0.0.56" => \&convert_0_0_55_to_0_0_56,
+                        "0.0.57" => \&convert_0_0_56_to_0_0_57,
+                        "0.0.58" => \&convert_0_0_57_to_0_0_58,
+                        "0.0.59" => \&convert_0_0_58_to_0_0_59,
+                        "0.0.60" => \&convert_0_0_59_to_0_0_60
+                        );
 
-sub
-    usage
+sub versions 
 {
-    print STDERR "Usage: convert-mudela --from=XX --to=XX\n";
-    print STDERR "other options: --edit --output=FILE --show-rules\n";
-    exit 2;
+    return (sort keys %minor_conversions);
 }
     
-my %minor_conversions = ("50" => \&no_conv,
-                        "52" => \&conv_pl0_0_50_pl0_0_52);
 
-sub
-    show_rules
+sub    show_rules
 {
-    print "Rules: ", join(", ", keys %minor_conversions), "\n";
+    print "Rules: ", join(", ", sort keys %minor_conversions), "\n";
     
 }
 
-sub 
-    do_conversion
+sub do_conversion
 {
     my ($from,$to) = @_;
 
     my @applicable_conversion;
     my @mudela_levels;
     
-    die "This is too old  to convert " if $from < 50;
-    
-    foreach $a (sort keys %minor_conversions) {
-       if ($a > $from && $a <= $to ){ 
-           push @applicable_conversion, $minor_conversions{$a};
-           push @mudela_levels, $a;
+#    die "This is too old  to convert " if $from < 50;
+    my @v = versions;
+    foreach $ver (@v) {
+       if (version_compare($ver, $from) > 0 && version_compare($ver,$to) <= 0 ){ 
+           push @applicable_conversion, $minor_conversions{$ver};
+           push @mudela_levels, $ver;
        }
     }
     
@@ -99,10 +181,31 @@ sub
        print OUTLY;
     }
 }
-    
 
-sub 
-    set_files 
+sub get_auto_from
+{
+    my ($fn)=@_;
+    my ($ver);
+    open INLY, $fn || die "Can't open";
+
+    while (<INLY>) {
+       s/^.*\\version \"([^\"]*)\".*$//;
+       if (defined ($1)) {
+           print STDERR "Guessing version: ", $1, ".. ";
+           $ver = $1;
+           last;
+       }
+    }
+    if (!defined($ver)){
+       print STDERR "can't determine mudela version in $fn.\n";
+       my $u;
+       return $u;
+    }
+    close INLY;
+    return $ver;
+}   
+
+sub  set_files 
 {
     $infile = "-";
     $outfile = "-";
@@ -111,16 +214,58 @@ sub
     if ($ARGV [0])  {
        $infile = $ARGV[0];
     } 
+    if (( ! -f $infile) && (! $infile =~ /\\.ly$/s ) ){
+       $infile .= ".ly";
+       
 
+    }
     if ($opt_edit && $infile ne "-") {
        $opt_edit = 1;
+       $outfile = "$infile.NEW";
+       $infile = "$infile";
+    }
+    print STDERR "Input ", (($infile eq "-") ?"STDIN" : $infile), " .. ";
+
+}
+
+sub do_one_arg
+{
+    set_files;
+
+    local ($from_version, $to_version);
+    $from_version = $opt_from;
+    $to_version = $opt_to;
+    
+    ($from_version = get_auto_from $infile) unless defined($opt_from);
+    return if (!defined($from_version));
+    
+    ($to_version =  last_conversion) unless (defined($opt_to));
+
+    die "can't open \`$infile\'" unless open INLY,$infile ;
+    die "can't open \`$outfile\'" unless open OUTLY, ">$outfile";
+    
+    do_conversion $from_version, $to_version;
+    close INLY;
+    close OUTLY;
+
+    if ($opt_edit) {
        rename $infile, "$infile~";
-       $outfile = $infile;
-       $infile = "$infile~";
+       rename $outfile, "$infile";
     }
 }
 
-GetOptions ("output=s", "from=i", "to=i", "minor=i", "edit", "show-rules");
+## "main"
+
+identify;
+
+
+GetOptions ("help", "output=s", "from=i", "to=i", "minor=i", "edit", "show-rules");
+
+if ($opt_help) {
+    usage();
+    $opt_help = 0;     # to extinguish typo check.
+    exit 0;
+}
 
 if ($opt_show_rules) { 
     show_rules ;
@@ -128,14 +273,14 @@ if ($opt_show_rules) {
     exit 0;
 }
 
-usage if (!defined($opt_from) || !defined($opt_to));
 local ( $infile,$outfile);
-set_files;
-
-die "can't open \`$infile\'" unless open INLY,$infile ;
-die "can't open \`$outfile\'" unless open OUTLY, ">$outfile";
+my $processed_one=0;
 
-do_conversion $opt_from, $opt_to;
-close INLY;
-close OUTLY;
+while (defined($ARGV[0])) {
+    do_one_arg;
+    shift @ARGV;
+    $processed_one = 1;
+}
+do_one_arg unless ($processed_one);
 
+