]> git.donarmstrong.com Git - lilypond.git/blob - bin/convert-mudela.in
bad1df51ec2d9ed9b92d89d974f37f022c51c1bf
[lilypond.git] / bin / convert-mudela.in
1 #!@PERL@ -w
2 # -*-perl-*-
3
4 =head1 TODO
5
6     detect \lyrics and \melodic, and do substitution accordingly.
7     count <> and {} ?
8
9 Ugh . Perl sux. Anybody for Python?
10     
11 =cut    
12
13
14
15 #
16 # version of "supporting" engine, not mudela conversions.
17
18
19
20
21
22 $convert_mudela_version = "0.1.1";
23
24 use Getopt::Long;
25
26
27 sub version_compare
28 {
29     local ($a,$b)=@_;
30     return &cmpver;
31 }
32     
33
34 sub  cmpver 
35 {       
36         my(@a)= split /\./,$a;
37         my(@b)= split /\./,$b;
38
39         for $i (0,1,2) {
40             return $a[$i] <=> $b[$i] if ($a[$i] != $b[$i]);
41         }
42         return $a cmp $b;
43 }
44
45 sub version_string_conv
46 {
47     my ($from_version, $to_version) = @_;
48     s/\version \"$from_version\"/\version \"$to_version\"/g;
49 }
50
51 ################################################################
52
53 sub no_conv
54 {
55 }
56  
57 sub convert_0_0_52_to_0_0_53
58 {
59
60     s/include \"/$1\\include \"/g;
61 }
62
63   
64 sub convert_0_0_54_to_0_0_55
65 {
66     s/%{/% {/g;
67 }
68
69   
70 sub convert_0_0_53_to_0_0_54
71 {
72     print STDERR "Not smart enough to convert \\transpose\n"    if (/\\transpose/) ;
73 }
74
75 # we-re not at 58 yet, but this is at least one of the rules
76 sub convert_0_0_55_to_0_0_56
77 {
78     s/\"\|\|\"/\"|.\"/g;
79 }
80
81 sub convert_0_0_56_to_0_0_57
82 {
83     s/\(([ \]\[|\t-\.>]|\\[<!>a-z]+)*\)/\~ $1/g;
84 }
85
86 sub convert_0_0_57_to_0_0_58
87 {
88     s/\[ *([^\[\]]*)\] *([1-9]*) *\/ *([1-9]*)/[$2\/$3 $1]1\/1/g;
89 }
90
91 sub convert_0_0_58_to_0_0_59
92 {
93     die "Not smart enough to convert 0.0.58 to 0.0.59\n";
94 }
95
96 sub convert_0_0_59_to_0_0_60
97 {
98     s/(\\unitspace [0-9.mcptin\\ ]+|\\geometric [0-9.]+|\\width [0-9.mcp\\tin]+)/$1;/g;
99     s/(\\output \"[^\"]+\")/$1;/;
100     s/(\\tempo  [0-9: ]+)/$1;/;
101 }
102
103 sub convert_0_0_60_to_0_0_61
104 {
105     s/(\\unitspace|\\geometric|\\width)/$1=/g;
106    
107 }
108
109 sub convert_0_1_0_to_0_1_1
110 {
111     s/\\tempo (.*):(.*);/\\tempo $1 = $2;/g
112 }
113 ###############################################################
114
115 sub    last_conversion
116 {
117     my @v = &versions;
118     return pop @v;
119 }
120 sub identify
121 {
122     
123     print STDERR "This is convert-mudela " . $convert_mudela_version . 
124         " (up to mudela version ", last_conversion,     ")\n";
125 }
126   
127   
128  sub usage
129   {
130      print STDERR "Usage: convert-mudela [options] [mudela-file]...\n"
131      . "Convert old mudela source from mudela-file or stdin\n\n"
132      . "Options:\n"
133      . "  -e, --edit             perform in-place conversion\n"
134      . "  -f, --from=PATHLEVEL   use source version 0.0.PATCHLEVEL\n"
135      . "  -h, --help             print this help\n"
136      . "  -o, --output=FILE      name output file\n"
137      . "  -s, --show-rules       print all known conversion rules\n"
138      . "  -t, --to=VERSION    convert to version VERSION\n"
139   }
140       
141
142 my %minor_conversions = ("0.0.50" => \&no_conv,
143                          "0.0.52" => \&convert_0_0_50_to_0_0_52,
144                          "0.0.53" => \&convert_0_0_52_to_0_0_53,
145                          "0.0.54" => \&convert_0_0_53_to_0_0_54,
146                          "0.0.55" => \&convert_0_0_54_to_0_0_55,
147                          "0.0.56" => \&convert_0_0_55_to_0_0_56,
148                          "0.0.57" => \&convert_0_0_56_to_0_0_57,
149                          "0.0.58" => \&convert_0_0_57_to_0_0_58,
150                          "0.0.59" => \&convert_0_0_58_to_0_0_59,
151                          "0.0.60" => \&convert_0_0_59_to_0_0_60,
152                          "0.0.61" => \&convert_0_0_60_to_0_0_61,
153                          "0.1.1" => \&convert_0_1_0_to_0_1_1
154                          );
155  
156
157 sub versions 
158 {
159     return (sort { cmpver; } (keys %minor_conversions));
160 }
161     
162
163 sub show_rules
164 {
165     my (@v) = versions;
166
167     print "Rules: ", join(", ", @v), "\n";
168     
169 }
170
171 sub do_conversion
172 {
173     my ($from,$to) = @_;
174
175     my @applicable_conversion;
176     my @mudela_levels;
177     
178     my @v = versions;
179     foreach $ver (@v) {
180         if (version_compare($ver, $from) > 0 && version_compare($ver,$to) <= 0 ){ 
181             push @applicable_conversion, $minor_conversions{$ver};
182             push @mudela_levels, $ver;
183         }
184     }
185     
186     print STDERR "Applying following rules: ", join(", ", @mudela_levels) , "\n";
187
188     while (<INLY>) {
189         foreach $subroutine (@applicable_conversion) {
190         
191             &$subroutine;
192             
193         }
194         version_string_conv $from, $to;
195         print OUTLY;
196     }
197 }
198
199 sub get_auto_from
200 {
201     my ($fn)=@_;
202     my ($ver);
203     open INLY, $fn || die "Can't open";
204
205     while (<INLY>) {
206         s/^.*\\version \"([^\"]*)\".*$//;
207         if (defined ($1)) {
208             print STDERR "Guessing version: ", $1, ".. ";
209             $ver = $1;
210             last;
211         }
212     }
213     if (!defined($ver)){
214         print STDERR "can't determine mudela version in $fn.\n";
215         my $u;
216         return $u;
217     }
218     close INLY;
219     return $ver;
220 }   
221
222 sub  set_files 
223 {
224     $infile = "-";
225     $outfile = "-";
226     $outfile = $opt_output if (defined($opt_output));
227
228     if ($ARGV [0])  {
229         $infile = $ARGV[0];
230     } 
231     if (( ! -f $infile) && (! $infile =~ /\\.ly$/s ) ){
232         $infile .= ".ly";
233         
234
235     }
236     if ($opt_edit && $infile ne "-") {
237         $opt_edit = 1;
238         $outfile = "$infile.NEW";
239         $infile = "$infile";
240     }
241     print STDERR "Input ", (($infile eq "-") ?"STDIN" : $infile), " .. ";
242
243 }
244
245 sub do_one_arg
246 {
247     set_files;
248
249     local ($from_version, $to_version);
250     $from_version = $opt_from;
251     $to_version = $opt_to;
252     
253     ($from_version = get_auto_from $infile) unless defined($opt_from);
254     return if (!defined($from_version));
255     
256     ($to_version =  last_conversion) unless (defined($opt_to));
257
258     die "can't open \`$infile\'" unless open INLY,$infile ;
259     die "can't open \`$outfile\'" unless open OUTLY, ">$outfile";
260     
261     do_conversion $from_version, $to_version;
262     close INLY;
263     close OUTLY;
264
265     if ($opt_edit) {
266         rename $infile, "$infile~";
267         rename $outfile, "$infile";
268     }
269 }
270
271 ## "main"
272
273 identify;
274
275
276 GetOptions ("help", "output=s", "from=i", "to=i", "minor=i", "edit", "show-rules");
277
278 if ($opt_help) {
279     usage();
280     $opt_help = 0;      # to extinguish typo check.
281     exit 0;
282 }
283
284 if ($opt_show_rules) { 
285     show_rules ;
286     $opt_show_rules = 0;        # to extinguish typo check.
287     exit 0;
288 }
289
290 local ( $infile,$outfile);
291 my $processed_one=0;
292
293 while (defined($ARGV[0])) {
294     do_one_arg;
295     shift @ARGV;
296     $processed_one = 1;
297 }
298 do_one_arg unless ($processed_one);
299
300