===== OCaml NAE Core Foundation (cf) library =====

This file describes in technical detail the functional differences between
released versions of the library.


===== Version 0.10 =====

Highlights of the changes:

+ Compatibility with FreeBSD 6.2.
+ Compatibility with OCaml-3.10.x
+ Deprecated all the network extension modules, which are now delivered in the
  Nx library.  If you still need them Cf versions, you can restore them by a
  simple edit of the Makefile.
+ Changed type of [Cf_gadget.null] to a monad.  Added some additional monads.
+ Renamed [jack] and [plug] to [fix] and [pad], for cosmetic reasons.

--- [Cf_gadget]
    The [null] object is now a monad that producs a null wire.  New [connect]
    and [connectpair] functions are generalizations of the [simplex] and
    [duplex] functions.  Renamed [jack] to [fix].  Renamed [plug] to [pad].
    Renamed [gates] to [gate].

===== Version 0.9 =====

Highlights of the changes:

+ Compatibility with OCaml-3.10+beta.
+ Fix bug in Cf_rbtree.nearest_(incr|decr) functions.
+ Minor performance improvement.
+ Minor bugs in tests fixed.
+ Noted that socket extensions and event multiplexing are moving to the
  forthcoming Nx library.

--- [Cf_scan_parser]
    Upgrade to OCaml-3.10.0.

--- [Cf_sbheap]
    Improve performance of [head].

--- [Cf_rbtree]
    Fix bug in [Cf_rbtree.nearest_(incr|decr)] causing the whole tree to be
    returned if there is an exact match for the key.

--- [t_cf]
    Fix T11 and T12 to orderly close the transmit before receiving.
    Fix typographical errors in diagnostic messages.
    Add T18 for testing [Cf_rbtree.nearest_(incr|decr)].

===== Version 0.8 =====

Highlights of the changes:

+ Fix bugs and remove warnings generated when compiling with OCaml 3.09 series.
+ Changed named of types to remove [_t] suffixes (that were never a good idea).
+ Rewrote the gadget monad again, to permit input backtracking on the flow
  resulting from evaluation.
+ Minor changes to event polling to simplify interface.
+ Modularity improvements to socket API.
+ Update the hard-coded TAI-UTC leap second archive.
+ Update copyrights and author email address.
+ Minor improvements to lazy sequences and functional messages.
+ Removed obsolete modules.

--- [Makefile]
    Use -warn-error A on debug builds.

--- [Cf_deque]
    Use recursive module instead of magic.  Add [to_list], [of_list] and
    [of_seq] convenience functions.

--- [Cf_rbtree]
    Optimizations for better performance.  (Further optimizations are possible.
    While these modules offer more adaptability than the standard OCaml library
    data structures, they do not offer superior performance.  In some cases,
    performance is a little better than the standard, but in most cases, the
    standard library is runs faster.  This is particularly true for the binary
    set operator functions.)

--- [Cf_ip4_addr,Cf_ip6_addr]
    Fixed an awful bug in the [compare] functions that caused the return value
    to be mistyped.

--- [Cf_tai64]
    Update the hard-coded TAI-UTC leap second archive.  Add a comment describing
    where to retrieve the data.

--- [Cf_scan_parser]
    Fix brokenness surfaced by OCaml 3.09 series.

--- [Cf_gadget]
    Re-engineered, again.  This time, the integrated state is dropped from the
    monad, and the scheduler is no longer implemented in the imperative style.
    As a result, evaluating the monad now produces a flow that permits
    backtracking on the input.

--- [Cf_state_gadget]
    This is the old [Cf_gadget] from version 0.7, with some minor improvements.
    
    Use [try... with] to catch only the [Queue.Empty] exceptions raised by the
    calls to [Queue.take] in the scheduler itself.  All other exceptions are
    passed through the flow produced by [Cf_gadget.eval].
    
    Added [abort] and [wirepair] monads.  Simplified by removing [fsimplex]
    monad, and the [simplex_t] and [duplex_t] types.

--- [Cf_machine]
    Obsolescent.  Use the [start] and [next] classes in [Cf_gadget] instead.

--- [Cf_message, Cf_seq]
    Add [to_function] for convenience constructing [Scanf.scanbuf] objects.
    The indirection is required to keep [Scanf] from having to be loaded if it
    isn't used.

