TinyMUX 2.7: CHANGES Last Update: December 2009 Major changes that may affect performance and require softcode tweaks: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- Added mux_string and fixed many functions including EDIT(), EXTRACT(), REVERSE(), SQUISH(), WORDPOS(), and DELETE() (Issues 14, 25, 52, 98, 100, and 232). Thanks Jake and Alierak. -- Added Unicode support with the database using UTF-8 and supporting ASCII, ISO 8859-1, and UTF-8 clients. Earlier mail, comsys, and flatfiles versions are converted. -- NOACCENTS flag renamed to ASCII and used to force an ASCII encoding for clients which do not properly negotiate or alternatively, out of preference. -- UNICODE flag added to force a UTF-8 encoding for clients which support UTF-8 but do not negotiate it. -- Added CHARSET and NEW-ENVIRON telnet negotiations which may affect clients. -- Add SSL encryption support including ssl_certificate_file, port_ssl, ssl_certificate_key, and ssl_certificate_password configuration options. This is enabled with --enable-ssl. -- Add Telnet option STARTTLS to support secure connections. This is enabled with --enable-ssl. -- Added infrastructure for dynamically-loadable modules that can be provided by netmux, loaded by netmux, provided by a separate slavestub, or loaded by slavestub. Feature Additions: ~~~~~~~~~~~~~~~~~ -- Support optional action list with @break. Add corresponding @assert command. (Issue 36). -- Help files support PennMUSH-style multiple topics for each help entry; consecutive &FOO lines refer to the same content (Issue 238). Thanks Alierak. -- Added LPAD(), CPAD(), and RPAD() functions to duplicate previous non-truncating LJUST(), CENTER(), and RJUST() functionality (Issue 13). Thanks Jake. -- Added /delete switch to @function and allow removal of user-defined functions (Issue 250). Thanks Jake. -- Added fifth, sort-type argument to SETINTER(), SETUNION(), and SETDIFF() (Issue 3). -- Added @comjoin, @comleave, @comon, and @comoff for use with channel objects. Each evaluates to a message shown to the channel member at the corresponding event (Issue 9). -- Added TR() function to allow transforming strings according to a specified pattern (Issue 262). Thanks Jake. -- REVWORDS() now accepts multi-character input and output delimiters (Issue 21). Thanks Jake. -- Use mux_string in SCRAMBLE() and SECURE() to avoid stripping ANSI. -- Added PennMUSH-compatible TERMINFO() to allow softcode access to the client's capabilities. -- Separated inline SQL supprt from Firan support so that it can be enabled separately. -- Feature complete for UTF-8 string layer. -- Turned on private use code points for Tengwar and Klingon even though these code point assignments are not official. -- Added @eval command. -- Support Unicode in filenames on Unix and Win32. -- Allow @hook to work on exits, enter aliases, and leave aliases. (Issue 235) -- Provide CLog module interface from netmux. -- Pass log file sub-direction, LOGDIR, option in mux.config (and muxconfig.vbs) through as a command-line option. -- Add pOuterUnknown parameter to CreateInstance to allow aggregation to be used later. The proxy for marshalling appears to require it. -- Add moniker (%k) substitution (Issue 350). -- Add config option for initial parents (Issue 48). -- Add restarttime(), restartsecs(), and restarts() (Issue 346). -- Add channel timestamps (Issue 20). -- Add @clist/full pattern matching (Issue 53). -- Add destroy() side-effect function (Issue 19). -- Add multi-whisper and last whisper (Issue 18 and 28). -- Sort @malias/list. -- Add third argument to tel() (Issue 153). -- Add @folder and update @mail/list for mail folders (Issue 256). -- Add CServerEventsSource, IServerEventsControl, and IServerEventsSink so modules can catch server events. -- Add crash_message configuration option (Issue 223). -- Add channel @saystring and @speechmod (Issue 67). -- Add lastcreate() per Issue #187. -- Add @adestroy per Issue #34. -- Add name references -- @reference per Issue 202. -- Add @aparent per Issue #17. -- Add @acreate per Issue #389. -- Add @list modules. -- Add module configuration option. -- Add help_executor configuration option per Issue #31. -- Increase maximum comsys alias length from 5 to 15. -- Add CQueryServer, CQueryClient, IQueryControl, and IQuerySink to support AsyncSQL. -- Add more library and module checking to libmux. -- Add mux_UnmarshalInterface() call to libmux. -- Add ShutdownSlave method to ISlaveControl. -- Add sqlslave and sqlproxy modules for AsyncSQL. -- Add chanobj() per issue 401. -- Add function_name configuration option to rename hardcoded functions. -- Add @hook/args to allow arguments to be hooked. -- Extend %=<> subtitution to take integer values which allow softcode access to all 100 arguments. -- Add %+ substitution to return number of arguments. -- Allow @notify/all/quiet (Issue 427). -- Add wipe() (Issue 421). -- Do not display MOTD/WIZMOTD unless @motd/@wizmotd is set. -- Add support for BINARY telnet option. -- Accept U+201C as the Unicode version of double quote command. -- Add dark and hidden permissions to flag_access parameter to make the flag #1 viewable or wizard-only, respectively. -- Update dbpuller to recognize raw ANSI sequences and raw color code points and turn into %x-subsitutions. -- Add @query, rserror(), rsnext(), rsprev(), rsrelease(), rsrec(), rsrecnext(), rsrecprev(), and rsrows() to provide access to asyncronous SQL. -- Add attr_name_charset, exit_name_charset, player_name_charset, thing_name_charset, and room_name_charset to optionally restrict the corresponding names to subsets of Unicode. -- Add VisibleLock (Issue 332). -- Add substitution (%i) equivalent to itext(). -- Ignore leading and trailing spaces in parse_dbref() (Issue 451). -- Allow ISO 8859-2 accented letters in attribute names, object names, and player names. -- Add iso8559-2 and latin-2 charset restrictions. -- Convert vertical quotes to directional quotes and hyphen drawing to en dashes (Issue 473). -- Update Unicode tables. -- Expose mailsubj() and mailsize() in the stock build. Bug Fixes: ~~~~~~~~~ -- INFO should show 'Patches' or 'INFO 1', but not both (Issue 236). -- @dolist and @trig were not passing TRACE bit through (Issue 237). -- Using \ as a shortcut to @emit no longer causes the beginning of the message to be escaped (Issue 219). Thanks Alierak. -- @verb/no_name used unterminated verb_sw table (Issued 243). Thanks Jake. -- Guest objects left DARK through announcement code (Issue 244). -- @wall evaluated a speechmod before processing the message (Issue 16). Thanks Jake. -- @wall's switches did not interact properly (Issue 30). Thanks Jake. -- Corrected error messages for failed guest logins (Issue 246). -- @function did not strip ansi from or properly truncate user-defined function names. (Issue 249). Thanks Jake. -- Fix typo in do_say() which left a bit-wise instead of a logical AND operation (Issue 245). -- Fix SORT(2 100) --> '100 2' bug introduced in 2.7.0.1 (Issue 251). -- Fix trailing padding in CENTER() (Issue 253). -- mid(abc,-1,2) now returns a, not ab. mid(abc,1,-2) now returns ab, not a. This is the documented behavior. -- wordpos() did not strip ansi before counting characters. -- Fix signed / unsigned warning in dump_info() (Issue 276). -- Corrected minor typo in @comon section of help.txt. (Issue 275) -- Restore newline skipping in wrap(), broken in 2.7.0.2 (Issue 278). -- Fix potential buffer overflow in ladd() (Issue 282). Thanks Jake. -- Use %p printf format for pointer to avoid compiler warning about truncating a potentially 64-bit quantity. -- Restore newline skipping in wrap(), broken in 2.7.0.2 (Issue 278). -- Fix line-duplication bug in wrap(), broken in 2.7.0.2 (Issue 286). -- Fix tab expansion in wrap(). -- Fixed memory leak in scheduler because of running out of memory. -- Fixed non-player object's ability to hold coins. -- Fixed loading of coins from flatfile (i.e., across @restart for memory-based) (Issue 224). -- Fix Firan build break in fun_trigger() (Issue 288). -- Fixed +glance softcode in SGP minimal database (Issue 291). -- Fix memory leak in @mail error code path. -- Fix memory leak in process_cmdent(). -- Allow Intel's EMT64 compiler to build the sources (Issue 308). -- Fix 'think [search(eval=hasattr(##,foo))]' by clearing the []-ness from causing mux_exec() to complain about 'eval=hasattr()' not being a function. -- v3 comtitles were not being converted to v4 color code points. -- Fix type-punning bug in mux_fpclass() that broke when compiled with gcc 4.1 or later with -O2 (which turns on -fstrict-aliasing) (Issue 322). -- Fix hang in MUNGE() if given zero words (Issues 324). -- Fix output bug in lflags, where no space was output between the first two flag names. (Issue 323) -- Fix various @restart scenarios between SSL and non-SSL and from 2.6 to 2.7. -- Rework SSL/TLS engine to use a TLS-specific context for STARTTLS, rather than reusing the SSLv3 context. -- Properly terminate uses of mux_exec(). Most of these are protected by EV_TOP or something else. -- Attempt to make modules work on OS X (Darwin). -- CLogFile::AppendLog() does not actually position log at end of existing log file. Net result is only that first two lines (Containing to INI/LOAD entries) are lost. -- ConvertToUTF8() converted code points above 0x10000 incorrectly. -- Allow %= to support single-letter attribute names and document. Issue 341. -- Fix escape() which used #92 instead of backslash (Issue 353). -- Fix WIDTH() to default to 78 instead of 24 (Issue 354). -- Open permissions on WIDTH() and HEIGHT() (Issue 356). -- Fix special characters in names with @decompile (Issue 292). -- Add no_name to HASFLAG() list (Issue 360). -- Fix the attribute flag names returned by lflags() (Issue 362). -- Add missing attribute flag names to @set2 topic (Issue 361). -- Fix LOG_DIR across @restarts (Issue 46). -- Drop dependency on QueryPerformanceCounter() (Issue 369). -- Fix channel timestamps (Issue 370). -- The flag_access configuration handler would SIGSEGV if a flagname was given without a list of permissions. -- The power_alias and flag_alias configuration handlers would SIGSEGV if flagname and alias were not both given. -- Fix 2.7 regression in command/argument splitting in do_command for logged out commands. -- Fix conversion of ANSI sequences containing semi-colons. -- Use moniker in did_it() to show moniker with osucc and odrop. -- Fix corruption issue with MakeCanonicalExitName() using UTF-8. -- Fix unchecked malloc() in SendSb(). -- Object type of guest wiped with type from guest_char (Issue 390). -- Fix out-of-bounds array access while updating newobjs (Issue 396). -- Fixed endless loop in mux_string::transform() via tr(). -- Fix regression from Issue 219 so that '; test' produces ' test' (Issue 351). -- Fix --enable-deprecated build (Issue 397). -- Pass reality level descriptions through @descformat (Issue 59). -- Fix regression (r1355) which allowed an endless loop (Issue 403). -- Fix buffer overflow with %=<> substitution (Issue 406). -- Fix TR() to support UTF-8 sequences (Issue 305). -- @notify/quiet behaved like @notify/all (Issue 426). Reported by Barton. -- Fix bug in mux_string::replace_Char() that left some color state uninitialized (Issue 424). Reported by Loki. -- Fix comma handling in SGP places code for join, ojoin, depart, and odepart (Issue 391). -- Change all notify() to raw_notify() in mail.cpp (Issue 314). -- Remove references to unimplemented wiz_always_real (Issue 398). -- grepi() failed to find patterns composed of both upper-case and lower-case versions of the same letter (Issue 425). -- @notify/quiet behaved like @notify/all (Issue 426). -- Fix @name to handle re-@naming between different UTF-8 cases (Issue 333). -- Fix off-by-one error in whisper (Issue 436). -- Improve ValidateConfigurationDbrefs() to prevent player_starting_room and similar dbref configuration options from refering to NOTHING (Issue 441). -- TruncateToBuffer() mis-handled trailing color (Issue 444). -- Enable UTF-8 regular expressions in PCRE. -- ListMailInFolder() improperly handled the default folder. -- Handle unsupported flatfile versions more gracefully. -- Merge() compared byte length instead of code point count (Issue 448). -- %va was truncating UTF-8 sequences improperly (Issue 450). -- The decision to truncate in replace_Chars() should be made on bytes alone. -- Fix translate to not translate isolated spaces to %b (Issue 452). -- Update secure() and escape() help topic to agree with implementation. -- Fix escape()'s Unicode behavior. -- : followed by space to behave like semipose. -- Fix ordering in do_pemit_whisper (Issue 454). -- Fix v() so that v(10) through v(99) works like %=<10> through %=<99>. -- Fix interaction between @notify and @destroy (Issue 435). -- Fix two lbuf leaks in channel @saystring and @speechmod. -- Free lbuf allocated in do_pemit_whisper() (Issue 471). -- Fix that 'player_name_spaces no' would not validate any player name. -- Fix AUDIBLE with @prefix where color from @prefix appeared elsewhere (Issue 470). -- Fixed VC2005 build warnings that an inner definition was hiding an outer one in TruncateToBuffer(). -- Add try/catch around throwing new in fun_scramble(), fun_shuffle(), linewrap_general(), fun_before(), fun_after(), fun_escape(), fun_secure(), fun_remove(), fun_insert(), fun_lpos(), and fun_shuffle(). -- Fix new/delete bug in linewrap_general() introduced in 2.7.1.18. -- @email and sql no longer require --enable-firanmux. SQL can be turned on with --enable-inlinesql or --enable-stubslave. -- Add try/catch around throwing new in fun_columns(), fun_strtrunc(), fun_elements(), fun_pickrand(), fun_last(), fun_foreach(), fun_extract, fun_revwords(), fun_trim, fun_strip(), transform_range(). -- Fix handling of folder name upper-casing (Issue 416). -- Fix several problems with @reference (Issue 491). -- Add 'page ...=: ...' case. -- Help does not match behavior of mail(, ) (Issue 477). -- Fixed SIGSEGV crashing bug in edit() (Issue 493). -- Fix buffer overwrite bug in eval.cpp (Issue 495). -- Remove incorrect return path from MakeCanonicalExitName(). -- Allow color in first exit segment even if exit_name_charset is ASCII (Issue 497). -- The terminfo() topic described permissions incompletely. -- @alias doesn't allow case-only changes (Issue 500). -- Fix typo in orflags() topic (Issue 504). -- Fix parser's handling of open curly braces (Issue 506). -- Test MEMALLOC() return value in mguests.cpp (Issue 505). -- Updated the rsrec, rsrecnext and rsrecprev helpfiles to mention delimiters. Updated the SQL file to cover both inline and stubslave SQL. -- Down-convert double-quotes and single-quotes to ASCII vertical quotes (Issue 508). -- Make trigger() act like @trigger/quiet (Issue 507). -- Eliminate cases of uninitialized Color States (Issue 511). -- Fix whisper to cause error messages to preceed other notifications (Issue 456). -- Whisper with no message or recipients (Issue 510). -- Exits could be teleported to JUMP_OK locations (Issue 518). -- Fix warning about possible uninitialized variable. -- In a (Copy, Move), if we are trimming a Copy down, the Move should be zero. We were writing beyond the end of the buffer (Issue 517). -- @toad wasn't deleting the right name. -- Fix @name and @alias to prevent them from stepping on each other's names (Issue 516). -- Fix comlist command to show all of longest possible alias. -- Fix %i from reaching beyond buffer. -- Fix crashbug in sqlslave module when MySQL returns NULL pointer in field. -- Fix edge case in ljust(), center(), lpad(), and cpad() (Issue 527). -- Fix remaining open issues with merge() (Issue 447, 449). -- Fix @pemit (and friends) to remove duplicates matches (Issue 499). -- Fix wrap() from leaving a leading space on second line (Issue 479). -- Fix isword() to accept a single %b (Issue 532). -- Fix wrap() from advancing over first letter in line (Issue 533). -- Set MYSQL_OPT_RECONNECT and MYSQL_SET_CHARSET_NAME options. -- Fix ./configure --with-mysql-libs and --with-mysql-include interaction --enable-stubslave on FreeBSD. -- Fix case of edit() leaving ColorState uninitialized (Issue 537). -- Change m_database to mush_database to fix broken --enable-inlinesql build. -- Fix padding in SHA1_Final() for data 9 bytes shorter than a multiple of 64 (Issue 544). -- Fix test cases affected by Issue 544. -- Fix color regression from 2.6 that affects ljust(), rjust(), and center() (Issue 541). -- A notify() call should be raw_notify() instead. -- Don't strip MSG_SAYPOSE or MSG_OOC when forwarding messages to contents, exits, etc. -- Remove UTF-8 color codepoints from @hook report as printf("%-30.30s") leaves this misaligned. -- Revert @hook report back to 2.6 appearance. -- Fix @mail folders (Issue 560). -- Option table was defined one element too large. -- On 64-bit FreeBSD, '@list process' showed negative values. -- Fix use of unitialized memory in mux_strlwr(), mux_strupr(), and mux_foldpunc() (Issue 562). -- Started fixing Issue 555 by including punctuation-folding tables. -- Visible Lock not treated as such by lock() and elock() (Issue 570). -- Add boundary to avoid crash with v(-1) (Issue 580). -- In CONFIGURATION readme, use starting_pay and find_money_chance instead of paystart and payfind (Issue #589). -- Fix wild1() to handle ? with Color and Unicode (Issue 590). -- Fix @dolist help topic (Issue 593). -- Removed run-time dependency on libguide40.dll (Issue 594). -- Fix behavior of insert(,1,Apple,|) (Issue #598). -- Change reference to no_program which should be no_command. -- Topic reference should be to 'regexp syntax'. -- Fix typo in substitutions3 (Issue 605). -- Fix typoe on help @lock compound (Issue 606). -- Non-player objects can own channels (Issue 565). -- ./Backup script didn't work on OS X (Issue 604). -- Clarify use of see_all @power (Issue 584). -- Fix one case of #elif without a condition. -- Look for MySQL in /usr/local if it isn't found elsewhere (Issue 612). -- Throttle use of @reference (Issue 587). Performance Enhancements: ~~~~~~~~~~~~~~~~~~~~~~~~ -- Help entries use less memory (specific improvements described in Issue 238 comments). Thanks Alierak. -- MUNGE() translates results through a hash table instead of repeated linear searching (Issue 247). Thanks Alierak and Ian. -- VMAG(), VUNIT, and SHUFFLE() only need LBUF_SIZE/2 elements instead of LBUF_SIZE elements. -- Prepending a single char to a mux_string no longer copies the string twice (Issue 281). -- Make mux_exec() not check function names that are too long to be valid. -- Prepending a single char to a mux_string no longer copies the string twice (Issue 281). -- Make parse_arglist_lite() and mux_exec() non-destructive. -- Make mux_exec() take a char *pdstr instead of char **dstr. -- Various things made const and/or consolidated. -- Merge fun_wrap and linewrap_general. -- Update sortby algorithm to minimize comparisons (Issue 22). -- Improve speed of TruncateToBuffer (Issue 433). -- Don't bother constructing message for forward list if there's no forward list to send it to. Cosmetic Changes: ~~~~~~~~~~~~~~~~ -- Added Doxygen file headers (Issue 102). -- Prepend channel header to comsys recall lines (Issue 335). -- Re-work DISTRIBUTIONS read-me. -- Add latin-1 and iso8859-1 names to charset configs. Document default. -- Fix typo in atan() help topic. -- Flag letter 'z' should be OPEN_OK. -- The examples for WIDTH() and HEIGHT() are for 'say' instead of 'think'. Miscellaneous: ~~~~~~~~~~~~~ -- Documented Lbufref and Regref pools in 'wizhelp @list alloc'. Thanks Alierak. -- Documented use of a single backslash as a proper shortcut to @emit (Issue 219). Thanks Alierak. -- Removed unnecessary global pos variable from help.cpp (Issue 265). -- Fixed dangling reference to 'help @version' (Issue 277). -- Corrected documentation of E() and PI() to reflect actual precision (Issue 283). Thanks Jake. -- Document @restart dropping SSL connections up front. -- Document report and move into walkdb.cpp (Issue 293). -- Raised the default function invocation limit to 25,000 and the default function recursion limit to 500 (Issue 357). -- Add alias @haven for @reject. -- Update inzone and zwho help topic. -- Update list of supported platforms. -- Updated @teleport help topic. -- Updated fdepth() help topic. -- Updated graball() help topic. -- Updated if()/ifelse() help topic. -- Updated report help topic. -- Updated @comon help topic. -- Rework autoconf.h, configure.ac, Makefile.in, and friends. -- Provide at least some level of help under set() for usage rather than only refering them to @set. -- Document ancient pose and semipose behavior involving initial spaces. -- Document %=<> addition in SUBSTITUTIONS and V() topics. -- Fix VS 2005 /analyze warnings. -- Fix warnings from gcc 4.2.3 with -Wall. -- Remove ROBBERY topic. -- Combine iter() and parse() help topics since they are the same. -- Move parse() to alias.conf. -- Compact code in fun_shuffle(). -- Approximately re-balance decision tree for percent substitutions. -- Fix false positive warning from VS2005 in pow5mult(). -- Fix false positive warning from VS2005 in Balloc(). -- Add condition for size of small buffer to supress false positive VS2005 warning in ItemToList_AddInteger(). -- Add condition for size of small buffer to supress false positive VS2005 warning in ItemToList_AddInteger64(). -- Supress false positive VS2005 warning in mux_words::set_Control(). -- Fix false positive VS2005 warning in mux_string::strip(). -- Fix false positive VS2005 warning in do_joinchannel() and let it return Out of Memory to enactor failing the join request gracefully. -- Update VS project dependencies. -- Add regmatchi() topic. -- Remove unused use_http configuration option. -- Consolidate error message reporting for @pemit/list (Issue 363). -- Switch to using Visual Studio 2003 and Intel Compiler v10.1. -- Fix build issues within Cygwin. -- Add SHA-1 test vectors. -- Update dependencies used by .mak files. -- Firan is now using 24000-byte buffers. -- Include iso8859-2 value to three other affected configuration options. -- Most of charset_nametab[] options are not unique in the first five characters. -- Remove dead code from mux_string class.