chiark / gitweb /
normalise: pass $ctx to normalise_opts
[appendix-a6.git] / normalise
index df9e46763b3918bab064a9002538478dfc3f02f5..c5a9077365b97b96a34d66e16ca6f7861738193e 100755 (executable)
--- a/normalise
+++ b/normalise
@@ -1,4 +1,14 @@
 #!/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;
 
@@ -7,13 +17,15 @@ our %candidates; # $candidates{CAND}{Desc}, {Opts}[]
 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) {
@@ -29,9 +41,9 @@ sub normalise_opts_list ($) {
     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";
 }
 
@@ -45,18 +57,37 @@ sub setcanddesc ($$) {
     }
 }
 
+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);
@@ -71,7 +102,7 @@ print STDERR Dumper($1,$2,$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 \`$_'";