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