EPIC IRC

Site Content
Main Page

Installing EPIC

Getting EPIC
Installing EPIC
Updating EPIC


Using EPIC (You need a script)

EPIC Script Archive
Intro to Scripting
EPIC Mailing List archive (offsite)


About EPIC

What is EPIC?
Who is behind EPIC?
Copyright Info
Noteworthy changes in EPIC
Ask hop
Ideas past and present
EPIC Related Projects


About EPIC5

EPIC5 documentation (wiki)
Browse EPIC5 CVS


About EPIC4

EPIC4 docs in html
Browse EPIC4 CVS
EPIC docs in /HELP Format
Introduction to EPIC4
Detailed EPIC4 Changelog

Project History
[ This file contains all of the UPDATES for all the work I've ever done ]

EPIC4-2.2

*** News -- 11/09/2004 -- Changes to way spaces are handled *** IMPORTANT ***
	Up until this point, the technical definition of what is a "space"
	(the term used for an Internal Field Separator (IFS), that is, the 
	thing that separates one word from another word)

	EPIC has always had three sets of IFSs
	1) Character 32 only ("space")
	2) Characters 9, 10, 11, 12, 13, and 32 ("my_isspace()")
	3) Whatever your locale says is a space ("isspace")

	In the C locale (the default for unix users), sets #2 and #3 are
	exactly the same.  I don't know about other locales.

	Now we are going to only use set #3.  Changing Set #2 to Set #3 is
	easy, and nobody should notice any difference there.  The one that
	is going to cause pain is Set #1.  Consider this situation:

		One<tab>Two

	Is this one word, or two words?  In some places in epic, it is one
	word, and in other places it is two words.  As a result of this
	change, it will now always be two words every place.

	Here is a list of the places that were using Set #1 that will change
	to use Set #3, and you should be on the lookout for changes!

	*) /AWAY separated the end of its flags with spaces.
	   This means 
		/AWAY -ALL<tab>Hi there!
	   will now work properly.
	*) $pop(....) removes the last word from the argument list.
	   Whereas $pop(one two<tab>three) used to return "two<tab>three"
	   is will now only return "three"
	*) Commands are separated from the argument list by a "space".
	   Whereas 
		/one<tab>two blah blah blah
	   parsed "one<tab>two" as the command, now "one" is the command
	   and "two" is part of the argument list.
	*) In expressions, a variable name may be separated from an
	   operator with a space.  Whereas things like
		@var<tab> =foo
	   might have failed because <tab> is not a valid character in 
	   a variable name, it will now treat <tab> the same as a space.
	*) Places that expect a number did not accept a string that contained
	   a <tab> so that things like
		<tab><tab>9
	   was not accepted as a number.  Now it will be.
	*) The /IGNORE command used to consider a string containing a <tab>
	   to not be empty.  This means that
		/IGNORE <tab>
	   would not list the ignorance list, but rather would try to show
	   the ban value for an ignore matching <tab> which isn't reasonable.
	*) The % wildcard pattern stopped matching only when it saw char 32.
	   Now it will stop whenever it seems a Set 3 type space.  
	   So whereas before "%" matched "one<tab>two" now it won't,
	   because "one<tab>two" is two words, not one word.
	*) In /xdebug extractw mode, tabs before or after double quotes were 
	   not considered to start or end a double quoted word.  So previously 
	   this string:
		one <tab>"two three" four
	   contained four words, because the <tab> before "two nullified
	   the double quoting.  Now that <tab> is treated like any other
	   space, the above word has three words, not four.

	Places that use Set 1 and will NOT be changing to Set 3, because 
	they are parsing IRC protocol data, which stipulates that the IFS
	MUST be a space solely:

	*) CTCP requests and replies are formatted only with spaces
	*) Words in protocol messages are separated only with spaces

*** News -- 11/09/2004 -- You may now mangle ALT_CHAR characters
	And ALT_CHAR mangling is included in ALL.  This was an oversight
	that was fixed in epic5.

*** News -- 11/02/2004 -- Mangling "ALL,-BOLD" no longer mangles "ALL_OFF"
	In general, if you use ANSI (ALL includes ANSI), the mangled string
	has its six attributes (COLOR, REVERSE, UNDERLINE, BOLD, BLINK, 
	ALT_CHAR) rewritten into canonical form.  This will add some ALL_OFFs
	to your string that weren't there originally.  So if you strip all of
	the attributes (as ALL does), then epic will strip ALL_OFF off as well.
	This retains backwards compatability with ALL.

	But if you use ANSI and don't want to strip all 6 of the attributes, 
	then it's important that ALL_OFFs are not removed, otherwise your 
	string will not appear as it should (the ANSInator uses ALL_OFFs to
	turn off attributes).  So EPIC automatically will not strip ALL_OFFs
	if you use ANSI and do not mangle one of the 6 attributes.

	Examples:
	  $stripcrap(ALL this is ^B^_bold underline^_ not bold)
	will strip everything as it has always done.

	  $stripcrap(ALL,-BOLD this is ^B^_bold underline^_^B not bold)
	will strip everything but not bold and all_offs, because if all_offs
	are stripped, then "not bold" will be in bold!

	The entire point of this is to allow /set mangle_logfile ALL to 
	work the way it has always worked, and $stripcrap(ALL,-BOLD ...)
	to work the way it *should* work.

*** News -- 10/06/2004 -- Support for +e and +I numerics from efnet
	EFNet has +e and +I channel modes, which act like +b does.
	These numerics are now handled by epic like +b is.

*** News -- 10/06/2004 -- New status bar expandos, %{2}W and %{3}W
	These two new expandos expand to the same value as %W.  

	%W    	Expands on each input window on each screen that has
		two or more visible windows.

	%{2}W	Expands on all visible windows on all screens.

	%{3}W	Expands on each input window on each screen, even on
		screens that have only one visible window.

*** News -- 10/06/2004 -- Support for ircnet's "numeric nick" feature
	On ircnet, each user is given a unique numeric identifier, which
	is their one true nickname.  In addition to this numeric id, they
	can have a rfc1459 nickname, but they are not required to have one.
	Further, the special numeric id 0 is reserved and refers to the
	user's own numeric id.  EPIC now fully supports all of this, 
	particularly in the following ways:

	/NICK <unique id>
	/NICK 0
		To turn off your rfc1459 nickname.

	$serverctl(GET <refnum> UNIQUE_ID)
	$serverctl(SET <refnum> UNIQUE_ID)
		To retrieve and change your unique nickname.  
		Changing your unique id is probably a bad idea.

	/USERHOST <unique id>
		You may USERHOST unique id's now.

	'epic 0'
		You may now use the nickname 0 on the epic command
		line if you don't want to use an rfc1459 nickname
		on an ircnet server.

	Using unique numeric id's on non-ircnet servers is probably 
	fraught with peril.  Try to avoid that.

*** News -- 10/06/2004 -- /SET INDENT maxes out at 1/3 screen width
	Previously, if you did /set indent on, and the width of the 
	first word on the first line was > 1/3 of the screen's width,
	then the second (and subsequent) lines were not indented at all.
	This was the historical ircII behavior.  It seems more sensible
	to cap the indent level at 1/3 of the screen's width and indent
	it to there.

EPIC4-2.0

*** News -- 02/03/2004 -- ERASE_LINE behavior slightly modified
        The ERASE_LINE input function has been modified to not overwrite the
        input buffer when it is called on an empty input line.

EPIC4-1.2.9

*** News -- 01/25/2004 -- Slight changes to /ON SSL_SERVER_CERT
        |Rain| pointed out that /ON SSL_SERVER_CERT was not terribly useful
        because $1 (cert subject) and $2 (cert issuer) could contain spaces,
        and so you couldn't really use $1 and $2 to fetch them.  He proposed
        that we hook a url-encoded version of the subject and issuer (so they
        won't contain any spaces) and you can use $urldecode($1) to get the
        subject and $urldecode($2) to get the issuer.

EPIC4-1.2.7

*** News -- 01/18/2004 -- New functions $cofilter() and $corfilter().
        These are compliments of $copattern().

*** News -- 12/27/2003 -- New $dccctl() modes.
        Added $dccctl(get [ref] writable) and $dccctl(writables).  This is
        useful for sending lots of data out on a raw or chat dcc.  Epic will
        (iirc) normally drop the data in such cases rather than blocking or
        buffering.  This isn't a complete solution.  Writable means that a
        certain amount of data can be written, so data can still be lost.  

*** News -- 12/27/2003 -- Added /SET DCC_DEQUOTE_FILENAMES
        This turns the double quoted space decoding feature added recently for
        received DCC SEND requests on and off.

*** News -- 12/27/2003 -- $rest() also removes chars from the right.
        Using a negative first arg causes $rest() to strip chars from the right
        hand side of the string.  This makes it a compliment to $right() as
        well as $left(), but if a script relies on it returning the original
        string the way it did before, it may now cause compatibility problems.
        If it does, talk to CrazyEddy on #epic efnet.

*** News -- 12/27/2003 -- Added $splicec() in functions script.
        This works much the same way as $splice(), but on characters, not
        words.  It won't work seemlessly on local vars though.

EPIC4-1.2.5

*** News -- 12/13/2003 -- Default of AUTO_REJOIN is now OFF
        Per the poll taken on the epic mailing list, the preponderance of
        opinion being in favor of changing the default value of AUTO_REJOIN
        to OFF, as of commit 672, the default value is changed.  You will
        want to put /SET AUTO_REJOIN ON in your ~/.epicrc to get the old
        value.

*** News -- 12/11/2003 -- Command parser ignores spaces after semicolons
        Since the dawn of the modern ircII syntax, the following syntax
        has caused consternation with scripters:
                /eval {two; three}
        because it runs the /two alias, and then outputs the text "three"
        to the current target (channel-or-query).  This is because the
        command parser does not ignore spaces after semicolons; a leading
        space results in ircII assuming you are wanting to run the empty
        command (yes, there is actually an empty command), which just 
        happens to be the /say command.  Well, enough is enough.  I'm 
        putting a stop to this.  If you depend on this horrifically broken
        behavior, then the time has come to switch to using /SAY.  The
        rest of us will enjoy not having to freak out about spaces after
        semicolons.

*** News -- 12/11/2003 -- New /WINDOW verb, /WINDOW SCROLLADJ [ON|OFF]
        When the default value of ON is used, when you "GROW" a window,
        or otherwise cause the size of a window to be increased, the top
        of the scrollable view is moved back so you can see more of the
        lines that have recently scrolled off the screen.  If you change
        this to OFF, the behavior is more like ircII, where when something
        scrolls off the window, nothing will bring it back unless you go
        into scrollback mode.

*** News -- 12/11/2003 -- New /ON, /ON WINDOW_BEFOREKILL 
        The value of $* is the window refnum (number) of the window that
        is about to be killed.  You cannot stop the kill from happening,
        but you do get this opportunity to save any information about the
        window that you might want.  *DANGER*DANGER*DANGER*  EPIC does not
        try to stop you from doing something really dumb in this /ON, and
        if you try to change the window being killed, or you affect the
        visibility or invisibility of any window, you run the definite chance
        of confusing EPIC and causing a panic.  This is not a bug, this is 
        just your peril if you ignore this warning.  Use /DEFER to run 
        commands safely from within /ONs.

EPIC4-1.2.3

*** News -- 12/05/2003 -- New built in function $numlines() (fudd)
        The first argument to $numlines() is the width of a line (which you
        can get from $geom() if you want to use that), and the rest of the
        text is some text.  The return value is the number of screen lines
        that will be taken up if you were to /echo the text to a window of
        the given number of columns.

*** News -- 12/03/2003 -- New command line arguments, -o and -O
        POSIX termios allowed systems to define "extended characters" (IEXTEN)
        which are interpreted by the kernel and are not passed onto the
        application.  In 4.4BSD in particular, these "extended characters"
        are ^V and ^O.  This means that by default, you cannot use these
        two characters in a binding.  By using the -o option, you ask 
        EPIC to specifically turn these extended characters on, and by 
        using the -O option, you ask epic to specifically turn these 
        extended characters OFF.  If you do not specify either option,
        epic does not change the current default value.

EPIC4-1.2.2

*** News -- 12/03/2003 -- New /WINDOW verb, /WINDOW SWAPPABLE [ON|OFF]
        You may now control whether your windows are "swappable".  The
        default (backwards-compatable) value is ON.  If you set this to 
        OFF on a visible window, then that visible window cannot be made
        hidden, via /WINDOW HIDE or /WINDOW SWAP.  If you set this to OFF
        on a hidden window, then that hidden window cannot be made visible,
        via /WINDOW SHOW, /WINDOW SWAP, /WINDOW BACK or /WINDOW NEXT.  You
        must reset this value back to ON before you try to swap the window
        back in or out.

*** News -- 12/03/2003 -- New /SET, /SET STATUS_NOSWAP
        Whenever a window has /WINDOW SWAPPABLE OFF, the %{1}W status expando
        will expand to the value of this /SET

*** News -- 12/03/2003 -- SWAPPABLE accessable via $windowctl()
        You can now $windowctl(GET <refnum> SWAPPABLE) to get the window
        <refnum>'s current swappable status.

EPIC4-1.2.0

*** News -- 12/01/2003 -- Double quoted filenames via dcc from other clients
        is now supported.  Please note that I object to this, but I am not 
        oblivious to necessity.

*** News -- 12/01/2003 -- New $windowctl() value, "DOUBLE"
        You can now $windowctl(GET <refnum> DOUBLE) to get the value
        of the window's double status bar.  It's 0 if the double 
        status bar is off, and 1 if it is on.

*** News -- 11/30/2003 -- /XECHO -L now overrides "target window"
        I had a request from a couple of people who pointed out that
        in epic4-1.1.*, numeric replies were now being sent to the
        target's window (ie, a channel's window) if the numeric was
        for the target/channel.  They were perplexed that /XECHO -L CRAP
        couldn't override this.  This is because /XECHO -L does not
        reset the "target" and the "target" has higher priority than
        the lastlog level.  This means that it's impossible to send 
        output from an /ON for a channel to a window other than that
        channel's window using /XECHO -L.  It seems more sensible that
        /XECHO -L would override the channel's window, because if you
        weren't expecting it to do that, you wouldn't have used /XECHO -L
        in the first place, right?

*** News -- 11/30/2003 -- "Fixed" and "skipped" windows now special
        If a window is marked as both "fixed" (cannot change size) and
        "skipped" (cannot be made the input window indirectly), then it
        is now "frozen" -- it does not count towards the number of windows
        on a screen for the purposes of /WINDOW KILL and /WINDOW HIDE.
        To be more plain: you cannot kill or hide the last "non-frozen"
        window on a screen.

        It is probably not a good idea to "freeze" all of the windows on
        the screen.  Leave one of them "not frozen".  I didn't test this
        extensively, so if you try to break this, you probably will!

*** News -- 11/30/2003 -- New /ON , /ON WINDOW_COMMAND
        This /ON is hooked after each time a successful window command
        is executed.  The value of $0 is the refnum of the current window
        before the command was executed (ie, the window the command started
        with or operated upon), and $1 is the refnum of the current window
        after the command was executed.  If $0 and $1 are the same, then 
        the command executed upon that window.  If $0 and $1 are different
        then some command was run that changed the current window (ala,
        /WINDOW SWAP or HIDE or REFNUM)  This /ON is hooked even if the 
        command does not change any state of the window.  When a command
        fails, the value of $1 is the number -1.

        Example:
                /on ^window_command * {echo Window $* command!}
                /window 2 size 5 hide
        might output
                Window 2 2 command!
                Window 2 1 command!

                         *DANGER*DANGER*DANGER*  
        EPIC does not try to stop you from doing something really dumb in 
        this /ON, and if you try to change the window being killed, or you 
        affect the visibility or invisibility of any window, you run the 
        definite chance of confusing EPIC and causing a panic.  This is not 
        a bug, this is just your peril if you ignore this warning.  Use 
        /DEFER to run commands safely from within /ONs.
                         *DANGER*DANGER*DANGER*  

*** News -- 11/24/2003 -- New built in function, $windowctl()
        You can now fetch much of the low-level information about your
        windows using this function.  You cannot set them (yet), nor is
        this expected for the upcoming production release.  You can still
        always use the /window command to change things around.

        $windowctl(REFNUMS)
        - Return all window refnums currently in use.

        $windowctl(REFNUM [number|name])
        - Given a window refnum or a window name, return the window's
          refnum, suitable for use with $windowctl(GET ...)

        $windowctl(GET <refnum> [item])
        - Where [ITEM] is one of:

        REFNUM          The value of /WINDOW NUMBER
        NAME            The value of /WINDOW NAME
        SERVER          The server refnum this window is connected to.
        LAST_SERVER     When SERVER is -1 (disconnected), this is the refnum
                        of the last server this window was connected to.
        PRIORITY        Each time you change the current input window, this
                        value is incremented.  The window with the highest
                        priority value on a server is the server's 
                        "current window"
        VISIBLE         1 if the window is visible, 0 if it is hidden
        TOP             The line on the screen where the window starts, 
                        if it is visible
        BOTTOM          The line on the screen where the window ends, if
                        it is visible
        CURSOR          How many lines from the top of the window the cursor
                        should be put for the next line of output.
        NOSCROLLCURSOR  This is always -1.
        FIXED           The integer value of /WINDOW FIXED
        SCROLL          The integer value of /WINDOW SCROLL (always 1)
        CHANGE_LINE     The next line to be changed by changed by /xecho -l
        OLD_SIZE        The size of the window the last time that we checked;
                        usually the same as DISPLAY_SIZE
        UPDATE          Some non-zero value if the window needs to be updated,
                        either by redrawing it's body or its status bar
        MISCFLAGS       1 if /WINDOW NOTIFY is on, 3 if a /WINDOW NOTIFY 
                        window has had output since the last time it was 
                        visible (ie, included in %F)

        BEEP_ALWAYS     Integer value of /WINDOW BEEP_ALWAYS
        NOTIFY_LEVEL    The value of /WINDOW NOTIFY_LEVEL
        WINDOW_LEVEL    The value of /WINDOW LEVEL
        SKIP            Integer value of /WINDOW SKIP
        COLUMNS         How many vertical columns wide the window is
        PROMPT          The current input prompt for this window.
        STATUS_FORMAT   The value of /WINDOW STATUS_FORMAT
        STATUS_FORMAT1  The value of /WINDOW STATUS_FORMAT1
        STATUS_FORMAT2  The value of /WINDOW STATUS_FORMAT2
        STATUS_LINE     The actual status bar when /window double off
        STATUS_LINE1    The actual 1st status bar when /window double on
        STATUS_LINE2    The actual 2nd status bar when /window double on
        DISPLAY_BUFFER_SIZE
                        How many items are in the scrollback (display) buffer
        DISPLAY_BUFFER_MAX
                        The value of /WINDOW SCROLLBACK or /SET SCROLLBACK
        SCROLLING_DISTANCE
                        How far away the top of the standard view is from
                        the bottom of the scrollback buffer.
        HOLDING_DISTANCE
                        How far away the top of the hold view is from the
                        bottom of the scrollback buffer.
        SCROLBACK_DISTANCE
                        How far away the top of the scrollback view is from
                        the bottom of the scrollback buffer
        DISPLAY_COUNTER The serial number to be used by the next item put
                        into the scrollback buffer.
        HOLD_SLIDER     How much the hold view "slides" up every time you
                        hit <enter>.  Value of /SET HOLD_SLIDER
        HOLD_INTERVAL   The value of /SET HOLD_INTERVAL
        LAST_LINES_HELD How many lines are beind held, as seen in %H.
        WAITING_CHANNEL The last channel you /JOINed in this window.  You
                        can only have one waiting channel per window.
        BIND_CHANNEL    The value of /WINDOW BIND
        QUERY_NICK      The value of /WINDOW QUERY
        NICKLIST        The nicks you added with /WINDOW ADD
        LASTLOG_LEVEL   The levels of output that the window should put into
                        its lastlog, value of /WINDOW LASTLOG_LEVEL
        LASTLOG_SIZE    How many items are in the window's lastlog.
        LASTLOG_MAX     How big the window's lastlog can be; value of
                        /WINDOW LASTLOG or /SET LASTLOG
        LOGGING         The integer value of /WINDOW LOG
        LOGFILE         The current filename used by the window's log.
        DECEASED        Should always be 0, but may be 1 if the window is
                        "dying" but this would be quite exceptional.

*** News -- 11/21/2003 -- /SERVER <host> now honors server groups
        Whenever EPIC tries to connect to a new server, particularly
        when you do /SERVER <host> it will honor the server group of
        the new server; if you cannot connect to <host> it will only
        try to connect to other servers in the same group as <host>.

*** News -- 11/21/2003 -- New math parser can now use 64 bit integers
        The new experimental math parser (which you can turn on via
        /xdebug new_math) can now support 64 bit integers.  This is
        auto-detected when you run 'configure' and $info(o) will include
        the letter 'l' for you scripters who want to be able to tell when
        the host client can do big math and when it can't.

EPIC4-1.1.14

*** News -- 10/31/2003 -- Most file $functions() now use the "" hack.
	This hack works by allowing you to specify the empty filename "" in a
	function call, and have the function read the remaining arg list as a
	single word which is the filename.  This is useful for dealing with
	wierd filenames.

*** News -- 10/31/2003 -- Tuned the DCC receive packet size.
	The receive packet size is now 64k.  This may at first appear to break
	the protocol, but the read reqest will return immediately if it doesn't
	have all the data, so the responses will tend to repace themselves to
	the senders window size, especially under cpu or network load where a
	read call can't always be made immediately.

	The benefits of doing this are that we don't clobber the sender with
	quite so many un-necessary acks, and we don't have to spend so much cpu
	time in the select loop under load.

*** News -- 10/31/2003 -- Fixed dcc_lost to be called in more cases.
	This still needs work.  There are certain cases for which it isn't
	called.

*** News -- 10/31/2003 -- Added dcc_spacefix script.
	When this is loaded, it will automatically translate the double quoted
	spaced filename dcc requests that some clients send into url encoded
	ones that epic can understand.

*** News -- 10/31/2003 -- Added $dccctl(refbase).
	This will change the number from which new dccs get given new refnums.
	It probably isn't terribly significant except that it will almost
	definitely disappear the day that refnums become fixed in the system.

*** News -- 10/31/2003 -- Added $dccctl(set [ref] quoted)
	This is good for 8 bit clean comms over raw dccs.  While it is on, the
	line by line mode that raw dccs are usually in will be turned off, and
	i/o by way of "/dcc raw", "/msg =[fd]", and the DCC_RAW hook will
	instead have dangerous characters backslashed, and can be used with
	$asciiq(), $chrq(), $writeb(), etc.

	It may on occasions be neccessary to have input be quoted and output be
	line-by-line or vice versa.  This can be done by leaving quoted mode
	set to the desired read mode, and flipping it for write.

	With this change, epic moves a step closer to being able to process 8
	bit clean data.  One of the last remaining parts that can't is /exec.

*** News -- 10/31/2003 -- /away has a new flag, "--" to stop reading flags.
*** News -- 10/31/2003 -- Added $sedcrypt().
	Don't use this.  It was put in there for playing around with sed
	encryption.

*** News -- 10/31/2003 -- Added $tell().
	This is a compliment of $seek().

*** News -- 10/31/2003 -- Added $ftruncate().
	This will truncate a file $1- to size $0.  Note that $1- is not a
	quoted word, and unlike some other file functions, it doesn't operate
	on fds.  This function may be changed or withdrawn.

*** News -- 10/31/2003 -- $listarray() takes an extra arg.
	$listarray() returns all values in an array joined by spaces.  Given a
	second arg, it will use that as a joining string.

*** News 10/31/2003 -- Added $wwordtoindex() to functions script.
	This may be un-necessary given the recent changes to the word
	parsing rules.

*** News 10/31/2003 -- New $open() modes, potential incompatibility.
	$open() can now open using all the modes available to libcs fopen(3)
	except "w", which has traditionally been translated to "a".

	The incompatibility is in the way the mode argument is read.  I have
	seen some scripts that append extra chars for no apparent reason.  If a
	script did this it would work under the old scheme, but under the new,
	the entire word must match one of the modes, or the open will fail.

*** News 10/31/2003 -- $aliasctl(maxret), rpmatch, rmatch.
	This whole thing is a hack which will probably be withdrawn in future
	when a more stable variable storage system is implemented.  Therefore
	it probably won't be documented anywhere else.

	It is designed to be memory overflow protection for $aliasctl(), which
	can at times cause a coredump on itself when the variable space is
	excessively large.

	The way maxret works is that you call $aliasctl(maxret [number]), and
	from then on, $aliasctl(assign pmatch [...]) will return a maximum of
	[number] variables.  This is great for purge aliases, because you can
	call it again once the first [number] are gone and get the next lot.
	To use it for anything else, a starting range is needed, and this can
	be specified with $aliasctl(assign [start] pmatch).  Note that [start]
	must be numeric and _non_zero_.  This isn't a bug.  It means that all
	scripts using this feature must be written in a future proof way.

	As for rpmatch and rmatch, these are exactly like pmatch and match, but
	they work through the list in reverse.  This is very useful for
	performance.

	The data_struct script has been rewritten to use these features as an
	example of the use of these features.

*** News 10/28/2003 -- Cross-family /DCC issues.
	You can't ordinarily do cross-family /DCC.  Cross-family DCC is
	when you're connected to an IPv4 server and try to do IPv6 DCC,
	or when you're connected to an IPv6 server and try to do IPv4 DCC.
	The reason this doesn't normally work is because EPIC doesn't know
	what your IP address is (or even if you have one) in the "other"
	family.  Normally you tell EPIC what your address is by giving it
	a virtual hostname with /HOSTNAME <name> and it looks up your
	address in all of the families it supports and uses that.  But if
	you don't give it a vhost, and you try to do a cross-family DCC,
	it will fail and remind you to use /HOSTNAME first.

*** News 10/28/2003 -- New /ON, /ON DCC_ACTIVITY
	This hook is activated each time some activity occurs on a 
	/DCC GET or /DCC SEND, particularly whenever the %D status bar
	expando is updated.  The idea is that scripters can stop using %D
	and use the /SET STATUS_USER* expandos to craft their own custom
	%D-like expandos.  The value of $* is the refnum of the dcc that
	had the activity.  You can use this value with $dccctl().  When
	a DCC closes, it throws /on dcc_lost, and then /on dcc_activity
	will be thrown with the -1 refnum.

*** News 10/28/2003 -- Everything should support /xdebug extractw now
	If you turn on the experimental feature /xdebug extractw, then
	everything in epic that works on word lists should start supporting
	extended ("double quoted") words.  This includes numeric expandos,
	built in functions, and so on.  Furthermore, anything that outputs
	a word list should surround words with double quotes if they have
	space in them.  Since double quoted words are not honored unless
	you have /xdebug extractw, this is an all-or-nothing thing.  

	This will break some scripts becase of changes like this:
		Old:	$sort(one "two three" four)  -> [four one two three]
		New:	$sort(one "two three" four)  -> [four one "two three"]

	See the doc/word-lists file in the epic source for a very detailed
	list of exactly what does and does not output double-quoted words.

*** News 10/28/2003 -- New /SET, /SET WSERV_TYPE [XTERM|SCREEN]
	When you are running EPIC under both screen and X at the same
	time and you do /window create, some people want epic to start
	up a new xterm and some people want epic to start up a new 
	screen window.  The previous default has been a screen window.
	Now you can either /SET WSERV_TYPE XTERM or /SET WSERV_TYPE SCREEN
	to explicitly state your preference, if you have one.  Obviously
	this only matters when you're running epic under BOTH.

*** News 10/19/2003 -- $serverctl(SET <refnum> UMODES) now supported
	To work around an unfortunate problem with ratbox, you are now 
	permitted to change the "valid user modes" for a particular server.
	You may want to set this in an /on 005 or some such thing.

EPIC4-1.1.13

*** News 10/19/2003 -- You can now /SET DEBUG 7 and /SET OUTPUT_REWRITE
        at the same time.  I fixed it with a technical workaround the details
        of which would probably bore you. ;-)

*** News 10/19/2003 -- /XEVAL -- now ends option processing
	If you do /XEVAL -- <whatever> then <whatever> will be executed
	as a command and no further options will be parsed.  This came up
	becuase /XECHO -- does this, and someone figured out that '/' was
	also an option argument and that got in the way of doing a built
	in command, for example:
		/XEVAL -- //MSG hop testing!

*** News 10/10/2003 -- New built in script, 'hold_mode'
	This script implements the /set hold_mode and /set hold_mode_interval
	semantics of ircII.  Particularly, when you create a new window, the
	current global values of these /set's are set for the new window.
	Those who want ircII-like hold_mode behavior should definitely /load
	this script in their .ircrc!

*** News 10/10/2003 -- New setting, /SET HOLD_SLIDER, /WINDOW HOLD_SLIDER
	The "HOLD_SLIDER" controls what percentage of your window must scroll
	by before the window starts holding further output; and how much held
	output is displayed each time you use the SEND_LINE keybinding (the
	<enter> key).  Traditional ircII semantics would use a value of 100
	(a full window is scrolled by each time you hit <enter>), and the
	more recent epic behavior would use a value of 0 (the window always
	holds new output, and you must use SCROLL_FORWARD (<page down>) to 
	see the new output.  This can be set on a window-by-window basis or
	set globally.  The default is 100 (traditional ircII hold_mode)

*** News 10/10/2003 -- Modifications to /WINDOW HOLD_MODE system
	When a window is in hold_mode, it allows some number of lines to 
	be displayed and then any further lines are "held" or not displayed
	until the user takes some definite action to display them.  The user
	can display ("unhold") held lines by using the SCROLL_FORWARD keybind
	(<page down>) or the SEND_LINE keybind (<enter>).  For SCROLL_FORWARD,
	the number of lines unheld is controlled by /SET SCROLLBACK_RATIO,
	and for SEND_LINE, it is controlled by /SET HOLD_SLIDER.

	The traditional ircII behavior for hold_mode is simulated by using
	/set hold_slider 100 and /load hold_mode.  Each time you hit <enter>
	a full window of output is unheld, and if no data was unheld, then 
	a full window of output will appear before new output gets held.

	The more recent epic behavior for hold_mode is simulated by using
	/set hold_slider 0.  All new output is always held, and hitting
	<enter> does not unhold output, but rather you must use <page down>
	to scroll forward through the held output until you hit the bottom.

*** News 10/10/2003 -- No more "half blank window"
	If you don't know what I'm explaining here, don't worry about it.
	If you do know, then you'll be happy to hear about this.  Previously,
	If you did <page up> then a line of output occured and you hit 
	<page down> twice, then half the window would be empty.  It seemed
	a lot of people hated this so I "fixed" it as part of the hold_mode
	stuff.

*** News 10/10/2003 -- Per-DCC store paths (sort of)
	You can now /DCC RENAME <nick> <file> <absolute path> to override
	the /SET DCC_STORE_PATH for a particular DCC.  For example:
		/SET DCC_STORE_PATH ~/downloads/
		/DCC RENAME hop myfile.txt /tmp/myfile.txt
		/DCC GET hop
	Before this change, the file would be saved as:
		~/downloads/_tmp_myfile.txt
	but now it will be properly saved to
		/tmp/myfile.txt

*** News 10/10/2003 -- Servers now track their own current windows
	As you probably know, EPIC has a "global current window" and each of
	your screens has its own "current window".  Now each server will 
	track its "current window".  Each time you set a new current window
	in one of your screens, that window will become its server's current
	window.  This information will be used for /SET CURRENT_WINDOW_LEVEL.
	This means that when output to a level in /SET CURRENT_WINDOW_LEVEL
	occurs from servers that are not the current window's server, it will 
	now go to that server's "current window" instead of being ignored 
	like it has up until now.

*** News 10/10/2003 -- EPIC now uses 004 and 005 numeric values
	There are many different networks out there who use usermodes and 
	channel modes for different things.  Sometimes, a mode may take an 
	argument on one server but not on another server.  In order to allow 
	clients to do the sensible thing, servers are supposed to send right
	and proper values in the 004 and 005 numerics to tell the client what
	modes are available and whether they take an argument or not.  EPIC
	now will use these values.  Occasionally, a server will be in error
	and fail to report a usermode it supports, or will falsely report it
	as taking an argument when it doesn't, or vice versa.  Whenever a 
	problem like this occurs, EPIC will output a warning message telling
	you that it had to assume something about your server that the server
	did not relay correctly to EPIC.  These messages are harmless and 
	you can usually ignore them, but if you get a message and EPIC does
	do something weird, the mode change may be at fault.  You can talk
	to your friendly server administrator about the problem.

*** News 09/25/2003 -- $servernick(<global>) now returns global nickname
	I just know I'm going to regret this...  If you want to get the
	client's global current nickname (which is used for new servers
	added to your server list), you can pass the literal string <global>
	to the $servernick() function to get it.

*** News 08/30/2003 -- New function $randomread() in the files script.
	It works much like the $randread() builtin, but it avoids certain
	potential bugs, and will return one line from each specified file.

*** News 08/30/2003 -- commandqueues script updates.
	q1cmd now permits you to specify multiple comma separated queues
	to test against for the specific purpose of blocking.  The command
	will only be queued on the first.

	qcmd now makes reference to a non-existant function called
	$islagged().  If this returns a true value, qcmd will stop right
	there so that the server doesn't get mistakenly flooded.

*** News 08/30/2003 -- Autoget script enhanced.
	A new autoclobber mode for those occasions when your transfer just
	keeps failing. "/autoclobber resume close" (the default) means that if
	the request is for a file larger than the one you have, the transfer
	will resume, otherwise the request will be rejected.

*** News 08/20/2003 -- You cannot do /TIMER -REPEAT -1 0
	Because this would busy loop.  You need *some* sort of interval, 
	even if it is very small.

*** News 08/20/2003 -- You can no longer do /WINDOW NUMBER on channel windows
	Windows have traditionally tracked their current channel by holding
	the current channel name as a string.  This has been a huge hassle
	since it's possible for the window to think its current channel is
	a channel you're not on, and there was no way to fix that short of
	doing brute force sanity checks.  Now EPIC tracks your current
	channels by having each channel hold a "priority" number, and the
	refnum of its window.  Whenever you remove a channel from its window
	by whatever reason, the channel that has the next highest priority
	is made the current channel.  This means EPIC can remember all of
	your previous current channels and unwind them sensibly.  But this
	all comes with a price.  Because channels track their windows by 
	refnum now, you can no longer change a window's refnum if it has 
	channels in it.  If you try, EPIC will refuse to comply.

*** News 08/15/2003 -- You can now /RETURN from a /LOADing script
	If you /RETURN from within a /LOADing script, the /LOAD will end.
	This can be useful if you want to protect against /LOADing a script
	twice, or if it's a pre-formatted script and you don't want it to 
	be /LOADed by the standard loader.

*** News 08/15/2003 -- Improvements to how EPIC handles words
	Up until this point, EPIC's word handling was more "ad hoc" than
	anything.  Some places honored double quoted words, other places did 
	not, and even then not every place did the same thing with double 
	quoted words.  In some places, words would include leading spaces, 
	and in others they would not.  Same thing with trailing spaces.  It 
	was just a total mess.  We made a concerted effort to clean up all of 
	this so that there is only one set of rules for all words in EPIC.  
	I would document the new set of rules, except I don't want to hold 
	up this release by writing a big old document.  Stay tuned.  Basically
	the point is everything should be sensible and consistent now.

*** News 08/15/2003 -- Improvements to EPIC's source code
	At or around this timeframe, EPIC's source code was audited and
	fixed so that no "unsafe" C functions are used.  This was used to 
	satisfy the pedants who worry that any use of an unsafe C function,
	even if it is carefully checked, is a security risk.  Also, EPIC
	was compiled with some of the stricter FreeBSD "WARNS" compiler
	flags, and many hundreds of changes were made to improve the 
	quality and conformance of EPIC's source code.

*** News 07/19/2003 -- New argument to /LASTLOG, /LASTLOG -TARGET
	Items are stored in your lastlog along with the "display target".
	If the message has anything to do with a channel, the target is
	that channel.  If it is a msg, notice, or dcc you sent, or someone
	sent to you, then the target is the other nick.  You can select
	only output pertaining to certain targets with /LASTLOG -TARGET.
	For example, to see only public messages to #epic,
		/LASTLOG -TARGET #epic -PUBLIC

*** News 07/14/2003 -- New /SET, /SET MAIL_INTERVAL
	Previously, the client checked your mbox at the top of every minute
	and whenever the status bar was redrawn.  For some people, this was
	far too often, and for others, it was not nearly often enough.  Now
	you can control exactly how often your mbox is checked with this set.
	Please remember that redrawing your status bar no longer rechecks
	your mail; what you see on your status bar is cached and recreated
	by a recurring timer that runs as often as this /set directs.  The
	default value is 60 (at the top of every minute).  When CPU_SAVER
	mode is active, /SET CPU_SAVER_EVERY overrides this value.

*** News 07/14/2003 -- New /SET, /SET CLOCK_INTERVAL
	Previously, the client updated the status bar clock (and $T inline
	expando, and /on timer, and /on idle) at the top of every minute.
	For some people, this was not nearly often enough.  Now you can
	control exactly how often the clock is updated with this set. 
	As an example, if you 
		/SET CLOCK_INTERVAL 1 			and 
		/SET CLOCK_FORMAT %H:%M:%S
	the status bar clock will show seconds and update every second!
	The default value is 60 (the top of every minute).  When CPU_SAVER
	mode is active, /SET CPU_SAVER_EVERY overrides this value.

*** News 07/04/2003 -- New interface to $dccctl()
	You may not get or set the "offered address" of a dcc offer by
	someone else.  Resetting the remote offered address may be 
	necessary if the remote peer's client mangled the handshake.

	$dccctl(GET <refnum> OFFERADDR)
	- Returns the address that the remote peer offered to make the 
	  dcc available at.  It will be a p-addr (ie, "127.0.0.1") and a 
	  port number.

	$dccctl(SET <refnum> OFFERADDR <address> <port>)
	- Sets the address that the remote peer offered to make the dcc
	  available at.  It may be either a p-addr (ie, "127.0.0.1") or a
	  hostname (ie, "remote.peer.icann.com"), and a port number.  The
	  empty string is returned if the connection is already open (it
	  doesn't make any sense to change it at that point), or if the 
	  address you provide doesn't make sense.  It returns 1 if the
	  change was successful.

*** News 07/04/2003 -- More interfaces to $ignorectl()
	You can now query and set the ignore's creation time, its 
	last-used time, and the number of times it's been used:

	$ignorectl(GET <refnum> CREATION)
	- Return the time the ignore was created.  The first integer is in
	  seconds and the second number is in milliseconds.  This is the 
	  same format that $utime() uses.

	$ignorectl(GET <refnum> LAST_USED)
	- Return the time the ignore was used (triggered).  The first integer 
	  is in seconds and the second number is in milliseconds.  This is 
	  the same format that $utime() uses.

	$ignorectl(GET <refnum> COUNTER)
	- Return the number of times the ignore has been used (triggered).

	$ignorectl(SET <refnum> CREATION <seconds> <milliseconds>)
	- Set the time the ignore was created.  The two values shall be
	  system clock time, that is, the number of seconds after the epoch
	  when the ignore was created.  Why you would want to change 
	  this is beyond me, but you know, whatever.  
	  The ignore's refnum is returned.

	$ignorectl(SET <refnum> LAST_USED <seconds> <milliseconds>)
	- Set the time the ignore was last used (triggered).  The two values 
	  shall be system clock time, that is, the number of seconds after 
	  the epoch when the ignore was last used (triggered).
	  The ignore's refnum is returned.

	$ignorectl(SET <refnum> COUNTER <number>)
	- Set the number of times the ignore has been used (triggered).
	  This is probably most useful to reset to 0 if you want to see
	  if an ignore is still being triggered or not.
	  The ignore's refnum is returned.

*** News 06/30/2003 -- Revamped /IGNORE support.
	The /IGNORE support for epic has been mostly rewritten, but the
	user-interface has tried to say the same.  Several new features
	have been added:

	1) Refnum support -- You can refer to an ignore by either its mask
	   or its refnum.  Output from /IGNORE includes the refnum.
	2) Timeout support -- You can set an amount of time an ignore should
	   be in force before it is automatically expired.  At the end of
	   the timeout, the ignore is removed and you are notified.
	3) Ignore reasons -- You can attach to each ignore a reason string
	   why you are ignoring the reason.  This can help you in case you
	   want to know when you set it or why the person is bothering you...

	Refnum support should be pretty easy to use -- wheerever you would
	normally give an ignore mask, you just use a refnum, for example:

	/ignore *!*really@long.address.com all
	*** Now ignoring ALL from *!*really@long.address.com (refnum 1)
	/ignore 1 none
	*** *!*really@long.address.com removed from ignorance list (ignore 
	+   refnum 1)

	/ignore *!*@foo.com all timeout 10
	*** Now ignoring ALL from *!*@foo.com (refnum 2)
	[ after 10 seconds pass ]
	*** *!*@foo.com removed from ignorance list (ignore refnum 2)

	/ignore *!*@booya.com all reason "getting on my nerves"
	*** Now ignoring ALL from *!*@booya.com (refnum 3) because getting 
	+   on my nerves

*** News 06/30/2003 -- New built in function, $ignorectl()
	This is a low-level interface to the ignore system

	$ignorectl(REFNUMS)
	- Return all integer refnums for all active ignores.

	$ignorectl(REFNUM <ignore-pattern>)
	- Given an exact ignore pattern, return that ignore's refnum.

	$ignorectl(ADD <ignore-pattern> [level-desc])
	- Add a new ignore, ala /IGNORE <ignore-pattern> <level-desc>
	  and return the refnum for the new ignore.  <ignore-pattern> is
	  taken literally and should not contain spaces or commas.

	$ignorectl(CHANGE <refnum> [level-desc])
	- Change the <refnum> ignore by adding or subtracting levels as
	  indicated by [level-desc].  If <refnum> is not a number or does
	  not represent a valid ignore, the empty string is returned.
	  Otherwise, <refnum> is returned.

	$ignorectl(DELETE <refnum>)
	- Remove the ignore numbered <refnum>

	$ignorectl(PATTERN <wildcard pattern>)
	- The effect of $igmask(<wildcard pattern>): treating each ignore
	  pattern as a literal string, return all refnums whose ignore masks
	  are matched by the <wildcard pattern>.

	$ignorectl(RPATTERN <nick!user@host>)
	- The effect of $rigmask(<nick!user@host>): treating the argument
	  as a nick!user@host string, return all refnums whose ignore masks
	  match the nick!user@host string, that is, each ignore which would
	  "cover" the nick!user@host.

	$ignorectl(WITH_TYPES [level-desc])
	- The effect of $rigtype([level-desc]): return the refnums of all
	  ignores which contain at least all of the levels indicated.  It
	  is possible for an ignore to have MORE levels set, but of those
	  levels which are requested, all of them must be present.

	If you attempt to get a value but <refnum> is not valid, the
	empty string is returned.

	$ignorectl(GET <refnum> NICK)
	- Return the ignore-pattern for the ignore refnum

	$ignorectl(GET <refnum> LEVELS)
	- Like $igtype(), but better: return a space separated list of 
	  all of the ignore levels that are active for this ignore, each
	  level prefixed with exactly one character which indicates that
	  level's disposition:
		/<level>	Suppressive ignore
		+<level>	Highlight ignore
		^<level>	Exceptive ignore

	$ignorectl(GET <refnum> SUPPRESS)
	- Return an integer value that contains a bitwise representation
	  of all of the suppressed levels for this ignore.  The exact layout
	  of this value is epic-version-dependant and may change in the
	  future.  If you use this value in a script, make sure you are
	  using a layout compatable with the version of epic the user is
	  using.

	$ignorectl(GET <refnum> EXCEPT)
	- Return an integer value that contains a bitwise representation
	  of all of the excepted levels for this ignore.  See above for
	  warning about trying to use this value.

	$ignorectl(GET <refnum> HIGHLIGHT)
	- Return an integer value that contains a bitwise representation
	  of all of the highlighted levels for this ignore.  See above for
	  warning about trying to use this value.

	$ignorectl(GET <refnum> EXPIRATION)
	- Return the time the ignore is to expire as two integers. The first
	  integer is the seconds and the second number is the milliseconds.
	  This is the same format that $utime() uses.  If the ignore does not
	  expire, both values are 0.

	$ignorectl(GET <refnum> REASON)
	- Return the reason the user set the ignore, if any.

	If you attempt to set a value but <refnum> is not valid, then
	the empty string is returned.

	$ignorectl(SET <refnum> NICK <ignore-pattern>)
	- Set the ignore-pattern for the ignore refnum.
	  *** WARNING *** The ignore list is usually sorted, and changing
	  this value may de-sort the ignore list.  The result of this is
	  uncertain and could destabilize epic.  It is probably not a good
	  idea to change an ignore's pattern.  
	  The ignore's refnum is returned.

	$ignorectl(SET <refnum> LEVELS <level-desc>)
	- Unconditionally set the ignore levels to <level-desc>.  All levels
	  previously in use are cleared and replaced with the new levels.
	  You should prefix each level with one character to indicate it's
	  disposition:
		/<level>	Suppressive ignore
		+<level>	Highlight ignore
		^<level>	Exceptive ignore
	  The ignore's refnum is returned.

	$ignorectl(SET <refnum> SUPPRESS <integer>)
	- Unconditionally set the integer value corresopnding to the 
	  suppressive ignores for this ignore item.  
	  *** WARNING *** The exact layout of this value is version 
	  dependant on epic and may change in the future, so changing this 
	  value directly like this could corrupt the ignore if you don't 
	  know what version of epic you are using.  You Have Been Warned.
	  The ignore's refnum is returned.

	$ignorectl(SET <refnum> EXCEPT <integer>)
	- Unconditionally set the integer value corresopnding to the 
	  exceptive ignores for this ignore item.  See above warning
	  The ignore's refnum is returned.

	$ignorectl(SET <refnum> HIGHLIGHT <integer>)
	- Unconditionally set the integer value corresopnding to the 
	  highlighted ignores for this ignore item.  See above warning
	  The ignore's refnum is returned.

	$ignorectl(SET <refnum> EXPIRATION <seconds> <milliseconds>)
	- Set the time an ignore shall expire.  The two values shall be
	  system clock time, that is, the number of seconds after the epoch
	  when the ignore shall be removed.  This is not the expiration 
	  interval (the number of seconds from now it should be removed) but
	  rather the absolute system clock time it should be removed.  You
	  can add the expiration interval to $utime() to get this value.
	  If both values are 0, the ignore will not expire.  
	  The ignore's refnum is returned.

	$ignorectl(SET <refnum> REASON [reason])
	- Set the reason the user set the ignore.  The return value is the
	  reason.  If no reason is given, the ignore's reason is removed.
	  The ignore's refnum is returned.

*** News 06/21/2003 -- New built in script, 'paste', /SET PASTE ON|OFF
	The 'paste' script implements three new sets and one keybinding:

	1) /SET PASTE (ON|OFF)
	2) /SET PASTE_STRIP (ON|OFF)
	3) /SET PASTE_DELAY <number>
	4) Binds key ^P to /SET PASTE TOGGLE

	When you /SET PASTE ON, everything you type at the input prompt is
	taken to be literal text that you're pasting and it is sent to your
	current target without any interpretation by epic.  This means you
	can paste things like C code with comments, or ircII code without
	EPIC interpreting your paste as commands.  When you /SET PASTE OFF,
	everything goes back to normal.  The default is OFF.

	Because it is theoretically possible for you to get stuck into
	paste mode, where you would be unable to /SET PASTE OFF, there are
	two ways out of "paste mode".  The ^P (control-P) key binding will
	toggle the paste mode, turning it off if it is on (and turning it 
	on if it is off...).  The "paste mode" feature also turns itself
	off after a short delay, which you can control with /SET PASTE_DELAY.
	The default paste delay is 30 seconds.

	Anguzhawk, who asked me for this script originally, also wanted to
	able to strip off leading whitespace on pre-formatted text that
	he was pasting.  If you /SET PASTE_STRIP ON, then epic will remove
	all leading whitespace from any text you paste.  If you 
	/SET PASTE_STRIP OFF, everything goes back to normal.  The default
	is OFF.
 
EPIC4-1.1.12

*** News 06/12/2003 -- New built in function, $serverwin([<server refnum>])
        Given an optional server refnum (the current server is the default)
        this function returns the last window connected to the server to be
        made the client's global current window.  The idea of this is to 
        give you a window you can use with /xeval to run a command, or 
        /xecho some text in the context of the correct server.  If you 
        want the "current channel" in an /on, you should do something like
                $winchan($serverwin())
        instead of $C.

*** News 06/12/2003 -- Improvements to epic's source code
        A lot of changes have happened internally to EPIC to improve the
        quality of its source code.  For those of you who know about C,
        the types of things we fixed were:
                1) Const correctness
                2) Bad comparisons of integers of different sign and size.
                3) Used valgrind to find a lot of uninitialized variables
                4) Stopped using all ``unsafe'' functions
                5) Treat all string literals as (const char *) [like #1]
                6) Remove "shadow" variables
                7) Prototype all extern functions, 'static' the rest.

*** News 06/12/2003 -- New configure option, --with-warns
        On some systems (at least on freebsd), the gcc you're using has
        a lot of extra helpful warning flags which you can use to point
        out low-quality code.  If you pass the --with-warns flag to 
        configure, it will turn on most of the useful ones.  If your
        compiler does not support these warnings, do not use this.

*** News 06/12/2003 -- New:  $dccctl(GET <refnum> FLAGS)
        This returns an epic internal integer value that indicates some
        values that may be of interest.  The composition of this value
        is undefined and is subject to change.  See dcc.c for more info.
        At the time I wrote this, these are the flags:
                1       dcc is DCC CHAT 
                2       dcc is DCC SEND
                3       dcc is DCC GET
                4       dcc is DCC RAW
                5       dcc is DCC LISTEN
                16      The dcc is inbound (other connects to us)
                32      The dcc is open and active
                64      The dcc is outbound (connect to other)
                128     The dcc is pending deletion
                256     The dcc is bi-directionally open
                512     The dcc has been rejected by either peer.

*** News 06/12/2003 -- New: $dccctl(GET <refnum> [HELDTIME|HOLDTIME])
        HELDTIME gives you a floating point value for how much time
                the dcc has spent in "hold mode".  When you want to
                calculate kb/s, you want to subtract this number of
                seconds from the total open time.
        HOLDTIME gives you the time that the dcc was last held or unheld,
                depending on the value of $dccctl(GET <refnum> HOLD).

*** News 06/12/2003 -- New arg list qualifier, "QWORD"
        If you do
                alias foobar (arg1 qword 2, ...) {
                        ...
                }
        it takes "double quoted words" but does not remove any double 
        quotes around the words.  This is in contrast to "DWORD" which 
        does remove them.  Example:

                alias foo1 (arg1 dword 2, ...) {echo $arg1}
                alias foo2 (arg1 qword 2, ...) {echo $arg1}

        /foo1 "one two" "three four" five six
                outputs         one two three four

        /foo2 "one two" "three four" five six
                outputs         "one two" "three four"

*** News 06/12/2003 -- Overhaul of dcc code, full ipv6 support
        The DCC code has been largely rewritten, and should be a lot
        more stable (less prone to crashes) especially when you delete
        or close a DCC connection.  IPv6 support has been fully added
        and it should work completely now with no exceptions.  If you
        have any problems, let me know!

*** News 06/12/2003 -- Changes to channel<->window handling
        Previously, each window was responsible for keeping track of
        what it's current channel was.  This could be a problem if you
        wanted to reconnect, and each channel would rejoin its window,
        but you could never be sure which channel would be the current
        window.  Now, each channel keeps track of whether it is the 
        "current channel", and when you reconnect, all of the current
        channels should stay the same and not change around.

*** News 05/04/2003 -- Change default of /set new_server_lastlog_level
        The new default for /SET NEW_SERVER_LASTLOG_LEVEL is now ALL,-DCC.

*** News 05/04/2003 -- New built in function: $levelwindow()
        Given a server refnum and a lastlog level description, it returns 
        a window for that server that claims any of the specified levels.  
        If no windows for the server claim the level, -1 is returned.  
	Since the DCC level is global to the entire client, that is handled
        specially.

*** News 05/04/2003 -- New built in function: $outputinfo()
        The $outputinfo() function returns either one or two words:
                $0      Current output window level
                $1      Current output target (if any)
        The current output window level may be "NONE" which has the same
        meaning as "CURRENT".

*** News 05/01/2003 -- New command in commandqueues, /timer.ue
        This functions the same as /timer, but won't expand the command
        when it is executed.  It's not quite 100% clean yet.  Don't try
        to execute numbers as commands.

        Also cleaned up /q1cmd to work properly with any input.

*** News 04/10/2003 -- New status expando, %{1}+
        The %+ status expandos returns the empty string (ie, it ignores
        the /set status_mode value) if a channel does not have a mode.
        The %{1}+ status expando will honor /set status_mode, and will
        substitute the empty string for %+.

        Example:  Current channel is #epic, it does not have a mode
                /set status_channel [%C 
                /set status_mode  +%+]
        Then using %C%+ yeilds  [#epic
        And %C%{1}+ yields      [#epic +]

*** News 03/29/2003 -- New /SET, /SET SWITCH_CHANNELS_BETWEEN_WINDOWS
        When this set is ON (default) the SWITCH_CHANNELS key binding
        will have its traditional (legacy) behavior, and will allow you 
        to switch a window's current channel between all of the non-current
        channel windows in all windows connected to the same server.

        When this set is OFF, the SWITCH_CHANNELS key binding will have
        more sensible behavior, allowing you to switch between a window's
        channel list, but without grabbing channels from other windows.

EPIC4-1.1.11

*** News 03/26/2003 -- Enhancements to $fsize(), $fexist(), $stat()
	If the first word passed to any of these three functions is 
	the empty string, then the rest of the argument list ($1-) is
	taken as a single filename without any funny business from epic.
	This might be useful if you want to work with a file that has
	a space in it.

	Example:
		$fexist("" This song has spaces.mp3)
		$fsize("" one two three.jpg)

*** News 03/23/2003 -- /DEFER now server sensitive
	When you do /DEFER <commands>, it will remember the current server
	and it will restore to that server when the commands are executed.
	At execution time, the commands will be run in the server's 
	"current window" (see immediately below) which may or may not be
	the current window when you did the /defer, but it will definitely
	be a window connected to the server!

*** News 03/23/2003 -- "Current window" tracking by server
	A new experimental feature is being added whereby each time you
	change the current window, it becomes its server's "current window".
	Since you can only have one current window per screen, but you can
	have more than one server connected per screen, epic may need to 
	know what the "current window" is for a server other than the 
	current window's server.  Is this confusing enough yet?  Well,
	think of it this way.  EPIC will keep track of the last window
	that was the current window for all of your servers.  Whenever
	EPIC needs to get a "current window" that is connected to a specific
	server, it can use this feature to find the last window that was
	a "current window" that is connected to the server.  This is not 
	an automatic thing; features will have to be converted to use this.
	Watch for updates.

*** News 03/23/2003 -- New /TIMER verb, /TIMER -DELETE_FOR_WINDOW <winref>
	If you do /TIMER -DELETE_FOR_WINDOW <winref> then all of the pending
	timers for window <winref> will be deleted.  You may want to do this
	before you destroy a window to make sure it's timers do not go off 
	in another window!

*** News 03/23/2003 -- New $serverctl() value, "MAXCACHESIZE"
	This value allows you to set the size of the largest channel for which
	userhost caching will be done.  If you set this to a non-negative
	number, only channels with up to this many values will do userhost
	caching.  If you set this value to 0, you will turn off userhost
	caching for this server, and if you set the value to a negative number
	you will enable userhost caching for all channels.  You may need to
	tweak this value on servers where doing a WHO #chan for a channel
	with an extremely large number of users will cause the server to
	flood you off.  Or if you just hate userhost caching.

	Examples:
	$serverctl(SET 0 MAXCACHESIZE 100)
		Don't do userhost caching for channels with more than 100
		users when you join on server 0.
	$serverctl(SET 2 MAXCACHESIZE 0)
		Don't do userhost caching for any channels on server 2.
	$serverctl(SET 2 MAXCACHESIZE -1)
		Turn userhost caching on for all channels on server 2.
	$serverctl(GET 2 MAXCACHESIZE)
		Return the maximum size of a channel on server 2 for 
		which userhost caching will be done.

*** News 03/23/2003 -- New window verbs to control scrollback
	Now you can scroll around in windows without needing to use the
	key bindings.

	/WINDOW SCROLL_BACKWARD
	/WINDOW SCROLL_BACKWARD <lines>
		If <lines> is 0 or is not provided, scroll back the default
		number of lines, otherwise scroll back the given number of
		lines.  Similar to SCROLL_BACKWARD keybinding.

	/WINDOW SCROLL_FORWARD
	/WINDOW SCROLL_FORWARD <lines>
		If <lines> is 0 or is not provided, scroll forward the default
		number of lines, otherwise scroll back the given number of
		lines.  Similar to SCROLL_FORWARD keybinding.

	/WINDOW SCROLL_START
		Go to the start (oldest line) of the scrollback buffer.
		Similar to SCROLL_START keybinding

	/WINDOW SCROLL_END
		Go to the end (newest line) of the scrollback buffer.
		Similar to SCROLL_END keybinding

*** News 03/23/2003 -- $loadinfo() extended
	The $loadinfo() function now returns the current loader as $2.
	You could use this to make sure that your script is being handled
	by the correct loader.  At the top of every PF script, put the 
	following line:
	   if (word(2 $loadinfo()) != [pf]) {LOAD -pf $word(1 $loadinfo())}
	This will resubmit your script to the PF loader if it is loaded with
	some other (incompatable) loader.

*** News 03/23/2003 -- New /LOADer, the Pre-Formatted Loader
	The new PF Loader can load pre-formatted scripts.  You can load a
	preformatted script with:
		/LOAD -PF filename

	The PF Loader is a high-performance, low-overhead loader that does
	not do any tasks for you.  It does not support C-like comments, it
	does not add semicolons for you at the ends of lines between commands,
	and it does not try to match up {'s and }'s to warn you of syntax
	errors.  Files that are preformatted and loaded with the PF loader
	should load significantly faster.

	See the doc/pf-loader file for a tutorial on how to convert your
	standard scripts to PF scripts.

*** News 03/23/2003 -- Changes to /LOAD
	On this date, the /LOAD command was reorganized.  The new LOADer
	is generalized and can use different loaders.  The following new
	arguments to /LOAD are supported:
		-STD  (default)		Load using the Standard EPIC loader
		-PF 			Load using the Pre-Formatted Loader
					(see above for more info)
	More loaders will be added in the future. 

*** News 03/18/2003 -- $dccctl() changes.
	Added $dccctl(xxx), where xxx is one of HELD, UNHELD, USERHOSTMATCH.
	Added $dccctl(get [ref] xxx) where xxx is one of USERHOST, SIZE.
	Added $dccctl(set [ref] xxx) where xxx is one of DESCRIPTION,
		FILENAME, USER, USERHOST, OTHERNAME, ENCRYPT.

	DCCs will record the current userhost taken from $userhost() (no
	args).  This will be used to set the same variable for message
	processing under dcc chats.  This isn't entirely useful at this point
	because if you initiate a dcc request from within any privmsg hook,
	where the userhost variable is correctly set, the request will be
	translated to a notice.  This is true even for dcc chats.

*** News 02/25/2003 -- Added %{1}D status variable.
	This acts exactly like %D, but is present on all windows where
	%D is present only on the window that has the DCC lastlog level.

*** News 02/25/2003 -- Added DCC hold mode.
	$dccctl(set [ref] held 1) puts a dcc session on hold.
	$dccctl(set [ref] held 0) releases the hold.

	When a dcc session is on hold, no data is sent to it or received
	from it until the hold is released.  This might be useful for
	bandwidth control or for granting priority to other unheld dccs.

*** News 02/17/2003 -- New function $findws().
	Similar to $findw() but returns _all_ matching words.

*** News 02/17/2003 -- New functions ${no}chhops() in the functions script.
	Returns halfops in a channel (or not) like $chops() and $nochops().

*** News 02/17/2003 -- New functions $finditems() and $ifinditems()
	These functions work much like $finditem() and $ifinditem() but
	they perform substring searches.  If the substring is found in the
	Karll array, then _a_ matching item/index number is returned.  If
	the substring is not found, the twos compliment (negative minus 1)
	of the (index) insertion point is returned.

*** News 02/17/2003 -- New function $dccctl()
	Introducing the newest member of our nice little family of
	bolt-ons, $dccctl(), which does many of the things related to DCC
	that are otherwise extremely difficult.

	$dccctl(refnums)	returns all open DCCs.
	$dccctl(get [refnum] [element])
	$dccctl(set [refnum] [element])
	$dccctl(typematch [pattern])
	$dccctl(descmatch [pattern])
	$dccctl(filematch [pattern])
	$dccctl(usermatch [pattern])
	$dccctl(othermatch [pattern])
	$dccctl(locked)		returns all locked dccs.

	[element] can be one of:
	refnum        $dccctl() reference number
	type           (get only)
	description    (get only)
	filename       (get only)
	user           (get only)
	othername      (get only)
	encrypt        (get only) (unused)
	filesize      size of the transfer (get only)
	resumesize    size that the transfer was resumed at (get only)
	readbytes     number of bytes xfered (get only)
	sentbytes     number of bytes xfered (get only)
	server        from which the dcc was triggered (get only)
	locked         (get only) (see below)
	remaddr       remote address (get only)
	locaddr       local address  (get only)
	starttime     of the transfer (get only)
	lasttime      ? (get only)

	Note that the refnum concept is new to DCC and applies only to
	$dccctl().  This is necessary to nail down exactly which DCC is
	being refered to, but it is no help trying to find the current
	dcc in a DCC_LIST hook for eg.  The best way to work with this is
	to use the "locked" keyword since epic locks a dcc before calling
	any hook refering to it.

	The *match sub-functions return the refnums of all matching DCCs.

*** News 02/06/2003 -- New functions in script/functions
	Did to $timerctl() what was done to $serverctl() a few pages down.
	As with that command, this will change the way that subcommands
	are selected in ambiguous cases.

*** News 02/06/2003 -- New functions in script/functions
	$min() and $max() (implemented elsewhere)
	$regpattern() simulates $pattern() with regexes.
	$regfilter() simulates $filter() with regexes.
	$index2wword() simulates $index2word() but ignores quotes.
	$jotm() for $jot()ing multiple ranges.
	$jotc() for $jot()ing character ranges.
	$maskm() simulates $mask() with multiple n!u@h args.
	$randn() returns multiple random numbers.
	$replace(xy y 1 2 3) returns "x1 x2 x3".
	$shuffle*() returns all arguments shuffled randomly.
	$uniqd() simulates the shell command "uniq -d".
	$wordn() emulates $word() but permits multiple word specs.
	$cut() simulates the "cut" shell command".
	$chvoices() returns voiced nicks on a channel.
	$chnovoices() returns unvoiced nicks on a channel.

*** News 02/03/2003 -- Implement /SET SUPPRESS_SERVER_MOTD in script
	If you were a previous user of /SET SUPPRESS_SERVER_MOTD ON,
	then you will want to add 
			load suppressmotd
	to your ~/.ircrc.  This re-implements this /SET.  And hopefully
	this script actually works, unlike the /SET.  If you have any
	problems, let me know, and I'll try to fix it.  If you want to
	try to improve it, please feel free and send me patches.

	Make sure you do a 'make install' before you report not being
	able to load this script as a bug!

*** News 02/03/2003 -- $logctl(REFNUMS [ACTIVE|INACTIVE|ALL])
	You can now do the following things with logfiles:
		$logctl(REFNUMS ACTIVE)
			returns all ACTIVE (on) logfiles
		$logctl(REFNUMS INACTIVE)
			returns all INACTIVE (off) logfiles
		$logctl(REFNUMS ALL)
			returns all logfiles

*** News 02/03/2003 -- Logs now keep track of "last written time"
	Each logfile now has an "activity timer" which is reset when
	you first create the logfile, when you turn it on, or when you
	turn it off, or when any output is written to the logfile.
	You can work with this timer in the following ways:

		$logctl(GET <refnum> ACTIVITY)
			returns the last time the logfile was written to
		$logctl(SET <refnum> ACTIVITY)
			resets the log file's activity timer to current time
		/LOG <refnum> ACTIVITY
			resets the log file's activity timer to current time

*** News 02/03/2003 -- "Larnifications" to epic's server handling code
	Traditionally, ircII clients have trusted the server to send
	well formed data.  If messages from the server were badly formed
	(for example, if arguments were missing or in the wrong order),
	ircII clients (including epic of course) would crash.  Due to the
	repeated requests of some server developers, and particularly 
	because of larne, who used to make sport of epic by modifying his
	server to send numeric garbage at epic to make it crash, a long
	and substantial project to rewrite all of the code that handles
	messages from the server has been undertaken.  This marks the end
	of the first stage of the project, which protects epic from the
	server sending not enough arguments, which would cause a crash.
	Internally, I have referred to this as the "larnification project"
	in honor of larne, the person who pushed me over the edge into 
	doing this sooner rather than later.  I got his consent to use his
	nickname like this, so please don't think I'm making fun of him.
	For history's sake, this is an offshoot of the previous project
	which was called "Larneproofing" which was a band-aid to prevent
	most of the obvious problems caused by server's sending bad data.
	This was a full rewrite of the protocol-handling code.

*** News 02/03/2003 -- Changes to how and when notifies are done
	Previously, NOTIFY events always occured at the top of every minute,
	along with other things like the updating of the system clock and
	/on timer.  But now NOTIFY has been broken off into its own separate
	timer whose interval is controlled by /SET NOTIFY_INTERVAL (see below).
	How this will work is that each notify event will occur precisely
	/SET NOTIFY_INTERVAL seconds apart, except for the following cases!

	*) When the client starts up, the first notify event occurs at the
	   top of the next minute *without regard to whatever the original
	   value of /SET NOTIFY_INTERVAL is!*  After this first notify 
	   event, the normal rules apply.
	*) When you enter CPU_SAVER mode, the next notify event will occur 
	   at its regular scheduled time, but subsequent notify events will
	   occur at /SET CPU_SAVER_EVERY intervals!  (IE, /SET CPU_SAVER_EVERY
	   overrides /SET NOTIFY_INTERVAL when you're in cpu saver mode)
	*) When you leave CPU_SAVER mode, the next notify event will occur
	   at the top of the next minute *without regard to whatever value
	   of /set notify_interval!  After the top of the next minute, the
	   regular rules apply.

	These rules are needed to maintain as much backwards compatability
	as much as possible for most users, who will not change anything.

*** News 02/03/2003 -- Changes to /SET NOTIFY_INTERVAL
	There is a new #define in config.h, #define MINIMUM_NOTIFY_INTERVAL
	which is an integer value that sets the minimum permissable value
	of /SET NOTIFY_INTERVAL.  If you attempt to /SET to a lower value,
	it will be change to the minimum value.  The default value is 60,
	and you can change it in config.h if you wish.

*** News 02/03/2003 -- Changes to /ON WINDOW_KILL
	Previously, /ON WINDOW_KILL provided the window's "name or refnum"
	as $0.  But if you wanted to get the refnum, you couldn't because
	the window had already been destroyed.  So /ON WINDOW_KILL has been
	extended so $1 is always the window's refnum:
		$0	Window's "name or refnum"
		$1	Window's refnum

*** News 01/30/2003 -- $serverctl() general cleanup.
	subcommands will be matched against as many characters as are
	supplied.  This means that $serverctl(get 4 007) will not call the
	005 subcommand for eg, but also that in ambiguous cases, the first
	matching subcommand is used where they may not have been before.

*** News 01/30/2003 -- $serverctl(?match *pattern*) does wildcard matching.
	gmatch will return all servers matching group *pattern*.
	imatch will return all servers matching (its) server name *pattern*.
	omatch will return all servers matching (our) server name *pattern*.
	match was never implemented and has been removed.
	pmatch was never implemented and has been removed.

*** News 01/30/2003 -- $serverctl(max)
	$serverctl(max) now returns the number of _slots_ in the server
	list.  Note that this currently equates to the largest number
	of servers in the list at any one time.  It doesn't shrink if
	you delete servers.

*** News 01/30/2003 -- $afterw(), $beforew(), $fromw(), $tow()..
	WARNING:  Incompatible change.  If you experience problems
	because of this change, you should notify #epic on efnet.

	These functions will now do fixed string matching rather than
	pattern matching.  I figure that the old method of implementing
	these functions is fundamentally flawed, and not useful for real
	world applications.  Examination of many publicly available
	scripts seems to indicate that these functions are avoided and
	that where they are used, they constitute latent bugs since text
	matching is desired.

*** News 01/30/2003 -- $writeb() dequotes data.
	This makes it capable of writing binary data.
	$writeb($writefd $read($readfd $numbytes)) will copy $numbytes
	of binary data from one FD to the other faithfully.

*** News 01/30/2003 -- Subsecond /sleep.
	/sleep now accepts floating point arguments.  This makes it much
	the same as /usleep which accepts integer microsecond values,
	but not entirely.

*** News 12/23/2002 -- /exec options tuned.
	-line, -linepart, -error and -errorpart can now be changed for a
	process on the fly, using %process like the other options.

	Using the -window option will now nail the process to the server
	too.

*** News 12/23/2002 -- $xdebug() now accepts masks.

*** News 12/23/2002 -- /redir tuned
	/redir now permits raw dccs to be used.  Also, when used outside
	of the command line script, the $* arguments will now be available.

*** News 12/23/2002 -- New /set, /set FLOATING_POINT_PRECISION
	This sets the number of decimal places of the results of floating
	point math.  Note that this makes FLOATING_POINT_MATH redundant.

EPIC4-1.1.8

*** News 12/23/2002 -- Document /SET KEY_INTERVAL
	This hadn't been documented anywhere yet.  Whoops.

	When you have two competing key bindings, 
		/bind ^H backspace
		/bind ^H^H parse_command {echo hi!}
	Then when you press ^H, epic does not know whether you want
	to do the backspace, or if you will be pressing ^H again to
	get the parse_command.  So EPIC waits for /SET KEY_INTERVAL
	milliseconds to see what you do.  If you press ^H again within
	the timeout, it does the parse_command.  If you do not press
	any key before the timeout, it does the backspace.  If you press
	any other key than ^H (which would yield an unbound sequence),
	then epic immediately does the backspace and treats the second
	character as the start of a new sequence.

	Do not set this value too low, or you will have problems with 
	your cursor keys on low telnet links.

*** News 12/18/2002 -- New function $timerctl() - control /TIMERs
	Usage:
	------
	$timerctl(REFNUMS)
	$timerctl(REFNUM <refnum>)
	$timerctl(ADD <refnum> <interval> <events> <commands> \
			<subargs> <window>)		(NOT IMPLEMENTED YET)
	$timerctl(DELETE <refnum>)
	$timerctl(GET <refnum> <item>)
	$timerctl(SET <refnum> <item> <value>)

	Where <item> is one of the following:
		TIMEOUT		Returns "<seconds> <useconds>" representing
				when the timer is scheduled to go off.
		COMMAND		What commands shall be executed.
		SUBARGS		What the value of $* shall be
		REPEATS		The number of times that this timer shall
				execute (usually 1 for one-shot timers)
		INTERVAL	The interval to wait between executions
				(takes effect the next time timer executed)
		SERVER		The server the timer is connected to
		WINDOW		The window the timer is connected to

	REFNUMS returns all active timer refnums, including system timers.
	REFNUM returns the refnum for the timer if it is a valid refnum.
	ADD is not implemented yet.  Use /TIMER for now.
	DELETE removes a timer, natch
	GET returns one of the attributes of the timer
	SET changes one of the attributes of the timer.

	SET is dangerous.  You can really confuse epic by changing values
	to nonsensical or conflicting values.  In exchange for giving you
	total flexibility, you must suffer the peril of any mistakes you
	make stomping on your own timers.  You are not allowed to change
	attributes for system timers.  You are not allowed to delete system
	timers.

*** News 12/11/2002 -- Nick fudger now uses NICKLEN 005.
	If your server's nickname length is other than 9, epic will 
	extend with _'s your nickname to the permitted length to find
	you a nickname that is available for use.

*** News 12/11/2002 -- /on DCC_RAW mask change
	The remote-port field of this hook in the "connection accepted"
	mode (where field 2 is "N") has changed.  Field 3 is now the
	_local_ port rather than the remote.  This probably won't be a
	problem for anyone, since the remote port is rather useless
	information on its own, and examination of some popular scripts
	bears this out.

	If this _is_ causing a problem for you, then you should contact
	#epic on efnet.

*** News 12/11/2002 -- /exec "-closein %proc" flag - better pipe control.
	This should make /exec much more useful for things like sort and
	md5sum which will only start "working" when their input closes.

*** News 12/11/2002 -- /alias arguments list "improvement".
	The "alias [alias] (arg, arg, args) { [body] }" form of /alias has
	been changed to work more like the documentation says it does.

	This means that (args words 2) will actually take 2 words from the
	args list.  In addition, if /xdebug extractw is on, then "double
	quoted words" will be treated as such too.

	There is a slight performance penalty for this and it can probably
	be improved.  It would be nice to be able to specify how double
	quoted words should be treated in the args list too.

*** News 12/11/2002 -- Enhanced autoget script.
	Autoget has three new commands:  /autoreget, /autoreject and
	/autoclobber.  The first two take masks for arguments, and the
	third is used to specify how autoreget will work.

	Also, the masks have changed.  You can still specify *.ext, but
	the mask will be matched against nick!user@host,IP,file.  This
	only matters if you currently use file* as a mask, in which case
	you need to specify *,*,file* or *file* now.

*** News 12/11/2002 -- String length limits on /pretend removed.
	The string length is now limited by the limits epic puts on a
	message received from the server.

*** News 12/11/2002 -- $tcl() - Tcl support.
	$tcl() will take a Tcl expression and evaluate it much like
	$perl() does with Perl expressions.  In addition, the tcl
	interpreter has an epic command which works like this:
	  * "epic cmd [epic command]" runs the epic command.
	  * "epic eval [epic command]" evaluates the epic command.
	  * "epic expr [epic expression]" returns whatever the epic
	    expression returns.

	There is no equivalent to $perlcall() just yet, and it may
	never come, so to escape quoting hell it is necessary to pull any
	data the expression requires into Tclspace via the epic command
	described above.

	Don't even bother trying this out just yet as the configure
	script hasn't quite been finished for this.  You need to specify
	--with-tcl when you run configure to get it working.

*** News 12/11/2002 -- Slightly enhanced flood detection
	New features:
	  * /SET FLOOD_RATE_PER acts as a divisor for FLOOD_RATE.
	  * /set FLOOD_MASKUSER to values 0, 1 or 2.
	  * $floodinfo(*) returns the internal counters that match *.
	  * Improved algorithm which will hopefully retain the flooders
	    longer when the buffer is too small to hold all of them.
	  * Returning 1 from the FLOOD hook will now cause the counters
	    for the user to be reset.

	When FLOOD_MASKUSER is set to 2, the internal counters apply to
	hosts only.  When it is 0, they apply to the user@host, which is
	the old behaviour.  When it is 1, the user@host is used if
	the user begins with an alphanumeric character, and only the
	host otherwise.  A value of 1 will probably catch most drones
	more effectively but the default is 0.

	The values returned by $floodinfo() are "lists of lists" and the
	fields for each list are:
	  * USER@HOST or @HOST
	  * Channel or *
	  * Message type
	  * Server
	  * Message count
	  * Seconds since first message

	This flood detection is still far from perfect or complete.  It
	is necessary for FLOOD_USERS to be at least as large as the
	number of flooders for it to work effectively.  If it is half
	that number, it will be struggling to keep up with half of them.

*** News 12/11/2002 -- New function $winline() - read window lines
	Like $line() but reads from the scrollback instead of the lastlog
	buffer.

*** News 12/11/2002 -- New function $exec()
	$exec() runs the command given and returns three pipes for STDIN,
	STDOUT and STDERR of the process.  These can be used with $read()
	and $write(), however reading from a pipe that is empty or
	writing to one that is full will cause epic to block and perhaps
	deadlock, so the semantics can be tricky.  This is not designed
	to be a replacement for /exec.

*** News 12/11/2002 -- $read($fd $bytes) now returns quoted strings.
	$read($fd $bytes) will now quote the dangerous characters listed
	below in the return value.  With the new function $asciiq()
	below, this gives the scripter the ability to read (but not yet
	write) binary data.

*** News 12/11/2002 -- New functions $asciiq and $chrq()
	These are designed to more easily handle binary data.  $asciiq()
	will translate \r, \n, \0, \a and \\ to CR, LF, NULL, 0x01 and
	"\" prior to returning the ascii values of the string.  $chrq()
	is the compliment of $asciiq().

*** News 11/26/2002 -- Restrictions on /TIMER within a /TIMER removed
	There are now no restrictions whatsoever about where and when 
	you can use /TIMER.  Until now, you could not update/change/delete 
	a timer while another TIMER was executing.  This was particularly 
	troublesome for people who wanted to be able to have a recurring 
	timer and then be able to deactivated it; the only way to do this 
	was with /defer.  Now you can /TIMER -delete it from within itself.

*** News 11/07/2002 -- /XECHO -W now takes channel argument
	Until now, the argument to /XECHO -W had to be a window refnum.
	Now you can provide a channel as the argument, and epic will 
	output to that channel's window.  Please be aware that the channel
	you provide will be looked for in the "current server", so make
	sure that is really what you want.  This is useful in /ONs when
	you want to output something but you can't be bothered to look up
	the channel's refnum.  For example:
		on join * { xecho -w $1 BOOYA BOOYA BOOYA BOO!  }

*** News 11/07/2002 -- $center() improved
	$center() was rewritten here, so if you see any problems, this is
	probably when they were introduced.

*** News 11/07/2002 -- $geom() can now take a window reference
	Until now, $geom() returned the size of the screen as reported 
	by your TERM setting.  This was not always entirely useful.  The
	size returned is now always the 'true size' of the screen.  You 
	can also give it a window reference (eg, on another screen) to get
	the geometry of a secondary screen.  This is important now that 
	screens can be independantly sized.

*** News 11/07/2002 -- /WINDOW NAME now takes extended words as arguments
	You can now give a window a name with spaces in it by surrounding
	the entire name with double quotes.  For example:
		/window name "My Window #1"

*** News 09/27/2002 -- New function $logctl() - control logfiles
	This has actually existed since 09/03/2002, but I forgot to document
	it, so here goes!

	Usage:
	------
	$logctl(REFNUM log-desc)
	$logctl(ADD log-desc [target])
	$logctl(DELETE log-desc [target])
	$logctl(GET <refnum> [ITEM])
	$logctl(SET <refnum> [ITEM] [VALUE])
	$logctl(MATCH [pattern])
	$logctl(PMATCH [pattern])

	where [ITEM] is one of the following
	      REFNUM          The refnum for the log (GET only)
	      NAME            The logical name for the log
	      FILENAME        The filename this log writes to
	      SERVER          The server this log associates with (-1 for any)
	      TARGETS         All of the targets for this log
	      LEVEL           The Lastlog Level for this log
	      REWRITE         The rewrite rule for this log
	      MANGLE          The mangle rule for this log
	      STATUS          1 if log is on, 0 if log is off.
              TYPE            The type of the log (SERVERS, WINDOWS, TARGETS)

*** News 09/26/2002 -- New /WINDOW verbs, SEARCH_BACK and SEARCH_FORWARD
	These two window verbs take a regular expression (regex) and scroll
	backward or scroll forward to the previous or next line which 
	matches the regex, and makes that matching line the top of the 
	screen.  For example:
		/WINDOW SEARCH_BACK foo
	will scroll your window backwards until it finds a line that 
	contains the string "foo"; that line will be put at the top of 
	the window.

	If you search backwards or forwards, and there are no matches
	in the direction you're going, then this operation will beep 
	and will not change your display.

	Please remember that these operations put you into scrollback mode,
	so you will need to use the SCROLL_END keybinding to see any new 
	output that arrives.

*** News 09/26/2002 -- Decoupling of /FLUSH and /WINDOW FLUSH
	Previously, if you did /FLUSH, it threw away data from the server
	and also threw away your hold buffer.  Now that there is no hold
	buffer, it becomes less sensible for /FLUSH to force you to throw
	away something that doesn't really exist.  So /FLUSH now only
	throws away data from the server but does not mess with your
	scrollback buffer.  If you want to mess with your scrollback buffer
	you can of course always do /WINDOW FLUSH.

*** News 09/26/2002 -- Refinement of /WINDOW FLUSH
	Now that there is no distinction between the scrollback buffer and
	the hold buffer, it is not possible for /WINDOW FLUSH to remove the
	hold buffer.  So /WINDOW FLUSH has changed; what it does now is throw
	away everything in your scrollback buffer below whatever is currently
	on your screen, and it turns off /WINDOW HOLD_MODE and it turns of
	scrollback mode.

*** News 09/26/2002 -- Mostly broken feature /WINDOW SCROLL now totaly broken
	The /WINDOW SCROLL feature which did not work properly now is 
	completely useless.  The value of /WINDOW SCROLL is ignored; all
	windows must scroll.

*** News 09/26/2002 -- Refinement of meaning of /WINDOW HOLD_MODE ON
	When you have /WINDOW HOLD_MODE on, the top of the window is fixed;
	it is held; it will not move unless you move it.  Now that the hold
	buffer and scrollback buffer are fully integrated, you can move 
	forward through the hold buffer by using the SCROLL_FORWARD keybinding,
	just as if you were being scrolled back.  Please remember that if you
	have /WINDOW HOLD_MODE ON, it does not act like normal scrollback 
	functionality; when you reach the bottom of the hold buffer, it will
	never automatically turn HOLD_MODE off.  You must do that yourself.
	This is to maintain backwards compatability.

*** News 09/26/2002 -- /SET HOLD_MODE and /SET HOLD_MODE_INTERVAL now scripted
	The /SET HOLD_MODE and /SET HOLD_MODE_INTERVAL sets have always been
	aliases for /WINDOW HOLD_MODE and /WINDOW HOLD_MODE_INTERVAL.  So the
	hardcoded /SETs have been removed from EPIC and script compatability
	shims have been put into the 'basical' script which is loaded when
	you start EPIC.  Unless you don't use epic's scripts, you will not
	notice any change.

*** News 09/26/2002 -- Remove /WINDOW SCRATCH (unnecessary)
	As part of the integration of scrollback and hold buffers, every
	window was made capable of supporting /XECHO -LINE.  In simple
	terms, every window is now a scratch window, so you no longer need
	to /WINDOW SCRATCH ON before you use /XECHO -LINE.

*** News 09/26/2002 -- Finished integration of scrollback and hold buffers
	The primary change you will notice is when you are using scrollback
	and you reach the "scrollback point", you will no longer turbo-scroll
	to the end of the hold buffer.  This annoying "feature" was due to
	the incomplete integration of the scollback and hold buffers.  You
	are now able to scroll back and forth freely through both the scroll
	back and hold buffers, and you do not leave scrollback mode until you
	reach the end of the hold buffer.

*** News 09/11/2002 -- New window verb, /WINDOW MOVE_TO
	The /WINDOW MOVE_TO <N> verb makes the operative window the Nth 
	window on the screen (counting from 1, just as /WINDOW GOTO does)
	For example, if your screen has five windows, (A B C D E), and you 
	go to window D and do /WINDOW MOVE_TO 2 then your screen will be 
	re-ordered to (A D B C E).  If <N> is less than 1, then this 
	command does nothing.  If <N> is greater than the number of windows
	on the screen, the operative window is made the last window on 
	the screen.  Nothing about the content of any window changes -- 
	only the order they appear on the screen.

*** News 09/03/2002 -- New built in command, /LOG, general purpose log files
	General Purpose Log Files work quite a bit like windows, but instead
	of displaying to your screen, they write to a file.

	Each /LOG command works by choosing a logfile, and then performing
	one or more actions upon it -- just like the /WINDOW command.
	However, there is no concept as a "current logfile" so each time you
	use the /LOG command you need to re-specify the log you want to use.

	These are the operations currently supported by /LOG

	Options that modify the log's configuration
	-------------------------------------------
	NEW			Create a new logfile to work on.
	REFNUM <name|number>	Work on the specified log file, using either 
				it's name (see below) or its refnum.
	NAME <name>		Change the logical name of the logfile to 
				<name>.  You can use <name> in /LOG REFNUM 
				later.
	FILENAME <name>		Change the filename that this log writes to.
				You MUST specify a filename before you can 
				turn a log ON!
	TYPE			Each logfile can log one of three different 
				"types" of things; either a list of nicks or 
				channels ("TARGETS"), a list of windows 
				("WINDOWS") or a list of servers ("SERVERS").
				The default type is TARGETS.  WARNING!  If 
				you use /LOG TYPE, all of the current targets 
				you have added to the log will be destroyed,
				even if you don't change the type!  This is how
				you can destroy the target list if you want to 
				start over.
	SERVER <server refnum>	Change the server this logfile belongs to.  
				By default the log belongs to whatever the 
				current server was when it was created.  If 
				you use the special server refnum -1, then 
				the log works for all servers.
	LEVEL <levels>		The lastlog levels to send to this log.  
				ALL is the default.

	Options that modify the log's state
	-----------------------------------
	ON			Turn the logfile on.
	OFF			Turn the logfile off.

	Options that modify the log's target list
	-----------------------------------------
	ADD <nick|channel|refnum>[,<nick|channel|refnum>...]
				If the log is of "TARGET" type, then add a 
				list of one or more nicks or channels to the 
				current target list.  If the log is of 
				"WINDOW" or "SERVER" type, then add a list of 
				one or more window or server refnums to the 
				list.
	REMOVE <nick|channel|refnum>[,<nick|channel|refnum>...]
				If the log is of "TARGET" type, then remove a 
				list of one or more nicks or channels to the 
				current target list.  If the log is of "WINDOW"
				or "SERVER" type, then remove a list of one or 
				more window or server refnums to the list.

	Options that modify how the log writes to the logfile
	-----------------------------------------------------
	MANGLE			Change how stuff written to the log will be 
				"mangled".  By default, the logfile will be 
				mangled with /SET MANGLE_LOGFILES.
	REWRITE			Change how stuff written to the log will be 
				"rewritten".  By default, the logfile is 
				rewritten with /SET LOG_REWRITE.

	Other options
	-------------
	KILL			Irreversably destroy a logfile.  Once you kill 
				a logfile, you cannot operate on it again.
	DESCRIBE		Give detailed information about the current 
				state of the logfile.
	LIST			Give brief information about all logfiles.


	Examples:
	---------
	If you wanted to log #epic, you could do something like this:
		/LOG NEW NAME epic-log FILENAME ~/logs/#epic ADD #epic ON
	Then if you wanted to close that log later you could do
		/LOG REFNUM epic-log OFF
	or
		/LOG REFNUM epic-log KILL

	If you wanted to log anything that went to windows 2 or 3:
		/LOG NEW NAME mywinlog FILENAME ~/logs/win23 TYPE windows
		/LOG REFNUM mywinlog ADD 2,3 ON

	If you wanted to log anything that happened on server 2:
		/LOG NEW NAME servlog FILENAME ~/logs/serv2 TYPE servers
		/LOG REFNUM servlog ADD 2 ON

EPIC4-1.1.7

*** News 08/12/2002 -- New keybindings system in place (wd)
        The old keybinding system (keys.c) has been completely rewritten to
        add support for various new functionalities.  It is now possible to
        bind arbitrarily long strings of arbitrary values to binding
        functions, as well as to bind substrings of these to other
        functions.  The META system has been removed as a result of this, so
        you can no longer bind to any META*_* functions.  Also, there is
        no longer a META_STATES set.

*** News 08/12/2002 -- New function $bindctl(...) (wd)
        Another side effect of the new keys system, a bindctl function
        has been added which allows for the creation of new binding
        functions, the retrieval of all currently available functions, and
        other low-level interfaces to the binding system. 

	"FUNCTIONS" are particular keybindings.  You can create your own 
	keybinding which will run arbitrary ircII code, and you may
	bind SEQUENCES to it.

		$bindctl(FUNCTION <name> CREATE <code>)
			Create a new keybinding named <name> that will 
			run <code> whenever it is invoked.

		$bindctl(FUNCTION <name> DESTROY)
			Destroy the keybinding named <name>.  You may only
			destroy keybindings that you created with 
			$bindctl(FUNCTION <name> CREATE ...)

		$bindctl(FUNCTION <name> EXISTS)
			Returns 1 if <name> is a valid keybinding of
			any type (built-in or user-created), and returns
			0 if it is not a valid keybinding.

		$bindctl(FUNCTION <name> GET)
			If <name> is not a valid keybinding, then this
			function returns the empty string.  If <name> is
			a valid built-in keybinding, it returns the 
			string "internal <addr>" where <addr> is a pointer
			to a function in memory and cannot be used by the
			scripter.  If <name> is a user-created keybinding, 
			then it will return the string "alias <code>" where
			<code> is whatever was passed to 
			$bindctl(FUNCTION <name> CREATE <code>)

		$bindctl(FUNCTION <name> MATCH)
		$bindctl(FUNCTION <name> PMATCH)
		$bindctl(FUNCTION <name> GETPACKAGE)
		$bindctl(FUNCTION <name> SETPACKAGE <package>)

	A "SEQUENCE" is a string of one or more characters which, when
	pressed in succession, result in the execution of a FUNCTION.

		$bindctl(SEQUENCE <string> GET)
		$bindctl(SEQUENCE <string> SET <function> [extra])
		$bindctl(SEQUENCE <string> GETPACKAGE)
		$bindctl(SEQUENCE <string> SETPACKAGE <package>)

	A "MAP" is a string of one or more characters which are the leading
	substring to one or more SEQUENCEs.  MAPs are not bound to FUNCTIONs.

		$bindctl(MAP <string> CLEAR)

EPIC4-1.1.6

*** News 07/29/2002 -- New function $killpid(<signal> <pid> [<pid> ...])
	This function sends a signal to another process.  <signal> may either 
	be a signal name (ie, HUP, KILL) or a signal number (ie, 1, 9, 15), 
	and <pid> is a list of one or more pids that you want to kill.  All 
	of the processes are kill(2)ed with the given signal.  The return 
	value is the number of processes that were sucessfully signaled.

*** News 07/29/2002 -- Casualties of IPv6 support
	The following features did not survive the addition of IPv6 to EPIC.
	Please do not ask for these features to be restored.  Such requests
	will not be honored.

	/SET RANDOM_LOCAL_PORTS
		This feature was IPv4 specific.

*** News 07/29/2002 -- (Nearly) Complete IPv6 support
	EPIC now fully supports IPv6 in server descriptions, server 
	connections, $connect(), $listen(), /DCC GET, Virtual Hostnames, 
	$iptoname().  Here are the particulars:

		Server descriptions
			Surround the ipv6 p-addr with square brackets:
			/server [1:2::3]:...

		Server connections
			You can now connect to servers via IPv6!

		$connect(<host> <port> <family>)
			where <family> is "4", "6", "v4" or "v6"
			and <family> is optional.

		$listen(<port> <family>)
			where <family> is "4", "6", "v4" or "v6"
			and <family> is optional.

		/DCC GET
			If you receive a DCC SEND handshake from someone
			else and it uses an IPv6 hostname, you will be able
			to /DCC GET that file.  This is forward compatability.
			Nobody can do /DCC SEND via IPv6 yet.

		Virtual Hostnames
			If the hostname that you choose as your virtual
			hostname has an IPv6 address, then that IPv6 address
			will be used as your virtual host if you connect to
			a server via IPv6.

		$iptoname(<p-addr>)
			Both IPv4 and IPv6 "p-addrs" (ie, A.B.C.D or A::B:C)
			are now supported.

*** News 07/03/2002 -- /STACK now supports keybindings (wd)
	The /STACK command now has added support for keybindings (/BIND).
	The system works in the same manner as the other /STACK types, you
	can push, pop, or list on the bind stack by doing one of
	/STACK (push|pop|list) BIND <keybinding>

*** News 05/26/2002 -- The beginnings of support for IPv6
	On this date I commited the very first set of changes adding 
	infrastructure for IPv6.  If you do not have IPv6 support, EPIC
	may not compile for you until we add compatability shims.  There
	is no timeframe for this -- you may need to stick with EPIC4-1.1.5
	until this conversion is cleared up.

*** News 05/20/2002 -- New functionality to /FE and /FEC
	CrazyEddy needs to document this. =)  Keep a look out in the future
	for updates to this item.

*** News 05/20/2002 -- Clarify distinction between /WINDOW NOSERV and DISCON
	If you do /WINDOW NOSERV, the window is not connected to a server
	and will not be considered connected to a server if you later
	reconnect.  This window should (hopefully) never try to reconnect
	to a server.  If you a /WINDOW DISCON then the window is not connected
	to a server, but it is considered to be disconnected from the server
	so if you later do a reconnect for that server, the window will be
	picked up and re-attached to that server.

*** News 05/20/2002 -- EPIC beginning to move towards protocol independance
	At some point very soon EPIC will start supporting IPv6.  A great
	deal of networking code has been cleaned up in anticipation of this.

EPIC4-1.1.3

*** News 03/12/2002 -- New built in function, $servertype(<refnum>)
	This returns the protocol being used to talk to server <refnum>.
	It's generally either "IRC" or "IRC-SSL".

*** News 03/12/2002 -- The -SSL option removed from /server and /window server
	Don't use this flag any more: specific ssl connections in the
	server-spec or use $serverctl(SET <refnum> SSL 1) (see below)

*** News 03/12/2002 -- New built in function, $getcommands()
	This function works just like $getsets(), except that it returns
	built in command names instead of set names. ;-)

*** News 03/12/2002 -- The -p flag to /DCC is working again.
	If you've noticed things like /DCC SEND nick -p <port> file
	haven't worked, this is just a heads-up to let you know that
	(I think) we fixed that.

*** News 03/12/2002 -- /IGNORE #channel CRAP now ignores QUITs
	This seems pretty straightforward, no?

*** News 03/12/2002 -- "Server-spec" changed, expanded:
	Review: "server-spec" is host:port:pass:nick:group:protocol,
	and everything but 'host' is optional.  Fields are separated
	by colons.

	The "protocol" field has been added.  For now, the only supported
	protocols are "irc" for normal irc connections, and "irc-ssl" for
	SSL-enabled irc connections.

	If one of your fields contains a colon (like the host field, for
	IPv6 addresses, or maybe the password field), you can surround
	that field with double quotes, and the colons inside will not
	be considered the end-of-field.

	Example:
		/server -add irc.epicsol.org:6667:"my:pass":hop

*** News 03/11/2002 -- New built in function, $serverctl()
	The $serverctl() function is a low-level interface to the server
	list and server objects.  With this function you can retrieve 
	and reset specific information about a server refnum.

	$serverctl(REFNUM host:port:pass:nick:...)
	$serverctl(REFNUM host port pass nick ...)
	  This function looks up the server description given and returns
	  that server's refnum.  If the description you give is not in the
	  list, then it is added to the list (ala /SERVER -ADD) and its
	  new refnum is returned.

	$serverctl(REFNUM number)
	  If "number" refers to a valid server refnum, then it will return
	  "number".  If "number" is not valid, it returns the empty string.

	$serverctl(GET <refnum> AWAY)
	  Get server <refnum>'s away message, if applicable.

	$serverctl(GET <refnum> CONNECTED)
	  Returns 1 if you are connected and registered to server <refnum>
	  and 0 if you are not.

	$serverctl(GET <refnum> COOKIE)
	  Returns the TS/4 "cookie" for our connection, if we have one.

	$serverctl(GET <refnum> GROUP)
	  Returns the server group affiliation.

	$serverctl(GET <refnum> ITSNAME)
	  Returns the server's notion of its own name. (This is specified
	  by the server's administrator in the ircd.conf file and reflects
	  the server's logical target name on irc.)

	$serverctl(GET <refnum> NAME)
	  Returns our notion of the server's name (this is what you provided
	  as the "host" field in the server description, and represents the
	  internet hostname that we use to connect to the server.)

	$serverctl(GET <refnum> NICKNAME)
	  Returns your current authoritative nickname.

	$serverctl(GET <refnum> PASSWORD)
	  Returns the password that we use to connect to the server.

	$serverctl(GET <refnum> PORT)
	  Returns the port number we use to connect to the server.

	$serverctl(GET <refnum> QUIT_MESSAGE)
	  Returns the default QUIT message for this server, if any.

	$serverctl(GET <refnum> SSL)
	  Returns 1 if this server tries to establish an SSL connection
	  to the server, and 0 if it does not.

	$serverctl(GET <refnum> UMODE)
	  Returns your "user mode" on the server.

	$serverctl(GET <refnum> USERHOST)
	  Returns what the server thinks your userhost is.

	$serverctl(GET <refnum> VERSION)
	  Returns the server's raw version id string (eg. "2.8/hybrid-5.3p8")


	$serverctl(SET <refnum> AWAY <message>)
	  Sets server <refnum>'s away message.  Takes effect immediately.
	  Returns 1 to indicate success.

	$serverctl(SET <refnum> CONNECTED <ignored>)
	  You cannot change the CONNECTED status; always fails.

	$serverctl(SET <refnum> COOKIE <cookie>)
	  Sets server <refnum>'s TS/4 cookie. DANGER!  Changing the cookie
	  may result in revocation of saved priveleges.  Use with caution.
	  Returns 1 to indicate success.

	$serverctl(SET <refnum> GROUP <groupname>)
	  Sets server <refnum>'s server group affiliation.  Returns 1 to
	  indicate success.

	$serverctl(SET <refnum> ITSNAME <servername>)
	  Sets our notion of the server's own name. !!!DANGER!!! Changing
	  this value will result in undefined behavior; at the very least
	  EPIC will most certainly malfunction when connected to a real 
	  irc server.  Use with EXTREME caution.  Returns 1 to indicate
	  success.
	 
	$serverctl(SET <refnum> NAME <hostname>)
	  Sets the hostname that we use to connect to the server.  This does
	  not take effect until you reconnect.  Returns 1 to indicate success.

	$serverctl(SET <refnum> NICKNAME <nickname>)
	  Changes your nickname to <nickname>.  This takes effect immediately.
	  Returns 1 to indicate success.

	$serverctl(SET <refnum> PASSWORD)
	  Changes the password used to connect to the server.  This does not
	  take effect until you reconnect.  Returns 1 to indicate success.

	$serverctl(SET <refnum> PORT)
	  Changes the port number we use to connect to the server.  This does
	  not take effect until you reconnect.  Returns 1 to indicate success.

	$serverctl(SET <refnum> QUIT_MESSAGE)
	  Sets the default QUIT message for this server.

	$serverctl(SET <refnum> SSL)
	  Set the "SSL enable" flag; if set to 1, epic treats this server
	  as an SSL server and tries to connect to it with an SSL connection.
	  If 0, then it treats it as a normal irc server.  Returns 1 to 
	  indicate success.

	$serverctl(SET <refnum> UMODE)
	  You cannot change your user mode using this just yet.  Always
	  returns the empty string to indicate failure.

	$serverctl(SET <refnum> USERHOST)
	  Changes epic's notion of what the server thinks your userhost is.
	  This is the value used if /SET DCC_USE_GATEWAY_ADDR is set to ON.
	  !!!CAUTION!!! Changing this value could totaly break your ability 
	  to use /DCC if /SET DCC_USE_GATEWAY_ADDR is ON.  Use with caution.

	$serverctl(SET <refnum> VERSION)
	  Sets epic's notion of what the server's raw version id string is.
	  Returns the server's raw version id string (eg. "2.8/hybrid-5.3p8")

	$serverctl(GMATCH <group name>)
	  "Group match" -- Returns a space separated list of all server 
	  refnums that belong to the server group <group name>.

*** News 02/13/2002 -- Completely redesigned /QUEUE command
	The /QUEUE command has been completely revamped and redesigned.
	The old quirky bugs and mis-features and poor design have been
	removed and replaced with a better system.  Forget about how 
	/QUEUE used to work, here is how it works now. =)

	/QUEUE				List the name and size of all pending 
					 queues
	/QUEUE -SHOW			List the name and contents of all 
					 pending queues
	/QUEUE -LIST <name>		List the contents of the <name>d queue
	/QUEUE -FLUSH <name>		Delete the queue and all of its contents
	/QUEUE -DELETE <name> <number>	Delete the <number>th entry in the 
					 <name>d queue; all entries are moved 
					 down one position.  Entries are 
					 counted from number 1.
	/QUEUE -DO <name>		Run the contents of the <name>d queue
					 and delete the queue when done.
	/QUEUE -DO -NO_FLUSH <name>	Run the contents of the <name>d queue
					 but do not delete the contents.
	/QUEUE -EXPAND_NOW <name> { <commands> }
					Expand <commands> now, and then add
					 the result as a new entry to the
					 <named>d queue.  SEE NOTES BELOW.
	/QUEUE <name> { <commands> }	Add <commands> as a new entry to the
					 <name>d queue.
	/QUEUE -HELP			Syntax information for /QUEUE.

	In general, queues are created when you first add a command to them.
	Queues are destroyed when they are run, or when you flush them.  It
	is not an error and you will not get a message if you try to flush
	a queue that does not exist.  If you try to operate on a queue that
	does not have any commands, you will get an error message.  While you
	may be able to get away with specifying flags in combinations other
	than the ones listed above, it is not recommended.

	With that out of the way, you may be asking, "What are /QUEUEs?"
	Queues are named entities into which you can put an arbitrary number
	of commands, which you want to execute all of at some later time.
	The absolutely most obvious use of this is to programmatically 
	create an "unload" feature for a script pack.  Every file can add
	an entry into some named queue to un-do the effects of that script.
	This can be much more effective than /unload, which is rather 
	primitive.

	The old /QUEUE had some big problems; it always expanded your 
	<commands> twice -- once when you added them to the /queue and then
	once again when they were executed.  This subjected your commands to
	"quoting hell" and made using /QUEUE awkward since you had to make
	sure none of your expandos contained more expandos.

	Now /QUEUE will only expand your <commands> once: just before they
	are executed.  Now, you might be thinking "what about $* and $0 and
	$1 and so forth?"  The good news is that /QUEUE saves $* and uses it
	when <commands> is executed.  This means that you _can_ use $* and $0
	and $1 and so on in your <commands>, and they will expand to whatever
	they would have been when you added them to the /queue.  However, any
	OTHER expandos (such as $N or $C or function calls) will all be 
	expanded with their values _just before the command is run_ and NOT
	with the values they had at the time you added the command to the
	/queue!  THIS BREAKS BACKWARDS COMPATABILITY.  If you need backwards
	compatable behavior for some bizarre reason, the -EXPAND_NOW flag is
	available to simulate the original behavior of /QUEUE.  I would urge
	you to only use this as a crutch and to stop using it as soon as you
	can arrange it.

*** News 02/02/2002 -- New special /MSG target, target 0
	If you send a message to target 0 (/msg 0) then EPIC will just
	silently drop the message with no output.  This was done, because
	/REDIRECT 0 is already a "sink"; but now you can use target 0 as
	a "sink" anywhere you might want to go through the motions of
	sending a message but don't actually want messages to be sent.
	For example, /query 0 would accept and discard all "target text"
	Target 0 was chosen because it is an illegal irc target, and because
	/REDIRECT 0 already has these semantics.  Hopefully this should not 
	break anybody.

*** News 02/02/2002 -- New special /MSG targets, @<fileref> and @w<winref>
	Files that you have opened with $open() may now be /msg'd using the
	special syntax /MSG @<fileref> where <fileref> is the return value
	of $open.  You can of course /query @<fileref> or /redirect to it;
	anything that sends a message can use @<fileref> to send to an 
	$open() file.

	Since <fileref> infers by inclusion the ability to write to a
	window or global logfile (see below), you can also /MSG, /QUERY,
	/REDIRECT, or in any other way send a "message" to a window's
	logfile or to the global logfile, with /MSG @w<winref> where 
	<winref> is the window's refnum, or -1 for the global logfile.

*** News 02/01/2002 -- New /WINDOW verb, /WINDOW NOTIFIED
	This window action manually toggles a window's "notified" state.
	A window that is "notified" shows up in the %F status line expando.
	Normally, the "notified" state is set and reset automatically by
	EPIC, but you can change it manually now with this if you wish.

*** News 02/01/2002 -- /SET NOTIFY_INTERVAL 0 now suspends notify.
	If you want to turn off NOTIFY for a while, but you don't want
	to clear your notify list, you can /SET NOTIFY_INTERVAL 0 and
	no NOTIFY activity will occur until you /SET NOTIFY_INTERVAL 
	to some non-zero value.  Remember that the value is in seconds
	and the default is 60 (every minute).

*** News 02/01/2002 -- $channel() value now includes half-op information
	If a user is known to be a half-op, then the '%' character will
	be present in the first position before their nick.  This is the
	position where you would normally see a @ for a channel operator.
	Example:
		$channel() might return		%.NICKNAME
	if "NICKNAME" were a half-op on your current channel.

*** News 02/01/2002 -- New flag to /LASTLOG, /LASTLOG -FILE
	If you want to dump the results of the /LASTLOG command to a 
	file, you can now specify a filename with the -FILE flag. 
	Example:
		/LASTLOG -FILE myfile booya
	will output all lines in your lastlog matching "booya" to the
	file "myfile"

	This is similar in principle to:
		@fd = open(myfile W)
		redirect @$fd lastlog booya
		@close($fd)

*** News 02/01/2002 -- /IF command supports "elif" and "else if" clauses
	In addition to the following supported forms:
               if (expr) ......
               if (expr) {......}
               if (expr) {......} {......}
               if (expr) {......} else {......}
               if (expr) {......} elsif (expr2) {......}

	the following two forms are now supported:
               if (expr) {......} elif (expr2) {......}
               if (expr) {......} else if (expr2) {......}

*** News 02/01/2002 -- New built in functions, $serverourname()
	EPIC keeps track of two different names for every server in your 
	server list: "ourname" and "itsname".  "Ourname" is the name that
	you give to EPIC in the /SERVER or /WINDOW SERVER command or in
	the server file list.  When we are officially registered and
	accepted by the server, the server tells us what "itsname" is,
	this is the name given in the server's M: configuration line.
	This is the name it uses when it refers to itself.  $servername()
	already returns "itsname" [if we know "itsname"] or "ourname" if
	we don't know "itsname" yet.  This function lets you get "ourname"
	at any time, even after registration.

*** News 02/01/2002 -- New built in functions, $servergroup()
	This returns the server's group name that you specified in the
	/SERVER or /WINDOW SERVER command or in the server file list.

*** News 02/01/2002 -- New built in function, $regmatches()
	This is a (slightly) more useful copy of the $regexec() function.
	It takes an extra argument between complied-pattern and string
	indicating the number of matches to return.  Returned matches are
	_not_ expressed as strings, but pairs of numbers which can be
	applied to $mid() to extract the matched substring.  Please note
	that substrings do not refer to multiple occurences of strings.
	At least, not in the glibc implementation I'm using.

*** News 02/01/2002 -- New built in function, $corpattern()
	Whereas $copattern(<pattern> <var1> <var2>) treats $<var1> as a
	list of words, which are matched against <pattern> and whereas
	the corresponding words from $<var2> are returned for each word 
	in $<var1> that is matched by <pattern>...

	$corpattern(<string> <var1> <var2>) treats $<var1> as a list of
	patterns, which are matched against <string>, and the corresponding
	words in $<var2> are returned for each pattern in $<var1> that
	matches <string>

*** News 02/01/2002 -- /ON CTCP_REPLY HAS CHANGED! VERY IMPORTANT!
	Prior to this release, /ON CTCP_REPLY looked like this:
		$0  - Nick who sent the CTCP reply
		$1  - The CTCP command
		$2- - The arguments to the CTCP

	THIS HAS CHANGED AND YOU WILL NEED TO CHANGE YOUR /ON CTCP_REPLY's!
	Now /ON CTCP_REPLY looks like this:
		$0  - Nick who sent the CTCP REPLY
		$1  - Target (nick or channel) to whom the CTCP was sent
		$2  - The CTCP command
		$3- - The arguments to the CTCP

*** News 02/01/2002 -- New flag to /XQUOTE, /XQUOTE -U
	Usage:
		/XQUOTE -U <url encoded string>
	A <url encoded string> is a normal string that may also contain
	%'s followed by two hexidecimal digits.  For each such instance of
	%<hexdigit><hexdigit>, the instance is replaced with the corresponding
	ascii character.  For example, "%20" would be replaced with a space.
	The resulting decoded string is sent to the server as-is.

	This function is useful if you need to send binary or other arbitrary
	data to the server.

*** News 02/01/2002 -- New built in script, 'commandqueues'
	This uses several clever tricks to evade ircII's "quoting hell".
	The following commands are available:

	/1cmd <time> <command>		
		Execute <command>, but only if <command> has not been executed
		already by /1cmd in the previous <time> seconds.

	/qcmd <queue> <command>	
		Add <command> to the end of queue <queue>, which will be 
		executed sequentially in 5 second intervals.  Queues with a
		lower alphanumerical value will be drawn from first, and hence
		have a higher priority.

	/fqcmd <queue> <command>	
		Add <command> to the beginning of queue <queue>, which will 
		be executed sequentially in 5 second intervals.

	/q1cmd <time> <queue> <command> 
		Equivalent to: /1cmd <time> qcmd <queue> <command>
		as long as <command> is not already queued in <queue>

	/fq1cmd <time> <queue> <command>
		Equivalent to: /1cmd <time> fqcmd <queue> <command>
		as long as <command> is not already queued in <queue>

	Commands are executed in "literal" form (not subject to "quoting hell")

*** News 02/01/2002 -- $uhc(), $mask(), and /ignore handle userhosts different
	It is a bug for these to behave any differently from before except in
	the case of a hostname with no dot in it, in which case they behave
	more appropriately by not inserting eroneous dots and stars into said
	hostname, as before.

*** News 02/01/2002 -- SSL support merged from the EPIC4-SSL project
	Read the "README.SSL" file for some more information about the
	particulars of SSL support, but here is a general overview:

	When configuring EPIC before building it, to include SSL support:
		./configure --with-ssl=/path/to/your/ssl/stuff
	If you want to use SSLv2 instead of SSLv3 (the default), use:
		./configure --with-ssl-ver=v2

	To connect to a server using SSL:
		/WINDOW SERVER -SSL <SERVERNAME>
	(You cannot currently connect to an SSL server at startup time.)

	New built in functions:
	    $ssl()
	      Returns 1 if SSL server connections are available, 0 if not.
	    $isencrypted()
	    $isencrypted(<servref>) 
	      These return 1 if the server refnum (or current server)
	      are SSL server connections, 0 if they are not.
	    $cipher()
	      Returns cipher information for an SSL server connection.

	New hook:
	    /ON SSL_SERVER_CERT
		  $0  - server name
		  $1  - certificate subject (urlencoded)
		  $2  - certificate issuer (urlencoded)
	    It is up to the scripter to accept or reject server certificates.

	New status bar expando:
	    The %| status bar expando will expand to either the value of
	      /SET STATUS_SSL_ON or /SET STATUS_SSL_OFF depending on whether
              the connection is SSL-enabled or not.

	New built in /SETs:
	    SSL_CERTFILE  - Path to certificate for SSL-enabled connections
	    SSL_KEYFILE   - Path to key file for SSL-enabled connections
	    SSL_PATH      - <I don't know what this does>
	These sets do not do anything at the current time but probably will
	be used in the future.
	    STATUS_SSL_ON  - What %| will be for SSL server connections
	    STATUS_SSL_OFF - What %| will be for non-SSL server connections

*** News 02/01/2002 -- /ENCRYPT command takes additional argument
	The /ENCRYPT command may now be used in a couple of new ways:
		/ENCRYPT <target> <password>
		/ENCRYPT <target>,<sender> <password>
		/ENCRYPT <target> <password> <program>
		/ENCRYPT <target>,<sender> <password> <program>

	The nickname argument may now be a wildcard pattern; but only if it
	is in the format:
		<target>,<sender>
	where <target> is a channel, or your own nickname, and <sender> is
	a full <nick>!<user>@<host> prefix.  

	The /encrypt command can take an additional <program> argument after
	nick and key, which will be run to encrypt and decrypt your messages.
	Two usable example scripts have been supplied which use GNU Privacy 
	Guard in symetric encryption mode.  

	Example:
		/encrypt #epic,*!*@epicsol.org keypass mycrypto
	Would decrypt any messages sent to #epic by anyone at *!*@epicsol.org
	with the "mycrypto" program using the password "keypass"

*** News 02/01/2002 -- New built in function, $encryptparm()
	The $encryptparm(<nick>) function will return the command line
	argument that was passed to the /ENCRYPT command when you first
	established the encrypted conversaion with <nick>

	Example:
		$encryptparm(#epic,hop!jnelson@epicsol.org)
	might return, using the above example...
		#epic,*!*@epicsol.org keypass mycrypto

	This is likely to be useful for public key crypto scripts.

*** News 02/01/2002 -- Change to $trunc(0 <num>) : it now returns an integer
	$trunc(0 <num>) returns the integer <retval> with the largest absolute 
	value that lays between <num> and 0.  In other words, $trunc(0 <num>) 
	returns <num> with the decimal point and anything after it removed.

*** News 02/01/2002 -- New math built in functions $ceil(), $floor(), $abs().
	$ceil(<num>) -- Returns the smallest integer that is greater than or 
			equal to <num>
	$floor(<num>) -- Returns the largest integer that is less than or
			 equal to <num>
	$abs(<num>) -- Returns the absolute value of <num>

*** News 02/01/2002 -- Ability to use $write(), $writeb() to logfiles
	Currently, you can use $write(<fd> <text>) to write a line of <text>
	to the file <fd> where <fd> was previously returned by $open().
	But if you want to write to a window's logfile, you can do that by
	replacing <fd> with the literal character "w" followed by the window
	refnum.  As a special case, "w-1" refers to the global logfile.
	Please remember that window refnum 0 is always the current window.  

	Example:
		@ write(w-1 This text will go to the global logfile)
		@ write(w3 This text will go window 3's logfile)

*** News 02/01/2002 -- New /ON, /ON GENERAL_PRIVMSG
	Arguments:
		$0  - Nickname who sent the privmsg
		$1  - Target (nickname/channel) the privmsg was sent to
		$2- - The privmsg itself.

	If you catch this hook silently (/ON ^GENERAL_PRIVMSG), then 
	/ON PUBLIC_MSG, /ON MSG_GROUP, /ON MSG, /ON PUBLIC, and 
	/ON PUBLIC_OTHER will not be hooked for the same privmsg.

*** News 02/01/2002 -- New /ON, /ON GENERAL_NOTICE
	Arguments:
		$0  - Nickname/server who sent the notice
		$1  - Target (nickname/channel) the notice was sent to
		$2- - The notice itself.

	This hook is offered after /ON KILL or /ON OPER_NOTICE (if they
	apply), but before /ON SERVER_NOTICE, /ON NOTICE, and /ON PUBLIC_NOTICE
	are offered.

*** News 12/19/2001 -- New /SET, /SET ALLOW_C1_CHARS (defaults to OFF)
	The ascii characters 128 to 159 on many terminal emulators
	(especially GNU Screen and XTerm) have special control meanings
	which can be disasterous for users.  EPIC has traditionally allowed
	you to output characters in this range without question.  However,
	due to many requests, a /SET has been added.  Characters in this
	range will be stripped out if this /SET is off.  Otherwise, the
	traditional behavior will be retained.  This is a deviation from 
	traditional practice, but it is an important deviation, as it will
	protect most users from rogue users.

*** News 12/19/2001 -- ROM_CHAR functionality removed
	A little known feature of EPIC, the ^R attribute, could be followed
	by three ascii digits, and the decimal number following the ^R
	attribute would be inserted into the output at that point.  It was
	vulnerable to exploitation by outside attackers, and is very 
	difficult to secure against exploitation.  For this reason, the
	feature has been removed until we can figure out how to properly
	implement it.  If you used this feature, I apologize, but it is for
	the greater good that we must remove this feature for now.

*** News 12/19/2001 -- New option to $info(), $info(i)
	The $info(i) built in function will return the "commit_id" value
	for the version of epic you're using, which is a monotonically
	increasing integer value which changes every time a changes is
	made to epic's source.  This value is important whenever you 
	report a bug about epic.

*** News 11/14/2001 -- Final conversion to the new epic mailing list
	For a while now we have been using list@epicsol.org, but
	the epic sources still refered to ircii-epic@concentric.net.
	That old list is now officially deceased and is no longer in
	operation and should not be used.  Eventually it will go away.

*** News 11/14/2001 -- Support for ~/.epicrc file
	LET ME JUST START BY SAYING THIS IS NOT MODELED AFTER BX.
	Some of you use both epic and ircII and you would like to be
	able to keep separate .ircrc files and .epicrc files.  Now you
	can do that.  If you have a ~/.epicrc file, then epic will load
	that and WILL NOT LOAD your ~/.ircrc.  If you do not have a
	~/.epicrc file, then epic will load your ~/.ircrc as it always
	has.  The EPICRC environment variable is accepted; it behaves
	in the same way as the IRCRC environment variable.

*** News 11/14/2001 -- Color support has changed somewhat
	Before this date, color handling was done by reacting to each
	attribute change.  For example, a ^B either turned bold on, or
	it turned it off.  But EPIC didn't keep track of ther attributes,
	and on some systems, turning bold off turned reverse and color off.
	Also, turning on color turned off reverse and bold.  Many scripts 
	have come to kludge around this by "assuming" that turning certain 
	things on (like color) or off (like bold) had side effects on other
	attributes.  This was never intentional and it is certainly confusing.
	On this date, a new attribute parser was introduced that does not
	impose *any side effects whatsoever* on attribute changes.  If you
	change colors, it will NOT turn off bold or reverse.  If you turn off
	bold it will NOT turn off colors or underline.  If you turn on bold,
	it will NOT turn off colors.  Each attribute (bold, underline,
	reverse, flash, color) are handled independantly and separately.
	Each time you turn an attribute on or off, only that attribute is
	affected.  The sum result of what you see on the screen is then
	the cumulative effect of all the attributes which are on.  This
	means if you turn bold on and then turn on color, you will get 
	bold color.  If you turn on reverse and turn on color, you will 
	get reversed colors.  If you turn on reverse, turn on color, then
	turn off color, you will still have reverse!  Hopefully this will
	make everything much more sane and clean.

*** News 11/13/2001 -- Resizable wserv support (wserv4), /SET WSERV_PATH
	I backported the implementation of wserv4 from EPIC5.  The main
	features of wserv4 are that it uses two channels of communication
	to talk to epic, and it can support independant resizing of each
	screen.  Until now, all of your /window create screens had to be 
	exactly the same size as your main screen or they wouldn't work.  
	That restriction has now been removed.  All of your screens can be
	of whatever size you wish and you can resize them at will.  There
	is a new /SET available,  /SET WSERV_PATH which points to whatever
	wserv you want to use.  By default it points to epic's wserv, but
	just in case your sysadmin didn't install wserv4, you could 
	compile it yourself and /SET WSERV_PATH to it.

*** News 11/13/2001 -- /FLUSH now uses the "redirect sink"
	Until now, /FLUSH worked by actually throwing away all data from
	the server until there was a 1 second pause.  Since none of this
	data was processed, if things like JOINs or QUITs or KICKs were
	thrown away, the client could become terribly confused and possibly
	even crash.  This has changed: now the /flush command does not
	throw away all input from the server, but instead just suppresses
	all output for the current server command.  This means that all of
	your /on's will still be processed, but you won't have to see the
	output (if you were doing a /who ** or a /links for exmaple).
	Bottom line: it is now safe to do /flush again!

*** News 11/13/2001 -- The "redirect sink" -- target 0, and practice uses
	You may now do /REDIRECT 0 to suppress all output from a server
	command.  Target 0 is called the "redirect sink" and any output
	that is redirected to it will NOT be displayed.  This technique
	is very useful for trapping only a few /on's for a complex query
	(such as /whois) and not having to worry about extra/unknown 
	numerics cluttering up the user's screen.  Consider this:

			on ^318 * { @count++ }
			redirect 0 whois hop

	Normally, if you were to do "whois hop", you would see all the other
	numerics, which would be ugly if you're trying to catch the whois
	replies with /on's.  This is especially true for networks which use
	extra numerics in their whois replies that your script may not know
	about.  So if you just /redirect 0 your server queries, then any
	/on's that you don't catch that would otherwise send output to the
	user's screen will redirect their output to the "sink", ie, it will
	not be displayed.  This should make it much easier to script whois
	replies.

*** News 11/12/2001 -- /TIMER, /PAUSE now have sub-second resolution
	Previously, /TIMER and /PAUSE have had whole-second granularity.
	This means that when you asked for a timer to go off in N seconds,
	the timer would actually go off in N seconds, give or take one second
	(the resolution).  This was because the I/O looper in EPIC only worked
	on whole-second granularity.  The I/O looper has been rewritten to
	use microsecond resolution, so now /TIMER and /PAUSE will go off in
	N seconds, give or take a microsecond.  This also allows you to 
	specify sub-second resolution:  You can do /timer 1.5 ... and your
	timer will go off in 1.5 seconds, not 1 second, not 2 seconds.

*** News 11/12/2001 -- Changes to /SETENV let you unset environment variables
	You may now unset environment variables with the /SETENV command by
	prefixing the environment variable name with a single hyphen and by
	omitting the second argument, like so:
		/SETENV -IRCSERVER
	You can still set an environment variable that starts with a hyphen:
		/SETENV -FOO one two three
	You can unset an environment variable that starts with a hyphen:
		/SETENV --FOO
	You can set an environment variable with no value:
		/SETENV EMPTYVAR
	but you can't set an empty environment variable that starts with
	a hyphen (sorry).  If anyone ever finds that they actually need to
	be able to do this, let me know and we'll work something out.

*** News 11/12/2001 -- New built in functions for file manipulations
	Several new functions have been added to help you manipulate files
	that are opened with $open().

	$fskip(<fd>)
	   This function reads the next line of the file and discards it.
	   It returns the end-of-file condition of the file after the read.
	   If <fd> is not a valid file, -1 is returned.

	$fseek(<fd> <numbytes> <whence>)
	   This function changes the file position indicator.  The file
	   position indicator is moved <numbytes> (a 31 bit signed number)
	   away from <whence>, which is a symbolic anchor with the following
	   possible values:
		SET	Move <numbytes> from the beginning of the file
		CUR	Move <numbytes> forward or backward from the
			current file position indicator
		END	Move <numbytes> forward or backward from the
			end of the file.
	   <numbytes> can't be greater than 2GB, and this is a limitation
	   in the fseek(3) interface, so don't complain to me about it.
	   If a seek error occurs, -1 is returned and $error(<fd>) will
	   return 1.  If <fd> Is not a valid file, -1 is returned.

	$frewind(<fd>)
	   This function sets the file position indicator to the beginning
	   of the file.  It is the same as $seek(<fd> 0 SET).  If <fd> is
	   not a valid file, -1 is returned.

	$ferror(<fd>)
	   This function returns the file error indicator, either 0 or 1.  
	   This is set whenever any error occurs and can be cleared by 
           resetting the file position indicator.  If <fd> is not a valid
	   file, -1 is returned.

	$isfilevalid(<fd>)
	   This function returns 1 if <fd> is a valid value previously 
	   returned by $open() and returns 0 otherwise.

EPIC4-1.1.1

*** News -- Nov 9, 2001 -- New built in function, $unsplit(<sep> <word list>)
	Unsplit takes two arguments, a separator string and a word list.
	The return value is each word in <word list> separated by <sep>
	instead of by spaces.  Multiple spaces will be condensed into one
	<sep>.  This is intentionally useful for creating channel lists 
	to pass to /join.  See the example in /WINDOW REJOIN for good ideas.

*** News -- Nov 9, 2001 -- New math functions added (crazyeddy)
	The following built in math functions have been added.  

		$acos(number)		Arc cosine
		$acosh(number)		Inverse hyperbolic cosine
		$asin(number)		Arc sine
		$asinh(number)		Inverse hyperbolic sine
		$atan(number)		Arc tangent of one variable
		$atan(number2 number2)	Arc tangent of two variables
		$atanh(number)		Inverse hyperbolic tangent
		$cosh(number)		Hyperbolic cosine
		$exp(number)		Exponential value
		$jn(int number)		Bessel function of the first kind
					of the integer order [int]
		$log(number)		Natural logarithm
		$log10(number)		Base-10 logarithm
		$sinh(number)		Hyperbolic sine
		$tanh(number)		Hyperbolic tangent
		$yn(int number)		Bessel function of the secnod kind
					of the integer order [int]

	All of these functions may return a "RANGE" or a "DOMAIN" error,
	the nature of which is different for each function.  In case of
	a "RANGE" error, the return value of the function shall be the
	string "RANGE".  In case of a "DOMAIN" error, the return value of
	the function shall be the string "DOM".  If no error occurs, then
	a floating point number is returned in "%f" printf format.

*** News -- Oct 24, 2001 -- Support for channel mode +M (adm)
	Support for Dalnet's channel mode +M, which prohibits non-registered
	users from sending privmsgs to the channel, was added on this date.

*** News -- Oct 24, 2001 -- New built in /set, /SET AUTO_REJOIN_CONNECT
	Normally when you are disconnected from a server, and epic is able
	to immediately reconnect to a new server, epic will rejoin all of
	the channels you were on at the time you were disconnected.  
	Some scripters do not like this behavior and would prefer that EPIC
	not get in their way.  This /SET permits you to turn off the auto-
	channel-rejoin feature and puts the responsibility for rejoining
	channels on connect entirely on the script; EPIC will NOT interfere.

	This /SET does not make epic capable of joining channels it does
	not otherwise have the capability of rejoining.  It only permits
	scripters a way to turn off the auto-rejoin-on-reconnect feature.

*** News -- Oct 9, 2001 -- $querywin() now takes an optional server argument
	Previously, $querywin() only took a nickname and returned any
	window with a query to that nickname regardless of the server.
	But if you need to get the query window for a nick on a particular
	server, you may now specify the server refnum as the SECOND argument.
	For example, $querywin(hop 2) would only return the window refnum
	for a query you have with "hop" on server refnum 2.  The argument
	must be a server refnum (not a server name).  If you do not give
	a server refnum, backwards compatability is retained.

*** News -- Oct 9, 2001 -- General speed improvements (crazyeddy)
	Crazyeddy has spent a lot of effort in improving the speed of
	epic's string handling.  This means EPIC should be even faster
	than ever.  Much thanks go to him for his dilligent hard work!

*** News -- Oct 9, 2001 -- New standard script, 'autoget'
	I was asked one too many times "how do i turn on autoget in epic?"
	Well, just /load autoget and you will get the /autoget command.

	Usage:
		/autoget	
			See the patterns you are autogetting.
		/autoget <pattern> [<pattern>]
			Automagically dcc get any file offered to you 
			that matches the specified pattern(s).  You can
			autoget as many patterns as you want.
		/autoget -<pattern> [-<pattern>]
			Remove the pattern(s) from the autoget list.
		/unload autoget
			Get rid of the /autoget alias and don't do any
			more autogetting.

*** News -- Oct 9, 2001 -- New standard script, 'altchan'
	I was asked one too many times "why can't i do <alt>-<number> to 
	switch between my windows like in BitchX?"  Well, just /load altchan
	and you will have this functionality.  This requires that your 
	terminal emulator treats <alt>-<char> as <escape>-<char>, which 
	applies to most of the people who ask this question. ;-)

*** News -- Oct 9, 2001 -- /JOIN command uses /WINDOW REJOIN now
	The /JOIN built in command now uses /WINDOW REJOIN as its internal
	implementation, instead of /WINDOW CHANNEL.  You should now refer
	to /WINDOW REJOIN for details of how the /JOIN command works.  This
	is an improvement, for the record. ;-)

*** News -- Oct 9, 2001 -- New /WINDOW command, /WINDOW REJOIN
	The /WINDOW REJOIN command can be used to join channels and 
	is sensitive to your window bindings.  Here is how it works:

		/WINDOW REJOIN <#channel>[,<#channel>]

	For each channel you list, for the current server,
	* If we are on the channel
	  * If the operative window is connected to the current server
	    -> Move the channel to the operative window.
	  * If the operative window is NOT connected to the current server
	    -> Do nothing (fail silently)
	* If we are NOT on the channel
	  * If there is a window that claims to own this channel (bound)
	    -> Join the channel and put it in that window.
	  * If there is NOT a window that claims to own this channel
	    * If the operative window is connected to the current server
	      -> Join the channel in the current window
	    * If the operative window is not connected to the current server
	      -> Join the channel and put it in any window we find that is
		 connected to the current server.

	It is expressly implied that you can use /WINDOW REJOIN inside of
	an /ON and that the channel(s) will *NOT BE REMOVED* from their
	bound window(s), if any.  What this means is that you can now do
	something like this:

	alias join_channels_in_new_server (server, ...) {
	    if (![$*]) { return }
	    window new server $server rebind $0
	    fe ($1-) x { window new rebind $x }
	    ^on ^connect $server join $unsplit(, $*)\;^on connect -server
	}

*** News -- Oct 9, 2001 -- New /WINDOW command, /WINDOW REBIND
	The /WINDOW REBIND command is to be used when you wish to bind
	a channel to a window unconditionally.  Typically, /WINDOW BIND
	will fail if you try to bind a channel other than the current
	channel, but /WINDOW REBIND does not fail.  If you are on the
	channel, then the channel is forcibly made the current channel.
	This command is suitable for use in /ON CONNECT where you may
	want to bind channels to windows before /WINDOW REJOINing them,
	and making sure they go to the window you expect.

*** News -- Oct 9, 2001 -- How to specify server groups in ircII.servers
	The format of the "ircII.servers" file has been improved somewhat.
	You may now include blank lines in the file, and you may include
	comment lines that begin with #.  You can include a server group
	name in square brackets on a line all by itself, and every server
	description that follows it will use that server group as a default.
	You can provide as many different server groups as you like.

	Example ircII.servers file:
		# The two efnet servers I can connect with.
		[efnet]
		irc.prison.net
		irc.east.gblx.net

		# Undernet server round robin
		[undernet]
		irc.us.undernet.org
		irc.eu.undernet.org

		# Dalnet round robin
		[dalnet]
		irc.dal.net

*** News -- Oct 9, 2001 -- Server groups are optional.
	Don't worry -- the changes below are all backwards compatable.
	You will see no change unless and until you are ready to start
	using them.  By default, all servers are put into the "default"
	server group, and epic will behave exactly as it always has.
	Only those server that you explicitly put into a different group
	will not be part of the "default" group, and act differently.

*** News -- Oct 9, 2001 -- [OBSOLETE] Server groups cannot be changed.
	[Previous documentation regarding the inability to change server
	 groups is now obsolete and is hereby removed.  Use $serverctl()
	 to change server groups].

*** News -- Oct 9, 2001 -- How to specify server groups with /SERVER
	The /SERVER and /SERVER -ADD and /WINDOW SERVER commands take a 
	"server description", which is a single word with multiple
	fields separated by colons.  The first four fields are the
	same as ircII: hostname, portnum, password, and nickname.  
	But you can now provide a fifth field, which will be the server
	group that description should belong to.

	Examples:
		/server irc.prison.net::::efnet
		/server -add irc.east.gblx.net:6666:::efnet
		/server -add irc.us.undernet.org:6660:::undernet
		/server -add irc.eu.undernet.org:6665:::undernet
		/window server irc.dal.net:7000::myregisterednickname:dalnet

*** News -- Oct 9, 2001 -- Server group support (specced by srfrog)
	Whenever you are disconnected from a server, epic tries to reconnect 
	you to the same server.  But if it is unsucessful, then it tries to 
	connect you to the "next" server.  Sometimes, however, the "next"
	server is on another network, and so you, your windows, and your
	channels are rudely dumped onto another network that you didn't 
	want to be on.  This has been a constant source of irritation for
	users.  Well, now you can control this behavior more closely.

	Whenever epic is disconnected from a server, it will only reconnect
	to servers that belong to the same "server group" as the disconnected
	server.  Any server that belongs to another server group will be
	"skipped" and epic will NOT try to connect to it.  EPIC will still go
	through your server list only once.  If EPIC cannot find a server in
	the same group to connect to, it will tell you to use the /SERVER 
	command to reconnect.

*** News -- Oct 9, 2001 -- New built in function, $ishalfop()
	The $ishalfop() function takes two arguments; a nickname, and a 
	channel, and returns 1, 0, or -1 depending on whether the person 
	is a half-op, the person is not a half-op, or we do not know if 
	the person is a half-op or not.  "Half-op" is a hybrid thing.  
	If you don't understand why EPIC wouldn't know if someone is a
	half-op or not, see the docs for $isvoice().

*** News -- Oct 9, 2001 -- New built in function, $igetrmatches() (crazyeddy)
	Crazyeddy wrote this, and I don't know what it does.  Maybe
	he would like to document it.

*** News -- Oct 9, 2001 -- New flags to the /LASTLOG command
	Someone reported a crash in the /lastlog command, and rather than
	just try to fix a mundane bug, we decided to have a little more fun
	and take this opportunity to rewrite the /lastlog command like we
	had been planning to do forever.  Throw out everything you know
	about the lastlog command, here is how it works!  (Brief summary:
	Every argument now has an option flag to go with it if you want to
	use it; backwards compatability is retained; the -regex option 
	lets you do regex matching (instead of, or in addition to ircII 
	matching.)

 * The /LASTLOG command:
 * Syntax:
 *      /LASTLOG [options] [<string>] [<number1> [<number2>]]
 * Options:
 *      -                       Do not show header and footer
 *      -reverse                Show matches newest-to-oldest (reverse order)
 *                              instead of oldest-to-newest (normal order)
 *      -literal <pattern>      <string> is search target, not option.
 *      -regex <regex>          line must match <regex>.
 *      -max <number>           Only show first <number> matches
 *      -number <number>        Start at the <number>th recent entry.
 *      -skip <number>          Skip this many leading lastlog entries
 *      -<LEVEL>                Add <LEVEL> to "level mask"
 *      --<LEVEL>               Remove <LEVEL> from "level mask"
 *      -ALL                    Add all levels to "level mask"
 *      --ALL                   Reset/clear the "level mask" <default>
 *      <pattern>               <pattern> is search target
 *      <number1>               Start from the <number1>th most recent record.
 *      <number2>               Continue <number2> more records after that.
 *
 * The /LASTLOG command shows all of the lines that have appeared to your
 * window's lastlog; the oldest one first, and the newest one last, except
 * that the following seven restrictions apply IN THIS ORDER:
 *      1 If the -reverse option is specified, lines will be shown in
 *        "reverse order", that is the newest one first, and the oldest
 *        one last.
 *      2 If any of the "LEVEL" options (including ALL) are specified,
 *        then the line must have one of the lastlog levels specified
 *        by the "level mask".
 *      3 If the -number option is specified only the most recent <number>
 *        lines will be looked at.
 *      4 If the -skip option is specified, the first <number> lines after
 *	  the start (either the oldest entry, or whatever you specified 
 *	  with the -number option) will be skipped (will not be looked at).
 *      5 If the -literal option is specified, some portion of the line
 *        must be matched by the pattern <pattern>.
 *      6 If the -regex option is specified, some portion of the line
 *        must be matched by the regex <regex>.
 *      7 If the -max option is specified, only the first <number> matching
 *        lines will be shown; others will be suppressed.
 * Furthermore:
 *      * The "level mask" is turned off by default which means that all
 *        rule #2 doesn't apply.  --ALL forcibly turns off the level mask.
 *      * "LEVEL" options are cumulative and sequential.  That means that
 *        if you turn off a level and then later turn it back on, it will
 *        be on.  If you turn off all options with --ALL and then turn
 *        some back on, those after --ALL will be on.
 *      * Up to three naked options may be specified for backwards
 *        compatability with ircII.  The very first naked parameter that
 *        is not a number is considered to be the argument to the -LITERAL
 *        option.  The second naked parameter had better be a number and
 *        it is taken as the argument to the -NUMBER option.  The third naked
 *        parameter also needs to be a number and is taken as the argument
 *        to the -SKIP option.  This can get confusing; always use the
 *        options in scripts -- only use backwards compatability options
 *        at the input prompt. ;-)

*** News -- Oct 9, 2001 -- Random local port usage support improved.
	Some of the more paranoid of our epic bretheren were very unhappy
	that /set random_local_ports did not co-exist with firewall holes.
	The purpose of /set random_local_ports has been changed somewhat.
	If it is OFF (traditional behavior), then epic will continue to 
	ask the operating system for a local port number to use for things
	like dcc sends and so on.  Some systems (like openbsd) return a 
	random local port automatically, and so you never need to /set this
	to ON.  Other systems (like linux) return local ports sequentially,
	and so you may want to /set this ON.

	When /set to ON, EPIC will attempt to determine your "port range".
	On Linux, we read "/proc/sys/net/ipv4/ip_local_port_range" to get 
	the local port range, and then choose up to 5 random numbers within
	that range.  If we fail 5 times, we ask the kernel to give us a port.
	If you use a firewall, you need to make sure you properly configure
	that file so that EPIC can properly find a random port!

	On 4.4BSD systems, we first check the EPIC_USE_HIGHPORTS environment
	variable.  If it is set, then we use sysctl to figure out what the
	"high port range" is, and we choose up to 5 random numbers within
	that range.  If we fail 5 times, we ask the kernel to give us a port.
	If you are using a firewall, you need to make sure you properly 
	configure your sysctl settings so EPIC can properly find a random port!
	If EPIC_USE_HIGHPORTS is not set, then epic uses syctl to figure
	out what the "normal port range" is.

		Operating System:	What you need to configure:
		-----------------	---------------------------
		    Linux              /proc/sys/net/ipv4/ip_local_port_range
		    FreeBSD	       sysctl net.inet.ip.portrange.first
		    		       sysctl net.inet.ip.portrange.last
		    		       sysctl net.inet.ip.portrange.hifirst
		    		       sysctl net.inet.ip.portrange.hilast
		    OpenBSD            sysctl net.inet.ip.portfirst
		    		       sysctl net.inet.ip.portlast
		    		       sysctl net.inet.ip.porthifirst
		    		       sysctl net.inet.ip.porthilast

*** News 10/09/Y2K+1 -- Perl support; new built in functions (crazyeddy)
	This sews a perl interpreter (libperl) into the epic binary and
	adds bridges between the ircii and perl programming environments.
	$perl(), $perlcall() and $perlxcall() have been added to the ircii
	language.  EPIC::eval, EPIC::cmd and EPIC::expr are available for
	doing stuff in epic from the perl environment.

*** News 10/09/Y2K+1 -- Bunch of new updates
	Everything for EPIC4-1.1.1 was documented here...

EPIC4-1.0

*** News 03/14/Y2K+1 -- New flag to /xecho, /xecho -v
	This will output the line to a visible window.  No guarantees
	are made to which visible window it will be output, only that
	the window *will* be visible.  In practice, it's usually the 
	topmost window on your main screen.  That's not a promise, however.

*** News 03/07/Y2K+1 -- New form of the /FOR command, "FOR NEXT"
	The for command now supports a FOR .. NEXT type loop.
	Syntax:
	    /FOR <var> FROM <min> TO <max> [STEP <step>] { <commands> }

	Semantics:
	    Consider a list of integers:
		(<min>, <min> + <step>, <min> + <step> + <step>, ..., <max>)
	    For each member of that list, assign that integer value to 
	    $<var> and execute the { <commands> } set.

	Example:
	    /FOR i FROM 1 TO 5 { echo $i }
	will output:
	    1
	    2
	    3
	    4
	    5

	Example:
	    /FOR i FROM 1 TO 5 STEP 2 { echo $i }
	will output:
	    1
	    3
	    5

	Special note:  This is much cheaper than a traditional /for loop
	 that does the same thing, or a /fe loop over the return value of
	 the $jot() function that does the same thing.

	Special note:  The /CONTINUE and /BREAK commands are honored in
	 the command body.  The /CONTINUE command will behave as a "next"
	 operation, and the /BREAK command will abort the command entirely.

*** News 03/07/Y2K+1 -- New form of the /FOR command, "FOR IN"
	The for command now supports a FOR .. IN LIST type loop.
	Syntax:
	    /FOR <var> IN (<word list>) { <commands> }

	Semantics:
	   Consider the list of ``extended words'':
		(<word list>)
	   For each member of that list, assign that string value to
	   $<var> and execute the { <commands> } set.

	Example:
	   /FOR i IN (one two three) {echo $i}
	will output:
	   one
	   two
	   three

	Special note:  This acts as a cheap version of the /fe command
	 for those cases where you need to iterate over each word at a time.

	Special note:  The /CONTINUE and /BREAK commands are honored in
	 the command body.  The /CONTINUE command will behave as a "next"
	 operation, and the /BREAK command will abort the command entirely.

*** News 02/05/Y2K+1 -- New /ON, /ON ERROR
        When the server sends you an ERROR (or ERROR:) protocol message,
        this /on is hooked with the arguments:
                $0      The server that sent you the ERROR
                $1-     The error message itself

*** News 02/05/Y2K+1 -- Formal removal of old, long-broken feature
        A feature many of you probably never knew existed was carried over
        from ircII.  When output occurs to a window, the cursor is supposed
        to "hang" in that window for a second and then return to the input
        buffer, or when you press a key, whichever happens first.  About
        six years ago I mangled that feature so that it did not work
        correctly, and quite a few people expressed happiness with the 
        removal of the feature.  Well, it never was really removed, it
        was just bludgeoned into non-operation.  I have now removed the
        remnants of the code that still existed.  Don't ask me to put this
        feature back.  Most people hate it. ;-)

*** News 02/05/Y2K+1 -- New built in command, /DEFER
        There are some circumstances in which it is dangerous to execute a
        command.  In these vulnerable circumstances, epic may break, or 
        even crash if you execute certain commands.  The /DEFER command is 
        a general purpose way to ask epic to execute some number of commands
        later one when it is "safe" to do so.  The mechanism by which this
        works is intentionally unspecified because I expect it will change.
        But you can be assured epic will not execute your command until it
        knows that it will not crash doing so.

        A list of circumstances under which you will need to use the /DEFER
        command will be compiled and put up at http://www.epicsol.org/DEFER
        and new entries will be added as discovered.  In general, if you find
        that executing a certain command in an /on causes epic to crash, 
        you should FIRST TRY TO /DEFER IT.  Then if it continues to make 
        epic crash, then it is probably a bug.

*** News 02/05/Y2K+1 -- EPIC handles disconnections differently now
        Up until this time, ircII (and epic) have sometimes closed your 
        server connection earlier than is truly neccesary, as in when you
        get a 437 numeric, or a KILL message.  EPIC has been changed so
        it will never close the server's connection on you unless you tell
        it to explicitly.  Instead, EPIC will wait for the server to close 
        the connection and will then reconnect at that time.  This permits 
        you to see important information, such as the K-line reason after
        a 437 numeric on dalnet, for example.  Reconnections in general are
        much more reasonably handled, which is a nice side effect!

*** News 01/15/Y2K+1 -- DCC Checksum feature has been recalled
        The DCC Checksum feature, which it seems everybody loathes and hates
        has been recalled ahead of schedule.  It was originally scheduled to
        disappear silently in EPIC5, but because DCC Checksum tripped over
        several bugs in the FreeBSD libc, I decided just to throw the whole
        thing overboard and be done with it once and for all.  I apologize 
        to anyone who actually was mistaken into thinking this was a useful
        feature.

*** News 12/01/Y2K -- EPIC sanity checks your windows/channels/servers
        Very frequently, epic will sanity check the referential integrity
        of your channels, windows, and servers.  What this means to you, the
        user, is that if epic ever detects that windows and channels do not
        properly refer to each other, or if windows and servers do not 
        properly refer to each other, or if channels and servers do not
        properly refer to each other, epic will immediately panic and abort,
        telling you exactly what went wrong.  You should submit a bug report
        in the normal way whenever you get one of these messages.

        The benefit of this is that if you see any behavior that looks like
        epic has gotten confused regarding how your windows/channels/servers
        are interacting, that is either the correct behavior, or it is a bug.
        But there are many circumstances in which epic can determine that 
        things are messed up and automatically fix them.  This will result in
        fewer window/channel/server mixups in the future.

*** News 09/28/Y2K -- New set, /SET SWITCH_CHANNELS_ON_PART
        Traditionally, when you use the /PART command (ie, /LEAVE), the
        client will automatically do a /PARSEKEY SWITCH_CHANNELS for you,
        to make another non-current channel the current channel in the
        window.  If you do not like this behavior, you can /SET this value
        to OFF and when you /PART a current channel, your window will be
        left current-channel-less.  It's important to note that this may
        result in a window having one or more non-current channels and no
        current channels.  That is expressly the intent of this /SET.

        Also note that this /SET is exclusively for the EPIC4-1.0.* branch;
        it is already obsolete in EPIC4-1.1.* where channels have already
        been taught not to move around from window to window.

*** News 09/28/Y2K -- New set, /SET MAX_RECONNECTS
        Traditionally, when you are disconnected from a server for an unknown
        reason (ie, for any reason other than being killed, a k-line or
        such) the client will attempt infinitely to reconnect you to the
        server.  This can be a problem if the server is not accepting new
        connections (either becuase you are D-lined or K-lined or the server
        is down or unreachable or the like), causing epic to behave poorly.
        This set permits you to throttle auto-reconnect after a certain number
        of unsuccessfull attempts to connect to any one server.  So if you
        /SET this value to 4, then epic will make (more or less) four
        iterations through your server list trying to auto-reconnect you
        before it gives up.  All auto-reconnections will fail until you, the
        user, manually intervene by using the /SERVER command (or by using
        the /SERVER command in a script), or whenever you succesfully connect
        to a server (and recieve the 001 numeric).

*** News 09/28/Y2K -- New set, /SET HISTORY_CIRCLEQ
        Traditionally, the epic history mechanism acted as a circle-queue;
        when you reached the oldest item in the history buffer, going
        backward then circled you back to the newest item in the history.
        If you reached the newest item, going forward took you back to the
        oldest entry.  There is no way to "get out of" browsing the history,
        either.  However, if you turn this /SET to OFF, then epic's history
        browsing acts more like shells, where when you reach the oldest entry
        in the history, you can't go back any further -- and when you reach
        the newest entry in the history, you stop on a blank line and cannot
        go any further.  Also, if you use the ERASE_LINE keybinding, you will
        automatically be returned to the blank line at the front of the
        history buffer (as if you had pressed cursor-down a bunch of times)

*** News 09/28/Y2K -- New option to /local, /local -dump
        You can use this to delete all of the currently scoped local variables.
        You cannot delete any other alias's local variables -- only the ones
        that you can current see.

*** News 09/28/Y2K -- New verb to $aliasctl(), $aliasctl(* getpackage *)
        This works like $aliasctl(* get *), except it returns the package
        name of the given alias, rather than the contents of the alias.

*** News 09/28/Y2K -- New option to /who, /who -literal
        This option sends whatever arguments you specify directly to the
        server without iterpolation by the client.  This is useful if you
        need to specially format your WHO requests in a way that EPIC does
        not support.  You should never use /QUOTE WHO -- ever.  You should
        instead use /WHO -LITERAL, which otherwise acts as /QUOTE WHO does.
        From this point forward, any use of /QUOTE WHO results in completely
        undefined behavior for all functionality in epic for the remainder of
        the execution of that client.  You have been warned.

*** News 08/15/Y2K -- New script, "hybrid6"
        This script purports to provide the neccesary support for admins
        and opers on hybrid6 servers.  The beginning of this script was
        provided by is-, and further submissions are welcome.

*** News 07/05/Y2K -- New built in /set, /SET LOG_REWRITE
        This is just like /SET OUTPUT_REWRITE, except that it rewrites
        the line just before it gets sent to the logfile.  Note that this
        /SET is cumulative with /SET OUTPUT_REWRITE as well as with all
        of the other logfile mangling /SET's.  That is to say, after all
        other sets have been applied, then this /SET is honored as the very
        last thing before the data goes to the logfile.  The expansion is
        parsed exactly as in /SET OUTPUT_REWRITE:
                $0      The window refnum the output is going to
                                or -1 if this is the global logfile
                $1-     The text itself.

        Please do not ask me to set $0 to the window refnum for output to
        the global logfile.  THAT INFORMATION IS NOT AVAILABLE AT THE TIME
        WE OUTPUT TO THE GLOBAL LOGFILE, SO I CANNOT PROVIDE IT EVEN IF I
        WANTED TO.

*** News 06/26/Y2K -- New flag for /who, /WHO -dx -- dalnet who support
	The dalnet's WHO request takes some extra flags that can be used
	to conditionalize, or filter out, some of the data that might
	otherwise be returned.  You can now use these flags with /who -dx.
	The format looks something like this:

		/WHO -dx <dalnet options> <arguments to options>

	Note that this syntax is not the same as the -ux flag, which is used
	for the undernet who request.  This is because these flags are modeled
	after how the server expects to recieve the arguments.  The dalnet
	WHO request is   "WHO <options> <arguments>", whereas the undernet's
	is "WHO <target> <options> <arguments>".

*** News 06/26/Y2K -- New flag for /who, /WHO -ux -- undernet who support
	The undernet's WHO request takes some weird extra flags and returns
	with weird reply numerics in a kind attempt to avoid breaking EPIC.
	However, EPIC is not tolerant of issuing WHO requests outside of the
	WHO queue, because it breaks userhost caching.  So if you want to use
	the extended undernet who request, you must specify the -ux option
	*AFTER* you specify the target and *BEFORE* you specify the special
	flags.  If you would please refer to the "who.stuff" document, this
	new option works something like this:

		/WHO <mask1> -ux <options> <mask2>

	<options> and <mask2> are passed as-is to the server without any 
	interpretation of any kind by EPIC.  The server will rrturn your 
	results in whatever way it pleases in a 354 numeric.  EPIC does 
	*ABSOLUTELY NOTHING WHATSOEVER* with this numeric reply, save offer
	it to you as an /on 354.  You are entirely on your own to parse the 
	results of /on 354.

	Only the "-u-i" and "-oper" options are compatable with the -ux flag.
	The use of any other options, including -line, -end, -host, and so on,
	will avail you not; they are silently ignored.

	All must immediately cease and desist using the awful /quote hack
	cited in the "who.stuff" document to get around EPIC's attempt to
	keep you from doing something that will likely crash the client.
	The use of that hack may result in EPIC crashing, and that is _NOT_
	my fault.

*** News 06/22/Y2K -- New /window operator, /WINDOW HOLD_INTERVAL
	This operator overrides the value of /SET HOLD_INTERVAL for this
	window.

*** News 06/22/Y2K -- New built in /set, /SET HOLD_INTERVAL
	This set controls how many lines must be added to your hold buffer
	before your status line is forcibly refreshed.  The default is 10,
	which is the traditional value.

*** News 06/22/Y2K -- New built in function, $wordtoindex()
	Given a word number (counting from zero), this returns the index
	offset into the string (counting from zero) of the first character
	in that word.  This is useful if you need to find the start of a
	word that you are somewhere in the middle of.

*** News 06/22/Y2K -- Numeric parameters available in /wait %cmd and /exec -end
	When you are inside a /wait %cmd {...} or /exec -end {...} body, the
	following numeric parameters are available:
		$0 - The name or number of the exec'd process
		$1 - The signal (if any) that killed the process
		$2 - The return code (if any) of the procss
	This is exactly the same as what you get inside /on exec_exit.

*** News 06/22/Y2K -- New status bar expando, %{2}S
	This is the same as %S, except it does not truncate the server name
	at all.

*** News 06/22/Y2K -- New built in function, $globi()
	$globi() is a case insensitive version of $glob().  It is identical
	otherwise.

*** News 06/22/Y2K -- !ID channels on ircnet no longer formatted
	At the specific request of Kurt Roeckx (q@ping.be) and with the
	permission and blessing of Kaspar Landsberg (kasi), epic no longer
	will try to "pretty print" IRCNet's !ID channels.  They now appear
	as they come from the server.

*** News 06/22/Y2K -- New on, /on channel_sync
	This was added as a birthday gift to Whitefang -- Happy 17th birthday!
	/ON CHANNEL_SYNC is thrown at the earliest possible moment that it
	is safe to perform _ALL_ channel-related built in functions (such
	as $userhost(), $chanops(), etc).  Before this /ON is thrown, some
	or all of the channel-related built in functions may return unuseful
	results.  The arguments are:
		$0 - The channel that is now synced
		$1 - The time (in fractional seconds) it took the channel
			to sync up.
		$2 - The server that this channel is on.

*** News 06/22/Y2K -- New status bar expando, %{1}F
	%{1}F is exactly the same as %F (show notified windows with output
	since they have been hidden), except that it shows the window name
	instead of its refnum, if possible.

*** News 06/22/Y2K -- New built in function, $loadinfo()
	$0 of the return value is the current line number in a file being
	loaded, and $1- is the name of the file being loaded.  This function
	only returns meaningful results *during a /load*.  Do not call this
	function outside of a script being /load'ed.

*** News 06/22/Y2K -- /DCC LIST has more information now
	A transfer speed field has been added to the /dcc list output

*** News 06/22/Y2K -- New built in function, $notifywindows()
	Returns the windows that have been notified since they were last
	hidden.  Exactly the same as the %F status line expando.

*** News 06/22/Y2K -- $chanwin() function now works for all channels
	It used to only support current channels, now you can get the window
	refnum of *any* channel.

*** News 06/22/Y2K -- Support for /SET MAIL 3
	If you /SET MAIL 3, then epic will do everything it does in
	/SET MAIL 2, and it will also reset the mtime and atime for your
	mail box after it is done reading it.  This is neccesary if your
	mail reader gets confused if someone else reads your mailbox while
	it is running.

*** News 06/22/Y2K -- Support for compiling with bounds checking gcc
	If your 'gcc' has the bounds checking extensions, then you can
	supply the '--with-bc' flag when you run configure to use it.

*** News 06/22/Y2K -- Support for IRCNet's +I channel mode
	This is now supported.

*** News 06/22/Y2K -- New status expandos, %{1}S, %{2}S
	The status expando %{1}S expands to ...
	The status expando %{2}S expands to ....

*** News 06/22/Y2K -- Support for DalNet's +c channel mode
	This is now supported

*** News 06/22/Y2K -- Default output of /on msg_group changed
	If you do not hook /on msg_group, then the default output format
	for the client will now look different than /on public_notice.

*** News 06/22/Y2K -- Holy cow!  He finally updated this file!
	Yes, this file documents all of the userland changes since the
	last update, around December 1999.  Sorry for the delay

*** News 12/06/99 -- New option to /BIND, /BIND -SYMBOLIC
        You may now bind keys by using their symbolic name.  For example,
                /BIND -SYMBOLIC key_f1 parse_command {echo hi!}
        will bind the F1 key and it will echo "hi!" whenever you press it.
        You will get an error message if the symbolic name you specify is
        not supported by EPIC, or not defined by the TERM setting you are
        currently using.  In such a case, you are out of luck. >;-)

*** News 11/25/99 -- New built in functions, $getset(), $builtin_expando()
        In order to close a couple of semantic weaknesses, these two
        built in functions have been added.  Very simply,

                $getset(SETNAME)        returns the value of /SET SETNAME
                $builtin_expando(N)     returns the value of $N inline expando

        Since it is possible to override the SETNAME or single-character
        inline expandos with your own variables, these functions are
        provided as absolute ways to get at those values without worrying
        about interference from other scripts.

*** News 12/02/99 -- #define SERVERS_FILE may now be ~-ified
        Previously, #define SERVERS_FILE was only permitted to be an
        absolute pathname, or a relative pathname to $IRCLIB.  Now, you
        can #define it to be ~/.irc/ircII.servers, for example, to 
        permit users to have their own server file.

*** News 12/02/99 -- New built in /set, /SET OUTPUT_REWRITE
        This is a little bit harder to explain, but the impact of this
        /SET is pretty big.  Basically, how it works is this:  

        For every line of output that goes to the screen, /on window is
        thrown.  However, /on window cannot be recursively called, so
        there are some instances where output goes to the window without
        /on window having been thrown.  This makes it hard to write 
        general purpose time stamp handlers.  Therefore, a general purpose
        way of doing final-editing on window output is needed.  This set
        provides that capability.  If this /SET is defined (by default,
        it is un-set), then every time a LOGICAL line of output is about
        to be sent to a window, the /SET value is expanded, and the result
        of that expansion is substituted for the original text.  The 
        expansion is parsed in the context that:
                $0      The window refnum the output is going to
                $1-     The text itself.

        Maybe an example would be helpful:  If you were to do:
                /SET OUTPUT_REWRITE +++$1-
        Then all the output to all windows would be preeceded by 
        three +++'s.  You can of course call functions, so you
        could also do:
                /SET OUTPUT_REWRITE $myfunc($0) $1-
        And then your "myfunc" alias could create a prefix banner for
        the output line (eg, a timestamp) that is window-spefic.

        This is a very expensive operation, but is cheaper than using
        an /on window, and probably less of a hassle than redefining
        a zillion other /on's.  It also is pretty reliable, since it
        will always be honored for all lines of output.

	--- Amendment on April 10, 2001 ---
	When changing /set output_rewrite inside of an alias, please remember
	that $'s are expanded before the /set is called, and so things like
	$1- or $myfunc($0) would be expanded at the /set time and not at the
	rewrite time.  Make sure to double up your $$'s in such cases!

		alias foo {
			set output_rewrite +++$$1-
		}
	--- Amendment on April 10, 2001 ---

*** News 11/16/99 -- New built in function, $getcap()
        This function is a general purpose interface to capabilities that 
        might be made available to the epic scripter.  Right now, the only 
        capability namespace is for termcap/terminfo.  The $getcap() function 
        takes at least one argument (the namespace) and a variable number of 
        additional arguments, depending on the needs of the namespace.

        The TERM namespace.  Usage:
                $getcap(TERM <capability name> <captype> <mangle>)
        Where "TERM" is the literal string TERM
        Where <capability name> is either a termcap capability name or a
                terminfo capability name or a "long name", as defined by
                the terminfo standard.  A list of these names can usually
                be found by 'man terminfo' if you have ncurses installed.
                I will post this somewhere soon and put a URL here.
        Where <captype> is 0 if <capability name> is a "long name",
                is 1 if <capability name> is a "terminfo name",
                or is 2 if <capability name> is a "termcap name".
        Where <mangle> is 0 if you want the capability to be returned in
                its "raw" format, and 1 if you want control characters to
                be converted into a format suitable for use with /bind or
                for echoing to the screen.

*** News 08/31/99 -- New built in function, $insert()
	Breaking my prior promise not to introduce any new features, and
	due to the extended time all this is taking, some new features have
	been added to this release.  

	The $insert() function takes three arguments:  an index position,
	a string, and some text.  The return value is such that:
		$substr(<word> $insert(<N> <word> <text>))
	returns <N> (provided of course that <text> does not include <word>).
	In other words, it inserts <word> into <text> in the <N>th position,
	counting from zero.

*** News 08/31/99 -- New built in functions, $urlencode(), $urldecode()
	The $urlencode() function returns the arguments passed to it, except
	that all "unsafe" characters (defined as any of the characters:
		[[  `'!@#$%^&*(){}<>~|\";? ,/ ]]	)
	are converted to their hexadecimal equivalent, using the pattern
	%XX.  This substitution is suitable for converting any arbitrary 
	text into something that is "safe" to use as a filename.

	The $urldecode() function returns the arguments passed to it, except
	that all hexidecimal patterns (defined as %XX) are converted to their
	equivalent ascii characters.

	They are symmetric: $urldecode($urlencode(TEXT)) returns "text"

*** News 08/31/99 -- New flag to /who, /who -nochops
	For completeness sake, you can specify the -nochops flag to the
	/who command to see only those people who are *not* channel 
	operators.  It is the logical opposite of the -chops flag.

*** News 08/31/99 -- Changes to /save
	Its easier to describe how it works now:  
	/SAVE [arguments] filename
	Where [arguments] are zero or more of the following:
		-ALIAS		save all /ALIASes (no assigns!)
		-ALL		save everything here
		-APPEND		don't overwrite [filename]
		-ASSIGN		save all /ASSIGNs (no aliases!)
		-BIND		save all /BINDs
		-GLOBAL		save everything loaded by the 'global' script
		-NOTIFY		save all /NOTIFYs
		-ON		save all /ONs
		-SET		save all /SETs
		-SERVER		save all /SERVERs

	The 'filename' argument is not optional.  You must specify it.
	You are no longer required to answer "Are you sure?" when you use
	the /save command.  The save is automatically performed.

*** News 08/31/99 -- New set, /SET DCC_USE_GATEWAY_ADDR
	First, an explanation.  For those of you behind firewalls, there
	are actually two IP addresses that are operative.  There is your
	local IP address on the machine you are using, and there is the 
	IP address of the firewall.  Many firewalls "peek" at outbound 
	traffic, looking for things like DCC handshakes, and when found,
	substitute the local IP address for the firewall IP address.
	Other firewalls don't perform this service, but instead pass all
	traffic (after filtering) to the local IP address.  In the latter
	case, it is necceasary to use the firewall's IP address on any
	outbound DCC handshakes, since the firewall does not do substitution.

	If this /SET is ON, then whenever you send out a DCC handshake to
	a remote peer, the client will use the IP address of the firewall in
	the handshake.  If this /SET is OFF, then the (normal) behavior 
	of using the local IP address applies.

*** News 08/31/99 -- New built in function, $stat()
	This function returns information relating to a filename, which is
	provided as the argument.  Only one argument is accepted, so be sure
	to double-quote the filename if there are any spaces in it.

	The return value is the stuff found in 'struct stat' for that file,
	in the following order:

		$0	st_dev			$1	st_ino
		$2	st_mode			$3	st_nlink
		$4	st_uid			$5	st_gid
		$6	st_rdev			$7	st_size
		$8	st_blksize		$9	st_blocks
		$10	st_atime		$11	st_mtime
		$12	st_ctime

	Please refer to the stat(2) man page for explanations of what these
	different values mean.  NOTE: 'st_mode' has already been converted
	to octal in the return value.  NOTE:  The values of each of these
	fields are expressly system dependant, and no guarantees are made to
	the usefulness of any particular field.

*** News 06/18/99 -- New flag to $info, $info(v)
	The $info(v) function call returns the "class major minor" version
	information.  For example, when this item was written, $info(v) was
	to return "epic4 pre2 004", indicating an epic4pre2.004 class client.
	Other clients may very well use $info(v) to return version information,
	and hopefully they wont use 'epic4' as the 'class'. =)

	The reason this is being added is because technically speaking, 
	looking at $J for the version info is a bad idea, and $V is good,
	but $V overlaps for all the different classes of ircII clients.
	So if (word(0 $info(v)) == [epic4]) then you know youre using an
	epic4 client.
	
*** News 05/28/99 -- New built in function, $ttyname()
	It just calls the ttyname(3) function, which returns the name of
	the tty that the epic process is attached to, if for whatever
	reason you care about that.

*** News 05/28/99 -- New built in function, $lastlog()
	This function roughly simulates the /lastlog command, except it
	returns a list of numbers that you can pass to $line() to get 
	interesting information from the lastlog.   The syntax is:
		$lastlog("window desc" "pattern" "lastlog level")
	There must be exactly three arguments passed to this function, and
	so if any of them contain spaces, you will need to use double
	quotes to protect the wording.  The function will return all lines
	in the lastlog buffer of the specified "window" that match "pattern" 
	and also are of one of the types contained in "lastlog level".  

	For example:
		$lastlog(0 *foo* ALL)
	Returns all of the lines that contain the string 'foo' of any
	lastlog level type in the current window.

	Important note #1: Lastlog line numbers are counted from the bottom 
	of the display to the top.  The most recently displayed line is always
	numbered 0.  The line numbers are also not static.  Lines are 
	continually being added and deleted for each new line of output.
	This function returns the line numbers in numeric order, which means
	from the bottom up.  If you want to traverse from the top down, you
	will need to pass the return value of this function through $revw()
	to get them in the desired order.

	Important note #2:  Because 'echo'ing to the screen changes the 
	order of the line numbers, extreme caution must be used when 
	outputting anything based on the $lastlog() command -- if you are
	not careful to compensate, you might just retreive the wrong line.
	It is _not_ my fault if this happens.

*** News 05/28/99 -- Two new extensions to the $line() function:
	First, you may now pass a window name or refnum as the optional
	second argument.  Previously, you could only pass in a window refnum.
	Second, you may also specify the literal word "-LEVEL", and the
	return value of $line() would include the lastlog level of the
	requested line as the first word:  For example:
		$line(0 -LEVEL)
	Might return
		"CRAP This is some text"

*** News 05/07/99 -- New function, $realpath()
	If your system provides the realpath(3) library call, then this 
	function will convert a relative or absolute pathname into a
	canonical pathname.  All symlinks, and any '..' or '.'s are 
	handled.  Note that *THE DIRECTORY PART OF THE PATH YOU PASS TO THIS
	FUNCTION MUST ACTUALLY EXIST*, because this is how the library
	call works.  If an error occurs (such as the path not existing), 
	the false value is returned.  If the realpath library call is not 
	available on a system, then this function will simply return the 
	arguments as-is.

*** News 05/07/99 -- New scripts, 'dig' and 'debug.irc'
	Refer to them for more information.

*** News 05/07/99 -- New function, $indextoword()
	This function converts an $index()-type return value to a $word()-type
	argument, so that you can extract the entire word from a string that
	contains a character that you know about.  For example:
		$word($indextoword($index(! $*) $*) $*)
	would return the entire word that contained the first instance of 
	the bang character in $*.  This might be useful to extract words 
	from the input line, when used with $curpos() and $L.

*** News 05/07/99 -- 20 new /set status_user<n>'s.
	There are now 20 new /set status_user's available, for a grand total
	of 40.  The new values are /set status_user20 through status_user39.
	They show up on your status bar as %{2}0 through %{3}9.  The 
	difference between these 20 and the other 20 is that these always 
	display on all your windows, not just the current-type window.

*** News 04/08/99 -- New feature to aliasctl, $aliasctl(* exists *)
	This new verb to aliasctl returns 1 if the indicated alias/assign
	exists and 0 if it does not.

*** News 02/01/99 -- New operator in new math paser, <=>
	If you are a user of the new math parser (see below, /xdebug new_math)
	then there is a new operator available.  The <=> operator is a binary
	operator that takes two lvalues and swaps the rvalues of each operand.
	For example, if $foobar is 1 and $booya is 2, then
			@ foobar <=> booya
	Results in $foobar being 2 and $booya being 1.  The operator is right
	to left associative, which permits you to string them together to
	get a "shift rvalues to the right" operation.

*** News 02/01/99 -- New built in /set, /SET NEW_SERVER_LASTLOG_LEVEL
	Some users do not appreciate that when you do a /window server
	operation, that the lastlog level of the window is changed to
	LOG_ALL.  So this /set now controls what it will be set to.  The
	default is (obviously) LOG_ALL.  Some of you will probably change
	this to LOG_NONE, I suppose.

*** News 02/01/99 -- New built in flood/ignore levels	(srfrog)
	There are three new flood-protection types, and three new ignore
	levels:
		"TOPIC"		"JOIN"		"NICK"
	respectively covering topic changes, channel joins, and nickname
	changes.  

*** News 02/01/99 -- New built in /set, /SET RANDOM_LOCAL_PORTS
	For the delusionally paranoid, you can /set this to ON if you
	want EPIC to make a token attempt to use a random port for each
	outbound DCC request.  If EPIC randomly picks a port that is in
	use, then as a fallback, it will just ask the operating system
	for a port (to avoid resource starvation).

*** News 02/01/99 -- New built in /set, /SET RANDOM_SOURCE
	EPIC now has more flexibility in what it uses as its random
	number source.  You may now choose between three random number
	sources by setting this /set to one of the following values:

		0 - Use the /dev/urandom device
		    PRO: Reasonably good source of non-repeating numbers.
		    PRO: Reasonably good source of entropic numbers.
		    CON: Not very portable

		1 - Use the classic ircII psuedo-random number generator
		    PRO: Very good source of non-repeating numbers.
		    PRO: Always available
		    CON: Numbers generated have almost no entropy.

		2 - Use the alternative epic gettimeofday() generator
		    PRO: Almost always available
		    PRO: Numbers generated have modest entropy
		    CON: Poor source of non-repeating numbers.

	If you /set this to 0 or 2, and the appropriate mechanism is
	not available, then it will silently use the built in psuedo-random
	number generator, which is always available.  This variable is used
	by the global random number generator, which is used by the DCC
	random port guesser (see above), the $random() built in function,
	and the $randread() built in function.

*** News 02/01/99 -- New built in function, $hash_32bit()	(srfrog)
	This function takes a case-insensitive string as its first argument 
	(so if it has spaces, you need to surround it with double-quotes) and 
	an optional argument specifying the number of characters to hash, and
	converts that number of characters in the string into a 32 bit integer.
	The 32 bit hash result is returned.

*** News 01/25/99 -- New feature, alias argument lists
	This is kind of hard to explain, and I implemented it all in one day,
	so if you try real hard to break this, you probably will.  You may 
	now supply argument lists to your aliases.  An alias list is one or
	more local variables that will be given portions of the arguments
	passed to your alias.  For example:
		/alias a1 (var1, var2) {echo $var1, $var2)
	then
		/a1 one two
	$var1 becomes "one" and $var2 becomes "two".  $* is the empty string.

-	If the user passes more arguments than you have on your list, then
	all of the excess arguments will go to the last variable.  So in
	the above example, if you do:
		/a1 one two buckle my shoe
	then $var1 becomes "one" and $var2 becomes "two buckle my shoe".
	$* is the empty string.

-	If the user passes less arguments than you have on your list, then
	all of the excess variables will recieve the empty value.  So in
	the above example, if you do:
		/a1 one
	then $var1 becomes "one", and $var2 is the empty string and $* is
	the empty string.

-	If you would rather have the variables in the list just "shift off"
	the first few variables and leave the rest of the arguments in $*,
	then you can specify your last variable as "...", which will just 
	pop off as many words as neccesary and leave the rest in $*.  So
	in this example:
		/alias a1 (var1, var2, ...) {echo $var1, $var2)
	then
		/a1 one two buckle my shoe
	$var1 is "one", $var2 is "two", and $* is "buckle my shoe".

-	If you would like to have any extra arguments thrown away, then you
	can specify the last variable as "void".  In this example:
		/alias a1 (var1, var2, void) {echo $var1, $var2)
	then
		/a1 one two buckle my shoe
	$var1 is "one", $var2 is "two", and $* is the empty string.

-	If you would like to provide a default value for a variable, just
	in case there is not an argument that should be there, you can 
	specify it with the "default" qualifier. 
		/alias a1 (var1, var2 default "baz") {...}
	So if you do:
		/a1 one
	Then $var1 is "one", and $var2 is "baz" (because it is the default
	value you specified) and $* is the empty string.  The default value
	is limited to one extended word, so if you want to have spaces in it,
	you need to surround it with double-quotes.  The default value will
	be expanded, so you may have expandoes (such as $C) in it.

*** News 01/13/99 -- New built in /set, /SET TERM_DOES_BOLD_BLINK (knghtbrd)
	If your terminal emulator does bold background colors when you
	set the blinking attribute, you can /set this to ON to give a hint
	to the client that it is ok to output the BLINK attribute in places
	where it would otherwise not do so.  A specific example is for the
	^C background colors 00-15, of which 4 are "bold".  If this /set is
	OFF, those 4 colors are always normal intensity, and if this /set is
	ON, then those 4 colors will be "blinked", and hopefully your emulator
	will turn that into a bold background color.

*** News 12/17/98 -- Built in command /cycle repealed
	The built in command /cycle has been repealed.  The restriction that
	required its implementation has also been repealed.  You may now do
	/quote part, and so you can use your old /cycle alias.

*** News 12/17/98 -- New built in function, $functioncall()
	This built in function can be used to determine if your user alias
	was called as a command (eg, /foobar) or as a function (eg, $foobar())
	If your user alias was called as a function, $functioncall() will
	return 1.  Otherwise, it will return 0.

*** News 12/17/98 -- Slight change to built in function argument passing
	Historically, built in functions have returned the false value 
	when a required argument was considered to be "missing".  However,
	a single space, delimited by quotation marks, has also been considered
	to be "missing", so that something like:

		$strip(" " one two three)

	returned nothing, because the required first argument was "missing".
	This has been corrected, so that quote-space-quote is now a valid
	argument that is not "missing", and that argument contains a single
	space in it.  This permits you to pass a space as a required argument
	to any function by enclosing it in double quotes.  Of course, this
	only impacts functions that interpret their arguments as a list of
	words.

*** News 12/11/98 -- New window action, /window refnum_or_swap
	It has been pointed out that there is no atomic way to make a
	given window both current and visible, without failure.  This
	action provides that capability.  It is passed one argument, the
	refnum or name of the window to be made current.  If the window is
	visible, then the client makes that window current (as /window refnum
	would do).  If the window is hidden, then the client swaps the
	window in and makes it current (as /window swap would do).  This
	action never fails unless you specify a window that doesn't exist.

*** News 12/11/98 -- New built in command, /usrip
	EFNet has decided to re-implement the /userip command from
	undernet and give it a gratuitously different name.  Ugh.
	See /userip for more information.

*** News 12/11/98 -- Status line expando %S changed, always displays
	Due to overwhelming request, the %S status-line expando now always
	displays the server information, even if you are not on multiple
	servers.  If you have a severe problem with this change, please
	let me know.

*** News 12/11/98 -- Clarification of $winchan() and $chanwin()
	Nuke has asked me to officially clarify that if you specify a
	channel argument, a second argument is optional.  The optional
	second argument is the server refnum from which you are interested
	in the channel.  This is to clarify between two channels of the
	same name on two different servers, obviously.

*** News 11/10/98 -- /on switch_windows extended a bit
	I am documenting this here because there have been some changes 
	(improvements) which contradict the previous documentation for 
	/on switch_windows, so a record is needed.  Anyhow, as far as i 
	can tell, the client now will hook /on switch_windows _every_ time
	the current window is changed, not just in some select situations.
	Hopefully this will make everyone happy. =)

*** News 11/03/98 -- $servername(), $servernick(), $serverports() changed
	They are now all happy if you do not provide them with any arguments,
	as they will default to the current server refnum (from_server).

*** News 11/03/98 -- New built in function, $prefix(<word list>)
	The $prefix() function purports to return the longest string that
	is a common leading substring to all the words in the given word
	list.  For example:

		$prefix(one two three)		returns the false value
		$prefix(p1 p2 p3)		returns "p"
		$prefix(one-1 one-2 one-3)	returns "one-"

*** News 11/03/98 -- New built in function, $maxlen(<word list>)
	The $maxlen() function purports to return the length of the longest
	string in the given word list.  You figure it out. ;-)

*** News 11/03/98 -- New verb for /window, /window clear
	This is a pretty obvious one -- how did it get overlooked?
	Pretty simple.  It clears the current window.

*** News 09/28/98 -- /on dcc_lost hooked for auto-dcc reject
	When the client auto-closes your dcc's because they have excceded
	the timeout specified in /set dcc_timeout, the client will hook
	/on dcc_lost for you with the pertinent information.

*** News 09/28/98 -- New verb for $aliasctl(), pmatch (Colten, nutbar)
	You may now do pattern matching on your aliases and assigns
	by specifying "pmatch" instead of "match".  Unlike the "match"
	on bitchx, this does not auto-append a *, so if you want "match"
	like behavior, remember to put it on the end.  Examples:

		$aliasctl(alias pmatch *foo)
			returns all alias names that *end* with "foo"
		$aliasctl(assign pmatch *g*)
			returns all assign names that contain a "g".

*** News 09/28/98 -- New built in function, $isaway() (nutbar)
	You give it a server refnum it tells you if youre away on that
	server.  The default argument is the current server.  The 
	"special" argument of -2 returns 1 if you are away on any server,
	0 if you are "here" on every server.

*** News 09/28/98 -- New flags to /exec, -line, -error, -end
	These flags allow you to specify code that will be executed for
	any of the output events from an /exec'd command.  For example:

		exec -line {
			echo stdout: $*
		} -error {
			echo stderr: $*
		} -end {
			echo ALL DONE!
		} ls

	Note that /exec -end just does a /wait %proc -cmd for you (really),
	so it doesnt save you any time to do it that way.

*** News 09/28/98 -- Semantic change to local variables
	Due to exceeding popular request, all local variables are "owned"
	by their closest enclosing atomic scope and NOT by the closest
	enclosing syntactic scope.  The /bless command does not affect
	this rule in any way.  The following illustrates the change:

		alias foobar 
		{
			local a 4
			if (1) {
				# a is 4 here
				local b 5
			}
			# b is still around here, with the value 5.
			echo [$a] [$b]
		}

*** News 09/28/98 -- New built in function, $getopt()   (Crackbaby)
 $getopt(<optopt var> <optarg var> <opt string> <argument list>)

 Processes a list of switches and args.  Returns one switch char each time
 it's called, sets $<optopt var> to the char, and sets $<optarg var> to the
 value of the next argument if the switch needs one.

 Syntax for <opt string> and <argument list> should be identical to
 getopt(3).  A ':' in <opt string> is a required argument, and a "::" is an
 optional one.  A '-' by itself in <argument list> is a null argument, and
 switch parsing stops after a "--"

 If a switch requires an argument, but the argument is missing, $getopt()
 returns a '-'  If a switch is given which isn't in the opt string, the
 function returns a '!'  $<optopt var> is still set in both cases.

 Example usage:
 while (option = getopt(optopt optarg "ab:c:" $*)) {
      switch ($option) {
              (a) {echo * option "$optopt" used}
              (b) {echo * option "$optopt" used - $optarg}
              (c) {echo * option "$optopt" used - $optarg}
              (!) {echo * option "$optopt" is an invalid option}
              (-) {echo * option "$optopt" is missing an argument}
      }
 }

*** News 09/28/98 -- Lots of changes with key bindings and /bind command
	* You no longer have to do this:
		/bind ^[ meta1
		/bind meta1-[ meta2
		/bind meta2-1 metaN
		...
	  You can now do:
		/bind ^[ meta1
		/bind ^[[ meta2
		/bind ^[[1 metaN
	  And the client wont whine at you.

	* /set meta_maps controls the number of META states you have, there
	  is no limit, but there is a floor of 5 meta maps (meta0 through 
	  meta4).  Yes, you can have as many or as few as you want! =)
	  Note that decreasing this value will destroy any bindings that
	  depend on states that are going away, the client auto-garbage
	  collects them and theyre gone forever.  Just be forewarned.

	* You no longer have to do the first thing, you can just do:
		/bind ^[[11~ scroll_back
	  The client will automagically bind all the intermediate steps to
	  open meta states and you dont have to worry about negotiating
	  the meta maps (as long as you use this all the time, the client
	  will not get confused, but if you start messing around, you might
	  lose some of your binding chains.)

	* /bind accepts a special argument, '-default' which is like /dump
	  for your keybindings, but it restores the defaults so you can 
	  continue to type. =)

*** News 09/28/98 -- Add per-window status formats
	Each window may now have its own, independant status_format variable
	seperate from the global defaults.  Theyre just like the normal status
	formats, except you access them through the /window command:
		/window status_format "..."
		/window status_format1 "..."
		/window status_format2 "..."
	It is recommended that you put double-quotes around the status format
	as it probably contains spaces and you will want it parsed as just
	one argument.  Kanan has bugged me for this feature for years, so
	hopefully he wont be the only one using it. ;-)

*** News 09/28/98 -- New flag to /xquote, -ALL (Colten)
	With /xquote -all, you can send something to every connected server,
	perhaps client-side away handling...

*** News 09/28/98 -- $aliasctl(assign match) added.  (Colten)
	You can now match variables in addition to aliases.

*** News 09/28/98 -- New expression parser (IN DEVELOPMENT)
	There is a new expression parser you can play around with by doing
	/xdebug new_math.  Note that this /xdebug will probably be retained
	in the future and will be a no-op, so its safe to use in your scripts.
	More about the new expression parser when its closer to being finished.

*** News 09/28/98 -- New flag to /xecho, -x
	This flag allows you to output something with all highlight attributes
	preserved, no attributes are honored.  Note that if you repaint the
	screen, these highlights will probably magically go away. ;-)  This is
	NOT a bug, so its not as useful as it might appear.

*** News 09/28/98 -- New /on, /on switch_windows
	This is hooked whenever the client changes what it thinks your
	"current" window is in any context:
		$0	The old screen number
		$1	The old window refnum
		$2	The new screen number
		$3	The new window refnum
	Note that the window might change through forces other than the
	'SWITCH_WINDOWS' keybinding.  You can have a pretty good idea
	when this happens because $0 and $2 will be different.

*** News 09/28/98 -- New built in keybinding, /bind <X> refresh_status
	This just updates all your status lines, and nothing else.

*** News 09/28/98 -- You may now 'return' out of /fe, /do, /for, etc
	This was not supported before.  Probably a bug.

*** News 09/28/98 -- New set, /set mangle_logfiles
	You may now mangle the output that is destined to your logfiles
	by /set'ting this variable appropriately.  It uses the same syntax
	as /set mangle_inbound and friends.

*** News 09/28/98 -- You may now strip ALL_OFF in $stripcrap()
	Just specify ALL_OFF as one of the items in the first argument.

*** News 09/28/98 -- Support for bzip2
	Scripts, help files, and other files that are loaded by the client
	may now be in .bz2 format as long as 'bunzip2' is available somewhere
	in your PATH.

*** News 09/28/98 -- New built in expando, $''
	Yea yea, i know i havent documented anything in a long time, so
	here is a bunch all together.  This new expando is just like $"",
	except that it only waits for the user to press one key before it
	returns.   BTW, $"" and $'' now use /input and /input_char as their
	underlying infrastructure, but put a synchronous wrapper on top of
	it, so it is now safe to mix the two input types (such as it is.)

*** News 08/03/98 -- New /on, /ON SWITCH_CHANNELS
	This is now hooked whenever any of your windows has its current
	channel set.  This includes the transitions from channel 0 to
	a new channel (when you /join) and from an old channel to channel 0
	(when you /part), and when you do a SWITCH_CHANNELS keybinding.
	If one of the channels involved is channel 0, then "0" will be the
	channel specified.
		$0	- The window that the change is happening in
			  *** You should not assume that this window
			      is the current window! ***
		$1	- The old channel
		$2	- The new channel

*** News 07/13/98 -- New stuff for stripping crap out of text
	Due to the incessant requests, ive given in and written a general
	purpose tool for stripping just about any kind of crap out of text.
	The tool is used in two ways:  Two new /set's that control just
	what (if anything) the client will strip out of incoming and 
	outbound lines to the *server*, and a new built in function that
	allows you to scour arbitrary text in arbitrary ways.  Lets get
	on to the gory details:

	This is the syntax for describing to the client just how to mangle:
		ALL	- Strip all of the below, except ESCAPE
		ANSI	- Convert all ANSI to logical characters, and
			  remove all "unsafe" ansi codes.  This does just
			  what $stripansicodes() does.  Note that to remove
			  any of the attributes below, you need to also
			  specify ANSI so that any ansi-sequence will be 
			  converted to their logical characters to get 
			  stripped.  If you dont specify ANSI, all ansi 
			  codes will be left untouched!
		BOLD     - Remove all bold_toggle chars.
		COLOR    - Remove all ^C color sequences.
		REVERSE  - Remove all reverse_toggle chars.
		UNDERLINE - Remove all underline_toggle chars.
		BLINK    - Remove all blink_toggle (flashing) chars
		ROM_CHAR - Remove all rom_char characters
		ND_SPACE - Remove all non-descructive spaces
		ESCAPE   - This is a special one.  If you specify ESCAPE,
			   then any ESC characters will be converted to
			   <REVERSE>[<REVERSE>.  This will defeat your
			   ability to do ANSI, as there wont actually be
			   any ansi sequences left! ;-)

	You may specify any number of these modifiers by seperating them
	with commas.  For example, "BLINK,UNDERLINE"  means to remove both
	blink and underline characters.  You can negate the sense of an
	attribute by prepending it with a hypen.  So "ALL,-REVERSE" removes
	all the above attributes EXCEPT that it wont remove reverse chars.

	And now how to use this:
		/set mangle_inbound <description>
	This will mangle all inbound SERVER text in accordance with the
	description rules (as specified above).

		/set mangle_outbound <description>
	This will mangle all outbound SERVER text in accordance with the
	description rules (as specified above).

		$stripcrap("<description>" text)
	This will mangle the given text in accordance with the specified
	description (as specified above).

	*** Note that in general, using this feature is *very* expensive.

*** News 06/15/98 -- /TOPIC command extended to now unset topics
	You can now unset the channels topic by prefixing the channel
	name with a hyphen *and not specifying any arguments*.  That is
	to say, '/topic -#umbrella'   will unset the topic (if any) from 
	the channel #umbrella.  You can do '/topic -'  to unset the topic
	from the current window's channel.

*** News 06/10/98 -- EPIC now under the BSD license
	As ircII-current (post 4.4) has been changed to the BSD style
	license and ive been informed that permission has been given to
	retroactively offer the license to previous versions (eg, 2.8.2),
	I'm very happy to release EPIC under the BSD style license.
	See doc/Copyright for the specifics.

*** News 05/28/98 -- /on connect now passes in three arguments
	/on connect now offers the server's idea of what its name is
	as $2.  This may very well differ from what we think its name
	is supposed to be.

*** News 05/29/98 -- New built in functions $iget[r]matches() (Crackbaby)
	This works just like $getmatches(), but it returns the index number
	(in alphabetic order) of the array members rather than the item 
	numbers (in the order they were put into the array.)  The first
	argument is the array and the second argument is the pattern.
	$igetrmatches() is to $getrmatches() what $igetmatches() is to
	$getmatches().  Got it?

*** News 05/29/98 -- New /on, /ON SEND_CTCP
	When you send a CTCP request or a CTCP reply, this on will be
	hooked.  The arguments are:
		$0	- "PRIVMSG" for requests, "NOTICE" for replies
		$1	- Who the CTCP is being sent to
		$2	- The type of CTCP being sent
		$3-	- (Optional) Argument(s) to the CTCP being sent

*** News 05/29/98 -- New built in function $servnum()
	You give it a server name, it returns a server refnum for that
	server.  Returns -1 if the server isnt valid.

*** News 05/29/98 -- New type to /xdebug, "ALL"
	If you specify "ALL" to /xdebug, it will turn on all the xdebug
	options (as if you had specified the -x command line argument).
	Using "-ALL" will turn off all xdebug options.

*** News 05/29/98 -- New flag to /who, -u-i
	This flag will direct the client to add the 'x' argument to the
	WHO protocol command, which is used by the undernet ircd servers
	to give you invisible users.  (They changed it so that operators only
	see visible users now unless they use this special flag, so that the
	server can whine to everyone else about how youre abusing your power.)
	Don't use this server in any other situation, as itll probably 
	confuse the server or something.

*** News 05/29/98 -- $isconnected() no longer requires an argument
	If you dont specify an argument, 'from_server' is the default

*** News 05/29/98 -- /on dcc_connect compatability with BitchX
	/on dcc_connect will hook with $1 being "SEND" first, and if you
	dont grab that, it will offer the same exact thing with $1 being
	"GET".  This is for compatability with bitchx.

*** News 04/24/98 -- New built in command line argument (Texaco)
	The -s command line flag is now honored, and it instructs the
	client to not attempt to connect to a server on startup, but
	instead show you your server list (so you can /server to one)

*** News 04/24/98 -- New built in function $gettmatch() (Colten)
	Im not exactly sure what it does.  Someone tell me please? =)

*** News 04/24/98 -- New noise operator for /on, /on ?type
	This is kind of hard to explain, but here goes.  You may now specify
	an /on as having noisy type '?' (a question mark).  If you use this
	type, the /on will be executed silently (as if you had used /on ^type)
	but whether or not the /on actually supresses the default action will
	be determined by you at runtime.  You are expected to /return a value
	from the body of the /on.  If you return 1, the default action *will*
	be suppressed.  If you return 0, the default action *will not* be
	suppressed.

*** News 04/18/98 -- **hack** /on set "set-error *" is hooked by /set
	Whenever the user does something that would cause the /set command
	to emit an error, such as /set booya, where booya is not a valid 
	built in /set, you can hook /on set "set-error *" to suppress or
	redefine the error message.

*** News 04/18/98 -- /bind'ings also follow your /package settings
	So if you /unload package, then it will unload any /bind's that
	were set in that package.

*** News 04/18/98 -- /on 433, /on 437, /on 438 now pass server as $0
	These are the "nick collision" numerics, and now the server that
	rejected you is passed as $0.  I have cleared this change with Pana,
	so BitchX will do this as well shortly.

*** News 04/18/98 -- New built in function $getsets()
	If given an argument, it will return all the built in /set values
	that are matched by the argument(s).  If no arguments are given,
	it will return all built in /set values.

*** News 04/18/98 -- Client automatically sends DCC REJECT when you exit
	The client will automatically send CTCP DCC REJECTs on your behalf
	whenever you close or abort a DCC conenction.  This also will happen
	when you /exit.  This is so the remote peer will know that you will
	not be getting the transfer, and if theyre an EPIC or BitchX client,
	they will automatically close it for their end as well.

*** News 04/18/98 -- New /set, /SET SCROLLBACK_RATIO
	You may now specify, in percentage points, how much of the screen you
	want to scroll by every time you scroll forward or backward.  This
	value should be between 10 and 100, as the client silently truncates
	it to those extremes if you dont.

*** News 04/18/98 -- /DCC GET nick * now works
	You may specify a star as as special indication that you want to get
	all of the files that have been offered by "nick".

*** News 04/18/98 -- New set, /SET DCC_AUTO_TIMEOUT  (autoclose old dcc reqs)
	If at least N number of seconds has passed (where N is the value of 
	this set) since you offered or were offered a DCC handshake, 
	without the connection being accepted by either side, the client 
	will automatically close the offer on your behalf.

*** News 04/18/98 -- Doing /DCC SEND nick file   wont emit error second time
	Rather than emitting an unhelpful error message the second time you
	try to /DCC SEND to someone (perhaps because the first time you did
	the send the person wasnt on), duplicate /DCC SEND requests will now
	send a "booster" message identical to the original.
	(This works for /dcc chat nick as well)

*** News 04/18/98 -- /DCC RENAME can now rename chat connections
	To rename a chat connection, specify the original nickname as '-chat'.
	Then specify the old nick and the new nick.  Something like this:
		/dcc rename -chat oldnick newnick

*** News 04/18/98 -- DCC sliding window (/set dcc_sliding_window) modified
	You may now set this to any value, no matter how abusrdly large, and
	the client will keep up to this many packets outstanding, but never
	so many that the client will block.  Previously, if you set this value
	too high, the client would block.  Now it is safe to set this to 
	10,000, and acheive pretty good throughput.

*** News 04/18/98 -- New /dcc command, /dcc closeall	
	This closes all of your registered DCC connections, leaving your DCC
	list very empty.

*** News 04/18/98 -- Windows may now have zero visible lines
	You may now do /window size 0 to make a window that is nothing but
	a status bar.

*** News 04/18/98 -- New /set, /SET ND_SPACE_MAX
	For those who want to cap the number of non-destructive spaces that
	may appear in any one line of output, you may set this variable to
	control the number the client will parse before ignoring them.  The
	idea is simliar to /set tab_max

*** News 04/18/98 -- New flag to /xecho
	If you use the double-hyphen flag to /xecho, it will stop all
	argument parsing right there and take the rest of the arguments as
	the text to be echoed.  This is useful if the first word you want to
	output starts with a hyphen
			/xecho -- -s booya booya booya boo
	outputs 
			-s booys booys booys boo

*** News 04/18/98 -- New flags to /lastlog
	There is a new flag to /lastlog, -all which specifies that the given
	lastlog level to search for is to be all qualifying levels.  You can 
	turn off a given level by using a double hyphen (ala --msgs).  So, if
	you want to see everything in your lastlog EXCEPT your msgs, do this:
			/lastlog -all --msgs
	Another new flag is -reverse.  The -reverse flag instructs the client
	to start from the END of your lastlog and go BACKWARDS through the 
	lastlog when outputting.

*** News 04/02/98 -- New command, /userip
	This is the front end to the Undernet command by the same name.  It
	is exactly like /userhost except it returns the ip address instead of
	the named userhost.

*** News 04/02/98 -- New command, /usleep 
	The /usleep command pauses the client for some number of microseconds.
	specified as the argument to the command.  This command will probably
	be rolled into /sleep at some future time, Watch for this.

*** News 04/02/98 -- $cparse() changed to support bitchx-syntax
	If the first argument passed to $cparse() is an extended word, then
	only the first argument will be used for the output, and any numeric
	expandoes in the first argument will be expanded with the rest of the
	arguments to $cparse() -- ala:
		$cparse("This is a $0 test" cparse)

*** News 04/02/98 -- /window create now works properly for GNU screen
	Kanan did the work for this, you can thank him. ;-)

*** News 04/02/98 -- You may now /msg a DCC RAW connection.
	To send a message to a DCC RAW connection, simply msg to =NUM
	where NUM is the number that was previously returned by $connect().
	Obviously, you can also /query a DCC RAW connection with this, making
	it usable for protocol connections to remote servers.  I have fixed
	and returned the 'mudirc' script, which demonstrates how to make epic
	act as a relatively useful mud/moo client.

*** News 03/24/98 -- Scope resolution operator for variables
	The client now supports a way to differentiate between local 
	variables and global variables having the same name.  As always, 
	an expando with no modification will resolve to a local variable 
	if it can, and a global variable it cannot.  However, if the 
	variable name is prefixed with a single colon (either as an lval 
	OR as an rval), then the variable will be expanded *only* as a 
	local variable, and if the local variable does not exist, it will 
	expand to the false value.  If the variable name is prefixed with 
	two colons (again, either as an lval or an rval), the variable will 
	be expanded *only* as a global variable, even if a local variable 
	by that name exists.  Here are some examples:

			assign foo 1
			local foo 2
			@ ::foo = 4		# Sets the GLOBAL variable
			@ :foo = 6		# Sets the LOCAL variable
			@ foo = 8		# Sets the LOCAL variable
			@ bar = 12		# Sets the GLOBAL variable
			$::foo		# is '4'
			$:bar		# is the false value
			$bar		# is 12
			$foo		# is 8

*** News 03/24/98 -- New /on, /ON UNLOAD
	As a courtesy to script writers that use /package in order to keep
	track of all of the aliases and so forth that they create in their
	scripts, /ON UNLOAD will be hooked with the package name (as supplied
	to /package) when the user does /unload <packagename>.  Presumably, 
	you could use this to close open logfiles or $connect()s or what
	ever garbage collection that is needed.

*** News 03/24/98 -- Built in function $tdiff() enhanced (as a demo)
	To demonstrate the proof of concept, the $tdiff() function has been
	expanded to support decimals.  For example:
		$tdiff(60.01) returns "1 minute 0.01 seconds"
	If you like this support and want to see it applied to the other
	$tdiff*() functions, let me know.

*** News 03/24/98 -- New /set, /SET MIRC_BROKEN_DCC_RESUME
	Unfortunately, due to popular demand, i have broken my previous
	promise to never #define MIRC_BROKEN_DCC_RESUME, a feature which
	breaks both the spirit and the letter of RFC 1459.  As a comprimise,
	the ability to use this feature is controlled through a new set by
	the same name, /SET MIRC_BROKEN_DCC_RESUME which will now and forever
	default to OFF.  (Since /set's can be changed by a script, there will
	not ever be a need for me to change this default to ON.)  I stand by
	my previous statement that any script that uses this feature is 
	broken and you should pester the script author to take it out.

*** News 03/24/98 -- /ON DCC_OFFER extended
	If you offer a dcc send to another user, then /on dcc_offer will
	hook with additional arguments:
			$2   - filename being offered
			$3   - size of the file being offered

*** News 03/24/98 -- Built in function $isnumber() changed
	You may now specify a base argument, prepended with a 'b'.
	For example, to determine if '014' is a number in base 6,
		$isnumber(014 b6)	or	$isnumber(b6 014)
	It makes no difference whether the base is the first or the
	second argument:  but you must put a 'b' before it either way.
	Bases 0 through 36 are supported.  Base 0 (the default) is a 
	special base that attempts to auto-grok the argument for its
	base (see the man page on strtol(3))

*** News 03/24/98 -- New built in function $rest(start text) (Matt)
	This function works like $restw(), but it works on strings.  It
	returns 'text' beginning at the 'start'th character

*** News 03/24/98 -- /bind metaX now shows all of the meta-X bindings
	If you do something, like say, /bind meta1, then the client will
	show you all the bindings you have that start with meta1.

*** News 03/24/98 -- The slash (/) always recognized as a command char
	As a consideration to scripters, the client will always accept
	the slash as a command character, even if /set command_chars does
	not include it.  You may then safely and with a free conscience 
	do //built_in_command without having to lie awake at night worrying
	that someone would take away the slash from you.

*** News 03/06/98 -- Add or delete specific levels from /window level
	You may now add or delete levels from your existing /window level
	by prepending the level(s) with a plus ('+') for addition and a
	minus ('-') for subtraction.  For example:

		/window level all	-- sets the window level
		/window level -crap	-- removes JUST crap level
		/window level +crap	-- adds crap level back.

*** News 03/04/98 -- You may now use "special chars" in your input prompt
	Previously, you could use ansi sequences to turn on bold and so
	forth in your input prompt.  Now you may use ircII's "special chars"
	to turn them on as well (like ^B, ^C, etc).  The flipside of this is
	that you may only use "safe" ansi codes, if you use them at all, since
	unsafe ansi codes will be stripped out by the client.  This is 
	intended to be a feature, not a bug.

*** News 03/04/98 -- New character for $info(o)
	If the return value from $info(o) includes the character 'm', then
	you know that you should /set color instead of /set control_color_c.
	This can be used in conjunction with the next note...

*** News 03/04/98 -- IMPORTANT!  /SET CONTROL_C_COLOR RENAMED TO /SET COLOR
	It is important to note this change.  If you have /set control_c_color
	in your script, you should do one of two things to work around this:

	1) Use a compatability /set for older epic4pre1.* clients:
		/on ^set "COLOR *" set control_c_color $1

	2) OR use a compatability /set for newer epic4pre1.* clients:
		/on ^set "CONTROL_C_COLOR *" set color $1

*** News 03/03/98 -- Correct support for "nondestructive spaces".
	You may now use the ^S special char as a "non destructive space".
	This is emitted by the ansi parser when you do the ^[[<N>C code. 
	The general idea of a nd space is that any color/highlight/etc that
	is active *will not* be output for the space (it is left totaly 
	blank of all attributes)

*** News 03/02/98 -- New flag to /input, /input -noecho
	If you want to input a password, or some other sensitive information,
	you may use the -noecho flag to /input to suppress the echoing of
	the characters as they are typed.

*** News 03/02/98 -- Ten new /set status_user(10-19) supported.
	You may now do /set status_user10 through /set status_user19.
	They will show up on your status bar via the %{1}0 through %{1}9
	expandoes.  See below for explanation of how %{N}M works.

*** News 03/01/98 -- Uppercase user modes supported
	Now all 26 of the uppercase user modes are supported, along with
	the 26 lower case modes.  Should cause the client not to crash
	on DALNet and so forth.

*** News 02/27/98 -- Semantic changes for status line expandoes.
	It is now possible to specify a "map" for your status line expandos.  
        The general syntax is:	%{N}M  where 'N' is some number, and 'M' is 
        the expando that you want.  Note that for different values of 'N', 
        you will get different expandos for 'M'.  The default value of N (if
        you do not specify a value) is 0.  To give you an idea how this works, 
        use %{0}S and see that it is the same as %S.  I have included (for 
        testing purposes) a single expando %T on map #1.  Use %{1}T and see 
        that it is *different* than %T.  It is expected that this will allow 
        an effectively unlimited number of status line expandos in the future.

*** News 02/27/98 -- New built in function, $isnumber(text)
	You pass it a number, it tells you if it is a number or not.  It
	correctly handles negative numbers, and hexadecimal/octal.  More or
	less all it does is call strtol(input, NULL, 0).  See the man page 
	for strtol to see how that works.

*** News 02/27/98 -- Four new mask types for $mask().  
	There are now four new types of masks for $mask():

		N		Z is a hostname		Z is an ip address
	-------------------------------------------------------------------
		10		*!*@h.d			*!*@d.*
		11		*!*u@h.d		*!*u@d.*
		12		n!*@h.d			n!*@d.*
		13		n!*u@h.d		n!*u@d.*

	With the following modifications:  In the ``local'' portion of
	the hostname, all sequence of numbers are substituted with a
	single '*'.  That is to say, 
		$mask(10 nick!user@ppp-147-0-52-129.frobitz.com)
	returns
		*!*@ppp-*-*-*-*.frobitz.com


*** News 02/22/98 -- New built in function, $stripansicodes(text)
	This function will "normalize" the text, suitable for displaying.
	Generally, "normalization" has two aspects.  The first aspect is that
	if DISPLAY_ANSI is ON, then all ansi codes are either converted into 
	logical codes (^C sequences, or ^B, or ^_, etc), or they are stripped
	out entirely.  If DISPLAY_ANSI is OFF, then just the escape is mangled,
	and the rest is left intact.  ^C codes are also converted to a form
	that correctly manages bold and blink attributes.  THIS IS THE SAME
	CODE THAT PREPROCESSES YOUR OUTPUT FOR THE SCREEN.  So you can be
	assured that What You Get Is What Youre Going To See.

*** News 02/22/98 -- New built in function, $printlen(text)
	This function returns the number of _printable characters_ in the
	text _as it would appear on the screen_.  The string you pass must
	not contain any ansi sequences, as they are interpreted as printable
	characters.  Use $stripansicodes() to remove them.

*** News 02/22/98 -- New math operator, **
	The ** operator now acts as an exponential operator.  All it does is
	call pow(), so you can specify whatever arguments you want with it.
	Yes, it correctly handles negative exponants and fractional exponants,
	as long as your math library does!

*** News 02/22/98 -- New built in function $remws(lhs / rhs)
	This function returns all of the words on the rhs of the the /,
	except that any words that appear on the lhs of the / have been
	removed first.

*** News 02/22/98 -- New built in function, $pad(len char string)
	This allows you to pad a string out to a certain length with
	a specified character.  If the string is too long, it is NOT
	truncated (as opposed to $[x]y).

*** News 02/18/98 -- Twenty new meta maps [obsolete]
	Yep.  Now there are thirty nine of them.  META1-META39.  
	META4 is still, as always, sticky. [obsoleted by /set max_meta]

*** News 02/18/98 -- New built in function, $channel()
	This returns some information about who is on your channel.  It
	returns a sorted list of nicknames prepended by two characters. 
	The first character is a '@' if the person is a channel operator, 
	and '.' if they are not.  The second character is '+' if the person
	is a channel voice, and '.' if they are not, and '?' if we're not
	sure either way.

*** News 02/16/98 -- New built in function, $iscurchan()
	This takes a channel argument, and will return '1' if the specified
	channel is the current channel for *any* window that is bound to the
	current server.  It returns 0 otherwise.  This is intended to allow
	for more flexibility for testing for current channels in /ON's.  EG:

	Rather than:
		/on ^send_public * {if ([$0] == C) {...} {...}}
	Try doing:
		/on ^send_public * {if (iscurchan($0)) {....} {...}}

	This will allow you to do the "right thing" even when $0 is not the
	current channel for the current window. 

*** News 02/14/98 -- New built in functions: $getuid(), $getgid(), $getpgrp()
	As well as $getlogin().  These correspond to the system calls by the
	same name.  Do a lookup on the man page for information on what they
	return.

*** News 02/14/98 -- Changes to how ansi codes are handled
	IF YOU HAVE /SET DISPLAY_ANSI ON:
	New code contributed by fireclown now eradicates all ansi codes
	from the output before it is counted and displayed.  Any codes that
	are recongized and are "safe" (such as ^[[<X>m, where <X> is one of
	the color codes, or bold/blink/reverse/underline), are converted to
	the corresponding logical character.  All other codes are blown away
	entirely.  Not just the escape, but the whole thing (at least as much
	as we can recognize it.)

	IF YOU HAVE /SET DISPLAY_ANSI OFF:
	Just like before, the escape is mangled into reverse, and the rest
	of the string is untouched.

	Also, since all ansi color codes are converted to ^C codes, then
	if you /set control_c_color OFF, all color will be inhibited.  
	Conversely, if you /set control_c_color ON, all color will be 
	honored.  IT NO LONGER IS RELEVANT WHAT YOUR /SET DISPLAY_ANSI
	VALUE IS TO DETERMINE HOW YOU SEE COLORS!

*** News 02/14/98 -- New ^C codes
	The Control-C Color codes from 00 to 15 are now in "mirc" order
	(which is also used by BitchX).  This has been changed to make it
	easier on scripts that want to be BitchX/EPIC compatable.  The 
	ANSI order codes have been moved to:
			30 - 37		Ansi Foreground colors
			40 - 47		Ansi Background colors
			50 - 57		Emphasized fg/bg colors
	Note that 30-37,40-47 corresponds directly to the ^[[<X>m codes
	and that 50-57 is either the BOLDED colors of 30-37, or the BLINKING
	colors from 40-47, depending on whether or not it is on the lhs or
	the rhs of the color code.

*** News 02/14/98 -- Two new debugging flags to /who
	/WHO -d  (diagnose) will show the contents of the who queue for the
		server for your current window
	/WHO -f  (flush)    will remove all the entries of the who queue for
		the server for your current window.  You must *NEVER* do this
		while a WHO request is still pending, or the client will 
		fall over.  If you report this as a bug, i will laugh at you.

*** News 02/14/98 -- New built in function, $rigtype()
	You give it some number of ignore levels, it will give you all of the
	patterns (exact patterns) that match *only* those levels (no more,
	no less.)  Dont ask, this is what was requested. ;-)

*** News 02/14/98 -- New built in function, $igtype()
	You give it one of your ignore patterns (must be EXACTLY the same.
	This is not for use as a matcher.  Use $rigmask() for that) and it
	will give you the IGNOREd levels on that pattern.

*** News 02/14/98 -- New built in function, $winlevel()
	You give it a window description (name or refnum) and it gives
	you the lastlog levels that are bound to that window.  Simple,
	aint it?

*** News 02/14/98 -- New /set, /SET HIGH_BIT_ESCAPE (0 | 1 | 2)
	This controls the behavior of how the client handles 8 bit characters.
	If this is set to 0, the eighth bit, if any, is always stripped to
	yeild a 7-bit ascii value.  If this is set to 1, then if the 'km'
	termcap variable is set (hint: it almost always is), then the eight
	bit character <meta>-X will be converted into a <ESC>-X sequence.
	If this is set to 2, then the client will leave the character alone
	and parse it as a normal 8 bit character.

*** News 02/14/98 -- New /on, /ON SERVER_LOST
	This is (hopefully) hooked any time youre disconnected from any
	server for any reason.

*** News 02/14/98 -- Variable modifier : (a colon) implicitly declares local
	You may now *** as an lvalue *** prepend the variable name with
	a colon to impliclity declare it as a local variable.  You must not
	use the colon in any rvalue context, or in the /fe or /foreach 
	commands, as the variable is already declared local there.  You need
	only use the colon once.  Any future references will automatically 
	use the local variable because it will have been declared that way.

*** News 02/14/98 -- New flag to /xecho, /xecho -s
	/xecho -s attempts to emulate the internal "say()" function, and
	promises not to output anything if you have run the command with the
	^ modifier to suppress any output.  (Normally, all /xecho's always
	are output, even if you did ^cmd to supress output)

*** News 02/14/98 -- New status line expando, %. (percent-dot)
	This outputs the current contents of whatever was set with the
	/window status_special command (see below)

*** News 02/14/98 -- New /window command, /WINDOW STATUS_SPEICAL
	This /window command sets some window-specific information that
	you would like to see displayed on your status bar.  It will be
	displayed in the status bar using the %. expando (thats a dot)

*** News 02/14/98 -- New built in function, $chop(num text)
	This function returns "text" with the LAST "num" characters
	removed.  If "num" is negative, nothing happens.

*** News 02/14/98 -- /set status_user<3-9> changed
	They now go to your current window rather than to a NON current
	window.  I did this because it seemed everyone wanted it that way.

*** News 02/14/98 -- New set, /set current_window_level <LEVELs>
	This set will allow you to specify some number of levels as always
	going to the current window *if and only if* the current window is
	attached to the same server as the output to that level.  Otherwise,
	it would go to the "normal" window.  This is useful for people who
	want informational stuff to always go to a visible window, so they
	may choose to do  /set current_window_level CRAP

*** News 02/14/98 -- $mychannels() can take an argument
	If the argument is a number, then it is taken as a server refnum
	that youre interested in.  If it is not a number, then it is taken
	as a window name that youre interested in.  But wait!  There's more.
	If you must have a need to specify a window refnum instead of a
	name, you can prefix it with the '#' character and thatll work too.

*** News 02/14/98 -- Documentation updated
	Youll notice this file is way behind the work ive done.  So today
	im gong to go through and update all the stuff ive done since the
	last time i documented it (2 and a half months).  They all have
	todays date, but theyve been done at various times recently.

*** News 12/29/97 -- New built in function $ischanvoice(nick #channel)
	This function returns one of three values depending on the current
	+v status of the given nick on the given channel.
		 0	-- The person is not +v
		 1	-- The person is +v
		-1	-- I dont know

*** News 12/19/97 -- New built in function $mask(type address)
	Returns a pattern suitable for /ignore'ing or banning.  If 'type'
	is N, and the address is Z (either n!u@h.d, or n!u@d.h, where the
	former is a host.domain and the latter is an ip address), then the 
	return value is:

		N		Z is a hostname		Z is an ip address
	-------------------------------------------------------------------
		0		*!u@h.d			*!u@d.h
		1		*!*u@h.d		*!*u@d.h
		2		*!*@h.d			*!*@d.h
		3		*!*u@*.d		*!*u@d.*
		4		*!*@*.d			*!*@d.*
		5		n!u@h.d			n!u@d.h
		6		n!*u@h.d		n!*u@d.h
		7		n!*@h.d			n!*@d.h
		8		n!*u@*.d		n!*u@d.*
		9		n!*@*.d			n!*@d.*

*** News 12/19/97 -- Changes to $winchan() and $chanwin(), now synonyms
	Since there is no compelling reason to make a distinction between
	$winchan() and $chanwin(), and since the specific distinction that
	was made caused no end of problems for both me and scripters, the
	two troubled functions are now synonyms of each other.  If you pass
	it a channel, it will return a window refnum.  If you pass in anything
	that isnt a channel, it will be considered a window refnum or name,
	and the current channel of that window will be returned.

*** News 12/19/97 -- New built in function $winrefs()
	This returns the refnums of every currently open window, both hidden
	and invisible.  While the order of the refnums is *EXPLICITLY*
	undefined, it follows in traverse_all_windows() order, which usually
	returns windows in physical order on their screens, and the invisibile
	windows are last.  You may NOT assume this, though. ;-)

*** News 12/19/97 -- New built in function $querywin(target)
	Given a query target, this returns a window that has that target
	as its current query.  If more than one window has the specified
	target as its query, which window is returned is indeterminite.

*** News 12/19/97 -- New built in function $uname(description string)
	This returns the entire argument string as-is except with the 
	following modifications, as retreived from the uname(2) system call.

	Any instance of		will be replaced with
	---------------------------------------------------------------------
	%m			The "machine" (architecture)
	%n			The "Node" (hostname)
	%r			The "Release" of the operating system
	%s			The "Name" of the operating system
	%v			The "Version" of the operating system
	%a			The logical value of "%s %n %r %v %m"
	%%			A single % 

*** News 12/19/97 -- New built in pattern matcher
	A new pattern matcher has been written.  It is expected to be
	bug-for-bug compatable with the old pattern matcher.  If you see
	any discrepencies, no matter how obscure, please let me know.
	The reason for the new matcher is that it uses an iterative algorithm
	rather than a recursive algorithm, and so is expected to be faster.

*** News 12/19/97 -- New built in commands, /PACKAGE and /UNLOAD
	The /PACKAGE command allows you to "group" all of the assigns,
	aliases, and ons (and stubs) in a script under a common package
	name.  When you use the /package command, any alias/assigns/on that
	are registered until the end of the file are given the current
	package name.  You can change the package name anywhere in a script,
	even if you have previously used /package.  However, packages only
	last until the end of the file -- they never propogate upwards.
	Scripts that are loaded by other scripts may put themselves under 
	a different package name than the one being used by the loading
	script.  By default, a script is put into the package that is
	currently active in the script that loaded it (or * if no package
	is active)

	The idea of a logical grouping is useful for the purposes of 
	removing the entire package later.  So the /unload command allows
	you to remove a package that was constructed as above.  

	The idea behind all this is to allow a script, and anything that
	it loads, to be easily removed whenever you want.  By simply putting
	a /package <something> command at the top of a script, then you can
	later do /unload <something> and everything that was loaded in that
	original script will be removed.

	As these commands will surely be used in the future in ways that
	are not really easy to describe now, you should be careful to not
	pass more than one argument to /package or /unload.  Even though
	multiple arguments may be recognized now, for forwards compatability,
	you should not get in the habit of doing that.

*** News 12/19/97 -- New built in function $cparse(text)
	The $cparse() function returns the given text without modifications
	except for the following exceptions:

	Any instance of		will be replaced with ^C codes to change the 
				text to		text to		background to
	---------------------------------------------------------------------
	%k	%K	%0	black	  	bold black	black
	%r	%R	%1	red  	  	bold red	red
	%g	%G	%2	green	  	bold green	green
	%y	%Y	%3	yellow 		bold yellow	yellow
	%b	%B	%4	blue		bold blue	blue
	%m	%M	%5	magenta		bold magenta	magenta
	%p	%P		magenta (think: purple)
	%c	%C	%6	cyan		bold cyan	cyan
	%w	%W	%7	white		bold white	white
	%F			Flashing attribute turned on
	%n			All colors turned off
	%N			Don't put a clear-color tag at the of output
	%%			A single %

	Of course, you need to have /set control_c_color on to see the 
	colors, so this is an easy way for a script to be color-aware 
	while not forcibly imposing colors on an unwilling user. ;-)

*** News 12/19/97 -- Built in functios $winnum() and $winnam() extended
	They can now take a window description (eg, a window name or a 
	window refnum) as an optional argument, and will return the info
	for that window, if it exists.  As always, with no arguments it
	still defaults to the current window.

*** News 12/18/97 -- New /window command, /WINDOW QUERY
	This allows you to set the query nicknames for any window that
	you can specify.  The /query command now uses it.

*** News 12/18/97 -- New attribute, Blinking
	This is a new character attribute, just like underline and bold
	and reverse.  Not all terminal emulations will support it, but
	the linux and freebsd consoles do.  By default, the blink key
	is ^F (think of flashing), and you can input that by /bind'ing 
	something to BLINK.  You can turn it off with /set blink_video off

*** News 12/16/97 -- New script: "man"
	After you do /load man, you will have available a "man" alias
	that will search all of the subdirectores if the man-style help
	pages for the topic youre looking for.  It handles multiple
	sections ok.  Try /man away   to get an idea.

*** News 12/16/97 -- New argument passed to /on join.
	A fourth argument is now passed to /on join.  Here is a summary of
	the the arguments to /on join.
		$0	Nickname of who joined
		$1	Channel that was joined
		$2	Userhost of who joined
		$3	Zero more of the strings (+o) or (+v) 
			    (only on avalon 2.9 servers)
			    -- (+o), if present, is always $3.
			    -- (+v) can be either $3 or $4.

*** News 12/16/97 -- New argument to /help, -WAIT
	If you do /help -wait, then it will not return until the help system
	has finished whatever its doing.  If the user is not currently doing
	/help, it will return immediately.

*** News 12/16/97 -- New argument to /xecho, -NOLOG
	The -NOLOG argument to /xecho inhibits the current output line from
	being logged, either at the /set log level or the /window log level.
	Im not sure why you would want to do this, but Kasi asked for it.

*** News 12/15/97 -- New built in function, $leftpc()
	This function returns the LONGEST string of "text" that contains
	"N" printable characters, where "N" is the first argument to the
	function and everything else is text.  For example:
		$leftpc(10 onetwothre$chr(27)[34mefour)
	return
		onetwothree<blue attribute>
	Note that any non-printable characters that appear after the N'th
	character *will* be included in the output.  This is intentional.

*** News 12/11/97 -- New built in function, $rigmask()
	This works just like $igmask, but in reverse.  You provide it
	a nick!user@host pattern, and it returns to you all the ignores
	that would be triggered by that pattern.

*** News 12/05/97 -- Ten new meta keybindings, META10 through META19
	You now have 19 meta keys to work with.  The client attempts as
	much as possible to conserve space, so this isnt a RAM buster.
	If you dont use the new meta maps, the only space reserved for them
	will be a NULL pointer. ;-)  Meta4 is still sticky.

*** News 12/03/97 -- New flood protection, change to /ON FLOOD
	On flood now takes one more argument:
		$0	The person doing the flood
		$1	The type of flood theyre doing
		$2	The channel (if any) theyre flooding on   (NEW!)
		$3-	The text of the flood.

*** News 12/02/97 -- New flags to /CLEAR and /UNCLEAR
	They are -HIDDEN which clears or unclears all the hidden windows,
	and -VISIBLE for all of the visible windows.  Theyre mutually
	exclusive.  The last one used prevails.  Use -ALL if you want all
	windows to be adjusted.

*** News 12/01/97 -- New built in command, /UNCLEAR
	This command works just like /CLEAR, except it nails the bottom of
	your scrollback display onto the bottom of the screen (or as low as
	possible if you dont have a full screen of display yet)

*** News 12/01/97 -- New built in function, $msar()
	This is a "multiply substituting" $sar().  You give it any number
	of delimited patterns, and it will substitute all of the patterns
	on the text.  Of course, the obvious limitation is that the text
	may not contain the delimiter character.

*** News 11/27/97 -- New built in function, $randread() (srfrog)
	Given a filename, this returns a random line from that file. 
	Yes, it does ~ completion...

*** News 11/25/97 -- New built in function, $igmask()
	You give it a pattern, it returns all of the ignore patterns that
	are matched by the pattern.

*** News 11/20/97 -- New flag to /timer, -WINDOW <windesc>
	This flag will allow you to specify that the timer should go off
	in the specified window.  Please note that the limiations about
	timers that go off in hidden windows still applies.  Use this flag
	with caution until the problem with timers in hidden windows is 
	addressed.

*** News 11/20/97 -- Changes to /dcc close
	You may now use the words "-all" or "*" to indicate that all of the
	dcc's of a given type or dcc's to a given nick should be closed.
	For example:
		To close all of the dcc's you have open to "foobar",
			/dcc close * foobar 
		To close all of the dcc chat's you have open to anyone,
			/dcc close chat *

*** News 11/19/97 -- New built in function, $count()
	This function returns the number of times (possibly overlapping) 
	that a given string appears in some text.  For example:
		$count(. one.two.three)		returns 2.
		$count(ll llll)			returns 3 (think about it).

*** News 11/12/97 -- New /ON, /ON DCC_OFFER
	This hook is activated whenever you make an OUTBOUND DCC OFFER.
	(Kind of the complement to /on dcc_request).  
	Presently, it has exactly two arguments: 
		$0 is the person to whom you are offering the dcc, 
		$1 is the type of dcc you are offering.
	It is possible that more args could be added in the future on request.

*** News 11/11/97 -- New /SET, /SET STATUS_TRUNCATE_RHS **** RECALLED *****
	This set determines which side of the %> in your status bar should be
	truncated if the status bar is wider than the screen.  If this is set
	to ON, then the right hand side of the %> will be truncated back to
	80 characters.  If this is set to OFF, then the left hand side of the
	%> will be truncated so as to allow everything to the right of %> to
	be kept.
		***** This feature is non-operative due to some *****
		*****      serious problems.  It will remain    *****
		***** non-operative until such time it is fixed *****

*** News 11/10/97 -- New script, "pipe"
	This script implements the $pipe() function, which demonstrates how
	you can use /on exec to capture the stdout of an exec'd command and
	return it from a function (essentially acting as a pipe or a backtick
	type operation).  It may not be universally useful as-is.  Feel free
	to tweak it to your taste.

*** News 11/07/97 -- Improvements to /ON
	As part of a larger re-organization of the /on command, three noticible
	changes to the semantics of /ON have been made:

	1) The @ and # "server-specific" qualifiers have been withdrawn.
	   If you used this feature, and desperately need to retain it, let
	   me know and ill work something out with you.  I did not reimplement
	   them on the understanding that nobody would miss them.
	2) Doing /on ^type ^"nick" now works as you would expect, that is to 
	   say, it really does nothing, and it would suppress the default
	   behavior.  This is a lower-cost way to do  /on ^type "nick" #.
	3) You may now do /ON SEND ("send" is just an exmaple, this works for
	   any hook) to see all of the hooks for types that begin with "send".
	   Previously, it was impossible to get a listing of more than one
	   hook type at a time.

*** News 11/05/97 -- Improvements to /TIMER
	/TIMER now attempts to keep track of what the current server and
	current window were when the timer was registered, and will revert
	back to that window/server when the timer expires.  This should prove
	to be much more intuitive.

*** News 10/28/97 -- New flag to /xecho, /XECHO -R
	This flag dumps a raw string to your terminal emulator.  It is
	imperative to notice that the client does *no interpretation* of the
	string.  It is dumped right to your terminal by the /xecho command,
	so it never gets backed by your window/screen.  That means you should
	really only use this to output strings that act as a state-change 
	command to your terminal (eg, setting the xterm title bar, or doing
	an unflash.)  If you output "modifying" codes (like setting colors or
	attributes), it wont get to your window display and will be lost on
	the next window redraw.

*** News 10/27/97 -- New /set, /SET NO_FAIL_DISCONNECT (ON|OFF)     (nuke)
	When this is set to ON, the client will NOT automatically terminate
	your connection to the server if a write() fails.  This is most useful
	for nuke and other people who have static ip's connected to routers
	that retain packets while you are disconnected.  The default is OFF,
	since for most people, a write() failure is a fatal condition.

*** News 10/26/97 -- New built in commands, "break", "continue", "return"
	These built in commands are used for controlling the flow of code
	execution.  They work 99% like they would in C.  When youre in a 
	"while" or "for" loop, the "continue" command will immediately
	terminate the current loop and go back to the top (the 'for' command
	will run the 'iteration' part as it does in C).  When you do a 
	"break" command in "while" or "for", it immediately terminates the
	loop entirely and moves to the next command after the "while" or "for".

	The "return" command is used to immediately terminate execution of
	an alias or on-event.  If an argument is specified, it is assigned to
	the local variable FUNCTION_RETURN.  Those of you who use the old
	"return" alias that just assigns to function_return will find that it
	still works, but it wont terminate the execution of the current alias
	or on (eg, you wont notice any changes.)  Youre encouraged to take 
	advantage of the new functionality. =)

*** News 10/26/97 -- "FUNCTION_RETURN" now a normal local variable.
	When you make a function call, the "function_return" variable is now
	instantiated as a regular local variable.  Previously, the
	function_return variable was trapped for special treatment and was
	a write-only value.  Now it is a read/write variable, so you can use
	it just like any other variable.  The one exception to this is that
	you may assign to FUNCTION_RETURN in aliases that are called from the
	function that instantiated them (as opposed to other local variables
	which are not honored in called aliases.)  This was done out of
	neccesity to be compatable with scripts that presume that you may
	assign to FUNCTION_RETURN and it will carry to the closest enclosing
	function call.  Since FUNCTION_RETURN is stored on the calling stack,
	the arbitrary limit of 128 nested function calls no longer exists.

*** News 10/25/97 -- New Status bar expando -- %K
	This expando will be displayed on the status bar if you are currently
	in scrollback mode in that window.  Should be good for people who
	forget. ;-)  What it actually displays is controlled by a set, 
	/set status_scrollback.  The default is "(Scroll)"

*** News 10/20/97 -- Greatly reduced CPU usage in pre0.30
	Some profiling work showed some really monsterous CPU hogs.  With
	a few minor, yet strategic changes, CPU usage for the testers has 
	been reduced from 60% to 90% compared to pre0.28. (ive seen cpu usage
	under 2:00 a day for someone on 10 channels running with all usermodes
	active running clonebot-detection scripts.)

*** News 10/20/97 -- New built in functions, $regcomp(), $regmatch(), etc.
	There are four new built in functions that give you an interface
	to the posix.2 "regex" pattern matching functionality:

	$regcomp(<pattern>)
		given a regex pattern, it will return a printable string
		representation of the compiled pattern.  You must later pass
		the return value of this function to $regfree() to avoid 
		memory leaks.  The pattern is assumed to be case insensitive,
		and cannot make use of any \(...\) subexpressions.

	$regexec(<compiled> <string>)
		given a compiled regular expression and some text, it will
		return 0 if the string is matched by the compiled pattern,
		or will return nonzero on error.  The return code can be
		passed to $regerror() for specific information.  Of note, 
		the return value '1' means the pattern didnt match.

	$regerror(<error code> <compiled>)
		given an error code and the compiled regular expression from
		which it was generated, this gives you a human readable error
		message.  If the error was from $regcomp(), then you can pass
		the error code "-1", which will then be subtituted with the
		last $regcomp() error code.  Otherwise, error code should be
		the return value from $regexec().

	$regfree(<compiled>)
		given a compiled regular expression, this returns any resources
		that were used by the regular expression.  If you fail to 
		$regfree() everything you $regcomp(), then you will expose a
		memory leak, and that wont be my fault. ;-)  You must not use
		a compiled regular expression after you have called $regfree()
		on it.  To do so will result in chaos.

			
*** News 10/20/97 -- New command line flag, -B
	This does what the stock client's -b flag does.  It loads your .ircrc
	file right at client startup time rather than waiting for the client
	to connect to a server.

*** News 10/20/97 -- New math operators << and >>.
	These are the left-bitshift and right-bitshift operators.  Currently
	they are only available in their binary forms.  There is no support
	for <<= and >>=, as support for that would be problematic.  Since you
	can just do the longhand assignment, their ommision is not a big deal.

*** News 10/16/97 -- New built in functions, $fnexist(), $cexist()
	These two functions return 1 if the given built in function, or
	the given built in command, exist.  It returns 0 if they do not
	exist.  The idea use for these is to provide an alias or function
	that emulates the built in function/command youre looking for, if
	theyre absent (as in older versions).  Of course, this is more of
	a forward looking feature, as it wont help you on older releases. =)

*** News 10/15/97 -- New /set, /SET STATUS_DOES_EXPANDOS (ON|OFF)
	This /set controls whether or not any expandos (eg, $vars or $func()s)
	in the status line should be expanded or left alone.  Please note that
	this option is *very expensive*, and so you should not turn it on
	unless you really do have expandoes in the status_format, and you 
	really shouldnt put expandoes in the status_format if you can possibly
	get away with it. ;-)

*** News 10/15/97 -- New built in function, $currchans(server)
	If you specify an argument, this function will return quoted words
	containing a server refnum and a channel name.  The channels to be
	returned are channels that are currently considered to be "current
	channels" for some window that is connected to the specified server.
	If you specify a server of -1, then $lastserver() is assumed.  If you
	specify no arguments, then all current channels will be returned.
	It is expected that this will be useful to determine if a given
	channel on a given server is a current channel on *any* window. 
	The return value of this function uses double quotes, so it is
	suitable for use in /fe, or to pass to $rmatch().  Just remember to
	glob against "* #chan" (with the quotes!) for any server.

*** News 10/15/97 -- Change to /window (Colten)
	If you specify a window refnum where /WINDOW excepts to find a command,
	then that window will be used as the target window for any further
	commands, *but*, that window will not be made the current window (as
	it would if you had used REFNUM <refnum>).  This is useful for 
	changing an attribute for a specific window but you dont want the
	current window to change.  eg:

			/window 2 double on

*** News 10/15/97 -- Change to $myservers() (Colten)
	If you pass any argument to $myservers(), then a list of refnums to
	open servers will be returned.  The existing behavior of returning a
	list of NAMES to open servers is retained if you pass no arguments.

*** News 10/15/97 -- New built in function, $isconnected(refnum) (Colten)
	This function returns 1 if the specified server is currently connected
	(eg, you have been successfully registered).  If refnum is -1, then
	from_server is assumed.

*** News 10/08/97 -- New /window command, /WINDOW SCRATCH (ON|OFF)
	This allows you to designate a window as being a "scratch" window.
	A 'scratch' window is one that allows direct addressing, and it does
	not scroll.  The support *just barely works*.  That means if you 
	do anything i didnt expect, you probably will crash the client.
	Let me know if you find any ways to confuse this so i can fix them.

	To send text to a given line on a scratch window, use /xecho with
	the -line flag:
		/xecho -window <scratch refnum> -line <line number> text

	/XECHO -LINE will whine at you if:
	* If the window you specify is not a scratch window.
	* You dont specify -window before you specify -line.
	* If the line number you specify is out of range for the window.

	Suggestions/observations:
	* Scratch windows dont deal with being resized very gracefully.
	  I suggest you do /WINDOW NEW SCRATCH ON FIXED ON  so that it cant be
	  resized on you.  You should assume (at this time) that if the window
	  gets resized, the contents are *undefined*.  That will probably be
	  improved in the future.
	* Scratch windows probably should not be attached to servers.  Use
	  /WINDOW NOSERV to make sure they are unbound.
	* There is NO SCROLLBACK on scratch windows.  When you overwrite a 
	  line, it is gone forever.
	* If you "unscratch" a window, then it is implicitly /CLEARed.
	  This to ensure that the status of the window after being returned
	  to normal will be coherent.  The previous contents of the window
	  will be retained in the scrollback buffer.
	* If you do a normal /echo to a scratch window, it will use the line
	  below the most previously output line.  When you reach the bottom
	  of the window, it will go back to the top.

*** News 10/08/97 -- New /window command, /WINDOW NOSERV
	This allows you to specify that a window is not to be bound to any
	specified server.  That means the window will NEVER recieve output
	from any qualified server event, unless you specifically use /xecho
	to redirect output to that window.

*** News 10/01/97 -- IMPORTANT! SEMANTIC CHANGES! IMPORTANT!
	The $winchan() functions and $chanwin() functions have been reversed.
	That is to say, $winchan() now takes a WINDOW REFNUM argument, and
	$chanwin() takes a CHANNEL NAME argument.  This is the reverse of
	what it has been before, and the change was done in order to keep the
	semantics of built in functions coherent  (eg, $chan*() functions
	always take a channel name, and $win*() functions always take a window
	refnum.  A /set has been provided to let you have the old semantics.
	     *** BUT PLEASE MAKE A PLAN TO CONVERT YOUR CODE TO THE ***
	             *** NEW SEMANTICS. PLEASE PLEASE PLEASE. ***

	To let you know if the new semantics or old semantics are in effect,
	the new $info command, ``$info(w)'' command will return 1.  So add
	something like this in your script to get compatability:
			if (info(w) == 1) { set winchan_hack ON }

	IMPORTANT!!!
	The value of $info(w) will change to 2 (two) when this hack has been
	phased out in some future version. *** PROGRAM DEFENSIVELY. ***  Plan 
	to do something reasonable if $info(w) returns a value of 2. (This
	means that the above /set is not available, and the new semantics are
	irrevokably in place.)  I promise that the old semantics will not be
	irrevokably phased out before EPIC4pre5, and that the old semantics
	will most likely be phased out at the time of the production release
	(EPIC4.000)  Please plan ahead for this.

	If all of this ends up being unreasonably complicated or a burden,
	then let me know, and i'll work something out with you.

*** News 10/01/97 -- New /set, /SET WINCHAN_HACK
	This is a *temporary* feature to help ease the transition for those
	who have a substantial amount of code that depends on the semantics
	of $winchan() being "backwards" (eg, that it takes a channel argument
	rather than a window argument).  When this is turned on, $winchan()
	and $chanwin() will have their "traditional", or "reverse" semantics.
	When this is turned off, they will have their "modern", or "correct"
	semantics.  THIS SHOULD NEVER BE TURNED ON UNLESS YOU REALLY NEED IT.
	Please do NOT write new code with the old semantics, it will only
	encourage the broken semantics.

*** News 09/26/97 -- New /on, /ON REDIRECT
	This hooks any time something is about to be redirected to someone.
	If you hook this silently, the redirect will be suppressed.  This 
	would then be useful to filter out stuff that you might not want
	to have redirected.
		$0  - the target to whom the text is about to be sent
		$1- - the text itself.

*** News 09/20/97 -- New function $servernick()
	You give it a server refnum, it gives you your current nickname
	on that server.  This function has been around a while, it just
	never got documented.

*** News 09/20/97 -- #define CONTROL_C_COLOR now in $info(o)
	It is represented by the letter 'c'.

*** News 09/20/97 -- New built in function $chanwin()  <THIS HAS BEEN CHANGED>
	This is the reverse of $winchan().  You give it a window refnum or
	name, and it gives you the current channel (if any) for that window.

*** News 09/20/97 -- New built in function, $winnicklist() (Colten)
	You pass it either a window refnum or a window name, and it returns
	the nicks that are currently on the "nick list" for that window.
	(See the help for /window add for info about the nick list).  If
	you dont specify any arguments, the current window is presumed.

*** News 09/20/97 -- New /set, /SET NO_CONTROL_LOG (Peter Evans)
	When this is /set to on, the client will not output any nonprintable,
	nonspace characters to the log file.  When off, it will have the old
	behavior (dumping everything right to the log as it appears on the
	screen.)

*** News 09/20/97 -- New /on, /ON WINDOW_CREATE
	When a window is created with /on window, then this new hook will
	be activated.  You may assume that any "window" commands that you
	specify in the body will work for the window being created.  This
	is intended for setting "defaults" for windows, like so:

		/on window_create * window double on

*** News 09/18/97 -- Comprimise for /SET STATUS_MAIL
	Because there has been some controversy over the inability to "get
	rid of that damned colon" for %M in /set status_mail, i have agreed
	to take it out.  However, for those of us who like to have 
	/set mail 1, we wont be left with a "(Mail: )".  There is a new
	script called 'setmail", that traps /set mail, and offers two new
	/set's, /set mail_format1, and /set mail_format2, for controlling
	how the mail should look like when /set mail 1 and /set mail 2
	is engaged (respectively.)  I would just suggest that you load it
	in your .ircrc (before you /set mail) and see what i mean.

*** News 09/18/97 -- New error tracking feature
	If an error occurs while you are loading a script, then the client
	will tell you about where the error occured.  I say "about", because
	the client doesnt actually try to run /load'ed commands until it 
	reaches the next valid command, so the command that is in error is 
	always the first one BEFORE the line stated.  As well, when you
	attempt to /assign to an invalid variable, it will tell you what the
	invalid variable name was, so you can hunt it down.

*** News 09/16/97 -- New /set, /SET STATUS_NICK (|Rain|)
	This is a control for how your nickname will appear in the status
	bar.  Following convention, you may use %N in the /set to determine
	where the nick should be placed.  The default is just %N by itself,
	which yeilds the traditional behavior.

*** News 09/11/97 -- New function $nohighlight()
	This function will take any arbitrary input and will convert all of
	the highlight characters (^B, ^V, ^_, ^O, ^C, and ^[) to a "printable"
	format (in reverse).  This allows operators to find hidden attributes
	in channel names that would otherwise be invisibly stripped.

*** News 09/10/97 -- New function, $deuhc()  (Peter Evans)
	This function will remove "*!" or "*!*@" from the front of the
	specified pattern, if it is present.

*** News 09/09/97 -- New /window argument, /WINDOW SKIP (ON|OFF)
	You may now mark that a window should be 'skipped' when you are
	moving to the NEXT_WINDOW or PREVIOUS_WINDOW.  The only way to
	"land" on that window then is to use /WINDOW GOTO or such.  This
	was intended to be used for windows that are not to recieve input,
	such as your OpView window.

*** News 09/09/97 -- New command, /SHOOK <type> <args>
	This is a hokey name, i admit.  Anyone got a better name for it?

	This function allows you to arbitrarily synthesize /on events with
	your own arguments.  This is intended to retro-fit new problems onto
	old solutions.  For example, you could do:

		/on ^public "% &KILLS Received kill message *" {
			shook KILL $2-
		}

	or something like that, to make your normal /on kill handlers to be
	executed while youre on an ef2.9 server.  Or so is the idea.  Let
	me know what you think of this, and if its broken, say so.  
	**** BE WARNED ****
	Code in on hooks that depend on side effects (like $userhost()
	being set) will be *utterly confused* by these synthetic events, and
	will probably get wildly incorrect results.  You yourself are 
	responsible for making sure that this doesnt happen to you!

*** News 09/09/97 -- New /window argument, /WINDOW FIXED (ON|OFF)
	You may now "fix" a window as being a given size.  When a window is
	"fixed", it will never be shrunk or grown when you shrink or grow
	another window, and it is immune to /window balance.  You can still 
	directly shrink or grow a fixed window.  The only exception to this 
	is if all windows on a screen are fixed, and the screen is resized, 
	the bottom window of the screen will be forcibly resized, although it
	would still be "fixed". This was all done so that the OpView window 
	can be set to 4 lines and it will stay that way unless you explicitly 
	change it.

*** News 09/09/97 -- New /set, /SET BANNER_EXPAND
	If this is set to ON, then the contents of /SET BANNER will be
	expanded ($-substitution will occur) before it is used.  If it is
	OFF, then the value of /SET BANNER is used literally.

*** News 09/05/97 -- Changes to how windows are resized
	When you resize your display, then the proportion of window sizes
	between the non-fixed windows will be retained.  That is to say,
	if you had two windows, sizes X and 2X, and you change the screen
	so that the first window has size Y, then the second window will have
	about size 2Y.  When you rebalance your windows (with /window balance),
	all the nonfixed windows will be set to approx.  the same size.
	Fixed windows will not be touched. 

*** News 09/05/97 -- Now friendlier with job control
	If you want to suspend the client but are worried about it pinging
	out, you should be able 'bg' the client now, and it wont stop due
	to (tty output) or mangle your screen.  You will need to stop the
	client (with 'kill -STOP %1') before you 'fg' it again, or the client
	wont accept input.  This is not a bug, this is a job control problem.
	This should satisfy anyone who still pines for 'ircserv' ;-)

*** News 09/04/97 -- New /on, /ON DCC_LIST
	Many people have asked for an easy way to reformat the DCC output.
	So this new on will output the 8 most interesting capabilities.
	Im open to adding new ones, just let me know.  The 'banner' of the
	list is output with $0 being "Start" and the rest of the fields being
	filler.
		$0  - The type of DCC connection
		$1  - "1" if encryption is on, "0" if its not  (future exp)
		$2  - Nickname of the peer
		$3  - Status of connection
		$4  - $time() when connection established, 0 if not connected.
		$5  - Size of the file transfer, 0 if not applicable
		$6  - Number of bytes transfered, 0 if not connected
		$7  - Description field (usually the full filename)

*** News 09/04/97 -- Some new behavior for your display
	A lot of the code that handles your display has been rewritten.
	The most important changes are:  When you scroll backwards, you will
	get the lines that actually appeared on your screen, not the lines in
	your lastlog.  Those lines are output at the width they were split
	for, and if your screen is a different size, they wont be re-split.
	This is not a bug.  Do not report it as a bug.  When you are in
	scroll mode, the screen will not automatically scroll for you if
	the display reaches the end of the screen.  Instead, that stuff is
	put into the hold buffer.  You can use the SCROLL_FORWARD key to go
	forward a page *even into the hold buffer*, and all new output will
	appear as long as that output doesnt make the screen scroll.  Use the
	SCROLL_END key to go back to the "normal" scrolling behavior.
	You cannot turn HOLD_MODE off if youre in scrollback mode.

*** News 08/27/97 -- New /set, /SET CLOCK_FORMAT
	This /set, if set, controls how the client should represent the
	current time on your status bar, among other things.  Rather than
	have the representation be hardcoded in the client, this will give
	you the flexiblity to have the time displayed just however you want.
	By default, this /set comes UNSET.  When this is unset, the more
	traditional behavior of /set clock_24hour determines how the time
	should appear.  If you /set clock_format, it *overrides* the setting
	of /set clock_24hour.

*** News 08/25/97 -- New built in functions, $substr() and $rsubstr()
	These functions allow you to look for a string inside of another
	string.  It takes two or more arguments, with the first argument
	being the string to look for (use double quotes if it has spaces
	in it) and the rest of the arguments being the words to look in.
	(You dont need quotes for this arg.)  It returns -1 if the string
	could not be found, or returns the offset (counting by zero) where
	the string may be found in the source.  $rsubstr() looks backwards
	from the end of the string rather than from the front.

*** News 08/22/97 -- New flag to /XECHO, -B
	The /XECHO -B flag instructs the client to prepend the current value
	of BANNER_VAR before the line to be output.  This allows you to output
	something with a banner without having to worry about BANNER_VAR.  If
	you have have /set show_numerics ON and the hook happens to be a 
	numeric hook, then the numeric will be output.

*** News 08/20/97 -- Limits on /echo now removed
	There have always been limitations to the size of lines being handled
	for display.  Recent limits have been 2048 characters or 40 lines to 
	the screen, and 20480 characters to the lastlog or to a log file.  
	All of these limitations have now been eliminated, and any size line 
	(within the confines of available memory) can be handled without 
	excuses.

*** News 08/19/97 -- Handling of ^C colors, new set, /SET CONTROL_C_COLORS
	^C colors (eg, ``mIRC colors'') are now handled in the output stream.
	Whether or not anything is done with them is controlled by a compile
	time option (which is further controlled by a /set).  If you #define
	CONTROL_C_COLORS, in config.h and you /set CONTROL_C_COLORS ON, then 
	they will be parsed and converted into colors.  If you #undef it, 
	then the value of the /set will not matter, colors will never be 
	honored.  Sorry, but the "old" behavior of leaving them unchanged in 
	the output stream is no longer available.  You either must honor them 
	or you must have them filtered out.  (I doubt anyone will have a 
	problem with this.)

	By default, the #define is #undef'd, and the /set is turned off.
	The defaults will never change in future releases unless there
	is overwhelming public pressure to change them.

*** News 08/17/97 -- New operator, #~ (prepend operator)
	This is similar to the #= operator, which appends text to a variable.
	This operator PREPENDS text to a given variable.

*** News 08/17/97 -- New flag for /timer, -REPEAT
	The /timer -REPEAT flag takes one argument, which is given to be
	the number of times that the specified action should be repeated
	(every specified interval).  The /timer -LIST flag reflects the
	number of events left to be scheduled.

*** News 08/17/97 -- New script, "MOTD"
	This script re-implements client-side MOTD files.  It uses the two
	below functions.  Its only provided for those of you who miss this
	feature.

*** News 08/15/97 -- New function $ftime()
	This function returns to you the "mtime" of a given file (see stat(2))
	In ordinary words, this was the last time that the file was modified.
	It is the time that you see for an ordinary "ls -l" listing.  It is
	returned in seconds since the epoch, so youll need to $strftime() or
	$ctime() to convert it to human format.

*** News 08/15/97 -- New function $irclib()
	This function is only useful if you need to know where the IRCLIB
	is.  An example of its use is the "motd" script.

*** News 08/15/97 -- New function, $winbound()
	This function takes one argument.  If the argument specified is the
	name or refnum of a window, then the name of the channel bound to that
	window (if any) is the return value.  If the argument specified is
	the name of a channel, then the window refnum to which it is bound
	(if any) is the return value.  In case of ambiguity (if you have a
	window name that looks like a channel name), the window takes
	precedence over the channel.

*** News 08/08/97 -- Notify can now do userhost lookups automatically
	Most people (everybody?) do a /userhost request in their 
	/on notify_signons, and that has been distressing to many servers,
	because when you connect there is a flurry of ISON and USERHOST traffic
	and many people have gotten trapped in "flooder mode".  Some have 
	tried, with limited success and much agony, to batch up userhost
	requests to help.  In the interests of cutting down on client->server
	traffic needed for NOTIFY events, the client can now automatically
	fetch userhosts on your behalf.

	To turn on this feature, /set NOTIFY_USERHOST_AUTOMATIC on.  When
	this is ON, the client will dispatch userhost queries for everybody
	who is 'triggered' for that minute.  It does intelligent batching,
	so you wont be flooding the server as much.  This is ideal for when
	you initially connect and your flurry of ISONs and USERHOSTs can
	sometimes make the server hate you.  If this is OFF, then the 
	traditional behavior applies as normal.

	To accomodate this new feature, /on NOTIFY_SIGNON now takes two
	arguments:  The new second argument is the userhost of the person
	signing on.  If you have the automatic userhost feature turned off,
	the second argument will be empty.

*** News 08/08/97 -- New /set, /SET XTERM
	You may now use this set to specify what "xterm" program you want
	to use for /window create.  Note that this can be overriden by the
	XTERM environment variable.  This was done on purpose, so that those
	who have been setting the XTERM environment variable wont be suprised
	by the /set's "default".

*** News 08/08/97 -- New servcmd support (SQUERY, SERVLIST, WALLCHOP)
	The client now natively recognizes the SQUERY, SERVLIST commands
	from av2.9 servers, and the WALLCHOP command from u2.10 servers.
	I didnt implement WALLCHOP in the same way as contributed, so I
	might get yelled at and change the implementation soon. ;-)

*** News 08/08/97 -- Can send multiple files with /dcc send
	You may now specify more than one file with /dcc send nick <file>.
	I guess thats useful in conjunction with $glob(*) or something.
	Each request is sent out in a seperate PRIVMSG (obviously), so
	you should be careful not to send out TOO many files at a time...

*** News 08/08/97 -- New /on, /ON KILL
	This should simplify a lot of people's lives.  When you recieve
	one of those messages "*** Notice -- Recieved KILL message for ...",
	/ON KILL will be hooked with the following arguments:
		$0  - The server who sent the message (your server)
		$1  - The hapless victim
		$2  - The bastard who did the kill
		$3  - The server path to the bastard
		$4- - The reason for the kill

*** News 08/04/97 -- New /on, /ON OPER_NOTICE
	The server uses "sendto_ops" to send an notice to all operators.
	The client now automatically deals with this.
		$0  - the server that sent you the notice
		$1- - the text of the message AFTER the *** Notice --- part.


*** News 07/28/97 -- New built in function, $uhc()
	$uhc() takes a single argument, which is a partially constructed
	nick!user@host pattern, and returns a fully qualified nick!user@host
	pattern.  That is to say, any parts that are missing are filled in.
	This is a front end to cut_n_fix_glob(), which is the function that
	"fills in" your arguments to /ignore, so this works identically as
	the nick!user@host argument to /ignore.

	$uhc(nick)		returns		nick!*@*
	$uhc(user@host.com)	returns		*!user@host
	$uhc(*.host.com)	returns		*!*@*.host.com


*** News 07/28/97 -- New /SET, DO_NOTIFY_IMMEDIATELY
	If this is set to ON, then when you do the /notify command, an
	ISON will be immediately dispatched (the usual behavior.)  But if
	this is set to OFF, then the ISON is not immediately performed, and
	you will have to wait until the top of the next minute to see if 
	the person is on.  This is intended to be used in your .ircrc, 
	because some users have a zillion people on notify, and they end up
	sending enough lines to the server when they connect that they activate
	the server's flood control mechanism, then the server starts slowing
	you down, and thats just a big hassle.

*** News 07/28/97 -- New /SET, NOTIFY_INTERVAL
	This one is a bit tricky.  The value of this set is taken to be
	a suggestion about how frequently NOTIFY checks should be performed.
	This does not ever make the client check at any time other than the
	top of every minute, but it is possible to tweak this variable so
	that some minutes will be skipped.  For most sane people, setting
	this to be a multiple of 60 is advised.  Setting this to less than
	60 does not make it check more frequently than once a minute.

	/set notify_interval 60		yeilds the "customary" behavior
	/set notify_interval 120	makes it only check every 2 minutes
	/set notify_interval 150	makes it check only twice every 5 mins
					at minutes 3 (180s) and 5 (300s).


*** News 07/28/97 -- Two new /SETs, AUTO_REJOIN_DELAY and AUTO_RECONNET_DELAY
	These two control the amount of time that must pass between when
	you are kicked or killed, and the time that you attempt to rejoin
	or reconnect.   Reconnect is probably not totaly intuitive, as it
	attempts to bind the server to the current window *at the time that
	the timer expires*, not the window that was disconnected from.
	Arguably, this is a bug, and may be "fixed" in the future.  The 
	implementation for these is kind of hairy.


EPIC4pre1

*** News 06/18/97 -- New feature, "CPU SAVER"
	Some of you have asked me for a way to make ircII use less CPU
	especially when you are idling and detached.  Every minute ircII
	sends out your notify list, parses the replies, checks the clock,
	updates your status line, and other various housekeeping duties.

	But when youre detached, you dont really care if your notifies
	dont get processed promptly every 60 seconds, you dont care if
	the clock is accurate every moment, and you would prefer that
	the client not go to the trouble of wasting CPU time just to
	keep track.   This wont help if youre on busy channels, or
	logging wallops, only if the only traffic youre getting are
	the pings from the server.

	There are several new sets:
	/set CPU_SAVER_AFTER -	If you havent typed anything after
				this many minutes, CPU saver mode activates.
	/set CPU_SAVER_EVERY -	If cpu saver mode is on, the client will
				only do housekeeping every this many minutes.
	If either of these two are 0, then cpu saver mode cannot be
	activated, and the "traditional" behavior will apply.

	If youre interested in seeing when the client is in cpu saver
	mode, there is a new status line expando, "%L".  There is also
	a new /set, /SET STATUS_CPU_SAVER which determines how the %L
	expando will look when it is activated (just like STATUS_MAIL)

	There is also a new keybinding, "CPU_SAVER", which if bound to
	a key will activate cpu saver mode without having to wait.

	I did this on a whim, mostly because i havent done any features
	in a long time that have required this many changes, and I wanted
	to have some fun, so i just let loose with this and went berzerk
	If i forgot some obscure feature with this, let me know! ;-)


*** News 05/31/97 -- New environment variable honored, ``IRC_SERVERS_FILE''
	Someone had suggested something close to this -- they wanted a 
	way to specify a SERVERS_FILE as an absolute path rather than
	having it in their irclib directory.  So you can now set this
	environment variable to an absolute path where you would like the
	client to get your server list from.  This overrides any
	built in SERVERS_FILE setting, if appropriate.

*** News 05/31/97 -- Semantic clarification for /TOPIC
	Due to the confusion between the very common ``topic'' alias
	and the built in TOPIC command syntax, I have expanded the
	built in TOPIC command to do everything that everyone expects
	TOPIC to do, towit:

		/topic This is a topic		(set current channel topic)
		/topic * This is a topic	(same thing)
		/topic				(see topic on current chan)
		/topic *			(same thing.)
		/topic #chan This is atopic	(set topic on #chan)

	I strongly advise you to throw away your /topic alias unless it
	does something up and beyond this.  If it does, let me know, and
	I can include its semantics in the client, if its reasonable.

*** News 05/19/97 -- All new syntax for /IF
	As if ircII wasnt becoming PERLish enough, ive modified the
	/IF command to be more perl-like:  You may now use the 
	"elsif" modifier to indicate a blocked if command, eg:

		if (....) {
			....
		} elsif (...) {
			....
		} elsif (...) {
			....
		} else {
			....
		}

	(The final "else" is optional.)  Note that the placement of
	the "elsif" and "else" modifiers is critical:  They MUST be
	on the same line as the closing } to which they modify, or the
	/LOAD parser will get totaly confused and munge the whole
	thing up.  This is a limitation that applies only to how
	scripts are loaded -- sorry.

*** News 05/09/97 -- New function added, $findw(word ...text ...)
	This addresses the two most common complaints people have
	about $[r]match():

	1) This function returns the WORD NUMBER of the word
	   in text, such that $word($findw(word .text.)  .text.)
	   returns "word".  It returns -1 if word is not found.
	2) This function does not do anything screwy about quoting
	   or unquoting your input.  It just looks for the word,
	   thats it.  No pattern matching, no frills, and its fast.

*** News 05/09/97 -- Semantic weakness closed
	There was a semantic weakness with respect to the word count
	and strlen modifiers ($#var and $@var) such that if you did 
	not provide a variable to modify, an unuseful value was returned.
	Since this was likely to cause confusion, these cases are now
	defined to implicitly assume $* as the default argument. eg:
		$#   all by itself is now the same as $numwords($*)
		$@   all by itself is now the same as $strlen($*)
	These are *NOT* built in functions.  The # and @ characters
	still are considered to be modifiers.  The weakness was that
	these modifiers did not return meaningful values when a value to
	modify was not provided:  This change stipulates a useful default.

	In a seperate, but related topic, a change was also made to
	the math parser to honor this change in that context.  That
	is to say,   @ foo = #   now assigns to `foo' the number of
	arguments in the current context.  NOTE THAT THIS IS NOT A
	FUNDAMENTAL CHANGE!  We're just saying that the default value
	for the # and @ modifiers is $*.  This is not a "function"!

*** News 05/05/97 -- New flag to /WINDOW,  /WINDOW LASTLOG
	/WINDOW LASTLOG lets you individually tweak the size of a 
	window's lastlog.  This was introduced because this used to
	be the default beahavior of /set lastlog, but now that /set
	lastlog is a global action, we still need a way to do this...

*** News 04/29/97 -- New /set, /SET QUIT_MESSAGE
	This will be your default quit message.  If you do something
	stupid, like unset this completely, the client's version will
	be used as the default.  Of course, any argument you pass to
	/quit or /signoff will override this /set.

*** News 04/29/97 -- New /set, /SET DISPATCH_UNKNOWN_COMMANDS
	If you type a command that is not recognized by the client,
	and youre one of those people who /never/ mistype a command,
	then you can /set this to ON, and the client will dispatch any
	otherwise unrecognized commands to the server.  Im sure your
	server admin will love you if you do this.

*** News 04/29/97 -- New built in function, $winchan() <THIS HAS BEEN CHANGED>
	You give it a channel name, and an optional server name
	or server refnum, and it tells you what window refnum that
	channel belongs to. (Written by IceKarma)

*** News 04/29/97 -- New flag to /lastlog, /lastlog -max
	You can use /LASTLOG -MAX to specify the maximum number
	of matches you want to display, regardless of any other
	flags.  The default is no limit.  This was written by Sheik.

*** News 04/29/97 -- New functionality to /stack,  /stack set
	You can now do /STACK (PUSH|POP|LIST) SET just as you can
	already with ALIAS/ASSIGN/ON.  This was written by Colten.

*** News 04/21/97 -- New set, /SET BANNER
	The /SET BANNER variable now controls what special banner will
	be prepended to informational messages from the client.  Up until
	now, the banner has been three stars ("***"), and many people dont
	like that or want to be able to change it.  Now you can.

*** News 04/21/97 -- New on, /ON SET
	/ON SET is a way to extend the capabilities of the /set command.
	The /ON SET hook is passed two or more arguments, with
		$0  -- is the name of the variable to be set
		$1- -- is the value the variable will be set to.

	The main idea is the ability to offer /set variables that are
	not built into the client, and execute ircII code to handle that
	situation.  The other idea is the ability to suppliment or override 
	a built-in set variable when it is changed.

	If you hook /ON SET with the "SILENT" modifier ('^'), then the
	default action (if any) will not be taken.  This may mean that
	if the variable is not a built in variable, no error will be
	output.  If the variable IS a built in variable, then the variable
	will NOT be set after the fact.

	There are two ways to get around this:  You can either hook the
	/ON SET with the "quiet" modifier ('-'), or you can use the /set
	command inside of the /on set body.  If you attempt to /set a 
	variable that is already being parsed by /on set, you will NOT
	be offered the /on again -- it will directly set the variable:

	Example:
		on ^set "exec_protection off" {
			echo *** You cannot set EXEC_PROTECTION off!
			set exec_protection on
		}

	Or:
		on ^set "auto_rejoin_delay *" {
			echo *** AUTO REJOIN delay set to [$1] seconds.
			@ myscript.autorejoin.delay = [$1]
		}

	Then you could do:
		/set auto_rejoin_delay 4


*** News 04/17/97 -- $X now reflects your ``real'' userhost
	When you connect to a server, the client asks the 
	server what your userhost is, and then that value is
	reflected in the $X variable.  Different server connections
	may have different $X values.

*** News 04/17/97 -- Changed semantics for USERHOST command
	The userhost command will act the same as always, except
	under the following  condition:

	If you do /userhost <nick(s)> -cmd, and *every* nick so 
	specified is on one of the channel(s) you are on (so that 
	the client already has the userhost cached), then the -cmd 
	code will be executed immediately, and the client will *NOT* 
	ask the server for the userhost information.  You are 100% 
	guaranteed still to get accurate information, you will just
	get it without waiting for the server query!  The only caveat
	is that the AWAY and OPER fields will be specified with the
	false value.  If you currently use the /userhost command to
	determine if a person is an operator, keep reading.

	A new flag has been added to the USERHOST command, -direct.
	The -direct flag forces the client to do a server query for
	the specified nicknames, even if all of the nicknames are 
	known to the client beforehand.  This can be used to get
	accurate AWAY and OPER information.  This flag only makes sense
	with the -cmd flag, since userhost caching does not happen
	unless the -cmd flag is specified.

*** News 04/10/97 -- Two new operators =~ and !~
	The two operators are intended to be similar to the perl operators:
	The lhs of the operator is expected to be a plaintext string, and
	The rhs of the operator is expected to be a wildcard expression.
	The operator returns a true value if the pattern matches the text,
	and it returns the false value if it does not.

	This is intended to be a low-cost alternative to the $match() and
	$rmatch() built-in functions when the only thing you need to do is
	see if a string is matched by a pattern.  If you need to select 
	from more than one pattern, use $match() or $rmatch().

*** News 04/07/97 -- Asynchronous code may use local variables
	You may reference local variables in asynchronous code
	provided that you follow the rules that have already been
	laid down.  See the regress/kill script for more info.

	1) You have to use /bless in the asynchronous code in order
	   to have access to the underlying local variables.
	2) You have to use /wait in the synchronous code in order to
	   make sure the local variables dont go away.
	3) Make sure you clean up your own messes.  Asynchronous code
	   lying around, resulting in /bless calls when there is no 
	   context for local variables is not a good thing.

*** News 03/31/97 -- New argument to /WAIT command, ``for''
	Yes, ``for'' without a hyphen.  This command guarantees that
	the code given as the argument is executed synchronously.
	That is to say, if the arguments, when executed, sent something
	to the server, the command will not return until that request
	has been completed (as if a wait had been done.)  But if the
	code does not send a query to the server, no wait is executed,
	and the command returns immediately after the code completes.

	You can also mix and match ``wait for'' with regular ``wait''
	calls and the client will be able to figure out what to do
	without waiting extra more than it needs to.

	And as always, using /wait or /wait for and /redirect at the 
	same time is a bad thing (tm), so dont do it.  The result is
	undefined behavior (eg, what happens isnt my fault.)

*** News 03/19/97 -- About the new who/ison (and soon userhost) queues.
	The client now keeps a FIFO (queue) of who/ison/userhost queries
	you make.  It is *critically* important that you do not confuse
	these queues (due to the nature of these server queries, there is
	no way to have any reasonable error recovery). 

	The following behaviors are forbidden (but the client wont stop
	you from doing them)

	* Using /ON ^RAW_IRC to wedge the 303, 351, or 315 numerics.
	  If you do this, the queues wont be properly flushed, anyone
	  waiting on a proper reply wont be handled, and any further
	  reqeusts will be thought to be previous queries, and all hell
	  will break loose.
	* Using /QUOTE to launch USERHOST, ISON, or WHO requests..
	  If you do this, the client will whine at you when it gets
	  unexpected replies and will eat the information.  If you launch
	  another query before the invalid one finishes, all hell will
	  break loose.

	*** THERE IS NO WAY TO RECOVER IF YOU DO THESE THINGS ***
	If youre stupid enough to do it, you get what you deserve.

*** News 03/18/97 -- Expanded syntax for $userhost()
	For your convenience, the $userhost() function now takes arguments:
	You may specify one or more nicknames as arguments to the $userhost()
	function, and the corresponding userhost(s) for the nick(s) specified
	will be returned.  The string <UNKNOWN>@<UNKNOWN> will be inserted
	for any nicknames whose userhost is not known.  The nickname(s)
	specified *must* be people who are on channels you are also on for
	the current server!  (See the second caveat)

	* Caveat -- Because it can take time for the WHO query to complete
	after you join a channel, there is no definite way to know if
	$userhost() for a person on your channel will succeed or not.
	You should probably be prepared to launch a /USERHOST query in
	case of failure.  This deficiency may be altered or modified in
	the future to block if an otherwise valid request is made while
	a WHO query is still pending.

	* Caveat -- This function will never be modified to launch a server 
	query.  That means that this function will only ever recognize those 
	nicknames that are common to channels you are on.  If you want to find 
	the userhost for other users, you should use the /userhost command.

*** News 03/18/97 -- Expanded syntax for /who
	For your convenience, the /who command now takes two new arguments:

	-line {...}	The code inside the braces will be executed for each
			line returned by the who query.  The arguments are
			exactly the same as for the /on who hook, except that
			this flag is *guaranteed* to override the default
			/on who, and will also *go away* when the current who 
			query is finished.

	-end {...}	The code inside the braces will be executed at the
			end of the who query, when the 315 numeric is parsed.
			The arguments are:
				$0 - server queried
				$1 - body of the query
			This is guaranteed to to override the default /on 315,
			and will also go away once the current who query is
			completed.

	These command bodies will be executed asynchronously, which means
	that you must assume that the enclosing code scope will complete
	before the code is ever executed (e.g., the same rules as for the
	/userhost -cmd flag.) unless you use /wait.  You are encouraged
	to not use /wait if you can figure a way around it.  Code that is
	not concerned with being stricly backwards compatable with the
	stock client is ***strongly encouraged*** to use these new flags.

	Underlying this change is a new re-entrant WHO queue, which allows
	you to launch more than one WHO query simultaneously.  No longer do
	concurrent WHO requests have to wait for previous queries to complete,
	and no longer (with the above flags) does the caller need to put the
	WHO command in a /stack-/on-/wait wrapper.

*** News 03/17/97 -- /on 312, /on 319 changes
	All of the whois numerics: 311, 312, 313, 314, 317, 318, 319
	now pass $0 as the server name and $1 as the target of the 
	whois query.  All the rest of the arguments are passed as $2-.
	Previously, some of these numerics passed the target as $1,
	but not all of them.  I changed it this way for consistancy.

*** News 03/17/97 -- New: /ON STATUS_UPDATE and $status()
	/ON STATUS_UPDATE is hooked whenever any of the status lines
	for any of the visible windows changes **and you are in dumb mode**:
	   $0  is the refnum for the window whose status line has changed
	   $1  is the status line in that window that has changed
	   $2- is the actual status line for that window.

	$status() can be used to fetch the current status line for any
	visible window.  Invisible windows do not have their status lines
	updated, so they may be inaccurate.  This problem may change in
	the future.  Pass two arguments:
	   $0  is the refnum for a window
	   $1  is the status line

*** News 03/02/97 -- Local variables can now span entire array tree
	The syntax:
		``local x.y.''
	will define all variables in the subarray $x[y][...] to be
	implicitly considered local variables.  That is to say, the
	entire variable tree rooted at $x[y] is local to that scope.
	This was requested by a user for compatability with another
	client.  All local variables that are instantiated in this
	manner have the same scope as the explicit declaration above.

*** News 02/18/97 -- New built in variable, /SET CONNECT_TIMEOUT <seconds>
	Set this to the number of seconds you want your connect()ions to	
	block before they time out.  Note that this doesnt affect
	connect()ions that are already in progress, only those that are
	started after you set it.  The default is 30.

*** News 01/30/97 -- Expanded syntax for /LOCAL, /STUB
	You may now specify more than one name per command:  Each name
	will be treated independantly of all others.  The names must be
	seperated by a comma, and ***must not*** have any spaces between
	the commas and the names (that is, all of the names must form one
	logical word).  To declare both "foo" and "bar" as local vars,
			/local foo,bar

	You can do this to stub more than one alias/assign to the same
	file, as well:
			/stub foo,bar filename

*** News 01/29/97 -- New command /BLESS
	Currently this command ignores its arguments.  This may change
	in the future, so you should not get in the habit of supplying
	arguments to this function, for forwards compatability.

	The ''BLESS'' command is used to allow an asynchronous scope to
	access the local variables of the underlying synchronous context:

		alias foobar {
			local myvar $0
			userhost $1- -cmd {
				bless
				echo $myvar -- $0!$3@$4
			}
			wait
		}

	Note that the use of 'bless' must be paired with an appropriate
	call of ``wait'' in the synchronous context, or this wont work.

*** News 01/27/97 -- New flag for /EXEC, -direct
	Syntax:
		/EXEC -direct <commands>

	This simulates the effect that unsetting the SHELL variable
	causes, that is, the command is executed directly, without
	invoking a subshell.  This is appropriate for those who wish
	to execute a command passing untrusted data as an argument:
	With this flag, there would be no shell to interpret metacharacters,
	thus cutting down on that ability to have an accidental back door.

*** News 01/27/97 -- New command, /SETENV
	Syntax:
		/SETENV <var-name> <new-val>

	Sets the process environment variable <var-name> to the value of
	<new-val>.  This command is not neccesarily useful, nor is it 
	always appropriate, but it is provided for completeness.  There
	are several places in the code that can benefit from the ability
	to change environment variables after startup (eg, TZ).  It also
	allows you to set environment variables for /exec'd processes,
	and it is also possible to really foul things up if you mangle
	important environment variables such as DISPLAY and so on.

*** News 01/24/97 -- New, /ON ODD_SERVER_STUFF
	This is hooked whenever the server sends you something
	that the client doesnt recognize.  This is usually when
	you try to connect to a non ircd server, or you use some
	extension that isnt yet supported.  You are strongly 
	encouraged to use this interface to support new features
	rather than using /on raw_irc because this hook is only
	activated when something unexpected occurs (which is rare),
	rather than for every incoming line, as raw_irc does.

	$0  is the server that sent it to you, '*' if unknown
	$1- is the unrecognized command and its arguments.

*** News 01/22/97 -- /FE, /FOREACH use local variables now
	The "control variables" for the /FE and /FOREACH command
	now are local variables.  They will not disturb global variables,
	but they will destroy any local variables you have by the same
	name.  You dont have to explicitly declare the variables as local,
	it is done automatically for you.  Note that the normal warnings 
	for local variables still apply -- dont use any variable name that
	is the same as a global variable you might want to use later in
	the same alias/on. 

*** News 01/18/97 -- Support for local variables
	You may define a local variable with the following command:

		LOCAL <varname> [<value>]

	It mirrors the ASSIGN command.  Note that local variables act
	in exactly the same way as normal variables, except you cannot
	get rid of them.  You also do not (yet) have any way to get at
	a global variable that has the same name as a local variable, so
	choose wisely.  An example:

		alias foobar
		{
			local b			(declare LOCAL var $b as []) 
			assign a 4		(assigns 4 to GLOBAL $a)
			local a 5		(assigns 5 to LOCAL $a)
			eval echo $a		(outputs '5' -- local)
			@ a = []		(clears LOCAL variable)
			eval echo $a		(outputs '' -- local)
		}

	Restrictions:
	* You cannot have local aliases -- only local variables
	* You cannot save local variables.
	* You cannot (yet) access a global variable with the same name
	  as a local variable.

	This support is EXPERIMENTAL and still has some development to go 
	before it is mature.  


[[ Additional note ]]
People are apparantly looking in here to see where some of the features 
(like translation tables) went to.  Please refer to "doc/missing" before
reporting a removed feature as a bug.  Thanks.

EPIC3.003	[[MORE BY DEMAND]]

*** News 12/30/96 -- Support for all 26 possible user modes
	All user modes are now supported.  This should be the last
	of it until someone comes up with the bright idea of making
	uppercase modes mean different things (and ill strangle the
	bastard who does...)  I based it on the idea from sheik, but
	i took a quite different approach...

*** News 12/27/96 -- New built in command /repeat
	Up until now, /repeat has been an alias.  This has been a pain
	in the butt, because all of them either cant be used recursively,
	or theyre terribly expensive to use (or both).  So now you have
	a zero-overhead /repeat command that can be used without any
	headaches.

	There are two forms.  The old one you all know and love, and a new
	form that allows you to specify an expression in parens:

		/repeat text command(s)		(traditional form)
		/repeat (exp) command(s)	(new form)

	eg, the following two commands are equivalent:

		/repeat $var {commands}
		/repeat (var) {commands)

*** News 12/12/96 -- New command, /input_char
	/input_char is identical to /input, except that it returns after
	only one character has been pressed, instead of waiting for the
	return key to be pressed.  See the 'less' script for an example.
	/input_char has problems with /wait and /pause just like /input.

*** News 12/12/96 -- New command, /pause <X>
	If you specify an argument, the client will wait X seconds 
	before continuing.  Its kind of a mix between /wait and /sleep,
	except that this is nonblocking (unlike sleep) and doesnt send
	anything to the server (unlike wait).  It also doesnt assure
	that you wont have any race conditions (unlikes wait) and it
	will parse all incoming traffic normally (unlike sleep).

	If no argument is specfied, the client will wait for the user
	to press a key.  This kind of sort of works, but not really so
	much as i would recommend you use it unless you do so as an
	experiment as to whether it really works in the real world.  
	Maybe if you find bugs youll tell me about it? >;-)

	/pause does recursive calls to io() (much like /wait does).
	That means that it has problems if you intermix calls to /input
	while you are /pause'd, and vice versa.  Let the coder beware.

*** News 12/12/96 -- New /window option, "BEEP_ALWAYS"
	This option allows you to control whether a beep in a hidden
	window will still beep.  (Up until now, it has not.)  If this 
	is ON, then a beep in a hidden window will beep anyhow.  If
	this is OFF, then a beep in a hidden window will be silent.

*** News 12/12/96 -- /ON DCC_CONNECT/DCC_REQUEST changed

	Arguments to /ON DCC_REQUEST are now:
		$0	Nickname of other peer
		$1	The type of DCC
		$2	Filename or other information
		$3	The remote IP
		$4	The remote port
		$5	Filename	(DCC SEND only)
		$6	File Size	(DCC SEND only)

	Arguments to /ON DCC_CONNECT are now:
		$0	Nickname of the other peer
		$1	The type of DCC
		$2	The remote IP
		$3	The remote port
		$4	Filename	(DCC SEND only)
		$5	File Size	(DCC SEND only)

*** News 12/10/96 -- Virtual Hostname support
	The IRCHOST environment variable, and the /hostname (/irchost) 
	commands reflect this new support.  Supposedly it works on
	feeding, so i guess its ok.  (thanks to flarp)

*** News 12/09/96 -- Double line status bar
	/window double and its attendant features have been added.
	You can thank Archon for doing all the work =)

*** News 12/06/96 -- New status line variable
	You can now use %= in your status format to denote when
	you are a channel voice (+v).  It only goes on when you are
	+v but not also +o.  (Crowman)

*** News 11/25/96 -- New Built in function $winvisible()
	Archon pestered me enough to put this in that i did so that
	he would leave me alone. ;-)

	It takes one argument, a reference to a window.
	The return value is:
		  1	if window exists and is visible
		  0	if window exists and is hidden
		 -1	if the window does not exist (error)


EPIC3.002	[[MINOR RELEASE]]

*** News 10/29/96 -- New functionality to /timer
	You may now specify any arbitrary string (up to 10 characters)
	as the refnum for /timer.  Example:
		/timer -refnum foobar 10 echo booya booya booya boo!

*** News 10/28/96 -- New script ``fake-dcc''
	I wrote a new script to demonstrate the two features below.
	It allows the client to (at random) substitute any word out
	of a list for the word ``DCC'' in a DCC handshake.  The
	reciever, if they have the same list of words, will then be
	able to decode it using this script.

*** News 10/28/96 -- New /on, /ON SEND_TO_SERVER
	Any time anything is sent to a server, this will be hooked.  It
	takes three (or more) arguments:

		$0  - the server refnum
		$1  - the unix filedescriptor
		$2- - what is being sent

	Note that using this /on is very expensive -- expensive along the
	same lines as /on raw_irc.  So please use with discernment.
	If you hook this SILENTLY, you will inhibit the sending of the
	message to the server.  You can then use /QUOTE to send a new
	message.  Please note that use of /QUOTE in /ON SEND_TO_SERVER
	can cause an infinitely loop that will crash your client if you
	are not careful.  It is up to you to not do that.

	on ^send_to_server "% % % PRIVMSG % :$chr(1)DCC*" {
		quote PRIVMSG $4 :$chr(1)$getrandword($fake_dcc) $6-
	}


*** News 10/28/96 -- New command, /PRETEND
	The pretend command allows you to ``pretend'' that a line has come
	from the CURRENT server.  Use of this command where the current
	server is undefined results in undefined behavior.  Use of this 
	command is expensive and can lead to convoluted scripting.  You 
	(of course) can use it however you wanted, but i had in mind a way
	to fake out the client when there is no other way to get around
	some client limitation.  See the ``fake-dcc'' script for an example
	of such a case.

	on ^raw_irc "% PRIVMSG % :$chr(1)\\[$fake_dcc\\]*" {
		pretend $0 $1 $2 :$chr(1)DCC $4-
	}



EPIC3.001	[[FINAL PUBLIC RELEASE]]

*** News 10/12/96 -- Solidified syntax for /SERVER
	Now you may use either of the forms:
		server:port:password:nick
	or	server port password nick

	for the ``server'' argument(s) to /SERVER.  Of course, all fields,
	except for the ``server'' field, are optional.  If you want to
	omit a field, you will have to use the colon-seperated syntax.

*** News 10/11/96 -- New built in function 
	$uniq(... list of words ...) -- The easiest way to explain this is
	that each word in the given list is present at most once in the 
	return value.

*** News 10/04/96 -- New /set, /SET COMMENT_HACK
	Sheik wanted this to become a /set rather than a compile time option.
	Just remember to make sure this is the right setting, (It should be 
	ON usually), or your scripts could get very confused.

*** News 10/04/96 -- New /set, /SET DCC_STORE_PATH
	This setting determines what directory you want your incoming dcc's
	to be stored into.  You must have it set correctly before you 
	/dcc get, as there's no turning back after that.  Twiddles are
	expanded, there is no default (puts it into the current directory).

*** News 10/03/96 -- New command, /CALL
	The built in command "/CALL" outputs to the display the current
	script-level stack trace.  These are the commands whose execution
	is in progress.
	If the client crashes (due to a segmentation or bus fault), the
	stack trace will be displayed, as an aid to debugging.
	There must be a #define WIND_STACK in config.h (the default).
	This will show up as an 'a' in $info(o)

*** News 09/23/96 -- New built-in-functions
	Several new built in functions are available:

	$chmod([filename|fd] perm) -- given either a filename, or a file
	descriptor corresponding to a previously $open()ed file, change the
	permissions on that file to 'perm', which is an absolute octal value.
	Example:   $chmod(foobar 0700).  See the man page for 'chmod' for
	more information.

	$umask(perm) -- specfies the bits that are to be turned OFF when
	you next create a file.  This affects every file that the client
	may create during the same session, including but not limited to
	any $open()s, or /save's.  The old umask is returned, so you can 
	restore it later if you want to.  See the man page for 'umask' 
	for more information.

*** News 09/18/96 -- Information about /on send_notice
	/on send_notice is triggered any time you send a notice or a notice
	is sent on your behalf, unless such triggering would cause an infinite
	loop, in that case the /on is NOT triggered.  If you want to send a 
	notice without it ever being triggered, try /quote notice instead.

*** News 09/18/96 -- /set AUTO_REJOIN semantics fixed
	It should now rejoin in the CORRECT window instead of the current
	window.  This should make some people happy. =)

*** News 09/18/96 -- New flag to /XECHO -- "-CURRENT"
	/XECHO -CURRENT ..... sends "....." to your current window.
	Im not really sure why i told people to use this when it didnt
	exist.  *cough*.

*** News 09/17/96 -- Change to /WINDOW ADD and /WINDOW DELETE.
	James pointed out that you cant /WINDOW ADD a nick that begins
	with a caret ('^'), and that a caret is a legal n-char.
	Furthermore, /WINDOW REMOVE has existed and is the "normal"
	way to remove nicknames from the list.  Therefore, you may no
	longer remove a nick from the window's "nicklist" by prepending
	it with a caret ('^').  You must now use /WINDOW REMOVE to remove
	any nicknames.  You may now /WINDOW ADD nicks that start with a
	caret without any error messages.

*** News 09/16/96 -- New set, /SET DCC_SLIDING_WINDOW <int>
	When you are sending a file to any peer, EPIC will send
	<int> packets at the initiation and attempt to always keep
	<int> packets outstanding.  This is a simplistic implementation
	of the traditional sliding window algorithm.  There is no irc-level
	error correction:  We depend entirely on TCP to keep everything
	straight.  This should not be a problem, except over lossy networks,
	so you should have this /SET to 1 unless you are willing to take a 
	gamble!  Since packet sizes are 2k, and most OSs have socket sendq's
	ranging from 4k to 32k, you may have to tweak this /SET for optimal
	efficiency on your system (trial and error).

	This should have *NO IMPACT* on the person to whom youre sending
	the file, regardless of what client theyre using.  If you have any
	problems, it is probably a bug -- so please let me know.

*** News 09/16/96 -- Silent change to /WINDOW arguments
	At the request of kanan, /WINDOW LEVEL, /WINDOW NOTIFY_LEVEL
	and /WINDOW LASTLOG_LEVEL now do not require an argument.
	If you do not specify an argument, the current level will
	be displayed.

*** News 09/02/96 -- New feature covers up weakness in syntax
	There was a semantic ambiguity that allowed the following
	construction:
		/EVAL (...[$0])
	to crash the client due to the $0 not being expanded because
	the (...) protects expansion.  After conferring with several
	people, it appeared that no real reason exists to formally
	support aliases that begin with a left-paren.  This allows the
	use of the left-paren to be semantically bound to something 
	else, to prevent the above from crashing the client, and so the
	paren-set was made as a synonym for the @ construction:  So that
	means the following two STATEMENTS are equivalent:

		@ x = 3
		(x = 3)

*** News 08/14/96 -- Two new config.h define's.
	#define MIRC_BROKEN_DCC_RESUME turns on mIRC compatable
	/DCC RESUME feature.  It breaks the protocol, so it does
	NOT come #define'd by default -- you must turn it on yourself
	explicitly so that you take sole responsibility for it.
	This shows up as 'i' in $info(o)

	#define USE_DCC_CHECKSUM turns on DCC SEND checksumming.
	If not defined, you neither send nor honor file checksums
	that are sent from other epic clients.
	This shows up as 'v' in $info(o).

*** News 08/08/96 -- Silent change to /on send_(msg|public)
	With the changes to the send_text subsystem, if you sent a msg
	to multiple targets, it will pass all of the nicks to
	/on send_msg and /on send_public.  This is in contrast to previously,
	where it hooked them once per nick.  It is still possible for
	both to be hooked with the same message, of course.

*** News 08/07/96 -- CTCP PING now works to microsecond resolution
	More or less.  The client now sends off second + usecond
	information, and then calculates the ping time based on
	that when it comes back.

*** News 08/06/96 -- Revamped CTCP support
	Several changes have happened to the CTCP support:
	If any of these changes cause you a great deal of problems, let
	me know, and ill work something out with you.  The choices made
	here were based upon personal and public discussions i had with
	people on the epic mailing list, so your mileage may vary:

	* If you have an /encrypt set up for a target, any CTCPs you send
	  to that person will be encrypted now.  This is very useful for
	  encrypting DCC handshakes.  This is in addition to your ability
	  to send CTCPs over pre-existing DCC CHAT connections.
	* Since no known clients allow you to send more than one CTCP per
	  privmsg, and this (multiple CTCPs per privmsg) is a well known
	  mechanism for flooding,  only the first CTCP that would normally
	  be "returned" is actually returned.  All the rest are ignored.
	  CTCPs that dont "return" are not limited by this restriction.
	  The one exception to *this* is DCC.  Only one CTCP DCC will be
	  accepted per privmsg. 
	* Other internal changes have occured.  See the source code for
	  more information.  Most of the support has been rewritten.
	  Nothing else should have changed from the user point of view.

*** News 08/03/96 -- Added socks support from ircii-2.9
	ircII-2.9 has support for the 'socks' firewall library,
	and so i took that support and added it at the request
	of several people.

*** News 08/02/96 -- Implemented workaround for incompatability
	I implemented support for the gratutitous incompatability
	brought to you by the efnet 2.9 server in the JOIN command.
	It should do the "right thing" now.

*** News 07/31/96 -- Finished work on encrypted CTCPs.
	I had started support before for encrypted CTCPs.  They should
	be fully supported now, and they will be used if possible.  Note
	that this might be a problem if youre carrying on an /encrypt'd
	conversation with a non-EPIC peer and you send CTCPs.  They will
	be encrypted, and the other peer will probably not know what
	to do with them.  If anyone has a grave problem with this, let
	me know and ill work something out with you.

*** News 07/28/96 -- Striping quotation marks
	If you want to $strip() out quotation marks, you have to
	quote the quotation mark, so it isnt taken as a word
	delimiter.  People have been reporting $strip(" ....) not
	working correct as a bug, but this is _not_ a bug, because
	we need a way to be able to strip out spaces

	To strip out spaces:	       $strip(" " ....)
	To strip out quotation marks:  $strip(\\" ....)

*** News 07/27/96 -- /FEC now has same semantics as /FE
	The syntax as /FEC is now the same as the syntax for /FE.
	However, the semantics all remain the same.  An example of
	what you can now do that you couldnt do before:

	fec ($variable) a b c {echo $a $b $c}

*** News 05/14/96 -- $tdiff() no longer leaves trailing space
	If you do $tdiff(60), you no longer get that trailing space
	that was left behind:  This was (IMO) a bug, because $tdiff(59)
	did not have any trailing spaces.

*** News 05/14/96 -- Can now do /timer -delete all
	If you want to delete all your timers, you can do /timer -delete all
	and your timer list will be made very empty.

*** News 05/10/96 -- Made 'make install' less painful
	Now when you do 'make install', it will attempt to only install
	those things that really need to be installed.  Only those things
	that are newer then the installed components will actually be copied.
	This applies to all the binaries, scripts, and translation tables.

*** News 05/09/96 -- Added $mkdir() at request of CrowMan
	He asked why we had $rmdir() but not $mkdir().. and i guess
	there wasnt any particular reason.  So here it is.

*** News 05/08/96 -- Significant profiling project completed
	This marks the end of the second major profiling project
	in EPIC's history.  Some strategic modifications have been
	made in an attempt to reduce the rate at which ircII consumes
	CPU time.  Note that this does not neccesarily make EPIC
	"faster", but rather just makes it less of a hog.  Future
	performance enahancements may occur on an informal basis.

*** News 05/08/96 -- New $info() command, "O"		(crowman)
	The "O" command (short for "options") returns a string that is 
	representative of the compiled-in options for the binary.

*** News 05/04/96 -- New command, /HOSTNAME		(demon)
	At the request of DemoN, ive added the /HOSTNAME command
	that allows those with dynamic/multiple IP addresses to 
	change the address that DCC should use without having to
	restart the client.

*** News 04/28/96 -- Added encryption over dcc send/get/chat
	Its very simple.  At the end of the command line, just
	append a '-encrypt PASSWD' where PASSWD is what you want
	the dcc encrypted with.  It uses ircII's standard encryption,
	so it isnt totaly secure, but its "secure enough" for those
	who may be snooping.  Dont even *THINK* of giving me a hard 
	time for implementing this.
	   --------------------------------------------------------
	   ----- This doesnt work at the time of this release -----
	   --------------------------------------------------------
	

*** News 04/25/96 -- Added /server -add
	Now you can add a server entry w/o having to connect to it.
	Just do /server -add hostname portname password



EPIC3		[[ Hurray!  We're done! (yea.... right.) ]]

*** News 04/21/96 -- New Built-in function $glob()
	Before i begin, you can turn this off by #undef'fing 
	INCLUDE_GLOB_FUNCTION in config.h.  If your system cant compile 
	the supplied glob.c, you should #undef NEED_GLOB in config.h.  
	You'll have to try your luck with your system's glob().  If your 
	system doesnt have a working glob(), and you cant compile glob.c,
	then you must #undef INCLUDE_GLOB_FUNCTION.

	The $glob() function allows you to specify a "shell-like" 
	wildcard argument list, for which it will return all the files
	that match the patterns.  Its "supposed" to behave just like the
	shell does, so you should already know how it works.  Yes, you
	can specify more then one argument.  Directories are appended
	with a forward-slash ('/'), making it easier to seperate them
	from the regular files.


*** News 04/20/96 -- Workaround for lame ircd lossage on ``K-line comments''
	(Rant on)
	I hate these things.  Whoever allowed K-line comments to contain
	an unlimited under of words should be drawn and quartered.
	(Rant off)


*** News 04/19/96 -- Added $numsort()
	Its like $sort(), but it makes an attempt to properly order
	numbers present in the text.  The strings are alphabetically
	sorted except when numbers are placed in identicaly locations.
	So 'abc5' is located before 'abc12'.  However, 'abcX', where X 
	is any non-digit, is guaranteed to be treated as if "X" were a
	0, when comparing with 'abcY', where Y is a digit.

	Examples:
		$sort(12 1 5) 	       returns "1 5 12"
		$sort(S5 S1 S12)       returns "S1 S5 S12"
		$sort(B2 A3 C1)        returns "A3 B2 C3"
		$sort(abcd abc12 abc5) returns "abcd abc5 abc12"


*** News 04/16/96 -- No, the help bot support wasnt removed...
	I just #ifdef'd it out.  Its #define USE_HELP_BOTS. 
	Youll have to add it to the config.h to get the support.


*** News 04/12/96 -- AUTO_UNMARK_AWAY will call /away alias if possible
	Someone asked that the code that does AUTO_UNMARK_AWAY call the
	user's 'away' alias if they had one, so that scripts like superpak
	and phoenix could correctly end their msg logging.  I should have
	told the person to do an /on 306 instead. ;-)


*** News 04/11/96 -- New set, /SET DCC_LONG_PATHNAMES (ON|OFF)
	If its ON, youll see the whole pathname of the files youre sending.
	if its OFF, youll only see the last part.


*** News 04/11/96 -- More info in the status bar for DCC transfers
	As a comprimise to those who want a ncftp-ish "progress-o-meter"
	with reverse text et all, i decided to display the total number
	of packets in the file transfer and how many have been transfered
	so far, so that the percentage you see is more meaningful.
	Will this lead some day to ETC?  Perhaps.


*** News 04/10/96 -- HACKED_DCC_WARNING no longer default
	So many people have had problems with it, that i am #undef'ing
	it by default -- you are of course free to #define it if you
	like having it.


*** News 04/08/96 -- Dropped support for help bots.
	The help bots dont exist any more, so im going to take
	out the code that supports them.  Ill have to make sure
	that the help files are easily available with the release.


*** News 04/08/96 -- Added #define CONNECT_TIMEOUT to config.h
	It was silly that it was hard coded and not user-specifiable.
	I changed it to 30 seconds (it was 15 before) since 15 seconds
	hasnt seemed to cut it for me.


*** News 04/06/96 -- Same thing for /WHILE and /UNTIL
	Removed the silly restriction (see below) for /WHILE.
	The following are supported:

		/while (expr) commands
		/while (expr) {commands}

	Applies also to /UNTIL.


*** News 04/06/96 -- removed silly restriction on /IF
	The silly restriction that required you to enclose the THEN
	part of an /IF comamnd even if you didnt have an ELSE part
	has been removed.  This is not to say you cannot, but rather
	to say that you are not required to.  The /IF command can now
	be of the form(s):

		/IF (expr) commands
		/IF (expr) {commands}
		/IF (expr) {commands} {commands}

	Just so long as it appears as all one logical line in the script.
	You should use {}s for asthetic reasons if you are using more then
	one command in the THEN body.  You MUST use {}s if you have an
	ELSE part.  All this applies to /UNLESS as well.


*** News 04/06/96 -- Added /UNLESS and /UNTIL
	/UNLESS is the opposite of /IF.

		unless (x == 0) {y = 7}

	/UNTIL is the opposite of /WHILE.

		until (x == 0) {x--;y += func()}


*** News 04/01/96 -- New built in function, $notify()
	If specified with no arguments, returns the nicknames you
	have on your notify list.  It takes the following arguments:

	ON - specifies that only those who are PRESENT should be returned
	OFF - specifies that only those who are ABSENT should be returned
	SERV X - specifies that server number X should be used.
		This flag can be used without the "ON" or "OFF" arguments,
		but there isnt much point to that.  If the number argument
		is missing, the whole function returns nothing.

	In case of error (like invalid server number), the function returns 
	nothing.


*** News 03/27/96 -- $rmdir(), $unlink(), and $rename()
	They now expand twiddles, per the suggestion of Crowman.


*** News 03/20/96 -- Added 'sound' script
	The 'sound' script is an attempt on my part to support mirc's
	CTCP SOUND command.  See the script for usage info.


*** News 03/20/96 -- Fix two bugs in /exec
	The first one was a lame typo lamage that was the reason posix
	systems (freebsd, linux) were having lossage trying to kill off
	exec'd processes on quit.  That should all be kosher now

	The second one is that the signal handlers are reset right after
	the fork() in exec'd processes so that if the program being run
	coredumps, it wont output that annoying "IRC-II has trapped..."
	message back up the pipe to ircII, but will rather die the default
	death for memory faults on the system (a coredump).


*** News 03/20/96 -- New built in function -- $sort()
	Yes, I finally got off my duff and wrote this.  it requires
	qsort(3), which is required by ANSI, so i hope everyone has 
	that without my having to have 'configure' check for it...


*** News 03/20/96 -- Reworked io()
	io() no longer recreates the fd_set's every time its called,
	it doesnt call functions it doesnt need to call, and several
	other optimizations intended to reduce unnecesary CPU usage.


*** News 03/19/96 -- Fixed alias_special_char() to not call parse_inline()
	Unscientific tests show that it improves performance of simple
	variable lookups by almost 20%.

	Performance of expression mode is not effected by this change,
	but the performance of [$var] instead of 'var' goes from 50%
	slower to 30% slower.


*** News 03/19/96 -- $common() and $diff() fixed
	The following things were "broken" with $common() and $diff()

	-- If a word in the left part was found in part of a word in
	   the right part, it was wrongly returned:
	$common(one two / phone ugh)      returned "one"

	-- If a word appeared multiple times in the left part, and it
	   was present at least once in the right part, it was returned
	   multiple times:
	$common(one two one / one three)  returned "one one"

	Both of these weaknesses are now fixed.


*** News 03/18/96 -- Fixed /on bug
	Up until now, doing something like this didnt work like expected:

	/on foo "blah blah"
	{
		...
	}

	or

	/on foo "blah blah"    ....

	because the extra spaces fouled up the /ON command.  Now any spaces 
	between the pattern and the body of the ON are ignored.  This also 
	means that anyone who was doing this:

	/on foo "blah blah"   text to send to channel

	should change it to look like this:

	/on foo "blah blah" /  text to send to channel

	This seems to make a lot more sense to me...


*** News 03/18/96 -- Finished the "new and improved" ircserv.
	This new ircserv has all the functionality of the old one except
	that it actually works now, and its much simpler to both the
	client and ircserv itself.  The catch is that the client wont work
	with the old ircserv any more, and the new ircserv wont work with
	old clients.  You must install the new ircserv with this version
	of the client if you expect to use ircserv.


*** News 03/08/96 -- Support for //^ "feature"
	The //^ "feature" that is used by many large and widely used scripts
	is now supported again by popular demand.  However, you should NOT
	use this "feature" in new scripts, *please* use the syntactically
	correct ^// construct.  Thanks.


*** News 03/07/96 -- Added new command /SWITCH

	The syntax is:

	switch (control text)
	{
		(switch 1)			/*  "switch set" is an expr  */
		{				/* and some commands to      */
			body 1			/* execute if it matches the */
		}				/* control text              */

		(switch 2)			/* A switch set may have     */
		(switch 3)			/* then one expression, and  */
		{				/* if any of them match,     */
			body 2			/* then the commands are     */
		}				/* executed.                 */
	}

	The "control text" is the text that youre trying to match.
	Each "switch set" is comprised of one or more "switch texts"
	and a "switch body".  If any of the "switch texts" are found
	to match (wildcards are allowed) the control text, then the
	commands are executed.  Only the first such "switch set" found
	to match the control text is executed, the rest are ignored.
	So it is important to put your most general switches at the
	end of the structure.

	At the face of it, the general idea is that it is a way to 
	allow you to do a multi-way selection on a string when there
	are more then two possible values.  On a deeper level, there
	is also the flexibility to parse arguments using regular
	expressions and then knowing what to do depending on which
	pattern was matched.  See the "country" script for an example
	of what im talking about.


*** News 03/06/96 -- Workaround for longstanding /foreach bug
	It has been a long standing problem that you couldnt use []
	notation in the /foreach command

	So now instead of being required to do:
			/foreach foo.${ii}.${jj} kk { ... }

	You have the more asthetically appealing option of:
			/foreach foo[$ii][$jj] kk { ... }
 
	Sorry, you still cant (and never will be able to) do
			/foreach foo.$ii.$jj kk { ... }

*** News 03/06/96 -- Added new built in function $usermode()
	Hard to believe there wasnt one before.  You give it a server
	number, and it gives you your umode on that server.  If no
	argument is specified, the "current" server is used.  Specify
	an argument at your own peril, as no sanity checking is done.

*** News 03/06/96 -- Added new on, /on SILENCE
	Whenever you get a SILENCE message from the server, /ON SILENCE
	will be hooked.  It provides the following arguments:
		$0 -  a plus ('+') or a minus ('-') depending on whether this
		      message is for a silence added or removed
		$1 -  the pattern silenced or unsilenced.

*** News 03/06/96 -- Modified /alias's behavior on error.
	Well, it seemed pretty lame indeed that having trailing junk
	after the closing } in an alias would cause it to crap on the
	entire alias.  So now it just emits a warning and adds the alias
	anyhow, which is more sensible.



EPIC3pre8 [[ Bug fixes, performance tuning ]]

*** News 03/05/96 -- Added $winsize()
	If given an argument, returns the size (height) of the specified
	window.  If not given an argument, returns the size of the current
	window.

*** News 03/04/96 -- /fe now honors "extended" words correctly
	The words that are surrounded with quotation marks are now
	parsed (correctly) as one word...

*** News 02/28/96 -- /set highlight_char now accepts any string
	If the argument to /set highlight_char is not BOLD, UNDERLINE,
	or REVERSE, the argument is taken as the string to be used as
	your highlight string.

*** News 02/27/96 -- notify now queries each server
	Yes, thats right -- /notify now works on each server you
	have open independantly of each other.  Try it out. =)
	Due to logistics problems, each server has an independant
	list, but each server must have exactly the same set of
	nicknames (you cannot have a different list for each server, 
	sorry.)

*** News 02/26/96 -- Added the $strftime() function
	The $strftime() function from ircII2.8.2 has been integrated.
	The biggest change i made to it is that the first argument,
	which is an integer representing the time, is optional.  If
	no time is specified, then the "current" time is used.


*** News 02/25/96 -- Fixed horrendous ++/-- bugs.
	The ++/-- operators, that had a few non-trivial bugs before,
	have been revamped to work in all situtations.  The only catch
	is that they do not actually operate on the values until such
	time as they are parsed.  That is to say that a prefix operator
	does not reflect the new value until the operand.  A postfix
	operator is definitely reflected in tokens after the operand.

	For a contrived example, if $foobar is 3,

	(foobar++ + foobar) is (3 + 4 == 7), and *not* 6.  Also,
	(foobar + ++foobar) is (3 + 4 == 7), and *not* 8.

	Its not so hard to understand how it works, just that its hard
	to accept that it does work that way. ;-)


*** News 02/25/96 -- revamped much of next_unit (parse_inline())
	I rewrote most of next_unit() by making a few general macros
	and then writing the rest of everything in terms of the macros.
	Makes the function a lot easier to read, and allowed me to fix
	the ++/-- bugs as described above.  This shouldnt affect anything
	as i didnt actually change the code used, only how it is arranged.


*** News 02/22/96 -- New built-in function $pass()
	This function is the opposite of $strip().  You specify a list of
	characters to NOT strip out of the text, and it returns the text
	after all the characters that are not in the list are removed.


*** News 02/20/96 -- New built-in function $repeat()
	Very simple:
		$repeat(count text)
	Returns "text" repeated "count" times.  You should not assume
	any leading spaces are either retained or stripped, but you may
	assume spaces after words (including the last word) are retained.
	It doesnt put a space between each repitition -- if you need a
	space between each repetition, make sure to append a trailing space.

*** News 02/20/96 -- ansi compiling
	Please compile EPIC with ansi mode turned on if at all possible!


EPIC3pre7 [[ IS THIS THE LAST BETA RELEASE?  WE CAN ONLY HOPE! ]]

*** News 01/16/96 -- Ok. ok. the -S and -s overloaded cla were lame.
	The -s and -S command line arguments, which were overloaded to
	allow you to specify a default server have now lost that semantic.
	-s and -S now have only their classical meanings, whether or not
	to use ircserv

*** News 01/15/96 -- The semantics for $splice()
	Semantics for the heretoforth "undocumented" function $splice():

	$splice(variable start length text)

	Where "variable" is the name of a variable.
	"variable" is modified such that words "start" to "start+length"
		are replaced with the specified text.  The words removed
		are returned.  Using an absurd value for "start" or
		"length" just appends the text to the closest end.

	Assuming in all cases tha the value of $foobar is "one two three"
		$splice(foobar 0 1 booya booya)
			returns "one"
			$foobar assigned to "booya booya two three"
		$splice(foobar 5 4 ooga booya)
			returns empty string
			$foobar assigned to "one two three ooga booya"
		$splice(foobar 1 2 one)
			returns "two three"
			$foobar assigned to "one one"
	If $foobar is empty string:
		$splice(foobar 3 4 one)
			returns empty string
			$foobar assigned to "one"

	FYI, $splice() is an expensive function, but not as expensive
	as the script version was.

*** News 01/15/96 -- Added $geom()
	Returns the value of the global variables CO and LI that
	correspond to the number of columns and the number of lines,
	respectively, in the main screen for ircII.  If you have
	more then one screen open and they are of different sizes,
	then the actual value(s) returned by this function is at 
	best undefined.  If all the screens are the same size, however,
	then that size should always be returned by this function.

*** News 01/13/96 -- Added $chanmode()
	Semantics for $chanmode():

	$chanmode(#channel)

	If #channel is not specified or is an "asterisk", the current
	channel is assumed.

	This function returns the "channel mode" for the specified
	channel.  You must be on the channel to use this function.
	(See the $key() function for related semantics.)


*** News 01/13/96 -- revamped "timer" mechanism
	At the request of several people (esp. Shiek), I have rewritten
	the interface to the /timer function and written timer.c which
	contains a generic time-delayed callback mechanism.  You may use
	it in your own C code.  See the code for more information.


*** News 01/13/96 -- Silent chagne to /timer
	Support for timer refnum zero ("0") is hereby withdrawn due to
	the impossibility to portably differentiate between an explicitly 
	specified zero argument and an error returned from atoi().  More
	specifically, if you attempt to use a non-numeric value for the
	refnum option to /timer, it would implicitly be assigned the value
	of 0, which prohibited the emition of an error message since up until
	now specifying a 0 refnum was valid.  Now any attempt to use refnum
	zero is flagged as an error.

	It is possible to support the old (broken) semantics.  See the
	source code for more information.


*** News 01/07/96 -- Attempts to make $ expandoes boundless
	Up until this release, all $ expandoes have been truncated at
	a 2048 character length.  Since this has made a few people rather
	irritated due to unreliable behavior, the behavior has been changed
	so that $ expandoes are never truncated at any length.

	Testing has shown that this new method is somewhat slower for
	extremely large variables (10,000 characters and up), but this is
	not totaly unexpected since mallocing off large chunks of memory
	and strcpy()ing them around is more expensive then just whipping
	up a stack array and strcpy()ing a shorter string into it.

	For the sake of sanity, i want to point out that unless your variables
	are long enough that they were being truncated, the processing time
	for all variables is essentially zero.  Also note that this entire
	discussion applies only to the use of $ expandos and does not apply
	at all to "expression" mode where variables have never been truncated.


*** News 01/02/96 -- /dcc get nick   works multiple times.
	/dcc get nick will not issue an error about connection already being
	in progress unless all connections currently being offered from "nick"
	are actually in progress.  (Previously, you could only do /dcc get nick
	one time, no matter how many files "nick" had offered you.)


*** News 01/01/96 -- New built-in function $info()
	Semantics for $info():

	Description:  A function used to supply non-specific information
	about the actual executable image itself.

	Arguments: "COMPILE" returns information about who compiled
		   the binary in the form:
			"Compiled by <user>@<host> on <date> at <time>"

		   "SUM" returns the output from the 'sum' command when
		   run on the file 'info.c.sh' (see below).  If this value
		   is different from a previous use of the program you can
		   be insured that the binary *has* been recompiled.  Since
		   absolute protection against tampering is effectively
		   impossible, the converse can not hold.

		   More arguments are planned in the future.


*** News 01/01/96 -- Added compile logging to the Makefile
	The file "info.c.sh" is now run as a shell script and the result is
	compiled each time just before a final link is executed.  It records
	the user, host, and time the compile was done.

	If you do not want your username to be returned by the $info()
	function, you can #define ANONYMOUS_COMPILE in the config.h file.
	The username will then be "<anonymous>", but the host and time will
	be normal.


*** News 12/28/95 -- Cleaned up config.h, vars.h, vars.c
	Removed irc-vars that were not used or referenced.
	Removed #defines that were not used anywhere.


*** News 12/28/95 -- Fixed a really *stupid* bug with set_int_var
	To make a long story short, there were a few places that
	were using set_int_var() in an inappropriate manner.  Those
	have been fixed to use the (correct) function set_var_val().

	This was the cause of a few obscure bugs, which have now gone away.


*** News 12/28/95 -- A few modifications to the menus:

	* If you are in a menu, pressing the Q key kills off the menu
	  as if you had done /set -menu.

	* The <return> key now selects the current option in the menu.
	  The old behavior of <return> toggling hold mode is deprecated.

	* If you #define MENU_BOTTOM in the config.h file, then that
	  define will be used as a seperator between a menu and the rest
	  of the window.  The #define'd pattern is repeated for the width
	  of the screen.

	* Cursor keys are now supported while in menu mode.  Your cursor
	  keys must be outputing either ^[[X or ^[OX (where X is A,B,C,or D)
	  to take advantage of this (every vt-like terminal does this)


*** News 12/28/95 -- Made getting a quit message for youself not fatal
	Apparantly it *is* possible to get a quit message for youself
	in an otherwise legitimite context.  I still dont believe it is
	possible, but the bug reports are coming in.  Now it just emits
	a cryptic error message that is not fatal.


*** News 12/28/95 -- Fixed /dump on (reported by Oldpink)
	Fixed dumb bug in hook.c:flush_on_hooks() that was prohibiting
	named-hooks from being flushed (numeric hooks were being flushed
	just fine).


*** News 12/28/95 -- Fixed $connect() (reported by Chaos and others)
	The problem was that in dcc_raw_connect (what $connect()
	calls to establish the connection) i forgot to cast the
	user-specified portnum to network order, so on wrong-endian
	machines it was actually specifying a wrong port. *sigh*


*** News 12/28/95 -- Changed the behavior of alias.c:add_alias()
	The semantics of assignment have been changed slightly to support
	the removal of variables when their values would be otherwise set
	to a string with length 0 (an "empty string").  Such assignments
	this cause the variable to "go away".  This is not a problem since
	referencing a variable that "dont exist" expand to the empty string,
	so you get the same value either way.  This also affects places where
	variables are implicitly assigned (such as $shift() and $splice()).


*** News 12/28/95 -- ADVISORY -- use care with the /OPER command!
	Some advice to you opers out there...

	1) Dont put your history in a file if you use /oper nick passwd.
	   Obviously, this puts your passwd in plaintext out on the file
	   system which is a "bad idea", especially if someone is able to
	   log in as you, they can use the cursor keys to just back up in
	   your history and become oper w/o having to crack your passwd.

	2) Make sure noone is peeking over your shoulder if you do /oper nick
	   and type the passwd as "invisible text", as the person peeking
	   would be able to figure out how many characters your passwd has
	   which helps them in cracking it.


*** News 12/28/95 -- Added $crypt() from CrowMan
	Semantics for $crypt():

	$crypt(salt password)

	You give it a salt (a two letter combination) and a plaintext
	and it returns an encrypted string.  This just calls the C library
	function $crypt(), so if you dont have it, this wont do you any good.


*** News 12/28/95 -- Added $fexist() and $fsize() from Sheik
	Semantics for $fexist() and $fsize():

	$fexist(filename)	returns 1 if file exists, -1 if not.
	$fsize(filename)	returns size of file, -1 if file not exist.


*** News 12/28/95 -- Added new key binding, DELETE_TO_PREVIOUS_SPACE
	Keybinding deletes characters backwards until if finds a space.
	Note that if the character to the left is a space, it wont delete
	anything.



EPIC3pre6 [[ LAST MINUTE BUG FIXES/ADDITIONS ]]

*** News 12/3/95 -- New built in function $aliasctl()
	Semantics for $aliasctl():

	Description:  A function that allows for low-level manipulation
	of the alias and variable lists.  It takes three or more arguments:

	The first argument is the string "ALIAS" or "ASSIGN"
	The second argument is one of the options "GET", "SET", or "MATCH"
	The third argument is the alias/assign you are operating on.
		If the operation is "MATCH" and this argument is
		an asterisk ('*'), then it will match all top-level
		alias/assigns.
	The rest of the arguments are used if you are doing a SET.

	More operations may be added in the future.

	"GET" returns the value of an alias/assign.
	"SET" sets the value of an alias/assign.
	"MATCH" returns a word-list of all aliases/assigns that begin
		with the specified argument.  "MATCH" does not descend
		into arrays or subarrays:  "MATCH" does not accept wildcards,
		but does accept the special argument "*" which returns all
		first-level alias/assigns.

	contrived examples:
	$aliasctl(ASSIGN GET foo)	returns the value of $foo
	$aliasctl(ASSIGN SET foo 3)	same as @ foo = 3
	$aliasctl(ALIAS GET join)	returns the "stuff" for /join
	$aliasctl(ALIAS SET join window join)
					same as /alias join window join
	$aliasctl(ASSIGN MATCH *)	Returns all top-level assigns.
					Does not return any arrays.
	$aliasctl(ALIAS MATCH w)	Returns list of all aliases
					that start with 'w'
	$aliasctl(ALIAS MATCH tk)	Returns list of all aliases that
					begin with 'tk'
	$aliasctl(ALIAS MATCH tk.)	Returns list of all aliases in
					the array "tk"


*** News 12/3/95 -- New built in functions $numwords() and $strlen()
	$numwords() returns the number of words in the given text.
	$strlen() returns the number of characters in the given text.

	Text with all whitespace characters has zero (0) words.
	$numwords() does not recognize "extended words".

	Use @var or #var when possible, as they are more efficient.


*** News 12/2/95 -- /FOREACH can work on command aliases
	If the named argument to /FOREACH begins with a hyphen ('-')
	then iteration will occur over the array of command aliases
	specified (as opposed to assign aliases)


*** News 12/1/95 -- /WINDOW size added
	You can specify the absolute height of a window by using the 
	/window size <height> operation.  If the specified size is 
	inappropriate, the client will whine at you.


*** News 12/1/95 -- /LASTLOG displays ANSI codes if #define MURPLE
	If you #define MURPLE in your config.h, /LASTLOG will turn on 
	DISPLAY_ANSI during its execution and turn it back to whatever 
	you had it set to when its done.  If murple likes it, i might 
	make it the default.


*** News 12/1/95 -- New functions $winserv(), $lastserver(), $servername()
	These functions return -1 on error (ie, on illegal value)


	$winserv() or $winserv(0)	returns the server index for current
					window.
	$winserv(winrefnum)		returns the server index for that
					window.

	$lastserver()			returns the server index for the last
					server we parsed.  Useful with:

	$servername(servrefnum)		returns the name of the specified
					server.


*** News 12/1/95 -- DISPLAY_ANSI var only lets escapes through
	The only ANSI character that is valid and less then 32
	is the escape character (27).  So if DISPLAY_ANSI is
	on, we let it though but reverse all the rest (like say,
	the XON/XOFF characters, and ^R and ^T. >;-)


*** News 12/1/95 -- LASTLOG level "ALL" includes USERLOG levels
	You get the idea.


*** News 12/1/95 -- $-0 silent change
	I think i can explain it best by an example:

	For the args "  1  2  3  4", $-1 on the stock client is "  1  2"
	but for the string $-0, the stock client does "1".  This is
	inconsistent:  It should never strip the leading spaces on $-n.
	So i fixed it so that $-0 is "  1" instead of "1".


*** News 12/1/95 -- /set BEEP off really *means* off
	You wont get beeped *at all* if you have BEEP set to off.
	Really.



EPIC3pre5  [[[ FINAL BETA RELEASE! ]]]

*** News 11/27/95 -- New built-in function $writeb()
	The function $writeb() is exactly the same as $write(),
	except it does not append a trailing newline.


*** News 11/27/95 -- New functionality to $read()
	Expanded semantics for $read():

	$read(fd bytes)		-- returns the next "bytes" bytes from
				   the $open()ed file.  It is guaranteed
				   that many bytes will be read and returned
				   unless end-of-file occurs.


*** News 11/27/95 -- Added support for NOTEs
	Added support for undernet-style NOTEs.
	Incoming NOTEs look like this:

		[nickname] message (time)

	where "nickname" is the person who sent the nick,
	"message" is the message, and "(time)" is the time that the
	message was sent, if and only if the message was sent more than
	one minute ago.  If (time) is absent, the message was just sent.


	/ON NOTE supplies the following arguments:
	$0   nickname of the sender
	$1   The time the note was sent -- this field is only
	     accurate up to plus or minus 60 seconds, so just understand
	     that you cant trust the seconds to be accurate.
	$2-  The message


	/IGNOREing NOTEs now works.


*** News 11/23/95 -- Sanity for /STACK
	People commented that if you attemped to /stack push on XXX,
	and there were no /on XXXs present, that an empty "placeholder"
	should be placed on the stack, so that when /stack pop on XXX
	is executed, the /on XXXs should be cleared, instead of not
	clearing them and emitting an error message (agreed, fixed.)


*** News 11/23/95 -- Support for long nicknames
	#define ALLOW_LONG_NICKNAMES if you want support for 30 
	character nicknames.  Dont define it if you dont use any
	servers that support long nicknames.  (Default is undef)


*** News 11/23/95 -- Closed up tty bug
	Sometimes, characters with the high bit set were being sneaked into
	the client even if the client asked the terminal handler to strip
	off the high bit.  Now the client just goes ahead and strips off
	the high bit itself if 8 bit characters are turned off.  This fixes
	the bug when people would send XOFF characters with the high bit
	set and that would get passed to the terminal, which ignores the high
	bit, and turns off the person's flow control -> bad. (chaos)


*** News 11/23/95 -- Support for CS servers
	Support for user modes +c, +f, +k, +r, and +u have been added.



EPIC3pre4

*** News September/October/November - lots of bug fixes
	So im lame.  I didnt add any new features, just fixed bugs as
	they popped up.



EPIC3pre3.3

*** News 09/30/95 -- Added a feature to deny a specific host
	In some schools that have networked systems (ie, under AFS),
	the same executable may be run by any nmber of people on any
	number of machines.  For these people, there is now a config.h
	#define that allows you to set a file that will be checked for
	hosts to deny access to the executable.



EPIC3pre3

*** News 09/09/95 -- Got rid of stupid 'count' program!
	Converted *.h.proto files to use 'enum' instead of that stupid
	'count' program.  EPIC no longer requires (f)lex to compile.


*** News 07/31/95 -- major rewrite of built-in functions and regression test
	I rewrote most of the built-in functions to fix all of the remaining
	bugs that were present.  I also whipped up a script to test a lot of
	functions to make sure that in the future, ill know right away when
	a function isnt working right.


*** News 07/06/95 -- DCC TALK and DCC SUMMON removed
	In a move that is likely to be a little controversial, i removed
	the DCC TALK and DCC SUMMON features because they seemed to be
	 1) redundant
	 2) not implemented very well
	And also because we want to make EPIC smaller by ridding it of
	extraneous unused features.


*** News 07/03/95 -- Userhost now taken on advice of the server
	At the suggestion of DemoN, the client now asks the server what
	it thinks our userhost is when we have connected to it, and we
	take it at its word.  In this way, we no longer have DCC conflicts
	when we think our IP address is one thing and the rest of the
	world thinks its another...



EPIC3pre2

*** News 06/23/95 -- /on timer actually hooks at the top of each minute
	/on TIMER actually hooks when the minute rolls around instead
	of "up to" 15 seconds after the minute.  Another aspect of this
	is that EPIC doesnt do 4 select() calls a minute when youre
	idle, it only does one, which lowers the CPU usage.


*** News 06/14/95 -- DCC Transfers now measured to microsecond precision
	If your system has gettimeofday() (its a BSDish syscall) EPIC
	will report your DCC transfer rates in terms of second/usecond
	resolution -- providing a better representation of the kb/sec
	for small, fast transfers.  Anyone want to tell me what/if there
	is a posix or sysv call to get second/usecond info?



EPIC3pre1	(size level 123%)

*** News 05/21/95 Highlight characters may now be bound (keys.c, edit.c)
	You may bind any sequence you wish to BOLD, UNDERLINE, REVERSE,
	or HIGHLIGHT_OFF.  However, please note that no matter what key
	you have bound to them, BOLD will always insert a ^B into your
	input line, UNDERLINE inserts ^_, etc, etc, etc.  Yes. i know this
	can be confusing, but unless someone comes up with a big gripe,
	im most likely going to leave it this way.  The highlight keys come
	bound to the highlight bindings that they should be bound to by
	default. >;-)


*** News 05/21/95 /set INDENT should work properly with ascii sequences
							(screen.c)
	Or so i think.  Let me know if you dont think it works properly.


*** News 05/20/95 # walls incorrectly hooked		(parse.c)
	# walls (ie, walls sent to a hostname pattern) were incorrectly
	hooked as PUBLIC_MSGs instead of MSG_GROUP.  Fixed.


*** News 05/20/95 choices for help now paged		(help.c)
	When you are given a list of choices to select from in the help
	browser (ie, in /help set), the options are paged if you have
	HELP_PAGER set.


*** News 05/17/95 built-in aliases now binary searched  (alias.c)
	The built in aliases (all 101 of them) are now binary searched
	instead of sequentially searched.  This should make the use of
	built in aliases all that much faster, as well as increasing
	the speed of your own aliases since the entire builtin alias
	list will not have to be traversed before your aliases are
	searched.


*** News 05/17/95 Complete rewrite of main loop		(irc.c, others)
	irc_io has been replaced (modularized, actually).  Hopefully
	this will make ircII more reliable and less prone to lock ups.
	The first thing you will probably notice is that the client
	still accepts input from the keyboard even during a /wait
	command.  Preliminary tests show this new design to be more
	sturdy then irc_io ever hoped to be.


*** News 05/11/95 Completed rewrite of ignore		(ignore.c, whois.c)
	The rewrite of the ignore system has been completed.  Ignores are
	now officially based on *!*@* patterns instead of nickname or
	userhost patterns.


*** News 05/11/95 Key bindings are now allocated dynamically (keys.c)
	Up until now, the key maps have been stored in static arrays, 10 maps 
	of 256 characters for a total of 2560 entries at 13 bytes per entry. 
	(2 integers a pointer and a char) for a usage of 33,280 bytes (32K). 
	That has been dropped down to 2560 pointers (10,240 bytes) with 13 
	bytes still used for each key binding, a savings of 23,040 bytes 
	(22k) in overhead.  You would have to have over 1,770 key bindings 
	before you will use as much RAM under this new system as you did under 
	the old system.


*** News 05/11/95 Client no longer needs the 002 numeric (notice.c)
	Some people, who hacked the 002 numeric reply on their server, broke 
	all the ircII clients out there that rely on the 002 numeric being of 
	a specific format to extract the server name and version info.  This 
	is totaly ludicrous to me, since that is what the 004 numeric is there
	for, (to provide server and version info.)  So the .ircrc is not 
	loaded until the 004 numeric is recieved now.  The ``kludge'' that 
	ircd has for older ircII clients is ignored if you recieve the 001 
	numeric (which signifies a 2.8 class server).  If you do not recieve 
	a 001 numeric, then the server waits until the kludge is recieved to 
	load the .ircrc, as it has always done for ever and a day.


*** News 05/09/95 Removal of support for 2.5/2.6 (all)
	Per the vote taken on the mailing list, all support for ircd2.5 
	and ircd2.6 has been terminated.  Please do not use EPIC on those 
	servers.  (This should not be a problem since there hasnt been a 
	ircd2.6 server in over three years)  I have ripped out large chunks
	of code that were specific to ircd2.5 and 2.6, and which were 
	confusing the whole code and making things harder then they had to 
	be.  Also, code that is specific to ircd2.7 servers has been 
	#ifdef'd out by default, you can get that code by #define COMPAT_27 
	in the config.h.  If you dont need ircd2.7 compatability, you will 
	save some amount of space in your executable.


*** News 05/06/95 new command /MESG		(output.c)
	The new command 'MESG' now does what its counterpart in unix does:
	It allows or disallows writes to your screen:  If you set it to 'n',
	you will not recieve any talk requests or writes from other users 
	directly onto your screen.  If you set it to 'y', you will be able 
	to recieve talk requests and writes from other users.  THIS DOES NOT
	RESET THE PREVIOUS STATE WHEN YOU EXIT!  If you use 'MESG' to set
	permissions on your tty, those permissions will still be set after
	you exit.


*** News 05/06/95 new function $trunc		(alias.c)
	A new function $trunc() is available for rounding or truncating 
	floating point numbers.  It takes two arguments, the first is the 
	precision and the second is the number.  If the first argument is 
	positive, that is taken as the number of decimal places to round at.
	If the first argument is negative, that is taken as the number of 
	significant digits to round at.  The answer will never have more 
	precision then what you provide.  This function uses the system call 
	printf() to format the output, so your actual output is dependant 
	upon your system's implementation of printf().  If you provide strange
	input (ie, something that isnt a number) you will probably get strange
	output. (garbage in, garbage out)


*** News 05/06/95 DCC reject			(dcc.c ctcp.c)
	If you use the /DCC CLOSE command to close an offered or pending DCC 
	connection, it will send a CTCP notice to the other peer telling them 
	that the transaction will not occur.  Both peers will then remove the 
	offer from their respective DCC lists.  Either peer (either the sender 
	or the reciever) may reject the connection by using /DCC CLOSE and the 
	other peer will be notified.  If the other peer is an older client, 
	they may not handle the CTCP notice gracefully.  A script is provided
	with the client to supply this functionality to older clients.


*** News 05/06/95 DCC Warning before overwriting file (dcc.c)
	If you recieve a dcc send request for a file that already exists, you 
	will get a warning to that effect, advising you to use /DCC RENAME if 
	you dont want to overwrite the original file.


*** News 05/06/95 DCC Progress-o-meter		(dcc.c, etc)
	New status format variable: %D -- shows the progress of the current 
	DCC send/get transfer showing the nickname and percent of transfer 
	completed.  /DCC LIST now shows the size of the file and the 
	percentage transfered instead of simply showing the number of bytes 
	sent.


*** News 05/01/95 Floating point support	(alias.c)
	There *IS* floating point support.  However, it is preliminary and 
	may not neccesarily be complete or manageable!  In all cases where 
	integers are needed, any floating point values will be truncated to 
	the next lowest integer (or to the next higher integer if youre 
	talking about a negative value)

	You have to /set FLOATING_POINT_MATH to 1 before you will get any 
	floating point answers.  This is to maintain backwards compatability 
	with old scripts until i have a chance to assess the damage that 
	would result in older scripts that assume integer math.

	Also note that no matter what FLOATING_POINT_MATH is set to, floating 
	point math will be done on the operands.  if it is set to OFF, the 
	result will then be truncated after the operation.  So any script that 
	did something like 8 - 3.2 will get the answer '4' instead of the '5' 
	that previously would have been given.

	Please keep in mind that ircII parses its algebraic expressions from 
	right to left (this is a bug im working on, so dont harass me yet), 
	so if you try to do floating point math, please be aware that you may 
	have to use paranthesis to get the right parsing order.


*** News 04/28/95: More security
	A new /set, "SECURITY" is in place to allow you to do some primitive 
	backdoor security.  If you set it to 1, you cannot use a variable as 
	a command.  If you set it to 2, you cannot use /exec except 
	interactively.  If you set it to 4, you cannot use the /set command 
	except interactively.  You can add these numbers up to suit the 
	security you wish to have.




****************************************************************************
EPIC2		[[[ PUBLIC RELEASED VERSION! ]]]

*** News 1995-04-09: ~ operator had wrong precedence (alias.c)
	The ~ operator had the wrong precedence.  Its now been fixed.

*** News 1995-04-08: $open() now expands twiddles (files.c)
	Kev asked me to have the $open() call expand_twiddle so
	you can do ~/filenam type stuff.

*** News 1995-04-08: New functions added		(alias.c)
	The following functions, which act simply as front ends
	to the system calls by the same name have been added:

	$unlink(file1 [file2 ...])	Delete a list of files
	$rename(file1 file2)		Rename file1 to file2
	$rmdir(file1 [file2 ...])	Delete a list of directories

	These functions return the number of files that were not
	successfully handled.  So, it returns 0 if all went well or
	if no arguments were specified.

	These functions wont do anything the system call wont do, ie,
	theyre rather primative.  Use /exec for more complex tasks.
	These functions do NOT do any wildcard expansion!

*** News 1995-04-08: EMACS keybindings no longer bound by default (keys.c)
	Someone from Europe said that using EPIC on scandinavean
	keyboards was difficult at best becuase of the emacs metakey
	bindings that i doubt anyone uses anyhow.  You can #define
	EMACS_KEYBINDS if you want them, or just /bind them in 
	your .ircrc

*** News 1995-04-08: Nickname not fudged in /nick (numbers.c, etc)
	Kanan asked that the /nick command not fudge your nick
	if you enter an invalid nickname.

*** News 1995-04-08: Fixed brain dead ignore	(ignore.c)
	Many, many people have asked why /ignore cannot support
	the nick!user@host construct.  Well, now it can.  In fact,
	you can give it any non-ambiguous nick!user@host pattern
	and it will recognize it and do the right thing.  A userhost
	*must* contain either a "@" or a "."  Any string with no
	"!"s, "@"s, or "."s is assumed to be a nickname.

	Also, the /ignore command stores ignores as nick!user@host
	patterns now instead of as a "nick" or a "userhost" -- this
	is backwards compatable becuase you can think of what used
	to be stored as "nick" is now "nick!*@*" and what used to 
	be stored as "user@host" is now "*!user@host" -- ok?

*** News 1995-04-03: Finished implmenting /stack	(stack.c)
	/stack (PUSH|POP) (ASSIGN|ALIAS|ON) now works.
	/stack LIST isnt implemented yet.  Will come in future version.



EPIC2pre5 [[[ FINAL BETA RELEASE! ]]]

*** News 1995-04-02: Modified 'LOAD' command	(edit.c)
	You may now specify any number of filenames per LOAD command.
	Not only will this allow you to tighten up your scripts by
	loading many files per LOAD command, but also allows you to
	stub several files to one alias (see below) -- of course,
	if you use the -args flag, you may not specify more then
	one file after the flag to load.  The -args flag has effect
	only on the one filename that follows it. (see help files)


*** News 1995-04-02: New command "STUB"		(alias.c edit.c)
		*** NOTE: The use of the word 'alias' can also be
			extended to the word 'assign' as well.

	You may now "stub" an alias to a file.  What this means is 
	that the first time you attempt to use that alias, the file 
	it is stubbed to will be loaded.  Therefore, if the alias 
	is never used, the file it is contained in will never be 
	loaded (Obviously, if another alias that is stubbed to the 
	same file is used, all aliases in that file will also be 
	unstubbed.)  The idea is that instead of loading a very 
	large script pack on boot up, you can create a file that 
	will contain "stubs" to the real files those aliases are in. 
	If/when you actually use those aliases, at that time will the
	file be loaded, so you dont have to load everything every time
	if you dont use everything every time. >;-)

	Stubs *are* aliases.  The /STUB command is used only to enter
	stubs.  Once they are entered, you can (and must) list or 
	delete list them using the /ALIAS command just as if it were 
	a normal alias.

	Probably I (or someone who is interested) should write a C
	program, or maybe even a perl program that will automatically
	generate stub programs for multi-file script packs.


*** News 1995-03-31: Implemented CTCP over DCC	(ctcp.c, dcc.c, etc)
	You are now allowed to send CTCP commands over an open
	DCC CHAT connection by using the form =nickname, just like
	you do for /msg =nick.  This buys you three things:

	* On a really really bad day, you can send files to a person 
	  you are dcc chatting with without having to be at the mercy 
	  of a certain d0g3-st()()p1d server that lags a lot.

	* If you dont want to tell the whole net that youre sending 
	  a file to someone, this allows only you and your target to 
	  see the handshake.

	* Since all CTCP commands can be sent this way, its just another
	  way to reduce network traffic, making life better for everyone.


*** News 1995-03-28: Fixed the STACK command 	(stack.c)
	STACK POP ON XXX now works correctly. huzzah!



EPIC2pre4

*** News 1995-03-27: Bug fix for umode +o		(parse.c)
	Doh! Cant pass a null pointer to do_hook.... 


*** News 1995-03-27: New privacy feature		(config.h, irc.c)
	As detailed in the config.h, there is a new privacy feature
	in ircII.  You are now able to define at compile time, or, 
	to specify a file containing at run time, user ids in integer
	form, that will be authorized to run the program.  Unauthorized
	users will be "spoofed" -- that is, ircII will execute another
	program (that you may also define) without giving any clues.
	You may also specify a password that will be used in conjunction
	with uid checking.

	You can also define a second file that will be used to specify
	the uids of those users who will NOT be allowed to use the
	program *at all*

	See the config.h for a full explanation of the feature.


*** News 1995-03-26: Fixed bug with ${} expando	(alias.c)
	The ${} expando (that allows you to switch to the expression
	context from within the command context) didnt allow nesting
	before.  I consider this a bug, so i fixed it.
	(ie, ${[${foo}bar]} now is the variable $foo followed
		by the string 'bar'.  Nesting ${}s usually is done
		when you are using the tertiary operator)
 

EPIC2pre3.1

*** News 1995-03-23: new /set: DISPLAY_ANSI
	At the request of Deadelvis, i included a new /set that will allow
	you to display ANSI characters as is without their being fudged 
	by the client into reverse characters.  It is off by default.

	*** *** *** WARNING! *** *** *** WARNING! *** *** ***
	If you run the client with this set to ON, you run the risk of
	keybombs/whatnot! 
	*** *** *** *** *** *** *** *** *** *** *** *** *** ***

	My advice is to do something like this:
	alias real_echo {set DISPLAY_ANSI ON;echo $*;set DISPLAY_ANSI OFF}

	then use /real_echo to display things with ansi characters.

*** News 1995-03-23: Unexpected EOF message more informative
	the "Unexpected EOF in file ..." error message will now attempt
	to tell you what line the beginning { started at.  Its not
	guaranteed to get the right one, but it will get the first unmatched
	{ correct. ;-) (deadelvis)

*** News 1995-03-23: /ignore MSG no longer ignores CTCPs
	At the request of DeadelviS, /ignore ... MSG no longer ignores
	CTCPs. you have to /ignore ... MSG CTCP now.  Unless someone has
	a dire problem with this, i will keep it this way.  If you have
	a dire problem with it, let me know, and ill work something out
	with you.

*** News 1995-03-23: wait % functionality restored
	Flav alerted me to the fact that wait % was a noop.  I put back
	its functionality.  Dont ask me why phone took it out in the first
	place.  Whee.


EPIC2pre3 (2.8 compliant)

*** News 1995-03-19: finished prototyping
	Most (all?) the header files are now prototyped.

*** News 1995-03-18: new config.h define, "EXEC_COMMAND"
	At the request of DemoN, i have included a define in config.h
	that will allow you to remove the EXEC command at compile time.
	If you remove the EXEC command, it cannot be used unless you
	recompile the client again.  If you do not define EXEC_COMMAND,
	you cannot use the file manipulation functions either.  This
	is "supposed" to be a security feature. >;-)

*** News 1995-03-17: New /set: AUTO_NEW_NICK
	If the server rejects you for a nickname collision, and
	you have AUTO_NEW_NICK set to ON, the client will convolute
	your nickname in an attempt to get a nickname suitable for
	reconnecting.  It has a pretty good idea when its out of
	guesses, and if that happens, it will fall back and ask
	you for a new nickname.  If AUTO_NEW_NICK is off, the client
	will always ask you for a new nickname if you are collided.

*** News 1995-03-17: New function 	(alias.c notice.c server.h)
	New function:

	$version([servernumber]) - returns in text form the "class"
		of server specified.  The servernumber should be
		a number corresponding to a server in your server list
		TO WHICH YOU ARE OR ALREADY HAVE BEEN CONNECTED!!
		Specifying no arguments implies your current server.

		The classes are such:

			"2.5"		a 2.5 server
			"2.6"		a 2.6 server
			"2.7"		a 2.7 server
			"2.8"		a regular 2.8 server
			"u2.8"		an undernet 2.8 server (mu/me)
			"2.9"		a regular 2.9 server
			"u2.9"		an undernet 2.9 server
			"2.10"		a regular 2.10 server
			"u3.0"		an undernet 3.0 server
	
	Please dont get confused if you get the reply "u2.8" from
	a server on efnet:  All that is meant to convey is that the
	server has the capability to handle the extended undernet
	numerics and replies.

	If you ask for the version of a server to which you have not
	been connected, "2.5" will be returned (becuase it is the
	lowest common denominator)
	

*** News 1995-03-16: EPIC finally loads 100% of ircII2.2.9 scripts
	Thanks to the prodding of Kanan and Murple, i tracked down
	the reason EPIC wouldnt load old script packs.  It was in
	edit.c in the loader, the part that handled comments was
	munging up lines that it shouldnt have been.  I am now able 
	to load textbox, axis, and phoenix without any apparant 
	problems.  (mixed blessing)  This is the most fundamental
	bug that i have fixed, so it is worth upgrading for.

*** News 1995-03-16: character translation function
	New function:

	$tr(/oldc/newc/text) - Substitutes any instances of characters
		in 'oldc' with corresponding character in 'newc' in
		'text'.  If 'oldc' is longer then 'newc', then the last
		character in 'newc' will be used to extend 'newc' to the
		length of 'oldc'  Delim is the first character, does not 
		have to be '/'.  Examples:

	$tr(/a/b/Mary had a little lamb) returns "Mbry hbd b little lbmb"
	$tr(?a??Mary had a little lamb) returns "Mry hd  little lmb"
	$tr(:abcdefghijklmnopqrstuvqxyz:nopqrstuvwxyzabcdefghijklm:$*)
		would do a "rot-13" on the text passed to the alias.
	$tr(/$chr($jot($ascii(a) $ascii(z)))/
	     $chr($jot($ascii(n) $ascii(z)))$chr($jot($ascii(a) $ascii(m)))/$*)
		Does the same thing as above.


EPIC2pre2 (2.8 compliant)

*** News 1995-03-14: New IP/name conversion functions
	Added three new functions:

	$iptoname(ip-addr) given a XXX.XXX.XXX.XXX ip address, returns the 
		hostname associated with that IP
	$nametoip(hostname) given a hostname, returns the XXX.XXX.XXX.XXX 
		ip address associated with that host.
	$convert(whatever) converts whatever you give it to whatever it isnt.
		$convert($convert(rush.cc.edu)) should return "rush.cc.edu"


*** News 1995-03-13: file reading/writing by popular request
	You now have the capability to manipulate files directly in
	irc using several built in functions.

		$open(FILENAME <type>) where <type> is R or W depending
			on whether you want to Read or Write.  Write does
			not truncate file, but rather appends.  Returns the 
			file descriptor to the opened file.
		$close(fd)  closes the file corresponding to the fd.
		$read(fd) returns a line from the file corresponding to the fd.
		$write(fd text...) writes the line of text to the file
				corresponding to the fd.
		$eof(fd)  returns 1 if the fd is at end-of-file, 0 otherwise.

	These functions return -1 if there is some sort of error.
	More functions can be added if you tell me what you want to have.
	The "read" option uses uzfopen, so you can read compressed files
		via this method if you wish.

	Example of usage:
		alias cat {
			@ fd = open($0 R)
			do { echo $read($fd) } while (!eof($fd)) 
			@close($fd)
		}


EPIC2pre1 (2.8 compilant)

*** News 1995-03-01:  do (if.c) (final support in pre2)
	Finally got around to supporting the do/while command.  It takes
	the following form(s):
		/do cmds
		/do {cmds}
		/do {cmds} while (expr) 
	All forms should work correctly.

*** News 1995-02-28:  uzfopen (edit.c ircaux.c help.c)
	Added capability for ircII to automatically grok the *.Z, *.z,
	and *.gz compressed file extentions and automatically know what
	to do with them.  You may now compress any LOADable file, or
	any HELP file any way you choose (gzip or compress) and ircII
	will know what to do.  Blew away all uses of the ZCAT macro.

*** News 1995-02-27:  Bug fixes, 2.8 compliance (all)
	Wow. Now that its all ANSI prototyped, i have to go through and
	fix all the function calls that are incorrect, especially most
	of the key binding functions. Some of them were (char, char *),
	some of them were (char *, void (*)()), and some of them were (void).
	Ick.  They all take (char, char *) now.  I need to go through and
	compile ircII with the -Wall option and find all the bugs i can...

*** News 1995-02-15:  More Undernet Support (edit.c status.c)
	u2.9 commands /RPING, /UPING, and /MAP now supported
	u2.9 user mode +d now supported.
	mu3 /SILENCE command and replies now supported

*** News 1995-02-09:  Hack for 'uname' and 'c-like comments'
	see config.h about #define UNAME_HACK and #define COMMENT_HACK
	basically, it provides some sanity checking for people who dont
	like 1) giving out their uname's, and 2) having scripts like
	phoenix break on EPIC. (awwwww! >;-)
 
*** News 1995-01-10:  Bug fixes (alias.c)
	A tertiary operator without a colon (? but no :) caused a
	coredump: this has been fixed

*** News 1995-01-02:  Sanity check for SUPPRESS_SERVER_MOTD (numbers.c)
	If you have /set SUPPORT_SERVER_MOTD set to ON, then you
	cannot hook /on 372, 375, or 376 the first time you join
	a server (ie, its suppressed).  You will still hook these 
	ons any other time you do a /motd.

*** News 1995-01-02: new set: NUM_OF_WHOWAS (vars.h.proto vars.c edit.c whois.c)
	Allows you to set the number of WHOWAS replies you will recieve
	from the server for any given /WHOWAS command.  If the value is
	nonpositive, the WHOWAS suppression is turned off and you will 
	recieve all the WHOWAS replies from the server.  If it is set 
	to a positive number, you will recieve up to but not more then 
	that number of WHOWAS replies per command.

	You can override the set by using /WHOWAS <nickname> <NUMBER>
	where number is the number of whowas's you want for that 
	command ONLY.  It does not change the default.

*** News 1994-12-22:  Command line parser rewritten (irc.c)
	Revamped the command line argument parser, its not quite as 
	quirky now, and is more able to cope with different styles.

	The biggest change (that will break things) is that every flag
	must be preceeded by a hypen (ie, -lbs is *not* the same as 
	-l -b -s any more.)

	Of the commands that need to take an argument, the argument
	may either be in the same "word" as the flag or may be in 
	the next word. (ie, -lfoo.irc is the same as -l foo.irc)

	Arguments given in the same word to flags that do not expect 
	an argument elicit a warning but are not fatal.

	Naked arguments (arguments not starting with a hyphen) are parsed
	just like they always have been, with the first naked argument
	being used as the default nickname and any other naked args used
	as default server(s)

	All taken into account, it is intended that the command line
	arguments will now be easier to use and wont be quite so
	painful with its (oft) mistaken restrictions...

	New command line argument(s):
		-n    sets the default nickname

	The command flags -I and -i will be supported in some future 
	release. (used to determine default visibility)


***************************************************************************
EPIC1.003 (vars.h.proto vars.c alias.c)

	Added new set, /set PAD_CHAR that is used to determine the
	padding character used in the "width" expando (ie, $[10]foo).
	While syntatically PAD_CHAR may be set to any string, only the
	first character will actually be used and the rest are ignored.

EPIC1 (2.6 compliant)

	Upgraded to 2.6 (of course)

	Functions isalpha() and isdigit() added:  isalpha() returns "1"
	if first character passed is a lowercase or uppercase letter.
	Isdigit() returns "1" if the number is a digit, or is a hypen and
	the second character is a digit.

	Most (all?) of the word functions now call new_next_arg() instead
	of next_arg().  What this means for you is that if you wish, you 
	can group more than one word inside of quotation marks, and they
	will be considered as one "word" for matching/counting/etc.
	The usefulness of this will be demonstrated below. ;-)

	Flexible hooks have been added:  You can enter and recognize
	flexible hooks by using single quotes (') instead of double
	quotes (") around the pattern in the /on statement.
		So:  /on join '$N *' echo $*
	will /echo $* any time you join a channel.  The difference
	between a flexible hook and a regular hook is that the
	flexible hook's pattern is not static, but rather is dynamic,
	and any variables in the pattern will be expanded before it
	is matched against the incoming line.  This allows you to put
	variables/functions in a pattern and have it work right.

	Ability added to allow inline explosion of regular expressions.
	If you place two or more words inside a \\[ \\] set, the word
	that makes the pattern best match the string will be used:

	Example: (newlines added solely for readability)
		$rmatch(jnelson@rush.cc.edu 
			"sconway@\\[ugly raisin\\].ucs.indiana.edu"
			"jnelson@\\[rush.cc.edu it.uwp.edu\\]")

	would return "2" because the 2nd pattern matches the string.

		$rmatch(sconway@raisin.ucs.indiana.edu
			"sconway@\\[ugly raisin\\].ucs.indiana.edu"
			"jnelson@\\[rush.cc.edu it.uwp.edu\\]")

	would return "1" becuase the 1st pattern matches the string.

	Note the use of quotation marks around the 2nd and 3rd argument
	(which contain spaces) allows them to be considered as one
	logical word.

	An example that combines the previous two features:

		/assign $ak nick@user*host lamer@bogus*host
		/on JOIN '% % \\[$ak\\]' kick $1 $0 

	This ON will be parsed as follows:  Since this is a flexible hook,
	the $ak will be expanded to its value each time someone joins a 
	channel.  Next, it sees that the value of $ak is inside a \\[ \\]
	pair, so it subsitutes each word inside the pair into the expression
	to see which (if any) best match the pattern.  The value of a
	\\[ \\] pattern is the number of characters that is matched
	by the word in the pattern that exactly matches the most number of
	characters in the pattern.

	While it is syntatically acceptable to use nested \\[ \\] sets,
	the behavior of this is currently undefined and should not be used
	or trusted to be consistant in any future releases.


	The $which() function can now take two arguments, with the
	first being the file to search for, and the second argument
	being a colon seperated path.  The second argument is optional
	and $LOAD_PATH is used if no path is specified.

EPIC-pre1 (2.3.23 compliant)

	Ban listings are now counted, and the total number of
	bans is displayed (or available via /on 368 as $1)

	Undernet numerics are now (mostly) supported, and the
	additions to present numerics are also supported

	(Obsolete stuff about ZCAT removed)

	If you want things the way wintrhawk has them, just
	#define WINTRHAWK somewhere in config.h: otherwise things
	will appear as they normally are, more conventionally.

2.3.23+11.1

	(obviously) upgraded to 2.3.23

	Included stuff from wintrhawk: (everything from here on till
		you see the 2.3.22+11 line is from WintrHawk)

	Added 6 new STATUS_USER [4..9] variables that will only show in
        your NON-CURRENT window.  SHOW_STATUS_ALL must be OFF for these to
        work.  You can predefine these in the config.h or utilise them in
        exactly the same manner as you would STATUS_USER[..3].

	Additionally, all STATUS_USER variables can now be called with
        %0..%9 in STATUS_FORMAT with backwards compatibility of:
 
			[%U, %X..%Z] == [%0..%3]

	I hope you'll find these usefull in displaying additional
        information on your statusbar.  Look for my updated scripts that
        will take advantage of these in the near future.  I actually do plan
        to add more STATUS_USER variables but I don't have the time or
        patience yet.  |8^)

	Fixed the core dump problem when you attempt irc -h.

	Got rid of the "ircII%s..." bug that refused to show version info on
        abnormal termination.

        Introduced a new global variable UNAME to define system type and
        release information during a CTCP VERSION reply.  Maybe one of these
        days I'll have it autoconfig'd with the Gnu AutoConfigure Script.

        Fixed the bug that hop introduced that would strip all leading
        whitespaces from the input line.  Maybe he had a hidden agenda for
        doing that... I just found it annoying.

        DCC TALK was disabled because the routines didn't work right.  It's
        now fixed.

        Also fixed the bug that would cause you to exit even if you answered
        "no" to the "Do you want to quit?" prompt after hitting ^C.

        Changed +10's IRCFINGER routine.  Functionality remains the same.


2.3.22+11 

	New function: $which() searches your LOAD_PATH for
	the filename you specify, and returns the full path
	to it.  Useful for this example:
	
	alias send_script dcc send $0 $which($1)


	You can now enclose arguments to /LASTLOG inside "".
	You can also now use wildcards in /LASTLOG to determine
	what you want to search against.  If you use these two
	together, you can search for multi-word regexes.

	example:  /lastlog "t*is su"
		  /lastlog -literal "6667 is the port for irc"
		  /lastlog o*er
	

	$before() and $after() now have a few new features.
	You can now supply an optional integer value as the
	first argument to these functions, and if present, will
	be used to indicate which instance of the characters
	you wish to use.  If the number is negative, it counts
	off from the end.  You can also supply more then one
	character to look for, if you wish.  Some examples:

	# completely backwards compatable
	$after(! hop!jnelson@pv0420.vincent.iastate.edu)
		returns "jnelson@pv0420.vincent.iastate.edu"
	$after(-1 . hop!jnelson@pv0420.vincent.iastate.edu)
		returns "edu"
	$before(2 . hop!jnelson@pv0420.vincent.iastate.edu)
		returns "hop!jnelson@pv0420.vincent"
	$before(-3 . hop!jnelson@pv0420.vincent.iastate.edu)
		returns "hop!jnelson@pv0420"
	$after(-5 . hop!jnelson@pv0420.vincent.iastate.edu)
		returns "" because there are not 5 .'s


	Added new operators: +=, -=, *=, %=, /=, #=.  All do
	just what they do in C, except for #= which is a 
	string catenation operator.  I hope to have &=, ^=, and |=
	in the next release.


	New Keybinding: SHOVE_TO_HISTORY: simply takes what you
	have in the input line, saves it to your history, and
	then clears the input line (presumably for more pressing
	needs). You can get back to your line whenever you
	wish by just cycling through your history.
	Comes bound to ^] by default.

        
	$F now returns the time the client booted up,
        in $time() format (long integer in seconds since 1970)


	$J now returns the ircII client version you are
	running as a string ($V returns the date released)



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.

        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!

        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"

        $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.

		If you #define COMMENT_HACK, you can only have C like
		comments that start at the BEGINNING of a line.  The
		end of the comment still can occur anywhere.

        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.

	Fixed the mother of all memory leaks.  The one that leaked
	the channel mode each time the status bar was updated. Phone
	fixed this but introduced a new bug in the process.  That bug 
	got fixed in EPIC1.

        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
                * 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.

        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!

        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.

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

        fixed the $ischanop() bug from 2.2.9.  The one where if 
        someone changed nickname, the client thought they were no
        longer opped.  This bug still seems to be around in 2.8,
	but it is not present in EPIC.

2.3.16+8

        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.

        The load parser has been partially rewritten fixing a bug 
        when a semicolon was the last char on a line.
        
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" problem is no longer
	a problem, so the warning message has been removed.  Waiting
	recusively no longer locks up the client.

        New Functions:
                $center(length string)
                        Returns "STRING" centered in a field
                        of length LENGTH.
			To get a string of length 'length' you
			will need to use the width expando, ie
			$[length]center(length string)

                $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

        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 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 are also provided in command form, so that
		they can be used simply 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 
        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:  This command has added capabilities now.  But
	its straight use is generally uneccesary becuase the command
	parser is now able to deal with embedded {} blocks effectively.

        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}
    
        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

        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

	(*** Deleted info about $tert() function that is obsolete)

        Added the builtin function $onchannel() that 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.
    
        New command "REALNAME" (or "IRCNAME") allows you to change
        your REALNAME (the text on the right in the first line of
        a whois reply), it will take effect after you use the
        command "RECONNECT"


2.2.9+2
	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 (case insensitive)
		$diff(list1 / list2) returns all words not in both list1
			and list2 (case insensitive)

	/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)
		
	(Obsolete stuff about ZSUFFIX and loaded files removed)

	/on disconnect now hooks whenever you are not connected to a
	server, as stated in the help files.
	

2.2.9+
	(Obsolete stuff about ZSUFFIX and help files removed)

        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

        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. (if you #define HOP)