our @options;
our %candidates; # $candidates{CAND}{Desc}, {Opts}[]
+our %candref; # $candref{CAND} => msg of why needed
our @ballots;
my $candvoter_re = '\w+';
+my $cands_re = '\w+(?,\w+)*';
my $opt_re = '\w+(?:=\S*)?';
sub badinput ($) {
foreach my $o (split /\s+/, $os) {
if ($o =~ m/^\w+$/) {
push @o, $&;
+ } elsif ($o =~ s/^_[Tt]ie\=//) {
+ $o =~ m/^($cands_re)([<>])($cands_re)$/
+ or badinput "bad value \`$_' for tie option";
+ my ($l,$op,$r) = ($1,$2,$3);
+ ($l,$op,$r) = ($r,'>',$l) if $op eq '<';
+ $candref{$_} = "tie break spec" foreach $o =~ m/\w+/g;
+ $l = join ',', sort split /\,/, $l;
+ $r = join ',', sort split /\,/, $r;
+ $l =~ m/\b$_\b/ and badinput "reflexive tie"
+ foreach split /\,/, $r;
+ push @o, "$l$op$r";
} elsif ($o =~ m/^\w+\=\S+$/) {
push @o, $&;
} elsif ($o !~ m/\S/) {
print "| @options\n" or die $!;
+foreach my $cand (sort keys %candref) {
+ badinput "missing candidate $cand (ref. by $candref{$cand}"
+ unless defined $candidates{$cand};
+}
+
foreach my $cand (sort keys %candidates) {
my $c = $candidates{$cand};
$c->{Desc} //= $cand;