--- [Cf_journal]
    Add [`Notice] event level, and associated method in [agent] class.  Cleared
    up some ambiguous language in the documentation.

--- [Cf_nameinfo]
    Interface was busted for all queries except with the default hints.
    Refined interface to support narrowed queries.

--- [Cf_poll]
    Unified ['a state_t] and ['a file_state_t] into a single concrete variant
    type and removed the polymorphism on the state variant in all the derived
    event classes.  Event classes are now parameterized by event type alone.
    
    Changed [time] class to be a repeating interval timer event.
    
    Fixed [idle] so that events that reload themselves are not serviced until
    the next cycle.

--- [Cf_ipX_proto, Cf_xxx_socket]
    Moved the definitions of the protocol modules into the [Cf_ipX_proto]
    modules.  This will allow [Iom] to link with the core socket API without
    also linking in all the convenience classes for synchronous I/O.

--- [Cf_lexer]
    Obsolete, therefore removed.

--- Changed names of types to remove [_t] suffixes.
    
    Module              Type names changed
    ------              ------------------
    [Cf_journal]        [invalid_t], [fail_t], [error_t], [warn_t], [info_t],
                        [debug_t], [basic_t], [enable_t], [level_t]
    [Cf_seq]            [cell_t]
    [Cf_flow]           [cell_t]
    [Cf_gadget_t]       [work_t], [gate_t], [wire_t], [guard_t]
    [Cf_lex]            [counter_t]
    [Cf_socket]         [socktype_t], [domain_t], [protocol_t], [sockaddr_t],
                        [sockopt_t], [tag_t], [address_t], [msg_flag_t]
    [Cf_sock_common]    [address_t]
    [Cf_ip4_addr]       [network_t]
    [Cf_ip4_proto]      [tag_t], [address_t]
    [Cf_ip6_proto]      [tag_t], [address_t], [mreq_t]
    [Cf_uri]            [host_t], [server_t], [authority_t], [segment_t],
                        [abs_path_v], [rel_path_v], [path_t], [absolute_t],
                        [relative_t], [reference_t] [abs_special_t],
                        [abs_special_hier_t]

--- [t_cf]
    Test Cf_scan_parser.scanfx "%!".

===== Version 0.7 =====

Highlights of the changes:

+ Some very minor bugs fixed.
+ Minor performance and improvements.
+ Additions to [Cf_parser] interface.
+ Minor modifications to [Cf_parser] and [Cf_lex] interfaces.
+ New module [Cf_machine]: object-oriented layer over [Cf_gadget].
+ Removed trailing underscores from private methods defined in class types
  for the purpose of establishing a convention.

--- [Cf_seq]
    Added [sentinel].  Added [?x] optional argument to [limit].

--- [Cf_rbtree]
    Fixed error in [member] that could produce false negatives.

--- [Cf_parser]
    Fixed [to_extended] to work given the new physical equality rules enforced
    by Ocaml-3.08.X.  Still need to write a test case for this.
    Added [Error] exception and two new functions, [err] and [req], to the [X]
    module.  They do the expected thing.
    Changed the [err f] function to [err ?f ()] instead.
    Fix [lit] and [X.lit] to not evaluate past the end of the literal.

--- [Cf_scan_parser]
    Removed unused [this_] member from [scanner] class object.

--- [Cf_lex]
    Change name of [line_cursor] class to [cursor] for simplicity.

--- [Cf_message]
    Fixed [normalize] so that it works even when compiled with -unsafe.
    Improved performance of [normalize] by verifying the list before filtering.
    Removed [to_seq2] because it's really not necessary.  Added [?x] optional
    argument to [to_seq] and [limit].

--- [Cf_flow,Cf_rbtree,Cf_parser]
    Use Cf_seq.nil in place of Lazy.lazy_from_val Cf_seq.Z.

--- [Cf_machine]
    New module.  Object-oriented framework for [Cf_gadget] state machines.

--- [Cf_poll]
    Allow subclasses [Cf_poll.file] to have more states.  Changed the type
    parameter of the [event] class to 'state, rather than 'event.  Added the
    rwx_t convenience type, i.e. type rwx_t = [ `R | `W | `X ]

