lpmoo-1.2/etc/
lpmoo-1.2/mudlib/
lpmoo-1.2/mudlib/etc/
lpmoo-1.2/mudlib/include/
lpmoo-1.2/mudlib/include/moo/
lpmoo-1.2/mudlib/lpc/
lpmoo-1.2/mudlib/std/auto/
lpmoo-1.2/mudlib/std/bfuns/
LPMOO Version History

0.5.1 (prerelease version)

 - match() and rmatch() not implemented yet.
 - open_network_connection() not implemented yet.
 - Task timeouts are not well defined.
 - The constant -2147483648 cannot be used in MOO code.
 - The eval() builtin leaks objects.
 - The builtin parser does not do partial name matching yet.
 - The MOO->LPC compiler can generate code which is too large.
 - read() tasks do not appear in queued_tasks() and cannot be killed.

0.6 (not released)

 - Rewrote /lib/compiler to use editor() instead of building strings.
 - Fixed hooks for dump_database() to make log entries and call verbs.
 - Fixed a problem in call_verb that didn't invoke the correct continuation
     when a verb was not found and the mode was !d.
 - Fixed bug in unparser which mistakenly recognized keywords as identifiers.
 - Enhanced object verb cache to also cache inherited verbs and verb misses.
 - Fixed benign bug in parser which didn't distinguish between
     return; and return 0;
 - Fixed significant bug in command parsing which didn't allow a preposition
     to occur at the end of a command.
 - Replaced part of command parsing with sscanf() for better performance.
 - Fixed bug in scanner which didn't correctly flag missing quote errors.
 - Stopped numbers from being found as command verbs.
 - Stopped eval() from leaking objects, at the expense of still possibly
     leaking them if the task is killed.
 - Fixed read() to unregister its task properly.
 - Fixed kill_task() when the task is a read() task.
 - Changed the verb cache not to cache misses or wildcard verbs.
 - Fixed a fatal bug in eval().
 - Fixed problem with move(obj, #-1).
 - Fixed problem with nonwizards changing nonplayer object names.
 - Created /std/core which...
 - Replaced most occurrences of GLOBAL and other string references with
   direct object references for efficiency.
 - Added DRIVER->do_shutdown().
 - Fixed benign unparsing bug which failed to capitalize builtin variable
   names.
 - Identified but not yet fixed several serious unparsing bugs.
 - Fixed a significant unparsing bug.
 - Added a new configuration setting, checkpoint_file, for the location of
   the LambdaMOO-style db dump file written with dgd_checkpoint_db().
 - Fixed a bug in /obj/dbsaver which munged verb argument information.
 - Changed verb compilation to occur in /verb, with LPC files being removed
   when the verb is reprogrammed or deleted.

0.7 (not released)

 - Rewrote compiler and support code to use new, optimal continuation
   scheme for suspend().
 - Added floating point numbers as a new datatype. New builtin variable:
   FLOAT; new builtin functions: tofloat(), floor(), ceil(), frexp(), ldexp(),
   fmod(), modf(); modified builtins to accept float arguments: abs(), sqrt();
   new error: E_OVERFL == "Floating point overflow".
 - Rewrote sqrt() with a new, robust algorithm.
 - Added associative array tables as a new datatype. New builtin variable:
   TABLE; new builtin functions: newtable(), tableinsert(), tabledelete(),
   tablekeys(), tablevalues(), table_bound(). Tables are immutable.
 - Modified scanner and parser to accept {key1 ~ val1, key2 ~ val2, ...}
   syntax for creating tables, including splice ability.
 - Changed the MOO value representation to use strings instead of arrays
   for objects, errors, and status words.
 - Fixed a bug which had forbidden "~" to appear in strings.
 - Rewrote the lvalue assignment code in /std/verb to copy-on-write, and
   work correctly with tables.
 - Rewrote the list-compiler code in /std/verb to work correctly with
   tables, lists, and splices. It is potentially now much more efficient
   as it no longer uses an array to indicate spliced elements.
 - Cleaned up a lot of code in /std/bfuns, /obj/object, et. al; removed
   all references to R_* constants.
 - Finished the implementation of match() and rmatch() with some help from
   a new DGD regexp package (also distributed separately.)
 - Fixed an implementation error where the permissions of a property lookup
   were based on the owner of the object, not the owner of the property.
 - Performed minor optimizations on some builtin functions.
 - Altered the parsing semantics of lvalues to yield an error only after
   the entire expression is parsed, to better simulate LambdaMOO.
 - Fixed an improper simulation of crypt() with 1-character second argument.
 - Demoted the LambdaMOO version to 1.7.6 because support for #0:do_command
   is not yet in place.
 - Fixed a bug with the setting of the `this' variable in move()'s :accept().
 - Standardized the verb-calling sequence, making sure to verify that
   `player' is an object before accepting it from wizards.
 - Optimized the addition of builtin constant variables (NUM, OBJ, et. al).
 - Fixed several problems related to "huh" processing.
 - Modified the internal debugging mechanisms.
 - Added support for addressing prepositions numerically, which apparently
   was not documented in the LambdaMOO Programmer's Manual, but is relied
   upon in the LambdaCore database.
 - Changed the list of builtin prepositions to be configurable.
 - Fixed another bug related to the new command verb finding routine.
 - Moved traceback code from the DRIVER object into the GLOBAL object.
 - Implemented E_MAXREC error detection, avoiding DGD stack overflow errors.
 - Fixed a bug related to !d verbs and error detection.
 - Fixed a minor bug related to division by zero and typecasting.
 - Added support for floating point modulus with the % operator.
 - Implemented max execution error detection (running out of ticks).
 - Altered the MOO call stack representation to eliminate an array access.
 - Fixed the omission of SUFFIX after errors.
 - Fixed the special parsing of " and : and ; after whitespace.
 - Cleaned up the verb object-loading code in /obj/object.
 - Changed the ordering of perms checks to avoid unnecessary wizardp() calls.
 - Removed GLOBAL->get_objnum(obj), in favor of obj->get_objnum().

0.8 (not released)

 - Finished reimplementation of suspend() and read().
 - Fixed a problem in obj->set_verb_code() which failed to reset the cache,
   necessary only because of the possibility that the verb cache has become
   detached during swapping.
 - Fixed an unparser problem with (foo = bar).prop, and also presumably
   (foo = bar):verb.
 - Changed dgd_checkpoint_db() to backup the previous checkpoint, if any.
 - Fixed a bug in callers() which failed to objectify an object number.
 - Fixed a bug which improperly compiled multiple fork constructs.
 - Made the name of the server log file configurable.
 - Removed /std/mooconn, merging code into /obj/connection.
 - Fixed a bug which prevented dump_database() from working.
 - Cleaned up various pieces of code in /obj/object.
 - Optimized /obj/connection by reducing redundant parsing work.
 - Moved info[I_VARS][VAR_OFFSET] to info[I_VARDEFS] for efficiency.
 - Enabled objects to cache command verbs; this will need helping.
 - Fixed another failure to call reset_verb_cache().
 - Replaced the verb cache and regexp cache with a new generic /std/cache.
 - Changed MOO object representation to use virtual DGD objects "/moo/78".
 - Changed ob.location and ob.contents representation to use DGD objects
   rather than ints.
 - Added checks for builtin props to {is_,}clear_property().
 - Fixed a bug where create() failed to correctly generate errors.
 - Altered suspended task times upon restart to reflect new start time.
 - Implemented hooks for #0:do_command, making LPMOO compliant with version
   1.7.7 of LambdaMOO.
 - Added reference counting to DGD verb objects.
 - Cleaned up interface to the built-in eval backdoor.
 - Fixed a problem with suspend() and read() that caused an internal error.
 - Added (experimental) support for onc().

1.0 (first public release)

 - Fixed semantics of object/verb/property/task ownership such that non-
   players may own them (LambdaMOO 1.7.2). Also, nonexistent objects may
   own tasks.
 - Fixed a problem where a connection closed during a read() caused the
   reading task to be silently killed rather than raising E_INVARG.
 - Fixed a problem where the line number for `while' expressions was not
   updated correctly upon reiterations.
 - Fixed a bug where case became significant for `for' and `fork' variables.
 - Added hooks to trap String too large and Array too large errors.
 - Fixed a problem which led to an infinite loop in the lexical analysis of
   numbers at the end of input.
 - Added a fromliteral() builtin to complement toliteral(); this uses the
   same lexical analyzer as the code parser, but only recognizes literal
   expressions, and does not accept @-splice list elements. This builtin was
   added because in-MOO processing is too slow, and eval() is too risky.
   Also, eval() adds too much extra overhead to compile a DGD object.
   The function returns {1, value} on success and {0, reason} on failure.

1.1 (second public release)

 - Restructured the way verbs are compiled. Abstract syntax trees are
   thrown away as soon as LPC code has been generated and the original
   source (regenerated from the AST) has been saved in a file. As a result,
   memory usage is drastically decreased, particularly during bootstrap.
 - Fixed a problem where fromliteral() would not accept negative numbers.
 - Fixed bug whereby permission strings were case-sensitive.
 - Added support for binary connections. This also allows incoming lines
   to be of somewhat arbitrary length (up to 64K).
 - Added support for calling arbitrary LPC functions from MOO (wiz-only).
 - Added input_to() LPC primitive for directly receiving input lines.
 - Made minor cosmetic changes in certain code.
 - Enhanced the MOO->LPC compiler to generate more efficient code for simple
   expressions and boolean expressions.
 - Fixed a problem where the dbsaver could be left in an inconsistent state
   after a failed checkpoint.
 - Moved the MOO stack pointer into a local variable for improved efficiency.
 - Fixed an incompatibility with `expr' in the bootstrap Makefile.
 - Moved the line number counter into a local variable.
 - Rewrote much of the MOO->LPC compiler to generate more efficient code
   for list constructions, verb calls, and builtin function calls.
 - Changed the entire value-passing structure to return values instead of
   pushing them onto the MOO stack.
 - Cleaned up the suspend/resume mechanism to use less program space.
 - Added dgd_set_prompt() and dgd_get_prompt() MOO builtins for controlling
   a connection's prompt string (default "").
 - Added logging of x.wizard = 1 events.
 - Made more optimizations to the compiler, simplifying assignments and
   half-simple kfun expressions.
 - Dereferenced the local variable array by one for increased efficiency.
 - Fixed some odd return results from assignments which failed in !d verbs
   to behave more like LambdaMOO.
 - Cleaned up disconnecting methods, also fixing the problem of
   #0:user_disconnected not getting a clean call stack.
 - Moved storage of verb code back into verb objects, so that state dumps
   are atomic representations of the database.
 - Rewrote the dbloader to read incrementally, reducing memory requirements.
 - Fixed a problem with command parsing when the player is in #-1.
 - Changed internal representation of MOO strings to be the same as DGD
   strings for improved performance.
 - Eliminated the internal CLR datatype, replacing it with STW.
 - Fixed a problem with create() introduced by a previous change.
 - Fixed a problem with /obj/dbsaver which prevented making a checkpoint.
 - Fixed a problem with user client disconnects.
 - Removed dgd_read_file() in favor of letting this functionality be made
   available through an LPC module.
 - Removed dgd_call_lpc() also for the same reason.
 - Added a nonfunctional disassemble() builtin, making LPMOO compatible with
   version 1.7.8 of the LambdaMOO server.
 - Added new capability to attach connections to LPC objects;
   #0:do_login_command may return a string naming the LPC object.
 - Fixed a problem that occurred if a binary connection is established during
   bootstrapping.
 - Fixed the compiler to evaluate "obj.(prop)[a][b] = c" in the order (obj,
   prop, a, b, c) to be consistent with LambdaMOO. Same for indexed variable
   assignments.
 - Optimized simple assignments and simple list constructions.
 - Modified /lib/unparser to generate tokenized source; added /lib/detoken
   for converting back into MOO source.
 - Fixed a problem with substitute() that returned E_INVARG in certain
   apparently valid circumstances.
 - Eliminated the VERB_CNAMES field of verbs; these are now computed manually.
 - Added new floating point math functions: exp(), log(), log10(), pow().
 - Added support for dgd_set_noecho() to disable input echoing via telnet opts.
 - Extended table support to allow indexing by lists and tables.
 - Standardized error messages returned by fromliteral().
 - Cleaned up GLOBAL object to use /std/core.
 - Fixed a problem which prevented #0:user_*connected from being called
   when a client disconnected during a read().
 - Fixed a problem where .ownership_quota was not affected if it was clear.
 - Consolidated code to construct verb variable arrays.
 - Added support for "Too many forked tasks" errors.
 - New floating point math functions: sin(), cos(), tan().
 - Modified connection object mechanism to be general with respect to telnet,
   binary, and outbound connections.
 - Added support for multiple-port listening: listen(), unlisten().

1.2 (third public release)

 - Fixed an inconsistency with LambdaMOO: obj:accept() is only called by
   move() if the user is not a wizard.
 - Fixed a bug in onc() which established telnet connections but expected
   binary input. onc() connections are now purely binary.
 - Changed the semantics of the binary port so that :do_login_command() is
   called with an empty line when inbound connections are first established.
 - Fixed the third optional argument to listen() to be case-insensitive.
 - Added the beginnings of an LPC->MOO interface, /std/moo.
 - Fixed onc() to set the listener object for a connection, and added an
   optional argument to specify which object (if other than #0).
 - Fixed toliteral() not to substitute \t for tab characters, and optimized
   MOO string escape/unescape operations.
 - Changed float builtin functions to accept integer arguments which are
   implicitly converted to floats.
 - Patched Dark's network package to properly detect failed connections.
 - Added smart configuration "guesses" to the installation procedure.
 - Fixed an include problem in the dbsaver.
 - Significantly improved the input processing algorithm for binary
   connections; read() may now return immediately if data is available.
 - Changed the way verb names are matched; should be much more efficient.
 - Fixed .pr*ogram to be capable of being partially matched.
 - Rewrote the generic cache not to use expensive array manipulations;
   should be much more efficient.
 - Upgraded DGD to 1.0.9; upgraded dgd-rgx to 0.3; modified install procedure.
 - Removed /std/vartext and /std/eefun from precompilation; these are only
   used in debugging.
 - Fixed a bug where the empty table {~} was unparsed incorrectly as an empty
   list {} when returned from verb_code().
 - Fixed a problem with obj.("") and obj:("")() in unparsing.
 - Changed the way indentation is represented in tokenized verb source such
   that indentation may be arbitrarily deep.
 - Modified object verb caches not to cache information about verbs in other
   objects; this should decrease the size taken by caches and improve the
   performance of operations that modify verbs.
 - Fixed a problem with the parser when internal errors occur.
 - Modified the verb-finding code to search based on arguments/+x first
   instead of name first, reducing time complexity.
 - Made optimizations to obj->call_verb().
 - Made minor optimizations to /lib/compiler.
 - Replaced property cnames with 0 when they are the same as the hash key
   in object property mappings, reducing space overhead.
 - Removed cname elements from property mappings completely except for in
   objects which define the property.
 - Fixed benign unparsing semantics in which foo[bar] was sometimes
   unnecessarily enclosed in parenthesis.
 - New builtin function dgd_port_number() returns the remote TCP port of
   a connection, if the networking package is installed.
 - Overhauled the builtin function call mechanism; arguments are passed
   directly where possible, eliminating the creation and length checking
   of arrays. Files containing builtins reorganized.
 - Created /lib/btable to manage builtin functions, including the number
   of expected arguments and whether the builtin may suspend.
 - Introduced a layer of abstraction between stored properties and their
   values; lists of strings are condensed into a single string.
 - Rewrote external DNS resolver daemon in C to avoid dependencies on Perl.
 - New builtin function atan() computes arctangent of argument.
 - Updated documentation for writing builtins.
 - Changed the default sector size to 1024 bytes; smaller binary files at the
   expense of fewer available sectors.
 - New element in dgd_status() is a list of currently open network ports.
 - Fixed a bug where `this' was set wrong in listening objects other than #0.
 - Altered the interface between telnet/binary/outbound connection objects
   slightly.
 - Fixed incorrectly assumed inconsistency with LambdaMOO: obj:accept() is
   indeed called regardless of whether the user is a wizard. However, the
   order of events was still incorrect, and has been changed.
 - Fixed an unfortunate unparsing problem related to operators of similar
   precedence.
 - Modified the connection timeout mechanism to reset after input from the
   connection, and not to set the connection's connect time until after
   :do_login_command returns something useful.
 - Increased the DGD value stack to accomodate MOO recursion in near-limit
   situations (so a MOO error is generated, rather than a DGD one.)
 - Modified the checkpoint procedure to reschedule the next checkpoint before
   calling #0:checkpoint_started, and to ignore any errors in that call, in
   order to avoid problems of never checkpointing due to a runtime error.
 - Upgraded DGD to 1.0.9.1; integrated patches to resolve conflicts between
   DGD 1.0.9.1 and net-5.
 - Changed the order of arguments to listen() for better consistency.
 - Allowed $dump_interval to be negative, which prevents automatic
   checkpoints and leaves this responsibility with the database.
 - Upgraded DGD to 1.0.9.10; this makes LPMOO potentially unstable, but
   the memory and speed benefits are important. Redesigned the way
   installation patches are applied. DGD will be stable again soon enough.
 - Minor changes to timing of dbloader status messages.
 - Fixed a minor error in global.c that sometimes caused an error when
   disconnecting an already disconnected connection.
 - Fixed a bug in dns.c which sometimes led to lookup problems when lookups
   were still in progress.
 - Added an optional argument to callers() which returns the call stack for
   the specified task; the current task is the default.
 - New datatype: buffer; typeof() == BUF; raw binary data.
 - New builtin function: tobuf() converts strings, numbers, and buffers into
   a single buffer value.
 - notify() will now accept a buffer to send to a connection, verbatim,
   with no automatic newline.
 - Fixed another incompatibility in substitute() with LambdaMOO.
 - Strings returned from LPC which contain binary data will be returned as
   buffer types.
 - Allowed min() and max() to accept float arguments.
 - Further optimization of list construction to take advantage of DGD's
   left-to-right evaluation of literal arrays.
 - Revised ticks_left() and seconds_left() to be a little more accurate.
 - Optimized renumber() to use ownership hints to avoid scanning the entire
   db if possible.
 - Updated documentation.
 - Added an optional argument to read() which (if true) will cause it to
   return binary data from a connection as a buffer.
 - Modified binary connection object to buffer output better.
 - Changed receive_message() handling to call suffix() and prompt() cleanly
   via finish(), even when execution is aborted.
 - Fixed a benign bug in binary connection handling that could cause a DGD
   traceback.
 - Made dgd_checkpoint_db() obsolete by overloading dump_database() with an
   optional argument.
 - Text dumps are now delayed until after MOO execution has completed.
 - Optimized internal toupper(), tolower(), and verbname_match() with a
   static table.
 - Optimized the code which locates verbs (again), this time making separate
   functions for locating +x verbs and other verbs. !x verbs are no longer
   cached (limited usefulness and generally expensive on memory.)
 - Modified /obj/dbsaver not to use DGD's editor (lines sometimes exceeded
   the editor's limit.)
 - Control characters are now removed from non-binary connection input.
 - Tracebacks for user LPC code are now more informative.
 - Fixed a problem with cont_suspend().
 - Calls to nonexistent LPC functions now raise E_VERBNF.