Changes since Pike 7.6.86
----------------------------------------------------------------------

Changes in Pike:

o Updated timezone data files. This includes the recent US DST change.
o Fixed mktime to work better with out of bounds time fields. [bug 4326]
o Fixed support for big endian 64-bit.
o Added conversion from Gmp.mpz objects to Gmp.bignum when cast to int.
o Added support for variable length records to Standards.IIM.
o Added timeout to Image.PS. Now kills the ghostscript process if it
  hasn't returned after 30s.
o Added GL 1.2 and 1.3 constants.
o Added possibility to set offset and stride when creating textures from 
  memory objects in GL. (Not currently usable on win32.)
o Fixed CMYK calculation in Image.Image.
o Added adjusted_cmyk to Image.Image and use it when decoding with
  Image.PS.
o Now handles more eps images internally in Image.PS without spawning 
  ghostscript.
o Added Standards.IIM that handles IPTC Information Interchange
  Model data in JPEG or Postscript images created with PhotoShop.
o Added support for little endian TIFFs.
o Added support for TIFF to Image.Dims.
o Changed HTTP.Query to close connections explicitly.
o Changed sslfile to avoid blocking IO in destroy() as that could lock
  up the gc. You should explicitly close() SSL connections since the close
  packet might block.
o Fixed a bug in SSL module that could stop communication while
  keeping the connection open indefinitely.
o General cleanup of SSL module.
o Improved Parser.XML.Validating.
o More paranoid checks of image headers when using Image.AVS.
o Fixes to make describe_value work as usual in the free pass of the
  gc, so that e.g. sprintf("%O",...) behave well when called from
  destroy().
o Fixed truncated field names in ODBC.
o Fixed masking of file positions larger than 2 GiB on 64-bit.
o Fixed low-level parsing of HTTP headers to not reorder the headers.
o Added set_charset and get_charset proxy functions to Sql.Sql.
o Changed Protocols.HTTP.Query async_close() to care about the value
  returned by ponder_answer(). Fixes requests to broken servers that 
  don't send proper results.
o Fixed bad free_string() in exit_bytecode().
o Fixed an off-by-one crash when drawing alpha boxes all the way to
  the bottom of the image.
o Fixed a multiset bug that could cause incorrect multiset sizes.
o Fixed a multiset bug that caused ints to be called as sorting
  function when no sorting function was set.
o Fixed hour formatting in Calendar.Time.format_smtp().
o Fixed TTL parsing of SRV records in Protocols.DNS.
o Fixed fatal "Unknown identifier type" that was caused by attempts
  to encode programs that had not been fixated.
o Fixed some events in Calendar.Events.
o Fixed a double free in Shuffler.
o Fixed an inverted error test in Mysql.set_charset.
o Fixed a compilation crash of the Cache module on Pikes wihtout
  threads.
o Fixed optimization bug for objects with a value of false.
o Fixed -t (tracing) on win32.
o Added support to Mysql for the charsetnr column attribute and proper
  recognition of binary fields in unicode decode mode by using charsetnr
  instead of the binary flag (which might be set for nonbinary columns
  too, e.g. "VARCHAR(17) BINARY").

  Unfortunately this means that unicode decode mode is disabled if
  Pike is compiled with a client lib without support for the charsetnr
  attribute, i.e. libmysql prior to v4.1.0. If you want to enable it
  for compatibility reasons, set the environment variable
  PIKE_BROKEN_MYSQL_UNICODE_MODE when starting pike.

Other:

o Improved Valgrind support.
o Now checks the return code from win32 VirtualProtect. This breaks
  assembler optimized builds on Windows. It never worked in the first
  place, but used to fail silently, so this is better. This has been
  fixed in 7.7 by using another heap manager, but it has not been 
  decided if it should be be backported.
o Adjusted array growth policy in array_insert to double the size
  instead of growing with approximately one eighth of the size. This to
  ensure O(1) time complexity and lessen fragmentation. (This affects
  ADT.Sequence._insert_element and ADT.CircularList._insert_element.)
o Fixed support for UnixODBC.
o Made IA32 machine code compatible with Darwin IA32 ABI. Enabled
  machine code for Darwin.
o Upgraded bundled GMP from 4.2 to 4.2.1

Build fixes:

o Support GNU Java (GCJ)
o Did away with the use of the undocumented internal MS win32 CRT
  functions __loctotime_t and __dtoxmode.
