EPIC5-1.1.6

*** News 07/31/2013 -- New action $LOGCTL(LAST_CREATED)
	The $logctl(LAST_CREATED) returns the log refnum of the most recent
	log that was created with /LOG NEW or $logctl(NEW).

*** News 07/31/2013 -- New action $LOGCTL(NEW)
	The $logctl(NEW) performs a /LOG NEW and returns the refnum of the
	newly created log.

*** News 07/31/2013 -- New /lastlog flag.
	/lastlog -regignore [regular-expression] avoids printing lines that
	would otherwise be printed without the regex.  Can be used in
	combination with -regex and -ignore and the other flags.

*** News 07/28/2013 -- $windowctl(REFNUMS_BY_PRIORITY) returns by current-ness
	The $windowctl(REFNUMS_BY_PRIORITY) operation returns all windows in
	the descending order that they have been the "current window". 

	This is based on your input screens -- if you have multiple windows 
	connected to multiple servers, this list doesn't care about that.  
	If you need that, iterate over the list and filter out the ones 
	for your server:

	fe ($windowctl(REFNUMS_BY_PRIORITY)) x { 
		if (windowctl(GET $x SERVER) == serverctl(FROM_SERVER)) {
			push results $x
		}
	};
	xecho -b Windows for this server in order of current-ness: $results


*** News 07/28/2013 -- FIXED-SKIPPED windows don't get channels on /window kill
	FIXED-SKIPPED windows (ie, /window fixed on skip on) are used to create
	status windows (see below).  They will no longer be given channels 
	from another window that is killed unless it is the last window 
	connected to the server.

*** News 01/09/2013 -- New /QUEUE flag, -RUNONE
	I can't believe I didn't think of this before!
	The /QUEUE -RUNONE flag will run the first command in a queue,
	leaving the rest of the queue alone.  This will work great with
	timer to create a FIFO queue that you can stagger commands through.
	For example, a command that slows down output to the server

		/TIMER -REPEAT -1 2 {QUEUE -RUNONE serverqueue}
		fe (#one #two #three #four) x {
			QUEUE serverqueue {join $x}
		}

EPIC5-1.1.5

*** News 11/28/2012 -- Lots of code quality improvements
	Ancient graciously set up epic to run under clang and its static
	analyzer, and we found lots of suggestions of things to fix.  

*** News 11/17/2012 -- New flag, /load -encoding
	You may now specify what a file's encoding is, and it will be
	converted automatically to utf8 (there will be a /set for this
	soon enough).  You can use this in your magic bootstrap:

	if (word(2 $loadinfo()) != [pf]) { load -pf -encoding iso-8859-1 $word(1 $loadinfo()); return; };

	This allows utf8 terminal users to load ascii art in 8859, and 
	it will Just Work!

EPIC5-1.1.4

*** News 8/5/2012 -- Anti-foot-shooting for $pad() and $repeat()
	Some had mentioned that you shouldn't be permitted to shoot yourself
	in the foot by asking for absurdly large output strings in $pad()
	and $repeat().  Normally I wouldn't agree to that, but I guess I'm
	getting soft in my old age....

*** News 8/5/2012 -- /xdebug no_color	- turn off all color unconditionally
	The experimental feature /xdebug no_color turns off color support
	at the lowest level of the client.  If you refresh your screen,
	any previously displayed color will be suppressed.  Turning off 
	this feature allows any color to be shown again.

*** News 8/5/2012 -- /LASTLOG -CONTEXT actually works correctly
	The /LASTLOG -CONTEXT feature shows you some lines before and after
	any lastlog match.  This has previously been broken and as of the
	time I write this, works properly, both normal and -REVERSE.

*** News 8/5/2012 -- /ON SET only thrown once when you type the exact name
	Previously, if you typed /SET <X> where <X> is the exact name of 
	any builtin SET, then /on set would be thrown twice.  That was never
	the intention, and this has been "fixed".

*** News 6/26/2012 -- Merge two windows together -- /WINDOW MERGE otherwin
	/WINDOW MERGE is like /WINDOW KILL except it moves everything from
	the current window to another window first.  This allows you to 
	"merge" two windows into one window.
	  * Window output
	  * Channels
	  * Logfiles
	  * Queries
	  * Timers
	If the current window can't be KILLed then everything will be moved
	away anyways, but you'll get an error message telling you that it
	can't be killed.  This isn't a bug.

*** News 6/26/2012 -- Expiring output -- /XECHO -E
	The /XECHO -E flag lets you create "expiring output" which will 
	disappear after however many number of seconds.
		/XECHO -E 10 This goes away in 10 seconds!
	This might be useful for status windows that you want to show new
	messages briefly.

*** News 6/24/2012 -- New $hookctl(CURRENT_IMPLIED_HOOK)
	When an implied /on hook is being expanded,
	$hookctl(CURRENT_IMPLIED_HOOK) is set to the name of that hook.

	I recommend wrapping this in an alias:
		alias ih {return $hookctl(CURRENT_IMPLIED_HOOK)
	Then you can use $ih() to get the hook.

	The use case is if you are using the same function for different
	implied hooks -- there was no way to tell the function which one
	it was working on.

*** News 6/24/2012 -- New $dccctl(SET refnum FULL_LINE_BUFFER [0|1])
	You can now set a dcc raw to "fully line buffered" mode.
	When this is turned on, /on dcc_raw will not trigger until
	a complete line is available.  You can turn this off by setting
	it to 0. 

	The corresponding $dccctl(GET refnum FULL_LINE_BUFFER) also works.

*** News 6/24/2012 -- New $dccctl(SET refnum PACKET_SIZE <bytes>)
	You can now set a dcc raw to "fully packet buffered" mode.
	When this is turned on, /on dcc_raw will not trigger until
	<bytes> bytes are available.  You can turn this off by setting
	it to 0. 

	The corresponding $dccctl(GET refnum PACKET_SIZE) also works.

*** News 06/24/2012 -- New option, /XEVAL -NOLOG 
	The -NOLOG option to /XEVAL suppresses logging for the command.
	The person who requested wanted to do something like this:
		alias ll { xeval -nolog {lastlog $*} }
	to be able to avoid logging /lastlog output.

*** News 06/24/2012 -- New option, /LASTLOG -IGNORE <pattern>
	The /LASTLOG -IGNORE <pattern> option allows you to display all of
	your lastlog EXCEPT whatever matches <pattern>.  In this way, it 
	acts as a reverse to the normal way.

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:

