chiark
/
gitweb
/
~ian
/
appendix-a6.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
spi2loose and normalise fixes
[appendix-a6.git]
/
normalise
diff --git
a/normalise
b/normalise
index 6bf8ea664d7b54fce5b65f3c2faea20fe90a51d7..7db074006a9f6627376b7e88ea5276c0b859318f 100755
(executable)
--- a/
normalise
+++ b/
normalise
@@
-2,18
+2,26
@@
use strict;
use strict;
-our @options, %candiates, @ballots;
+our @options;
+our %candidates; # $candidates{CAND}{Desc}, {Opts}[]
+our @ballots;
my $candvoter_re = '\w+';
my $candvoter_re = '\w+';
+sub badinput ($) {
+ die "bad input: $_[0]";
+}
+
sub normalise_opts_list ($) {
sub normalise_opts_list ($) {
+ my ($os) = @_;
+ $os //= '';
my @o;
foreach my $o (split /\s+/, $os) {
if ($o =~ m/^\w+$/) {
push @o, $&;
} elsif ($o =~ m/^\w+\=\S+$/) {
my @o;
foreach my $o (split /\s+/, $os) {
if ($o =~ m/^\w+$/) {
push @o, $&;
} elsif ($o =~ m/^\w+\=\S+$/) {
- push @o, $&;
S
- } els
e
if ($o !~ m/\S/) {
+ push @o, $&;
+ } elsif ($o !~ m/\S/) {
} else {
badinput "bad option \`$o'";
}
} else {
badinput "bad option \`$o'";
}
@@
-34,7
+42,9
@@
while (<>) {
s/\s+$//;
if (m/^\|/) {
push @options, normalise_opts_list $';
s/\s+$//;
if (m/^\|/) {
push @options, normalise_opts_list $';
- } elsif (m/^($candvoter_re?)\s*=\s*([^|]+?)\s*|(.*)?$/) {
+ } elsif (m/^($candvoter_re?)\s*=\s*([^|]+?)\s*\|(.*)?$/o) {
+ use Data::Dumper;
+print STDERR Dumper($1,$2,$3);
my ($cand,$desc,$opts) = ($1,$2,$3);
push @{ $candidates{$cand}{Opts} }, normalise_opts $opts;
if (length $desc) {
my ($cand,$desc,$opts) = ($1,$2,$3);
push @{ $candidates{$cand}{Opts} }, normalise_opts $opts;
if (length $desc) {
@@
-42,15
+52,15
@@
while (<>) {
defined $candidates{$cand}{Desc};
$candidates{$cand}{Desc} = $desc;
}
defined $candidates{$cand}{Desc};
$candidates{$cand}{Desc} = $desc;
}
- $desc=$cand unless length $desc;
- push @candidates, "$cand = $desc".
- } elsif (m/^($candvoter_re?)?\s*\:([^|]+)(|(.*)?$/) {
+ } elsif (m/^($candvoter_re?)?\s*\:([^|]*)(?:\|(.*))?$/) {
my ($voter,$opts) = ($1,$3);
my @p;
foreach my $p (split /\s+/, $2) {
if ($p =~ m/^\w+(?:\=\w+)*$/) {
push @p, $&;
my ($voter,$opts) = ($1,$3);
my @p;
foreach my $p (split /\s+/, $2) {
if ($p =~ m/^\w+(?:\=\w+)*$/) {
push @p, $&;
- $candidates{$_} //= { } foreach my $p =~ m/\w+/g;
+ $candidates{$_} //= { } foreach $p =~ m/\w+/g;
+ } elsif ($p eq '') {
+ # empty entry can only happen if voter casts no prefs at all
} else {
badinput "bad vote preference \`$p'";
}
} else {
badinput "bad vote preference \`$p'";
}
@@
-75,6
+85,6
@@
foreach my $cand (sort keys %candidates) {
sub vsortkey { $_[0] =~ m/:/; return "$' : $`"; }
print $_,"\n" or die $! foreach
sub vsortkey { $_[0] =~ m/:/; return "$' : $`"; }
print $_,"\n" or die $! foreach
-
(
sort { vsortkey($a) cmp vsortkey($b) } @ballots;
+ sort { vsortkey($a) cmp vsortkey($b) } @ballots;
print ".\n" or die $!;
print ".\n" or die $!;