EPIC5-1.1.3

*** News 03/24/2012 -- New status bar expando, %G (Network)
	The %G status bar expando shows the 005 NETWORK value for your server

*** News 06/09/2010 -- New semantics for /BIND TRANSPOSE_CHARACTERS
	The TRANSPOSE_CHARACTERS keybinding now has the following semantics:
	1. When the cursor is on the first character, swap the first and second
	   characters.  
	2. When the cursor is on a character (but not the first character), swap
	   the character under the cursor with the character before the cursor.
	3. When the cursor is at the end of the line (and not on a character), 
	   swap the last two characters on the input line.
	In all three cases, the cursor stays in whatever column it is in.

*** News 06/05/2010 -- New script: rejoin
	Stores channel/key on disconnect/part/kick. I hope it's useful!

	Allows you to rejoin all channels lost in a disconnect, by doing:
	/rejoin -all OR /rejoin -server

	See script for details. 

EPIC5-1.1.2

*** News 04/15/2010 -- New flags to $sar(), $msar(), case sensitivity
	In EPIC4, $sar() and $msar() were case sensitive.
	You could turn this off by using the 'i' flag.
	In EPIC5, $sar() and $msar() are case *INSENSITIVE*
	There has been no way to turn this off!
	You can now turn this off with the 'c' flag.

	Example:
		$sar(g/One/Two/one One one One)   -> "Two Two Two Two"
		$sar(cg/One/Two/one One one One/) -> "one Two one Two"

*** News 04/15/2010 -- New /on, /on unknown_set
	As a favor to howl, I've added /on unknown_set, which will be hooked
	whenever /set is called on a set that doesn't exist.
		$0  - The set that doesn't exist
		$1- - The value the user wanted to set.
	If you catch this, then the /on set that triggers for "unknown-set"
	will not be thrown.  If you don't know what I'm talking about, then
	you won't miss it.

*** News 04/01/2010 -- Can now backslash colons in server passwords
	Previously it was impossible to include colons in server passwords
	because colons are delimiters in server descriptions.  Now you can 
	backslash the colon and it will do the right thing.  Don't forget to
	backslash your backslashes!

		Real password		What you should use:
		-------------------	---------------------
		onetwothree		onetwothree
		one:twothree		one\:twothree
		one\two:three		one\\two\:three

*** News 03/25/2010 -- Can now modify servers by refnum (Fix to server descs)
	The /server command was broken in the epic5-1.1.1 release, and got 
	some extra work for the next release.  As part of this work, you can 
	now add change fields to a server refnum, like so:
		/server 1:type=irc-ssl
	Previously refering to a server refnum didn't support change fields.

EPIC5-1.1.1

*** News 3/19/2010 -- EPIC5-1.1.1 was released here

*** News 3/19/2010 -- The last value of /WINDOW SERVER is saved per window
	The last argument passed to /WINDOW SERVER is saved on a per-window
	basis, via $windowctl(GET x SERVER_STRING).  I added this because
	howl asked for it, although I don't know what he intended it for.

*** News 3/19/2010 -- Modifying server descriptions on the fly
	You may now modify server descriptions on the fly in the
	following situations:
		/SERVER -ADD <desc>
		/SERVER -UPDATE <desc>
		/SERVER <desc>
		$serverctl(READ_FILE filename)
		$serverctl(UPDATE refnum stuff)
		/WINDOW SERVER <desc>
	For example, let's say you created a server irc.foo.com, but
	you forgot that it used SSL.  Before it was a pain to "fix" that,
	but now you can fix it like this:

		/SERVER -ADD irc.foo.com:8855
	(oops, it uses ssl, i forgot!)
		/SERVER irc.foo.com:type=irc-ssl
	(aha! okie. now it will connect using ssl)
	
*** News 3/19/2010 -- You can log everything with /LOG SERVER ALL
	If you create a log like:
		/LOG NEW FILE myirc.log SERVER ALL ON
	that will log everything.
	Previously, you had to add each server individually by 
	refnum, but now you can just use the magic string "ALL"
	to refer to all servers.

*** News 3/19/2010 -- Rewrite /log support
	The /LOG command should work a lot better now.

*** News 3/19/2010 -- New target to msg a window, @E<winref>
	You can /echo to a window by /msg'ing its winref, as in:
		/msg @E3 This message will display in window 3.

*** News 3/19/2010 -- "global" now loads ambig and newnick scripts

*** News 3/19/2010 -- New /XEVAL -N flag, which reverses the ^ flag
	Normally if you run an alias or an on with ^, it will treat every 
	command as though it were prefixed with ^.  This suppresses the 
	output of many commands, which you may not want to do.  You can 
	negate the effect of ^ with /XEVAL -N.  For example:
		/on ^hook "chdir %" {
			xeval -n {cd $1-}
		}
	Normally the /CD command will output an error if it could not
	change the directory, but since ^ suppresses that error, in this
	example, you'd never know that the cd failed.  So you can wrap 
	commands whose error messages you want to see in /XEVAL -N.
	Don't forget!  Always wrap your commands in {} to avoid unintended
	back doors.