o Fixed compilation of Nettle and Mysql on win32.
o Fixed typo that caused the configure script to search for lots of
  nonapplicable include dirs on windows.
o Backported new INT_TYPE_{ADD,NEG}_OVERFLOW implementation from 7.7.
  The old one does not work with GCC 4.1.
o Fixed problem where mysql_character_set_name exists in mysql.h but
  not in the lib for some old mysql clients.
o Fixed epoll support to not require /dev/epoll on Linux. That means
  epoll will be enabled all mainstream Linux distributions running on a
  2.6 kernel. If for some reason you want to disable it use
  --without-epoll.
o Added Objective C support to the module build system.
o Fixed libnettle bundle compilation on win32.
o Fixed compilation of ffmpeg.
o Fixed compilation problem on OpenSolaris by checking for broken
  Postgres environment.


Changes since Pike 7.6.66
----------------------------------------------------------------------

Changes in Pike:

o Added support for "100 Continue" to Protocols.HTTP.Server.
o Fixed Keep alive issues in Protocols.HTTP.Server. 
o Fixed SSL.sslfile to ensure that a read callback gets a call if it's
  installed when there already is data in the internal read buffer.
o Fixed Cache.cache to work without threads again.
o Fixed a typo in Array.diff3 that in some rare cases caused it to
  merge a difference into a three-way equality.
o Fixed a bug where reused local variables weren't cleared properly.
o Fixed sorting order for huge characters.
o The values returned by Thread.status is now available as constants
  in the Thread module.
o Added peek() method to ADT.Heap and Priority_queue.
o Fixed "file not open" error when performing multiple operations on a
  Filesystem.Tar file.
o Fixed a rare PNG decoding issue.
o Proper handling of NULL elements in Postgres.
o Fix for potential SQL injection vulnerability in Postgres.
o Added support for WSAECONNRESET in SSL on win32.

Other:

o Fixed bug causing local variables to never be reused, which in turn
  leads to huge stack frames.
o Fix to avoid the cleanup thread becoming garbage when the cache
  object is destructed.
o Various UCS-2/SQLWCHAR related fixes in Odbc. Potentially fixes
  problems where wchar_t is 4 bytes (eg MacOS X).
o More multiset gc fixes.
o Fixed support for running dmalloc Pike with -d.

Build fixes:

o Fixed VC8 compilation.
o Fixed support for C++ modules.
o Improved support for Darwin x86.


Changes since Pike 7.6.50
----------------------------------------------------------------------

Changes in Pike:

o Added support for chunked transfer encoding and handle unexpected
  multiple headers in HTTP.Server.Request.
o Added support for "urlencoded" as an alias for "url-encoded" in
  HTTP.Server.Request.
o Added callback support to Stdio.FakeFile.
o Added iso_646.irv, iso_4873.dv and iso_4873 to charsets.
o Added UCS-2 API support to Odbc.
o Fixed some bugs in Protocol.HTTP.Server.HeaderParser.
o Fixed decoding boolean datatype in Protocols.XMLRPC.
o Fixed short names in Standards.XML.Wix.
o Fixed time(0) to behave like time(), not time(1). This is considered
  a bugfix and does not have backward compatibility.
o Allow _disable_callbacks and _enable_callbacks on closed fd's.

Other:

o Added compatibility for more odbc drivers.
o Optimized XML.Tree simplenode creation.
o Fixed reference underflow in modify_shared_string()
o Fixed segfault when exiting uninitialized mutex keys.
o Fixed segfault for two special cases of indexing unexisting stuff.
o Fixed gc problem that could produce an error "gc_mark() called for
  thing in zap weak pass that wasn't marked before" in pikes compiled
  with rtldebug.
o Fixed multiset node ref bugs that affected iterators when the
  multisets contain destructed objects.
o Fixed out of C-stack errors when resizing unbalanced mappings.

Build fixes:

o Fixed win32 compilation.
o Fixed detection of SDL.Joystick on win32
o Automaticly add Pike icon to win32 binary.
o Fixed signal_handler compilation on OperBSD.
o Fixed gcc 4.0 compatibility.
o Added mmap PROT_EXEC support to MacOS X via MAP_ANON.


Changes since Pike 7.6.24
----------------------------------------------------------------------

Changes in Pike code:

o added Standards.UUID
o added Standards.XML.Wix, Tools.Standalone.make_wxs
o Parser.XML: added 7.2 compatibility mode that allows multiple tags
  at the top level. Also fixed bug where comments and PI:s after the
  top level element weren't allowed. PIs are allowed at the top level.
o Parser.XML: Added additional validity checks which may be turned on
  to get stricter XML parsing.
o Parser.XML: added compatibility wrapper for 7.2 parse_input()
o Parser.XML: can pass compat_allow_errors to XML parser in 
  simple_parse_input() and parse_input().
o Parser.XML: stricter detection of RXML entities.
o better garbage generation for Remote.
o SSL.sslfile: added wrapper for Stdio.File.is_open().
o Protocols.HTTP.Query: keepalive operation fixed when remote has
  closed.
o Protocols.HTTP.Quert: added timed_async_fetch().
o UNDEFINED arguments are better described in backtraces.
o Protocols.DNS: improved support for T_TXT.
o Cache.Policy: made some debug output optional.
o ADT.Relation.Binary: bugfixes, added cast().
o Hilfe: added result formatter for binary, octal and hexadecimal
  integers.
o Protocols.LDAP.client: filter value unescaping function complies
  more closely to the somewhat peculiar escape method in RFC 1960.
o Protocols.LDAP.client: The paged result control should be optional
  in the first search query and critical in the rest, not the other
  way around. This fixes servers that don't support paged queries in
  the whole tree.
o SSL.sslfile: Various fixes: notably the close callback is also
  called on errors, which is consistent with Stdio.File. Added
  set_(non)blocking_keep_callbacks. See also Pike.Backend.
o Stdio: Propogates return values from callbacks properly.
o Stdio: Always check that the user callbacks are installed before
  calling them.
o Protocols.HTTP.Server.Request: allow methods other than POST to send
  data in the request body, as long as the content-length header is
  set.
o Added support for versioned pike -x.
o Standards.EXIF: bugfix for BIAS.
o Web.Crawler: bugfix to cope better with non-absolute redirects.

Changes in C code:

o is_eq() works properly with objects now.
o Improvements made in rtldebug, valgrind and cleanup-on-exit.
o Searches for 64 bit mysql libraries.
o Displays errors when the compile time replace() optimizer fails.
o Zero-type is correctly cleared in a number of opcodes.
o Fixed leak in Oracle module when Oracle.Date objects are created or
  cast.
o Several fixes for improved performance and compatibility with
  Oracle 9.
o Fixes for compiling under Solaris 10, AmigaOS4, OpenBSD and Mac OS X.
o Machine code disabled under FreeBSD 5.x.
o Preprocessor now handles escaped newlines in ordinary text.
o #if expressions can now be broken with escaped newlines.
o sprintf() %f segfaults fixed.
o Stdio.UDP->wait() now handles EINTR.
o Stdio.File sockets are properly released when connect() fails.
o XML parser fixes (see Pike code changes).
o mktime() works before 1970 now in all situations.
o gmtime() works for localtime now, and maps to closest valid time
  when presented with an invalid time.
o Odbc: configure fixes for modern libiodbc.
o fixes for modify_shared_string() and rehash_string_backwards()
o Pike.Backend: Fixed bug in timeout calculation that caused the
  timeout to be zero (effectively causing busylooping) if one
  requested infinite timeout to Backend.(). (This doesn't affect the
  default backend since it has a timeout of 3600.0.)
o Pike.Backend: proper closing of kqueue descriptors on *BSD systems
  that use kqueue instead of poll().
o Pike.Backend: fixed a bug that caused delays when setting callbacks.
  Fixes bad performance for SSL.sslfile based servers.
o Sybase: SybaseOpenClient framework on Mac OS X.
o CMOD precompiler: fixes for polymorphic function overloading and
  module level functions.
o Do not decode non-shortest forms in utf8_to_string and _Charset, for
  security reasons and unicode 3.1 compliance.
o Image.PNG: fix a memory leak.
o Image.FreeType: Added support for monochrome pixel fonts.
o Postgres: Fixes to create() variable 5 parsing.
o GTK: a number of typos were fixed.
o A large number of fixes for 64 bit architectures.
o Significant optimization of sscanf %*s and %*[...].
o Optimized Mac OS X cache management in machine code generation
  resulting in better performance in some areas (e.g. startup time).

Other Changes:

o Windows installer fixes
o Updated Nettle included
o Bug reports fixed: 3855, 3928, 3941, 3950 