--- [Cf_socket]
    Add [`SOCK_SEQPACKET] to the allowed socket types in the [listen] function.
    There is no support for that socket type yet, but we must make room for it.
    When [setsockopt] fails, raise Unix_error with the right function name.

--- [Cf_sock_common]
    Make [setsockopt] and [getsockopt] method explicitly polymorphic.

--- [Cf_sock_dgram, Cf_sock_stream] Explicitly specify socket type tags.

--- [cf_socket_p.c, cf_ip4_proto_p.c, cf_ip6_proto.c] Use socklen_t instead of
    other types, in order to shut up compiler warnings when using GCC 4.0.

===== Version 0.6 =====

Highlights of the changes:

+ More bugs fixed (some critical).

--- [Cf_rbtree]
    Fix bug in [Map.insert] that failed to replace nodes when the key specifies
    a node that is already in the map.  (Thanks to Craig Falls, once again, for
    finding this bug.)

--- [Cf_dfa]
    Improved lazy DFA module with a better functorial interface, to allow for
    more efficient symbol maps (to support, e.g. wide character lexers) and to
    decouple the symbol type from the cursor type, so that Cf_parser.X can be
    used easily in place of Cf_parser.
    
--- [Cf_dfa, Cf_lexer]
    Fixed the documentation for the [( $@ )] operator to reflect the actual
    behavior.  When the action parser does not accept the recognized sequence,
    then no other rule is selected and no other action functions are executed.

--- [Cf_lexer]
    Updated to use the new [Cf_dfa] interface, though it is now deprecated in
    favor of the new, improved [Cf_lex] module (see below).

--- [Cf_uri]
    Updated to use the new [Cf_lex] in place of the deprecated [Cf_lexer].

--- [various .c files]
    Rename custom data tags from 'pagoda' to 'ocnae'.

+ New functions.

--- [Cf_rbtree, Cf_set, Cf_map]
    Add [of_list_incr], [of_list_decr], [of_seq_incr] and [of_seq_decr], which
    are optimized for lists and sequences known to be in increasing or
    decreasing order.
    
    These functions were derived from code contributed by Brian Hurt (thanks!)
    and implement a variant on Hinze's algorithm:
        <http://citeseer.ist.psu.edu/hinze99constructing.html>

--- [Cf_set]
    Add [size] function.

--- [Cf_seq]
    Add [nil] value.
    Add [flatten] function.
    Requires Ocaml-3.08 now.

--- [Cf_flow]
    Add [commute_string] function.

--- [Cf_parser]
    Add [of_extended] and [to_extended] functions.
    Add [req] parser, an efficient shortcut for [alt (p :: err f :: [])].
    Add [Error] exception for generic unparameterized errors.
    Add [altz] parser for match from a sequence (instead of a list) of choices.

--- [Cf_scan_parser]
    Change [scanf] to return an ordinary Cf_parser.t function.
    Add [scanfx] to return a Cf_parser.X.t function.

--- [Cf_regex]
    New module for regular expression parsing, matching and search.
    
--- [Cf_lex]
    A new and improved lexical analysis module, with an interface derived from
    the now deprecated [Cf_lexer].  It offers a more flexible interface to the
    underlying [Cf_dfa] module, and its [( !~ )] and [( !$ )] operators parse
    their string arguments as regular subexpressions with the format defined in
    the new [Cf_regex] module.

--- [README]
    Fixed an embarrassing word-choice bug, i.e. principle vs. principal.

===== Version 0.5 =====

Highlights of the changes:

+ Many bugs fixed (some critical).
+ IPv6 socket addresses are now a triple, containing the scope identifier.
+ Fixed a very bad stack leak problem in the [Cf_gadget] scheduler.

--- [Cf_deque]
    Fix major bug in [fold] that caused a BUS ERROR (ack!), and also fixed
    [filter] so that it uses the non-recursive [fold] function here instead of
    going to the extra work of using [Cf_seq.fold].

--- [Cf_rbtree]
    Fix a bug in [iterate] (found by Craig Falls; thanks Craig!) caused by a
    stoopid typo.  Caused some elements to be iterated twice, and others not
    at all.

--- [Cf_gadget]
    Moderate surgery on the scheduler to fix a bad stack leak.  The new code
    is probably a tiny bit more efficient too, because I got rid of some
    unnecessary uses of {Lazy.t} in places, and there is a bit less lifting
    between monads.  I didn't benchmark it, though.

--- [Cf_socket]
    Added a special case for Mac OS X to work around a bug in Apple's network
    stack that errors in connect(2) on a non-blocking socket do not get in
    the errno system variable.  You have to get them out of the socket with
    the SO_ERROR socket option.

--- [Cf_ip4_addr]
    Make the network subnet manipulation functions cope with networks that
    are not unicast networks.  (Yes, there are multicast ranges that can be
    treated like subnets.)

--- [Cf_ip6_proto]
    Add a third element to the socket address type: an int32 for the scope id.
    
--- [Cf_ip6_addr]
    Fix the [v4compat] and [v4mapped] address type tags so that they are
    actually polymorphic variants, like they're supposed to be.  This was
    another stoopid typo, but I found it myself.

--- [Cf_netif]
    Fixed the C-language code to call if_nametoindex() with the proper
    arguments.  Again, this was a stoopid typo.

--- [Cf_poll]
    A minor change to the commented bits of debugging code in the middle of the
    select loop to use [Cf_journal] instead of my [xprintf] hackery.

--- {TESTS}
    Added a test for the [Cf_gadget] scheduler to detect stack leaks.

===== Version 0.4 =====

Highlights of the changes:

+ Fix Makefile for architectures that do not support native compilers.
+ Fix major bug in the [Cf_gadget] scheduler that caused some wires to be
  prematurely collected without delivering events to their receivers.

--- [Cf_gadget]
    Fix major bug in the scheduler.  Events transmitted on wires that are no
    longer connected to a receiver are now delivered to any pending guards that
    were queued before the receiver was collected.  Minor changes to the
    debugging hints to use Cf_journal.

--- [Makefile]
    Samuel Mimram, the Debain maintainer of this package, says: There are some
    minor issues with your Makefile concerning non-native archs [...]:
    - the doc rule should use ocamldoc instead of ocamldoc.opt since it is
    not available on all archs (or add a optdoc rule);
    - the install rule should not depend on cf.cmxa and cf.a since they are
    not necessarly built.
    Thanks to Mr. Mimram for catching this.


===== Version 0.3 =====

Highlights of the changes:

+ Rewrite the scheduler in [Cf_gadget] so that it sucks less wind.  The kernel
  is now built entirely out of mutable structures, and we got rid of the 'pin'
  type because we don't represent wires internally as integer keys in a map.
+ Added [Cf_journal], a foundation for extensible diagnostic event journaling
  inspired by Log4j from the Apache Foundation.  (Look for a full suite of
  extensions to be sold separately.)
+ Removed the [?xf] optional exception function from the [Cf_lexer.create]
  function.  Use a derived cursor class with an [error] method that can be
  overridden for this purpose.
+ Added [Cf_scan_parser], which scans an input sequence using the [Scanf]
  module in the standard library.
+ Minor convenience functions added to [Cf_parser].
+ Other bug fixes.


--- [Cf_deque]
    Apply the iterative function in left-to-right order for all the utility
    functions.

--- [Cf_journal]
    All new functions.

--- [Cf_parser]
    Added the [filter], [map] and [optmap] functions for transforming parser
    with higher order functions on their output symbols.

--- [Cf_scan_parser]
    New module, allowing the mixing of [Scanf] and [Cf_lexer] in the same
    parser/lexer system.

--- [Cf_dfa, Cf_lexer]
    Added new ['i cursor] class.  Removed the ['c raise_exn_t] type and the
    [?xf] optional parameter from the [create] function.

--- [Cf_uri]
    Fixed bug in [refer_to_base] that allowed relative paths to resolve to
    absolute paths with a [".."] segment at the beginning of the path.  Also,
    changed to throw [Rel_undefined] instead of [Invalid_argument] (as the
    documentation specifies).
    Also, use the new [Cf_lexer.cursor] class, as now required.

--- [Cf_gadget]
    Major modifications for new scheduler.  The [pin_t] type is no longer.
    Should be more efficient (and less buggy).

--- [all *.c files]
    Stop abusing Field() as a lvalue in the C primitives.  The GC is reputed
    to hate that, and while we haven't encountered it in this library, we've
    seen it in others.  Best to be safe.

    Also: stop using CAMLlocalX() in subblocks of functions.  Just use them
    at the top of the main function block.  It seems to like that.

===== Version 0.2 =====

Highlights of the changes:

+ Major overhaul of [Cf_rbtree] to address serious performance issues (should
  improve performance of [Cf_dfa], [Cf_lexer], [Cf_poll] and [Cf_gadget]).
+ Defined [Cf_set.T] and [Cf_map.T] module types for use in abstracting the
  underlying algorithm behind sets and maps.
+ Added [Cf_seq.constrain] (and [Cf_seq.constrain2] for consistency).
+ Defined [Cf_heap.T] and [Cf_pqueue.T] module types for use in abstracting
  the use of skew-binomial heaps as either a heap or a priority queue.
  Reimplemented the interface to [Cf_sbheap] so it is consistent with the
  new [Cf_rbtree] interface.

--- [new files]
    Added [Cf_heap], [Cf_map], [Cf_pqueue] (and changed the meaning of the
    [Cf_set] module to be consistent).  These files all contain module types
    for common data structure algorithms implemented in the {Cf} library.
    Specific implementations are separated out into other modules.

--- [Cf_rbtree]
    Completely rewritten to address serious performance issues and to combine
    the interface for both sets and maps.  Use the new [Cf_rbtree.Set(K)] and
    [Cf_rbtree.Map(K)] functors.  Most functions now offer better performance
    for smoothly distributed input than do the [Set] and [Map] modules in the
    Ocaml standard library.  (Note: the [subset] function has been fixed so
    that it considers its arguments in the same order as the standard library.)

--- [Cf_sbheap]
    Minor modifications to conform to the new [Cf_heap] and [Cf_pqueue] module
    types.  Use the new [Cf_sbheap.Heap(K)] and [Cf_sbheap.PQueue(K)] functors.

--- [Cf_ordered]
    Removed the [KV_Pair_T] module type and its associated functor [KV_Pair],
    since these types are unecessary.

--- [Cf_seq]
    Added the [constrain] and [constrain2] functions for constraining a
    sequence to just those elements until the constraining function is false.

--- [Cf_dfa Cf_gadget Cf_poll]
    Modified to use the new [Cf_rbtree] and [Cf_sbheap] interface.

--- [t_cf]
    Added a new test case, that covers [Cf_flow.commute] and a few other
    things.  (Test coverage is still abyssmally poor, if you ask me.)

===== Version 0.1 =====

Highlights of the changes:

+ Compile and pass self-tests on Suse Linux 9.0.
+ Unified [sequence] and [accumulate] monad functions in [Cf_seq].
+ Added [Cf_exnopt] module with a simple convenience type.
+ New monadic constructors for [Cf_seq] and [Cf_flow] types.
+ Moderate overhaul of [Cf_gadget] (fix bugs, design problems).
+ Fix portability bugs in [Cf_socket] and cognates.
+ Add support for UDP, IP multicast and network interface selection.
+ Fix bug in [Cf_poll.idle] event polling (and give a timestamp).
+ Slightly better self-tests for [Cf_socket].

--- [Cf_cmonad, Cf_smonad, Cf_scmonad]
    Removed the [sequence] and [accumulate] functions.  Use the new functions
    in [Cf_seq] for this.

--- [Cf_exnopt]
    Added to library.  This is a simple sum type useful for defining monads
    that answer with either a value result or an Ocaml exception.

--- [Cf_seq]
    Added new functions for monadic construction.
    Use [writeC] to construct a sequence with a continuation monad.
    Use [writeSC] to construct a sequence with a state-continuation monad.
    Added new modules, [C] and [SC], containing the [sequence] and [accumulate]
    functions from [Cf_cmonad] and [Cf_scmonad] respectively.  (The functions
    from [Cf_smonad] have been removed completely.)

--- [Cf_flow]
    Added new function for monadic construction.
    Use [readC] and [writeC] to construct a flow with a continuation monad.
    Use [readSC] and [writeSC] to construct a flow with a state-continuation
    monad.
    Evaluating a continuation monad or a state-continuation monad with [evalC]
    or [evalSC] gives a resulting [('i, 'o) Cf_flow.t] value.

--- [Cf_gadget]
    In the [gate0_t] record, removed the [g_ptr_] field and changed the type
    of the [g_id_] field from an integer to a [pin_t] value.
    In the [kernel_t] record, changed the [k_rdyq_] field from a queue of
    [process0_t] values to a queue of [process0_t Lazy.t] values.
    Use [Cf_cmonad] by references, instead of by copy and paste.
    Define new class [Cf_gadget.connection] as the common base class of
    [Cf_gadget.rx] and [Cf_gadget.tx] to contain the [pin] method and two new
    methods: [check], which returns [false] if the other end of the connection
    has been collected by the garbage collector; and [id] which returns a text
    representation of the pin identifier (suitable for use in debug log
    messages).
    Removed [zguard] to replace with new [guard] and [rx] interface.  The new
    [rx#get] method returns a [guard_t] continuation monad which is evaluated
    by the new [guard method].  Internally, this is done by redefining [gate_t]
    as a continuation monad constructing a sequence of [gate0_t] values
    (parameterized by state).
    Optimized [tx#put] so that it does not enter the [scheduler_] function.
    Only [guard] can invoke a full pass through the scheduler now (though the
    scheduler could still use improvements for efficiency-- see ISSUES).
    Fixed an efficiency bug in [write] that unnecessarily constructed
    continuations.

--- [Cf_socket]
    Many platforms do not have a [sa_len] field in [sockaddr], so we now
    allocate socket address custom blocks with an extra [size_t] field at the
    beginning to carry the size of the structure.
    Stop using buffers of [SOCK_MAXADDRLEN] length and use the structure
    defined in RFC 3493 instead, i.e. [struct sockaddr_storage].
    Some socket options are not available on all platforms; therefore, allow
    the [opt_get] and [opt_set] fields in an option structure to be NULL if a
    platform doesn't support them.  The [getsockopt] and [setsockopt] function
    raise [Failure] when those socket options are used on those platforms.
    The [SO_REUSEPORT] and [SO_NOSIGPIPE] options are not available on Linux.

--- [Cf_nameinfo]
    Removed [ni_withscopeid] from list of flags.  This is a Mac OS X extension
    and I'm not sure how I will support address scoping issues yet.  Maybe it
    comes back later.
    Changes to handling of [sockaddr] structures to accommodate new
    representation required for [Cf_socket] functions.
    Stop using buffers of [SOCK_MAXADDRLEN] length and use the structure
    defined in RFC 3493 instead, i.e. [struct sockaddr_storage].

--- [Cf_netif]
    New module.  Provides wrapper around [if_nameindex] and cognates.

--- [Cf_ip4_addr, Cf_ip6_addr]
    Fixed several endianness bugs caused by failure to apply (or misapplication
    of) [ntohX] and [htonX] macros.
    Linux does not define [IN_LINKLOCAL], so we define it if it's undefined.
    Linux also does not define [IN6ADDR_NODELOCAL_ALLNODES_INIT],
    [IN6ADDR_LINKLOCAL_ALLNODES_INIT] or [IN6ADDR_LINKLOCAL_ALLROUTERS_INIT].
    Fix error in [cf_ip4_addr_compute_limits].

--- [Cf_ip_common, Cf_ip4_proto, Cf_ip6_proto]
    Add new protocol number for IPv6.
    Add [TCP_NODELAY] socket option.
    Add [Cf_ip4_proto.mreq_t] type for [IP_ADD/DROP_MEMBERSHIP] socket options.
    Add [Cf_ip6_proto.mreq_t] type for [IPV6_JOIN/LEAVE_GROUP] socket options.
    Add new socket options for IPv4 sockets: IP_TTL, IP_ADD_MEMBERSHIP,
    IP_DROP_MEMBERSHIP, IP_MULTICAST_IF, IP_MULTICAST_TTL and
    IP_MULTICAST_LOOP.
    Add new socket options for IPv6 sockets: IPV6_UNICAST_HOPS, IPV6_V6ONLY,
    IPV6_JOIN_GROUP, IPV6_LEAVE_GROUP, IPV6_MULTICAST_IF, IPV6_MULTICAST_HOPS,
    IPV6_MULTICAST_LOOP.
    Changes to handling of [sockaddr_in] and [sockaddr_in6] structures to
    accommodate new representation required for [Cf_socket] functions.
    Added a new primitive function [Cf_ip4_proto.siocgifaddr] that returns the
    interface address for a named interface.

--- [Cf_sock_common]
    Remove [send] and [recv] private methods from [Cf_sock_common.basic] class.

--- [Cf_sock_stream]
    Change [send] and [recv] methods on [Cf_sock_stream.endpoint] class from
    virtual override to simple concrete methods.
    Use an abbreviation module for [Cf_socket] in the implementation.

--- [Cf_sock_dgram]
    New module for SOCK_DGRAM sockets.

--- [Cf_udp4_socket, Cf_udp6_socket]
    New modules for UDP sockets (both IPv4 and IPv6).

--- [Cf_poll]
    Change [p_idle_queue_] field of [Cf_poll.t] record so that the callback
    function in each entry of the queue takes a [Cf_tai64n.t] timestamp
    indicating the timestamp when the idle condition arrived.
    Fix [cycle] so that idle polls are processed even when no other polls
    are loaded.


===== Version 0.0 =====

This was the initial release of the library.  Major and minor version numbers
count upward from zero.  Major version numbers with a minor version number of
zero indicate the first release in a "stable" branch.  Non-zero minor version
numbers indicate "development" branches converging on the next stable release.
Patches to stable releases are numbered with a third level of numbering.


--j h woodyatt <jhw@conjury.org>