*** News 3/19/2010 -- Remember, $dccctl(GET refnum WRITABLE)
	If you combine $dccctl(FD_TO_REFNUM fd) with
	$dccctl(GET refnum WRITABLE) you can detect when a nonblocking
	connect has succeeded!

*** News 3/19/2010 -- New $dccctl(FD_TO_REFNUM <fd>)
	The $connect() function returns a file descriptor, which you can
	pass to $dccctl(FD_TO_REFNUM fd) to get the $dccctl() refnum,
	which you can use to do other stuff.

*** News 3/19/2010 -- New flag to /EXEC, -CLOSEOUT
	If you do /EXEC -CLOSEOUT it will close the stdin to the process,
	(ie, sends an EOF) which some processes need to decide that 
	they're supposed to do something.

*** News 3/19/2010 --  New scripts I should have documented
	These scripts have been added, but I never got around to documenting
	them.  That's a bummer.
		help.irc	history.rb	locale
		tabkey.sjh	logman		cycle
		set_color	ban		speak.irc

*** News 10/29/2009 -- Valgrind assistance
	If you want to run epic under Valgrind, you may want to pass the
	--with-valgrind  flag to configure, which will compile in some 
	additional assistance to help valgrind find memory leaks.  This
	support was graciously provided by caf, as were patches for the
	bugs he found using valgrind.

*** News 07/06/2009 -- The Fish64 xform actually works now (see below)
	The first implementation of FISH64 was not actually, to be technical,
	compatable with FiSH.  It is a strange thing and it took me a while
	to come up with an implementation of it that doesn't depend on how
	bits are stored in integers.  I have actually tested it against the
	real life FiSH implementation and it's correct now.

*** News 06/17/2009 -- New $xform, "FISH64"
	The FISH64 transform performs base64 encoding that is compatable
	with FiSH.  Fish64 uses the same algorithm as base64, but it uses
	a different character set.

*** News 06/08/2009 -- New $xform(iconv) functionality
	You can now refer to a pre-defined iconv encoding setup,
	instead of specifying encoding upon every use of
	$xform(iconv). Whereas you in the old days would do:

		echo $xform(iconv utf-8/ascii $stuff)

	which would take a lot of cpu time, as the client would have
	to do a lot of stuff to open, use, and then close up, the
	iconv stuff, you can now do as follows:

		@ id = iconvctl(ADD utf-8/ascii);
		echo $xform(iconv +$id $stuff);

	You can also do:

		echo $xform(iconv -$id $stuff)

	to reverse.
		Use /xdebug +unicode to debug iconv stuff!

