UseVote V3.0 - Usenet News Group Voting Software
by rdippold@qualcomm.com

I should have saved all names and comments for improvement credits, but
unfortunately I didn't.  But I would like to specifically thank Ian
Kluft for a large bit of the conversion to dynamic configuration and
especially for finally getting me to do it, and Andrew Solovay for an
infinite number of suggestions, of which I have implemented 90% or so.

----------------------------- VERSION CHANGES ---------------------------

Compatability:
  If you want to use a result file produced prior to UseVote 2.0 with newer
  versions of the software, you must compile and run the "convert" program
  to add the extra "D:" and "C:" fields.

  Usevote 3.0 requires a usevote.cfg file rather than thisvote.h.  You can
  convert from one to the other.  Results are still compatible.

Limitations:
  STV voting only allows up to 9 choices (1-9).  May be upgraded for
  99 choice ballots.

V3.0 - Major overhaul.  Configuration incompatible with previous versions!
* UseVote now uses dynamic configuration files.  This means you can use
  the same executables for every vote, as well as the same USEVOTE.CFG.
  'uvvote -t' lets you see the configuration variables.
  A big thanks to Ian Kluft for giving me a boost on this.
* usevote.cfg (ex thisvote.h) now lets you transfer the group name to
  other fields automatically, so you don't have to enter it three times.
* Two new fields in usevote.h - MAXGROUPS and CFGFILE
* The wildcard in VOTEMARK is now % instead of #, since # indicates a comment.
* UseVote now comes with uvcfv, a simple CFV processor which should eliminate
  some of the drudgery.  This is for UVV members, really.
* New support for STV (Single Transferable Vote) voting, also known as
  preference voting.  uvcount will support both simple majority (for
  polls) and in the future method based on voting guidelines.
* New item in acktext.txt for STV: [bad stv]
* uvbounce now uses the standard uvack format for listing addresses AND
  names.  Will also discard exact duplicate addresses.
* In addition to NEEDNAME, there is now WANTNAME.  This will let you
  enter a name if one is not found and you're in interactive mode.
* uvcount wouldn't allow more than one parameter at once.
* example in README to use sendmail instead of mail for acks.
* new script "newvote" as an example of how to use common files when
  you're running multiple votes.

V2.2a
* Bug in uvcount would print a random number if you had exactly one
  invalid ballot.

V2.2 - Mostly a release to make sure people get the 2.1b fixes
* uvdup now has "smart duplicate deletion" which will eliminate duplicates
  that are definitely from the same voter, but will ask if there's a
  question.  The old paranoid mode is still available with -n.
* uvdup shows a progress indicator
* uvballot now adds an admonition to the voter to save the marker text
  for a multigroup ballot.
* Overhaul of uvcount for more explaination of results with single
  group votes. The table format is still available with the -t flag.
  Also, uvcount now should do all plurals correctly.
* Extensive overhaul of sample.cfv, sample2.cfv, and acktext.txt based on
  UVV member comments.

V2.1b - Voters do the damndest things
* EBCDIC doesn't have [] characters, if you can believe it.  So the vote
  markers have changed to <>.  It doesn't matter for the groups, since the
  [] aren't looked at.
* ABSTAIN votes will not even be included in the count for single
  group votes.
