This file lists all changes to the game driver which have a visible impact on its behaviour both towards the mudlib as well as towards the host system. For a detailed list of all changes see the file CHANGELOG. 02-Feb-2003 (Lars Duening) -- Release 3.2.9 - Changed efuns: + add_action(): New flag AA_IMM_ARGS implements the sane NOSPACE handling. + allocate(): Accepts an optional initialisation value and can create multi-dimensional arrays. + ceil(), floor(): Also accept integer argument values. + clones(): If the driver is compiled with DYNAMIC_COSTS, the cost is proportional to the number of objects in the game. + ctime(): Accepts the output of new efun utime() as well. + debug_info(): New argument DINFO_TRACE to return the current or the last error call stack. Argument (DINFO_DATA, DID_MEMORY) also returns the number and size of permanent and clib allocations, the amount of memory allocated and available, and the amount of memory unused (where applicable). Argument (DINFO_DATA, DID_STATUS) also returns the number of destructed objects and the total number of heartbeat calls. Single values of (DINFO_DATA) can be returned instead of the whole array. Argument (DINFO_DUMP, "destructed") creates a dump of all destructed objects, by default in <mudlib>/DEST_OBJ_DUMP. + debug_message(): New second argument determines where to log the message, and if to prepend a timestamp. + deep_copy(): If DYNAMIC_COST is active, the evaluation cost depends on size and nesting depth of copied arrays, structs and mappings. + exec(): If this_interactive() points to one of the involved objects, it is switched over as well, like this_player(). + filter(), map(), sort_array(), walk_mapping(): Protected lvalues (e.g. &(i[0])) are not allowed as callback parameters. + garbage_collection(): An optional filename argument specifies the filename for the next and only the next GC. + get_dir(): New flag GETDIR_PATH to return the full pathnames. + get_type_info(): now returns the bound object for efun, simul-efun and operator closures as well. + inherit_list(): the inherited objects can be returned in a tree reflecting the inheritance structure. Virtual inherits can be returned tagged as such. + input_to(): New option INPUT_PROMPT to specify a prompt for this input_to. + lambda(): Simul efuns with extended varargs weren't compiled correctly. + load_name(), object_name(), program_name(): 0 is now accepted as argument, the efuns returns 0 in that case. + object_info(): OINFO_MEMORY also returns the program flags NO_INHERIT, NO_SHADOW and NO_CLONE, and gives a better account of the memory used for strings and variables. Single values can be returned instead of the whole array. + printf(), sprintf(): A leading zero in the field size will now print only leading zeros and not interfere with the pad string option. + printf(), sprintf(): If an explicite pad string is defined, even if it is space, the efuns won't remove white space before a line end. + printf(), sprintf(): Printing numbers with leading zeroes and a sign character printed the sign in the wrong place. + printf(), sprintf(): When printing closures with %O, the program name for inherited lfun closures is printed as well. + printf(), sprintf(): New format specifier 'Q' act like 'O', but quotes special characters in strings. + printf(), sprintf(): New format modifier '$' implements flush formatting for strings and columns of strings. + printf(), sprintf(): In justified column formatting, when a word is too long to fit on a line by itself and there are at least two characters space left on the current line, the long word is begun immediately. Previously, such long words were always printed on a line of their own. + query_udp_port(), send_udp(): Renamed from query_imp_port() and send_imp(). + query_verb(): Added an optional flag argument to return the verb as given in the add_action() statement. + regexp functions: more compatible with 8-bit characters. + regexp functions: New metacharacters '+' allows to specifiy 'at least one match'. + regreplace(): Accepts a closure to produce the replacement string instead of just a constant string. + regreplace(): Pattern which could match on the empty string matched once too often at string end. + replace_program(): Argument can be omitted if only one inherit exists. + replace_program(): If the object alread has closures bound, the efun will issue a debug_message() and fail, instead of raising a full runtime error. + replace_program(): If the replacement program has virtually inherited variables, it must be the first inherited program. + restore_{object,value}(), save_{object,value}(): Non-lambda closures, symbols and quoted arrays can now be saved and restored. This required a new savefile format, though. + sin(), cos(), tan(), atan(), atan2(), log(), exp(), sqrt(), pow(): Integers are accepted as arguments, too. + sizeof(): Now also returns the length of strings. + terminal_colour(): Colour keys can now be mapped using a closure. The pattern "%%^^" is recognized as second notation for literal "%^" besides "%^%^". + terminal_colour(): In wrapped formatting, when a word is too long to fit on a line by itself and there are at least two characters space left on the current line, the long word is begun immediately. Previously, such long words were always printed on a line of their own. + add_verb(), add_xverb(), efun308(), file_name(), map_array(), filter_array(), filter_mapping(), map_mapping(), m_sizeof(), send_imp(), set_auto_include_string(): Available only if driver is compiled with support for deprecated efuns. - Corrected efuns: + and_bits(), or_bits(), xor_bits(): The bits 5, 11, 17,... were mishandled. + call_out(): In release 3.2.8 lvalues were not allowed as arguments - now they are again. + call_out_info(): Did not return the target object for closure call outs. + call_resolved(): Now accepts a destructed object as second parameter as it should. + copy_file(), rename(): Just return a non-0 value on errors, but don't throw a runtime error. + deep_copy(): Didn't handle quoted arrays properly. + filter(), map(): When used on multi-value mappings, the driver did not recognize when the called closure kept a reference to the array with the values, overwriting the values in the next iteration. + functionlist(): The filter flags didn't really work. + input_to(): The option IGNORE_BANG didn't work. In charmode, !-escapes after the first received data are now recognized. + map() and other efuns taking callbacks arguments: The pattern 'function, object, extra' was parsed such that 'object' became part of the 'extra' arguments. + notify_fail(): When used by an object which is not an undestructed command_giver, this efun no longer leaks memory. + object_info(): The returned OIB_NAME now starts with a '/' in plain mode. + printf(), sprintf(): The formatter "%^" will print "%^", for compatibility with terminal_colour(). + printf(), sprintf(): Column-formatting a string with one newline printed one newline too few if the formatstring didn't end immediately. + printf(), sprintf(): A format instruction '%#=s' is now rejected. + printf(), sprintf(): Max length of a result is now 128 KByte. + printf(), sprintf(): One-line columns ending with a newline now behave like multi-line columns and delay adding the newline until the end of the line and only if no other columns are pending. + printf(), sprintf(): The formatter %O/%Q stumbled over really large arrays and mappings (this was actually a potential crasher). + sscanf(): the format '%s%d' failed to parse 'ab1cd' correctly. + to_string(): Can handle operator closures now. + unquote(): Unquoting symbols no longer adds a quote level. - New efuns: + blueprint(): Return the blueprint object. + copy_bits(): To copy ranges of bitstrings. + db_affected_rows(), db_conv_string(), db_close(), db_connect(), db_exec(), db_fetch(), db_handles(), db_coldefs(), db_insert_id(), db_error(): Optional: mySQL support. + gmtime(), localtime(): Return the time broken up into its constituents. + find_input_to(): Find a pending input_to. + include_list(): Return the files included in a program file. + input_to_info(): Return information about all pending input_to's for a player. + m_add(): To add a new entry to a mapping and assign all values in one go. + md5(): Compute the MD5 message digest for a string. + min(), max(): To select the minimum resp. maximum among a bunch of numbers or strings. + remove_input_to(): Remove a pending input_to. + sgn(): Return the sign of a numeric argument. + unquote(): Remove a quote from a quoted array or symbol. + utime(): Return the current time in microsecond resolution. - Master Object: + receive_udp(): Renamed from receive_imp(). + privilege_violation(): Privilege "send_udp" replaced "send_imp". + valid_trace(): New second argument to receives the argument passed to the efun. + runtime_error(): Receives an extra argument to distinguish between normal runtime errors, and those occuring during a heartbeat. + include_file(), H_INCLUDE_DIRS: The pathnames can now start with leading slashes. + If a master is forced to reload via SIGUSR1, all inherited objects (if any) are reloaded as well. + notify_shutdown(): Is now called too when the driver crashes. In that case it is passed a string denoting the type of crash. + Bugfix: slow_shut_down() was not called with previous_object(), this_player() and this_interactive() being 0. + Bugfix: When reactivating a destructed master, the lfuns inaugurate_master() and reactivate_destructed_master() are found even when static. - Fixed Crashers: + Catching errors with catch() did not work reliably when the driver was compiled with gcc. + Unlucky combinations of heart_beat() definitions or declarations (e.g. private and public inheritance in this order) crashed the driver when the heart_beat() was called. + When creating long value save strings, the driver crashed on corrupted memory. + If the object for a prompt-closure is destructed, the driver could crash under extremely unlucky circumstances. + #define'ing the name of an inline closure was not detected. + Assignments of computed strings sometimes crashed the driver. + Pre-increment or -decrement on an undefined variable, where the result was used in a typechecked context. + Adding a mapping to itself with '+='. + The MAX_MALLOCED limit check was faulty, sometimes allowing the driver to clobber memory. + Tracing active when the control flow changes the current player to a non-interactive object. + Mapping lookups would under rare circumstances return a subtly invalid result, causing random memory reads and clobbered memory. This bug has been in the driver since before 3.2.1@136 (the oldest version I could find). + Allowing adding an action between two objects with no environment. + "stack overflow" runtime errors freed svalues twice. + It was possible to instruct sprintf to format a string as both columns and as a table. sprintf() then formatted it as columns, but any error (like buffer overflow) would crash the driver. + Formatting sprintf("%#9999999999999@s", ({ "bla" }) * 2) clobbered its internal precision information on the first line, and thus crashed on the second. + Remove a couple crashers when handling numbers at the numerical limits. + Using set_this_object() before the simul-efun object was loaded. + Updating the simul-efun object could crash the driver when the update changed the signature of sefuns which had already been used by objects: executing the calls after the update could mess up the interpreter stack or cause it to execute garbage bytecode. + Too long error messages overwrote the stack. + When players were already destructed in notify_shutdown(), the following remove_player() was passed the destructed objects. + If call_other() was implemented by a sefun which required call_other() to be called itself, the compiler generated invalid bytecode. + If a method in a virtual inherit is rendered invisible, but also made available again through a parallel inherit of the same program, the compiler resolved the visible function to the wrong inheritance. + Calling a self-destructing closure from limited(). + Runtime errors in a catch occasionally crashed in the traceback collection. + LPC tracing with lambda closures or call_resolved(). - Language: + New operators '>>>' and '>>>=' for logical right shifts. + New operators '&&=' and '||=' for logical assignments. + New LPC define __LDMUD__ to identify this driver branch. + New LPC defines __VERSION_MAJOR__, __VERSION_MINOR__, __VERSION_MICRO__, __VERSION_PATCH__ expand to the various parts of the driver version. + New LPC define __WIZLIST__ specifies from where the driver read the initial wizlist information. + New LPC defines __INT_MAX__ and __INT_MIN__ give the integer number limits. + New LPC defines __FLOAT_MAX__ and __FLOAT_MIN__ give the float number limits. + Numbers can also be specified as binary patterns with the '0b' prefix, and as octals with the '0o' prefix. + Floating point numbers can now also be specified in the exponential notation, e.g. '3.14E-5'. + Character escape sequences can now specify the character code directly in decimal ('\[1-9]...'), octal ('\0o...'), sedecimal ('\x...' and '\0x...') and binary ('\0b...'). + The operators '++' and '--' can now be used on floats, too. + Closures bound to destructed objects are now treated uniformly like destructed objects and are replaced by 0s where required. + Lfun and variable closures can now be compared with '==' and '!=', and are treated correctly in alist and array operations. + Inline closures inherit the visibility of their defining function. + Experimental: Extended the construct catch() with the keyword 'nolog', which suppresses logging the caught error in the logfiles. It is meant for objects like wizard tools. + It is no longer possible to prematurely end an inline closure function by inserting a free '}'. + Global functions are no longer hidden by local variables. + It is now possible to cast to '(mixed)'. + If operands of different types are given to '?:', the result will have the type 'mixed'. + Integers and floats can now be compared against each other. + Identifier names can use the extended alpha characters from the ISO 8859-1 alphabet. + Experimental: The 'default' statement allows to set a default visibility for variables and functions. It is meant to make the re-engineering of existing code easier. + It is possible to specify multiple pragmas in one '#pragma' directive, separated by comma. + Additions, subtractions and multiplications now check for numeric overflows. + The wildcarded supercall "*":: no longer throws an error if none of the inherited objects defines the called function. + In a for() statement, variables may now be declared without initialisation (e.g. 'for (int i; ...)'). + Definitions of local variables can appear anywhere in a block. The variables are defined from the point of definition onward. + If a value of the wrong type is passed to switch(), the driver no longer throws a runtime error, but instead jumpgs to the default case. + If pragma 'pedantic' is in effect, the compiler warns about calls to undefined functions even if typechecking is off. + The notation ([:<expr>]) can be used to create empty mappings of the given width. + Duplicate inherits of a program on the toplevel raise a warning, resp. an error if pragma 'pedantic' is in effect. + New preprocessor macros __CATCH_EVAL_COST__ and __MASTER_EVAL_COST__ for the corresponding evalcost limits. + If the driver uses the default debug.log file, its (mudlib) name is available in the predefined macro __DEBUG_LOG__. + Pragma warn_deprecated causes the compiler to print a warning when a deprecated efun is used. + Lfun closures can now explicitely name inherited lfuns (#'inh::fun). + Bugfix: Adding mappings of different width throws an error, unless one of the mappings if empty. + Bugfix: Right shift by 32 or more bits was computed incorrectly. + Bugfix: The type tracking of multiplications can returns the right type when seeing 'mixed' operands. + Bugfix: All <op>= assignment can now operate on indexed strings on the left hand side. + Bugfix: Additions of floats to 0 yielded the wrong type. + Bugfix: For closely consecutive switch case ranges (e.g. 'case -2..-1: case 1..2:') the compiler generated faulty lookup tables. + Bugfix: Improved the typetracking for operator '&' when used with mixed variables. + Bugfix: A cast of an expression to its own type now longer inserts a conversion operation. + Bugfix: Global variables can no longer be redefined in the same scope. + Bugfix: It is now possible to use symbols in inline closures, ie. "(: 'a :)". + Bugfix: Escaped character constants are now only parsed up to a maximum length. If no valid digits are found, the whole item is simply treated as escaped character. + Bugfix: When defining a function of the same name as an inherited private function, the latter is no longer redefined. + Bugfix: Multi-dimensional mapping indices in macro calls are no longer confused with multiple macro arguments. + Bugfix: Prototypes could modify the definition of inherited functions in strange ways. + Bugfix: Termination of a macro definition with End-of-file in an include file confused the lexer. + Bugfix: Inherited private functions no longer hide (simul-)efuns. + Bugfix: Inheriting two private functions with the same name caused the compiler to cross-define the second to the first. Invisible to the user, this messed up any use by __INIT and other local calls. + Bugfix: The '::' operator did not recognize the separate namespaces of variables and functions: void foo(string id) { ::id(id); } lead to a syntax error. + Bugfix: Using auto-includes no longer generate wrong line numbers in error messages. + Bugfix: "*"::foo() checks just the directly inherited programs. - Runtime: + New runtime limit LIMIT_CALLOUTS (commandline option '--max-callouts') for the maximum number of callouts at one time. + Attempts to set a single string character to 0 now raise a runtime error. + The internal alarm timing is monitored and restarted in case the alarm gets lost (happens often on Cygwin). + Normal runtime errors are no longer reported on the console. + New optional driver hook H_SEND_NOTIFY_FAIL to send a notify fail message to the proper receiver. + For the first 255 simul efuns, it is now permissible to catch reference parameters in a varargs parameter. However, the only permitted use is to pass them flat in a function call (using apply())! + The protocols MCP, MSP and MXP can now be negotiated through the H_TELNET_NEG hook. + New optional driver hook H_AUTO_INCLUDE to set a string or closure for auto-include information. + Errors while loading objects now include the inheritance chain. + 'Too long evaluation' errors during a compilation (caused by too many master calls) are considered compilation errors. + Signal USR2 forces the driver to reopen the host.debug.log file. + On systems with pthread support, the driver may be compiled to use background threads to send the data to the network, thus avoiding EWOULDBLOCK problems. + External master calls (like for ERQ messages) get the same eval-cost benefits during error handling as normal call-others. + Lfun closures left danging by a replace_program() are now converted into alien-lfun closures, so that the error handler has a chance to determine the originating object. + Bugfix: When logging on players, the initial prompt wasn't printed. + Bugfix: IPv6 name lookup works again, and also with both xerq and erq. + Bugfix: The driver now longer gets a confused when a client like TinyFugue refuses to use CHARMODE. + Bugfix: On mapping addition or element assignment, invalid keys (like destructed objects) were still counted against the allowed mapping size. + Bugfix: Most reference loops as created by for example 'b = 0 || &a; b = 0 || &a;' are detected. + Bugfix: When destructing an object, references through closures are removed from the local variables as well. + Bugfix: Removing or destructing a shadow now properly removes all associated actions. + Bugfix: The tracing checks weren't done against the current interactive as documented, but instead against the current commandgiver. + Bugfix: The automatic mapping compaction did not remove destructed objects and closures. + Bugfix: If H_INCLUDE_DIRS was set to an array of directory names, the names couldn't have leading '/'. + Bugfix: Before calling reset() or clean_up() from the backend, the previous_object is cleared. - Other Changes: + Renamed the driver executable to 'ldmud'. + New driver option '--pidfile <filename>' to write the pid of the driver process into a file. + New driver option '--erq <filename>' to choose a different name for the ERQ executable (default is 'erq'). The option can also be used to specify the full pathname of the executable, and pass simple arguments to the erq. + The driver mode (plain or compat) can be selected with a commandline option ('--no-compat' resp. '--compat'). + New driver options '--min-malloced' and '--min-small-malloced' to specify the size of the initial block allocations. + New driver options '--wizlist-file <filename>' and '--no-wizlist-file' to control from where the driver reads the initial wizlist information. + New driver option '--args <filename>' reads the commandline arguments from a textfile. These argument files can be nested. + New driver option '--random-seed <num>' sets the seed value for the random number generator for debugging purposes. If not given, the driver chooses a seed value on its own. + New driver option '--hostname <name>' to specify the hostname, overriding the value returned by the system. + New driver option '--hostaddr <addr>' to specify the hosts address, overriding the value returned by the system. In particular this address will be used to open the driver ports under. + Removed a couple of fatal race-conditions in the xerq. + New configuration option 'trace-code' enables the bytecode tracing. + New configuration option 'use-deprecated' allows to disable obsolete and deprecated efuns. If enabled, the macro __DEPRECATED__ is defined. + New configuration options 'use-set-is-wizard', 'use-set-light' and 'use-process-string' to configure the corresponding optional efuns. + The UDP port is now a standard feature. The option has been renamed from 'catch_udp_port' to just 'udp_port'. + Swapping is now a standard feature, though it still can be disabled by specifying swapping times of 0. + The ERQ_EXECUTE command now recognizes quoted arguments. + The special command "malloc" is now under the control of the IS_WIZARD flag, too. + The erq/xerq commandline argument '--execdir <dir>' allows the to override the default ERQ_DIR specification for the directory with the callable executables. + New editor command 'T' to perform Tab <-> Whitespace conversion. + Builtin command 'dumpallobj' now also creates a dump of all destructed objects in the file <mudlib>/DEST_OBJ_DUMP. + Character conversions are now done with regards to the locale selected by the LANG environment variable. + The xerq now sends an ERQ_OK message when a queued write is finally completed. 20-Aug-2000 (Lars Duening) -- Release 3.2.8 - Changed efuns: + add_action(): Implemented the 'abbreviated verb' feature associated with negative flag values. + apply(): Just returns the first argument if it is not a closure. + clonep(): Accepts arguments of all types. + command_stack(): Also returns which objects did the notify_fail()s. + debug_info(): DINFO_MEMORY also prints the datasize of an object. + debug_info(): New request DINFO_DATA. + debug_info(): DINFO_MALLOC also returns the size of the wasted memory (where available). + inherit_list(): in non-COMPAT mode, the returned program names start with a '/'. + input_to(): input_to()s can now be stacked, and also accept closures for the function (this is not yet a real stacked input handling, though). + load_name(): also accepts strings as object designators. + map(): can now map an array through a mapping. + object_info(): OINFO_MEMORY also returns the datasize of an object. + present(): present(object) returns the object found, not its environment. + printf(): prints to NPCs are sent to catch_tell(). + (s)printf(): object names printed in plain mode with %O now start with a leading "/". + (s)printf(): fields are now always padded to their full size, even if no more data is following in the format string. + query_notify_fail(): A flag allows to query which object set the current error message. + restore_object(): Preliminary: optionally restore the object variables from a string. + save_object(): Preliminary: optionally return the saved object variables in a string. + set_connection_charset(): Now also accepts a string as charset specificator. + sort_array(): Now accepts extra arguments to pass to the sorting function. + terminal_colour(): Straightened the key recognition, and added a wrapping-only mode. + to_string(): Now also accepts lambda closures and returns a string suitable for debugging purposes. - Corrected efuns: + get_type_info(): The object a lambda closure is bound to is now returned properly. + limited(): When calling closures with limited eval ticks, the efun didn't make the full amount of ticks available. + terminal_colour(): When removing spaces due to wrapping, the efun sometimes falsely reported a "partial string too long". + random(): distributes the random numbers more evenly, especially over small ranges. + regexp(), regexplode(), regreplace(): Errors in the regular expression are raised as normal errors, and no longer printed to the user. + sprintf(): Is now reentrant. + strstr(): When given negative starting offsets, the efun no longer returns negative results. + transpose_array(): Can now handle variable sized sub-arrays. + typeof(): Now accepts literal references. + unique_array(): When applied on an empty array, it no longer raises an assertion. - New efuns: + clones(): find and return the clones of an object. + copy_file(): copies a file. + save_value(): encodes a value into a string. + restore_value(): decodes a value from a string generated by save_value(). + set_combine_charset(): Define characters to combine into strings when received in charmode. - Master Object: + valid_read(), valid_write(): new function code "copy_file" to cater for the new efun. + valid_write(): the old function code "do_rename" (used twice) was replaced by "rename_from" and "rename_to". + log_error(): New argument "warn" determines if the message passed to the lfun is an error or just a warning. + New include_file(): generates the full pathname of a filename given in an #include directive. + New inherit_file(): generates the full pathname of a filename given in an inherit directive. - Fixed Crashers: + Unaligned pointer access in efun functionlist(), caused by unaligned function stand-ins. + Multiplication of an array of allocated strings with an integer. + Replacing a prompt-closure from within the closure. + Comparison "#'f == other_type" (also !=). + It is no longer possible to pass destructed objects to input_to() handlers. + When apply() was called with an array as last argument, it didn't check the array elements for destructed objects. + When creating lambda closures with more than 254 constants, the compiler stored the number of values at the wrong place, clobbering one of the constants. + Evalstack overflows caused by intermediate results went unnoticed. + Calling functions with more than 255 arguments triggered a sanity check. + Replacing a notify-fail closure while it is executed. + The default handling of telnet negotiations (answering DONT/WONT) for unsupported options like NAWS if no hooks are specified, leaked LPC stack entries, eventually overwriting memory. + The lambda block ({ #'return }) was compiled incorrectly, causing a 'Bad stack at F_RETURN' at the end of the lambda closure latest. + Efun write_file() running out of fds outside of a compilation no longer tries to raise a compilation error. + A failing include statement at the end of the internal lex buffer no longer causes the driver to lex invalid data, sometimes crashing while doing so. - Language: + The preincrement/-decrement operators can now be applied to wide mappings ('++m[x,y]'). + If an object is inherited virtually multiple times, a wildcarded super call ("*::") calls it only once. + The ->() operator also accepts the following forms: + x->y() where y is the name of a local variable + x->"y"() where "y" is a constant string + x->(y)() where y is an expression returning a string. + New loop-construct: foreach(). + call_others (ie. ->()) can be applied on arrays of objects, the single call results are collected in one result array. + <int> += <type> now works for <type> being string and float as well. + The operator "&" (and "&=") can now be used to intersect strings. + The operator "-" (and "-=") can now be used to remove characters from a string. + <mapping1> -= <mapping2> now works for <mapping2> of any width, like the normal subtraction already does. + Indexing [..x] and [..<x] are allowed as short form of [0..x] and [0..<x]. + When enabled, the modifier 'nosave' replaces the modifier 'static' for variables - the latter is still recognized, but its use is deprecated. Similar, 'nosave' should be used instead of 'static' as inheritance modifier. + New pragma "weak_types" to turn off type checking. + New pragmas "pedantic" and "sloppy" turn on resp. off the treatment of certain warnings as errors. + Inherited functions are looked up using a breadth search. + Local variables can be initialized in their definition, for example: int i = 3; int j = 3*i, k; + New preprocessor macros __DIR__ and __PATH__() to retrieve the path of the currently compiled file. + '(void)' is now accepted as empty function argument list. + Failure to pass enough arguments to a non-vararg simul_efun generates a warning (error in pedantic mode). + Redefinition of a function now checks the types of the arguments and of the return type for consistency. Same for the consistency between a function and a preceeding prototype. If a difference is detected, a warning (error in pedantic mode for arguments) is issued. + Preprocessor statements #else and #endif no longer accept uncommented text after the keyword. In pedantic mode, an error is raised, otherwise a warning is generated. + Preprocessor statement #define requires a definition after the keyword. + New predefined macro __RESET_TIME__ and __CLEANUP_TIME__ to return the default reset and cleanup interval time. + Bugfix: Newlines in literal strings in inline closures are now rejected. + Bugfix: #'parse_command wasn't implemented. + Bugfix: The expressions &(expr4[x]) and &(expr4[<x]) could generate invalid code (causing a "(lvalue) Indexing on illegal type" error) in extreme circumstances. + Bugfix: Compiler typechecks for "int * string" yielded "int" instead of "string" (the generated code was correct). + Bugfix: objects with "nomask" functions can be inherited virtually multiple times. + Bugfix: "*"::foo() failed if the last inherited object checked did not contain the function - even if it has been found in other objects. + Bugfix: ::foo() didn't find the topmost definition when confronted with virtual inherits. + Bugfix: In the expression '++<ident>' the opcode for '++' was overwritten if the <ident> required a 2-Byte index internally. Same for '--'. + Bugfix: The preprocessor properly ignores a '//'-comment in the argument list for a function macro. + Bugfix: copy()ing or subtracting mappings did not remove destructed elements first. - Runtime: + If the driver is compiled for IPv6 support, the macro '__IPV6__' is defined in LPC compiles. + Simul-efuns can now take "varargs" arguments, like in "foo(varargs mixed arg)". + A simul-efun "call_other()" finally catches ->() calls as well. + New pragma "no_shadow" to disallow shadows on a program. - Other Changes: + The standard erq now supports the socket requests (actually it does so for some time now, it just hasn't been published). + Where supported, the erq supports lookup of IPv6 addresses. + When compiled with DEBUG and CHECK_STRINGS, the commandline option "--check-strings" checks the consistency of the shared string table with every backend cycle. + When compiled with DEBUG, the commandline option "--check-state" controls the simplistic state checks of the virtual machine in the backend loop. + The driver can be compiled with bison as well as with byacc. + New editor command 'M' to strip ^Ms from lineends. + The commandline argument "--max-small-malloc" and the corresponding configuration parameter are gone. 19-Aug-1999 (Lars Duening) -- Release 3.2.7 - Changed efuns: + command(): + native-mode restriction to the current object is gone since there is no native mode anymore. + commands are now stacked, meaning that after a command finishes, the previous this_player(), verb, etc, are restored. + debug_info(): + debug_info(DINFO_STATUS): now returns the status information instead of printing it. debug_info(DINFO_STATUS, "malloc") returns the malloc information usually connected with the 'malloc' command. + debug_info(DINFO_DUMP): allows to dump object information and (if compiled) opcode usage information into a file. + destruct(): accepts an already destructed object as argument. + get_type_info(): returns for strings whether they are shared or not. + inherit_list(), debug_info(), object_info(): duplicate virtual inherits are no longer listed. + notify_fail(): calls to notify_fail() only affect the current command. Also, NPCs can see 'their' notify_fail messages. + object_info(): OINFO_BASIC result 'OIB_APPROVED' is gone. + replace_program(): no longer flags objects as 'clones', but instead uses the new flag 'O_REPLACED'. + set_light(): is optional (though by default active) + sprintf(), printf(): if an error occurs, the filename and line are included in all error messages, not just the one printed to stderr. + symbol_function(): can't make closures from protected lfuns of other objects anymore. + trace(), traceprefix() are validated with the master-lfun valid_trace(). - Corrected efuns: + caller_stack(): is now declared to return 'object *' as it indeed does. + query_mud_port(): now accepts 'int' arguments as documented. + restore_object(): protected against negative '([:<width>])' specifications. + (s)printf(): prints variable closures properly even if the variable vanished in a program replacement. + symbol_variable(): recognizes objects with pending program replacements. + terminal_colour(): when wrapping is active, keywords were replaced even when no '%^' was present. Not any more. + to_object(): returns 0 for closures bound to a destructed object. + to_string(): converts variable closures properly even if the variable vanished in a program replacement. + to_string(): in compat mode, object names are no longer prepended with a slash. + unmkmapping(): now handles key-only mappings as it should. - New efuns: + atan2(): alternative way to calculate the inverse tangens. + ceil(): rounds a float up to the nearest whole number. + floor(): rounds a float down to the nearest whole number. + pow(): raises a float to the power of another float. + and_bits(): binary-ands two bitstrings. + or_bits(): binary-ors two bitstrings. + xor_bits(): binary-xors two bitstrings. + invert_bits(): negates a bitstring. + next_bit(): finds the next set (cleared) bit in a bitstring. + last_bit(): returns the last set bit in a bitstring. + count_bits(): count the number of bits in a bitstring. + (preliminary) command_stack(): returns the current command stack. + command_stack_depth(): returns the depth of the command stack. + (preliminary) execute_command(): low-level access to the command parser. + query_command(): returns the full command seen by the parser. + query_notify_fail(): returns the current notify-fail setting. + object_time(): return the time an object was created. + (preliminary) present_clone(): find objects with a specific blueprint in a given environment. + trim(): trim a certain character from a string. + (preliminary) limited(): executes a closure with changed runtime limits + query_limits(): queries the current/default runtime limits + (preliminary) set_limits(): sets new default runtime limits. - Master Object: + valid_write(): New call_funs 'objdump' and 'opcdump', passed when attempting to dump the object and opcode information into a file. This applies to the special commands 'dumpallobj' and 'opcdump' as well as for the debug_info() uses. + query_player_level(): obsolete and gone. + valid_trace(): New lfun to validate uses of trace() and traceprefix() (query_player_level() did this before). - Fixed Crashers: + A heart_beat() removing all remaining objects on the hb list. + An error during a (s)efun bound to a swapped out object could crash the dump_trace. + An error during macro expansion crashed the driver if the error handling itself required macro expansion again. + to_string() on a lfun of a swapped program. + call_lambda() on not-inherited variable closures. + replace_program() on a program of which one variable is referenced by a symbol_variable(). + Swap in of a closure variable which was invalidated during a garbage collection. + Failure to swap in an object during a garbage collection. + Binding an unbound lambda to two objects and destructing the originating object freed the lambda. - Language: + '+=' now allows to add an int onto a float (before only floats were allowed). Similar for '-=', '*=' and '/='. + '*'/'*=' may multiply strings or arrays with positive numbers. The result is the string/array <number>times repeated. + Scope of variables defined in nested local blocks ends with the defining local block. The limit MAX_LOCAL applies only to the variables which are in scope at the same time. Variables in inner scopes can hide variables in outer scopes. Unchanged is that local variables are initialised to 0 when their scope is (re)entered. + The pragmas 'no_local_scopes' and 'local_scopes' turn the local scoping of variables off resp. back on. + in 'for(<init>, <init>, ..., <init>; ...)' each <init> can either be a normal expression, or a definition of a local variable with assignment, e.g. 'int i = <expr>'. The scope of such variables is the whole for() statement. + added inline closures as alternative to lfun closures: instead of int foo(int arg ) { return arg * 2; } map_array(arr, #'foo); you can write map_array(arr, (: return $1 * 2; :) ); or just map_array(arr, (: $1 * 2 :) ); The syntax is modelled after MudOS functionals. + Support for alien-lfun closures was incomplete. + New pragma 'no_clone': disallows clones of a program. + New pragma 'no_inherit': disallows inheriting a program. + Bugfix: Variables in closures may start with '_'. + Bugfix: *::f() did not call all inherited functions (and others multiple times). + Bugfix: '#[<] indexing corrected. - Runtime: + If hook H_RESET is a closure, and the closure returns a negative value, the object will not be reset again, as if set_next_reset(-1) had been used. + New optional driver hook H_COMMAND allows to replace the driver command parsing with your own. When used, the H_MODIFY_COMMAND and H_NOTIFY_FAIL hooks are ignored. + The H_MODIFY_COMMAND hooks may now change the commandgiver. The change remains active during the execution of the command, and the original commandgiver is passed to the NOTIFY_FAIL hook. + Mappings have an upper limit of MAX_MAPPING_SIZE keys (default is 5000). + Special commands 'dumpallobj' and 'opcdump' are verified through master->valid_write(). + Driver can be compiled for DYNAMIC_COSTS, causing increased eval-costs for computationally expensive operations. For now, this applies only to string additions with an additional cost of strlen(result)/1000 . - Other Changes: + Tweaks to the timing of swapping, cleanup() and reset() to achieve a smoother operation. + On loading errors, the name of the affected object is printed in the error message. + The multiport feature is no longer optional. + Corrections to the manpages of clone_object, clonep, filter_mapping, filter_indices. + Added the include files mudlib/sys/{trace.h,input_to.h,files.h, debug_info.h} with definitions for the efuns trace(), input_to(), file_size(), get_dir(), and debug_info(). + NATIVE_MODE is gone. + Euids are now a standard feature (the LPC macro __EUIDS__ stays defined, though). + Use of euids (loading or cloning other objects requires a non-zero euid) can be enforced with the commandline option '--strict-euids'. If defined, the LPC macro '__STRICT_EUIDS__' is defined. If your mud ran in NATIVE_MODE, this is the option you'll want to use. + The commandline options '--reset-time' and '--cleanup-time' specify the cleanup and reset times. The old config.h symbols TIME_TO_RESET and TIME_TO_CLEAN_UP just give the default values. + The commandline options '--max-array' and '--max-mapping' can set the max limits for arrays and mappings. For both, a setting of 0 disables the limit checks. + The commandline options '--max-bytes' and '--max-file' can set the max IO limits for file reads and writes. + Efun closures are printed with full name in error tracebacks. + The ACCESS.ALLOW file can specify portnumbers. + Special command 'status malloc' is now identical to 'malloc'. + Special commands 'debugmalloc' and 'showsmallnewmalloced' are deactivated. + Bugfix: Reset of swapped objects did not work properly. + Bugfix: Errors during the execution of closures no longer leak memory. + Bugfix: Switching driver hooks from within themselves no longer leaks memory. + Bugfix: New callouts added from within a callout with odd delay resulted in the new callouts called at the wrong time. If the new callout had a MAX_INT delay, the existing callout list was effectively disabled. 01-Apr-1999 (Lars Duening) -- Release 3.2.6 - Changed efuns: + allocate_mapping() renamed to m_allocate(). The old name is still available as alias. + clone_object() accepts objects as templates. + efun308() renamed to set_environment(). The old name is still available as alias. + file_name() renamed to object_name(). The old name is still available as alias. + filter_mapping() renamed to filter_indices(). The old name is still available as alias. + mapping_contains() renamed to m_contains(). The old name is still available as alias. + map_mapping() renamed to map_indices(). The old name is still available as alias. + mapping_contains() renamed to m_contains(). The old name is + m_values() can return any column of a mapping. + notify_fail() returns 0. + set_this_player() accepts 0 as argument. + to_int(), to_object() and to_float() accept their result type as argument. - Corrected efuns: + call_out(): if the command_giver destructs before the callout is activated, this_player() is made sure to be 0. + map_array() stumbled when objects in the array in question were destructed during the operation. + sizeof(mapping) no longer counts destructed objects in the mapping to the size. + sprintf() of float values < 1.0 no longer causes a SING error. + terminal_colour() correctly wraps strings with a length one less than the wrap limit. + this_interactive(): during login it points to the login object. - New efuns: + abs(): return the absolute value of the argument. + all_environment(): return all environments of an object. + caller_stack(): return the call stack. + clonep(): test if an object is a clone. + copy(): produce a shallow copy of the argument. + deep_copy(): produce a shallow copy of the argument. + filter(): filter an array or fill-width mapping. + load_name(): returns the filename of an objects blueprint. + load_object(): loads an object. + make_shared_string(): enters a string into the shared string table. + map(): map an array or full-width mapping. + m_reallocate(): changes the width of a mapping. + object_info(): returns internal information about an object. + program_name(): returns the name of an objects program. + set_next_reset(): set the time of the next reset. + unmkmapping(): deconstruct a mapping to arrays. + upper_case(): make a string all upper case. + widthof(): return the width of a mapping. - Master Object: + All functions can be static. + Functions like privilege_violation() or heart_beat_error(), but also valid_read() and valid_write() no longer receive destructed objects as arguments. + Apply 'object_name()' renamed to 'printf_obj_name()'. - Compiler: + New predefined macro __MAX_EVAL_COST__ expands to the evaluation cost limit. + Bugfix: __DOMAIN_NAME__ on some machines returned the NIS, not the DNS domain. + Bugfix: __MASTER_OBJECT__ could be set to a non-canonic name. + Bugfix: __FILE__ and __MASTER_OBJECT__ returned names with leading '/' in compat mode. + Bugfix: (virtual) inheritance of variable-only objects with variable initialisation doesn't crash the driver anymore. + Bugfix: #'++/#'-- in closures work. - Fixed Crashers: + Errors in a callout to an efun closure. + Adding arrays up to and over the upper limit. + Destruction of non-interactive snoopers. + funcall()/apply() on a swapped variable. - Other Changes: + The old behaviour of explode() and previous_object() is no longer available. Floats, transcendent functions, mappings and extended varargs are now permanent features of the driver. + Re-implemented the handling of heartbeats, resets, cleanups and swapping in order to avoid caused lags. This also makes the config parameter RESET_GRANULARITY unnecessary. + If used, the __INIT() function is protected instead of global, and can't be called from outside the objects anymore (it shouldn't be callable at all anyway). + When subtracting mappings from each other, the subtrahend may be of any width, but only its keys count. + The 'status tables' command has an additional entry 'Object status'. + Bugfix: fixed an eval cost leak in catch(). + Bugfix: fixed memory leak in terminal_colour(). + Bugfix: if a command disconnects, but not quits a player, the prompt is no longer printed (before it ended up on stdout, cluttering the logfiles). 10-Dec-1998 (Lars Duening) -- Release 3.2.5 - Collapsing of '/' in object names also used for inherits. - Default limit for bitstrings is 6144 bits. - The efuns break_point() and swap() are disabled by default. - Pre-release versions have an extended version number of the form '3.2.5-dev.16'. - Compat mode drivers define __COMPAT_MODE__ (meant to replace COMPAT_FLAG eventually); native mode drivers define __NATIVE_MODE__. Similar, a driver using euids defines __EUIDS__. - New defines __ERQ_MAX_SEND__ and __ERQ_MAX_REPLY__ when the driver supports the ERQ. The values are the max sizes of the send and receive buffers. - MSDOS support removed (the MSDOS filesystem however is still supported). - It is now possible to use '..' in filenames as long as it doesn't has the 'parent directory' meaning (that means, 'foo..bar' is ok, bug 'foo/../bar' is not). - When a connection is closed, the driver no longer sends 'Closing down' as last text. - Bugfix: branches in bigger lambda() closures use the correct branch offsets. I am not completely sure if the bugfix is correct, so I left in two 'DEBUG:' diagnostics with information needed to debug the code further if necessary. - Bugfix: the commandline parser printed a faulty error message if a required value was missing. - Bugfix: mapping_contains() freed the wrong values, clobbering passed mapping literals. - Bugfix: After an UDP packet was processed, the evaluation costs are restored. - Bugfix: The LPC compiler now accepts only regular files for includes. - Bugfix: If a npc was destructed between to command() calls, and the H_MODIFY_COMMAND hook was set to a string, the driver called the named modify-command function on the destructed npc. - Bugfix: During the execution of a closure, an extra refcount is added to protect it from destruction while it is executed. This is primarily a safety measure for the driver hooks which only have 1 refcount and are thus very sensitive against master object updates. - Bugfix: Under some OS like Linux, the normal SIG_IGN handler is just one-shot. To reliably ignore signals (ie SIGPIPE), a homemade handler is used. - Bugfix: regreplace("acc", "a*", "yy",1) trashed memory. - Bugfix: runtime errors in an alien-lfun-closure (as created by symbol_function() calls) no longer crash the driver during the error handling. - Bugfix: sprintf() on big floats or in long fields no longer causes a buffer overrun (and should it happen nevertheless, a proper fatal() is generated). 24-Sep-1998 (Lars Duening) -- Release 3.2.4 - Bugfix for the collapsing of '/' in object names. 21-Sep-1998 (Lars Duening) -- Release 3.2.3 - Bugfix: mapping_contains() no longer returns destructed objects. - New special command 'status files' to append file usage statistics from within the mud to the file /FILESTAT. - New commandline option: --swap-compact: reuse free space in the swapfile immediately. Giving this option results in smaller, but also more fragmented swapfiles, and the swap performance may degrade. 14-Sep-1998 (Lars Duening) -- Release 3.2.2 - Version number pattern changed from 03.02.1@<patchlevel> to 3.2.<patchlevel>. This affects all uses of the __VERSION__ lpc predefine. - Objects may be loaded/inherited with filenames containing two or more consecutive '/'es, these are collapsed into just one. However, it is not possible to find objects using the wrong names. - The dreaded __INIT() bug is fixed. - New commandline options: --options : prints all options used in compiling the driver --version : prints the game driver version --help : prints a short help of the commandline options --longhelp: prints an elaborate description of the commandline options - The commandline option handling was renovated, most options now exist in a short and long form. This caused slight changes in name and syntax for well-known options (.e.g '--gcollect_out_fd<file>' is now '--gcollect-out-fd <file>'). Please see doc/driver/invocation for further information. 10-Jul-1998 (Lars Duening) -- Release 3.2.1@141-osb.16 - Bugfix for the "*":: problem. - Added a minimal master for simple driver tests. 17-May-1998 (Lars Duening) -- Release 3.2.1@141-osb.14 and before - Small speedup for regexps through usage of a cache. Also increased the complexity limit for regexps. - Added support for BeOS. - Automatic garbage collections are kept at least 5 minutes apart. Every garbage collection is logged on stdout. - Variables are swapped independantly from program code. - Multiple login ports may be used in parallel. The port numbers are given on the commandline, efun query_mud_port() was extended to return the appropriate port number. - MudOS-efun terminal_colour() added by Mica. - this_object() in destructed objects does not print a diagnostic anymore. - 'status tables' prints the number of cache hits both absolute and as percentage.