chiark / gitweb /
openstvoutput24compare: wip, fixes
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Tue, 23 Aug 2016 12:47:15 +0000 (13:47 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Tue, 23 Aug 2016 12:47:15 +0000 (13:47 +0100)
openstvoutput24compare

index be52f7a..15f101b 100755 (executable)
@@ -16,6 +16,7 @@ sub parseheader () {
            $cboxrow++;
            next;
        }
            $cboxrow++;
            next;
        }
+       s/\n$//;
        if (m/^\s+[R ]\|/) {
            my @entries = split /\|/, $';
            $nboxcols ||= @entries;
        if (m/^\s+[R ]\|/) {
            my @entries = split /\|/, $';
            $nboxcols ||= @entries;
@@ -43,21 +44,26 @@ sub processbody () {
     my %vals;
     my $donequota = 'X';
     while (<>) {
     my %vals;
     my $donequota = 'X';
     while (<>) {
+       s/\n$//;
        if (m/^\s+\|--/) {
            if ($cboxrow >= 0) {
                die unless $cboxrow;
                die unless (scalar keys %vals) == @boxheads;
        if (m/^\s+\|--/) {
            if ($cboxrow >= 0) {
                die unless $cboxrow;
                die unless (scalar keys %vals) == @boxheads;
-               foreach my $k (sort grep { m/\S/ } keys %vals) {
-                   print " candidate %10s : %20s votes\n" or die $!;
+               foreach my $k (sort grep { !m/ $/ } keys %vals) {
+                   my $e = $vals{$k};
+                   next unless length $e;
+                   printf " candidate %-10s : %20s votes\n",
+                       $k, $e
+                       or die $!;
                }
                my $quota = $vals{'Threshold '};
                if ($donequota ne $quota) {
                }
                my $quota = $vals{'Threshold '};
                if ($donequota ne $quota) {
-                   print " quota %10d\n", $quota;
+                   printf " quota   %10s\n", $quota;
                    $donequota = $quota;
                }
                my $surplus = $vals{'Surplus '};
                if ($surplus ne '0') {
                    $donequota = $quota;
                }
                my $surplus = $vals{'Surplus '};
                if ($surplus ne '0') {
-                   print " surplus %10d\n", $surplus;
+                   printf " surplus %10s\n", $surplus;
                }
            }
            $cboxrow = -1;
                }
            }
            $cboxrow = -1;
@@ -69,10 +75,10 @@ sub processbody () {
            next;
        }
        if (m/^\s*(\d*)\|/) {
            next;
        }
        if (m/^\s*(\d*)\|/) {
-           die $cboxrow unless $cboxrow >= 0;
-           die $cboxrow unless !!$cboxrow == !!length $1;
+           next unless $cboxrow >= 0;
+           die "$cboxrow $1" unless !$cboxrow == !!length $1;
            if (length $1) {
            if (length $1) {
-               print "stage Td:\n", $1 or die $!;
+               printf "stage %d:\n", $1 or die $!;
            }
            my @entries = split /\|/, $';
            $nboxcols >= @entries or die;
            }
            my @entries = split /\|/, $';
            $nboxcols >= @entries or die;
@@ -83,15 +89,44 @@ sub processbody () {
                die if exists $vals{$h};
                my $e = $entries[$cboxcol];
                $e =~ s/^\s+//;
                die if exists $vals{$h};
                my $e = $entries[$cboxcol];
                $e =~ s/^\s+//;
-               $e =~ m/^\d*\.\d*$/ or die;
-               $e =~ m/\d/ or die;
-               $e =~ s/\.0+$//;
+               if (length $e) {
+                   $e =~ m/^\d*\.\d*$/ or die;
+                   $e =~ m/\d/ or die;
+                   $e =~ s/\.0+$//;
+               }
                $vals{$h} = $e;
            }
                $vals{$h} = $e;
            }
+           $cboxrow++;
+           next;
+       }
+       if (!m/\S/) {
+           last;
+       }
+       die;
+    }
+}
+
+sub processfinal () {
+    while (<>) {
+       s/\n$//;
+       if (s/^Winners are //) {
+           s/\.$//;
+           my @w = split /\, /;
+           if (@w == 1) {
+               @w = split / and /, $w[0];
+           } else {
+               $w[$#w] =~ s/^and //;
+           }
+           print "Winners:\n";
+           @w = sort @w;
+           foreach my $i (0..$#w) {
+               printf "  %s\n", $w[$i];
+           }
+           print "done.\n";
        }
        }
-       
-           
+    }
 }
 
 parseheader();
 processbody();
 }
 
 parseheader();
 processbody();
+processfinal();