1 package winapi_fixup_editor
;
5 use options
qw($options);
6 use output qw($output);
7 use winapi qw($win16api $win32api @winapis);
13 my $class = ref($proto) || $proto;
15 bless ($self, $class);
17 my $file = \${$self->{FILE}};
27 my $triggers = \%{$self->{TRIGGERS}};
32 if(!defined($$triggers{$line})) {
33 $$triggers{$line} = [];
36 push @{$$triggers{$line}}, $action;
42 my $begin_line = shift;
43 my $begin_column = shift;
45 my $end_column = shift;
48 my $file = \${$self->{FILE}};
50 my $line = $begin_line;
53 $self->add_trigger($begin_line, {
55 begin_line => $begin_line,
56 begin_column => $begin_column,
57 end_line => $end_line,
58 end_column => $end_column,
66 my $file = \${$self->{FILE}};
67 my $triggers = \%{$self->{TRIGGERS}};
77 my $lookahead_count = 0;
78 LINE: while($again || defined(my $current = <IN>)) {
84 $_ .= "\n" . $current;
95 my $line = $. - $lookahead_count;
96 foreach my $action (@{$$triggers{$line}}) {
97 if($. < $action->{end_line}) {
102 my $type = $action->{type};
103 my $begin_line = $action->{begin_line};
104 my $begin_column = $action->{begin_column};
105 my $end_line = $action->{end_line};
106 my $end_column = $action->{end_column};
108 if($type eq "replace") {
109 my $replace = $action->{replace};
111 my @lines = split(/\n/, $_);
119 while($column < $begin_column - 1 && s/^.//) {
122 $column = $column + 8 - $column % 8;
129 $_ = $lines[$#lines];
130 while($column2 < $end_column && s/^.//) {
132 $column2 = $column2 + 8 - $column2 % 8;
139 $_ = "$begin$replace$end";
140 if($options->modify) {
143 $output->write("$$file:$begin_line.$begin_column-$end_line.$end_column: $replace\n");
156 $modified = edit_file($$file, $editor);
164 ########################################################################
165 # Hack for backward compabillity
177 my $file = ${$self->{FILE}};
189 $line = $insert_line{$.};
191 if($options->modify) {
195 my $line2 = $line; chomp($line2);
196 my @line2 = split(/\n/, $line2);
198 $output->write("$file: $.: insert: \\\n");
199 foreach my $line2 (@line2) {
200 $output->write("'$line2'\n");
203 $output->write("$file: $.: insert: '$line2'\n");
208 my $search = $substitute_line{$.}{search};
209 my $replace = $substitute_line{$.}{replace};
211 if(defined($search) && defined($replace)) {
213 if(s/$search/$replace/) {
214 if($options->modify) {
220 if(!$options->modify || !$modified2) {
224 $search2 = "unmatched search";
225 $replace2 = "unmatched replace";
228 $replace2 = "replace";
230 $output->write("$file: $.: $search2 : '$search'\n");
232 my @replace2 = split(/\n/, $replace);
234 $output->write("$file: $.: $replace2: \\\n");
235 foreach my $replace2 (@replace2) {
236 $output->write("'$replace2'\n");
239 $output->write("$file: $.: $replace2: '$replace'\n");
244 $line = $delete_line{$.};
247 if($options->modify) {
251 $output->write("$file: $.: delete: '$line'\n");
254 $output->write("$file: $.: unmatched delete: '$line'\n");
265 while(defined(each %insert_line)) { $n++; }
266 while(defined(each %substitute_line)) { $n++; }
267 while(defined(each %delete_line)) { $n++; }
269 edit_file($file, $editor);
272 foreach my $module (sort(keys(%spec_file))) {
274 foreach my $winapi (@winapis) {
275 $file = ($winapi->module_file($module) || $file);
279 $file = file_normalize($file);
282 my @substitutes = @{$spec_file{$module}};
292 my @substitutes2 = ();
293 foreach my $substitute (@substitutes) {
294 my $search = $substitute->{search};
295 my $replace = $substitute->{replace};
297 if(s/$search/$replace/) {
298 if($options->modify) {
301 $output->write("$file: search : '$search'\n");
302 $output->write("$file: replace: '$replace'\n");
306 push @substitutes2, $substitute;
309 @substitutes = @substitutes2;
318 edit_file($file, $editor);
320 $output->write("$module: doesn't have any spec file\n");
323 if($#substitutes >= 0) {
324 foreach my $substitute (@substitutes) {
325 my $search = $substitute->{search};
326 my $replace = $substitute->{replace};
328 $output->write("$file: unmatched search : '$search'\n");
329 $output->write("$file: unmatched replace: '$replace'\n");
336 %substitute_line = ();
348 $delete_line{$line} = $pattern;
357 $insert_line{$line} = $insert;
360 sub substitute_line {
367 $substitute_line{$line}{search} = $search;
368 $substitute_line{$line}{replace} = $replace;
371 sub replace_spec_file {
379 $substitute->{search} = $search;
380 $substitute->{replace} = $replace;
382 if(!defined($spec_file{$module})) {
383 $spec_file{$module} = [];
386 push @{$spec_file{$module}}, $substitute;