Changes since Pike 7.6.6
----------------------------------------------------------------------

Changes in Pike code:

o Fixed a cyclic resolver problem when running Pike with -V7.4
o Fixed #if constant so it doesn't rethrow a compilation error when
  #if constant failes to to compilation error.
o Better sslfile backward compatibility.
o Fix to prevent Regexp from throwing an error when PCRE isn't
  installed.
o Fixed pop() in ADT.Priority_queue.
o Fixes in Calendar.dwim_day for better accuracy.
o Major fixes and extensions of Parser.XML.Tree.
o Protocols.LMTP now displays correct error information.
o Content-type can now be set manually in Protocols.HTTP.Session.
o Protocols.LDAP now support paged searches. Fixed bugs related to
  dequoting and escaping values in filters.
o Fixed memory leak in Protocols.LysKOM.
o Fixed argument order in Remote.Client->provide.
o Fixed setting DES and DES3 keys.
o SSL now falls back to TLS 1.0 when accessed with SSL 3.2 (TLS 1.1).
o Fixed bug in decoding SSL2 hello messaged that caused incorrect
  padding of client challenges longer than 16 bytes. This caused some
  clients, typically based on OpenSSL, to fail to connect.
o Fixed an SSL bug that caused the session cache from working.
o Fixed an SSL bug where calls to the read callback could get lost
  when frequent switches between callback and non-callback mode
  occurs.
o Added EXIF kludge to handle broken FUJIFILM MakerNote.
o Fixed close in Stdio.FakeFile.
o Fixed Stdio.exist.
o Ensure that errno() is relevant if recurse_rm returns with an error.
o Fixed a type parser bug in Hilfe.
o rdf:ID and rdf:about now takes xml:base into account in Web.RDF.
o Fix for Protocols.DNS on MacOS X.

Changes in C code:

o Fixed bug in profiling support.
o Backend and UDP fixes for poll and AIX.
o Fixed bug in f_exit when called with multiple arguments.
o Fix for segmentation fault in random_string with negative argument.
o Added mprotect workaround.
o Avoid default usage of machine code on OpenBSD.
o Improved handling out-of-stack errors.
o find_external_context() now supports objects being destructed.
o Fixed copy_mapping_recursively().
o Fixed indices() and values() on objects to hide hidden items.
o rusage fix for system without 64 bit integer support.
o Fixes in create_process().
o Fixed memory leak when createing tuned boxed images.
o MMX no longer used for `* and `+ image object operators because of
  precision problems.
o New module: Kerberos
o Mysql module support Mysql 4.1.3.
o Bugfix in dbdate_cast() in the Oracle module.
o Several bugfixes in Shuffler.
o Added Stdio.Port()->bind_unix().
o Several bugfixes for rare array problems.
o Several cpp fixes to ensure that #if constant never interrupts
  compiliation. Use --show-all-cpp-warnings to see such failures.
o cpp expressions are now short-circuited.

Other chages:

o Several fixes in the Pike package generation to make them work with
  GNU tar 1.14.
o Preliminary support for local variable extraction in unbug.
o New installer system for Microsoft Windows.


Changes since Pike 7.4:
----------------------------------------------------------------------

New/improved functionality:
---------------------------

o fewer magical hacks
    Several Pike modules have been cleaned up from old hacks and
    workarounds for problems which now have proper solutions. This
    should reduce size, and improve performance, dumpability and
    readability of the affected code. In addition lots of internal
    types in Pike have been tightened up and several more files now
    use the pragma strict_types, which has helped locating and fixing
    some previously undiscovered bugs.

o garbage collection strategy is now configurable
    The garbage collector can now be configured to take both the amount
    of garbage and the cpu time spent in the gc into account. Automatic
    garbage collections can also be disabled in critical regions. (Use
    the function Pike.gc_parameters for this.)

o hash() modified
    The string hash functions are now byte-order independent. The old
    hash function is available as hash_7_4 or as hash when running in
    7.4 compatibility mode or lower.

o --help
    The Pike --help message has been improved, and it is possible to
    retrieve further information about options and environment
    variables. In addition, most of the tools and build scripts now
    accept --help and describes what they do and what options they
    take.

o INT64
    On 64 bit architectures Pike will now use full 64 bits integer
    before resorting to Gmp.mpz objects for large numbers.

