2.3.17+10

        A new hook, /on EXIT will be hooked as the client is exiting.
        This hook is not recoverable (the client can not be stopped 
        from exiting when /on exit is hooked), but you can do some 
        housekeeping before the client quits with this.

        You can use the environment variable IRCFINGER to set
        the text you want for your finger reply.  It must be
        a literal text string.

        The /DUMP command can now have 4 optional arguments
                "ALIAS" dumps all aliases
                "VARIABLES" dumps all variables
                "ON" dumps all ons
                "ALL" dumps everything
                If no args are given, all is used as the default.

        New function $chr(int int int int)
        Returns the string corresponding to the ascii numbers given
            $chr(65 66 67 68) returns the string "ABCD"

        New Function: $ascii(string)
        Returns the ascii numbers corresponding to the chars given
            $ascii(ABCD) returns "65 66 67 68"

        Thanks to tychy for the following idea.
        When you get an incoming dcc handshake, the userhost of
          the person who sent you the request is displayed, as well
          as the machine that is in the handshake, and the port number
          in the handshake.
        If the port number is less then 1024, it is rejected.
        If the userhost does not agree with the ip number, beware!

        Fixed one of the two known outstanding memory leaks.
        (Note this means that i know there is a memory leak,
        not that i know where it is).  It had to do with
        the updating of the status bar.

        Added two functions: $before() and $after()
        Syntax: $before(chars text text text)
        Usage: Returns the text (before|after) the first instance 
                of any character in "chars"

        I guess that lame bug where the client beeped on the
        first few keypresses is gone, cause i havent seen it
        for a while...

        $E now returns your idle time.

        Added C-like comments /* */.
        Limitations:
                While comments may span more then one line, code
                may not be broken up over one line.  For example:
                        echo test /*  this is a comment
                           this is more comment */booya
                will echo "test" and execute the alias booya.

        Fixed the serial numbered hook bug.  The one where any serial
        numbered hooks higher then the first serial number hook set
        that did not have a match were not hooked.

        Added the ~ operator (Bitwise negative)

	Added the comma operator.  What it does is evaluate the 
	expression to the left of the comma, and throws away the 
	result, then evaluates the right side and returns it.

	If you are kicked from a channel, and there is a channel
	key, auto-rejoin will use that key.

2.3.16+9

        Reworked the mathematical parser (next_unit) as follows:
                * Added the &, |, and ^ operators
                * Made && and || short circuit
                * Added the tertiary operator
                        This means you DONT have to use $tert() 
                        any more!  *hurrah*
                * The order of hirearchy is the same as C++,
                        the main change being that assignment
                        has LESS priority then conjunctions.

        Are you sick of when your status line repeats the last
        character off to the end of the line?  Then you can just
        /set status_no_repeat ON.

        If you think have ircII parsed like C is silly, then you can 
        just leave #undef C_LIKE_PARSING  in config.h.  If it is
        undeffed, the set variable C_LIKE_PARSING is ignored.

        Changed main() so that irc_io() is called infinitely, and 
        the client will not exit until an explicit call to irc_exit()
        is made.  (If you dont understand, it means the client wont
         "accidentally" quit on you.)  Isnt this the way it should be?

        Added the /ABORT command.  It does a "save" into the current 
        directory and then coredumps.  If ALLOC_DEBUG is defined,
        it does a memory dump, as well.  Useful for confused bots.
        NOTE: IT WILL *_NOT_* corrupt your .ircrc!

        Fixed gobs and gobs and gobs of memory leaks..... Good gosh.

        New function $numonchannel().  Returns the number of people
        on the channel specified.  The channel may not be ommitted,
        and you must be on the channel in question. Returns 0 on error.

        $common() and $diff() are now case insensitive.

        Replaced the -b flag, which was removed from 2.3.16

        Replaced Auto-reconnect in a new form, which was removed
        from 2.3.16.  Autoreconnect is done automatically on
        server kills.

        fixed the bug in /help from 2.3.16.  The one that caused
        the /help command to core dump.

        fixed the $ischanop() bug from 2.2.9.  The one where if 
        someone changed nickname, the client thought they were no
        longer opped