*** News 06/08/2009 -- New control function: $ICONVCTL()
	This function works as follows:

		@ id = iconvctl(ADD fromcode/tocode[//option])
	
	This sets $id to a permanent identifier for doing encoding 
	from *fromcode* to *tocode*. (This may speed up encoding a 
	bit.)
		If the chosen encoding isn't accepted by iconv(),
	$iconvctl() returns empty.
	
		@ encoding = iconvctl(GET $id)

	This will return whatever you set the encoding $id to.

		@ iconvctl(REMOVE $id)

	This removes the $id from the table of encodings.

		@ iconvctl(LIST)

	This lists encodings.

		@ iconvctl(SIZE)

	And this returns the size of the iconv table.

	Do notice that identifers are re-used after removal.	

*** News 06/08/2009 -- Add USERINFO to /on hooks
	You can now add some information to "executing hooks".
	
		@ hookctl(USERINFO -1 stuff)

	This will set the USERINFO of the current executing hook 
	to "stuff". To get the userinfo of the current executing hook:

		echo $hookctl(USERINFO -1)

	This can be used in conjunction with changing the $* of a hook,
	to, for instance, add encoding information to a it.

*** News 06/06/2009 -- Can change $* in an /on hook now
	You can change the value of $* in an /on hook that will affect
	/on's with higher serial numbers.  
		@hookctl(ARGS <level> <new value of $*>)

	This is expected to be useful for things like iconv translation.  
	Please note carefully that the pattern matching of /on's against 
	$* is done *AFTER EACH ON IS RAN* so if you change $* you might
	affect which higher serial numbered /ons will run!

	Usually <level> is -1 and usually the new value of $* would be based
	on the current value of $*.  The change to $* takes place immediately.

	Example one:
		on #^hook -100 * {@hookctl(ARGS -1 >>>$0 $1<<< $2-)
		on ^hook * {echo $*}
		hook This is a test
	  would output
		>>>This is<<< a test
	  because the /on hook with serial number -100 changed the old value
	  of $*
		"This is a test"
	  to 
		">>>$0 $1<<< $2-"
	  which after expansion is:
		">>>This is<<< a test"
	  which is the value of $* in the /on hook with serial number 0.

	Example two:
		on #^hook -100 * {@hookctl(ARGS -1 $reverse($*))}
		on ^hook "ape" {echo APE! APE!}
		hook epa
	  would output
		"APE! APE"
	  because the first hook changes $* from its original value
		"epa"
	  to $reverse(epa) or
		"ape"
	  which matches the second hook.

*** News 04/10/2009 -- /WINDOW CHANNEL now outputs all channels in the window
	Previously, /window channel only output the window's current channel.
	It still does that, but now it will also output the full and complete
	channel list so you see the other channels in that window.

*** News 04/10/2009 -- /IGNORE user@host.com now works again
	Due to a really lame bug, /ignore user@host.com did not work 
	properly because the client thought it was a server name and did
	not fix it up to *!user@host.com which prevented it from matching
	anything which prevented it from working.  Sorry about that.

*** News 04/10/2009 -- Add permitted values for server desc "proto" field
	Previously, despite all of the documentation to the contrary, the 
	only permitted values were "0", "4", and "6" for "either", "ipv4 only"
	and "ipv6 only" respectively.  This has been increased so you can
	specify any of these values:

	For "either ipv4 or ipv6, I don't care" (the default)
		0
		any
		ip
		tcp
	For "ipv4 only, never use ipv6 for this server"
		4
		tcp4
		ipv4
		v4
		ip4
	For "ipv6 only, never use ipv4 for this server"
		6
		tcp6
		ipv6
		v6
		ip6

	Example to connect to an ipv6 server:
		/server irc.ipv6.foo.com:6665:proto=tcp6

	Example to connect to a server only using ipv4:
		/server irc.foo.com:proto=ipv4

EPIC5-1.0

*** News 12/25/2008 -- EPIC5-1.0 was released here.

EPIC5-0.9.1

*** News 12/12/2008 -- Configure will check for perl/ruby/tcl usability
	Up until now, configure would include perl/ruby/tcl as long as it
	existed and told us where its stuff was at.  That's bad if you
	don't install the dev packages, because linking against the 
	langauage library won't work if it's not there.  Configure will now
	try a test-compile to use the language embedding to see if it works
	and supports the api we expect.  Failures will cause that language
	to be turned off.  Be sure to re-run configure!

*** News 12/10/2008 -- New function, $chanlimit(#chan #chan #chan)
	The $chanlimit() command works just like $chanmode(), but it
	returns the +l argument -- the channel membership limit.
	This is by special request of fusion.

*** News 12/10/2008 -- Minor change to /SET NEW_SERVER_LASTLOG_LEVEL
	Previously, each time you connected to a server (received a 001 reply)
	the client would unconditionally assign all of the levels in 
	/set new_server_lastlog_level to the server's current window.
	This is rather annoying if you got disconnected from the server 
	because the default value is ALL,-DCC and that would clobber all of
	your window levels. 

	Having this brought to my attention, this has been changed to be 
	more reasonable.  These will now reclaim any unused levels, rather
	than unconditionally stealing them from other windows.  Thus, what
	/set new_server_lastlog_level ALL,-DCC means is, "each time I connect
	to a server, please put any levels that aren't being used by any 
	window connected to this server in the current window".   I apologize
	for the previous behavior which was stupid and shouldn't have survived
	as long as it did.

*** News 12/10/2008 -- Minor change to /SET OLD_SERVER_LASTLOG_LEVEL
	The same change applies when you /window server a window to a server
	that is already connected -- it has its window level changed to
	/set old_server_lastlog_level, but it will now NOT steal the level
	from any other window that already claims it.

EPIC5-0.9.0 (EPIC5-0.3.10)

*** News 11/24/2008 -- New /window operation, /WINDOW SCROLL_LINES
	The /WINDOW SCROLL_LINES operation overrules /SET SCROLL_LINES for
	one particular window.  The value may be -1 (which is the default, 
	and means use /SET SCROLL_LINES) or a positive number.

*** News 11/01/2008 -- New /SET, /SET DCC_CONNECT_TIMEOUT
	This set will control how long a nonblocking connect for a /dcc get
	or /dcc chat can go before the client decides to abandon it.  The 
	value is in seconds, and 0 turns this off (connects will not time out)
	The default value is 30 seconds.  This feature uses system timers,
	and you shouldn't change the value of this /set while a connect is 
	pending or you'll confuse things and your connects probably won't
	time out properly.

*** News 09/24/2008 -- New script, 'topicbar'
	The idea with this script is to use topline 1 of any window
	with a channel to display the topic of the given channel.

*** News 08/25/2008 -- /SET INPUT_INDICATOR_RIGHT now functional
	It was documented below, but the code for it wasn't finished until
	today.  So now it will start appearing on your input line.

*** News 07/01/2008 -- Add servers from file -- $serverctl(READ_FILE filename)
	You may now insert servers into the server list from a file using
	$serverctl(READ_FILE filename) where "filename" is the name of the 
	servers description file.  Note that the servers are appended to the
	end of the servers list!  The filename must be in the same format
	as the server description file that is loaded at startup.

EPIC5-0.3.9

*** News 06/25/2008 -- configure --without-wserv, job control
	Configure now checks your system to see if it has posix job control
	(which means you have setsid() and tcsetpgrp()) and if it does not,
	it turns off job-control features:
		/BOTMODE
		/EXEC
		/LOADing of compressed files
		$killpid()
		$exec()
		$open() of compressed files
		The -b command line option
		External crypto program support
		Asynchronous (nonblocking) DNS lookups
		Wserv support

	You can also use the --without-wserv flag to configure to turn off
	wserv support for a system that otherwise supports job control.
	There is nothing gained by omitting wserv support, only things
	removed.  Normally this flag wouldn't be added but I did it as a
	favor to someone.

*** News 06/25/2008 -- You can now /ignore a server
	Due to some networks (undernet) having annoying servers that 
	spam you 10-20 times a day with annoying messages you don't want
	to receive, it's now possible to /ignore a server:
		/IGNORE irc.server.com ALL

*** News 05/09/2008 -- Hitting ^C twice interrupts infinite loop
	Historically, if you hit ^C twice in a row and the client is stuck,
	it will send itself a SIGARLM.  In the past, this was because the
	client used blocking connect()s and stuff, and guarded them with
	alarm(3)s, so sending SIGARLM would cause an early interruption to 
	a blocking connect.

	Anyways, since we don't have any blocking stuff any more, this is no
	longer useful for its intended purpose.  You've been able to send the
	client a SIGUSR2 to raise a 'system exception" which attempts to 
	gracefully end an infinite loop in your script.  Hitting ^C twice
	in a row on a stuck client will send a SIGUSR2 which will cause an
	infinite loop in your script to terminate.

*** News 05/09/2008 -- New /SETs: INPUT_INDICATOR_LEFT, INPUT_INDICATOR_RIGHT
	This was written and contributed by fusion.  Thanks!

	The input line has been changed so the input prompt is always visible.
	When you reach the right or left side of the display, the input line 
	will still scroll side-to-side, but the input prompt will always be 
	visible, not just when you're at the start of the input line.

	Because it would otherwise not be obvious whether you are at the 
	beginning of the input line or not, there have been two new /set's
	added:
		/set input_indicator_left +
		/set input_indicator_right  +

	When there is more stuff on the input line than what is currently
	visible, if the extra stuff is off to the left, the first /set is
	used to tell you there is more in that direction.  If the extra 
	stuff is off to the right, the second set is used to tell you there
	is more in that direction.

	As of the time of this writing, the support for the second /set isn't
	ready yet, so there is no visual clue if you are at the end of the
	input line or not.  Keep watching for more info about this.

*** News 04/23/2008 -- Added new /on, /ON WINDOW_NOTIFIED
	This is hook is thrown when there's activity in a hidden window
	that is notified.
		$0 - The window refnum
		$1 - The level of the activity.
	Be careful with this hook, as output defered from it, may
	wreak havoc. 

EPIC5-0.3.8

*** News 04/10/2008 -- Added new /on, /ON SIGNAL
	You can hook signals with /ON SIGNAL
		$0 - The signal that was caught (a number)
		$1 - The number of times this signal has been caught
		     since the last time /ON SIGNAL was thrown
	Not every signal can be caught, and some signals are dangerous
	to catch.  For example, no matter what, you can't catch signals
	9 (KILL) or 13 (PIPE) 15 (TERM).  It's safe to catch 30 (USR1)
	and 31 (USR2), but everything else is entirely at your own risk.
	You should /defer anything you do within an /on signal to be safe.

*** News 04/10/2008 -- /USERHOST -FLUSH
	/USERHOST -FLUSH removes those userhosts which are "pending send"
	not those which are "pending receive".

EPIC5-0.3.7

EPIC5-0.3.6

*** News 03/10/2008 -- /NOTIFY list now applicable to local server.
	The notify list can now be updated on a per server basis.  This is done
	by placing the ":" nick before the list of local changes in the /NOTIFY
	command.  Everything on the /NOTIFY line UP TO the ":" is still
	applicable to every server.

	Examples:
	/NOTIFY : - [nicks]  # Clear local list and replace with [nicks].
	/NOTIFY - : [nicks]  # Clear all notify lists and add [nicks] locally.

*** News 01/28/2008 -- /ON WINDOW_COMMAND has command as $2        (kitambi)
	The command being executed is $2 in /on window_command.  If you do evil
	things with this, you may crash the client.  You Have Been Warned.

*** News 01/23/2008 -- New built in function $check_code(...)
	--- Warning --- This function is not really as useful as it looks
	because you would be unable to submit an invalid block statement
	or expression to the function without getting a warning from the 
	syntax parser in the first place.  I don't know how I will "fix"
	this, but maybe you might find the function interesting for now.

	The $check_code() function takes either a *block statement* 
	(surrounded by curly braces {}) or an *expression* (surrounded 
	by parenthesis ()) and tells you whether the item is well-formed
	and does not have any unmatched braces or parentheses.  It does 
	*NOT* tell you if the code or expresison inside the item is valid
	or even makes sense, it only tells you if it contains code that
	you could pass to /eval or to /@.

	Return values:
		 0 - The expression or block statement looks ok
		-1 - This is not an expression or block statement
		-2 - The expression/block statement is invalid, probably
		     because there is unmatched brace or parenthesis
		-3 - There is trailing garbage after the closing brace or
		     parenthesis.
	More return values will probably be added in the future as more
	errors become detectable.

*** News 01/22/2008 -- /SERVER listing now shows your vhost
	The listing of your servers from /SERVER now shows you the vhost
	that you're using (if any).  I forget who asked for this.

*** News 01/22/2008 -- Oper passwords no longer revealed with ^L
	Wjr pointed out that if you did /oper and typed a password that
	was hidden and hit ^L it would reveal the password.  This has 
	now been fixed.

*** News 01/22/2008 -- $ignorectl(SUSPEND) and $ignorectl(UNSUSPEND)
	Larne asked for a way to globally turn off /ignores for some 
	period of time.  So you can turn off all ignores globally 
	with $ignorectl(SUSPEND) and turn ignores back on again later
	with $ignorectl(UNSUSPEND).  A word of caution -- this is a counting
	queue, so each SUSPEND must be matched with an UNSUSPEND.  If you
	do two SUSPENDs and one UNSUSPEND, it will still be SUSPENDed.
	Use $ignorectl(RESET_SUSPEND) if you get the client totaly confused.

*** News 01/22/2008 -- You can /load executable files, with caution
	Crimedog said that all of his scripts on windows were executable 
	(+x) and epic wouldn't let him /load them, and so I've removed the
	restriction that you can't /load executable files.  I've replaced it
	with a warning that the file is executable and that /loading binary
	files yields undesirable results.

*** News 01/22/2008 -- /xecho -w -1 outputs to current window
	As a special favor to BlackJack, /xecho -w -1 will output to the
	current window, because this is what epic4 used to do, particularly
	when you did /xecho -w $winchan(#foo) and #foo was not a channel
	that you were on (so it returned -1) and it output to the curernt
	window.  In any other case but -1, /xecho -w to a window that 
	does not exist will drop the output.

*** News 01/22/2008 -- New built in function $strptime()
	Now you know the $strftime() function converts a $time() value into
	a string using a special format.  If you have the output of strftime
	and you have the format it was created with,t he $strptime() function
	will return the original $time() value it was created with.  This
	is probably useful by people who are parsing logfiles and want to 
	get a $time() value so they can do time math and see how long ago
	something occured.

	For the moment, this only works if you have strptime(3) on your
	system, and not everybody does.  Very soon, a compat version of 
	strptime() will be shipped with epic to ensure minimum functionality.

*** News 01/05/2008 -- You can now use arglists with /input (fusion)
	You can now use arglists with input, like so:

	input "Enter command and arguments: " (cmd, args) {
		xecho -b You entered [$cmd] and [$args]!
	}

*** News 01/03/2008 -- $info(o) values for libarchive, iconv support
	If the binary supports libarchive, $info(o) will include 'r'.
	If the binary supports iconv, $info(o) will include 'v'.
	Libarchive support is required to /load from a .zip file
	Iconv support is required to be able to do character set translation.

*** News 11/29/2007 -- New function $fix_width()
	The $fix_width() function takes the following arguments:
		cols      $0    Number of columns
		justify   $1    Justification (must be "l" for left justify)
		fillchar  $2    Fill character (a dword, so use " " for space)
		text      $3-   

	This function returns <text> formatted so that it takes up exactly 
	<cols> number of columns on the display.  It does this by adding
	<fillchar> to the string on either the left or the right or both.

	If <text> is already wider than <cols> then it is truncated to <cols>.

	<Justify> must be either "l" for left justify, "c" for center, or "r"
	for right justify.  Only left justify is supported.  The others are
	for future expansion.

	This function is intended for creating full width reverse toplines:
		@ :cols = word(0 $geom())
		@ :str = fix_width($cols l " " blah blah blah blah)
		window topline 1 "^V$str"

	You will probably want to call $fix_width() in a separate statement
	from the /window topline in order to avoid the syntactic confusion
	with passing a double quoted word to /window and passing a double
	quoted word to $fix_width() (the space).  Trust me.  Don't go there.

	In the future, support will be added for right justify and centered.
	Please keep watch out in this document for more info.

*** News 11/29/2007 -- Support for ZIP files from libarchive
	Support for loading files from .zip files has been added.  This first
	round of implementation just adds the raw ability, but it's not 
	totaly ready to be used yet.  You're welcome to start playing with
	it and reporting any problems you have.

	You can $open() a file for reading or /load it from a zip file:
		/load foo.zip/file
	and
		@fd = open(foo.zip/file R)

	If you /load a zip file, it will load the file ".ircrc" in the top
	level directory.  This might be enahanced or changed in the future:
		/load foo.zip
	acts like
		/load foo.zip/.ircrc

	Some operations cannot be performed on zipped files, such as $fseek()
	and $frewind() and so forth.  This might change in the future.

	All of this is based on 'libarchive' being installed.  You will need
	to re-run configure in order to pick up libarchive support after you
	do a cvs update.

*** News 10/22/2007 -- New flag to /lastlog, /lastlog -window
	The /lastlog -window flag lets you grep the lastlog from a different
	window.  The output will still go to the *current* window, however!

*** News 09/19/2007 -- Some built in functions now 'builtin' aliases.
	Several functions that have been deprecated by $xform() have been
	demoted from built in functions to aliases in the 'builtins' script.
		encode		decode		b64encode	b64decode
		urlencode	urldecode	sedcrypt	sha256

EPIC5-0.3.5

*** News 09/14/2007 -- New built in function: $splitw(<delim> <string>)
	This function takes a <string> which has sections delimited by
	<delim>.  The <delim> argument can only be one character.  An
	obvious example of this is $PATH which is a <string> that uses
	the colon as <delim>.  The <delim> is a dword, so you can use the
	space as a delimiter if you needed to.

	This function unconditionally converts <string> into a dword list.
	You will need to xdebug dword to iterate over the return value, or
	you can use $unsplit(" " $splitw(<delim> <string>)) to collapse it
	to a uword list (although this is probably pointless)

	Example:
		@ directories = splitw(: $PATH)
	might return
		/bin /sbin /usr/bin /usr/sbin /usr/local/bin

	Example:
		@ foo = splitw(: one:two:three a berry:four:five)
	returns
		one two "three a berry" four five

*** News 09/13/2007 -- New /SET, /SET STATUS_HOLDMODE
	This is the value that %{1}H expands to.  The default is " (Hold)".
	If you don't like the "(Hold)" in your status bar when your window
	is in hold mode but not holding anything, unset this variable 
	entirely:
		/set -status_holdmode
	and it will disappear.  Or remove %{1}H from your status format.

*** News 09/13/2007 -- New status expando, %{1}H, hold mode indicator.
	The %H status expando expands when your window is in hold mode
	*and* there is something being held.  But if your window is in
	hold mode, but nothing is held, you can't tell just by looking.
	So the %{1}H status expando will expand whenever the window is in
	hold mode *except* when %H will expando.  This is so you can put
			%{1}H%H 
	in your status format and one or the other (but not both) will 
	expand at all times hold mode is on.

	This expando has been added to the client's default status format.
	The value of %{1}H is controlled by /set status_holdmode, and the
	default value of that is " (Hold)"

*** News 09/13/2007 -- Remember, *0 is an rvalue, but *var is an lvalue
	The deref operator ("*") converts a token into an rvalue and then
	uses that as an lvalue.  Example:
		assign foo bar
		@ *foo = [testing]
		echo $bar
	in the above (*foo) is the same as "bar".  But numbers are different.
	Derefing a number yields an rvalue:
		alias oofda { @ foo = *0 }
		offda one
	To convert an argument into an lvalue, deref it a second time:
		alias booya { @ *(*0) = 'testing' }
		booya varname
		echo $varname
	Does that make it clear?

*** News 09/02/2007 -- New function, $is8bit(string)
	This function find the first character of string that has the
	eight bit set. Useful to discover Unicode-strings or other 
	non-eight bit characters.

*** News 08/22/2007 -- New xform, $xform(ICONV "from/to" text)
	If your binary is built with iconv support (re-run configure before
	you tell me it doesn't work!) then you will be able to use iconv()
	to translate strings from one character encoding to another.  This
	might be useful to experimentally convert to and from utf8 while 
	you wait for the unicode-enabled input line to be written.

XXX Help files updated to here XXX

*** News 08/22/2007 -- Checks for iconv in configure: --with-iconv
	Configure will now check for libiconv support.  Normally it will
	look for libiconv.a and iconv.h in the --prefix/lib and 
	--prefix/include directory, or in /usr/local or /opt or /usr/opt.
	If your iconv support is not in any of these places, then you must
	supply the --with-iconv=/path/to/dir where that directory contains
	"include/iconv.h" and "lib/libiconv.a"

*** News 08/22/2007 -- Checks for alt place in configure: --with-localdir
	A lot of times you'll have software installed but it won't be in
	the places the compiler looks for it.  Usually this is /usr/local
	or /opt or something.  You can use this flag to tell configure to
	look in this directory in addition to the default directories.  This
	can aid in ensuring optional dependancies don't get turned off because
	they're in a directory the compiler doesn't look in.

*** News 08/13/2007 -- New /SETs, /SET DEFAULT_REALNAME and DEFAULT_USERNAME
	Per a discussion on the list, it was decided to introduce two new
	sets, /SET DEFAULT_REALNAME and /SET DEFAULT_USERNAME.  These control
	what realname and username should be sent to the server each time you
	connect.  Although I can't stop you, you shouldn't unset these 
	variables if you know what is good for you.

	/SET DEFAULT_REALNAME replaces /SET REALNAME, which confused people
	who though that /setting it changed their realname immediately

	/SET DEFAULT_USERNAME replaces /ircuser which confused people
	because they thought it was going to be a /set.

*** News 07/20/2007 -- New /SET, /SET LASTLOG_REWRITE
	This provides the default value to /lastlog -rewrite whenever you
	don't use the /lastlog -rewrite flag.  If you always want the 
	/lastlog command to timestamp each line, try this:
		/set lastlog_rewrite $strftime($1 %T) $8-

	(Remember, if you use this in a pf loaded script to double up $'s...
		/set lastlog_rewrite $$strftime($1 %T) $$8-		)

*** News 07/20/2007 -- New flag to /LASTLOG, /LASTLOG -REWRITE
	The /LASTLOG -REWRITE flag rewrites each lastlog line with the 
	following values for $*
		$0  - The lastlog item's unique refnum
		$1  - Timestamp (suitable for use with $strftime())
		$2  - Window refnum
		$3  - Output level
		$4  - Reserved for future use
		$5  - Reserved for future use
		$6  - Reserved for future use
		$7  - Output target
		$8- - The logical line of output
	Not all of these field are intended to be useful -- but I don't
	know what sort of imaginative things people might come up with.

	Example:  To put a timestamp before every line...
		/lastlog -rewrite "$strftime($1 %T) $8-"

*** News 07/04/2007 -- New $windowctl() option, $windowctl(GET refnum CHANNELS)
	You can now fetch all of the channels in a window by using
		$windowctl(GET <refnum> CHANNELS)
	There is no defined order to the channels returned.

*** News 07/02/2007 -- Clarification of single-indirection implied hooks
	Earlier, I said...
	   You may surround <string> with {}s if you wish, to avoid quoting
	   hell.  Match sure to keep your {}s matched up if you do so.
	   See the "loadformats" info above for how to practically use this.

	But due to a mistake, this never worked correctly.  This is now 
	fixed.  If you compare the normal two-expansion version:
		@ var = [format_send_public]
		@ fmt = '<%W$N%n> $1-'
		addset $var int
		@ hookctl(set list send_public implied \\$var);
		set $var $fmt
	which ties /on send_public dynamically to the value of 
	/set format_send_public.

	If you wanted to do it directly, and not tie the implied hook to a
	variable, you can surround the format in curly braces, like so:
		@ hookctl(set list send_public implied {<%W$N%n> $1-})
	Remember that curly braces protect the insides from $-expansion,
	so for all purposes the inside of {}s is a literal string that is
	not expanded except each time the /on is thrown.

*** News 07/02/2007 -- Clarification on using $'s in expression parser
	The old expression parser used to allow you to use expandos as
	lvalues in order to indirectly assign to variables, for example:
		alias inc {
			@ $0 += 1
		}
	But this is not supported in the new math parser.  Instead you 
	have to use the deref operator, like so:
		alias inc {
			@ *0 += 1
		}
	which does the same thing.

*** News 06/25/2007 -- New flag to /XECHO, /XECHO -AS
	The /XECHO -AS flag will output a message to all windows on the
	current server.  You can combine this with the -S flag if you want 
	to output to another server.  This might be good for blasting a 
	message when you're disconnected from the server.  For another
	example, see below.

*** News 06/25/2007 -- New window level, SYSERR
	The SYSERR window level will now be used for all of those layered
	"INFO --" system errors ("syserrs").  The client will make its best
	effort to ensure that these messages go to the correct server's
	windows, and that /on yell is hooked in the correct server context.

	You can combine this with /xecho -as  [see above]...
		on ^yell "* INFO -- *" {xecho -as $*}

EPIC5-0.3.4

*** News 06/02/2007 -- New tranformer: $xform(ALL)
	The $xform(ALL) transform ignores the text and returns a list of
	all supported tranformers.  If the user didn't compile SSL support,
	then you won't be able to use the strong crypto transforms, so this
	is a great way to check before trying to use crypto.

	Since this is a regular old transform, you can further transform it
	any way you want to (if you want to).

*** News 06/01/2007 -- More $xform()s added to the list below
	Please re-read the list immediately below, it's been updated!

*** News 06/01/2007 -- Totaly rewritten $xform(), now actually useful!
	Here's the plan -- we're going to do this over again a second time.

	$xform("<transformations>" "meta" "meta" text)
	     
	Where the <transformation>s are supported by transform_string().
	At the time i write this, they are:

	Reversable encodings that convert between binary and printable data
	and do not require a meta:
	     URL             URL encoding           
	     ENC             Base16 encoding        
	     B64             Base64 encoding        
	     CTCP            CTCP encoding          
             NONE            Straight copy -- data not changed

	Reversable encryptions that require a meta value (a password):
	     SED             Simple Encrypt Data  
	     BF              Blowfish-CBC         
	     CAST            CAST5-CBC            
	     AES             AES256-CBC
	     AESSHA          AES256-CBC with SHA256 digest of the meta
	     DEF             Default encryption     (NOT IMPLEMENTED YET!)

	Irreversable digest operations that do not require a meta:
	     SHA256          SHA256 message digest

	You can string together multiple transformations.  Any transformation
	that requires a meta value (ie, a cipherkey) should be supplied after
	the transformations *in the correct order*.  After this should be the
	plain text.  To apply a transformation, prefix its name with a plus sign
	("+") and to remove a transformation, prefix its name with a minus sign
	("-").  For example, +URL means url encode, and -URL means url decode.

	The transformations is a dword (must be surrounded by double quotes if
	it contains a space, which it will if you do multiple transformations).
	The meta values are dwords (must be surrounded by double quotes if 
	they contain a space).  These two things make this function behave 
	differently than functions normally do, so this is a documented 
	deviancy!

	Examples:
	     URL-encode a string     $xform(+URL this is a string)
	     URL-decode a string     $xform(-URL this%20is%20a%20string)
	     SED-cipher a string     $xform(+SED password this is a string)
	     SED-decipher a string   $xform(-sed password <whatever>)

	More practical examples:
	1) Read binary data from a file, encrypt it, and url encode it again.
	     @fd = open(file.txt R)
	     @data = read($fd 1024)
	     @cipher = xform("-CTCP +SED +URL" password $data)
	     @close($fd)
	     msg someone $cipher

	Why does this work?
	 -- $read() returns ctcp-enquoted data, so -CTCP removes it
	 -- Now we have binary data, so +SED will cipher it
	 -- Now we have ciphertext, so +URL will url encode it.

	We can send this to someone else, and they can put it in $cipher...

	     @newfd = open(newfile.txt W)
	     @newdata = xform("-URL -SED +CTCP" password $cipher)
	     @writeb($newfd $newdata)
	     @close($newfd)

	We did the reverse of the above:
	 -- We -URL to recover the binary data
	 -- We -SED to decrypt it using the password
	 -- We +CTCP to put it in a form we can use with $writeb().

	Viola!

*** News 05/31/2007 -- New math operator, Unary ** operator
	The ** unary prefix operator treats its operand as an unexpanded
	string, permitting it to be expanded again.  This should remove
	most any need to use /eval.  Example:
		@ foo = 'this is a string with $var in it'
		@ var = 'one'
		@ val1 = **foo
		@ var = 'two'
		@ val2 == **foo
	So $val1 is "this is a string with one in it" and $val2 is
	"this is a string with two in it".  You can apply this operator
	to any rvalue (natch):
		@ foo = **[booya $foo booya!]
	becomes
		@ foo = **[booya this is a string with $var in it booya!]
	becomes
		@ foo == [booya this is a string with two in it booya!]
	Yeah!

*** News 05/17/2007 -- New script, 'dcc_ports'
	This script adds two new sets:
		/set dcc_port_min <number>
	and
		/set dcc_port_max <number>
	which create a port range which will be used by your dcc's.  Each
	number in the range will be chosen sequentially (this will be 
	enhanced further in the future) and any time you change either of 
	these values you reset the sequence and it goes back to the minimum
	port again.  When the port range is exhausted, it will cycle back
	again to the minimum port.

*** News 05/17/2007 -- Default ports for dcc, recovering from ports-in-use
	There are two new features, that sort of complement each other, and
	sort of overlap each other.  Whether to use one or the other depends
	on how your script is set up and what your needs are.

	When you use /dcc chat or /dcc send, but do not use the -p flag to
	specify a port, you can create a callback to your script to create
	a default port:
		@dccctl(DEFAULT_PORT <string>)
	The <string> will be expanded with $* being the dcc refnum of the
	dcc needing a port number.  The expanded value of <string> will be
	used to set the WANT_PORT value (see below).  If a port cannot be 
	used because it is already in use by someone else, this value will
	be expanded repeatedly until it generates a port we can use.

	Whenever you use /dcc chat or /dcc send and use -p to bind a port,
	and that port is already in use, then /on dcc_lost will be thrown
		$0	The person you're sending it to
		$1	The dcc type (ie, send or chat)
		$2	The filename (url encoded)
		$3	The refnum of the dcc
		$4	The port that we tried to use that is in use.
		$5-	The literal string "PORT IN USE"
	It is expected that you will catch this hook and then do
		@dccctl(SET $4 WANT_PORT <new port>)
	and then the client will try the new port again.  If a port cannot
	be used because it is already in use by someone else, this hook will
	be thrown repeatedly until you set a port we can use, or you don't
	change the port

	In either case, if a port is in use, and neither the DEFAULT_PORT
	nor /ON DCC_LOST results in the WANT_PORT value being changed, then
	the dcc will be considered a failure, and it will be abandoned, 
	just as it has always been until this change.

*** News 05/15/2007 -- New dccctl() value, "WANT_PORT"
	You can now get and set the "WANT_PORT" value for a dcc, which 
	is the value that the -p flag sets.  You can therefore use this
	to change the -p flag for the user.  Because this value is only
	used at the time the client tries to bind() an inbound address,
	changing this value after the dcc has already been offered will
	have no effect: it is too late at that point to change the port.

*** News 05/15/2007 -- Normalization of the /SAY and /SEND commands
	The old behavior:
	- /SEND (the command used when you type text) sends a message to 
	       1) Current Query
	    or 2) Current Channel
	    or 3) Nowhere
	- /SAY (the "empty" command to overrule a query) sends a message to 
	       1) Current Channel
	    or 2) Nowhere
