]> git.donarmstrong.com Git - lilypond.git/blob - bin/convert-mudela
dbb0f729a46716641e3406169471bd6ecc084358
[lilypond.git] / bin / convert-mudela
1 #!/usr/bin/perl -w
2
3 #
4 # version of "supporting" engine, not mudela conversions.
5
6
7 $convert_mudela_version = "0.1";
8
9 use Getopt::Long;
10
11
12
13 sub version_string_conv
14 {
15     my ($from_version, $to_version) = @_;
16     s/\version \"0.0.$from_version\"/\version \"0.0.$to_version\"/g;
17 }
18
19 ################################################################
20
21 sub no_conv
22 {
23 }
24  
25 sub convert_0_0_52_to_0_0_53
26 {
27
28     s/include \"/$1\\include \"/g;
29 }
30
31   
32 sub convert_0_0_54_to_0_0_55
33 {
34     s/%{/% {/g;
35 }
36
37   
38 sub convert_0_0_53_to_0_0_54
39 {
40     print STDERR "Not smart enough to convert \\transpose\n"    if (/\\transpose/) ;
41 }
42
43 # we-re not at 58 yet, but this is at least one of the rules
44 sub convert_0_0_55_to_0_0_56
45 {
46     s/\"\|\|\"/\"|.\"/g;
47 }
48
49 ###############################################################
50
51 sub    last_conversion
52 {
53     my @v = &versions;
54     return pop @v;
55 }
56 sub identify
57 {
58     
59     print STDERR "This is convert-mudela " . $convert_mudela_version . 
60         " (up to mudela version 0.0.", last_conversion, ")\n";
61 }
62   
63   
64  sub usage
65   {
66      print STDERR "Usage: convert-mudela [options] [mudela-file]...\n"
67      . "Convert old mudela source from mudela-file or stdin\n\n"
68      . "Options:\n"
69      . "  -e, --edit             perform in-place conversion\n"
70      . "  -f, --from=PATHLEVEL   use source version 0.0.PATCHLEVEL\n"
71      . "  -h, --help             print this help\n"
72      . "  -o, --output=FILE      name output file\n"
73      . "  -s, --show-rules       print all known conversion rules\n"
74      . "  -t, --to=PATCHLEVEL    convert to version 0.0.PATCHLEVEL\n"
75   }
76       
77 # beware of the year 2000
78 my %minor_conversions = (50 => \&no_conv,
79                          52 => \&convert_0_0_50_to_0_0_52,
80                          53 => \&convert_0_0_52_to_0_0_53,
81                          54 => \&convert_0_0_53_to_0_0_54,
82                          55 => \&convert_0_0_54_to_0_0_55,
83                          56 => \&convert_0_0_55_to_0_0_56
84                          );
85  
86
87 sub versions 
88 {
89     return  (sort keys %minor_conversions);
90 }
91     
92
93 sub    show_rules
94 {
95     print "Rules: ", join(", ", sort keys %minor_conversions), "\n";
96     
97 }
98
99 sub do_conversion
100 {
101     my ($from,$to) = @_;
102
103     my @applicable_conversion;
104     my @mudela_levels;
105     
106     die "This is too old  to convert " if $from < 50;
107     my @v = versions;
108     foreach $a (@v) {
109         if ($a > $from && $a <= $to ){ 
110             push @applicable_conversion, $minor_conversions{$a};
111             push @mudela_levels, $a;
112         }
113     }
114     
115     print STDERR "Applying following rules: ", join(", ", @mudela_levels) , "\n";
116
117     while (<INLY>) {
118         foreach $subroutine (@applicable_conversion) {
119         
120             &$subroutine;
121             
122         }
123         version_string_conv $from, $to;
124         print OUTLY;
125     }
126 }
127
128 sub get_auto_from
129 {
130     my ($fn)=@_;
131     my ($ver);
132     open INLY, $fn || die "Can't open";
133
134     while (<INLY>) {
135         s/^.*\\version \"([^\"]*)\".*$//;
136         if (defined ($1)) {
137             print STDERR "Guessing version: ", $1, ".. ";
138             $ver = $1;
139             last;
140         }
141     }
142     if (!defined($ver)){
143         print STDERR "can't determine mudela version in $fn.\n";
144         my $u;
145         return $u;
146     }
147     $ver =~ s/0\.0\.// ;
148     close INLY;
149     return $ver;
150 }   
151
152 sub  set_files 
153 {
154     $infile = "-";
155     $outfile = "-";
156     $outfile = $opt_output if (defined($opt_output));
157
158     if ($ARGV [0])  {
159         $infile = $ARGV[0];
160     } 
161     if (( ! -f $infile) && (! $infile =~ /\\.ly$/s ) ){
162         $infile .= ".ly";
163         
164
165     }
166     if ($opt_edit && $infile ne "-") {
167         $opt_edit = 1;
168         $outfile = "$infile.NEW";
169         $infile = "$infile";
170     }
171     print STDERR "Input ", (($infile eq "-") ?"STDIN" : $infile), " .. ";
172
173 }
174
175 sub do_one_arg
176 {
177     set_files;
178
179     local ($from_version, $to_version);
180     $from_version = $opt_from;
181     $to_version = $opt_to;
182     
183     ($from_version = get_auto_from $infile) unless defined($opt_from);
184     return if (!defined($from_version));
185     
186     ($to_version =  last_conversion) unless (defined($opt_to));
187
188
189     die "can't open \`$infile\'" unless open INLY,$infile ;
190     die "can't open \`$outfile\'" unless open OUTLY, ">$outfile";
191     
192     do_conversion $from_version, $to_version;
193     close INLY;
194     close OUTLY;
195
196     if ($opt_edit) {
197         rename $infile, "$infile~";
198         rename $outfile, "$infile";
199     }
200 }
201
202 ## "main"
203
204 identify;
205
206 GetOptions ("help", "output=s", "from=i", "to=i", "minor=i", "edit", "show-rules");
207
208 if ($opt_help) {
209     usage();
210     $opt_help = 0;      # to extinguish typo check.
211     exit 0;
212 }
213
214 if ($opt_show_rules) { 
215     show_rules ;
216     $opt_show_rules = 0;        # to extinguish typo check.
217     exit 0;
218 }
219
220 local ( $infile,$outfile);
221 my $processed_one=0;
222
223 while (defined($ARGV[0])) {
224     do_one_arg;
225     shift @ARGV;
226     $processed_one = 1;
227 }
228 do_one_arg unless ($processed_one);
229
230