o IPv6
    Networking code in Pike has been updated to work with IPv6. This
    includes both low-level fixes in the socket handling as well as
    high-level changes such as IP parsing and protocol additions such
    as AAAA records in Protocol.DNS.

o module system improved
    Both dynamic and static modules now appears as objects, and they both
    support having an identifier _module_value, which will then be
    what is presented by the resolver as the module. _module_value can
    be a constant, which will prevent the program from being automatically
    cloned.

o mysqls
    The Mysql glue can operate over SSL, providing additional data
    security. Use the "mysqls://" protocol in the Sql.Sql module to
    access this feature.

o reworked codec
    The codec for serialization of Pike data types has been updated
    and has a significally improved success rate at encoding modules.
    (See the encode_value and decode_value functions.)

o sort() is portable
    Sort is now locale and platform independent. In other words,
    strings are now compared only according to the unicode value of
    every character.

o sort() is stable
    Unlike previous releases, sort() will keep the original order
    of elements that are equal. At first, we considered keeping the old
    sort function in parallel with the new one, as a "faster but
    unstable" alternative, but it turned out that there was no noticable
    difference in speed between the new and the old function.

o trace() can trace all threads
    The configure option --without-thread-trace has been removed, but
    instead the trace() function has been extended to make it possible
    to set the trace level in all threads simultaneously.

o the debug trace system is more configurable
    In addition to the trace levels set by the trace function or by
    the command line argument -t, trace can now be turned on and off
    for the individual subsystems. All trace levels have also been
    increased by one to make room for gc only messages at level 1.

o unbug
    The Pike debugger unbug has been significtly optimized.

o Unicode
    Pike 7.6 uses the Unicode 4.0.1 tables for case info and
    normalization.

o upper_case() and lower_case() extended
    The built-in functions upper_case and lower_case now also works on
    single characters represented as integers.

o #warning
    A new The Pike preprocessor directive #warning has been added. It
    simply writes the rest of the line to stderr.


The Pike master:
----------------

o The new option --dumpversion prints out the Pike version in a more
  easily parsed way than --version.

o The master now supplies argv to the started application, so it can
  use the create() method for execution. Some people find it a more
  elegant solution than having a main function.

