#!/usr/bin/perl -w
+#
+# usage:
+# normalise [NORM-OPTIONS...] [--] INPUT-FILES...
+#
+# NORM-OPTIONS are
+# +OPTNAME[=OPTVAL] Election option
+# CAND=[DESCRIPTION]
+# +CAND+OPTNAME[=OPTVAL] Candidate option
+# -- End of options to normalise
+# -... Reserved for future options to normalise
use strict;
our @ballots;
my $candvoter_re = '\w+';
+my $opt_re = '\w+(?:=\S*)?';
sub badinput ($) {
die "bad input: $_[0]";
}
-sub normalise_opts_list ($) {
- my ($os) = @_;
+sub normalise_opts_list ($$) {
+ # $ctx is one of Election Candidate Ballot
+ my ($os,$ctx) = @_;
$os //= '';
my @o;
foreach my $o (split /\s+/, $os) {
return @o;
}
-sub normalise_opts ($) {
- my ($os) = @_;
- my @o = normalise_opts_list $os;
+sub normalise_opts ($$) {
+ my ($os,$ctx) = @_;
+ my @o = normalise_opts_list $os, $ctx;
return " | @o";
}
}
}
+while (@ARGV) {
+ $_ = shift @ARGV;
+ if (m/^--$/) {
+ last;
+ } elsif (m/^(\w+)=([^|]+)$/) {
+ setcanddesc $1, $2;
+ } elsif (m/^\+($opt_re)$/) {
+ push @options, $1;
+ } elsif (m/^\+(\w+)\+($opt_re)$/) {
+ push @{ $candidates{$1}{Opts} }, $2;
+ } elsif (m/^-/) {
+ die "unknown normalise option \`$_'\n";
+ } else {
+ # oh!
+ unshift @ARGV, $_;
+ last;
+ }
+}
+
while (<>) {
next unless m/\S/;
next if m/^\#/;
s/^\s+//;
s/\s+$//;
if (m/^\|/) {
- push @options, normalise_opts_list $';
+ push @options, normalise_opts_list $', 'Election';
} 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;
+ push @{ $candidates{$cand}{Opts} }, normalise_opts $opts, 'Candidate';
setcanddesc $cand, $desc;
} elsif (m/^($candvoter_re?)?\s*\:([^|]*)(?:\|(.*))?$/) {
my ($voter,$opts) = ($1,$3);
badinput "bad vote preference \`$p'";
}
}
- push @ballots, "$voter : @p".normalise_opts $opts;
+ push @ballots, "$voter : @p".normalise_opts $opts, 'Ballot';
} elsif (m/^\.$/) {
} else {
badinput "unknown line format \`$_'";