chiark / gitweb /
efdd52b2b88a91232cc91b2b9d48f1830384c655
[topbloke.git] / topbloke-merge-lists
1 #!/usr/bin/perl
2
3 use strict;
4 use warnings;
5 use IO::Handle;
6
7 our %flag;
8 our (@order, @order_final_maybe);
9 our $verbose=0;
10
11 while (@ARGV && $ARGV[0] =~ m/^\-/) {
12     $_ = shift @ARGV;
13     if (s/^-U//) {
14         $flag{$_}{Result} = 0;
15         push @order_final_maybe, $_;
16     } elsif (s/^-D//) {
17         $flag{$_}{Result} = 1;
18         push @order_final_maybe, $_;
19     } elsif (m/^-v$/) {
20         $verbose = 1;
21     } elsif (m/^--$/) {
22         last;
23     } else {
24         die "$0: bad option\n";
25     }
26 }
27
28 @ARGV==3 or die "$0: bad usage\n";
29
30 foreach my $ix (qw(0 1 2)) {
31     open F, '<', $ARGV[$ix] or die "$ix $!";
32     while (<F>) {
33         chomp or die;
34         $flag{$_}{Input}[$ix] = 1;
35         my $ff = $flag{$_};
36         push @order, $_ unless $ff->{InOrder}++;
37     }
38     F->error and die $!;
39     close F or die $!;
40 }
41
42 foreach $_ (@order_final_maybe) {
43     push @order, $_ unless $flag{$_}{InOrder}++;
44 }
45
46 my $current = $ARGV[0];
47
48 open O, '>', "$current.tmp" or die "$current.tmp $!";
49
50 foreach $_ (@order) {
51     my $ff = $flag{$_};
52     if (!defined $ff->{Result}) {
53         my $s = '';
54         foreach my $ix (qw(0 1 2)) {
55             $ff->{Input}[$ix] ||= 0;
56             $s .= $ff->{Input}[$ix];
57         }
58         if ($verbose) {
59             print STDERR "MERGE-LISTS $s $_\n" or die $!;
60         }
61         $ff->{Result} =
62             $s eq '000' ? '000' :
63             $s eq '111' ? '111' :
64             !$ff->{Input}[1];
65     }
66     if ($ff->{Result}) {
67         print O "$_\n" or die $!;
68     }
69 }
70
71 close O or die $!;
72 rename "$current.tmp", "$current" or die "$current $!";
73 exit 0;