o The "-e" flag to Pike has been improved with a number of convenience
  wrappers. When compiling code with "pike -e", the macro NOT(X) will
  expand to !(X) and CHAR(X) to 'X', making it easier to solve quote
  problems from a shell. If the return from a pike -e statement is a
  positive integer it will be used as pikes exit code. If the return
  value is a string it will be output (with a "\n" added, if the string
  didn't already end in "\n"). Finally there is a predefined variable
  env that contains the environment variables as a string:string mapping.


Building and installing pike:
-----------------------------

o To simplify the process of building Pike source distributions it is
  now possible to bundle less common libraries such as Nettle with
  Pike. The bundles, found in the "bundles" directory, will be compiled
  and statically linked if no matching library is found on the system.

o The Pike build process no longer builds a bootstrap pike, used to
  run various small programs to generate source files. This means that
  in order to build Pike from CVS you need the latest major version of
  Pike installed on your system. Pike source distributions contain
  these generated files, and are not affected.

o By default, pike want to build a documentation source file, i.e.
  "make && make doc && make install". This makes it possible for third
  party modules to integrate its documentation into the system Pike
  documentation. If you do not want to build a documentation source
  file, use "make install_nodoc" instead of "make install".


Changes and additions to -x utilities:
--------------------------------------

o benchmark
    A set of benchmarks is available in the benchmark tool. They are
    based on the Great Computer Language Shootout, but have been
    modified to make more sense in the context of Pike, and to test
    various aspects of Pike we suspect (or at least at one time
    suspected) to have bad performance.

o cgrep
    Context sensitive grep is very helpful when you are looking for
    substrings that are common. The implemented search modes are:
      o Complete token
      o Part of a token
      o Complete string literal
      o Part of a string literal
      o Part of a comment

    Example:
      $ cd Pike/7.6/src
      $ grep or * | wc -l
      18907
      $ pike -x cgrep -T or * | wc -l
      14

o dump
    Dumps Pike .pike and .pmod module files to precompiled .o files
    for shorter load times. Previously available as
    src/dumpmodule.pike in the Pike source tree, but moved into the
    Pike builtin tools to facilitate dumping of external modules.

o extract_locale
    Locale extractor utility used to extract localizable strings from
    an application into an xml format, to later be used by the Locale
    module.

o monger
    A new utility to download, install and otherwise manage external
    modules from the Fresh Pike project (modules.gotpike.com).

o rsif
    rsif can now work recursively in a file structure if given the
    flag -r or --recursive. Example:
      pike -x rsif -r 7.4 7.6



New modules / classes / methods added:
--------------------------------------

o ADT.BitBuffer
    When operating on data formats that are defined on bit level, the
    ADT.BitBuffer presents a convenient interface. It operates as a
    FIFO buffer on bit level, which allows you to read and write bits
    and bytes.

      > ADT.BitBuffer b=ADT.BitBuffer();
      > b->put1(2);
      (1) Result: ADT.BitBuffer(11)
      > b->put0(15);
      (2) Result: ADT.BitBuffer("\0"0)
      > b->drain();
      (3) Result: "\0"
      > sizeof(b);
      (4) Result: 1

o ADT.CircularList
    This is an circular list implemented as a C wrapper around an
    array. It has a constant time complexity for pop and push. It has
    a limited max size but it can be increased manually by calling the
    allocate() method. It supports pushing, popping and peeking at both
    ends of the list, as well as removing and insering elements at any
    position in the list.

o ADT.Sequence
    The sequence work similar to an array but has the ability to
    insert and remove elements at any position. It also has functions
    to retrieve iterators for forward and backward iteration over the
    elements in the sequence.

o ADT.Struct
    This module makes it possible to work with binary formats of the
    "packed struct" type. Simply create a class inheriting ADT.Struct,
    specify its members in order, create an object with a file object
    as argument, and then read the decoded values from the object as
    ordinary variables. An example, reading ID3 metadata headers from
    an MP3 file:

      class ID3 {
        inherit ADT.Struct;
        Item head = Chars(3);
        Item title = Chars(30);
        Item artist = Chars(30);
        Item album = Chars(30);
        Item year = Chars(4);
        Item comment = Chars(30);
        Item genre = Byte();
      }

      Stdio.File f = Stdio.File("foo.mp3");
      f->seek(-128);
      ADT.Struct tag = ID3(f);
      if(tag->head=="TAG") {
        write("Title: %s\n", tag->title);
        tag->title = "A new title" + "\0"*19;
        f->seek(-128);
        f->write( (string)tag );
      }

o Array
    The Array module has been extended with Array.all and Array.any
    which determine if all or any of the elements in an array meet a
    given condition. The function Array.partition has also been added,
    which divides the elements of an array into two arrays, selected
    according to a given condition.

o Bz2
    Support for the compression format used by the bzip2 program. The
    module interface is almost identical to that of the Gz module.

o Calendar module
    The %S format was added to Calendar.parse() to parse seconds since
    the Epoch. The TimeRange class is extended with a format method
    format_commonlog(), a tzname_utc_offset (+HHMM) and
    tzname_location(), which, when available, returns zone names like
    "Europe/Stockholm". The database has been updated with Swedish
    pre-1901 namedays and Finnish namedays.

o Crypto/Nettle
    The crypto module has been almost completely rewritten, and now
    uses libnettle as backend instead of the built-in crypto
    algorithms that Pike had before. This way Pike will benefit from
    the more active development and optimization work in the Nettle
    project. The most common hash and cipher methods are already
    written in assembler for several platforms. As an example SHA1 is
    about 40% faster than before on Intel platforms.

    With the new nettle support comes support for two new cipher
    algorithms, Blowfish and Serpent, and the new NIST hash algorithm
    SHA256. Note that the new Crypto module has renamed its
    identifiers to be consistent with the rest of Pike, and in some
    cases to clarify or correct bad names. The old names still work,
    but produce a warning unless Pike is run in compatibility mode.
    Compatibility outside compatibility mode will be removed in the
    future.

    The interfaces for the hash and cipher algorithms have been
    improved, and no longer only conform to predefined interfaces,
    but actually inherits Hash/HashState and Cipher/CipherState. Every
    algorithm is in itself a module in the Crypto module, and inherits
    the Hash/Cipher class. This module contains instance non-specific
    methods such as digest_size or key_size. By calling the `() method
    in the module a HashState/CipherState object is returned, which is
    a hash/cipher instance which can be used for streaming operations.

    Examples:

      Crypto.MD5.hash("Hash this string");

      Crypto.MD5()->update("Hash this ")->update("string")->digest();

    The confusing and hard-to-use Crypto.randomness has been obsoleted
    by the Nettle implementation of the Yarrow random generator. The
    Nettle implementation of Yarrow uses AES and SHA256. The
    Crypto.Random module acts as a frontend before system crypto
    sources, and ensure that almost no matter how bad your OS is, you
    will still get cryptographically strong random data.

o Crypto.PGP
    The start of a PGP/GPG toolkit. It still cannot handle all types
    of signatures nor generate any, but it is useful to verify
    selfsigned code and data.

o Debug.Wrapper
    A simple litte wrapper that can be placed around another object to
    get printouts about what is happening to it. Only a few LFUNs are
    currently supported.

      > object x=Debug.Wrapper(Crypto.MD5());
      Debug.Wrapper is proxying ___Nettle.MD5_State()
      > x->name();
      ___Nettle.MD5_State()->name
      (1) Result: "md5"
      > !x;
      !___Nettle.MD5_State()
      (2) Result: 0


o Error
    The root of the Pike exception hiearchy. Even though it is work
    in progress, it is already usable.

      > mixed err = catch( 1/0 );
      > err;
      (1) Result: Error.Math("Division by zero.\n")
      > object_program(err)==Error.Math;
      (2) Result: 1

o EXIF
    The EXIF module is now much more robust than before, and can handle
    some of the erroneous EXIF tags some cameras procduce. Extended
    support for Nikon cameras.

o Filesystem.Traversion
    The Filesystem.Traversion iterator is a handy way to descend into
    a directory structure (depth first) and perform actions on all or
    some of the files.

    Example:

      foreach(Filesystem.Traversion("."); string dir; string file)
        if(file[-1]=='~' || file=="core") rm(dir+file);

o Float
    Here constants and functions that deal specifically with the
    float data type is stored. Currently, it only contains various
    constants that describe the precision and limitations of the float
    type with which Pike was compiled.

o Function
    The Function module has been extended with the fixpoint combinator
    "Y", useful when writing recursive lambdas, a curry function, to
    partially evaluate a function call, and a callback caller function
    that protects the caller from exceptions in the callback function.

o Geography
    The Geography.Position object can now also convert to and from the
    Swedish RT38 (Rikets Triangulering 1938) position format.

o GLUE
    The GL Universal Environment is a GL toolkit that makes
    implementing GL applications in Pike really simple. GLUE has
    several orthogonal components like object oriented encapsulation
    of GL, drawing primitives, texture handling and text generation.
    The most fundamental part is however an abstract interface to a
    GL area driver, like GTK or SDL.

      int main() {
        GLUE.init();
        draw_frame();
        return -1;
      }
      
      void draw_frame() {
        call_out(draw_frame, 0.02); // 1/(50 fps)
        do_gl_code();
        GLUE.swap_buffers();
      }

o Image.NEO
    Support for one of the major image formats on Atari ST/STE,
    including decoding of color cycling. The C bitmap and palette
    handler can be used to implement other atari image formats.

o Int
    The Int module contains a few functions and constants that deal
    specifically with the integer data type. Currently it contains
    parity and byte swapping functions, and constants for the system
    maxint and minint.

o Pike.Security
    Functions and classes that deal with the Pike security system
    (requires Pike to be compiled with --with-security to be present)
    are stored in this module. Beware that the Pike security system is
    still very experimental.

o Process.Process
    The Process.Process class is extended to handle a time-out
    callback and a read callback, to make it easier to manage
    processes in an asynchronous way.

o Protocols.Bittorrent
    This is a Pike implementation of the client side of the popular
    Bittorrent protocol. Both creating torrent files and seeding as
    well as downloading and verifying files are supported. There are
    also several functions to retreive auxillary information such as
    identifying the other peer clients.

o Protocols.HTTP.Session
    Handles an HTTP connection as a session, with cookies, redirects,
    HTTP keep-alive, etc.

o Protocols.LMTP/Protocols.SMTP
    Protocols.LMTP implements a server for the Local Mail Transfer
    Protocol, LMTP, as specified in RFC2033. This module has been well
    tested against Postfix clients. Protocols.LMTP is based on a new
    server implementation in Protocols.SMTP.

o Protocols.OBEX
    An implementation of the IrDA(R) Object Exchange Protocol. OBEX is
    a protocol for sending and receiving binary objects to mobile
    devices using transports such as IR and Bluetooth.

o Regexp.PCRE added to give libpcre support.
    Are you a closet perler? For those who missed the richer flora of
    regexp syntax that Perl supports, the Perl Compatible Regular
    Expression module is the answer. If you compile libpcre with UTF-8
    support you will also get transparent wide string support. Several
    convenience functions are also added to the Regexp module to
    enable easier access to regular expressions.

o SSL
    Large parts of the SSL module have been rewritten, either as part
    of the rewrite of the Crypto module or in an attempt to fix various
    issues regarding blocking/nonblocking files, threads, etc.

o Standards.IDNA
    This module implements various algorithms specified by the
    Internationalizing Domain Names in Applications (IDNA) memo by the
    Internet Engineering Task Force (IETF), RFC 3490. Your most likely
    application of this will be the encoding and decoding of punycode:

      Standards.IDNA.zone_to_unicode("www.xn--rksmrgs-5wao1o.org"); 


o Thread
    Thread.Fifo and Thread.Queue have been extended with try_*
    varieties of all functions that can block, and with functions that
    make them both implement the same interface. Both also have
    fallbacks for running in nonthreaded mode.

o Web.RDF/RDFS/OWL/RSS
    Pike now has support for the W3C semantic web formats OWL, RDF
    and RDFS, which are used for expressing structure and metadata
    information. There is also some support for the syndication
    format RSS (which happens to be a simple application of RDF).

    This sample program reads an OWL file, parses the dataset
    contained in it, and then lists the data classes in that
    dataset:

      int main(int argc, array argv)
      {
        object owlset = Web.OWL();
        string input = Stdio.read_file(argv[1]);
        owlset->parse_owl(input);

        write("Classes:\n");

        foreach(owlset->find_statements(0,
                                        owlset->rdf_type,
                                        owlset->owl_Class);
                               array statement)
          write("- %O\n", statement[0]);

       return 0;
     }  


Optimizations:
--------------

o Instantiation and destruction of pike classes is now significantly
  faster.

o Handling of bignums has been optimized, especially conversion
  to/from normal integers.

o String case conversion is now five times faster than before on
  average.


Compatibility changes:
----------------------

o Incompatible changes have been made in ADT.Heap, Array.diff3_old,
  Crypto, Locale.Charset, Protocols.SMTP, SSL, Sql.sql,
  Standards.ASN1, Standards.PKCS, Stdio.File, Thread.Mutex and
  rusage(). Please refer to the 7.4 namespace in the compatibility
  section of the documentation for a complete description of these
  changes. Using #pike 7.4 or starting Pike with -V7.4 activates the
  compatibility layer, which should make it possible to run old code
  with newer pikes.


Compatibility changes without backward compatibility:
-----------------------------------------------------

o Module ABI changed
  The pike_frame struct has a new member, which makes modules compiled
  with Pike 7.4, and earlier versions of Pike, incompatible with Pike 7.6.


C level/development changes:
----------------------------

o The security.h include file is renamed to pike_security.h

o The testsuite has three new, handy macros: cond_resolv,
  test_program_eq and test_program_equal, all defined in mktestsuite. A
  testsuite test that produces a warning, unless it is a test_warning
  test, will now be considered an error. The test program can now run
  testsuites in forked processes. By default every testsuite file will
  now be run in a forked process. If a directory named extra_tests
  exists on the top level of the Pike source directory, that directory
  will also be recursed for testsuite.in files.

o The cmod API has been extended in many details, making it easier to
  work with. Variable declarations may now use the object(programname)
  syntax. Void in parameters may be 0. Varargs and optional arguments
  are now typechecked properly. It is possible to INHERIT a program
  into a PIKECLASS. It is possible to set attributes on a PIKEVAR. A
  program may be flagged as a prototype, which will make the function
  bodies to be ignored. It is also possible to set program flags, such
  as PROGRAM_DESTRUCT_IMMEDIATE. See bin/precompile.pike for
  documentation.

o The make file has a few new targets that should be self explanatory:
  gdb_hilfe, valgrind_hilfe and valgrind_verify.

o The header file module_magic.h is deprecated. Use the
  PIKE_MODULE_INIT and PIKE_MODULE_EXIT macros in your modules
  instead.

o The backend has a new interface to handle references from backend
  objects to callbacks in files.
