Introduction:

  Reminder is a simple program that will help you keep track of dates. It
  reads a file, by default .reminder, full of event names and dates. It then
  warns you of upcoming or recently past events. By default it reminds about
  events that happened in the past week or will happen in the next three
  weeks.

  This program was inspired by a "birthday" program that Andy Mortimer wrote.
  I wanted a work-alike that did things like understand more date formats,
  could do things like "the last monday in may", and knew how to calculate
  Easter.

Building / Installing:

  If you have GNU make and gcc (i.e. you're running on UNIX or under cygwin)
  you can build by typing 'gmake'. Installation is up to you and involves
  copying the 'reminder' binary somewhere appropriate (/usr/local/bin?).

  I also included a MSVC project file that can be used to build a reminder.exe
  for windows. Again, installation is up to you.

  Once you have built/installed you will have to copy the sample .reminders
  file somewhere (your home directory? the place where you installed the
  binary? whatever) or create your own .reminders file from scratch. See File
  Format section below.

WRemind:

  If you build the source code at http://wannabe.guru.org/svn/remind
  then you'll get an image that runs in a console or xterm.

  I also took a simple Windows GUI and wrapped it around this thing;
  This is available at http://wannabe.guru.org/scott/hobbies/wremind.zip.  
  The commandline arguments and .reminder file format are the same as 
  described in this file.  The only difference is that it runs as a
  windows GUI mode program.

  Tip: you can copy the wremind.exe and .reminder files somewhere and
  then put a shortcut to them in your "Start Menu\Programs\Startup" 
  folder.  Then it will run and remind you everytime you login to the
  system.

File Format:

  Every line of the file that starts with a # symbol is a comment and will be
  ignored by the parser.

  Non-comment lines should be in one of the forms below:

         event-label = complex-date-exp
         program-directive = directive-value

  The former, event-label = complex-date-expression, is used to define events
  and their dates:

         event-label      :- any alpha-numeric string
         complex-date-exp :- simple-date |
                             simple-date offset-exp units |
                             offset units ('before'|'after') simple-date |
                             offset units 'in' month-string
         simple-date      :- nn/nn/nn | nn-nn-nn | nn.nn.nn |
                             nn/nn/nnnn | nn-nn-nnnn | nn.nn.nnnn |
                             nn/nn | nn-nn | nn.nn |
                             month-string nn[[,] nnnn] |
                             nn month-string[[,] nnnn] |
                             'easter'
         offset-exp       :- nn | cardinal-string | 'last'
         units            :- dow-string | cardinal-string | nn
         nn               :- [0-9]+['st'|'nd'|'rd'|'th']
         month-string     :- <the name of abbreviation of a month>
         dow-string       :- <the name of abbreviation of a dayname>
         cardinal-string  :- <spelled out number, like 'first'>

  Note: the meaning of nn/nn/nn (and the like) are determined by the DateOrder
  setting of the program, see program-directive. Here are some examples of
  complex-date-exps:

         june 13th, 1963
         6/13/63
         13/6/63
         1963/6/13
         13 june 1963
         13 june
         june 13
         june 13th
         last Monday in May
         fourth Thurs in Nov
         4th Thursday in Nov
         easter
         easter -7 days
         easter -42 mondays
         june 13 -2 weeks
         6/13 +9 wednesdays
         9 wednesdays after 6/13
         1 week before 12/25

  You get the idea, hopefully. The format is pretty flexible and the program
  will warn you about dates it doesn't understand. Beware of DateOrder (see
  below), though.

  Some aspects of program behavior can be controlled by program-directive
  lines:

         program-directive :- 'DateOrder' | 'Type'
         date-order-values :- 'American' | 'British' | 'ISO8690'
         type-values       :- 'Birthday' | 'Anniversary' | 'Event'

  Some examples:

         DateOrder = American
         DateOrder = ISO8690
         Type = Birthday
         Type = Event

  DateOrder changes the meaning of all nn.nn.nn format dates encountered until
  the next DateOrder directive:

    * American means mm/dd/yy[yy]
    * British means dd/mm/yy[yy]
    * ISO8690 means yy[yy]/mm/dd

  Type changes the event type of every event read until the next Type
  directive. If you don't ever set Type everything will be treated as an
  Event. Types of events simply influence the way they are announced. For
  example, setting Type will change:

         The 26th anniversary of Joe Blow   (event)
         Joe Blow's 26th birthday           (birthday)
         Joe Blow's 26th anniversary        (anniversary)

Commandline:

         -b window-beginning-number-in-days
         -e window-ending-number-in-days
         -f alternate-filename-to-read

  For example, to change the default behavior of "warn about everything from a
  week ago to three weeks in the future" you can do something like:

         reminder -b -14 -e +42

  i.e. "Remind me of everything in the past 2 weeks up to the next 6 weeks"

  To change the .reminders file to something else use:

         reminder -f /usr/local/bin/.reminders

Misc:

  Send bugs to scott@wannabe.guru.org. Share and enjoy. As far as I know this
  code is all based on public domain sources and is distributed as public
  domain code. Do whatever you want with it. Of course, it's provided with no
  warranty whatsoever -- use it at your own risk.
