EPIC5 Projects, Bugs, and other Errata:

KNOWN ERRATA (eg, bugs, or unresolved requests):
------------------------------------------------
[none]

LOOK FOR IN THE FUTURE
-----------------------
* Output rules
* Support for CNOTICE
* More gracious support for trickling horizontal resizes down to the window.
* /window <refnum> noserv causes bad fd loop.  (can't reproduce?)
* Is there some way to set what ^O resets to, a la mirc?
* /CTCPs over /DCCs don't match up with their queries very well.
* $xform()s for SED and DEF
* str_to_mask() should be silent, callers should be warning.
* Add /window indent, to overrule /set indent.
* A way to control what counts as a space on the fly (via a /set?)

[See http://www.epicsol.org/PROJECTS for things to come in the future]
[See http://www.epicsol.org/CHANGELOG5 for things that changed in the past]

THE CHANGELOG SINCE THE LAST RELEASE:
-------------------------------------
* Nix auto-append-of-$* feature (args_flag to expand_alias/parse_inline) HUZZAH!
* Fix provided scripts to add $* when necessary.
* Fix up Makefile, configure, et al, to use epic5/ directories.
* Make message_from() work from a queue; call pop_message_from() to GC
* Removed unused variables
* Add /xdebug message_from to watch the message_from queue at work.
* Nix save_message_from(), restore_message_from(), unneeded now.
* Remove /set beep_on_msg, a half-broken feature which can be scripted.
* Nix /set beep_when_away, a 1-line scriptable feature.
* Add new noise level %, (/ON %TYPE); like ^ but doesn't turn off display
* Use message_from() for setting all target/levels
* Nix set_lastlog_message_level(), have lastlog use who_level/who_from now
* Make message_from() use a queue to store old values
* Make everybody pop off their message_from() under pain of panic
* This ensures every output context can be safely interrupted!  HUZZAH!
* Unify the flood, ignore, and lastlog levels.
* *_FLOOD -> LEVEL_*, LOG_* -> LEVEL_*, IGNORE_* -> LEVEL_*
* Add KICK, QUIT, and MODE levels
* Nix #define DEFAULT_BEEP_ON_MSG and #define DEFAULT_BEEP_WHEN_AWAY
* Differentiate between a "mask" (bitmask) and a "level" (integer)
* Don't call them "lastlog levels" any more, they're just "levels"
* Create levels.h, which contain the definitions for all of the level stuff
* Create macro, _X(x) which converts a level name to a mask
* Create macro, _Y(x) which converts a level integer to a mask
* Nix beep_on_level global variable
* Create "Mask" struct which contains an integer to hide a "mask" behind.
* This prevents me from comparing a "mask" to a "level" by mistake.
* Convert many functions and variables to the "Mask" type
* Rename a bunch of functions and variables that use "mask" and not "level"
* Make KICKs, PARTs, QUITs, MODEs, et al use their new special levels!
* All levels now mean everything in every context!  HUZZAH! 
* Release EPIC5-0.0.1
* Make empty_string const.  Now we're cooking with gas! 
* Const correctness madness!
* Compile /ON patterns into regexes and use regexec() to parse them.
* Fix matching of /on type "*" to always have a weight of 1. (rb adm)
* Tack a ^ and $ onto regexes in pattern2regex().
* Flexible hooks need to have 'hook->regexpr' set to NULL to avoid segfault
* commit 1013:
* Use a "status" variable in server, instead of a plurality of binary flags
* Process usermodes as strings only.
* Nix 'flags', 'flags2' and 'umodes', 's_takes_arg', and 'eof'.
* Change update_user_mode() to take a server refnum.
* Nix $serverctl(... UMODES)
* Change server_is_registered() so it takes a server name and our nickname.
* Add server_is_unregistered() which i'll use in the future.
* Hook /on server_lost all the time in close_server() by popular request.
* Make $version() always return "2.8" since all servers are 2.8 servers.
* Check /set auto_rejoin_connect at disconnect-time, instead of connect-time.
* Use a "is_server_active()" function instead of "did_server_rejoin_channels"
* Move the guts of got_initial_version_28() into server_is_registered()
* Call "server_is_registered()" from 001, which loads ircrc among other things.
* Reduce 004 so it only sets the server's version string id.
* Nix got_initial_version_28
* Allow client_connect() to be nonblocking
* Allow Getaddrinfo() and Freeaddrinfo() to be called extern.
* Track writable sockets in 'global_max_fd' too.
* Keep a list of AI's for server addresses in the server code
* When server connection lost before registration, use the next AI
* Implement set_server_status(), which controls where server is in lifetime
* Nix reconnect(), which is replaced by close_server + set_server_status().
* Nix server_reconnects_to(), we no longer reconnect to servers.
* Make /xdebug server_connect the default for this commit at least
* Call window_check_servers() every time through io(), because...
* Make window_check_servers() look for disconnected servers and restart them.
* Add add_mode_to_str() which adds a channel or usermode to a string (sorted)
* Make usermodes use add_mode_to_str()
* Make channel modes use add_mode_to_str()
* Now modes are not stored in bitmasks, not hard-coded at compile time. HUZZAH!
* Nix "inactive" field in channels, channels are thrown away at disconnect
* Don't allow channels to move between servers, natch.
* Nix all the code to handle disconnected channels and such.
* Use change_window_server() to move windows to new servers, because...
* Make window_check_servers() auto-close windowless servers.
* Make change_window_server(<server>, NOSERV) cause a disconnect from <server>
* Don't honor /set auto_reconnect, we don't ever reconnect.
* Fix printf() error in /on kick default output
* Add new server state, SERVER_RECONNECT which means "i can be connected"
* So now SERVER_CLOSED means "don't reconnect me"
* Allow /server, /window server, and /reconnect to change CLOSED -> RECONNECT
* Make server connections nonblocking.
* Server connections are now nonrecursive, nonblocking, multi-protocol. HUZZAH!
* GC a bunch of server code dealing with reconnection we don't use now.
* Don't call window_check_servers() other than io() for sanity reasons.
* Make /window server just change server, let w_c_s() bootstrap connection
* Remove many window->channel->server sanity checks.
* Backslash a bunch of regular pattern chars that are metachars in regexes
* Nix note support
* Revamp notice.c for its eventual assimiliation into parse.c
* Assimilate notice.c into parse.c.  *poof*
* Fix some compiler issues and so forth
* Nix the NOTE level.
* Move load_ircrc() to irc.c, nix "startup_file" global var.
* Always change server state using set_server_status(), because...
* Add /ON SERVER_STATUS, $0 is refnum, $1 is old state, $2 is new state
* Delete /on widelist, no longer used
* Prototype mode string manipulation functions
* Reorganize names.h to reflect new realities
* Prototype (Get|Free)addrinfo() now that server.c uses them.
* Nix /window bind, rebind, unbound; $windowctl(* BIND_CHANNEL *)
* Be careful what modes we add to modestr in update_channel_mode.
* GC some old epic4 macros which we don't use
* Fix a typo that b0rked /on server_status
* Force output for a server connection to go to its connected window.
* Make /server reset server's status, so it can be reconnected to.
* Make /reconnect work on servers that are not already open.
* Don't just cavalierly change window's servers.
* Prefer close_server(i, NULL); over change_window_server(i, NOSERV);
* Allow windows to stay connected to closed servers.
* Nix window's "old server", now they're unnecessary.  HUZZAH!
* Mop up channel stuff that coped with window-old-server.
* Break backwards compatability and make /window +<server> reconnect to ser.
* Break backwards compatability and make /window -<server> disconnect from serv
* Hide a bunch more debugging output behind /xdebug server_connect
* Refactor change_window_server().
* Make /window discon the same as /window noserv, total disconnection.
* Don't do anything on 465 (YOUREBANNEDCREEP) -- this will be scripted
* Totaly refactor /SERVER -- documentation of course yet to come!
* Make new_open[_for_write] take a callback function, stash it in io_rec.
* Add handle_filedescs() which takes select() results and calls callbacks
* Make io() call handle_filedescs() instead of the four callback functions.
* This is the first stage of an extendable callback event looper!  huzzah!
* Fix io() to call do_server(-1) to do ssl timeouts. bleh.
* Hide new_select() behind wait_select(), which will hold the result fd_set's
* Don't make do_filedesc() take fd_set's, but rather get them from wait_select.
* Be cautious and when redrawing one screen, redraw all screens.
* Refactor io() some more; no explicit dependancy on select() now
* Refactor io(), optimize placement of some of the post-select operations.
* When wserv changes size, recalculate windows, and allow io() to redraw it.
* Fix typo in do_server() that caused a blocking read. doh! (rb adm)
* Abstract fd handling in newio.[ch] through #defines
* Add fd handling with freebsd's kqueue().  Huzzah! (not turned on by default)
* Refactor how dgets() works with incomplete SSL reads, slurp up everything
* Nix the bletcherous do_server(-1) hack in io().
* Fix a few more bogons in do_server().
* Abstract the reading function out of dgets() via an argument
* Add unix_read(), the default reader for dgets()
* Add ssl_reader(), a dgets-like reader for SSL connections
* Add server_ssl_reader(), a dgets reader for servers using SSL.
* I probably broke SSL servers by doing this -- report bugs please!
* Import epic4 commits 674 through 692, inclusive.
* Import epic4 commits 693 through 710, inclusive (epic4-2.0 final)
* Change _X and _Y macros to LEVEL and LEVELMASK for linux (sigh)
* Add a searchbuf() 8 bit clean byte-finder for future use.
* Convert flood checking, ignore checking, lastlog, logfiles to int masks.
* Convert message_from to int masks.
* Undo that lame damage -- convert all level handling to "signal-like"
* Each level is individual, and masks are stored in types like (sigset_t).
* Comparing one mask against each other requires O(N^2) operation. bummer.
* But now levels are officially stored in opaque data type!
* And that data type is not limited to 32 bits! HUZZAH!
* Add 6 new lastlog levels (USER5-USER10) to celebrate.
* Reduce the size of level masks to 1 byte, to save cpu.
* Add turn_on_level() and turn_off_level(), for reasons that escape me.
* Nix the /help command, make howl's scripted replacement the default.
* Add $cofilter() entry so you can use it (it was already written)
* Make dcc connections ($connect, /dcc get, /dcc chat) nonblocking
* /DCC RESUME is totaly broken by this.  Will fix later, maybe ;-)
* Add $startupfile(), which returns the epicrc/ircrc file that was loaded
* Offer unknown ctcp requests through /on ctcp_request before /on ctcp.
* Fix /DCC RESUME so it works with nonblocking connects.
* GC all of the blocking connect code.  EPIC is fully nonblocking connect!
* Make sure that servers go through SERVER_EOF state on eof!
* Track waiting/pending channels using a nicklist per window.
* Nix $winbound() and all the other stuff relating to bound channels
* Fix bug with binding/initializing the 255 key
* Fix bug with TOGGLE_STOP_SCREEN keybinding.
* Revamp /window describe so it includes a lot more useful info.
* Wrap send_ctcp in message_from()s to send to the right window.
* Add /xecho -f, which suppersses widnow notify events (%F)
* Move Lastlog definition to lastlog.c, leave stub behind for window.h
* Add window_all_channels(), return all windows for channel from names.c
* Change boolean vartype for windows and status: int -> short.
* Add do_short_boolean(), like do_boolean(), but it takes a short.
* Make the default server quit message "Leaving"
* Have /window describe show all the channels in a window.
* Have /window describe show nicks, channels in flat list, not one per line.
* Make sure to use the server's default quit message when closing it.
* Create a prototype of atoll() for compat systems.
* If a /set indent line would indent > 1/3 of the screen, indent to 1/3, not 0.
* Add a counter to WNickList, for tracking queries
* Each window gets a "current query counter", to find it's current query.
* Adding nicks with /window add <A> gives them query counters of 0
* Adding nicks with /window query <A> gives them next higher query counter.
* Removing query with /window query, still removes <A> from nick list!
* New binding "SWITCH_QUERY" to switch between queries, duh!
* Nix "query_list" in Window, totaly dynamic now, huzzah!
* Fix places using "query_list" to use "get_equery_by_refnum()"
* Refactor add_to_screen(). wheee!
* Change "Update %H on status bar..." to "Update %B on status bar..."
* So $windowctl(... QUERY_NICK ...) returns empty string now.
* Split (Window)->miscflags into "notify_when_hidden" and "notified"
* Add $windowctl(... NOTIFY ...) and $windowctl(... NOTIFIED ...)
* Change $windowctl(GET <refnum> MISCFLAGS) to always return 0.
* Make /window notify and /window notified take ON|OFF|TOGGLE.
* New function, $strtol(<base> <num>), convert <num> in base <base> to base 10.
* New function, $tobase(<base> <num>), convert <num> in base 10 to base <base>.
* GC a bunch of unused code, unused files, that kind of stuff.
* Make all of the level names plural, it's more forgiving that way.
* Release EPIC5-0.0.2
* Fix /window channel.  Ooops!
* Add a timer list dump for when a polling loop is detected.
* Prefer timers over i/o to avoid the polling loop bug. ick.
* Move some defines from comands.h to where they belong
* Add and remove func decls in header files as necessary.
* Add /wait =<fd> which returns when a nonblocking dcc connection finishes
* Make all keybinding funcs/decls use the BUILT_IN_KEYBINDING macro.
* Make the BUILT_IN_KEYBINDING macro use unsigned chars.
* Hide (struct Key) inside keys.c, and use (void *) to hold state.
* Make the input line use (unsigned char), not (char), huzzah!
* Make the "othername" ($3 in /on dcc_raw "E") the port number.
* Avoid a NULL deref with "parse_command" keybinding.
* Add $regcomp_cs() for black, case sensitive regex matching.
* Fix (maybe?) a NULL deref with prepare_display() that hsoc tripped across.
* Revert all the regex stuff for /on's -- the idea needs a lot more thoguht.
* Create one unified "hook" table for numerics and named hooks
* Nuke "numeric lists" as separate beast in hook.c
* Refactor code to only worry about one hook table. 
* Refactor do_hook() to re-start at start of list every time /on runs
* This makes it 100% safe to edit/delete /on's from within /on's, HUZZAH!
* Revert /on type ^"pattern" to epic4 behavior (suppressive action)
* Add /on type !"pattern" to act like ircII's /on type ^"pattern" (exceptive)
* Add /window kill_all_others for rain.
* Add /set old_server_lastlog_level, for when you merge windows to servers.
* Add %{2}W status expando for black, shows /set status_window in all windows.
* Fix a bug with hook pattern counting found by hsoc and adm.
* Update to newest help script from howl
* Add a "slowcat" script I wrote for larne.
* Add $serverctl(GET * STATUS) for ce.
* Fix typo with $logctl(REFNUM <x>), rb Zlonix
* Split alias item to hold commands and variables separately
* Nix COMMAND_COMPLETION keybinding.  Script replacement forthcoming.
* Nix "Use your nickname as alias for /me" feature.
* Nix automatic command completion (ie, /whoi no longer expands to /whois)
* Work towards not using 'command' var in builtin commands.
* This will allow me to get rid of 'server_func' in builtin command data type
* Nix the 'flags' var in builtin command data type.
* Nix the 'serv_command' var in builtin command data type.
* Create 'init_builtin_commands' to run at startup, add commands to alias
* Shimmy find_cmd_alias to ignore built in commands for now.  Not for long!
* So built in commands should be hung off of aliases now.
* Create 'builtins' script that aliases some previously builtin commands.
* Load this script from global.  Don't forget to alarm users.
* Fix up parse_command() to get aliases and built in commands from aliases.
* This unifies commands and alias name spaces. HUZZAH!
* Optimize some stuff now that I've finished this.
* Unify the built in functions with the command/alias list. HUZZAH!
* Begin massive refactorization of alias.c, redefining "Alias" as "Symbol"
* Refactor parse_line() with a bunch of front end call_* functions.
* And a general parse_line() front end, "runcmds()".
* Roll builtin expandos in with the user variables
* Roll variables and commands together into one name space. HUZZAH!
* Nix the caches for the global name space, for now.
* I definitely broke /stack alias|assign here.  I'll fix it later.
* Inline expandos are now officially strings instead of a single char.
* Fix bug with $unshift() that popped up.
* Move after_expando() to ircaux.c.  I think it belongs there more.
* Fix double-free of command alias arglists. rb adm.
* Add a "saved" list item off of the Symbol type to store /stack'ed stuff.
* Implement stack push|pop|list for all 6 symbol types.
* Nix the "line/global" tracking for symbols
* Rename "filename" tracking for symbols to "package"
* Create clone_arglist() to clone an arglist, duh.
* Change "user_variable_stub" symbol field to be an integer
* Stash the stubbed filename in "user_variable" if stub is set.
* Make stripcrap(ALL) exclude "ALL_OFF", so I can...
* Fix bug with $stripcrap(ALL,-BOLD ^B^B^Btest). (rb BlackJac)
* Make the #define Char const char thing global to all of epic now.
* Whack /set scroll.
* Create a "/set data" type (VARIABLE) which is union of (int) and (char *).
* Expose VARIABLE and variable types in vars.h for others to use.
* Break init of /set's into two parts, one to malloc() the set data
* The second part is to init the default values once command line is done.
* Fix some warnings from --with-warns
* Fix all /set callbacks to accept a (void *)(VARIABLE *) variable
* /Set callbacks can now directly modify the /set via that variable!
* So don't allow direct setting of /set's from outside vars.c.
* Everybody must use set_var_value() which is the backend to /set.
* Whack the /IRCNAME and /REALNAME variable -- use /SET REALNAME, eh!
* Hack up /xecho -x to bide my time until i whack all those /sets it uses.
* Don't call set_input_prompt() in main() any more, it's handled elsewhere.
* Whack /set logfile callback, since nobody seems to have missed it.
* Whack the "number" (float) data in /set since i wasn't gonna use it.
* Whack the "GLOBAL/CHANGED" tracking in /set's.  Tell me if you miss this.
* Unify output of /set values as "[New|Current] value of <var> is <val>"
* Don't limit the size of /set continued_line, this will be revisited soon.
* Quick and dirty hack to work around adm's bug, will fix this later.
* Fix bogon in make_string_var().
* Fix bogon with /set variables not being initialized early enough.
* Add the rest of funcs to do builtin var support in unified symbol table.
* Change the unified data type for builtin funcs to (IrcVariable *).
* Implement "buckets", for O(N) scans of the unified symbol table.
* Change DEFAULT_USERINFO to DEFAULT_USER_INFORMATION to match the /set.
* Make the *_VAR stuff in vars.h 'int's.
* Change USER_INFO_VAR to USER_INFORMATION_VAR to match the /set.
* Change CLIENTINFO_VAR to CLIENT_INFORMATION_VAR to match the /set.
* Change STATUS_NICK_VAR to STATUS_NICKNAME_VAR to match the set.
* Put the defn of (struct IrcVariable) in vars.h, to expose to unified table.
* Convert all uses of now defunct (enum VAR_TYPES) to (int)
* Create "make_string_var_bydata", converts (IrcVariable *) to malloc string
* Change get_var_alias() to return (IrcVariable *)
* In that function that outputs set values, use make_string_var_bydata().
* Change hardcoded *_VAR uses into pointers to *_VAR, for deref at runtime.
* Major revamp of vars.c, to wholly create built in vars at runtime.
* Built in variables are stored in unified symbol table and vars.c xref array.
* *_VAR values now point through xref array to the actual variable data.
* Nix the now unnecessary get_variable_index().
* Add create_user_set(), backend for /SET -CREATE
* Add /SET -CREATE <name> <type> [{<code>}]
* Need to go back and implement the {<code>} thing.
* Revamp how /set works, using buckets, to implement auto-completion.
* $getsets() is not implemented yet, do that too. 
* When looking up $<setname>, use the unified symbol table. HUZZAH!
* Refactor IrcVariable to not depend on having the varname.
* This will lead to multiple hard links to the same /set value in the future.
* Nix the 'name' and 'hash' values in IrcVariable, no longer needed.
* Make all uses of "realname" use the /set realname variable (rb adm)
* Nix the global "realname" variable, use /set realname for all.
* Fix bug with free_bucket()
* Fix compile warnings in vars.c
* Store built in variable xref table in a bucket.
* When changing a user-created /set, start calling the user's scriptback
* Allow the user's scriptback to call /set to override the user's value.
* Tell the user that they created a new /set.
* Support +I from ratbox, for adm.
* Make $getsets() work again.
* Fix alloca() warning for freebsd-current
* Fix warnings about static variables not used
* Fix /set notify_level, which is supposed to cascade to /window notify_level
* Fix /set lastlog_level, same thing.
* Implement /window notify_name for %{1}F, for howl (irssi-like status notify)
* Add support for ircnet's "unique id" nicknames from epic4
* Fix $winline() from epic4.
* Fix /who -d[iagnose] from epic4.
* Remove limits on timer refnames.
* Add $mktime() from howl.
* Nix /save and pray nobody notices.
* Implement pmatch_* stuff in alias.c to use the unified symbol table.
* Commands, functions, and expandos now 100% integrated.  HUZZAH!
* Reimplement $get(set|command|function)s() to use the pmatch_* stuff.
* So they now pick up changes at runtime. HUZZAH!
* Allow built in /set to be conditionally added to the "set bucket"
* Don't put user-created /set's in the bucket
* Allow user to replace one user-created /sets but not builtin sets.
* Allow mangling of ALT_CHAR -- how did this ever get missed?
* Fix $currchans() so it works the way the documentation says it does.
* Fix some const correctness issues, introduce others. bleh.
* Fix typo that caused /set -create twice to crash and burn.
* Fix memory leak, rb CE.
* Fix $getset() which is supposed to be case insensitive (typo), rb Xavier
* Make the work buffer for %F and %{1}F much bigger (2k, was 80 bytes)
* Avoid NULL deref on brok^H^H^H^Hempty numeric replies
* Fix aliasctl(): values returned by pmatch_* are not to be freed. (rb ce)
* Better handling of damaged /who x,y responses from some servers.
* Make $function() call builtin, and $:function() call alias
* I need to make sure to add an /xdebug to make $function() call alias!
* Nix calls to dcc_connected(<fd>, 0) which were always bogus.
* Create print_arglist() for printing alias arglists, natch.
* Fix crash from /queue -del <name> <num> for <num> = <items> + 1 (rb black)
* Show arglist when creating and listing aliases.
* Fix memory leaks of buckets when user grabs /on set.
* Add a "alternate names" bucket to server data.
* Create a whole new api for querying and creating server refnums.
* Fix crash with /dump on (/dump all)
* Add $serverctl(GET|SET <refnum> ALTNAME) get and set server alternate desigs
* Add $serverctl(GET|SET <refnum> ALTNAMES) get and set entire list.
* Fix memory leak with /on set
* Fix memory leak with /timer
* Fix $server*() functions, when passed no arguments.
* Add /msg -<server>/<target> thingee, i really need to document this.
* Add /window toplines <N>, reserve N lines as nonscrollable on top of window
* Add /window topline <N> "<str>" change the Nth topline to <str>
* You can have 1 to 9 toplines.
* Don't allow /window toplines to be a negative number!
* Fix dcc compile error with --without-ipv6
* Add $windowctl(GET ref TOPLINE num) and $windowctl(GET ref TOPLINES)
* Revert changes to 1.59 of alias.c, which leaked accidentally.
* Add -L and -S command line options (ce)
* Reset "from_server" after every window operation
* If /window doesn't change current_window, revert from_server to orig value
* If /window changes current_window, reset from_server to cur_win->serv;
* Altered the dcc_lost hook to return strerr() info.
* Fixed $aliasctl(* match [mask]) to return only aliases and assigns.
* Add %{3}W which is like %W but it's active for all input windows.
* Support efnet's +e and +I numeric replies.
* Add a bunch of stuff to debug the who_queue to find and fix adm's bug.
* Remove a debugging line i forgot about.
* Fix memory leak with remove_from_comma_list().
* Add $winquery(), written by howl
* Add $hookctl(), written by howl, who needs to write an UPDATES entry.
* Rolled /disconnect and /reconnect into the same code.
* This allows /reconnect to use an optional servernum argument.
* Changed "/server -a" to leave the new or selected server as the current
  server, which is the historical behaviour.
* The server_established hook is now thrown in the context of that server.
* Fixed a missing comma bug in remove_from_comma_list().
* Fix ALL/ALL_OFF thing from epic4.
* Fix $logctl() from epic4.
* Fix bug with % followed by \ in wildcard patterns from epic4.
* Fix a compile error when doing password protection (bug 12) (from epic4)
* When creating the 'epic' symlink, use a relative path for jm. (bug 9) (epic4)
* Allow package to be set when overwriting existing alias with no package.
* Add arglists to hooks (by howl, who I will pester to document this). Woot!
* Finish $hookctl(), by howl.
* After connect()ing to a server, save the remote peername
* This fixes $serverctl(GET <num> PORT)
* This also fixes $servports(), which should work as (not) documented.
* Fix for notify_signon default handler, from larne. thanks!
* Add $serverctl(GET <num> ADDRFAMILY), returns "ipv4", "ipv6" or "unix"
* Allow /hostname <ipv4>/<ipv6>, separately set v4/v6 vhosts! (see UPDATES)
* Don't always panic if a fd isn't ready, it might have been new_close()d.
* New internal function set_mask_by_winref() allows changing window's level.
* Make /xdebug regex_debug outputs privileged yell()s, just for sanity.
* Change /set new_server_lastlog_level to take effect on 001 (see UPDATES)
* Refactor window_check_servers() to work with server's current window only.
* Roll forward all the rest of changes from epic4 (i think)
* Add /ON NEW_NICKNAME, when epic needs a new nickname from you.
* Run 'make depend', fix compile errors, fix 'environment' script
* Fix bug that brought up all servers at once.
* Fix /window topline so it doesn't chop/wrap-off last word.
* Fix misleading error message if /exec -direct fails.
* Add $logctl(CURRENT), refnum of the current logfile, -1 if none.
* Hide ArgListT in alias.h to only those who need it, to save numbers.c
* Fix up a lot of compile warnings all over the place.
* Some changes to $hookctl() might need feedback from howl...
* Fix vhost support so we can do inbound sockets again.
* Fix add_to_screen() so /query nick catches /dcc chat nick. (rb adm)
* Fix /away -all which sends a bogus string to the server. (rb rain)
* Fix /dump. doh.
* Add $symbolctl().  See UPDATES.
* Fix auto-completion bogosity with $symbolctl().
* Release epic5-0.0.3
* Add %{3}S, showing the server's group instead of its name.
* Fix compile bugs for non-ipv6 users with the dual-vhost stuff.
* Fix null deref with /window flush when not in hold mode.
* Fix $symbolctl(pmatch <incorrect> *) crash
* Auto-create server's first altname, make %S and %{1}S use it.
* Don't add mode types 2, 3, or 4 (takes-args) to the channel mode string.
* This makes ircnet's +R not show up on the status bar.
* Fix /dmsg =<ircnet-numeric-nick>, for Q.
* Add $serverctl(GET <refnum> PROTOCOL), returns IRC or IRC-SSL
* Fix /dmsg =<numeric> again, fix compiler warnings.
* Whack dgets() into submission regarding incomplete unbuffered lines.
* Revamp how partial lines from an /exec process are handled.
* Major refactoring of newio system:
* Change main io() look into a "fill" cycle and a "drain" cycle, using buffers
* Change new_open() to take an io policy to perform when fd is "ready"
* Use token to determine if an fd is "dirty" or "clean" (is data ready?)
* Process accept()s through newio/dgets.
* Merge nonblocking connects as just another type of new_open() policy.
* Nonblocking connects emit sockaddr info when connected for dgets().
* Change dgets() to not perform io, but just drain from the buffer
* Now all data goes through dgets()! huzzah!
* Nuke kqueue support for the moment (will come back later)
* Hide the "holding" status of a fd inside the IO metadata.
* This allows me to support "holding" in other IO models.
* Major refactoring of ssl support:
* Move all meta-data about ssl in ssl.c in a linked list
* As much as possible, have server treat the ssl case as "normal"
* Implement all ssl interfaces even in non-ssl case, guard with panics
* Null-terminate after a read, just for laughs and giggles.
* Add a dgets_buffer() to inject data into dgets() system.
* Fix up dgets() so it has read() like semantics.
* Fix up dgets() callers to use it like a read() type function.
* Turn off /xdebug server_connected hardcoded at startup for now.
* Fix up unix_* io functions to use dgets_buffer().
* Fix do_filedesc() to repeatedly call callback until buffer is clean
* Move set_socket_options() to network.c, make do_filedesc() global func
* No longer null terminate the read()s, unnecessary now.
* Fix pattern matching of "\<char>%" so [H*] is matched by [%\*%].
* Refactor $sar() and $msar() so they share as much code as possible.
* Refactor newio, support select/kqueue/poll (#define's in newio.h)
* ... Getting closer to not needing select!
* Fix SSL.
* Fix a bunch of misc compiler warnings
* Remove restrictions on /QUOTE, so there!
* Add pthread support to newio for larne. HUZZAH!
* I'm sure a zillion things are broken, so it's time to test!
* Remove a panic that broke /wait.
* Fix uninitialized variables in msar/sar.
* Fix $sar() and $msar() so they don't infinitely substitute without buonds.
* Fix more bugs, yay!
* Fix SSL server connections.
* Fix bugs with /exec, INET6.
* Fix /window <refnum> scroll_backwards/forwards.
* Try to auto-detect select(2) failures.
* Fix the second lamest bug ever. DO NOT DO CONTNIUE WITHIN WHILE (0) DUMMY.
* Fix accept() with pthreads.  Nonblocking + pthreads == Bad.
* Throw away all unused addrs when we are registered, to ensure no reconnects.
* Comment out a bunch of oper-only stuff in 2.8script which opers seem to hate.
* Implement a proper built in /INVITE command.  See UPDATES
* Revert 2.8script change.
* Add "subpackage" command, which i'll document later.
* Package up 'global', and '2.8script' and 'basical' so they can be /unload'ed.
* Don't load "global" if user has their own startup script.
* Don't load "global" if the -q option is set, either.
* Thus, the "global" script acts as a default "epicrc" for those without one.
* THIS IS BACKWARDS INCOMPATABLE.  SEE UPDATES FOR IMPORTANT INFORMATION.
* Nix the "loading_global" variable, only used by hooks.
* Fix /on 005 so it shows the /on 005's and not all numeric hooks.
* If Accept() fails, tell the user straight-way so I can debug this.
* Fix /window name - so it redraws the status bar.
* Refactor the error stuff by eliminating my_strerror() and dgets_errno.
* Error messages are now delivered on multiple levels as info is available.
* This may get annoying, but it's a lot more accurate now!
* Change inet_* functions to return int's since their retval is unused.
* Add a new internal "syserr()" function that generates formatted errors.
* Syserr's look like say()s but they act like yell()s. (can hook with /on yell)
* Keep an counter in the server stuff so we can count off as addrs are used.
* So the error message in /ON DCC_LOST is always just "ERROR" now.
* Fix various compiler warnings and stuff.
* Add $hookctl(GET HOOK <ref> STRING), return /load'able format of ON
* Fix some debugging outbound in switch_hostname(), doh!
* Roll set_socket_options() into a new Socket() function.
* Roll connections to AF_UNIX sockets into the mainline stuff.
* Roll nonblocking/connect/nonblocking into Connect().
* Add AF_UNIX support to Getnameinfo() to remove annoying errors.
* When doing recovery from EBADF in select, only check fd's we're using
* Just puke if configured for kqueue() and kqueue() fails.
* Don't puke on default 353 output if the userlist arg is missing. (for ratbox)
* Permit doing /window name to change case of window's name.
* Fix more compiler warnings.
* Fix accept() with pthreads.
* When accept()ing with pthreads, can the new conn really be nonblocking?
* Add --with-multiplex=[select|poll|freebsd-kqueue|pthread] to configure
* Check thread-safety of SSL in configure when using pthreads.
* Don't unconditionally skip leading :'s in symbol names.
* When calling functions, handle skipping leading :'s specially.
* Add support for pthread locking for ssl to ssl.c
* Add %{2}+ and %{3}+ status expandos that only show the mode string.
* Use AI_ADDRCONFIG flag to tell getaddrinfo() we only want addrs we can use.
* Fix SSL with pthreads -- need to establish SSL before calling SSL_read!
* Fix compiling with kqueue, call it --with-multiplex=freebsd-kqueue
* Hide SSL capability behind "client_ssl_enabled()", nix all #ifdef HAVE_SSL
* Fix up the configure script so ./configure --help lines up all nice.
* Don't emit spurious warnings when user hits control-c
* Don't try to figure out disconnected server's port from sockaddr, duh!
* Prefer timers over i/o to prevent polling loop panics.
* Check return value of uzfopen() before checking the stat field.
* Fix compile error for #define UNAME_HACK
* Fix crash when you do $open(/file/doesnt/exist R)
* Add an /on 338 default handler.
* Fix integer underflow with log file refnums
* Rename STATUS_USER0 to STATUS_USER for backwards compat. oops!
* Whack BRACE_LOAD_HACK, it's been unsupported for a while.  PF loader rules!
* Don't allow /botmode if #define NO_BOTS
* Fix DCC connections instantly "timing out"? (Check on this)
* Whack FLOATING_POINT_SUPPORT and depend only on /set floating_point_math
* Add $hookctl(SET LIST <type> IMPLIED <string>) though it's off by default.
* If you do turn it on, it shows up as 'h' in $info(o)
* Sort logfiles by refnum, so new refnums always go at the end of the list.
* Fix up 338 again, oops!
* Keep timestamps along with lastlog entries.
* Add $line(<num> -TIME), return the timestamp when <num> was added to lastlog.
* Remove some #define's from config.h that are not referenced any longer.
* Remove #define QUIT_ON_OPERATOR_KILL because 1 line of script defeats it.
* Add some debugging stuff, try to trap lost dcc filedescs.
* Release EPIC5-0.0.4 (Scurrilous)
* Make /xecho -v output to current window if it's visible.
* Permit status updates right away, instead of after first connection.
* If /input is done in hidden window, switch to the main window.
* Make arglists look a little less odd for fudd.
* Change "ERROR --" to "INFO --" to not alarm people as much.
* Change a few other warnings to not be so alarming.
* Change new_realloc() to not move ptr if it is big enough to hold new size.
* Fix all the status_* sub-formats to not have any hardcoded size limits.
* Fixes from darwin that they "forgot" to submit upstream.
* Fix file descriptor leak, alerted by ce.
* Add Blackjac's 'history' script.  Into the Abyss!
* Comment out all of the history code.  It compiles.  Will GC it later.
* Round one of blackjac's 'builtins' script.
* Comment out a ton of now-scripted sets.  Will GC it later.
* Take a new arg to new_open() to control whether INFO -- errors are output.
* Don't output the "INFO --" things for dcc or execs
* Fix how i nixed /set reverse_status_bar, i totaly botched this.
* Ok.  I botched /set full_status_line too.
* OK.  I really botched /set show_channel_names.  Ugh. not my day!
* OK! OK! OK!  So i commited the wrong builtins script. argh!
* Ach.  Better not to know.
* Check for arc4random() in configure, don't use compat.c version if possible.
* GC "fill_it_out" code which has been deactive for a while.
* Fix translation casting error for zlonix
* Allow current_package() to return NULL, handle that as special case.
* Refactor the startup loading stuff
* Move a couple of loads out of basical and into global.
* Round two of blackjac's builtins script.
* Cleanse 2.8script of stuff that has bitrotted to death.
* Whack the invite in 2.8script, the builtin is much smarter!
* Fix various things for fudd's loadformats script.
* Add $serverctl(LAST_SERVER) and $serverctl(FROM_SERVER) for blackjac.
* Comment out the round 2 $win*() functions.
* Make //ignore output less visually jarring (change a tab to a space)
* Permit /set -new_server_lastlog_level which won't change levels on /server
* Permit /set -old_server_lastlog_level which will just confuse epic. ;-)
* Add $windowctl(GET <win> DISPLAY_SIZE), same as $winsize()
* Add $windowctl(GET <win> SCREEN), same as $winscreen()
* Add $windowctl(GET <win> LINE <num>), same as $winline()
* Fix $servernick()
* Make /bind "compress" string, and bind and print it compressed.
* This fixes /bind'ing literal characters being displayed literally.
* Round 3 of blackjac's builtins script
* Round 1 of fudd's loadformats script.
* Fix some "all-the-world's-an-int" bugs reported by xlc (aix's compiler).
* New version of tabkey.ce from fudd.
* Comment out the round 3 $serv*() functions and other stuff.
* Another new version of tabkey.ce from fudd
* A new loadformats from fudd.
* Add $dccctl(UPDATES_STATUS [0|1]), returns old value
* Add $dccctl([SET|GET] <refnum> UPDATES_STATUS [0|1]).
* Allow /on ^dcc_activity * # to suppress status bar redrawing.
* Another altchan.bj from black.
* Auto-delete sequences if you delete the keybinding they're bound to.
* Fix bogon in the dcc update-status stuff for fudd.
* Release EPIC5-0.0.5 (Indifference)
* More builtins goodness from blackjac. (Round 4)
* Re-fix bogon in the dcc update-status stuff for fudd (again)
* Make /xdebug new_math the default, you can /xdebug old_math to go back.
* Make /xdebug new_math and /xdebug -new_math no-ops.
* Don't do %#p in printf formats, since it has no effect. (%p is better).
* Comment out $[r]igmask(), $[r]igtype(), round 4 functions.
* Comment out /set -create as has been threatened for months.
* Change /on leave to /on part.
* Only ever do one io event per call through select() or poll()
* Do put_echo() and not add_to_screen() in /window echo so it can be logged
* GC functions and sets from 'builtins'
* GC history.c and history.h, huzzah!
* Add $serverctl(GET * LOCALPORT) (fudd)
* Add larne's support for solaris ports, which i modified a bit, so blame me!
* Fix $windowctl(GET * QUERY_NICK)
* Don't do WHO on anonymous channels (channel mode +a) (for ircnet users)
* Don't set server's default nickname until we first try to connect.
* For ircnet users, after a /nick <unique-id>, the def nick should be "0".
* Even privileged_yell()s need to be run through normalize_string()!
* Implement $windowctl(SET <ref> TOPLINE <num> <stuff>)
* Reorganize how nickname changes are handled, before I refactor stuff.
* I stopped forcing client-side checking of nickname changes here.
* Add /window killable to allow you to make windows unkillable
* Nickname rejections are handled through /on new_nickname solely now.
* New builtins from blackjac.
* When changing EXPIRATION in $ignorectl(), set a new /timer.
* Some source cleanup, in prep for the logical-sized window support.
* Create "marshall_getaddrinfo" which musters getaddrinfo() into one block.
* New builtins, history from blackjac
* Don't object to mode changes with trailing spaces.
* New script, "newnick" from blackjac.
* Add marshalling functions for getaddrinfo()
* Use getaddrinfo marshalls + dgets to simulate nonblocking dns lookups.
* New newio io type, "NULL" which i'll probably whack later.
* _VERY_ preliminary support for nonblocking dns on server connects. 
* You should assume it's very buggy, and be patient and report bugs.
* Add support for single and double quoted strings in new math parser.
* Put all handling of /set quit_message et al in close_server().
* Fix /quit to pass unspecified quit message as NULL to irc_exit().
* Fix irc_exit() to handle unspec. quit message as NULL to close_all_serves()
* Fix close_all_servers() to not change quit message for NULL.
* This allows /quit to use (not override) each server's quit message!
* This also allows a single %s in /set quit_message to be honored everywhere!
* Fix up do_server() so anything that happens is wrapped in message_from()s.
* Show the server list for /window server instead of an error.
* By default, <hostname> as server, defaults to port 0
* By default, port 0 changes to irc_port (6667) for a new server
* This means any use of <hostname> in a server context picks up 1st <hostname>
* The -B command line option (load startup file before connect) is now default.
* Don't do LOCAL_COPY within an infinite loop, leads to stack exahustion.
* Support new signal, SIGUSR2 which throws "system_exception".
* Teach the block commands about "system_exception" so they can be stopped.
* Whack a bunch of unused timers from vars.c. (see UPDATES)
* Sync up config.h, vars.h, and vars.c with each other.
* Add "domains" to timers, server timers, window timer, general timers
* When timers go off, latch back to their domain
* Allow timers to self-cancel if their latched item has gone away
* Add /timer -general to set a general timer.
* Make /timer -win or /timer -serv set a window or serv timer especially.
* Ooops. I really botched that.  Make epic5 start again.
* Don't offer non-"TELLUSER" ctcps via /on ctcp_reply (ACTION/SED/UTC)
* Implement $windowctl(SET .. NOTIFY_NAME) for howl.
* Fix a few things with the dns helper.
* In /on type '<pattern>', Set $* so <pattern> can match against itself.
* Move 'addset', 'delset' from 'builtins' to its own script.
* Remove commented out obsolete stuff from 'functions' script.
* Pf-ify the 'help' script.
* Desupport a bunch of scripts.  See UPDATES.
* PF-ify all of the remaining scripts.
* Convert several scripts from /on set to /addset.
* When a window is resized, make sure scrollback is bigger than new size.
* Add multiple stricmp tables, "ascii" and "rfc1459"
* Make all string insensitive compares use "ascii"
* Add black's ornamentation on the addset script.
* Fix some regression scripts
* Fix pf bugs with various scripts.
* Add the [$func](args) capability to the new math parser.
* Add the === and !== literal equivalence (case sensitive) operators.
* Sort of set the case sensitive mapping to use in the 005 handler (hack!)
* Fix error recovery of ssl connections.
* Fix up how relative filenames are found with /load.  See UPDATES
* Add ascii_str[n]icmp and rfc1459_str[n]icmp for use with alists.
* Make nick+channel name lookups handled according to 005 CASEMAPPING!
* Begin the work of "normalizing" argument handling to /dcc commands.
* Convert some more dcc commands, making progress!
* Fix pf problems with tabkey.jm 
* Add "UNPRINTABLE" as a mangle type, remove all non-printable chars.
* Add /set old_math_parser, to turn on the old math parser (don't do this! :P)
* Whack /xdebug old_math
* Rename 'altchan.bj' to 'altchan'
* Add new server state, "ERROR" which triggers for non-recoverable socket errs.
* Try to give some trailing context for unmatched braces/bracket/parens.
* Fix bug in marshall_getaddrinfo. DOH!
* Add humanize_number() to compat.c, and fix compiler warnings.
* Change /exec -out to output to the current target, (*gulp*)
* Add /lastlog -mangle to permit you to match against mangled lines.
* Add per-window activity data, for weirdo and howl, see UPDATES
* Initialize activity_format and activity_data when creating window. doh!
* Fix /dcc get, and I probably should fix other things as well.
* Add a couple of new behaviors for /dcc get, see UPDATES
* Fix a bunch of compiler warnings.
* Release epic5-0.0.6 (Osculator)
* Fix "ALL" mangle level to not include "UNPRINTABLE"
* Fix /on 367 in 2.8script, from larne.
* Wrap output caused by /exec callbacks in message_from()s, for weirdo.
* Wrap scripted set callbacks in window_display = 0 to simulate /on ^set.
* Add /window flush_scrollback, see UPDATES
* Fix braino that caused /set's in your ircrc to be echoed.
* Add configure glop to figure out intmax_t on c90 systems.
* Use "intmax_t" for dcc byte counts, eliminate notion of "packets".
* Use INTMAX_FORMAT to format intmax_t's in printf formats.
* Change %D status bar expando to look like "0.1Kb of 2.3Mb" (no packets)
* Choke on dcc send offers that don't have file sizes.
* Make a feeble attempt to handle 32-bit rollover on dcc get's > 2gb.
* Use "intmax_t" for the new math parser, 64 bit int's ahoy!
* Use INTMAX_FORMAT to format intmax_t's in new math parser.
* Fix bug with comma operator in new math parser that crazyeddy found.
* Whack support for 7 bit terminals (8 bit support is now assumed)
* Whack support for /set eight_bit_characters
* Whack support for /set beep_max, tab, tab_max, and nd_space_max
* A new $mask() from jm, who needs to write an UPDATES entry for me. =)
* Split handling of ESC seqs out of normalize_string() into skip_esc_seq().
* Remove some now unused xdebugs, fix compile warnings.
* Fix $stripc() to be a clone of $stripcrap(), just to strip colors
* Nix the now unused strcpy_nocolorcodes().
* Fix up read_color_seq() to return an offset, not ptr, a la skip_ctl_c_seq().
* Fix mangle_line() to use read_color_seq instead of skip_ctl_c_seq
* Nix the now unused skip_ctl_c_seq(). Only one thing now reads ^C's! HUZZAH.
* Rename skip_esc_seq() to read_esc_seq() just because.
* Begin moving logic|display_attributes towards a change model system
* Begin a radical change on how characters are given "state" (see source)
* Basically 8 bit chars (except c1 chars) are treated as "always printable" now
* Mangle a few other callers to logic_attributes, i'm sure these are b0rked.
* Fix some bugs, naturally.
* Nix the (apparantly) unused normalize_never_xlate global variable.
* Add function comments to some stuff in screen.c (comments! the horor!)
* Move read_esc_seq so it's closer to read_color_seq.
* State 1 chars (C1 chars) are stripped unless /set allow_c1_chars
* State 6 chars (Control chars) are stripped unless TERM_CAN_GCHAR is set
* State 4 chars (Highlight chars) are handled singly
* Plus, ALL_OFF is not generated unless you do an ALL_OFF! HUZZAH!
* Nix the last vestiges of the unsupported ROM_CHAR feature.
* Nix some now unused function decls in screen.h
* Add new_normalize_line, which is a unified normalizer/mangler (*gulp*)
* Cut over $stripcrap() to use new_normalize_line (*double gulp*)
* Rename "ANSI" mangle type to "NORMALIZE", but still accept "ANSI"
* Nix the gxlate table, and change ^T from State 4 to State 6 character.
* Add support for dgets buffer type -2 (only return full buffers)
* Use buffer type -2 for reading nonblocking dns addrs, fixes probs on solaris.
* Fix alignment issues on sparc.  Thanks to crapple for his assistance!
* Convert the other users of mangle_line() to new_normalize_string (*gulp!*)
* Fix another 32-bit/64-bit cast problem with karll arrays (rb crapple)
* Include <stddef.h> if we can, for no particular reason...
* Nix now unused mangle_line(). yay!
* Use (intptr_t) instead of (intmax_t) to treat pointers as integers...
* Try to handle failures from the dns helpers with more grace.
* Add the idea of a "visible" and "invisible" lastlog entry
* Always skip "invisible" lastlog entries, handle them when trimming, etc.
* Rename remove_from_lastlog() to trim_lastlog() and have it do looping
* Unconditionally keep every item in the lastlog, even if it's "hidden".
* When screen changes width, purge+recreate all window's scrollback
* Add /window rebuild_scrollback to manually invoke this process.
* For now, auto-recreate unholds all, and cancels scrollback
* Add /window auto_scrollback to opt-out of auto-recreate feature
* Store each window's width individually, don't refer to server
* Use each window's personal width to re-break lines (more on this later)
* Fix so "/window lastlog foo" doesn't delete your lastlog!
* Change all the builtin functions to use new_normalize_string().
* Change the input prompt to use new_normalize_string().
* Add /set mangle_display. HUZZAH!
* Change the display stuff to new_normalize_string() and /set mangle_display
* Whack the now unused normalize_string(). HUZZAH! HUZZAH! HUZZAH!
* Change the seperator of the mangler-type-parser to be spaces and not commas.
* Start keeping a monotonically increasing refnum for all lastlog items
* Change add_to_lastlog() to return the lastlog refnum
* Change add_to[_window]_scrollback]() to take the lastlog refnum
* Cross-link scrollback items with the corresponding lastlog refnum.
* Save scrollback/hold position across scrollback rebuilds
* This means rebuilding doesn't affect scrollback/hold users! HUZZAH!
* Whack the now unnecessary /window auto_scrollback (mis)feature.
* Don't unconditionally unclear after rebuild, if everything still fits.
* Fix /xecho -x
* Remove /set alt_charset, blink_video, bold_video, color, display_ansi
* Remove /set display_pc_characters, inverse_video, underline_video. HUZZAH!
* Force \r (carriage return) to be type 5 char (never printable ever)
* Handle \f as a special case in new_normalize_string for the status bar.
* Do some re-org in screen.c, screen.h
* Roll window_disp() into its only caller, add_to_window().
* Change create_new_screen() into a void function
* Nix some func decls in windows.h that don't exist any more
* Add message_setall(), lets you save to_window on the message_from stack.
* Replace users of message_to() with message_setall().
* Replace direct users of to_window with message_setall(). yay!
* /XECHO got rewritten as part of this.  See UPDATES
* Fix various compiler warnings.
* Add a bsd licensed base64 encode/decode in compat.c
* Add $b64encode() and $b64decode().
* Make the new math parser not slurp up function param lists in lvalues
* Make function calling a full blown operator in the new math parser.
* Call remove_brackets() in call_function
* All this will permit $foo[bar](args) to work as well as ${foo[bar](args)}.
* Remove some unused global variables
* Permit function calls on rval in new math parser, by special request of ce.
* Fix /away -all so it doesn't error on gaps in server list (weirdo)
* Fix bogon in /xecho. doh.
* Fix /who -real so it matches both with and without the hopcount.
* Convert all uses of message_to() to message_setall(). yay!
* Permit alias_special_char() to slurp up function calls for new math. sigh.
* Add the 'highlight' script which implements the highlight-ignore thingee
* Whack the 'highlight ignore' feature as per discussion on the list.
* Add flush_all_symbols() which does a total cleanup of symbols at exit-time.
* Fix a few bugs
* Use flush_all_symbols() instead of /dump to catch memory leaks.
* Release epic5-0.0.7 (Disaffection)
* New file, levels.c, holds all the Mask and window level manip stuff.
* Move level_to_str/str_to_level, mask_to_str/str_to_mask to levels.c
* Change #define LEVEL_*'s into (int)s
* Use BIT_VALID() instead of NUMBER_OF_LEVELS, whack NUMBER_OF_LEVELS.
* Whack hardcoded level_types char array. yay!
* Change users of "LEVEL_CURRENT" into "LEVEL_NONE" and whack "LEVEL_CURRENT"
* Add "OTHER" window level, as replacement for "CRAP"
* Continue to honor "CRAP" as a synonym for "OTHER".
* New function $levelctl(), to add/query window levels.
* Window/lastlog levels can now be added at runtime. HUZZAH!
* I forgot that the level names are supposed to be plural (as per UPDATES).
* Stop doing any nagging on /quote.
* Regress temporarily with handling protocol messages
* This ends the final two users of find_fixed_array_item().
* Nix find_fixed_array_item() and anything associated with it. 
* Fix braino.
* Switch users of LEVEL_CRAP to LEVEL_OTHER. yay!
* Whack some unused functions and decls, make *toa() funcs return const.
* Roll get_window_by_name() into get_window_by_desc(), it's only user.
* DBM (hash table) support.  See UDPATES
* Check for <ndbm.h> in configure, don't do DBM if it is absent.
* $dbmctl() always no-ops, returns empty string if dbm not available.
* Add 'd' to $info(o) if DBM support is included
* Add a check for solaris cc, moxy up the CFLAGS for larne.
* Fix compile breakage if both tparm() and base64() are missing. doh. 
* Fail when maximum number of levels have been added.
* Note a few places the window refnum is changed. 
* Add a pd implementation of sdbm, make $dbmctl() use it.
* Make configure warn harder if it looks like termcap/terminfo not found.
* Normalize the sdbm code, so it fits in with the epic way of doing things.
* Fix several bogons in add_to_log, found by ce.
* Add /on keybinding.  Why do I know I'm going to regret this one?
* Add partial implementation of $xform() (see UPDATES)
* Add shell of implementation of new_send_text() which i hope to finish...
* Fix bug in $b64decode()
* Add /window indent, allowing you to overrule /set indent per-window basis.
* Make window breaking use /window indent
* But /set indent still overrules any /window indent's you've set. :/
* Fix $windowctl(GET <win> TOPLINE <num>) -- <num> is numbered from 1, not 0.
* Implement xforms for CTCP. 
* Fix $urlencode() so it encodes the + char.
* Fix various compiler issues.