2.3.16+8

        Rewrote most of the word functions to reduce the amount of
        stray whitespace that they had

        Fixed the memory leak with /fe.  Hopefully thats the last one.

        Changed the /userhost command.  You may now use any number of
        nicks per command, delimiting the list with "-cmd", and each
        nick will be passed through the commands given.

        The client does not automatically turn on the screen when it
        is done loading a script, but rather honors the value of
        /set DISPLAY.  Dont ask me why it was changed in the first
        place.

        A mode stripper has been added:  The mode stripper does not
        replace /on mode, but rather complements it.  You can turn on
        the mode stripper with:
                /set MODE_STRIPPER on
        and then you can catch stripped modes with 
                /on MODE_STRIPPED "...."
        NOTE: /on mode STILL works even with the mode stripper on.

        More flexibility with the /if command.  Now you may have this 
        format, using only the delimiters you want.  (common sense 
        should tell you that you can use either/or/both but you must 
        have one.
                /IF (...) THEN {.....} ELSE {.....}
        Where you can use THEN instead of the ()s, or using
        THEN/ELSE and not have to use any puntuation.  Its up to
        how you like to program.

        The load parser has been partially rewritten fixing a bug 
        when a semicolon was the last char on a line.
        
        Added a second load parser that can be activated by 
                /set C_LIKE_PARSING on;   <- note semicolon!
        This should be the FIRST line in a "C-like" script.
        Ill talk more about this later.

2.2.9+7

        The behavior of the Command Parser has been changed, and you
        may now use {} blocks just about anywhere you want to,
        including the /userhost and /timer command, without having
        to use the /do command.  Try playing around with it, and
        youll see what i mean.

        The "WAIT has been called recursively" bug has been fixed.

        New Functions:
                $center(length string)
                        Returns "STRING" centered in a field
                        of length LENGTH.
                $split(delim string)
                        Actually, it just changes any occurances
                        of any character in DELIM to a space.
                        Useful with the $word() function.

        The % operator (modulus, aka remainder) has been added

        Thanks to help from Oldpink, CyberMage, and Macro, irc
        will now compile nicer, and will not upset brain dead
        compilers.

        Full support for postfix and prefix (in|de)crement
            operators has been added.  They now work correctly
            and as you would expect.
        Remember:  $blah++  is not legal, it must be used as
                   ${blah++}.  Also legal is @ blah++.

        New Operators
                Two new loop control operators have been added:
                CONTINUE (expr) - Restarts the loop from the top,
                        regardless of its present condition if
                        (expr) resolves to a TRUE expression
                BREAK (expr) - Stop execution of the current loop
                        and resumes at the first command after the
                        loop if (expr) resolves to TRUE.

            You should never never never use either of these two
                commands outside of a loop interactively.  The results
                will be unpredictable, and most likely not what you want.

        New Functions/commands:
        $SHIFT(var) removes word 0 from $var and returns it
        $UNSHIFT(var word) puts "words" at the beginning of $var
        $POP(var) removes the last word from $var and returns it
        $PUSH(var word) puts "words" at the end of $var, returns $var.

        These functions may also be used as commands, for their
                side effects.

        New Function:
        $SAR([r][g]/search/replace/text) - search and replace
             If 'r' is the first character,  "text" is assumed
                to be the name of a variable, and the text sub-
                titution is done on that variable and the result
                is put back into the variable, and is returned.
             If 'g' is the first character, all matches of 
                "search" will be replaced with "replace".  Normally
                only the first match is replaced.

             In any case, the first character that is not 'r' or
                'g' is assumed to be the delimiter.  You may use any 
                delimiter you want, but you should take care that
                you dont use it in the first two fields (obviously).
                The delimiter may safely appear in the last field.

2.2.9+6
        New Command: FEC
        Syntax:  /fec (string) var {commands}
        FEC iterates over STRING one character at a time putting
        each character into $var.  If you specify more then one
        variable, the first one is used, the rest are ignored.
        For each character in the string, the commands are 
        executed.
                /fec (booya) x {echo $x}
        would output "booya" one character on a line.

        New Command: DO           *** OBSOLETE ***
        Syntax:  /do {commands}
        Useful for those places where you can only have one
        command, and backslashing semicolons doesnt appeal to
        you, like in /timer. 
        *** NOTE:  Obsoleted by the changes to the command parser, 
        and this command now simply is an alias for /eval.

        FOR, FOREACH, and FE are now all aliases of each other.
        If the arguments do not start with a '(', it is assumed
        to be the "FOREACH" command.  If there is a () pair, and 
        there are exactly two commas between them, it is assumed
        to be a FOR command, else it is assumed to be a FE command.

        New functions:
        $reverse(text) 
		reverses all the text character by character
        $revw(word ... word) 
		reverses the text word by word
        $jot(min max interval) 
		returns a list of numbers from "min" to "max" every
		"interval" integers, (interval is one if ommited)
		EXAMPLE:
			$jot(1 10) returns the string
				"1 2 3 4 5 6 7 8 9 10"
			$jot(2 10 2) returns the string
				"2 4 6 8 10"

2.2.9+5 (includes 2.2.9+4.1)

        New command: FOR (CMDS1, EXPR, CMDS2) {CMDS3}
        Looks and feels just like the C command (sorta)
                Upon commension, cmds1 is executed once
                Expr is then evaluated, and if expr is TRUE,
                        Cmds3 and then cmds2 are executed, 
                        Repeat loop.
                Stop command
        The comma was chosen as a delimeter on purpose, so you can
        have multiple commands in a set.
        Example:
        alias repeat for (@x=0, x<$0, @x++) {$1-}
        alias foo for (@x=0; @y=0, x+y<5 , @x=x+2;@y--) {echo $x $y}
    
        You can now use the ++ and -- operators to increment and
        decrement a variable inside an expression.  Currently, 
        only postfix is supported, and it is evaluated with the
        highest priority (sorry.. this may change soon)

        New command: DUMP
                Deletes all of your aliases, assigns, and ons,
                in case you really FUBAR things.  You can then
                /load global and your .ircrc to effectively reboot.

        New functions:
                RPATTERN (word patttern pattern...)
                  Returns all patterns that match "word"
                RFILTER  (word pattern pattern...)
                  Returns all patterns that do not match "word"
                COPATTERN (pattern variable1 variable2)
                  For each value in variable1 that matches the pattern,
                  the corresponding value from variable2 is returned.

        ENFORCE_STRICTER_PROTOCOL now forbids kicks from /on who.
        Using /on who to kick is lame anyhow....

        If you give the function $key() no arguments, or the argument
        '*', the current channel will be assumed.

2.2.9+4
        New command:  /QUEUE <flags> NAME <number> <{commands}>
        Flags:  -DO        run the commands in the named queue.  Deletes
                             the queue by default.
                -NO_FLUSH  when you run the commands, do not delete
                             the queue.
                -SHOW      show the contents of all of the queues
                -LIST      show the contents of the named queue.
                -DELETE    remove the numbered entry in the named queue
                -FLUSH     remove the named queue
        o The "QUEUE" command allows you to store a list of commands
          into named queues.  You may have as many entries into an
          individual queue as you like, and you may have as many
          named queues as you like.  
        o Error checking is not very tight right now, so if you try to
          crash the command by doing weird stuff, you probably will.
        o If you give a list of commands, they must be surrounded by
          braces, and they will be added to the named queue.
        o At this point, it is not recommended that you use more
          then one flag per command, as i have not tested this yet.
        Store commands:  /queue BOOYA {echo one}
                         /queue WAHOO {mode * +o nick}
        Exec. commands:  /queue -do BOOYA
                         /queue -do -no_flush WAHOO

        *** $TERT() IS OBSOLETE ***
        You may now quote colons and question marks in the
        $tert() function and they will be skipped and unquoted.
                        $tert( 1 ? \: : \? )
        would return " : "

        FE has been fixed.  Sorry about this bug...

        If you provide no arguments or the argument "*" to the
        functions $onchannel(), $chops(), and $nochops(), the 
        current channel will be assumed.

        New function: $key(#channel)
        Returns the channel key for #channel, (provided
        you are on the channel that you ask about)

2.2.9+3
        $X now returns your userhost
        $Y now returns your ircname

        The 'fe' script now uses $onchannel() and $tert()

        A Tertiary operator has been added - $tert()  *** OBSOLETE ***
        USAGE:
                $tert(value1 ? value2 : value3)
        if 'value1' exists and is an integer equal to zero, and
        has no text following it, or value1 is only blank spaces
        or value1 is a null, it is considered to be FALSE,
        otherwise, value1 is considered to be TRUE.
        -->     "0" is false, "0T" is true, "0 0" is true
                "   " is false, "" is false, "1" is true
                any text is true.
        *** OBSOLETE becuase the tertiary operator has been added
            to the expression parser.

        Added the builtin function $onchannel() which returns
        everyone on the channel given, but is only reliable if
        you are ON that channel.  Returns a null if you are not.

        Added the builtin functions $chops() and $nochops()
        They return the channel operators and non-channel
        operators on the specified channels.

        Karll's "Array Suite" has been incorperated.  The source
        file is array.c and the instructions are in ARRAY

        META5-9 have been added.  You now have 9 META keys to 
        work with.  Meta4 is still sticky.
    
        'fe' script has been fixed -- the current channel is 
        assumed if no argument is given

        New command "REALNAME" (or "IRCNAME") allows you to change
        your REALNAME (the text on the right in the first line of
        a whois reply), which will take effect after you use the
        command "RECONNECT"

        Fixed the lame bug i put in dcc.c.  DCC GET no longer 
        coredumps.


2.2.9+2
        Fixed the bug I introduced with NO_DCC_TALK.

	Several new built-in functions have been added:
		$leftw(x list)  returns the x left words in list
		$rightw(x list) returns the x right words in list
		$restw(x list) returns the Xth word and after
		$midw(start stop list) returns the words start to 
			stop in list
		$notw(x list) return list without the Xth word
		$insertw(x word list) returns list with word added as
			the Xth word
		$remw(word list) returns the list without "word"
		$pattern(pattern list) returns all words in list that
			rmatch pattern
		$filter(pattern list) returns all words in list that
			do not rmatch pattern
		$chngw(x new list) returns list with the Xth word
			changed to new.
		$tow(word list) returns the list up to/including word
		$fromw(word list) returns the list after/including word
		$beforew(word list) returns the list before word
		$afterw(word list) returns the list after word
		$common(list1 / list2) returns all words present in
			both list1 and list2
		$diff(list1 / list2) returns all words not in both list1
			and list2

	/on encrypted_privmsg and /on encrypted_notice added:
		they have the same parameters as /on msg and /on notice
		expect that they only are hooked when the msg is encrypted.
		NOTE: If you hook these with ^, normal /on msgs will not
		be hooked. (you can override defaults)
		
	LOAD no longer braindead about ZSUFFIX, so you can use
	GNU Zip with your scripts.  #define ZSUFFIX is in config.h
	for you to modify it.

	The rest of the patches have been installed. 
		(including the UTC patch)
	
	/on disconnect now hooks whenever you are not connected to a
	server, as stated in the help files.
	

2.2.9+
        HELP no longer braindead about ZSUFFIX, so you can use
        GNU Zip with the suffix ".gz".  #define ZSUFFIX has been 
        moved to config.h to allow it to be more intelligently
        chosen.

        Most of the patches that have been released since 2.2.9 was
        released have been included

        You can choose to not have DCC TALK by #defining NO_DCC_TALK
        in config.h.

        Four new ONs added: NOTE: /on dcc_raw ALWAYS has higher
           priority over any of these ons.

        /on DCC_REQUEST tells you when you have recieved a DCC request
                $0  is the person sending the request
                $1  is the type of DCC request (chat, send)
                $2  is the description (filename for dcc send)
                $3  is the size of the file (for dcc send)

        /on DCC_LOST tells you when a DCC connection terminates
                $0  is the user connected to
                $1  is the type of connection lost
                $2- any additional information as applicable
   
        /on DCC_CONNECT tells you when a DCC connection becomes active
                $0  is the user connected to
                $1  is the type of connection being made
                $2- any addition information as applicable

        /on DCC_ERROR tells you when something awry in DCC
                $0  is the command the error occured in
                $1-$3 The parameters (nick, connection number, speed)
                $4- The message.

        A new SET has been added, "AUTO_REJOIN".  When set to ON, 
        you will automatically rejoin the channel if you are kicked.

        A new command /FE has been added.
            FE (list of words) control vars { commands to execute }
        FE allows you to go through a given list of words using an 
        arbitrary number of them at a time, and execute a set of 
        commands once for each pass.  examples:
            /alias opalot fe ($2-) x y z {mode $0 $1ooo $x $y $z}
            /alias kickalot fe ($1-) xx {kick $0 $xx}
        The first would op/deop a list of people 3 at a time
        The second kicks a list of people

        An arbitrary limit of 255 control variables was used.

        A lot of scripts added.  Look through them, you might find
        some of them useful.

        CTCP FINGER returns a null.
