EPIC5 Projects, Bugs, and other Errata:

THINGS TO WORK ON
------------------------------------------------
Actual bugs
============
<none>

Creature Comforts
====================
* /window maximize + new status expando when a zero-height window gets output
* Be able to retrieve/cycle through "next notified (activity) window"

Data improvements
===================
* Rethink "targets" with channels and queries 
* Change /ignore to support broader patterns (servers, nicks, etc)
* Support "virtual timestamps" -- don't fetch the real time
* Support ZNC's CAP that prefixes timestamp (see above)

Weaknesses
===========
* The way we handle "screen is not tall enough" underflow needs work
* Typing 😂😂(multi-column emojis) upsets screen.
* I don't think /msg @L1 is implemented correctly
	files.c:file_write() for type == 2

Foundational improvements
===========================
* Mouse support (for fusion)
* Unlimited size input line with auto-chonking
* Outbound flood control for irc servers
* Properly support 005 PREFIX=(qaohv)~&@%+
* Properly support CAP
	https://datatracker.ietf.org/doc/html/draft-mitchell-irc-capabilities-01
* Rewrite the RFC1459 message tokenizer ("BreakArgs")
    - Make CAP tokens (@stupid=value) first class citizens somehow
* Support for column counting ZWJ compound emojis
  + Sending a "Man shrugging medium-light skin tone"
    https://emojipedia.org/man-shrugging-medium-light-skin-tone
    is a "ZWJ sequence" which epic may not support correctly
   [ 5:34PM] -> (#epic) https://imgur.com/a/46IUXP0   -- how it originally appeared as received  (expected behavior per github)
   [ 5:34PM] -> (#epic) https://imgur.com/a/P8gEFnG   -- how it appeared after you swapped the window out and in again
   [ 5:35PM] -> (#epic) https://imgur.com/a/lSlLqQE   -- how it appeared in the log (text) file
  + Not every terminal emulator handles them, and then there's screen and tmux, too
  + Supposedly, you can output emojis and ask for column position to assess what's supported.

[I moved the old list to the file "WISHLIST" to keep this file short]

[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:
-------------------------------------
* Patch from twincest to fix build on solaris
* Don't honor queries for WALLOPS (requested by opers)
* Conditionalize <ieeefp.h> per twincest's fix.
* Clear RUBYDOTOH if ruby is found but it isn't usable (rb Zoopee)
* Rewrite checks for (intmax_t) for systems w/o strtoimax(). (rb JailBird)
* Define NSIG as _NSIG or 32 if it's not defined (rb JailBird)
* Broaden what you can specify for the server "proto" field (see UPDATES)
* Fix figure_out_address() to properly identify a server name
* This fixes /ignore user@host.com which was lamely broken.
* Make /window channel output all channels in the window
* Don't call update_all_status() if /set -status_clock (by Oliver Fromme)
* Comment out strtol() compat stuff, causing people problems.
* More graciously handle snprintf() returning -1 (rb twincest)
* Do not use /usr/include/ep on hpux
* Mark lastlog items as "dead" and check for them to avoid dangling ptrs
* Handle (graciously) when /set scroll_lines is > size of the window. (rb CE)
* Properly handle remove_lastlog_item() for the very last item.
* Fixes /eval defer window new kill;defer window new;defer window kill_others
* Add $hookctl(ARGS <recursive> <args>) allows you to replace $* in /on.
* Add $hookctl(USERINFO <recursive> <info>) allows you to set dynamic info.
* Don't lamely malloc_strcpy() over non-malloced strings in hookctl.
* Add $iconvctl() to control iconv stuff. (See UPDATES.)
* Add $xform(iconv +<iconv id>) functionality. (See UPDATES.)
* Fix bug where /window number could lead to confused lastlogs
* Generalize base64 encoding so it doesn't hardcode the base64 string.
* Add $xform(+FISH64 ...) which does FiSH's base64 encoding.
* Make a better test for embedded perl support by calling SvTRUE().
* Fix /bind -defaults so it actually removes all keybindings first. doh.
* Fix /window double so it actually shows you the current double status.
* Make the expression error for too many operands output the expression.
* Rewrite the iconv() configure checks to deal with libiconv's #define's.
* Rewrite the strtoimax() tests so they don't fail lamely to detect (intmax_t)
* Rewrite the perl and ruby runtime configure tests so they work right with gcc
* Fix various warnings revealed by gcc warnings
* Make a very preliminary attempt to write some fish decoding stuff. Not Ready!
* Fix for configure to handle perl's non-existance (kreca)
* Fix wserv4 dependencies so you can do make -j4 on multi-cpu.
* Rework the ruby checking in configure so it builds on freebsd-7
* Add CTCP FISH support (this is _not_ fish support!), see UPDATES
* Make an initial stab at proper support for FiSH's base64 converter.
* I took the "fish64" entry out of $xform() for now while it's broken.
* Capture stdout of ruby scripts and send it to an epic window. yay!
* This means you can do regular old 'puts' in ruby script and it'll Just Work.
* Finish $xform() for +fish64 and -fish64, verified against actual FiSH code
* Try to make the perl configure check more robust for non-working perls.
* Start a project to convert things to use transform_string().
* Fix show_lastlog() to return the rewritten result (so -mangle works)
* Actually sunset [en|de]code().
* Create transform_string_dyn, a pleasant api in front of transform_string.
* Create a bunch of global vars for transform_string to avoid lookups.
* Add hints to how big destination buffers should be for xforming.
* Fix transforms by initializing the expander and overhead items.
* Make various sanity checks for transforms to fix amn.
* Ensure all the users of transform_string_dyn are prepared to handle NULLs
* Ensure all the xform encoder/decoders can handle zero dest buffer sizes
* Add code to configure to fail if OpenSSL is not found.  No turning back!
* Split the notion of "iv size" and "blocksize" in crypto support
* This is needed because FiSH does not use an IV, being an ECB cipher
* It's also needed because the notion that the IV *must* be blocksize is lame.
* Add notion of "trimmable bytes" to end of crypto message
* Again, this is for FiSH, because it doesn't trim bytes on last packet.
* Support for assissting valgrind in helping us find memory leaks (caf)
* Fix memory leaks found by valgrind (caf)
* GC function_[en|de]code() and function_sha256 (superceded by $xform())
* GC unused [en|de]code(), enquote_it, dequote_it, and dequote_buffer().
* Fix display calcs when adding 1st window to 1st screen
* This allows you to change 'status.number' for default # of status lines
* Start tracking timestamps for scrollback items
* Full generalization of scrollback/scrollforward functions
* Implement scrollback/forward based on lines
* Implement scrollback/forward based on regex
* Begin thinking about implementing scrollback/forward based on time (not done)
* Windows that are hidden from birth have a fake height of 24 lines
* This fixes a bug where doing /window double on hold_slider 0 in a 
  never-visible window caused it to get stuck in an infinite loop.
* Add new scripts, "help.irc", "history.rb", "locale", and "tabkey.sjh"
* I need to document these in UPDATE!
* Add /exec -closeout, to send EOF to the exec'd process
* Add $dccctl(FD_TO_REFNUM <fd>) to convert $connect() to a refnum for dccctl.
* Remember $dccctl(GET refnum WRITABLE) detects a connected socket, by rule
* Change /on 322 handler so output always goes to OTHER, not to the window.
* Add an /on switch_query, but it's incomplete, so don't use it yet.
* Rewrite malloc_sprintf() so it can be used by do_hook_internal().
* Revamp do_hook() so it returns the final value of $*
* This will allow future use of do_hook() to rewrite text.
* Don't test for /usr/local/lib/libiconv.a because os x doesn't have it
* Prototype malloc_vsnprintf().
* Don't test uninitialized variables, you dummy.
* Have to be more aggressive using va_copy() for 64-bit sake
* Add /xeval -n {...} which un-does the ^ operation.
* Fix the 'ambig' script to use /xeval -n.
* Fix the command mode support in 'builtins' to use /xeval -n
* Reorganize open_log(), add support for double quotes around filenames
* Verify that logfiles are now working as I Hope they would.
* Make 'global' load ambig and newnick, since those recently came up
* Change a variable name to avoid conflicts with a global symbol
* Create a stub function to calculate how long the input line could be.
* Fix a bug with /who -real (i forgot who reported this, sorry!)
* Fix the redonkulous spurious errors when using $convert().
* Add a configure check for strtoimax() being a macro (ugh)
* Apparently strings in configure are supposed to be [quote]d.
* Check for strtoimax() separately in inttypes.h and stdint.h
* This hopefully fixes the build on hpux
* Add @E<win> as a /msg target so you can /msg a window.
* Fix lame compile error in wserv() if we need yell().
* Improve the test for libarchive in configure
* Fix /bind -default because it whacked the bindings themselves. doh!
* Normalize the copyright notice on scripts BlackJac wrote, per his request
* Fix 439 handling for inspircd (rb twincest)
* Add the ability to /log server all or /log add all for server logs.
* Change the configure test for perl from AC_TRY_LINK to AC_TRY_RUN
* Change string insensitive comparisons so "SERVER" doesn't match "SASAFRASS"
* Bump up the "overhead" bytes for xform()s to multiples of 8 per zlonix
* Support /log server ALL and /log type server add ALL to log all servers
* Fix brain-o that I missed -- strnicmp() consumers must use FULL STRINGS!
* Fix more.  You'd think I was not paying attention or something.
* Don't permit /xecho /flag because that's just useless
* Fix two dcc locking bogons that i discovered by accident.
* Revert the string insensitive comparison changes for now.
* Use PRIdMAX and PRIuMAX for printing (intmax_t), for hpux, or larne
* Fix my brokenness of my_stricmp().  Time to go hide under a rock.
* Fix the bug where the right indicator appeared when it should not.
* Add the 'logman' script which does per-server, and per-channel logging
* Handle inspired's BBC 351 numeric, for larne.
* Fix bug with /encrypt complaining "X is not a multiple of Y!" (rb zlonix)
* Add a bunch more scripts I've been sitting on that were contributed.
* Add 'cycle', 'set_color', 'ban', and 'speak.irc' scripts. i need to doc them
* Create some internal funcs to allow updating a server desc on the fly
* Allow add_servers() to update server descriptions
* Allow /server -add to update server descriptions
* Allow /server -update to update server descriptions
* Allow plain old /server to update server descriptions
* Allow $serverctl(READ_FILE filename) to update server descriptions
* Add $serverctl(UPDATE refnum stuff) to update server descriptions
* Allow /window server to update server descriptions
* Add $windowctl(GET x SERVER_STRING) returns last good /window server value
* Release epic5-1.1.1 (commit 1631) (Prolixity)
* Fixes so /server <group> doesn't clobber <host> with <group> (rb howl)
* Add support for /server refnum:<other flags> which I noticed
* For example, this means, /server 0:type=irc-ssl now works! yay!
* Add special check for OS X (Zach)
* Fix configure check for perl so it doesn't segfault.
* Fix configure check for iconv, so it doesn't bork the freebsd port
* Iconv support really is mandatory now! I mean it!
* Fix transform_string_dyn().  How did nobody catch this??
* Add a function findchar_quoted() like strchr(), but honors \.s
* Use this in server descriptions to find the unquoted : after a PASS.
* This means you can \ a : in a password. yay!
* Nuke the "URLPASS" support.  Let us never speak of this again.
* Two changes to timer.c from caf.
* Fix bugs found by --with-warns.
* Add a check in configure for -fno-strict-aliasing; could be used with -O2?
* Fix /parsekey reset_line so it sets the cursor to the end (for howl)
* Add /on unknown_set for howl (see UPDATES)
* Fix set_input(), which fixes history. yay!
* When /dcc causes nonblocking connect, tell the user so they know we tried
* Add 'c' option to $sar() and $msar() (see UPDATES)
* Revamp substitute_string() so $sar() and $msar() work as intended.
* Add a NONE_xform const to do null transformations.
* Release epic5-1.1.2 (commit 1638) (Trencherman)
* Fix build so it builds on mac os x, with or without macports perl.
* Fix brain-dead typo with /on unknown_set support
* Rewrite /bind transpose_characters in response to it being borked.
* Fix configure support so valgrind can be used (caf)
* Fix crash when you output to a window while it's being killed (caf)
* Fix memory leak with initialization of hook stuff (caf)
* Fix memory leak with realnames when a server is destroyed (caf)
* Change /bind previous_word and next_word to honor /set word_break
* Apparently the lastlog output stuff wasn't guarded properly by show_lastlog
* Refine fix for crash when you output to a window while it's being killed
* Use the length passed to write_server_ssl(), that's what it's there for (ce)
* Avoid null derefs with OMATCH/IMATCH/PMATCH in serverctl (ce)
* Fix /allocdump so it doesn't crash without a filename (ce)
* Fix for a bug that stopped "/xquote -u" inserting null chars.
* Fixed $serverctl([gio]match ...) to not return deleted servers.
* Improve performance in the main select loop.  In practice, MAY require minor script alterations.
* Save the errno from a failed $dbmctl(OPEN) for $dbmctl(ERROR -1)
* Add $channelsyncing(#chan server) for tjh.
* Make $info(o) show "S" if OpenSSL was compiled in -- useful for crypto
* When starting /dcc nonblocking connect, don't worry the user with noise
* Display the original /window arglist on any syntax error.
* Remove ADD_STR_TO_LIST macro (caf)
* Add "from" window to adjust_context_windows, windows are killed (caf)
* Fix from_server getting lost in vsyserr (caf)
* Fix null deref in umode handler (caf)
* Add %G status expando, to return 005 NETWORK (caf)
* Friendlier ZNC support changes follow here...
* Allow multiple servers on same (host,port) with different passwords
* For now, neutralize adjust_window_refnums() until a proper fix (rb tjh)
* Caf noticed I fixed the wrong bug. oops!
* EPIC5-1.1.3 released here (Feculance) (Commit ID: 1656)
* Add $xform("+LEN" ...) which turns anything into a length (for ciphertext)
* Fix $xform("-FiSH" ...) for compatability with other implementations.
* Don't accept EAGAIN as a valid error code for connect (caf)
* Fix infinite loop bug with /userhost (caf)
* Fix memory leak with /who in certain error conditions (caf)
* Rewrite isonbase() so it handles longer nicks correctly (caf)
* Implement /lastlog -ignore, which shows everything EXCEPT the pattern.
* Add /xeval -nolog which suppresses logging for that command.
* Implement $dccctl([SG]ET refnum PACKET_SIZE num) for packet-buffering
* Implement $dccctl([SG]ET refnum FULL_LINE_BUFFER [01]) for forced line buff
* Implement $hookctl(CURRENT_IMPLIED_HOOK) for implied on hooks to know context
* Add "expire timeout" to lastlog entries
* Create do_expire_lastlog_entries() which wipes expired window output
* Add functions to "merge" logfiles/channels/output/timers to a new window
* Remove the scripted COMMAND_MODE feature, which interferes with /window merge
* Add /xecho -E which causes window output to get away after some seconds
* Add /window merge which collapses two windows into one and kills the other
* window->lastlog_size must be maintained for both giver and taker!
* Try to fix some infinite loops when cleaning up window lastlogs.
* Add fn name to many panics.
* Make /on set only throw once if the user types the canonical /set name.
* Automatically close all $dbmctl() open files on exit.
* Fix /lastlog -context (but only for the normal case. -reverse comes next)
* Update_server_from_raw_desc() was missing a clear_serverinfo().
* Improve error handling for /hostname errors.
* Add /xdebug no_color which turns off color support at the lowest level.
* Fix /lastlog -reverse -context, all done now!
* Don't allow $repeat() or $pad() to request strings > 1MB.
* Have the malloc-failed panic tell you how many bytes were requested.
* Add a feature to check for unreleased message_from contexts in main().
* Fix two missing message_from leaks in server handler.
* Fix the lastlog trimming, an infinite loop (caf)
* Increase detail when debugging output contexts (caf)
* Reformat some code, fix more display context leaks (caf)
* EPIC5-1.1.4 released here (Adumbration) (Commit ID: 1667)
* Fix lock-ups when killing windows by refining the safeguard
* Create slurp_elf_file/string_feof|fgets|fgetc, to front-end ELF files
* Change /load to use the string front-end functions
* This allows /load to work on pure strings, and decouples from files
* Create recode_with_iconv() to convert a string using iconv() (for /load)
* Add /load -encoding which lets you specify the encoding of the file
* This means you can load iso-8859-1 encoded files on a utf8 terminal!
* Fix various warnings from gcc -Wall
* Add a new /set DEFAULT_SCRIPT_ENCODING -- will be used soon!
* Call setlocale(LC_ALL, "") at start of main() to get locale info
* Fix slurp_file() (caf)
* Fix make installman, man page filename had changed
* Begin a major project to fix issues suggested by clang (Ancient)
* Fix xecho as suggested by clang
* Check retval of set[ug]id() just because it's good style
* Make sure "MAXPATHLEN" (bsd) is always spelled "PATH_MAX" (posix)
* Fix while as suggested by clang
* Re-comment translate_user_input() based on suggestion by ce
* Move add_wait_prompt() to a new home
* Fix whoreply() as suggested by clang
* All of the below were suggested by clang.
* Fix set_screens_current_window() and search_for().
* Fix a "use-after-free" when realloc() fails
* Fix or paper over string-overruns for a malformed globs
* Fix a memory leak when opening a compressed file fails
* Fix a corruption of from_server in vsyserr()
* Check the param to denormalize_string() 
* Slurp_file shouldn't call stat() or check its retval
* Denormalize_string() should check its param
* And so should p_killmsg(), and dishonor kill msg if its malformed.
* Fix /while, /topic, and $repeat() in case of malformed arguments
* All of the above were suggested by clang
* More fixes suggested by clang that I'm too annoyed to list out.
* Even more fixes suggested by clang (most related to theoretical null derefs)
* Even more fixes...
* Rewrite /window move and /window move_to to make clang happy
* One final batch of updates by clang....
* Rewrite lastlog moving funcs to use windows ptrs instead of refnums (caf)
* EPIC5-1.1.5 released here (Gallimaufry) (Commit ID: 1683)
* Add /QUEUE -RUNONE
* Caf and jm confirmed that ircu doesn't use 307 for USERIP any more.
* ignorectl(DELETE) is not silent and it should be.
* To satisfy fedora packaging rules, accept DESTDIR for 'make install'
* Many printf() format fixes (caf)
* Many changes clang suggested
* Fix "topicbar" script to double quote "s for now.
* Fixed-skipped windows don't get channels from /window kill (unless no choice)
* Add $windowctl(REFNUMS_BY_PRIORITY) to give you windows by current-ness
* Add /lastlog -reignore (ce)
* Add $logctl(NEW)
* Add $logctl(LAST_CREATED)
* EPIC5-1.1.6 released here (Kakorrhaphiophobia) (Commit ID: 1693)
* Begin a big project to decouple status bar generation from window refresh.
* Create $status_oneoff() which lets you press a status bar on the fly.
* Fix configure and the build so it works with ruby 1.8/1.9/2.0
* Update the help script to work with the new website (credit <fill in here>)
* Make many changes based on suggestions by clang and scan-build
* Make the configure checks for ruby support more ruby executable names
* A few minor changes to the history.rb script for no reason
* Add /input -- to end arg processing so your prompt can start with hyphen
* Fix a typo bug that kept the correct status bar from being regen.
* Fix another issue with /window server that caused status not to be updated
* Add a VERY TEMPORARY /debuglog command for my use.  Will go away soon!
* Fix status bar update problems (sigh)
* Update status bar from set_server_005s, so %G updates right away. (caf)
* Larnifications for incoming nicknames (caf)
* Add %{4}S status bar expando, always returns full "itsname"
* When checking Maildir for /set mail 1, ignore subdirectories (rb zlonix)
* Change string_fgets() to return the number of bytes read
* Always check servers at startup, even if user did -S. 
*   (They might have done /server in their startup)
* Change file_size() to use normalize_filename().
* This allows MAILDIR to support ~-expansion (ie, ~/Maildir)
* The sender can be omitted (such as with "NOTICE AUTH"), so don't check those
* New xmsglog script from zlonix
* Fix trimming support for $xform().  Plus, FISH should do trimming. (rb zlonix)
* Fix maildir support for /set mail 1 (help by zlonix)
* Update tabkey.ce from fudd
* Update xmsglog from zlonix
* Two new scripts, sasl_auth and idlealert from zlonix.
* EPIC5-1.1.7 released here (Kainotophobia) (Commit ID: 1705)
* Updated massmode from zlonix.
* All the stuff below are round 1 utf8 support for input line
* New file, wcwidth.c, utf8<->unicode conversion, unicode column counting.
* Revamp /INPUT system to be utf8 aware.  callback 2nd arg is now const.
* Specifically, save the state of the input line across /INPUTs.
* -- This is stub code. needs to be completely fleshed out.
* Reformat keys.c so I can work with it easier
* Only bytes < 127 can now participate in binds.  >= 128 are SELF_INSERT.
* I think the keybinding system can grow 'namespaces' which might be cool.
* The TRANSPOSE_CHARACTERS keybinding has passed away quietly.
* New keybinding DEBUG_INPUT_LINE to help me
* Revamp the edit_codepoint() system to work with unicode code points
* Screen input now collects bytes until it gets valid utf8 code points.
* Collect all of the input line data structures into Struct InputLine
* Give each screen it's own inputline with an eye towards stacking them.
* The ability to 'fake' input in dumb mode has passed away quietly.
* Completely revamp input.c to work with inputline data structure
* Change input line so users operate on "logical characters"
* Inputline data structure maps "logical characters" to bytes in input buffer.
* It's almost too overwhelming to describe specific details.
* Basically the input system accepts unicode code points, and stores in utf8.
* Things like cursor movement, column counting, side scrolling all Just Work.
* Even things like cut buffering work.
* HOWEVER -- it seems this stuff doesn't work in GNU screen. can't fix this. :/
* Internal function strext2() allows me to cut substrings out, for input buf.
* Fix input_delete_character(), it forgot to call retokenize_input()
* Fix term_inputline_putchar() so it doesn't mangle 0x9b (valid utf8 char)
* Fix $curpos(), sort of.  Does this return byte offset or column offset?
* 	It used to be the same, but now it's not!
* InputLine.buffer_pos isn't used any more.  Whack that.
* Test every keybinding, fix the ones that are broken.
* Fix handling of highlight chars
* Add "number_of_logical_chars" to input line so we can boundary check eol.
* Error if you try to /bind a high bit char -- that's illegal now.
* Test and fix composed characters (for mac os x)
* Teach the normalize_string, prepare_display, and output_with_count about utf8
* Since utf8 parsing is "consumptive", some utility funcs changed too
* Column counting/line wrapping in the display works correctly now.
* Fix read_color_seq().
* ... again.
* Fix screen prompts so they can recurse, and restore previous state!
* Fix line wrapping bug that zlonix found.
* Get column counting working for the status bar (rb zlonix)
* Re-implement /input -noecho
* Create a utf8 string checker
* Add "encoding=<stuff>" flag to /server descriptions to act as default.
* EG, /server host=irc.foo.com:encoding=ISO-8859-1
* Run every non-utf8 string from the server through iconv using def encoding
* Extend $chr() to accept U+xxxx strings
* Add function $unicode() converts input into U+xxxx strings
* Add recode.c, to hold stuff regarding /ENCODING and encoding xlates
* New command, /ENCODING, declare encodings for targets. only "console" now.
* Translate user input via /encoding console setting, defaults to utf8.
* Translate screen output to /encoding console setting
* Non-utf8 users now appear as utf8 users to irc!
* UTF8 users now appear as non-utf8 users to non-utf8 epic users!
* Automatically recode undeclared non-utf8 scripts using /encoding scripts
* Add Emojis (unicode 6) to the column counting code (rb Kitambi)
* Set /ENCODING CONSOLE automatically to nl_langinfo(CODESET) from LC_ALL.
* If the default codeset is "US-ASCII" then it's changed to ISO-885-1.
* In translate_user_input() try to detect utf8 typers using non-utf8 encodings
* Tell user if we're recoding a script at /load time.
* Fix slurp_elf_file() it was leaving a 0xFF at end of file, confusing /load
* Don't bind ^T to non-existing TRANSPOSE_CHARACTERS keybinding.
* Bump MAXPARA from 15 to 20 for RusNet
* Fix the UTF8 detector for user input
* Fix cursor left when switching zones to the left.
* Allow /set word_break to include high bit code points (rb fusion)
* To work around RusNET, forgive truncated utf8 sequences at the end.
* Fix /server , so it doesn't null deref.
* Add /lastlog -this_server and /lastlog -global for zlonix.
* Fix $windowctl(NEW) by forbidding status updates during window creation.
* Default /ENCODING CONSOLE to the user's locale, not to utf8.
* Re-implement /set allow_c1_chars for input line, display prep, and output.
* Fix diagnostic output of /encoding
* Comment out some stuff in term.c that isn't being used.
* Re-implement status repeat-char-fill for utf8. (rb fudd)
* Fix /xtype -l to be UTF-8 aware. (rb zlonix)
* When status updates are suppressed, make a note if an attempt is tried
* When status updates are permitted again, do an update_all_status() if defered
* Make /set lastlog do a scrollback redraw to "dispose" of extra lines
* Make /set lastlog refuse to set to a value < twice the biggest window.
* However, doing /set lastlog 0 WILL delete everything and clear every window.
* Have configure auto-detect your "local" directory (/usr/local|opt|/usr/pkg)
* Have configure use the auto-detected local directory.
* Reformat some parts of server.c
* Change the current window whenever we're processing server stuff.
  -- This was withdrawn because it was very unpopular.
* Don't allow /window lastlog to set the lastlog too low. 
* Add support for ITALICS (^P) (\020), including ITALIC keybinding.
* Add support for 256 colors.  I should document all changes but i don't wanna
* Document all the places where encoding translation should happen.
* De-harshen some comments I wrote 20 years ago in anger.
* Fix colors with high bit set. (rb Hellfire)
* Change ^X so it only supports two hex digits 00-FF
* Fix QUOTE_CHARACTER (^Q)
* Lots of internal work to implement back-end of /encoding.
* Add decide_encoding() to evaluate rules and pick one for non-utf8 stuff.
* Add serverinfo_matches_servref() internal to decide if (si) works for a serv.
* Add outbound_recode() internal to translate messages we're sending out
* Add inbound_recode() internal to translate messages received from irc.
* Add recode_with_iconv_t() internal function for the above.
* Rewrite (inbound_recode()) privmsgs, notices, topics, all this good stuff
* Rewrite (outbound_recode()) msgs, notices.
* Withdraw the /server -encoding feature.
* Add /xdebug recode to debug recoding rules.  Help you help me!
* Review the recode code and leave comments for future improvement
* Don't allow the user to delete the magic recode rules.
* Fix $tobase(<base> 0) to always return 0 instead of empty string.
* Fix $"", caused by accumulator in translate_user_input not being cleaned.
* Fix bug with /encoding found by zlonix.
* Make serverinfo_matches_servref() honor 005 NETWORK value.
* Add /encoding support for 311, 314, 322, 332, and 352 numerics (*gulp*)
* Leave notes to add support for outbound topic/kick/part/etc.
* Add /encoding support for CTCPs (reported by zlonix)
* Fix /encoding support for PARTs (found by zlonix)
* Add /encoding support for outbound KICKs/TOPICs/etc
* Create internal rfc1459_any_to_utf8 to preprocess before parse_server().
* Tokenize recode rule "target" at create time instead of every evaluation
* This is part of a larger code cleanup for recode.c
* Remove the per-message handling for /encoding since it's done globally now.
* Change vsend_to_aserver so it does recoding.
* This means outbound doesn't honor /set translation any more
* This requires send_to_server_with_payload() since payloads already recoded
* Fix typo causing payload not to be recoded properly.
* Missing a break. d'oh.
* Outbound messages should not be recoded if they're already utf8.
* Yes they must be! duh.  Square all this away with zlonix.
* Fix send_text so it doesn't send non-utf8 text through /on send_msg
* Finnese invalid_utf8str() so it doesn't truncate partial cp's for non-utf8s
* Warn if we try to do double-outbound-recoding
* Be more sensible about handling string lengths in vsend_to_server()s.
* Add $^*var to 'quote everything' (except letters and digits)
* When recoding inbound, move server|payload part out of buffer first.
* Don't double decode the ircname in whoreply.
* Rewrite strformat() to be utf8 aware.  This fixes $[9]var
* Rewrite $pad() to be utf8 aware.
* Allow char-based /set's to hold a utf8 code point (for /set pad_char)
* Fix typo in check_xdigit() that borked 256 colors
* Fix $status_oneoff() to repeat with space if status bar is empty string.
* Don't -1 the line len when passing to prepare_display(); already adjusted!
* De-confuse ctcp_type and sed_type in the /encrypt stuff
* Make encryption work again, with encoding (but not with recursive ctcps)
* Write special handling for (defering) recoding of CTCPs until decrypted
* Rewrite $left(), $right(), and $mid() to be utf8 aware.
* Make /FEC utf8 aware.
* Fix a double recode with outbound ctcps
* Extend send_text() with a new flag saying if text already recoded
* Don't double-recode ctcp's!
* Inbound recoding of CTCPs must happen *before* processing, not afterwards
* This fixes /encode + /encrypt + /me
* Convert $strlen() to utf8-aware, many others to follow
* Add new flag "CTCP_NORECODE" which tells do_ctcp not to recode first.
* This allows non-encryption ctcps to automatically be recoded.
* This fixes /me yet again.
* Create internal cpindex() and rcpindex(), like [r]sindex(), but works on CPs
* Adjust internal chop() to work on code points. 
* Make a first pass to choke if /encoding argument is not valid locale.
* Write some more internal CP based functions in wcwidth.c
* Rewrite/ensure these functions are UTF8 aware:
	strlen	chop	index	rindex	indextoword	wordtoindex	maxlen
* Write a half-finished reimplementation of $fix_width() that is commented out
* Fix rcpindex() when the search char isn't in the string
* Fix search_for() which makes $before() and $after() utf8 aware.
* Eliminate usage of internal sindex() -> strchr(), strpbrk(), or cpindex().
* Rewrite/ensure these functions are UTF8 aware:
	strip	split	before	after	curpos
* At startup, create a (locale_t) that points to "en_US.UTF-8" for ctype funcs
* Create internal mkupper_l and mklower_l to convert codepoints to upper/lower
* Rewrite internal upper()/lower() to use mk(upper|lower)_l.
* This makes $toupper() and $tolower() utf8 aware. yay!  And other stuff!
* Implement internal utf8_strnicmp and use it for my_str[n]icmp.
* This means things like case insensitive aliases work for non-english! yay!
* Rewrite/ensure these functions are UTF8 aware:
	toupper	tolower
* Add sanity check to next_code_point() to warn if i do something stupid.
* Revise next_in_div_list to take CP so $[m]sar() can take arbitrary delims
* Revise substitute_string to handle case insensitivity as utf8 aware.
* Rewrite/ensure these functions are UTF8 aware:
	reverse	rest	pass	sar	msar
* De-emphasize toupper() and tolower(), which are not utf8 aware
* Comment out $shiftseg() until I learn more about it (needs utf8)
* Rewrite/ensure these functions are UTF8 aware:
	center	tr	chrq	insert
* Rewrite/ensure these functions are UTF8 aware:
	substr	rsubstr
* Fix many warnings suggested by the compiler
* Zlonix updated idlealert, sasl_auth, xmsglog, and added new_lastlog.
* I had added contrib/utf8.c and regress/test_xform3 regress/test_xform4.
* Fix many warnings/bugs suggested by clang's static analyzer
* Add sanity checking for encodings, so we can warn the user
* Specifically check the locale encoding for sanity, use ISO-8859-1 as fallback
* Warn the user if /encoding encoding is unusable -- and don't switch over.
* Put in references to two wiki pages I need to document
	http://epicsol.org/encodings_and_locales
	http://epicsol.org/encoding
* Server names can contain '*'s. (rb zlonix)
* Fix /topic when you don't supply a channel (rb zlonix)
* EPIC5-1.1.8 released here (Atavistic) (Commit ID: 1775)
* Fix from freebsd to avoid checking yes(1) as ruby executable in configure
* Create functions to enumerate what should be documented in wiki
* This is exposed via undocumented $help_topics() function.
* Explicitly set LC_NUMERIC to "C" because otherwise math parser breaks
* Reset /window activity when a window becomes current (as in /window notified)
* Create stub for $encodingctl(), and spec it, but not implemented yet.
* Create internal time_since_startup() function (for eventual load logging)
* recode.c needs to include <xlocale.h> because of newlocale(3).
* Add new "source" flag to recode rules, to tell user where rule came from.
* Implement $encodingctl().
* RecodeRule->magic wasn't being set correctly.
* Output the recode rule refnum for /encoding
* Rewrite internal fix_string_with(), with new chop_[final_]columns() funcs.
* Extend $fix_width() to support 'c'enter and 'r'ight justify, and UTF8 aware.
* EPIC5-1.1.9 released here (Desquamation) (Commit: 1780)
* Fix compile error in function_help_topics
* EPIC5-1.1.10 released here (Desquamation) (Commit: 1781)
* Updated sasl_auth (v1.2) from zlonix 
* Fix input lines being blank on non-main screens (set output_screen)
* Fix not being able to chain /INPUT's together (reset input line before callb)
* DO NOT set the window when handling server (very unpopular)
  (* Change the current window whenever we're processing server stuff.)
* Rewrite add_window_to_screen/remove_window_from_rewrite
* Rewrite recalculate_windows.
* This fixes screen corruption when creating wins or shrinking your screen.
* Fix a bug where UPDATE_STATUS could get ignored (introduce FORCE_STATUS)
* Remove /set translation and all its stuff.
* Don't unforce the status bar until it's actually been redrawn.
* Set a window's screen before hiding it on /window new_hide (rb fusion)
* Fix rogue semicolon.
* Fix a null deref in creating new window when all other windows are fixed
* Fix some bugs that clang static analyzer found
* Fix where /set -continued_line led to strange denormalize behavior (rb Tilt)
* Add tmux support for /window create, (zlonix)
* Fix all calls to iconv() so they follow standard (2d arg -> (char **))
* Revamp do_crypto() to recode messages after decryption.  Somehow missed this
* Add comments to various functions that I think deserve it.
* Windows added to screens must have their "my_cols" set!
* Add support for detecting iso2022-jp for fusion (Japenese non-utf8 encoding)
* Plaster over two lame clang warnings in if.c so i don't have to look at them.
* Don't #include "wcwidth.c" from ircaux.c, compile on its own
* Make next_code_point() self-synchronizing; callers doesn't have to handle err
* Update for topicbar from zlonix (rename topicbar.purge -> datapurge)
* Modify next_code_point() to allow re-syncing or error reporting.
* This fixes a bug where invalid_utf8string was broken (rb zlonix)
* Adjust the wrapping point for long lines without breaks (rb fudd)
* Remove /set default_script_encoding (superceded by /encoding scripts)
* Remove /set high_bit_escape (superceded by /encoding console)
* When i rewrote recalculate_windows() forgot to call window_check_columns()!
* $read() will using /encoding scripts to convert non-utf8 strings. (temp!)
* Fix next_code_point() to skip bytes, not increment them (fusion)
* Don't permit /set no_control_log to overrule mangling
* Improve the warning for /set dcc_use_gateway_addr for ipv6 only conns
* Don't use/require /hostname to be set for /server connections, (rb stygian)
* Fix connecting to server w/o vhost (caused by previous commit)
* Fix a crash with ^L when there is a dead screen (rb zlonix)
* Fix a crash with /window create (rb zlonix)
* Do not allow add_to_log() to be recursive, an invalid rewriter can cause
  [error] output, leading to infinite recursion (rb tjh)
* BTW, to do timestamping in logfiles, try 
  /@logctl(SET 2 REWRITE "\\($strftime(%b %d %X)) $$0 $$1-")
* Add $windowctl(REFNUMS_ON_SCREEN <winref>) to get all wins in screen order
* Fix configure check for socks5 (binki at gentoo dot org) -- Thanks!
* If after resize, scrolling view is "too high", do an /unclear (rb desaster)
* Get_subarray_elements (ie, /foreach) does NOT honor "type" arg and it should
* This fixes /foreach -cmds i {....}.  Odd that nobody noticed this...
* Allow ~'s in nicknames because ircnet permits it.   (rb Harzelien)
* New sasl_auth script from zlonix
* Add recoding support (ie, UTF8 support) to send/recv msgs from /exec procs.
* Don't whine that your irc hostname is invalid until /dcc fails because of it.
* Fix null deref when looking up a variable that exists but not as a variable
* Fix recoding /exec's by having the "target" be "%<name>", like /msg works.
* Don't let /ignore hop msgs cover up /ignore #epic joins
* Allow ` in nicknames for ircnet. (caf)
* Two scripts from zlonix, scripts/user_list scripts/tmux_away
* Fix build on systems without <xlocale.h>, newlocale() [FreeBSD-8]
* Rewrite target_file_write() to support the expected syntax
* Rewrite $write() and $writeb() to use new target_file_write() properly.
* Remove frivolous fprintf()s to stdout.
* These features were suggested by Roca He, who is doing a research project
  on inproper OpenSSL API usage by open source software.
* Output the SSL protocol upon connect (SSL_get_version())
* Call SSL_CTX_load_verify_locations() to load root CAs.  Need to /set-ify this
* Call SSL_get_verify_result() to validate certs whenever possible.
* Extend /on ssl_server_cert with $4=SSL_get_verify_result() 
* Extend /on ssl_server_cert with $5=SSL_get_version()
* Refactor ssl_connected() with comments and clarity. 
* Fetch a SSL server's certificate (including subject, issuer, pkey, and digest)
* Extend /on ssl_server_cert with $6=SSL digest (+URLified))
* Someday, we'll save the ssl_certificate and cert_hash in the server struct
* Someday, we want ssl.h to save all the metadata, for non-servers.
* Add new argument "snap" to add_timer(), for determining initial timeout.
* Updated tmux_away, userlist script (zlonix)
* Fix bug in target_file_write() not properly handling @W/@L/@ref
* Refactor the timer subsystem with comments and clarity
* Add /TIMER -SNAP which allows you to run timers "at the top of the interval"
* Make /timer option processing similar to other commands
* Add comments to make the timer API more clear and robust.
* Revamp add_time() to add snapping, and handle updating better
* Add /SET SSL_ROOT_CERT_LOCATION to pass to SSL_CTX_load_verify_locations
* Add script 'find_ssl_root_certs' which sets SSL_ROOT_CERT_LOCATION for you.
* Have 'find_ssl_root_certs' loaded by 'global'
* Fix very many warnings recommended by clang.
* Use X509_verify_cert_error_string() to get SSL verification explanation
* Revamp /load find_ssl_root_certs after discussions with folks.
* Signficantly revamp ssl.c, to make clearer, and save metadata of connection
* This is so in future, $serverctl() may provide SSL info to user/script.
* Create $serverctl(GET refnum SSL_<*>) operations for SSL info (see UPDATES)
*	CIPHER	VERIFY_RESULT	PEM	CERT_HASH	PKEY_BITS
*	SUBJECT	SUBJECT_URL	ISSUER	ISSUER_URL	VERSION
* New function $chankey() -- similar to $key(), but can specify servref.
* Support inbound recoding of dcc chat messages.
* (Outbound recoding of dcc chat messages was already supported)
* This means that dcc chat (including ctcp-over-dcc) is now utf-8 aware.
* This concludes the UTF-8 project.  EPIC5 is now fully UTF-8 aware.
* Change /set ssl_root_cert_file to /set ssl_root_cert_location
* Change default ^X binding back to SWITCH_CHANNELS
* Add a callback to /set ssl_root_cert_location to help with auto-detecting
* Don't /load find_ssl_root_certs by default, since it's auto-detected
* Updated 'layout' script from zlonix.
* This means /set -ssl_root_cert_location uses openssl default suggestions
* For crypt.c and crypto.c, "key"->"password" for passwords
* For crypt.c and crypto.c, "key"->"crypt" for crypt struct objects
* Remove #ifdef HAVE_SSL's in crypt.c, because ssl is required now.
* Change crypt's primary key to be target only, not target+crypt type
* Add /encrypt -remove to remove an entry more simply 
* Make errors for string transformations and ctcp encodings more verbose
* EPIC5-1.1.11 released here (Lucubrations) (Commit: 1810)
* Use pending-nickname if we have one as the default nickname on reconnect (caf)
* Add @serverctl(SET refnum UMODE ...) to overrule reconnect umodes
* Handle /SET -SSL_ROOT_CERTS_LOCATION in set_root_certs_location (caf)
* Eliminate some avoidable uses of strcpy/strcat/sprintf for the pedantic.
* Move the uncompleted wishlist items to the web-based wishlist
* Signficantly rewrite the shebang (-S) command line option to remove strcpy()s
* Increase the padding for SHA256 xforms to avoid a buffer overflow (caf)
* -- I switched to git here --
* "Make install" modified permissions in the tree. Ew. Take that out.
* EPIC5-1.2 released here (Deracination) (Commit: 1816)
* Always #define UNAME_HACK; don't return detailed OS info on CTCP VERSION
* OK, a compromise -- don't #define UNAME_HACK, but don't show OS version.
* Fix a crash when you do $splitw("" abcd)
* Make sure /encoding shows a builtin rule is "Set by User" if user changes it
* Internal function new_split_string() is like split_string() but utf-8 aware
* Rewrite $splitw() to use new_split_string(), so it's utf8-aware! yay!
* Fix warnings about libarchive and abs() from clang
* Fix warnings from ubuntu as a special favor to wjr.
* I can't believe it's so difficult to believe "I don't care if this fails"
* More complier warnings from gcc-4.9
* Final compiler warning, from openbsd this time.
* Lots of OS's and compilers checked.  Looks good!
* Final warning fixed!
* Refuse to recurse more than twice in send_text() to avoid infinite recursion
* Fix crash if you try to clear an /encoding rule that doesn't eixst.
* Refactor deleting a recode rule into a func and have everyone use it (rb des)
* "Valid UTF8" requires something other than a broken code point at end (rb des)
* Treat ^C99 as a bare ^C, because of other clients (rb wuf)
* Turn #define use_automargins on for now
* Add /SET FIRST_LINE which will be prefixed to all lines of output.
* Do a term_clreol() at the START of output, not the end
* This allows us to write to the last column of the display!
* Just /set -continued_line and /set first_line @ (or whatever)!
* You _MUST_ use an automargin TERM (ie, export TERM=vt102am) for this to work
* EPIC5-1.4 released here (Sententious) (Commit: 1833)
* Fix null deref when you used an implied unary operator in expression stmt.
* Fix call stack dumping, which was missing a frame, null derefing (caf)
* Add /on raw_irc_bytes for caf - raw, unfiltered data from server
* Fix dcc resume (caf)
* Be reasonable handling DCC ACCEPTs where DCC RESUME was not requested (caf)
* Fix dcc resume again (caf)
* Ensure translate_user_input() passes nul terminated string to n_c_p (caf)
* Fix memory leak with sanity_checking_encoding() (caf)
* Fix memory leak with bind_string_comporess() (caf)
* Fix $bindctl(SEQUENCE .. SET ..) when find_sequence() fails (caf)
* Below two items were reported by Felix Janda
* Musl C library (for linux) doesn't support sys_siglist, and our shim fails
* Don't require sys_siglist to be present to build epic; just remove features
* Eventually I'll build something into epic to do this at startup.
* Fix clueless function get_all_server_groups() (rb ce)
* Proper signal numbers start with 0. (0 is permitted by some systems) (fj)
* Fix preserve_serverinfo() when the hostname is an ipv6 paddr.
* Deprecate the use of strformat() which can't count columns correctly
* Add truncation to fix_width(), to allow the below...
* Fix $[len]var to use fix_width(), for well-defined behavior (see UPDATES)
* Fix $pad() to use fix_width(), for well-defined behavior (see UPDATES)
* Hide all the SSL debugging chatter behind /xdebug SSL
* Add /window log_rewrite, to overrule /set log_rewrite on window logs
* Add /window log_mangle, to overrule /set mangle_logfiles on window logs
* Remove prohibition from /query'ing an exec process that doesn't exist
* For musl libc (linux), eliminate use of sys_siglist and sig.inc.
* Roll our own signal names at runtime (ie, SIGHUP -> "HUP")
* This fixes /exec -SIGNAL %process.
* Support iconv()s that don't support //TRANSLIT (Felix Janda)
* Fix /load guh, it had an old-style C comment
* Eliminate LocalHostName in favor of LocalIPv(4|6)HostName
* If your Vhost does not resolve in the family you're using, use fallback
* Use the protocol-specific vhost when registering with the server
* The following fixes make /load ../regress/func work again
* Fix a crash with $after(1).  There are more bogons downwind here.
* Fix cpindex() and rcpindex() which fixes $index() and $rindex().
* Fix $tr() to behave the way it is documented
* Change transform_string_dyn() to return the bytes in retval, not it's size
* -- I hope this doesn't break anything else!
* EPIC5-1.6 released here (Usufruct) (Commit: 1854)
* Remove non-utf8 characters (rb Felix Janda)
* These bug fixes from caf
* Report getsockopt() errno and result in the right order (caf)
* Prevent memory leak after /DUMP (caf)
* Fix a memory leak in $bindctl(SEQUENCE .. SET ..) (caf)
* Fix memory leak caused by $open(file R) when file is executable (caf)
* Fix memory leak in /ASSIGN <name> (caf)
* Fix memory leak in $close() (caf)
* Stop looping in $delitem() after the entire array is deleted (caf)
* When deleting the only item in an array, $delitems() should return 0 (caf)
* Thanks to caf for his bug hunting and fixing! :)
* Fix false positive memory leak from using VALGRIND_MEMORY_TRIM (caf)
* Fix false positive memory leak deleting local variable stack at exit (caf)
* Fix memory leak when deleting server (caf)
* At the request of gentoo, the following patches and requests...
* Change highlight chars (^V) to #def's (REV_TOG_STR) because file(1) is weak
* Fix tcl, ruby, perl, libarchive support to be more gentoo friendly (binki)
* (We had already applied their socks patch a long time ago)
* Remove 'localhost' from IRCSERVERS default list - default is efnet now.
* The patches were for autoconf-2.60, so some changes were made
* End changes requested by gentoo
* Fix to make --with-localdir more gentoo friendly (binki)
* Fix to make parallel builds work better for gentoo (binki)
* Make /set logfile behave more like /log filename (see UPDATES)
* Make /window logfile behave more like /log filename (see UPDATES)
* Ooops.  Should have tested that better.
* EPIC5-1.8 released here (Perlustration) (Commit: 1862)
* Fix memory leak with closing ssl cnnections (caf)
* Fix memory leak with servers that never get connected (caf)
* EPIC5-2.0 released here (Gamboling) (Commit: 1864)
* Call setgid() before setuid(), for best practice (caf)
* Fix off-by-one error with printing OpenSSL strings (caf)
* Don't output the full SSL certificate for a server (caf)
* When (re-)connecting, use the hardcoded server description nick (rb larne)
* Fix utf8_strnicmp(), which broke $uniq() (robo, caf)
* Fix null deref when a server has no CA (caf)
* Remove a couple of unused variables in ssl handling (caf)
* Fix crash when you $close() an fd from $exec() [rb CE]
* Reformat all the ./configure --help outputs [rb skered]
* EPIC5-2.0.1 released here (Indolence) (Commit: 1869)
* Revamped maildir support to count both 'new' and 'cur' (wcarson)
* Optimize maildir support so it's as fast as possible (wcarson)
* Fix uninitialized pointer of window->log_rewrite (rb Q)
* Fix handling of <locale.h> for CentOS 5.11.
* new_timer() should initialise ->domref (caf)
* Remove unnecessary window->screen check in hide_window() (caf)
* Remove double-setting of *outbound in check_recoding_iconv() (caf)
* banner() should use %d for printing current_numeric (caf)
* inet_vhostsockaddr() should use %d to print port (caf)
* Simplify expression in show_key() (caf)
* Remove doubled-up SIGABRT from init_signal_names() (caf)
* In transform_string_dyn() don't use my_dest_str_len without testing for NULL (caf)
* Make output size check more robust in fish64_encode() / fish64_decode() (caf)
* Remove unused function slurp_file() (caf)
* Fix $ignorectl(WITH_TYPES ...) when only exceptive ignores are supplied (caf)
* Remove unnecessary double-setting of window_display (caf)
* Loosen overly-tight restrictions from $hookctl(SET .. SERIAL) and $hookctl(SET .. NICK) (caf)
* Fix /USLEEP for fractional second delays (caf)
* Add ( ) around constants declared as macros using shift operator (caf)
* Include output.h in compat.c for yell() (caf)
* Don't lower-case the channel name passed to whobase() (caf, rb white)
* Only populate server->uh_addr when it's needed, to avoid spurious warning
* Extend new_close() to new_close_with_option() allowing callers to manage fd
* This is used for python fd handling.
* Make new_io_event() actually support NEWIO_NULL (no io callback)
* Python support merged into 'master' here.
* Add new_open_failure_callback() which allows getting a callback on dead fd.
* Add %{1}P status bar variable, "prefix when (not) current" (see UPDATES)
* Add /set status_prefix_when(_not)_current variables, default to empty string
* Add /window status_prefix_when(_not)_current operations, default to nothing
* Convert CTCP data structures from static arrays to a bucket
* Initialize hardcoded CTCPs at boot time
* Guard against null deref when changing lastlog and/or scrollback at same time
* Overhaul ctcp.c so there are no more magic integers used as foreign keys.
* Fix a core and leak to do with /userhost and /ison queues (ce)
* Revamp/unify do_ctcp() and do_notice_ctcp() to reduce code duplication
* Change send_ctcp() to take a boolean int rather than a string for first param.
* Simplify the CTCP flags to just "ordinary" and "special", with "raw" (or not)
* CTCPs are "raw" if they need the original payload, or not if payload is string
* CTCPs are "special" if they handle everything themselves (/me, /dcc)
* Enforce anti-botnet CTCP reply flooding on the /CTCP side, not request side
* (That way, CTCPs that don't generate responses are not throttled)
* Implement $ctcpctl() to register user-defined ctcp handlers. (see UPDATES)
* Add $ctcpctl(ALL) for CLIENTINFO purposes.
* Create /load ctcp, some basic CTCPs implemented in script
* Make /load builtins do a /load ctcp 
* Comment out some basic CTCPs from the base client -- yay!
* Treat empty return strings from ctcp handlers as "not handled"
* Initialize status.prefix_when_(not_)current in new windows.
* Create a distinction between CTCPs that replace their bodies and themselves
* via $ctcpctl(SET <type> REPLACE_ARGS 0|1) [see UPDATES]
* Rewrite CTCP PING handler, create CTCP UTC handler
* Fix ipv6 p-addr vhosts for /server (rb wcarson)
* Add /exec -wintarget, output to any old window (rb wcarson) (caf)
* EPIC5-2.1.1 released here (Abulia) (Commit: 1898)
* Improve perl support (remove warnings) (caf)
* The : before final param is part of the syntax, not the message (caf, rb trn)
* Fix bug in previous patch
* Don't include <term.h> unless it's needed, because of ruby-2.7 support
* Modernize ruby support while we're at it (checked with 2.3/2.6/2.7)
* Add "passthrough read|write" support to newio, for python.
* Change python's "epic.xecho" to not default force -s by default
* Change python's @on decorator do a ^on so it's silent
* Fix a couple of compiler warnings suggested by new clang.
* Add _epic.callback_when_readable and _epic.callback_when_writable for python
* They take a python callback, and dispatch when an fd is ready.
* This allows python scripts to submit an fd for callback with newio.
* Call PyErr_Print() on an exception.  This is "noisy", but i needed it for debug.
* Eventually we have to be able to do this on our own.
* Add /pyload shortener -- an in-client url shortening redirecting proxy!
* Capture STDOUT and STDERR from python, redirect to /echo.
* Pull out the python init code into its own function
* Don't try to fancy-print exceptions, now that we're capturing stderr.
* Add count_initial_codepoints() to convert a ptr to something for $mid()
* Change $regmatches() to use count_initial_codepoints().
* Fix a dumb warning from clang about pointer arithmetic.
* Revamp /exec to behave regularly so we can treat %proc as real targetsa (see UPDATES)
* Add /on send_exec so you can reformat messages being sent to exec procs
* Add $uuid4() -- it returns UUID4s!
* Add /exec -nolaunch so you can build an /exec before starting it.
* Add $execctl() -- see UPDATES
* EPIC5-2.1.2 released here (Lugibrious) (Commit: 1908)
* Fix count_initial_codepoints() - it couldn't return 0
* This fixes $regmatches() for wcarson
* Add /window delete_kill (rb Harzilein)
* Fix /wait %proc (caf, rb wuf)
* Fix chmod() to not use ancien S_IREAD/S_IWRITE (S_IRUSR) (rb Tilt)
* Support /window -<operation> to pass in NULL to window op
* Seed all window operations with no-op handlers for NULL
* Don't discard DNS results for server until we get to ACTIVE
* Add a stub for $inputctl() -- future expansion.
* Add %{5}S status expando -- the server status (ie, "ACTIVE")
* Signficant refactoring of server.c/server.h
* - Change the term "server status" to 'server state" everywhere
* - Reorganize Server object to show what values are filled in by each state
* - Make all server.c functions static whenever possible
* - Remove all server.c functions not used anywhere
* - Remove all server.h decls not used anywhere
* - Remove unused variables in Server and other structs
* - Remove extern server_list[] and make get_server() an ordinary function
* - Remove extern server_states[] and create get_server_state_str()
* - Document many more things to make it more understandable
* - Drive the determination of "ircop" from your umode, not from a variable
* Add /on server_state to duplicate /on server_status for now
* Support $serverctl(GET x STATE) to duplicate GET STATUS
* More refactoring of server.c/server.h ssl support
* - Remove unused fields and getters/setters
* - Defer all "is this ssl?" questions to the ssl module
* - Rename "is_ssl_enabled()" to "is_fd_ssl_enabled()"
* - Rename "get_server_isssl()" to "get_server_ssl_enabled()"
* - Remove trying to track ssl enablement separately
* - Since openssl has been required for a while, remove "ssl is missing" stuff
* - Avoid setting the server state directly (ie, avoiding /on server_state)
* If something goes wrong in do_server(), just close_server()
  - If a server is connected to a window with more addrs, it'll resurrect
* Add $inputctl(GET|SET CUTBUFFER), manipulate the cut buffer.  See UPDATES
* Fix /load help.irc - point to correct url
* Remove some commented out code before release
* window_next() and window_previous() can accept nulls from SWAP_NEXT_WINDOW
* Add /window unclear -- why did this not exist?
* If a Python callback fails, call the except; if that fails, give up on fd
* /PYDIRECT without args needs a usage message
* Support /timers with /unload (rb zlonix)
* New version of epic.py and shortener.py from skully -- he asked for testing
* Improve the code in vars.c
* - Change 'flags' to 'pending' since that's all it is used for
* - Change $symbolctl() to support both FLAGS and PENDING for the symbols
* - Make get_string_var() return a const ptr so people don't change it
* - Make make_string_var_bydata() take an (IrcVariable) since that's easier
* Crank up the warning flags and start addressing things
* - Add a test in configure for __attribute__((fallthrough))
* - This allows the use of FALLTHROUGH to shut up warnings.
* - Improve a lot of const correctness issues
* - Fix other bogons it pointed out (d'oh!)
* Fix my_ctime() to honor that ctime() can return NULL.
* EPIC5-2.1.3 released here (Redound) (Commit: 1926)
* Fix configure on mac when you do --with-ssl=/path/to/somewhere (rb archon)
* Fix configure for systems where "gcc" is c99-only
* Add "verbose" flag to sanity_check_encoding()
* This is needed in init_encodings() to not output too early. (rb wcarson)
* Don't make a lack of CP437 locale a boot failure (rb wcarson)
* A lot of work was done on configure to support macports better.
* Fix where NSIG was decld in irc_std.h (caf) (rb CE)
* Add /ON CHANNEL_CLAIM and /WINDOW CLAIM (see UPDATES)
* Exempt claimable channels from referential integrity checks
* Add $uuid4(NODASHES) to get uuids without dashes
* $windowctl(GET x UUID) -- every window has a hash-free UUID now
* Allow windows to be reffed by their UUID in /window
* Revamp how channels get claimed (I like this better) to be channel-driven
* Fix get_window_by_desc() (rb Harzilein)
* Migrate configure to autoconf-2.69.
* Round two of getting configure working with 2.69
* Round three of getting configure working with 2.69
* Round four of getting configure working with 2.69
* Get configure to support Python 3.8+
* EPIC5-2.1.5 released here (Fecund) (Commit: 1945)
* Add "ssl_checkhost" field to server descriptions
* Make ssl_startup() require a hostname for ssl hostname checks
* Add ssl_get_checkhost_status() to return ssl hostname check
* Fix a place where we don't check the retval of alloca()
* Remove the "ENCODING" field from server descs which went away long ago
* Ensure "ssl-checkhost" is preserved through serverinfo changes/updates
* Perform hostname checking on ssl server connections and abort if failed
* Change "ssl-checkhost" to "ssl-strict"
* Make ssl strict checking require both the cert and hostname pass muster
* Change ssl_info.ssl_fd to "ssl" to confuse me less
* Check for self-signed certificates and pass it in /on ssl_server_cert
* Add support for getting SANs out of an SSL certificate (rb wcarson)
* Add $serverctl(GET x SSL_STRICT_STATUS)
* Add $serverctl(GET x SSL_SANS)
* Remove $serverctl(GET x SSL_STRICT_STATUS)
* Add /on SERVER_SSL_EVAL (see UPDATES)
* Add /set ACCEPT_INVALID_SSL_CERT (see UPDATES)
* Remove per-server server "strict status" in server desc
* Add "accept_cert" per server, to track whether we accept the ssl cert
* Add $serverctl(GET x SSL_CHECKHOST_RESULT)
* Add $serverctl(GET x SSL_SELF_SIGNED)
* Add $serverctl(GET|SET x SSL_ACCEPT_CERT) (see UPDATES)
* Add /SET SSL_CIPHERS (see UPDATES)
* I forgot to implement the use of /SET SSL_CIPHERS. oops
* I made signficant changes, so the above probably obsolete now
* Create an object (ssl_cert_error) 
* Start tracking *every* ssl cert verification error
* Treat ssl verification errors as tiered problems
* ie, self-signed is not as bad as bad-hostname not as bad as others
* Revamp things like "verify_result", "self_signed", etc to errors
* ie, verify_error, checkhost_error, self_signed_error
* Add a new "other_error" and "most_serious_error"
* Try to emulate the old policy behavior (pending more work)
* I need to document the flow and /on's and /set's in UPDATES
* Change $serverctl()s 
* serverctl change: SSL_VERIFY_RESULT -> SSL_VERIFY_ERROR
* serverctl change: SSL_CHECKHOST_RESULT -> SSL_CHECKHOST_ERROR
* serverctl change: SSL_SELF_SIGNED -> SSL_SELF_SIGNED_ERROR
* serverctl change: new: SSL_OTHER_ERROR
* serverctl change: new: SSL_MOST_SERIOUS_ERROR
* Reorg ssl.c because it was getting too jumbled to follow
* Ensure every function is decld static or is in header file
* Group functions by their subject area
* Only create on (SSL_CTX) for all global use now
* Don't bother pretending we support being an SSL server.
* Create a SSL verification callback that tracks/sorts every error
* This allows us to catch multiple problems (self-signed, bad hostname)
* We see multiple errors on efnet, for example
* Change find_ssl() to get_ssl_info() so its named after data type
* Roll Bad Hostname check into main SSL verification instead of extra step
* (OpenSSL discourages you from doing it as an extra step)
* I need to review /on ssl_server_cert for sanity and document it
* Remove the now superfluous notion of "strict status" checking
* Remove the bogus stubs for #ifndef HAVE_SSL since that's not supported
* Make widening the screen honor /window scrolladj
* Sync all /window operations in tabkey.ce
* Re-sort the /window operations list ("claim" was in the wrong place)
* Document $json_explode(), $json_implode() and $json_error()
* Add winref as $2 in /on channel_lost
* Remove tracking of "cursor window", a thing we haven't supported in 25 years
* Add support for (arglist) {block} statement type
* Add /window clearlevel <levels> (rb zlonix)
* The #define DEFAULT_STATUS_HOLDMODE was different from UPDATES and irregular
* Fix many things clang's static analyzer pointed out.
* Add /on reconnect_required (sb zlonix)
* /WINDOW winref SERVER servref should no-op if it's already that way.
* Add /window clearregex <regex> (rb zlonix)
* When printf()ing (time_t)s, always cast to (intmax_t) and use INTMAX_FORMAT
* When processing CTCPs with a script, don't short out /on ctcp or verbse_ctcp
* Add $serverctl(GET x PADDR) returns the p-addr of a connected server.
* Fix /server + so it correctly rolls over to server 0.
* Add $serverctl(GET x OPEN) [don't forget to document this]
* Set parsing_server_index around server errors so /timers create correctly
* Fix missing else causing all ssl cert's to be accepted
* Add support for tilde-expansion for /set ssl_root_certs_location
* If a server fd does not map to any server, close it.
* Updated version of 'reconnect' from zlonix.
* Convert our bundled test.c to be minimal c99 to avoid warnings
* Don't permit /reconnect on servers that are actively working
* /RECONNECT must not default to the current input window (bah)
* Reconnect script should use /server +refnum, not /reconnect
* Reconnect script should only do /server + on servers with groups
* EPIC5-2.1.6 (1981) (Impignorate) released here
* Add debuglog testing for /window search_back (for fusion)
* Strip all attributes when regex()ing /window search_back
* Fix warnings on mac os x 12 (rb skered)
* Add support for json object arguments ("kwargs")
* Add support for kwargs for $json_implode(): "root", "compact" (rb fusion)
* Add support for tcl8.6 -- run 'make makedepend'
* Remove dead code that was #if 0'd out for a long time.
* Make /pretend object when you're disconnected (rb skered)
* Change panic() to setjmp/longjmp back to main() instead of exit()
* Fix bugs with the new panic stuff.
* Add 'colors' and 'sasl_nistp256' scripts from zlonix
* Fix crash when you switched to AESSHA /encryption (rb zlonix)
* Add configure check for newlocale() for slackware 15 (rb fusion)
* Some CTCPs are "restartable" (encryption types). (rb zlonix)
* Add $serverctl(GET x NEXT_SERVER_IN_GROUP)
* New reconnect script (zlonix)
* Fix $realpath(); the 2d arg to normalize_filename is (Filename) (zlonix)
* Permit /lastlog -file to support ~-expansion (zlonix)
* /ON RECONNECT_REQUIRED only gets thrown when connected!
* Permit status bars on hidden windows to be generated in the ordinary way
* Add /set broken_aixterm for silly emulators that don't support bold+color
* Add ?? binary operator (coalesce), same priority as || ("DOR")
* A /window clear on a notified hidden window requires a full status regen
* Add $serverctl(DONT_CONNECT 1) to trigger the -s command line option
* Add $rgb() function to convert rgbs to 256 color (first try at this)
* Add support for ^[[38;2;r;g;bm (and 48-2) color codes
* Prefix $rgb() with ^X for skered
* Change hardcoded \003 and \030's to macros.
* Add $rgb({...}) and $rgb{#RRGGBB) (see UPDATES)
* EPIC5-2.1.7 (2011) (Cinereous) released here
* Add /set automargin_override (for skered) - always turn on automargins
* De-cruftify the /set automargin_override stuff (rb skered)
* Begin a larger project to transition (Window *) ptrs to winrefs.
* The intention is to make (Window *) a pure data object and not a linked list
* Repair regression with lineno in /set status_update (rb ce)
* Fix /on reconnect_required (doh)
* Continue the work on reducing (Window *)s outside of window.h
* More work (mostly focused on status)
* No more Window ptrs in status.c yay!
* Fix a bug with output going to the wrong window (rb fro, me)
* Fix bug with /window number (rb zlonix)
* Fix %F showing the wrong window refnum (rb zlonix, fro)
* Ensure lookup_window() is always handled for error correctly
* De-cruftify epic's install procedure.  This is for all my pkg friends!
* Remove configure --with-threaded-stdout
* Remove crutches for people without INET6 
* Remove legacy compat for people without getaddrinfo()
* Remove dead #define's in config.h
* Fix /on switch_windows (rb zlonix)
* Add $pledge() and $unveil() for openbsd (zlonix)
* Add a "newlist" type for migrating linked lists to.
* Improve handling of realpath() failures (rb zlonix)
* Make /log on fail (ie, reset to OFF) if the log can't be opened (rb zlonix)
* More improvements to window.c, refactor of /window query
* Several scripting changes by zlonix
* When writing to /log-files, check both refnum and user-refnum (rb zlonix)
* Allow adding window refnums, names, and uuids to /logs, and check them passively
* Fix /log properly showing targets for window-type logs (rb zlonix)
* Fix $winchan(#chan) not returning user refnum (rb zlonix)
* Improvements to sasl script (rb harzelein) (zlonix)
* More changes, moving towards de-listifying the window object
* Type punning project starts here...
* Add check for __attribute__((may_alias)) (gcc and clang)
* Tag all socket types with "may_alias"
* Tag all (List *) types and subtypes with "may_alias"
* List changes:
* - Use C99 union type casts to convert to and from (List *)
* - Create new List macros that use union type casts
* - Convert everything to use the macros instead of base fns
*   - /crypt, /ignore, /bind, /log, /query, 
* Alist (array) changes:
* - Remove (array_item) as a type that can be inherited from
* - Create (array_item_) as a container for a (void *)
* - Change (array) to keep a list of (array_item_s)
* - Change all the alist api's to take these new-style (arrays)
* - Convert notify lists from (NotifyList) to ordinary (array)
* - Migrate the 'ison' field from (NotifyList) out to the (Server)
* - Convert A005 lists from (A005) to ordinary (array)
* - Convert symbol lists from (SymbolSet) to ordinary (array)
* - Convert symbol api from (SymbolSet *) to (array *)
* - Convert nick lists from (NickList) to ordinary (array)
* Type punning project ends here ^^^^^
* Compile with -O2 instead of -O to satisfy pedants
* Begin removing linked list from (Window) type
* - Change window_list to _window_list in screens
* - This revealed every place we were manipulating the list
* - Change macros in input.c to not hardcode 'current_screen'
* - (This required changing INPUT_LINE to INPUT_LINE_ROW)
* - Eliminate hardocded uses of 'last_input_screen' in input.c
* When doing /window number, be sure to clear old refnum! (rb zlonix)
* Add sanity check for direct window lookups
* Have $serverwin() return user refnum not internal refnum (rb ce)
* Fix the sanity check just above (rb ce)
* Re-fix $serverwin() (rb ce)
* Changes to color script (zlonix)
* Add 'stringify.c', a program to convert data to a C string.
* Add support for grabbing configure params in info.c.sh
* Add support for grabbing $CC -v output in info.c.sh
* Add $info(y) and $info(z) (see UPDATES)
* Replace $info(y) and $info(z) with $info(z:*) (see UPDATES)
* Add all this z-stuff to the -v cli
* Use 'id -u -n' instead of LOGNAME in info.c.sh
* Create (union SSu) to capture all (struct sockaddr*) types
* Migrate all internal APIs to use (SSUs) to avoid type punning
* This makes our socket code all c99-compliant.
* Fix typo (reported by ce, fro)
* Fix another typo (reported by ce)
* Fix bogon with /assign output (rb ce)
* Reduce warnings
* Eliminate final warnings with -Wwrite-strings  -W -Wall -Wextra 
  (except -Wno-pointer-sign -Wno-unused -Wno-unused-parameter)
* EPIC5-2.1.8 (2052 - Decoupage) released here
* EPIC5-2.1.9 (2053 - Decoupage) released here
* Eliminate final warnings with scan-build (clang's static analyzer)
* Eliminate found warnings with clang's undefined behavior checker
* Remediate the rest of clang's static analyzer's findings.
* Fix slurp_elf_file() (rb fro)
* Change SIZE_T_MAX to SIZE_MAX (rb ce)
* Handle dequoting a single quote (detected by ubsan)
* More changes to avoid undefined behavior and zlonix's "impossible bug"
* EPIC5-2.1.10 (2059 - Casuistry) released here
* Always call alists 'alist's instead of 'array's
* Add a #define UINTMAX_HEX_FORMAT for pointers
* Change (List)s to have a data pointer rather than inheritance
* This removes a major remaining type punning issue
* Remove '_window_list_end' from screens.  Determine it on the fly.
* Add get_screen_bottom_window() to replace '_window_list_end'
* Change (Crypt) from a (List) type to a data object for List
* Change various crypt.c functions to take a straight (List).
* Change various crypt.c functions to create and store a (Crypt) in (List)
* Make (WNickList) private to window.c, use ordinary (List)s ordinarily
* Change window's 'waiting_chans' and 'nicks' ordinary (List)s
* Add ARAs - "automatically resizable arrays"; directly addressable arrays
* Comment out bucket_(var|cmd)_alias and bucket_builtin_* to avoid warnings
* Except bucket_builtin_variables() which is the only one actually used!
* Convert (Ignore) from a (List) type to a data object for List
* If a panic() happens during shutdown, then just go ahead and exit.
* Convert (Binding) from a (List) type to a data object for List
* Convert (Logfile) to use a plain old (List) to hold target names.
* Rename 'invislble_list' to '_invisible_list' for future deprecation
* Make everything using invisible list go through a function.
* Split 'delete_window' into 'unlink_window' and 'delete_window_contents'
* And make those two take refnums instead of a window ptr.
* /fe ("" .) foo {echo $foo} with /xdebug dword (rb ce)
* Fix /window swap_others (skered)
* Un-break $unveil() with no arguments (rb zlonix)
* Remove configure checks for sysctlbyname(), <sys/sysctl.h>
* Fix warnings from raspbian (rb zlonix)
* Don't include <sys/syctl.h> (not used) (rb zlonix)
* Do #define _GNU_SOURCE 1 for slackware (BAH!)
* Begin untangling the "signed pointer mess"
* Generally this means:
* - (char *), not (unsigned char *) is the "generic type" in C params
* - Pointer parameters have to have *equivalent* types, not just *compatible* types.
* - The type of "a bunch of bytes" is always (char *), not (unsigned char *)
*   - Even though (char *) is not 8 bit clean.
* - Type type of literals is always (char *), not (unsigned char *)
* - So don't use (unsigned char *) for params unless the thing is NOT a BoBs.
* - So DO use (char *) and cast it on both sides of the call.
* - Don't have (const unsigned char **) params to modify a pointer
*   - Prefer (const unsigned char *) and return a (ptrdiff_t)
* Change (Crypt) 'passwd' to unsigned because OpenSSL wants it that way.
* Eliminate all warnings from -Wpointer-sign 
* - Mostly by eliminating nearly all uses of (unsigned char *)
* Eliminate all warnings from -Wunused
* - But not from -Wno-unused-functions or -Wno-unused-parameter
* Remove many spurious casts to and from (void *) (c99-ism)
* Fix warnings found by wider testing
* EPIC5-2.1.11 (2071 - Adynaton) released here
* Replace the historical (u_32int_t) with the c99 (uint32_t)
* Remove the now-unused 'hash' field in alist data items 
* Remove accommodations for the long gone Interix system
* Don't hide __A() and __N() from clang, which supports them just fine
* We don't need to cover for systems that don't have memmove()
* We should cast the retval of alloca() within LOCAL_COPY().
* Stop redefinining NULL
* Remove #ifdef HAVE_SSL and HAVE_ICONV since they're mandatory now
* Build 'stringify' using $< and $@ (for separate builds) (rb zlonix)
* Remove the c99 macro shims for (List) and rationalize the API
* Remove the use of c99 macro shim "MAY_ALIAS" since it's untrue now
* Move "reconnect.orig" to "reconnect.old" (rb zlonix)
* get_server_protocol_state() can return -1 -- handle properly (rb zlonix)
* Guard bogons in set_server_protocol_state()
* Have info.c.sh.in use @builddir@ instead of @srcdir@ (zlonix)
* Add add_item_to_list() for List management, fix callers
* Don't let user create too many windows (rb ce)
* Fix configure check for raspberry pis with bad python (rb zlonix)
* Fix window refnum bogon (rb zlonix)
* EPIC5-2.1.12 (2078 - Secondment) released here
* When doing target searches, don't require global targets to have server
* Fix /query, particularly for dcc chats (rb fudd)
* Fix a null deref found by clang static checker (it was unused code)
* Fix widening when window is /clear and /window scrolladj off (rb skered)
* More conversions of (Window *) to int refnums
* Now the (Window) refers to its neighbors through int's! Huzzah!
* Now Screen's window list holds just an int to the head!
* Now the invisible list is just an int to refer to the head!
* This means we don't need to expose (Window) to #include "window.h"
* Add $ctcpctl(SET x ACTIVE 0|1), $ctcpctl([IN]ACTIVE)
* Add /ctcp_cloak and /ctcp_uncloak to /load ctcp (rb zlonix)
* Remove size limits on $repeat (rb ce)
* Fix CTCP CLIENTINFO (x) (rb zlonix)
* Fix swap_window()  (rb fro, zlonix)
* Make _invisible_list an int and not a pointer. yay!
* Fix bug with /server showing p-addrs on connect (rb zlonix, skered)
* Continue converting internal window.c functions to refnums
* More conversions of internal window.c functions to refnums
* Complete conversion of internal functions from (Window *) to (int). Yay!
* Create screen restful api (well, the getters at least)
* Sunset global "Screen *screen_list" in favor of get_screen_by_refnum()
* Make everything that used (Screen *) use int refnums (except windows)
* Don't have dequoter() take clue, was causing ub (sorry, ce) (rb zlonix)
* Fix screen->last_window_refnum, was wrong type (rb zlonix)
* Fix /window clearlevel (need to normalize window refnums) (rb zlonix)
* Fix ub with utf-8 detection for non-utf8 console users.
* Revert dequoter() changes above (rb zlonix, ce)
* Fix ub with decryption (rb zlonix) [this code makes me nervous]
* Try a gentler fix for the ub in dequoter()
* Add the "clear_point" per-window where you last did a /clear
* When moving the "top of scrolling" around, honor the clear_point
* The /unclear command will ignore the clear_point (backwards compatible)
* The /unclear -noforce flag will honor the clear_point
* Fix ub when decoding base64 data with invalid characters
* Add /xdebug sequence_points and %{2}P and /set status_sequence_point
* Also, $sequence_point().  This is all an easter egg.
* Create notion of "Window Attachments", that belong to the screen
* Create screen-focused API to manage "window attachments" (window list)
* In the meantime, change (Window)->_next and ->_prev to ->_next_ and ->_prev_
* Sanity check the window-based window list from the screen-based window list
* Fix bug with 'clearpoint' (rb zlonix)
* Updated reconnect script (zlonix)
* Finalize replacement of (Screen *) with (int) refnums.
* Move Screen definition inside screen.c. Yay!
* Remove unused ANSIFLAGS from Makefile
* Add $tags(), support for CAP tags (zlonix)
* Add script for CAP negotitation (zlonix)
* Add "cert" field for server descs (client-side SSL certs) (rb tjh)
* Add ability to specify client-side cert for SSL (generally)
* Move Window definition inside window.c YAY~!
* Add dont_need_lastlog_item() so windows can repudiate lastlog items
* Make /window flush_scrollback repudiate lastlog items
* That way rebuilding the scrollback doesn't make flushed things re-appear
* Fixes to above (rb zlonix)
* Fixes/improvements from zlonix for the above
* Fix handling CAP multi-prefix (rb zlonix)
* Use ctime_r() [c99] instead of ctime() [c90]
* Add /clearignore in 2.8script (rb sobriquet)
* Begin a project to clean up message_from() in dcc [sb Harz]
* Handle /redirect /cmd better so it behaves sensibly.
* Expand the range of unicode 6 emojis (from 1f5ff to 1f6ff)
* Add /on ping (rb skered)
* Fix the addition of 'git_commit' to handle releases (rb zlonix)
* Update to 'colors' script (zlonix)
* Fix /window create (rb fusion); fix ub in wserv.c
* Have configure check for crypt()
* Adapt and regenerate configure to use autoconf-2.71 (sigh)
* Make $crypt() return empty if no crypt() [rb Tilt]
* In /load history, ^U should use erase_line not reset_line. (rb fusion)
* Add /set blank_line_indicator (rb harz) -- see UPDATES
* Add $symbolctl(GET <varname> 0 BUILTIN_VARIABLE ORIG_DATA) (very much WIP!)
* Don't have configure check for <sys/fcntl.h> (sigh)
* Don't use inline expandos ($L) in /load history -- use $builtin_expand()
* When /set status_does_expandos, double-quote the injected text (rb fudd, lw)
* Fix bogus use of * in on send_public in builtins (rb lw)
* Fix antiquated/bogus use of dword in /load country
* Add make uninstall, which does its best  (rb skered)
* Rewrite /disconnect|reconnect so it behaves more reasonably (i hope) (rb CE)
* Fix a bogon with new STATUS_DOES_EXPANDOS stuff (rb wcarson)
* Add $windowctl(GET x CURRENT_CHANNEL) returns a window's current channel
* Fix where first char of continued lines didn't have attributes (rb skered)
   /eval echo $chr(3)53$repeat(500 .) for example
* Remove a debug statement harz found with /window channel
* Make window toplines honor /set automargin_override.
* Use gcc13 -fanalyzer and clang-devel scan-build (static analyzers)
* The following changes were directed by the static analyzer
* Check/use -fno-delete-null-pointer-checks in configure
* Fix pop_integer() to return correct type
* Use fseek() instead of rewind() so clang doesn't complain about errno
* Don't check a pointer after using it so as to not offend gcc13
* If you pass no args to $unshift() or $push(), get nothing back
* Fix uninitialized clue in $currchans() [this was an actual bug]
* Strip down $globi() so I can fix static analysis complaints
* Fix uninitialized variable in $hookctl() [this was an actual bug]
* Don't just assume open() doesn't fail in opento() [actual bug]
* ifdef out split_message() and friends because i don't understand
    what gcc13 is complaining about there and I don't use it
* Oh, you get the idea.  more of the same as above
* Add /window lister "refnums" (see UPDATES)
* Explore writing output using fd's rather than (FILE *)s
* Add /set auto_reconnect_delay to reconnect (skered)
* Update cJSON to a more recent version (upstream)
* Everything below is part of the RGB project.
* Change name of "256 colors" to "extended colors" to encompass RGB
* Stop hardcoding the value of internal Attribute, so it can grow later.
* Introduce the concept of "Unified Color Values" which will grow later.
  - The idea is to unify all the different number system into one 32 bit int
* Extend attributes to support 32 bit fg and bg ints
* Change the name "display attributes" to "internal attributes" for clarity
* Make sure to match up internal attributes reader and writer
* Change the name "logical attributes" to "ircii attributes", reader, writer
* Modify term_attribute() to hardcode how colors are output (for now)
* Change 'prepare_display2' to 'prepare_display_fixed_size' which is clearer
* Add $hex(<digits> <number>) which converts <number> to <digits> hex digits
* Support ^X#rrggbb,rrggbb to take RGB codes (yay! \o/)
* Change the ^[[38;2;r;g;b grokker to output RGB codes instead of 256 colors
* Change $rgb() to output RGB codes now (yay! \o/)
* Lots of internal changes to support larger Attributes, color spaces
* The above is the RGB project's first pass.  Here goes nothing!
* Fix colors not showing on topline in p_d_f_s() (rb fusion)
* Revamp ^C handling to use 256 x-colors. (yay! \o/)
* Some compilers like it when you put parens around macro params (rb fusion)
* Make the ^C color xlate table absolute (so we can use RGB later)
* Fix brain-o (rb fro)
* Make prepare_display() tolerate longer lines without going haywire.
* Don't make /set output_rewrite subject to hard size limits.
* Remove length limit on physical lines of display
* Refactor double_quote() so I can fix rogue \s on the status bar
* Add support for bg colors in $rgb(), see UPDATES
* Fix more suggestions from the nitpickers in gcc and clang
* Fix $rgb() [rb wcarson, fusion]
* EPIC5-2.1.13 (2125 - Sockdolager) released here
* ^C16 was defined and was used by lice.  sigh. (rb tjh)
* Toplines were one column too narrow (rb fusion)
* Very rudimentary support for CAP multi-prefix. more to come!
* Fix /load files
* Include new script, /load epiclogo -- a nice easter egg. :)
* Change /exec so it's fully line buffered.  This fixes /exec cat.
* Stop using "inline", since the compiler does what it wants anyways.
* Roll back the CAP support, it inteferes with the SASL script (rb skered)
* Below is the "Spring Cleaning 2024" project
* Sunset flood detection and its attendant features (see UPDATES)
* Sunset the "clue" stuff
* Sunset the "alloc tracking" stuff
* Sunset the "delayed free" stuff
* Differentiate between "quoting" ("") and "escaping" (\)
* Below is the "ircaux.c reorg" sub-project
* Categorize and sort all function decls in ircaux.h
* Review each function; GC unused functions; collapse dupes
* Comment functions to force analysis of behavior, fix bogons
* Fix normalize_filename() (rb skered, foo, fudd)
* Fix off-by-one (too short) error in dequoter() [rb fudd,lw]
* Add support for OpenSSL's RAND_bytes() API
* Stop doing all the other legacy PRNGs.
* Sunset arc4random() support, particularly the builtin stuff
* Regen autoconf with 2.72, because a 1 line change causes 125k diff!
* Fix various complaints from gcc and clang's static analyzers
* Refactor upper()/lower() to a new strmap() to reduce dup code
* Rationalize and comment stristr() and rstristr()
* Random numbers now always use openssl -- /set random_source is ignored
* Fix "long topline can be longer than status bar" (rb fusion)
* Sunset support for socks[45], including "socks5p.h"
* Stop checking for any using <ieeefp.h> unless someone can explain why not
* Sunset support for systems without job control (!!)
* Various minor ircaux.c cleanups, nothing user-facing
* EPIC5-2.2 (2135 - Sedulous) released here
* Fix /xecho -b (rb fudd)
* EPIC5-2.4 (2136 - Sedulous) released here
* Fix malloc_strcat_word()
* EPIC5-2.6 (2137 - Sedulous) released here
* Fix binary to hex encoding 
* EPIC5-3.0 (2139 - Brigadoon) released here
* Add circuit breaker if recalculate_windows gets jammed (rb Tilt)
* Fix two memory leaks; one major, one minor (thanks, valgrind!)
* Fix more memory leaks (thanks, valgrind)
* EPIC5-3.0.1 (2143 - Corrigendum) released here
* Don't disable padding for encryption/decryption (zlonix)
* Regex problems: Extended regexes don't support backrefs (boo!)
* Regex improvements: Use REG_ENHANCED for mac os x (wcarson)
* Regex improvements: Use -lregex for freebsd
* Add /1 /2 /3 ... aliases to /load altchan for window switch (zlonix)
* Use $levelctl(LEVELS) instead of list in /load tabkey.ce (zlonix)
* Updates to /load colors (zlonix)
* Updates to tabkey.jm (skered)
* GLOB_QUOTE does not actually exist
* Change notion of "away" to "away_message" [see UPDATES]
* Add notion of "away status" and $serverctl(GET x AWAY_STATUS)
* Add /exec -exit {} (rb fusion) [see UPDATES]
* Connecting to port 6697 now always forces SSL.  So there.
* If a server connection fails w/o data, it might be an SSL server
* In a server desc, a + before a port means "do ssl" like other clients support.
* EPIC5-3.0.2 (2154 - Peregrination) released here 12/2/2024
* Backport the fix for /eval echo $rgb(#2C4267)#derp from epic6.
* Fix/rewrite $uname(), (rb sob)
* EPIC5-3.0.3 (2157 - Obturation) released here 2/27/2025
