chiark / gitweb /
wip tb-list
[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 # we don't use Getopt::Long because we want to be quick to start up
12 # and we're not really a very user-facing utility
13
14 while (@ARGV && $ARGV[0] =~ m/^\-/) {
15     $_ = shift @ARGV;
16     if (s/^-U//) {
17         $flag{$_}{Result} = 0;
18         push @order_final_maybe, $_;
19     } elsif (s/^-D//) {
20         $flag{$_}{Result} = 1;
21         push @order_final_maybe, $_;
22     } elsif (m/^-v$/) {
23         $verbose = 1;
24     } elsif (m/^--$/) {
25         last;
26     } else {
27         die "$0: bad option\n";
28     }
29 }
30
31 @ARGV==3 or die "$0: bad usage\n";
32
33 foreach my $ix (qw(0 1 2)) {
34     open F, '<', $ARGV[$ix] or die "$ix $!";
35     while (<F>) {
36         chomp or die;
37         $flag{$_}{Input}[$ix] = 1;
38         my $ff = $flag{$_};
39         push @order, $_ unless $ff->{InOrder}++;
40     }
41     F->error and die $!;
42     close F or die $!;
43 }
44
45 foreach $_ (@order_final_maybe) {
46     push @order, $_ unless $flag{$_}{InOrder}++;
47 }
48
49 my $current = $ARGV[0];
50
51 open O, '>', "$current.tmp" or die "$current.tmp $!";
52
53 foreach $_ (@order) {
54     my $ff = $flag{$_};
55     if (!defined $ff->{Result}) {
56         my $s = '';
57         foreach my $ix (qw(0 1 2)) {
58             $ff->{Input}[$ix] ||= 0;
59             $s .= $ff->{Input}[$ix];
60         }
61         if ($verbose) {
62             print STDERR "MERGE-LISTS $s $_\n" or die $!;
63         }
64         $ff->{Result} =
65             $s eq '000' ? '000' :
66             $s eq '111' ? '111' :
67             !$ff->{Input}[1];
68     }
69     if ($ff->{Result}) {
70         print O "$_\n" or die $!;
71     }
72 }
73
74 close O or die $!;
75 rename "$current.tmp", "$current" or die "$current $!";
76 exit 0;