mirror of
https://github.com/ldmud/ldmud
synced 2026-08-12 14:26:05 -04:00
2414 lines
125 KiB
Text
2414 lines
125 KiB
Text
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.
|
|
|
|
10-Sep-2022 (LDMud Team) -- 3.6.6
|
|
- Fixed Crashes:
|
|
+ Fixed a crash in configure_interactive() and input_to()
|
|
checking privileges without an actual living object.
|
|
+ Fixed several crashes in lambda().
|
|
+ Fixed a crash when compiling wildcard calls.
|
|
+ Fixed a crash in Python code with a missing current object.
|
|
+ Fixed a crash in Python code when handling a swapped-out object.
|
|
+ Fixed a crash when calling nonexistent functions on LWOs.
|
|
+ Fixed a crash when swapping LWOs.
|
|
+ Fixed a crash when aborting a coroutine due to an error.
|
|
+ Fixed a crash during the garbage collection.
|
|
+ Fixed a crash when calling MySQL functions.
|
|
|
|
- Language:
|
|
+ Introduced 'struct mixed' as type declaration for any struct.
|
|
+ Introduced range indexing for wide mappings
|
|
(i.e. m[key, index1..index2])
|
|
+ Implemented inheritance modifier and default declaration for
|
|
struct visibility.
|
|
+ Simul-efun structs are now available in every program.
|
|
+ Added new privileged pragma no_simul_efuns to deactivate the
|
|
access to simul-efuns.
|
|
+ Fixed object and lwobject type being treated as equal.
|
|
|
|
- Runtime:
|
|
+ Implemented runtime type checks for struct initialization.
|
|
+ Several fixes and changes for lightweight objects:
|
|
+ Introduced driver hooks for object creation.
|
|
+ Variables of a new object will be initialized prior to
|
|
their values being copied or restored.
|
|
+ nosave variables will not be saved anymore.
|
|
+ Fixed a failure when restoring.
|
|
+ Fixed several reference counting issues and other memory leaks.
|
|
|
|
- Changed Efuns:
|
|
+ ed() shows Unicode characters now.
|
|
+ unique_array() does not warn about missing functions anymore.
|
|
+ symbol_function() now supports simul-efun closures with high indices.
|
|
+ regexp() can now handle nul bytes in the regular expression.
|
|
+ driver_info() got some more statistics about simul-efuns, lightweight
|
|
objects and coroutines.
|
|
|
|
- Networking:
|
|
+ Added code for TLS and MCCP to the telnet example.
|
|
|
|
- Master:
|
|
+ H_CREATE_* hooks can now be arbitrary closures.
|
|
|
|
- Other:
|
|
+ Implemented encoding suffixes //IGNORE and //REPLACE for
|
|
error handling during reading.
|
|
|
|
09-Jan-2022 (LDMud Team) -- 3.6.5
|
|
- Fixed Crashes:
|
|
+ Fixed a crash in implode() with bytes.
|
|
+ Fixed a freeze when handling default function argument values.
|
|
+ Fixed crash when having more than 255 lambda values.
|
|
+ Fixed crash in virtual inherit handling (#899).
|
|
+ Fixed crash on too many local variables (#900).
|
|
|
|
- Lanuage:
|
|
+ Added new type: lightweight objects
|
|
+ Added new type: coroutines
|
|
+ Implement named object types (#842).
|
|
+ Implemented 'in' operator for membership tests (#726).
|
|
+ Improved missing return detection (#332).
|
|
+ Implemented dead code detection.
|
|
+ Implemented type checks for comparison operations.
|
|
+ Warn about floats used in a boolean context (#780).
|
|
+ Warn about incorrect definitions of applied lfuns (#882).
|
|
+ Warn about unused literal values.
|
|
+ Index operation cannot be called like efuns anymore.
|
|
+ Fixed refcounting mismatch when a virtual function disappeared.
|
|
|
|
- Runtime:
|
|
+ Removed argument for create() and reset().
|
|
+ Warn when a callback function does not exist.
|
|
+ Implemented closures to simul-efuns that exceeded the sefun table.
|
|
(#782)
|
|
+ Prevent reentrant SQLite calls.
|
|
+ Implement recursion limit in traditional regexp engine.
|
|
|
|
- Changed Efuns:
|
|
+ clone_object(): Pass additional arguments to create().
|
|
+ read_bytes() accepts now negative start offsets beyond file start.
|
|
+ restore_value()/restore_object(): Fixed parsing of context closures.
|
|
+ sprintf(): Fixed newline handling in column mode (#529).
|
|
+ sprintf(): Fixed handling of '%%' (#665).
|
|
+ sprintf(): Fixed handling of '\0' (#800).
|
|
+ sprintf(): Treat '\r' in table mode as line breaks.
|
|
|
|
- Networking:
|
|
+ Fixed discarding of newlines when switching to charmode (#892).
|
|
+ Fixed handling of Telnet NUL bytes.
|
|
|
|
- Master Object:
|
|
+ log_error(): New argument "line" containing the line number (#899).
|
|
|
|
- Other:
|
|
+ Python functions can amend LPC objects with additional member
|
|
variables.
|
|
|
|
06-Apr-2021 (LDMud Team) -- 3.6.4
|
|
- Fixed Crashes:
|
|
+ Assertion failure when adding string contants to byte constants.
|
|
+ Fixed a crash when a virtual inherited program was updated twice.
|
|
+ Fixed out-of-bounds write on errors in lambda closures.
|
|
+ lambda() compiled #'catch and #'call_direct without the needed
|
|
argument frame.
|
|
+ Python call operator on uninitialized closure could crash.
|
|
+ variable_list() failed to swap the variable block in when the
|
|
values were requested.
|
|
|
|
- Language:
|
|
+ Function arguments can now have default argument values.
|
|
+ Added prefixes #'lfun:: and #'var:: for closure literals.
|
|
+ Preprocessor statements and pragmas need now to be written fully.
|
|
+ Warn about trailing characters in all preprocessor statements.
|
|
+ A for/foreach variable cannot be used in its initializer anymore.
|
|
+ Added compile and runtime type checks for foreach().
|
|
+ Added compile and runtime type checks for all types of assignment
|
|
operations.
|
|
+ Inherited function calls will no longer call indirectly inherited
|
|
virtual programs.
|
|
+ Check efun arguments for references.
|
|
+ Extended function overload type checks to include optional
|
|
arguments.
|
|
+ Fixed type comparison of arrays with different depths.
|
|
+ Structs in a privately inherited program are now still visible in
|
|
the directly inheriting program.
|
|
|
|
- Runtime:
|
|
+ Added subtraction of mappings from arrays and vice versa.
|
|
+ Failed assignments to mapping entries will not leave a zero entry.
|
|
+ Fixed int *= float operation.
|
|
+ Fixed a resource leak for interactive connections.
|
|
+ Fixed a memory leak when an object is destroyed in __INIT.
|
|
+ Fixed use after free in get_type_info() for anonymous structs.
|
|
|
|
- Changed Efuns:
|
|
+ get_type_info(x,0) will now return the numeric type as documented.
|
|
+ interactive_info() now also gives noecho and charmode information.
|
|
+ map()/filter() got support for Unicode strings and byte sequences.
|
|
+ regexplode() will not split UTF-8 sequences anymore.
|
|
+ replace_program() can now handle virtual inherits.
|
|
+ restore_object() can now correctly handle quoted arrays.
|
|
+ sscanf() and parse_commands() are now real efuns.
|
|
+ sscanf() will not match upon numeric overflows.
|
|
+ struct_info() and variable_list() now return type information
|
|
once again.
|
|
+ symbol_variable() returned wrong value when called as a closure.
|
|
+ to_struct() now accepts arrays that are greater as the template
|
|
struct.
|
|
|
|
- Other:
|
|
+ Fixed missing security check in debug_info() simul-efun
|
|
implementation.
|
|
+ Added support for password protected TLS keys with the
|
|
--tls-password command line option.
|
|
+ Disallow the use of simul-efun closure literals when compiling
|
|
the master object.
|
|
+ Implemented Python bool operator for objects and closures.
|
|
+ Fixed Python hash operator on closures.
|
|
+ Pass SQLite warnings to the master object.
|
|
|
|
01-Sep-2020 (LDMud Team) -- 3.6.3
|
|
- Fixed Crashes:
|
|
+ slaballoc/smalloc forget to set the magic bytes when splitting
|
|
of a small block from a large block.
|
|
+ When printing collected garbage blocks the access to malloc
|
|
information was off by one word.
|
|
+ The compiler left a semantic value uninitialized when parsing
|
|
lvalue preserving calls.
|
|
+ The current object was not set when setting up the call to
|
|
H_CLEAN_UP.
|
|
+ to_struct() freed a struct definition when base and derived struct
|
|
had the same size.
|
|
+ The Closure() constructor in Python crashed when used in the backend
|
|
loop.
|
|
|
|
- Language:
|
|
+ The new pragma warn_unused_variables will warn about variables that
|
|
are not read from or not written to.
|
|
+ The pragma strict_types will now raise errors.
|
|
|
|
- New Efuns:
|
|
+ text_width() returns the approximate screen width of a given string.
|
|
|
|
- Changed Efuns:
|
|
+ sprintf() and terminal_colour() respect extended grapheme clusters.
|
|
+ restore_value() and restore_object() restore structs now by struct
|
|
member name when the names are available.
|
|
+ restore_value() and restore_object() can now restore anonymous
|
|
structs.
|
|
+ baseof() and to_struct() now detect or convert structs that are
|
|
based on an older or newer definition.
|
|
+ regexp() didn't handle the star operator correctly.
|
|
+ regexp() now supports \X (grapheme cluster) for traditional regular
|
|
expressions.
|
|
|
|
- Other:
|
|
+ Implemented support for lvalues in Python.
|
|
|
|
28-Apr-2020 (LDMud Team) -- 3.6.2
|
|
- Language:
|
|
+ Added the dot operator as a shortcut to call_strict() and
|
|
strict struct member access.
|
|
+ Modified the arrow operator to be a relaxed struct member
|
|
access operator.
|
|
+ Reimplement pragma strict_types.
|
|
+ Calls to simul-efuns are now type checked.
|
|
|
|
- New Efuns:
|
|
+ call_strict() and call_strict_direct() are similar to
|
|
call_other()/call_direct(), but raise an error if the
|
|
function does not exist.
|
|
|
|
- Changed Efuns:
|
|
+ call_resolved() and call_direct_resolved() now also support
|
|
array calls.
|
|
|
|
- Other:
|
|
+ Implemented support for function and variable inspection and
|
|
child processes in Python.
|
|
+ Fix information leakage when snooping.
|
|
|
|
08-Jan-2020 (LDMud Team) -- 3.6.1
|
|
- Runtime:
|
|
+ Assignments to variables and declarative type casts are
|
|
now subject to the runtime type checks.
|
|
|
|
- Language:
|
|
+ Argument types of efuns with arbitrarily many arguments
|
|
are now checked at compile time.
|
|
+ Type annotations of Python efuns are used for checks at
|
|
compile time and runtime.
|
|
+ Warn on C style casts that have no effect.
|
|
+ A variable cannot be used in its initializer anymore.
|
|
|
|
- Other:
|
|
+ Added support for closures and symbols in the indent tool.
|
|
+ Added valgrind memcheck instrumentation to the slaballoc
|
|
allocator.
|
|
|
|
28-Oct-2019 (LDMud Team) -- 3.6.0
|
|
- Removed Efuns:
|
|
+ The efun convert_charset() was removed, the new efuns
|
|
to_text() and to_bytes() can be used instead.
|
|
|
|
- Runtime:
|
|
+ The string type and all its operation support the full
|
|
Unicode character set (#432).
|
|
+ sl_exec() supports blobs now.
|
|
|
|
- Language
|
|
+ Introduced a new type named 'bytes' to differentiate between
|
|
Unicode character sequences (strings) and byte sequences.
|
|
|
|
05-Apr-2019 (LDMud Team) -- 3.5.2
|
|
- Fixed Crashes:
|
|
+ Syntax errors when parsing inline closures didn't clean
|
|
up status variables (#866).
|
|
+ Destructing newly created interactives resulted in fatal errors.
|
|
+ Calling lambda closures with mapping index operations resulted
|
|
in execution of random bytes (#867).
|
|
+ #'return in a middle of an expression in a lambda closure could
|
|
result in a fatal error (#868).
|
|
+ Replacing the system malloc could result in a segmentation fault
|
|
(#862).
|
|
+ A garbage collection when using the slaballoc/smalloc allocator
|
|
with mmap could result in a fatal error.
|
|
|
|
- Runtime:
|
|
+ Clean-up, reset and swap times can now be configured at runtime
|
|
using configure_driver().
|
|
+ Reactions to the signals SIGINT, SIGHUP, SIGUSR1 and SIGUSR2 can
|
|
now be configured using configure_driver().
|
|
|
|
04-Jan-2018 (LDMud Team) -- 3.5.1
|
|
- Fixed Crashes:
|
|
+ missing type declarations resulted in a NULL pointer dereference
|
|
(#859).
|
|
+ fixed handling of program updates with triply virtually inherited
|
|
programs.
|
|
+ fixed crash when swapping out programs with lvalue references (#854).
|
|
+ fixed a crash on exceptions in a call of Python efun closures.
|
|
+ compiling a call to Python efuns resulted in an uninitialized type.
|
|
+ SQLite crashed when LDMud's allocator replaced the system malloc.
|
|
|
|
- Runtime:
|
|
+ sl_exec() allows the ATTACH statement now.
|
|
+ SQLite log messages are now printed to the debug log (#835).
|
|
|
|
- Other:
|
|
+ Corrected simul-efun implementations of deprecared efuns (#855, #857).
|
|
+ Corrected the LP-245 mudlib to work with the current driver.
|
|
|
|
04-Oct-2017 (LDMud Team) -- 3.5.0
|
|
- Fixed Crashes
|
|
+ xml_generate(), xml_parse() could crash the driver due to a wrong
|
|
order during initialization of libxml2 (#671) and could lead to
|
|
memory corruption, because the memory used by libxml2 was subject to
|
|
the garbage collector and would be free'd by it while still in use.
|
|
+ get_type_info() lost refcounts to the function name of a closure,
|
|
causing it eventually being free'd prematurely (#712).
|
|
+ 'dumpallobj' crashed if there are strings with 0 refcounts (#725).
|
|
+ fixed a crash during tracing caused by a wrong call to add_message()
|
|
in do_trace(), when compiled with --enable-debug (#736).
|
|
+ sprintf() could result in a fatal error if some buffer overflowed.
|
|
Removed these overflow opportunities (#825).
|
|
+ fixed a crash during compilation when the handling of a preprocessor
|
|
statement meet the end of the lexer input buffer (#833).
|
|
+ fixed a crash in crypt() when given an invalid salt.
|
|
+ fixed a crash when calling ctime(-1) the first time.
|
|
|
|
- Changed Efuns:
|
|
+ apply() now expands an lvalue reference to an array or an array range
|
|
as lvalue references to the array elements.
|
|
+ add_action(): The function can be given as a closure. (#243)
|
|
+ call_other() and call_direct() now always accept an array of objects or
|
|
strings (object names) as argument and call the function in all of these
|
|
objects.
|
|
+ command(): Won't throw an error anymore when a static function
|
|
in another object is called. Such an action will simply be skipped.
|
|
+ get_dir(): prepend '/' in plain mode for entries in the root directory,
|
|
if paths are requested by GETDIR_PATH.
|
|
+ explode() always returns a non-empty array, even upon explode("","")
|
|
(#180).
|
|
+ net_connect() will return an error code from comm.h instead of
|
|
the system errno value (#427).
|
|
+ net_connect() had the current udp port as an undocumented default value
|
|
for its second argument. Now both parameters are mandatory.
|
|
+ object_info() was redesigned to just return a single information including
|
|
configuration options from configure_object(). (#596)
|
|
+ The functionality of shadow(ob, 0) was removed in favor of
|
|
object_info(ob, OI_SHADOW_NEXT). There is a sefun implementation with
|
|
the old signature in /mudlib/deprecated/. (#596)
|
|
+ restore_object()/restore_value() can now restore null bytes in strings.
|
|
+ sort_array() will sort in-place instead of a copying the array first,
|
|
if the array is passed as reference. (#224)
|
|
+ sort_array() and reverse() also work with array range references.
|
|
+ to_struct() can convert a struct into another one if one of them is
|
|
a (indirect) base of the other. (#646)
|
|
+ restore_object() checks if the types of restored data are compatible
|
|
with the declared types of variables, if runtime type checks are
|
|
enabled in the program of the object.
|
|
+ clone_object() does not deactivate an active heart_beat in a
|
|
blueprint. (#747)
|
|
+ Fixed result of convert_charset(): returns now the unchanged string
|
|
if it gets an empty string for conversion. (#739)
|
|
+ tls_init_connection() supports outgoing connections also with GnuTLS.
|
|
|
|
- Removed Efuns:
|
|
+ The deprecated efuns cat() and tail() were removed. They can be
|
|
easily and more flexibly replaced by sefuns, which are supplied with
|
|
the driver. (#637, #228)
|
|
+ The efun set_light() was removed. This includes the internal light
|
|
state managment in the driver. The mudlib does a better and more
|
|
flexible job at managing light in/from objects. (#775)
|
|
+ The supporting efuns for alists were removed: insert_alist, order_alist,
|
|
intersect_alist, assoc. (#776)
|
|
+ strlen() was removed. sizeof() can be used as a drop-in replacement, which
|
|
does exactly the same thing. (#798)
|
|
+ The following efuns were removed in favor of new efuns.
|
|
There are sefun replacements in /mudlib/deprecated/. (#596)
|
|
|
|
set_heart_beat() -> configure_object(ob, OC_HEART_BEAT, flag)
|
|
enable_commands() -> configure_object(ob, OC_COMMANDS_ENABLED, 1)
|
|
disable_commands() -> configure_object(ob, OC_COMMANDS_ENABLED, 0)
|
|
seteuid() -> configure_object(ob, OC_EUID, euid)
|
|
query_once_interactive() -> object_info(ob, OI_ONCE_INTERACTIVE)
|
|
query_shadowing() -> object_info(ob, OI_SHADOW_PREV)
|
|
set_connection_charset() -> configure_object(ob, IC_CONNECTION_CHARSET_AS_STRING, val)
|
|
configure_object(ob, IC_CONNECTION_CHARSET_AS_ARRAY, val)
|
|
configure_object(ob, IC_QUOTE_IAC, 1 resp. 0)
|
|
get_connection_charset() -> object_info(ob, IC_CONNECTION_CHARSET_AS_STRING)
|
|
object_info(ob, IC_CONNECTION_CHARSET_AS_STRING)
|
|
object_info(ob, IC_QUOTE_IAC)
|
|
set_combine_charset() -> configure_object(ob, IC_COMBINE_CHARSET_AS_STRING, val)
|
|
configure_object(ob, IC_COMBINE_CHARSET_AS_ARRAY, val)
|
|
get_combine_charset() -> object_info(ob, IC_COMBINE_CHARSET_AS_STRING)
|
|
object_info(ob, IC_COMBINE_CHARSET_AS_STRING)
|
|
set_buffer_size() -> configure_interactive(ob, IC_SOCKET_BUFFER_SIZE, size)
|
|
enable_telnet() -> configure_interactive(ob, IC_TELNET_ENABLED, state)
|
|
start_mccp_compress() -> configure_interactive(ob, IC_MCCP, state)
|
|
end_mccp_compress() -> configure_interactive(ob, IC_MCCP, 0)
|
|
query_mccp() -> interactive_info(ob, IC_MCCP)
|
|
query_mccp_stats() -> interactive_info(ob, II_MCCP_STATS)
|
|
set_prompt() -> configure_interactive(ob, IC_PROMPT, prompt)
|
|
set_max_commands() -> configure_interactive(ob, IC_MAX_COMMANDS, num)
|
|
get_max_commands() -> interactive_info(ob, IC_MAX_COMMANDS)
|
|
set_modify_command() -> configure_interactive(ob, IC_MODIFY_COMMAND, ob)
|
|
query_ip_name() -> interactive_info(ob, II_IP_NAME)
|
|
interactive_info(ob, II_IP_ADDRESS)
|
|
query_ip_number() -> interactive_info(ob, II_IP_NUMBER)
|
|
interactive_info(ob, II_IP_ADDRESS)
|
|
query_editing() -> interactive_info(ob, II_EDITING)
|
|
query_idle() -> interactive_info(ob, II_IDLE)
|
|
query_input_pending() -> interactive_info(ob, II_INPUT_PENDING)
|
|
debug_info() -> driver_info(...)
|
|
dump_driver_info(...)
|
|
objects(...)
|
|
query_limits() -> driver_info(DC_DEFAULT_RUNTIME_LIMITS)
|
|
driver_info(DI_CURRENT_RUNTIME_LIMITS)
|
|
set_limits() -> configure_driver(DC_DEFAULT_RUNTIME_LIMITS)
|
|
set_extra_wizinfo_size() -> configure_driver(DC_EXTRA_WIZINFO_SIZE)
|
|
query_load_average() -> driver_info(DI_LOAD_AVERAGE_COMMANDS)
|
|
driver_info(DI_LOAD_AVERAGE_LINES)
|
|
query_mud_port() -> driver_info(DI_MUD_PORTS)
|
|
interactive_info(ob, II_MUD_PORT)
|
|
query_udp_port() -> driver_info(DI_UDP_PORT)
|
|
query_snoop() -> interactive_info(ob, II_SNOOP_NEXT)
|
|
|
|
+ The efun set_is_wizard() was removed. It can be implemented with
|
|
normal actions. Example implementations are provided in
|
|
/mudlib/deprecated. (#596)
|
|
+ The efun export_uid() was removed. The object's UID is now constant
|
|
and can't be changed. Instead the EUID can be exported with
|
|
configure_object(ob, OC_EUID, geteuid()). (#828)
|
|
|
|
- New Efuns:
|
|
+ json_parse() parses strings encoding a JSON object into an
|
|
appropriate LPC value. (optional efun)
|
|
+ json_serialize() converts a LPC value into an JSON object and
|
|
serializes it as LPC string. (optional efun)
|
|
+ configure_object() sets options for given objects. (#596)
|
|
+ interactive_info() and driver_info() return information about
|
|
interactive objects resp. the driver and the LPC runtime. (#596)
|
|
+ dump_driver_info() dumps information to a file. (#596)
|
|
+ objects() returns an excerpt from the object list. (#596)
|
|
|
|
- Portability
|
|
+ Removed built-in PCRE package, because it was awfully out of date.
|
|
Since libpcre is installed on nearly every halfway POSIX compatible
|
|
system, we just link against the system libpcre. If there is none
|
|
available, no PCREs are available in the driver (#658).
|
|
+ Removed a bunch of checks and own fall-back implementations for
|
|
functions required by C89/90/99 or POSIX.1. We just require them.
|
|
+ The data from the bytecode is not written/read byte per byte and
|
|
combined by shifting and masking anymore, but by reading the
|
|
specific type directly. This should not have endianness issues, as
|
|
long as compiled bytecode is not transferred to a different machine.
|
|
But Alignment issues may arise on some system.
|
|
+ The bytecode uses fixed-size integer types from C99.
|
|
+ Entities in the bytecode are getting their semantic types (like
|
|
bc_offset_t).
|
|
+ Take more care of issues with different width of integers in the
|
|
bytecode (e.g. long was regarded as 32 bit until now).
|
|
+ Improved detection of working sbrk/brk() and malloc replaceability.
|
|
Enabled the possibility to replace malloc while using mmap()
|
|
independently of the old SBRK_OK. (#680)
|
|
|
|
- Runtime
|
|
+ re-worked and consolidated hash functions and hash types. (#564)
|
|
+ re-worked string hashing to use dedicated hash types and MurmurHash2.
|
|
This is about 5 times faster than our old hashing algorithm and
|
|
supports hashes with more than 16 bit width. This supports larger
|
|
hash tables than 65535.
|
|
+ The ptmalloc memory allocator was removed. (#552)
|
|
+ The interpreter checks for the correct types of function arguments
|
|
upon function calls, if runtime type checks are enabled for the
|
|
program defining the function (and save_types is used as well).
|
|
(experimental feature)
|
|
+ The intrepreter checks for the correct type of return values when
|
|
returning from a lfun or sefun, if runtime type checks are enabled
|
|
for the program defining the function (and save_types is used as
|
|
well). (experimental feature)
|
|
+ When the driver receives SIGTERM, SIGINT, SIGHUP, SIGUSR1 or SIGUSR2
|
|
it calls handle_external_signal() in the mudlib master. If the master
|
|
does not handle the signal, the driver defaults back to the standard
|
|
behaviour.
|
|
+ Heartbeats were called only when players are logged on. They are now
|
|
called regardless of logged-on players.
|
|
However, the mudlib can activate/deactivate the calls to heartbeats
|
|
globally by using configure_driver(). (#731)
|
|
+ Improved the determination of the drivers current_time which fixes
|
|
issues with wrongly timed heart_beats or apparantly wrong timings.
|
|
(e.g. #743)
|
|
+ A profiling feature for detecting long executions was introduced. It
|
|
can be configured with configure_driver().
|
|
+ Redefined structs (by re-compiling its program) are now always
|
|
considered compatible. (#838)
|
|
|
|
- Language
|
|
+ Added a sefun:: specifier to explicitly call simul-efuns. (#669)
|
|
+ structs are always enabled. (#557)
|
|
+ 'new' inline closure are always enabled. (#557)
|
|
+ Added three new pragmas:
|
|
'rtt_checks', which will enable type checks at runtime.
|
|
'warn_rtt_checks', which will only give warnings on type checks.
|
|
'no_rtt_checks', which disables runtime type checks.
|
|
+ A base struct is recorded as base struct in a child struct even if
|
|
the base struct has no members. (#695)
|
|
+ The behaviour of the pragmas combine_strings, verbose_errors and
|
|
local_scopes are mandatory. These three pragmas plus their no_*
|
|
variants are ignored.
|
|
+ The pragma warn_deprecated is no enabled by default.
|
|
+ A new modifier 'deprecated' can be used to mark lfuns, sefuns and
|
|
global variable as deprecated. Using/Calling them will cause
|
|
warnings.
|
|
+ 'float' variables on LP64 architectures (64 bit) now have the same
|
|
precision as 'double' in C (the driver uses internally 'double'
|
|
instead of the traditional self-built format).
|
|
+ Implemented union types. (#721)
|
|
+ Private prototypes are now invisible in the inheriting program.
|
|
+ Programs that are virtually inherited twice will always exist
|
|
only once, updating an older program if necessary. (#233)
|
|
+ Visibility modifiers are not combinable anymore. (#771)
|
|
+ Added a new modifier: visible (which is the default visibility).
|
|
+ Many restrictions for lvalue refrences (&var, &(arr[i]),
|
|
&(arr[i1..i2])) were lifted:
|
|
- They are not limited to the original variable's scope.
|
|
Therefore they can be returned from a function or passed
|
|
to a call_out.
|
|
- For this reason the error message "Can't trace reference
|
|
assignments." doesn't exist anymore.
|
|
- A range can be indexed again, so it can be used as an array
|
|
replacement.
|
|
- Multiple char references to the same string are allowed.
|
|
Lvalue references are automatically dereferenced when they
|
|
are not used as the left hand side of an expression without
|
|
the '&' operator.
|
|
Variables that contain an lvalue reference can be 'reseated',
|
|
i.e. change their value without changing the lvalue they reference:
|
|
&var = new_value_or_reference;
|
|
|
|
- Networking
|
|
+ UDP datagrams with lengths up to 65507 (including UDP and IPv4
|
|
headers: 65535) bytes are supported.
|
|
+ TLS: Use 2048 bit wide DH parameters per default. (#845)
|
|
+ TLS: Disable weak ciphers/hashs (DES, 3DES, RC4, MD5) and
|
|
protocolls (SSLv3). (#847)
|
|
+ TLS: DH parameters can be set with configure_driver(). (#846)
|
|
+ TLS: Allowed ciphers can be set with configure_driver(). (#849)
|
|
|
|
- Other
|
|
+ The driver requires a C99 compatible build system. Some checks and
|
|
work-arounds for non-C99 were removed.
|
|
+ A bunch of statistic counters (string handler, object table, swapper,
|
|
network layer,...) were changed to a larger type to prevent them from
|
|
overflowing. (#521, #608)
|
|
+ Renamed some command-line flags to match the LPC defines better (#704)
|
|
--heart-interval -> --heart-beat-interval
|
|
--sync-heart -> --synchronous-heart-beat
|
|
--async-heart -> --asynchronous-heart-beat
|
|
--no-heart -> --no-heart-beat
|
|
+ A new savefile format (version 2) was added to store the new 'double'
|
|
floats losslessly. It additionally is simpler to write/restore and
|
|
makes the savefiles more compact because only one representation of
|
|
the float value is stored.
|
|
+ A further savefile format (version 3) was added to store lvalue
|
|
references.
|
|
+ Added --tls-keydirectory command line option to specify a multiple
|
|
TLS keys to choose from with configure_driver(DC_TLS_CERTIFICATE).
|
|
+ Added the pkg-python package to allow definition of efuns in Python.
|
|
+ The special driver actions ('status', 'malloc', dumpallobj'
|
|
and 'opcdump') were removed. They can be implemented as normal
|
|
actions. Example implementations are provided in
|
|
/mudlib/deprecated/set_is_wizard.c (#596).
|
|
|
|
30-May-2009 (LDMud Team) -- 3.3.719
|
|
- Fixed Crashes:
|
|
+ gmtime(), localtime(), ctime() and strftime() could crash the driver
|
|
on platforms where time_t is 64 bits long and users supply huge
|
|
values as time stamp (>2^55) due to unchecked results from libc
|
|
functions (Bug #587).
|
|
+ Fixed a bug in esbrk() during memory allocation, where SINT
|
|
(sizeof(word_t)) was not taken into account in the calculation of a
|
|
block size, leading to crashes afterwards. (#611)
|
|
|
|
- New Efuns:
|
|
+ configure_interactive(): To set options for interactives.
|
|
+ configure_driver(): To set settings/options for the driver itself.
|
|
|
|
- Changed Efuns:
|
|
+ idna_stringprep(): fixed the evaluation of the arguments and removed
|
|
a memory leak (#498).
|
|
+ map(): it's now possible to specify a mapping column when mapping
|
|
through mappings (#367)
|
|
+ tls_check_certificate(), tls_refresh_certs(): Now available if
|
|
GnuTLS is supported.
|
|
+ hash() and hmac() is now always available und is able to use OpenSSL,
|
|
libgcrypt or internal MD5 and SHA1 routines (builtin routines for
|
|
hash() only). hash() costs 10 ticks per iteration.
|
|
+ md5() and sha1() are obsoleted by hash().
|
|
+ lambda() now supports bound and unbound lambdas as the first element
|
|
in an array of a lambda expression.
|
|
+ xml_generate(), xml_parse(): Also available using libxml2.
|
|
+ cat(): marked as deprecated (#637)
|
|
|
|
- Runtime
|
|
+ The --max-malloced memory limit was renamed to --hard-malloc-limit.
|
|
+ Introduced new --soft-malloc-limit in addition to the hard one.
|
|
+ When exceeding the soft memory limit, the function low_memory() is
|
|
called in the mudlib master with details about the kind of low memory
|
|
situation. This check is done during the backend cycle and not at
|
|
'real-time'.
|
|
+ Made the maximum length of commands configurable at compile-time
|
|
(MAX_COMMAND_LENGTH, --max-command-length)
|
|
+ The driver hook H_MSG_DISCARDED can be used to specify the messages
|
|
given to players when their messages were discarded.
|
|
+ The soft and hard memory limits can now be configured at runtime
|
|
(configure_driver()).
|
|
|
|
- Language
|
|
+ Added a permanent define __MAX_COMMAND_LENGTH__ for the maximum
|
|
length of command.
|
|
+ Added a permanent define __GCRYPT__ when libgcrypt support is
|
|
available.
|
|
|
|
- Portability
|
|
+ Savefiles are written in binary mode, if the host system supports any
|
|
such notion (O_BINARY exists). Additionally, they are read as binary
|
|
as well, if it is supported. (Note: POSIX conforming systems do not
|
|
distinguish between 'text' and 'binary' modes, this is only relevant
|
|
to Cygwin.)
|
|
+ Fixed a major bug on 64 bit platforms, where floats with negative
|
|
exponents were saved incorrectly leading to data corruption (#627).
|
|
+ Removed the whole hosts/ directory because it wasn't maintained for
|
|
a long time and most of the systems were anyway dead for a long
|
|
time (#625).
|
|
This removed --enable-use-system-crypt as well (#624).
|
|
+ Removed checks and special code for OS2 and __EMX__.
|
|
+ Removed checks and special code for MSDOS.
|
|
+ Removed checks and special code for BeOS.
|
|
+ Removed checks and special code for AMIGA.
|
|
+ Removed checks and work-arounds for very old gcc compilers
|
|
(2.x, <3.2).
|
|
+ Removed checks and special code for SunOS4
|
|
+ Removed checks and special code for Ultrix.
|
|
+ Removed MSDOS filesystem semantics (Checks for MSDOS_FS and special
|
|
behaviour (e.g. \\ as path separator).
|
|
+ Support for using mmap() to get memory from the system (slaballoc),
|
|
because brk()/sbrk() are more or less deprecated and not supported by
|
|
some systems (e.g. Darwin/MacOS). (#640)
|
|
+ Support for using mmap() to get memory from the system (smalloc).
|
|
(#640)
|
|
|
|
- Other
|
|
+ Generalized the write buffer for non-threaded use and renamed the
|
|
configuration option '--with-pthreads-write-max-size' to
|
|
'--with-write-buffer-max-size'.
|
|
+ Removed background threads that sent the data to the network
|
|
and with it the '--enable-use-pthreads' configuration option.
|
|
+ The commandline options '--access-file' and '--access-log'
|
|
specify the access permissions and log file, activating or
|
|
deactivating access control and log. The old configure options
|
|
'--enable-access-control', '--with-access-file', '--with-access-log'
|
|
and their config.h symbols ACCESS_FILE and ACCESS_LOG just give
|
|
the default values.
|
|
+ The default path of TLS certificates are now configurable during
|
|
compile time (--with-tls-keyfile, --with-tls-certfile,
|
|
--with-tls-trustfile, --with-tls-trustdirectory, --with-tls-crlfile,
|
|
--with-tls-crldirectory), these TLS features can also be deactivated
|
|
by giving "no" during compile time or "none" as a runtime parameter.
|
|
+ Ed sessions are removed when an object becomes non-interactive.
|
|
+ Multiple ed sessions per interactive are allowed.
|
|
+ Check the compiler for support of -fwrapv and enable if supported.
|
|
Enables a fully defined overflow/wrap behaviour of signed integers
|
|
(#635)).
|
|
|
|
12-Jan-2009 -- 3.3.718
|
|
- New Efuns:
|
|
+ mktime(): convert a date/time information as returned by local_time()
|
|
to a unix timestamp (integer value).
|
|
+ strftime(): convert a timestamp to a formatted string using a format
|
|
string with a variety of format specifiers.
|
|
+ xml_generate(), xml_parse(): Optional XML support.
|
|
|
|
- Changed Efuns:
|
|
+ present_clone(): the efuns now optionally searches for the <n>th
|
|
object in <env> instead of the first one.
|
|
+ debug_info(): can be used to query the current stack control depth
|
|
with DIT_CURRENT_DEPTH (LPC recursion depth).
|
|
|
|
- Runtime:
|
|
+ random(): Uses now a new random number generator (SFMT) see below.
|
|
+ sprintf(): Can now print values larger than 2^32-1 if the driver is
|
|
compiled on 64 bit platforms.
|
|
|
|
- Fixed Crashes:
|
|
+ filter(), save_object(), restore_object(), send_erq(), send_udp(),
|
|
db_conv_string(), regexplode(), regexp(), process_string(),
|
|
present_clone(), load_object(), rename_object(), replace_program()
|
|
could crash the driver due to stack overflows, when large string were
|
|
used as arguments.
|
|
|
|
- Language
|
|
+ Disallowed case labels in inner blocks of switch statements
|
|
and variable declarations that cross case labels.
|
|
|
|
- Other
|
|
+ Exchanged the Mersenne Twister (pseudo random number generator) by
|
|
the SIMD-oriented Fast Mersenne Twister (SFMT) to support random
|
|
numbers up to 2^63-1 on 64 bit platforms.
|
|
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/SFMT/
|
|
Additionally, the period length can be configured now at
|
|
compile-time. The SFMT faciliates a better equidistribution and a
|
|
faster recovery from a 0-excess state as well. (Bug #527)
|
|
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/SFMT/
|
|
+ Added the possibility to seed the PRNG from arbitrary files or
|
|
devices by using the commandline option --randomdevice. The default
|
|
device is /dev/urandom. If that is not readable, the driver falls
|
|
back to seed the PRNG with the system time (Bug #515).
|
|
+ The driver dumps a core now even if the master object is not loaded.
|
|
+ New configuration option '--enable-eval-cost-trace' to show the
|
|
evaluation costs in the stacktrace.
|
|
|
|
10-Aug-2008 (Lars Duening) -- 3.3.717
|
|
- Changed Efuns:
|
|
+ md5(): The efuns costs 10 eval ticks per iteration (Bug #485).
|
|
+ sha1(): The efuns costs 10 eval ticks per iteration (Bug #485).
|
|
+ strrstr(): A starting position of the input string's length
|
|
led to the target string never being found (Bug #509).
|
|
|
|
- Compiler:
|
|
+ After two consecutive inline closures within the same
|
|
function, the line number information was incorrect (Bug #510).
|
|
+ Corrected an off-by-one linenumber error related to
|
|
auto-include strings (Bug #508)
|
|
|
|
- Other:
|
|
+ Improved the removal of actions added by shadows (Bug #514).
|
|
|
|
14-Oct-2007 (Lars Duening) -- 3.3.716
|
|
- Changed Efuns:
|
|
+ load_object(): The object name must not be empty (Bug #500).
|
|
|
|
- Fixed Crashers:
|
|
+ Size-changing mapping operations didn't fully check for destructed
|
|
objects as keys, sometimes derefencing invalid pointers in
|
|
the process (Bug #517).
|
|
+ Removed a crasher when running with --check-refcounts: References
|
|
by snooping non-interactives weren't counted (Bug #492).
|
|
+ Loading an object with an empty name twice could crash the
|
|
driver (Bug #500).
|
|
+ clone_object(): When initializing a clone's variables
|
|
using #pragma share_variables, really use the variables from the
|
|
blueprint object being given. This allows the handling of
|
|
inherited blueprint objects with replaced programs. (Bug #483)
|
|
+ An argument mismatch error during a lfun-closure call could
|
|
crash the driver. (Bug #495).
|
|
+ The definition 'struct abc abc;' could crash the driver. (Bug #494)
|
|
+ The use of local undefined structs as 'struct abc abc = (<abc>)'
|
|
could crash the driver. (Bug #493)
|
|
|
|
- Compiler:
|
|
+ The lfuns backing the inline closures are again 'private nomask'.
|
|
|
|
- Runtime:
|
|
+ foreach(int i: <num>) recognizes if <num> is negative and throws
|
|
an error. (Bug #503)
|
|
+ The handling of charmode with combine-charset could lead to
|
|
premature socket closing if present with longer data than the
|
|
input buffer could at one time. (Bug #442)
|
|
+ The Apply-Cache statistics counters should overflow less often
|
|
(Bug #520).
|
|
+ If a simul_efun object appears before being 'blessed', that
|
|
object is rejected to avoid variable/function inconsistency bugs.
|
|
(Bug #489).
|
|
|
|
- Other:
|
|
+ The autoconfiguration of YACC was incompatible with gentoo Linux.
|
|
+ Removed a few (partly fatal) 64-bit issues (Bug #490, #491).
|
|
+ Removed a memory leak when catching errors inside
|
|
master::runtime_error() (Bug #513).
|
|
|
|
30-Sep-2007 (Lars Duening) -- 3.3.715
|
|
|
|
- New Efuns:
|
|
+ tls_refresh_certs(): Reload the certificates and certificate
|
|
revocation information.
|
|
|
|
- Other:
|
|
+ New commandline options to handle certification revocations:
|
|
--tls-crlfile <pathname>
|
|
Use <pathname> as the filename holding your certificate revocation
|
|
lists. If relative, <pathname> is interpreted relative to
|
|
<mudlib>.
|
|
|
|
--tls-crldirectory <pathname>
|
|
Use <pathname> as the directory where your certificate revocation
|
|
lists reside. If relative, <pathname> is interpreted relative to
|
|
<mudlib>.
|
|
|
|
09-Jul-2006 (Lars Duening) -- Release 3.3.714
|
|
|
|
- New Efuns:
|
|
+ hash(): Available if OpenSSL is supported, this efun calculates
|
|
hashes for various methods.
|
|
+ hmac(): Available if OpenSSL is supported, this efun calculates
|
|
HMACs for various methods.
|
|
|
|
- Changed Efuns:
|
|
+ save_value(), restore_value(), save_object(), restore_object():
|
|
lfun closures are now saved with their inheritance path to
|
|
allow proper restoration under complex circumstances.
|
|
+ tls_check_certificate(): GEN_DNS, GEN_EMAIL and GEN_URI
|
|
certificates are supported.
|
|
|
|
- Language:
|
|
+ <array> & <mapping> implements the intersection of the
|
|
array with the indices of mapping.
|
|
|
|
- Fixed Crashers:
|
|
+ Lfun closures now keep proper track of which program
|
|
they belong to.
|
|
+ Apply cache entries for non-existing functions could lead
|
|
to memory corruption as result of garbage collection.
|
|
|
|
- Compiler:
|
|
+ If a non-virtual baseclass was inherited multiple times
|
|
with a virtual class inside the inheritance tree, its members
|
|
were merged even though they shouldn't.
|
|
+ The type tracking was improved so that variable initializations
|
|
like 'int i = to_int( ({float})0 );' compile correctly.
|
|
+ New macros __OPENSSL__ and __GNUTLS__ offer insight as to
|
|
which TLS package is being used.
|
|
|
|
- Other:
|
|
|
|
|
|
12-Mar-2006 (Lars Duening) -- Release 3.3.713
|
|
|
|
- New Efuns:
|
|
+ sl_close(), sl_open(), sl_exec(), sl_insert_id(): Optional SQLite
|
|
support.
|
|
+ idna_stringprep(), idna_to_ascii(), idna_to_unicode():
|
|
Optional International Domain Name support.
|
|
|
|
- Changed Efuns:
|
|
+ function_exists(): The 'FEXISTS_ALL' result also contains
|
|
information about the function's type, flags, and number of
|
|
arguments.
|
|
+ present(): Modified the <n> search behaviour so that the
|
|
numbering is applied over both inventory and environment
|
|
together. Before, the numbering was individual in each
|
|
space, leading to situations where low-numbered objects in the
|
|
environment were hidden by those in the inventory.
|
|
+ sscanf(): The new modifier '+' requires the matching of
|
|
the characters after a field in order to consider the field
|
|
as matched.
|
|
+ tls_check_certificate(): Returns more informative results.
|
|
|
|
- Master Object:
|
|
+ disconnect(): The remaining input data is passed as the second
|
|
argument.
|
|
|
|
- Language:
|
|
+ Inherited private functions are now more invisible and
|
|
can cleanly be hidden by publich functions.
|
|
+ Simul-efuns can only be called when they are public. This
|
|
is to enable the construction of simul-efun objects via inheritance:
|
|
this way they can use protected functions internally without
|
|
having to make them available to everybody.
|
|
+ Preprocessor macro __SQLITE__ is defined if SQLite support is
|
|
available.
|
|
|
|
- Runtime:
|
|
+ The tracedepth was calculated incorrectly for efun closures
|
|
and callbacks.
|
|
+ Removing an interactive as part of a fatal comm error clobbered the
|
|
current object.
|
|
+ Removed the stipulation that CATCH_RESERVED_COST must be twice as
|
|
much as MASTER_RESERVED_COST, since the master reserve is used
|
|
automatically anyway.
|
|
+ Missing returns are logged at runtime only once per function
|
|
and occurance.
|
|
+ If the master:;connect() initiates a secure connection
|
|
which gets stuck in the handshake, neither logon() is called nor
|
|
is the prompt printed. Also, if the tls_init_connection() didn't
|
|
set a callback, the driver will provide a callback to logon().
|
|
This way logon() won't be called unless the connection is up
|
|
and running.
|
|
|
|
- Other:
|
|
+ The makefile is able to install the driver's LPC header
|
|
files as well.
|
|
|
|
|
|
24-Nov-2005 (Lars Duening) -- Release 3.3.712
|
|
|
|
- Changed efuns:
|
|
+ Removed obsolete and deprecated efuns: add_verb(), add_xverb(),
|
|
allocate_mapping(), copy_mapping(), efun308(), extract(), file_name(),
|
|
filter_array(), filter_mapping(), m_sizeof(), map_array(),
|
|
map_mapping(), mapping_contains(), member_array(),
|
|
set_auto_include_string(), slice_array().
|
|
+ catch(): If there is not enough time left (less than
|
|
__CATCH_EVAL_COST__), this is thrown as an error from inside
|
|
the catch instead of causing the catch to return 0.
|
|
+ catch(): Modifier 'reserve <expr>' can be used to specify a computing
|
|
reserve different from __CATCH_EVAL_COST__.
|
|
+ copy(), deep_copy(), get_type_info(), to_array(), to_string():
|
|
Added struct support.
|
|
+ add_action(): Historical usage with just one argument no longer
|
|
supported.
|
|
+ assoc(), insert_alist(), order_alist(), intersect_alist(): Optional
|
|
as package 'alists'.
|
|
+ call_out(): The minimum delay can now be 0, meaning: as soon as
|
|
possible.
|
|
+ debug_info(): Option DINFO_DUMP:"memory" to dump a list of
|
|
all allocated memory blocks (currently supported just by
|
|
smalloc).
|
|
+ debug_info(): Added more data to the option DINFO_DATA:DID_MEMORY
|
|
result.
|
|
+ debug_info(): DINFO_DATA:DID_ST_PACKETS_IN and DID_ST_PACKET_SIZE_IN
|
|
are the statistics for the incoming network traffic.
|
|
+ deep_inventory(): The result can be restricted to a certain
|
|
depth.
|
|
+ filter(): The efun can now filter strings as well.
|
|
+ function_exists(): now also returns the filename and
|
|
linenumber of a function.
|
|
+ garbage_collection(): An optional flag argument allows to change
|
|
the name of the default GC log file.
|
|
+ get_type_info(): The name of the defining program of a lfun or
|
|
context closure, or the function name itself can be returned.
|
|
+ map(): The efun can now map strings as well.
|
|
+ make_shared_string(): Deprecated.
|
|
+ member(), rmember(): The start position for the search can be
|
|
specified.
|
|
+ mkmapping(): Convert structs to mappings, too.
|
|
+ pg_*(): Postgres efuns trigger a privilege violation ("pgsql", "<efun
|
|
name>").
|
|
+ process_string(): Spaces are now allowed in function arguments
|
|
and no longer terminate the function specification.
|
|
+ regexp(), regexplode(): Optionally take RE interpretation options.
|
|
+ regexplode(): New flag RE_OMIT_DELIM allows to omit the matched
|
|
delimiters from the result.
|
|
+ send_erq(): ERQ callback closures can now accept the data as
|
|
a string instead of an array.
|
|
+ sprintf(), printf(): Formats %O and %Q print floats always
|
|
with a decimal point.
|
|
+ say(), tell_room(), tell_object(): The efuns can now take a mapping,
|
|
an object or a struct instead of an array to use with the
|
|
catch_msg() mechanism.
|
|
+ transfer(): Available (in compat mode) only when USE_DEPRECATED
|
|
is in effect.
|
|
+ unique_array(): The separator function can now be a closure,
|
|
and can also be given extra arguments.
|
|
+ wizlist_info(): Added the number of mappings to the result.
|
|
+ write_file(): Allowed to remove the file before writing.
|
|
|
|
- Corrected efuns:
|
|
+ restore_object(): An exception during the restore no longer has the
|
|
danger of leaking values and memory.
|
|
+ unique_array(): An exception during the process no longer has the
|
|
danger of leaking values and memory.
|
|
|
|
- New efuns:
|
|
+ baseof(): Test the relation between two structs.
|
|
+ call_direct(), call_direct_resolved(): To perform calls which
|
|
are not resolved by a default method.
|
|
+ convert_charset(): Convert a string between character sets.
|
|
+ match_command(): Find all matching actions for a command.
|
|
+ md5_crypt(): Compute an Apache-compatible password encryption using
|
|
the MD5 message digest algorithm.
|
|
+ pg_connect(), pg_query(), pg_pending(), pg_conv_string(), pg_close():
|
|
Optional: PostgreSQL support.
|
|
+ regmatch(): To match a string against a regexp and optionally retrieve
|
|
the match results for subexpressions.
|
|
+ regexp_package(): Returns the currently selected default
|
|
regexp package.
|
|
+ reverse(): Reverse the content of an integer, a string or an array.
|
|
+ sha1(): Compute the SHA1 message digest.
|
|
+ struct_info(): Return information about a struct.
|
|
+ structp(): Predicate efun to detect structs.
|
|
+ to_struct(): Convert an array into a struct.
|
|
|
|
- Master Object:
|
|
+ Function runtime_warning() is called for runtime warnings.
|
|
+ privilege_violation(): For "set_limits" and "limited" the resulting
|
|
limits are passed as argument.
|
|
+ During the compilation of the master object, simul-efuns are disabled
|
|
(so they won't be used by accident).
|
|
|
|
- Fixed Crashers:
|
|
+ The driver crashed when a private lfun shadowing
|
|
a public sefun was virtually inherited twice in parallel.
|
|
+ When walking over a mapping of width 1, deletions from the mapping
|
|
from within the walk_mapping callback could cause walk_mapping() to
|
|
pass invalid pointers to the callback on later iterations.
|
|
|
|
- Language:
|
|
+ Strings can hold all characters, including '\0'.
|
|
+ New operator '...' to flatten array arguments in function call
|
|
argument lists.
|
|
+ foreach() can loop over references, allowing the loop to change
|
|
the base data.
|
|
+ foreach() can loop over an integer expression, implementing a counted
|
|
loop.
|
|
+ 'nosave' is now an official feature.
|
|
+ New indexing method '[>]' to index either from the beginning or
|
|
the end, depending on the sign of the index value.
|
|
+ New pragma 'range_check' allows to check array range indexing at
|
|
runtime.
|
|
+ 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.
|
|
+ Operators '|' and '|=' can compute the union of two arrays.
|
|
+ Operators '^' and '^=' can compute the symmetric difference of
|
|
two arrays.
|
|
+ Closure operators #'| and #'^ can take more than two arguments.
|
|
+ Support for structs; preprocessor symbol __LPC_STRUCTS__ is defined.
|
|
+ Preprocessor symbol __PCRE__ is always defined.
|
|
+ Real inline closures; preprocessor symbol __LPC_INLINE_CLOSURES__ is
|
|
defined.
|
|
+ New macro __BOOT_TIME__ expands to the time() the driver was
|
|
started.
|
|
+ Blueprint variables are now always initialized using
|
|
__INIT(). Clone variables are usually initialized the same
|
|
way, however with the pragmas 'share_variables' and
|
|
'init_variables' the programmer can instruct the driver on
|
|
a pre-program basis to initialize the variables of clone
|
|
from the current values of the corresponding variables in
|
|
the blueprint.
|
|
+ If the function definitions in two inherits differ in their
|
|
visibility, the compiler emits a warning.
|
|
+ Bugfix: The type recognition of the variables for a foreach()
|
|
no longer gets confused by visibility flags.
|
|
|
|
- Runtime:
|
|
+ Revamped the string handling to use refcounted strings everywhere.
|
|
+ If input is requested in CHARMODE, the NL characters are passed
|
|
verbatim to the caller (old drivers passed an empty string
|
|
instead).
|
|
+ The driver hook H_DEFAULT_METHOD can be used to resolve
|
|
call_other()/call_resolved()s to non-existing functions.
|
|
+ The driver hook H_DEFAULT_PROMPT can be used to specify a
|
|
default prompt different from "> ".
|
|
+ The driver hook H_PRINT_PROMPT can be used to do special magic
|
|
when printing the prompt.
|
|
+ The driver regularly checks the variables of all objects
|
|
for references to destructed objects and removes them; it is
|
|
therefore no longer necessary to "clean" mappings by hand.
|
|
+ The driver can now warn about missing return statements for value
|
|
returning functions (this applies only for functions with a
|
|
specified return type). If possible the driver tries to detect this
|
|
situation at compile time, but also inserts a special 'return'
|
|
bytecode to catch certain pathological cases at runtime.
|
|
The check can be controlled the pragma '(no_)warn_missing_return'.
|
|
+ New runtime 'limit' LIMIT_COST to control how much
|
|
a limited execution should cost.
|
|
+ Both the traditional and PCRE regular expressions can be used
|
|
at runtime, with the selection being made by extra option
|
|
flags.
|
|
+ The basic timing granularity and the heartbeat interval time
|
|
can be configured at compile time and with the commandline options
|
|
"--alarm-time" and "--heart-interval". The values are available in
|
|
LPC with the macros __ALARM_TIME__ and __HEART_BEAT_INTERVAL__.
|
|
+ Heartbeats can be executed synchronously (all at the same time as far
|
|
as granularity allows, regardless of when inside one hb interval
|
|
they have executed last). The commandline options are
|
|
"--sync-heart" and "--async-heart"; if enabled, the macro
|
|
__SYNCHRONOUS_HEART_BEAT__ is defined.
|
|
|
|
- Other Changes:
|
|
+ The input escape character can be configured at compile time to
|
|
something different from '!'.
|
|
+ The MAX_MAPPING configuration parameter now determines the total
|
|
number of elements (keys + values) a mapping can hold, not just
|
|
the maximum number of keys.
|
|
+ The driver can be configured to use either the traditional
|
|
regular expression code, or the PCRE package (default).
|
|
+ The threadsafe ptmalloc is now available as allocator choice (
|
|
though it doesn't support GC yet).
|
|
+ New commandline options '--share-variables' and
|
|
'--init-variables' to define the default for clone variable
|
|
initialization.
|
|
+ New configuration option '--enable-malloc-sbrk' to selectively allow
|
|
the memory allocator to use sbrk() instead of malloc() where
|
|
available (default is to allow sbrk()).
|
|
+ New commandline options '--tls-key' and '--tls-cert' to define the
|
|
x509 key- and certfile for the TLS package.
|
|
+ New commandline option '--max-mapping-keys' to determine separately
|
|
the maxinum number of entries in a mapping.
|
|
|
|
|
|
27-Nov-2005 (Lars Duening) -- Release 3.2.12
|
|
|
|
- Changed efuns:
|
|
+ md5(): Accept number arrays as arguments as well.
|
|
+ md5(): Accept the number of iterations as optional argument.
|
|
+ function_exists(): The 'FEXISTS_ALL' result also contains
|
|
information about the function's type, flags, and number of
|
|
arguments.
|
|
+ tls_check_certificate(): Return the low-level API results, and throw
|
|
an error if the connection is not secure.
|
|
+ sscanf(): Added test whether the constant characters after
|
|
a %-field also match - if not, the %-field is considered unmatched.
|
|
|
|
|
|
- Corrected efuns:
|
|
+ call_out(), input_to(): Local references are no longer
|
|
accepted as extra arguments.
|
|
+ restore_value(): Restoring one-character operator closures
|
|
in arrays works again.
|
|
+ set_environment(): Clear the RESET_STATE flag of
|
|
of the moved object's original environment, if any.
|
|
+ to_int(): No longer accepts "x<num>" as valid sedecimal notation.
|
|
|
|
- Master Object:
|
|
+ runtime_error(), heart_beat_error(): A new argument 'caught'
|
|
signals if the error is caught or not.
|
|
|
|
- Fixed Crashers:
|
|
+ Freeing a deeply nested value structure no longer overflows
|
|
the local stack.
|
|
+ An error during the fatal() processing will be treated
|
|
as a double-fatal.
|
|
|
|
- Language:
|
|
+ foreach(): When looping over a mapping with no values, or with
|
|
only the index being extracted, the loop actually loops over the
|
|
mapping and not just the indices copied into an array.
|
|
|
|
|
|
13-Feb-2005 (Lars Duening) -- Release 3.2.11
|
|
|
|
- Changed efuns:
|
|
+ db_*(): mySQL efuns trigger a privilege violation ("mysql", "<efun
|
|
name>").
|
|
+ get_dir(): New flags GETDIR_ACCESS and GETDIR_MODES to return
|
|
the file access times and file modes.
|
|
+ input_to(): New flag INPUT_NO_TELNET to modify the INPUT_CHARMODE
|
|
behaviour.
|
|
+ input_to(): New flag INPUT_APPEND to queue input_to()s.
|
|
+ tell_object(): The efun can now take an array as second
|
|
argument, and then calls catch_msg() in the target.
|
|
+ present(): The argument form (str, n) allows for ids with embedded
|
|
numbers.
|
|
+ shutdown(): Added an argument to set the process exit code.
|
|
+ to_int(): The base prefixes '0x', '0o' and '0b' are supported.
|
|
|
|
- Corrected efuns:
|
|
+ deep_copy(): Deep-copying mappings with shared arrays as keys
|
|
could corrupt memory.
|
|
+ net_connect(): On multi-homed machines, the created socket
|
|
is bound to the hostname given at program start.
|
|
+ save_object(): Matching the documentation, the efun really removes
|
|
a trailing '.c' from the filename.
|
|
+ save_{value, object}(), restore_{value, object}(): Some operator
|
|
closures could not be saved and restored.
|
|
|
|
- New efuns:
|
|
+ tls_query_connection_state(), tls_query_connection_info(),
|
|
tls_init_connection(), tls_deinit_connection(), tls_error(),
|
|
tls_available(), tls_check_certificate():
|
|
Optional: Support for TLS connections.
|
|
|
|
- Fixed Crashers:
|
|
+ A shadow executing remove_action(1, shadowee).
|
|
+ A too-large allocation (like in " "*MAX_INT) no longer crashes the
|
|
mud unless done in SYSTEM allocation mode.
|
|
+ Allocating an array enough elements to exceed the internal numeric
|
|
limits.
|
|
+ Warnings printed during the generation of a closure crashed the
|
|
driver.
|
|
+ The traceback generation was limited by the array limits, and thus
|
|
could throw an error again.
|
|
+ to_array('symbol) caused a crash.
|
|
+ An error in save_{object, value}() followed by a GC left
|
|
behind an invalid pointer.
|
|
+ Error while loading an object with a too-long filename.
|
|
+ Restoring non-existing (simul-)efun closures created illegal
|
|
closure values.
|
|
+ Specifying a fieldsize or precision beyond the numerical limits
|
|
in sprintf()/printf().
|
|
+ Indexing a 0-width mapping yielded invalid values.
|
|
|
|
- Language:
|
|
+ The macros __FLOAT_MIN__ and __FLOAT_MAX__ gave a too-small range.
|
|
+ New pragma (no_)warn_function_inconsistent to control the handling
|
|
of function redefinitions which differ in return or argument types.
|
|
+ Implemented closures explicitly referencing inherited functions
|
|
("#'super::fun").
|
|
|
|
- Runtime:
|
|
+ Closures now work correctly when used as mapping keys.
|
|
+ The tracedepth wasn't calculated correctly.
|
|
+ A 'Command too long' error now also prints the beginning of the
|
|
offending command as debugging aid.
|
|
+ Corrected a number of memory leaks in runtime errors.
|
|
+ Corrected a memory leak in MCCP.
|
|
+ An error during a call-out causes all pending call-outs for the
|
|
same user in the same cycle to be re-scheduled to the next cycle.
|
|
+ If an ERQ callback accepts an array, the numbers in the array
|
|
are all positive in the range 0..255.
|
|
+ Float variables without an initializer are now properly initialized
|
|
to float-0 instead of number-0.
|
|
+ Calls from destructed objects to other objects (including simul-efun
|
|
calls) elicit a warning.
|
|
+ The garbage collection now zeroes out closures found to be bound to
|
|
destructed objects. The old behaviour was to change them into 'undef'
|
|
closures.
|
|
|
|
|
|
13-Apr-2004 (Lars Duening) -- Release 3.2.10
|
|
|
|
- Changed efuns:
|
|
+ debug_info(): Removed the DID_MEM_UNUSED value from the DINFO_DATA:
|
|
DID_MEMORY result.
|
|
+ debug_info(): Added the DID_ST_MB_ values to the DINFO_DATA:
|
|
DID_STATUS result.
|
|
+ debug_info(): The DINFO_DATA:"objects" dump also lists the object
|
|
creation times.
|
|
+ debug_info(): Added DID_ST_BOOT_TIME to the DINFO_DATA:DID_STATUS
|
|
result.
|
|
+ debug_info(): Added a third argument to DINFO_OBJLIST to return
|
|
multiple objects.
|
|
+ function_exists(): now also returns the filename and linenumber
|
|
of a function.
|
|
+ remove_action(): It is now possible to remove all actions
|
|
an object defines.
|
|
+ save_object(), save_value(): The format of the saved data can
|
|
be specified with an function argument.
|
|
+ set_connection_charset(), set_combine_charset(): Passing 0 as
|
|
argument re-establishes the default charset.
|
|
+ sprintf(), printf(): Modifier '#' for '%O'/'%Q' prints the values
|
|
in a compact format.
|
|
+ sprintf(), printf(): Format specifier '%b' prints a number
|
|
in binary notation.
|
|
+ wizlist_info(): The evalcost statistic is now split into 'ticks'
|
|
and 'gigaticks', and a second non-decaying evalcost statistic
|
|
has been added.
|
|
|
|
- Corrected efuns:
|
|
+ find_call_out(): No longer throws an error when passed an unbound
|
|
lambda to look for.
|
|
+ m_add(): Fixed a memory leak when existing entries were overwritten.
|
|
+ remove_input_to(): The proper noecho state is restored after
|
|
removing a pending input handler.
|
|
+ restore_object(): The function leaked memory when restoring from
|
|
a MALLOCed string.
|
|
+ to_array(): When converting a string, the characters are treated
|
|
as unsigned.
|
|
|
|
- New efuns:
|
|
+ enable_telnet(): Enable or disable telnet for an interactive
|
|
object.
|
|
+ master(): Return the current master object.
|
|
+ m_entry(): Return all values for mapping entry at once.
|
|
+ start_mccp_compress(), end_mccp_compress(), query_mccp(),
|
|
query_mccp_stats(): Optional: MCCP support.
|
|
+ net_connect(): Open a TCP connection.
|
|
+ rmember(): Search arrays and strings from the end.
|
|
+ get_combine_charset(), get_connection_charset(): Query the
|
|
combine resp. connection charset.
|
|
+ get_max_commands(): Query the allowed command rate of an
|
|
interactive object.
|
|
+ set_max_commands(): Set the allowed command rate of an
|
|
interactive object.
|
|
+ strrstr(): Search a string within a string backwards.
|
|
+ variable_exists(): Check the existance of a named variable.
|
|
+ variable_list(): Return all variable names of an object.
|
|
|
|
- Master Object:
|
|
|
|
- Fixed Crashers:
|
|
+ Using 'break' or 'continue' in large programs caused bytecode
|
|
corruption.
|
|
+ Function calls by address and global variable accesses are no
|
|
longer possible after set_this_object().
|
|
+ Overflowing the value stack during a secure_apply() could
|
|
crash the driver in the error recovery.
|
|
+ walk_mapping(): If the callback object was destructed
|
|
before the first call, the efun crashed in the error handling.
|
|
+ Swapping of volatile strings could crash the driver.
|
|
+ H_COMMAND specifying an lfun by name which doesn't exist
|
|
in the interactive object.
|
|
+ Using function_exists() or variable_exists() on a destructed
|
|
object.
|
|
+ Editor: 'Z' given at the end of a file followed by two 'd'
|
|
corrupted the internal text storage, which sometimes
|
|
caused crashes.
|
|
|
|
- Language:
|
|
+ catch(; nolog) is now an official feature.
|
|
+ New modifier catch(; publish).
|
|
+ Constrained the switch() grammar so that only blocks are
|
|
suitable as bodies.
|
|
+ Operator '&' can intersect mappings with other mappings and arrays.
|
|
+ Macro __MAX_MALLOC__ is defined to the internal upper limit for
|
|
total memory usage.
|
|
+ Macro __MSDOS_FS__ is defined on systems using the MS-DOS
|
|
filesystem conventions.
|
|
+ Preprocessor symbol __FILENAME_SPACES__ is defined if the driver is
|
|
instructed to allow spaces in filenames.
|
|
+ A cast of a value to its own type, or a cast not resulting in a
|
|
conversion operation generates a warning. The pragma
|
|
no_warn_empty_casts can turn this warning off.
|
|
+ The strong_types/strict_types pragmas now persist beyond the
|
|
end of an include file (as does every other pragma).
|
|
+ call_other()s on arrays of objects is now configurable; if enabled,
|
|
the macro __LPC_ARRAY_CALLS__ is defined.
|
|
+ Bugfix: Characters with the 8th bit set are now treated as positive
|
|
when entered as literal character constants.
|
|
+ Bugfix: Illegal case ranges like '100..50' now generate
|
|
an error message.
|
|
|
|
- Runtime:
|
|
+ Mapping are now compacted (apart from a GC) only, if a certain
|
|
amount of time has elapsed since the last addition/removal
|
|
of a key, and if either more than half of the condensed entries
|
|
have been deleted, or if the number of hashed entries exceeds
|
|
the number of (non-deleted) condensed entries.
|
|
+ A heart-beat error now longer aborts the heartbeat cycle.
|
|
+ The operators -=, *= and /= can now operate on <int> x <float>,
|
|
yielding a <float> result.
|
|
+ <mapping> &= <mapping>, <mapping> &= <vector> implemented.
|
|
+ Allowed longer program names in backtraces.
|
|
+ If the H_RESET/H_CREATE_* hooks are defined by name, static
|
|
functions are found as well.
|
|
+ Bugfix: Subtracting arrays of closures from each other now actually
|
|
identifies identical closures.
|
|
+ Bugfix: The smalloc allocator now re-uses free 'large' memory for
|
|
small block chunks instead of always allocating them from the
|
|
system.
|
|
|
|
- Other Changes:
|
|
+ Editor: Consecutive 'z' or 'Z' commands no longer repeat
|
|
the previous current line.
|
|
+ Editor: Faulty commands 'quit'/'Quit' are caught before
|
|
the text buffer is cleared.
|
|
+ Configuration option '--enable-malloc-sbrk-trace' to enable
|
|
a log of all system memory requests including the stats of
|
|
the memory allocation request causing it. The intention is
|
|
to help debugging muds with high system memory usage.
|
|
+ Configuration option '--with-optimize' to set the optimization
|
|
level in the generated Makefiles.
|
|
+ New commandline option '--filename-spaces'/'--no-filename-spaces'
|
|
to allow or disallow space characters in filenames (default is to
|
|
disallow them).
|
|
|
|
|
|
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 explicit 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.
|
|
+ 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 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.
|
|
+ New predefined macro __RESET_TIME__ and __CLEANUP_TIME__
|
|
to return the default reset and cleanup interval time.
|
|
+ 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 explicit name inherited functions
|
|
(#'base::create).
|
|
+ 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:
|
|
+ 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.
|
|
+ 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.
|
|
+ Signal USR2 forces the driver to reopen the host.debug.log file.
|
|
+ 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.
|
|
+ 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.
|
|
+ Commandline option '--erq' can now be used to pass simple arguments
|
|
to the erq.
|
|
+ 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.
|
|
+ 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.
|