* Make FOR the last check, as it's most likely to be misused.
* Error in uvvote.c in checking for non-alphanumeric after CANCEL.
* Changed "! No vote" to "! No vote statement in message" in results
* uvdup should be more resistant to lines that are too long (though it
  shouldn't happen in the first place).  It'll error out gracefully
  and report the line number.
* uvvote will trim addresses at the first space if some idiot puts something
  after his reply address.
* uvvote should be unable to write too-long name lines to the results file.

V2.1a - quick bug fix
* Voter could send ballot with invalid header termination.  While this is
  clearly their fault, UseVote needs to handle it.  Now any line with only
  spaces or tabs should be treated as the end of the header.
* Minor changes in acktext.txt for clarity and a typo.

V2.1 - Major changes - mature product stuff
* usevote.h has finally been split into two files - one for general
  configuration for all votes (usevote.h), and one for stuff that will
  change for each vote (thisvote.h).  You can keep one copy of usevote.h
  and link it into each voting directory.
* uvvote now allows a list of invalid accounts and sites in usevote.h,
  any votes with these account names or coming from these sites will be
  rejected as invalid (with a nice note). Note new section in acktext.txt.
* Date handling is totally revamped.  You can specify in usevote.h which
  header fields you think should contain dates, usually the first line for
  most mail implementations, but also allows specification of gateways and
  plain old "Date:" as a last resort.
* uvdup and uvack have a much faster in-memory sort available.  If your
  machine has enough memory, #define MEMSORT in thisvote.h for up to 100
  times speed improvement.  If the vote gets too big, you can always recompile
  with it off for the slower disk-based sort.  Andrew Solovay sent me his code
  for this one and I used it as the basis of the current code.
* uvdup can now delete the newer vote.  This should not normally be done,
  but is there if you need it, such as with a trivially invalid 2nd vote.
* uvdup has revamped array stepping logic for duplicates - should work even
  in cases where there are more than three duplicates, cross fingers.
* Added CANCEL vote option.  This acts like a special form of invalid vote
  which hopefully means their previous vote will not appear on any ack list.
  The voting field in results looks like "V: * Cancel".   usevote.rul does
  not apply to cancel vote messages.  Note the new section in acktext.txt.
* Added "D"iscard option to "C"ontinue and "E"xamine, for messages that are
  not votes that have slipped into the vote file.  Also solved a user
  interface problem if ballot couldn't be found that would force error ack.
* Voter name is now placed in mail acks, and if NEEDNAME is defined,
  instructions on how to give a valid name are included.  The
  name prompting in uvballot is different (hopefully better) and NAMETEXT
  in thisvote.h is changed.
* Text for abstains in successful mail acks changed from "---" to "ABSTAIN".
* uvvote was not being RFC-compliant in handling headers - a Reply-To:
  in the body of the message could screw up the addressing.  Also, if
  the Reply-To: was before the From: it would get overridden.
* A type for file positioning variables is now defined in usevote.h.  So
  are parameters for text file reads ("rt"), writes ("wt"), and appends
  ("at").  Some systems don't like the defaults, and this makes it easy
  to modify for these votetakers.
* All main programs return int rather than void, so things which look for
  return codes won't get random results.
* uvcount has a fun feature, "-d", which keeps track of what date each
  group passes its vote.
* uvshell now accepts a "clean" command to do the cleanup stuff that
  "all" does without actually running uvvote again.
* Moved where I handle the multi-line crud in headers for uvvote - should
  make things easier to maintain, plus more elegant.
* uvdup could blow up if trace was on and a deleted vote was invalid.
  It could also ask about the first vote for name even if it had been
  deleted in address sort.
* uvvote had a missing ')' which only showed up with NEEDNAME.

V2.0a - quick fixes
* "uvvote -t" would choke on a %body% parameter, since there was no file
  open for input at the time.
* "uvack" now has the -i option to print only invalid votes.

V2.0 - Major new formats and functionality
* Wow! Interactive vote editor for uvvote available - needs three more
  variables in usevote.h
* "uvbounce" for generating Mail Ack bounce lists.
* Ability to include header and/or body of message in Mail Acks
* Two new fields for each vote - "D: <date>" and "C: <comment>".  Date
  will be taken from the first "From " or "Received:" field in the vote,
  if possible. Comment is mostly unused now.  The order is A, N, D, C, V.
* "convert" program included to convert old results files to new ones
* Unix shell script "uvshell" included to further automate uvvote.
* Make better use of vote start detection - now can detect vote in subject
  even if it comes before address.
* Realize that single group votes using UseVote are the vast majority, and
  reorder the file naming.


V1.7 - Internal release only
* Rejected votes are saved in the results file now, indicated by a "!"
  where the first vote should be in the votes field
* Refinements to "uvvote" address handling: should handle multiple-line
  addresses, should handle multiple addresses separated by a comma by just
  using the first one, will now strip leading spaces off names, replaces
  all tabs with spaces (for "uvack" spacing)
* "uvack" handles abstaining votes and rejected votes correctly
* "uvcount" includes rejected vote counts and a abstaining votes if a
  single group vote.
* "uvcount" no longer shorts the right margin by two spaces for multivotes.

V1.6 - Minor upgrades after 1.5's major changes.
* VOTEACKCLEAN from 1.5 is gone - MAILCMD processing is more powerful than
  I had realized, and this can be done here.  See "usevote.h"
* "uvvote" now allows you to specify text for the beginning and end of the
  "domail" shell file - for example,  "#!/bin/sh"
* "usevote.h" now includes a "sleep 20" by default for mailouts.
* "uvvote" now warns if the user address doesn't include a "@" - this happens
  in a few cases where jim@unomaha.edu sends out messages with a
  "From:" address of just "jim".
* "uvvote" now doesn't check anywhere in the detected group name for a valid
  voting keyword - so just because you have a group name like
  rec.oh.no.spaghettio, it won't be counted as a NO vote.
* "uvvote" makes sure there is non-character and non-'.' characters after the
   group name to count it as valid.
* Added warning in README about using group name and keyword on line
  in CFV after the ballot in case some idiot returns the whole thing.

V1.5 - Some new files, a new major program for multiple votes
* A new companion program, uvsplit, has been released which will allow
  you to handle multiple votes easier.  This is not included in this
  archive, it's in its own archive.
* We now have a real "makefile", which replaces "compile."
* New files "blurb" and "sampvote" for your information.
* Version info moved into new "WHATSNEW"
* If the voter has a "Reply-To:" line in his header, UseVote is now polite
  enough to honor that.  This will allow more vote acks to get through.
* New option to allow "domail" to clean up after itself by deleting all the
  ack.xxx files.  #define VOTEACKCLEAN.
* acktext.txt has been rewritten so it isn't such a pain in the rear to
  modify for each vote.  Important with multiple votes.
* uvack now adds a header row of dashes on voteless acks - looks better

V1.4 - Two enhancements, one fairly important.
* All abstentions is no longer a bogus vote as long as one of the abstentions
  is explicit - if the voter says "I abstain from the vote on foo.bar.misc"
  this is treated as a legal vote.  There is a legitimate use, where someone
  who previously voted can change their vote to abstain for whatever reason.
  Not voting on anything is still a bogus vote.  Abstentions do NOT COUNT
  when determining group passage.
* There were some complaints about the beautiful ack list formatting.  A new
  option -n give an alternate. more traditional, formatting of the names.

V1.3 - Some maintenance, some upgrades
* Some mail formats don't follow the "From " at the start of a message
  UNIX-style standard.  I've added settable constants in usevote.h for
  message start and end markers.
* A bug could cause a message with a "From " but no "From:" to be
  totally ignored - instead of generating an error.
* The new name-in-message feature was "weak" (as reported by a user), and
  indeed it was, due to a design flaw.  Hopefully, this should handle it
  more robustly.

V1.2b - arguments checking
* Similarly, some compilers didn't like what I was doing with uvdup
  in checking for a command line switch.  Except in this case I was
  actually doing something that I shouldn't have.

V1.2a - enum elimination
* Okay, some compilers just _don't_ like "enum"s in any standard format.
  I ripped them out and replaced them with #define's.

V 1.2 - Some maintenance, some upgrades
* The biggest change is the ability to have the voter give their real
  name if their news site/software doesn't allow them to do it.  Also
  an associated ability to reject any ballots that don't have a name.
* "uvdup.c" now allows specification of a file which will hold a record
  of all deleted duplicate votes.  It also allows an automatic mode for
  those rare times it is wanted.
* Some demented users were putting parentheses in their names - the
  double parentheses thing confused "uvvote.c", resulting in bogus names
  and addresses.  Now we count nesting of parens.
* We need to use backslashes for some characters in some addresses for
  "domail".  A new constant in usevote.h lets you specify which
  characters need to be backslashed.  As part of this, MAILCMD now
  defaults to _not_ using quotes around the address.
* "uvvote.c" now grabs the ballot identifier as it goes by and uses
  it when doing mail acks, so it'll print [FB-0002] instead of [FB-000#]
  if it found the VOTEMARK of [FB-0002].
* Double quotes are stripped from around names for better display.
* Beautfied "Sorting" display.
* Another change to a typedef because of more compiler complaining.
* The soc.culture.macedonia vote of 5900 votes exceeded my vote max
  of 3000 - so much for "good for a couple of years."  Just a change
  in the comment.


V 1.1a - Maintenance upgrade
* Changed a typedef to prevent some compilers from whining about
  typedef abuse.  The software still worked, but this should get rid
  of the warnings.
* Fixed a genuine bug - in a single item vote, asking for a mass ack
  without votes would result in the ack list being spit out twice.


V 1.1 - Lots of changes to uvvote.c and acktext.txt
* Result files are still compatible with V1.0 - ballots may not be
  if you use some of the new options.
* Expanded use of acktext.txt for many other new possible problems
  that can be detected with the votes, such as all abstentions.
  This makes things much more automatic.
* Introduces the use of a vote rules file, to deal with special
  conditions that sometimes come up in multiple group votes, such as
  that you can only vote on group x if you voted yes for group y.
* Include a copy of the ballot marker text on mailback acks, so they
  can be corrected, sent back, and the voting software will still
  handle it.
* The new options should make things much nicer for single-item votes.
* I rewrote the uvack.c to make vote ack lists look niftier.
* Removed that "UseVote 0.2 -- The computer is your friend" message.
* Removed all references to me and comp.sys.ibm.pc.games in the supplied
  files, so I don't get strange mail if people forget to change them.
* The software itself has been rewritten to be a bit more modular.  Not
  too much your concern, but this list is for my benefit too.


V 1.0 - Major changes, first real release
* Renamed modules to be consistent with uvvote.
* Yes/No/Abstain/For/Against recognition totally changed.  It now looks
  for a standalone word on the line surrounded by non-alpha characters,
  so that a "no" imbedded in a group name like "comp.sys.gnome" won't
  cause a false no.  There was a kludge that took care of that, but it
  was just a kludge.
* All the common vote information has been consolidated in one file
  (usevote.h).
* Added duplicate detection software.
* Added support for single group votes to vote ack software.
* Added sorting in vote ack software.
* Greatly improved message detection and error handling in uvvote.


V 0.1 Preliminary
* The original code, written in one day, worked great for the
  comp.sys.ibm.pc.games reorganization.  Rather specific and kludgy,
  though.


Thanks to all who tested and made suggestions - Ed Bailey, David
Cornejo, Jim Huggins, Jan Isley, Ian Kluft!, David Lawrence, Jay
Maynard, Brenda Roder, Andrew Solovay!, Brian Tao, David Wright,
and more.  If I've forgotten you, mail me.
