2.3.3, December 08, 2014

- A `when` condition can now be added to a `return` statement that does not return any value including `null`.

- The new function `ilog10` returns the integral part of the logarithm of a value to the base 10.

- The new function `math.ceilpow2` rounds an integer up to the next highest power of 2.

- The new function `math.morton` interleaves the bits of two integers.

- The new function `math.expminusone` returns a value equivalent to exp(x) - 1. It is computed in a way that is
  accurate even if x is near 0.

- The new function `math.lnplusone` returns a value equivalent to ln(x - 1). It is computed in a way that is
  accurate even if x is near 1.

- The new function `math.log2exp` extracts the exponent of a number and returns entier(log2(x)), but is much
  faster.

- The new function `math.isordered` checks whether at least one of two numbers is `undefined`.

- `math.tworaised` returns 2^x, with x of type number or complex, but is much faster than the exponentiation
  operators ^ and **.

- The new function `math.copysign` returns a number with the magnitude of x and the sign of y.

- The new function `math.arccosh` determines the inverse hyperbolic cosine in the real domain and is around
  thrice as fast as the universal `arccosh` function.

- The new function `os.cdrom` opens and closes the tray of an optical disk drive. It can also eject
  any other removable drive. It is available in the Windows edition of Agena only.

- The new function `os.isremovable` checks whether a given drive is removable. It is available in the
  Windows edition of Agena only. `os.isvaliddrive` determines whether a drive is connected to the file system.

- The new function `os.ismounted` checks whether a given drive has been mounted. It is available in the
  Windows edition of Agena only.

- The new function `os.isvaliddrive` checks whether a drive has been mounted to the file system. It is available
  in the eCS and Windows editions of Agena only.

- The new function `os.curdrive` returns the letter of the current drive in eCS, DOS, and Windows.

- `ilog2` and `math.ceillog2` now return `undefined` instead of issuing an error if given a
  non-positive integer.

- `arccosh` returned a complex result with real argument zero. This has been fixed.

- `skycrane.scribe` did not correctly print elements when being passed more than one structure. This has been
  changed.

- `gdi.plotfn` issued an error if one of the `functions` to be plotted (in the first argument) was actually `null`.
  Now the function simply ignores these cases.

- There may have been problems on Mac OS X when importing the `gdi` package due to incorrect file access rights.
  This has been fixed.

- `os.cpuinfo` has been fixed in the Linux editions of Agena.

- The `setbit`, `arccosh`, `arcsch` functions have been tweaked a little bit.

- The testsuite did not feature the lew_nist.agb file. This has been corrected.


2.3.2, November 26, 2014

- The new function `os.uptime` returns the number of seconds a system has been running. It is available
  in eComStation - OS/2, Windows, and Linux.

- On eComStation, `os.memstate` now also returns the maximum number of bytes available for a process
  ('maxprmem' key), and the maximum number of shareable bytes available ('maxshmem' key).

- On Windows, `os.memstate` now also returns information on the current committed memory limit for the
  current process and the maximum amount of memory the current process can commit ('freepagefile' and
  'totalpagefile' keys, respectively).

- `math.ceillog2` does not accept zero as an argument any longer.

- `ilog2` did not work, now it does.

- The `import`/`readlib` functionality returned misleading information in eCS - OS/2 and DOS if a `plus`
  package exists (compiled into the agena.exe binary), but a corresponding library agn file has not been
  found. This has been fixed.

- Version information compiled into the Agena Windows binary has been corrected.

- This release has been Valgrind-checked on x86 Linux and Mac to ensure there are no memory leaks.


2.3.1, November 23, 2014

- The new `hashes` package provides functions to compute string hashes.

- The new function `ilog2` returns the integral part of the logarithm of its argument to the base 2. It is 25 %
  faster than the int/log2 equivalent.

- The new `environ.kernel/maxulong` query returns the maximum value storable to C's unsigned long ints on the
  respective platform.

- The `reg` operator, when passed items, unvoluntarily sometimes returned a register with `null`s at its top. This
  has been fixed.

- Three functions have been added to the `math` package that are used in the Lua/Agena parser <-> virtual
  machine communication to pass numbers: `math.inttofpb`, `math.fpbtoint`, and `math.ceillog2`. For the algorithms
  used, please see the lmathlib.c and lobject.c files.

- The `@` and '$' operators sometimes did not correctly return results due to stack corruption. This has been fixed.

- Very minor tweaking to functions creating structures.

- The Windows Portable installation ZIP file now contains up-to-date C libraries, the DOS Portable installation ZIP
  file contains up-to-date versions of the bags and linalg libaries. The source file distribution also contains all
  library and C source files again.

- This release has been Valgrind-checked on x86 Linux and Mac to ensure there are no memory leaks.


2.3.0, November 08, 2014

- The new `<<<` operator shifts bits to the left (multiplication with 2), the new `>>>` operator to the right
  (division by 2). The `shift` operator performing bit shifts to either direction is and will still be maintained.

- The new function `stats.dbscan` discovers clusters of n-dimensional observations with noise using a density-
  based algorithm, i.e. DBSCAN.

- The new function `stats.neighbours` returns all n-dimensional neighbouring points in a given radius, using the
  Euclidean distance method.

- The new function `stats.acf` computes the autocorrelation of a distribution at a given lag.

- The new function `stats.acv` returns all autocorrelations through a given lag.

- `environ.attrib` returns further information on tables: The 'dummynode' key indicates whether a table contains
  an unallocated hash part (a `dummynode`), the 'length' index returns the estimated number of items in a table using
  a logarithmic estimation method.

- The new function `tables.getsize` returns a guess on the number of elements in a table, an indicator on whether
  a table contains an unallocated hash part, and an indicator on whether null has been assigned to a table. The function
  is useful to determine the size of a table significantly faster than the `size` operator does, using a logarithmic
  instead of linear method, but may return incorrect results if the array part of a table has holes, so the programmer
  should make sure that the array part of a table has no holes. It also does not count the number of elements in the
  hash part of a table.

- The `xml` package, an expat binding, is now also available in the eComStation edition. The original WarpIN installer
  missed parts of this library, please download the fixed agena-2.3.0a-os2.wpi installer, which also includes an updated
  crash course and manual.

- The `print` function sometimes returned incorrect results with hash parts of tables. This has been fixed.

- When arguments have been missing, parts of error messages of various functions were incorrect. This has been fixed.

- The new C API function `agn_tablesize` returns the information needed by the new `tables.getsize` function.

- The new C API function `agn_asize` returns the current number of elements stored in the array part of a table.

- The new C API function `agn_islinalgvector` checks whether a value is a vector created with the `linalg.vector`
  function.

- Some source code cleansing.

- This release has been Valgrind-checked on x86 Linux and Mac to ensure there are no memory leaks.


2.3.0 RC 3, October 26, 2014

- In the parameter list of a procedure, up to four alternative basic type names may now be passed per parameter.

- The `llist` package has been re-implemented in C, yielding a performance gain of two (with appends and prepends)
  to more than twenty times (indexed read and write accesses, insertions, and deletions). The rewritten `iterate`
  function, however, is as fast as the former one. Memory consumption and garbage collection have been significantly
  improved, as well.

- `llist.prepend` and `llist.append` can now insert more than one value into a list.

- The function returned by `llist.iterate` can now skip a given number of subsequent elements if it is called with
  any - optional - non-negative integer, i.e. f := llist.iterate(a); f(); f(1).

- The new function `llist.replicate` creates a copy of a linked list.

- Metamethods for the `=` and `~=` operators have been added to the llist package.

- `sadd` and `qsadd` can now sum up table values with non-numeric keys.

- `settype` and `gettype` could not set or retrieve user-defined types to and from userdata - this has been changed.

- When computing a union of sequences, Agena now properly reduces its size in memory, if appropriate.

- The `==`, `size`, `in`, `union`, `intersect`, `minus`, `sadd`, and `qsadd` operators now support userdata
  metamethods.

- `environ.attrib` now also determines whether a structure has a metatable assigned ('metatable') key.

- `skycrane.scribe` now can automatically print null's and also structures and does not issue errors with these
  values any longer.

- If a file could not be found, `io.readfile`, `io.infile`, `io.readlines`, `io.nlines`, `io.skiplines`, `writefile`,
  returned garbage in the error message. This has been fixed.

- In Windows, `os.memstate` now returns correct values on 64-bit platforms.

- Various error messages have been improved.

- A new data structure has been added: the the memory-saving register. It is a fixed-size Agena `sequence` that
  also stores null's, and it is not automatically extended if more values have to be added (but see `registers.extend`
  and `registers.reduce` on how to extend or shrink a register).

  Registers allow to hide data: by resetting the pointer to the top of a register using `registers.settop`, any values
  stored above this pointer can neither be read nor changed. Most existing statements, operators and functions are
  supported. See also: `registers.gettop`. Please read Chapter 6.15 `Sandboxes`.

  There are no performance gains with regards to sequences, but since registers do not automatically shift elements,
  they are eight times faster with the respective operations.

- The C API functions `agn_getutype` and `agn_setutype` support userdata, as well.

- The deprecated function `package.register` has been removed due to clashes with the new `register` token.

- This release candidate has been Valgrind-checked on x86 Linux and Mac to ensure there are no memory leaks.


2.3.0 RC 2, September 30, 2014

- The new functions `utils.readini` and `utils.writeini` read and write traditional INI initalisation files.

- The new functions `io.filepos`, `binio.filepos`, and `xbase.filepos` return the current file position.

- `io.seek`, `io.filepos`, `io.move`, `io.rewind`, `io.toend`, and `io.filesize` now support files
  larger that 2 GBytes, provided your compiler supports this capability (MinGW/GCC 4.5.2 does not).

- `os.cpuload` now also works on Windows machines.

- A potential memory leak in the `net` package, that did not yet show up, has been fixed.

- If the `net` package had been re-initialised in a session, an error had been returned. This has been
  fixed.

- `os.date` and `os.time`, `os.now`, `os.settime`, `os.computername` now also run on OS/2 - eComStation.

- On OS/2 - eCS, `os.system` returns additional data on the operating system. `os.cpuinfo` now can also
  determine the number of cores, and the `gzip` package has become available in the OS/2 version of Agena,
  too.

- Improved the sources to prevent unneccessary compiler warnings.


2.3.0 RC 1 eCS - OS/2 Warp 4 edition, September 08, 2014

- The eCS edition does not yet feature the 'net', 'xml', 'gdi', and 'fractals' package. Every
  other package that is indicated in the Primer amd Reference as a 'plus package' does not need
  to be intialised with the 'import' statement, since they have been directly compiled into the
  Agena executable.


2.3.0 RC 1, August 14, 2014

- Numeric `for` loops now support the `downto' keyword so that you can count down without using
  an obligatory negative `by` step size. In the `downto' context, the `by' step size should
  always be positive. `from' start and `to' stop values are obligatory when using the `downto'
  keyword.

- The metamethods '__finite', '__entier', and '__sqrt' are no longer supported. Instead, three
  new metathods for operations on structures have been added: '__union' for union operations,
  '__intersect'  to determine intersections, and '__minus' for differences. Thus, the `bags`
  package now also supports these three operations.

- The `\` integer division operator did not support its metamethod and used the one for float
  divison (`/` operator) instead. This has been fixed.

- The new function `stats.gini` determines the Gini coefficient, a measure of (in-)equality.

- The new function `stats.zscore` returns a function computing the z-score (standard score) of
  a sample - the number of standard deviations the sample is above or below the mean of a
  distribution.

- `stats.sorted` now by default uses the Introsort algorithm instead of Quicksort. This can speed
  up computation time thrice in ill-conditioned situations (where Quicksort would need O(n^2)
  operations), while not sacrificing performance in ordinary situations. Actually, Introsort uses
  Quicksort by default and then automatically switches to Heapsort if the recursion depth reaches
  2*log(n, 2), where n is the number of elements in a structure.

  You may override this logic by passing the new option 'quicksort' which solely uses the traditional
  recursive Quicksort method to sort numbers. Also, `stats.sorted` now also can use the Heapsort
  algorithm exclusively if the new option 'heapsort' is being passed, and a non-recursive Quicksort
  algorithm devised by Niklaus Wirth with the new option 'nrquicksort'.

- The new function `stats.meanmed` returns both the arithmetic mean and the median of a distribution,
  or alternatively the quotient of the mean and the median, speeding up computation times when these
  values are needed by around 20 percent.

- Improved the error message of the `size` operator.


2.2.6, July 27, 2014

- `stats.chauvenet` can now check specifically for lower or upper outliers by passing the option
  `outlier='lower'` or `outlier='upper'`, respectively.

- `bags.remove` caused segmentation faults. This has been fixed. Moreover, all `bags` functions
  implemented in C have been internally changed.

- The (undocumented) metamethods for `+`, `-`, and `*` did not work if the `bags` package has not
  been invoked with the `with` function or the `import/alias` statement. This has been fixed.


2.2.5 Library Update 1, July 22, 2014

- Replaced calls to the `select` and `map` functions with `$` and `@` in various libraries.

- Replaced most of the calls to `protect` with `try/yrt´ statements.

- Extended the index of the `Primer and Reference` and updated the `Crash Course`.


2.2.5, July 20, 2014

- The new function `mdf` rounds up a number at its n-th digit, `xdf` rounds it down.

- The `@` (formerly `->`) operator has been fixed and can be used safely now. It still is around 40 %
  faster than `map`.

- The new `$` operator, reminiscent to `@`, selects all the elements in a table, set, or sequence that
  satisfy a given condition checked by a univariate function. It is around 40 % faster than `select`.

- The new 'status' option to `environ.gc` determines whether the garbage collector is running or has
  been stopped.


2.2.4, July 16, 2014

- `stats.percentile` now also returns the lower, the upper outlier limit and the interquartile range of
  a distribution.

- Improved error messages in case of wrong indexing attempts.

- The `@`/`->` operator has been switched off due to segmentation faults. Please use the `map` function
  instead. Library functions concerned have been adjusted properly.


2.2.3, July 07, 2014

- `gdi` package: improved display of axes tickmarks and axes labels.

- The new function `gdi.pointplot` plots one or more graphs of points.

- `stats.ad`, `stats.amean`, `stats.gmean`, `stats.hmean`, `stats.mad`, `stats.mean`, `stats.median`,
  `stats.qmean`, `stats.sd`, `stats.trimmean`, `stats.var` now return `fail` if a distribution contains
  less than two observations.

- `stats.chauvenet` looped infinitely if the distribution contained no elements. Now it returns `fail`
  if a distribution contains less than two elements. Also, the function now accepts alternative functions
  to compute the mean and deviation.

- Corrected error messages of `stats.countentries`.

- Standardised and modulised the C code of some `stats` functions.


2.2.2, June 29, 2014

- `if` conditions can now also be used as expressions, e.g.: a := if cond then expr1 else expr2 fi. The `is`
  operator is still supported but will be deprecated in one of the next major releases.

- Syntactical sugar has been introduced for the `skip` and `break` statements: instead of putting them into
  `if` clauses just add the new `when` token followed by a condition, e.g.: "skip when a > 5" is equivalent
  to "if a > 5 then skip fi".

- The symbol of the mapping operator has been changed so that the code is easier to read: please use `@` instead
  of `->`. The `->` symbol, however, is still supported but will be abolished in one of the next major releases.

- The `xor` operator now works differently with non-Boolean values: it returns the first operand if the second
  operand evaluates to `null`, otherwise the second operand is returned, like the `alternate` function.


2.2.1, June 23, 2014

- This version is functionally equivalent to 2.2.0 Library Update 2 instead that all patches listed have now
  been compiled into the binaries and are no longer being implemented in the Agena language. Installers are
  provided for x86 Solaris, Windows, DOS, x86 Debian Linux, and x86 Mac OS X only.


2.2.0 Cumulative Library Update 2, June 23, 2014

For instructions on how to easily install the update, have a look at the read.me file residing on the root
of the agena-2.2.0-update2.zip archive which can be downloaded from the Binaries/Agena 2.2.0 folder and
used on all platforms. This ZIP file is a cumulative update.

- The `divs` package now tries to avoid to return fractional numerators or denominators.

- The `divs` package now supports the `**` operator to raise a fraction to an integer power. The `==` and
  `~=` equality operators are now supported, too. Furthermore, the equality operators (`=`, `==`) internally
  no longer convert fractions to floats before conducting a check. To compare a fraction and a simple Agena
  number for strict or approximate equality, use the new `divs.equals` function.

- The `int` operator is now supported by the `divs` package and computes the integer quotient of the numerator
  of a fraction divided by the denominator.

-`stats.extrema` and `stats.obcount` each defined a global variable of no use. This has been fixed.

- The `libusb` package is now briefly documented in the Primer and Reference.

- Restructured parts of Chapter 7 of the Primer and Reference. Added a comment on metamethods and relational
  operators to Chapter 6.19.

- The configuration utility which prepares the build of the Agena C sources has been patched (file `config.c`).
  This is only of concern to those users who wish to compile the Agena sources themselves.

- The test suite has been extended and also takes 50 percent less time to complete all the checks (see file
  agena-2.2.0-update2-testsuite.7z in the Sources download subdirectory).


2.2.0 Library Update 1, June 19, 2014

- Fixed `math.norm` for it returned incorrect results if the left border of the target interval was not equal to 0.

- Fixed `io.eof` for it accidently returned the opposite of the expected result.

- New: `io.rewind` sets the file position to the beginning of a file, `io.toend` sets the file position to its end.

- New: When given a second option to `stats.scale`, the function normalises all its observations to the range [0, 1].

- New: `stats.extrema` determines all local maxima and minima in a structure of points.

- When given any option, `stats.ios` now first normalises the distribution to the range (-infinity, 1] (see `stats.scale`),
  determines the difference list, sums of its absolute differences and divides the sum of the number of occurrences
  minus 1 to make a distribution comparable to other ones. It thus no longer divides the sum of absolute differences
  by the arithmetic mean of the observations.

- `stats.obcount`, `utils.readcsv`, `llist.append` accidently defined a global variable each. This has been fixed.

- `environ.globals` has been changed: instead of printing the name of an undefined global variable and the corresponding
  line number at the console, it now returns both name and line number in a sequence of pairs.

- Cleansed the index of the `Primer and Reference`.


2.2.0, June 16, 2014

- The new `mul` statement multiplies its argument by a scalar.

- The new `div` statement divides its argument by a scalar.

- The `div` package has been renamed to `divs`. `div.div` has been renamed to `divs.divs`.

- In short-cut functions, the `?` varargs token is no longer accepted. vararg handling in short-cut functions
  has never been supported, anyway. An example for a short-cut function is "<< x -> x >>".

- The Windows version of Agena now includes a libusb 1.0 binding that has originally been written by Tom N. Harris
  for Lua 5. No documentation is provided, please check the libusb man pages, as the binding provides 1:1 functions.

- The new functions `io.eof` and `binio.eof` check whether the end of a file has been reached.

- `io.infile`, `io.readfile`, `io.writefile` now accept file handles.

- Error handling of `io.skiplines` has been improved.

- The new function `xbase.header` returns the field names of an xBASE file along with the corresponding types.

- `xbase.readdbf` now also accepts file handles. Furthermore, a list of field numbers can be optionally passed
  in order to extract only certain columns.

- Improved error handling of `xbase.purge`.

- `xbase.field` has been deprecated, please use `xbase.readdbf` instead. An `alias`, however, is provided to
  ensure backward compatibility.

- `astro.cdate` often returned wrong results - this has been fixed. It now also returns the fraction of the day.

- Improved error messages of the `astro` package.

- For any other new or changed features of Agena 2.2.0, please read the 2.2.0 RC remarks below.

- Reserved the token `when` for future use, it cannot be used as a name any longer.


2.2.0 RC 4, June 10, 2014

- The new `relaunch` statement restarts a `for/to` and `for/in` loop from its beginning, i.e. resets the
  control variable to its start value (`from` clause or first element, respectively).

- `stats.mad` returns an experimental variation coefficient if any second argument is given.

- The new function `stats.chauvenet` determines outliers in a distribution.

- Added two high-resolution icons for both Agena and AgenaEdit.

- Recompiled AgenaEdit for Windows.


2.2.0 RC 3, May 31, 2014

- The `xbase` package now supports dBASE 7 Doubles, i.e. numbers stored in binary Little Endian format.

- `xbase.new` now accepts the names 'Logical' or 'L', 'Number' or 'N', 'Float' or 'F', (binary) 'Double' or 'O',
  'Character' or 'C' (for strings up to 254 characters long), and 'Date' or 'D' to define fields.

- `calc.neville` now can also return a generating function.

- `linalg.ludecomp` did not correctly check for singular matrices. This has been fixed.

- `skycrane.tee` did not correctly output contents when given the the format option. This has been fixed.

- The `stats`, `linalg`, `calc`, and `xbase` packages have been modified to clear allocated memory in case errors
  occur.

- `stats.mad` and `stats.smallest` caused memory leaks if a distribution included `undefined`s or non-
  numbers. This has been fixed.


2.2.0 RC 2, May 27, 2014

- The new `->` operator maps a univariate function on the elements of a table, set, sequence, and pair. It is
  up to 40 percent faster than the `map` function.

- The new `duplicate` statement puts a copy of the top item of a sequence onto its top.

- The new `exchange` statement exchanges the two topmost items of a sequence.

- The `rotate` statement now also works with tables (on their array parts).

- Tables are now supported by the `pop` operator.

- The new function `stats.fsum` applies a function on each of its elements and then sums the results up.

- The new function `stats.fprod` applies a function on each of its elements and then multiplies the results.

- `stats.ios` returns an experimental variation coefficient if any second argument is given.

- `stats.mad` is 10 % faster now.

- `math.convertbase` has become thrice as fast with decimal input, and around twice as fast otherwise.

- Code-tweaked `stats.scale` and `stats.smallest`.

- The variation coefficient returned by `stats.ad` since 2.2.0 RC 1 has been incorrect. This has been fixed.

- `io.open` now accepts the strings 'read' for second argument 'r', 'write' for 'w', and 'append' for 'a'.

- Improved error message of `approx`, `getbit`, and `setbit`.

- `The functions `notisposint` and `notisnegint` have been removed since they are redundant and also
  could return wrong results when given two or more arguments. Use `isnonposint` and `isnnonnegint`,
  respectively. Aliases, however, have been provided to ensure backward-compatibility.

- The new function `xbase.mark` marks a record in an xBase file to be deleted - it does not, however,
  physically delete or overwrite the corresponding fields. The new function `xbase.ismarked` checks
  whether a record has been marked to be deleted.

- The new functions `xbase.fields` and `xbase.records` return the number of fields and records in an xBase
  file, respectively.

- The new function `xbase.isopen` checks whether its argument is a valid file handle that points to an
  open xBase file.

- The new function `xbase.wipe` deletes all fields of a given record.

- `xbase.readdbf` crashed when reading date values and also crashed when it encountered IO errors when
  reading doubles. It also ignored Float values. This has all been fixed.

- `xbase.field` ignored Date and Float values. This has been fixed.

- Error handling of `xbase.record` has been improved.

- `xbase.sync` now returns true even if nothing had to be flushed.

- The new C API function `agn_seqgetinumber` returns a lua_Number from a sequence; if a value in the sequence
  is not a number, then opposed to `lua_seqgetinumber`, it returns 0.

- Improved the manual.

- This release candidate has been Valgrind-checked on Linux and Mac to ensure there are no memory leaks.


2.2.0 RC 1, May 12, 2014

- The new `rotate` statement moves elements in a sequence up- or downwards.

- The new `pop` operator returns the last element of a sequence and then removes it from the sequence.

- The new `smul` operator multiplies all numbers in a table or sequence.

- `stats.gmean` conducts very fast real multiplication if the new option `true` is given.

- `stats.ad` and `stats.sd` now return the variation coefficient if any second argument is given.

- `math.ndigits` and `ceil` now properly check their argument.

- `math.todecimal` has been extended to handle negative sexagesimal values intuitively.

- The new functions `math.dd` and `math.dms` convert between TI-30 pocket calculator `decimal` sexagesimals. The new function
  `math.splitdms` returns the hours, degrees, and minutes of a TI-30 sexagesimal `decimal`. The functions have been added
  to allow easy sexagesimal arithmethic TI-30 style.

- `io.write` and related functions can now directly output Booleans without applying the `tostring` function before.

- `environ.minlong`, `environ.maxlong`, `environ.pathsep`, and `environ.buffersize` should now be queried by calls
  to `environ.kernel('minlong')`, `environ.kernel('maxlong')`, `environ.kernel('pathsep')`, and `environ.kernel('buffersize'),
  only. Any original Agena library functions can no longer be maliciously manipulated by changing these now deprecate
  environment variables.

- Optimised internal sequence operations.

- The makefile for the DOS edition has been fixed.

- This release candidate has been Valgrind-checked to make sure there are no memory leaks.


2.1.8, April 28, 2014

- When specifying two permitted types for a parameter in the parameter list of a procedure, Agena when calling the
  procedure crashed if the passed value was not of one of the permitted types. Also, when passing `null` at a function
  call, the type check often did not work correctly. All this has been fixed. Type check error messages have been
  improved, too.

- The new function `stats.trimmean` returns the arithmetic mean of the interior of a distribution.

- In Windows, the function to automatically determine the path to the main Agena library at start-up by looking
  for the directory containing the agena.exe binary, sometimes did not work. This has been changed.

- In the DOS and ANSI versions of Agena, `arctan2` returned incorrect results with complex numbers 0!x and 0!y and
  x = y. This has been fixed.

- Improvement of the manual.


2.1.7, April 09, 2014

- When specifying types in the parameter list of a procedure, Agena when calling the procedure only checked the first
  data type and sometimes returned confusing error messages otherwise if more than one data type has been defined in the
  parameter list. This has been fixed.

- `xbase.attrib` now returns concise information on all supported dBASE data types.

- In the manual, the page numbers of the table of contents were incorrect. This has been changed.

- `xbase` test cases have explicitly been added to the test suite.

- The compilation scripts for the cordic package have been changed.


2.1.6, April 08, 2014

- `os.system` can now detect Windows 8.l and Windows Server 2012 R2.

- In the portable Windows edition, it is no longer needed to set the AGENAPATH environment variable in XP or later.

- A long-standing bug in `xbase.new` has been patched to avoid segmentation faults.

- The new function `xbase.writedate` writes a DATE value to an xBASE file, a string in the format YYYYMMDD.

- The new function `xbase.writefloat` writes a FLOAT value to an xBASE file, a decimal number with a total number of
  20 digits, including a maximum of 18 digits following the decimal point.

- `xbase.readdbf`, `xbase.record`, and `xbase.readvalue` now can now read DATE and FLOAT values.

- `xbase.record` returns LOGICAL values as either the Booleans `true` or `false`.

- The codepage used is now stored to xBASE files.

- The new cordic package computes various real functions (logarithm, sine, square root, etc.) with algorithms only
  using addition, subtraction, multiplication, division, and table lookups.

- `xbase.isVoid` has been renamed to `xbase.isvoid`. An alias to the old function name is provided for backward
  compatibility.

- `bags.attribs` has been renamed to `bags.attrib`. An alias to the old function name has been defined to assure
  backward compatibility.

- The unused C API function agn_checkboolean has been removed.

- The backward-compatibility file `compat.0.agn`, providing aliases for Agena 0.31 and earlier functions, has been removed
  due to clashes with the current Agena 2.x namespace.

- The following undocumented C API functions have at least been identified: agn_usedbytes, lua_strnext,
  agn_getfunctiontype, agn_getrtablewritemode, agn_setreadlibbed, agn_getbitwise, agn_setbitwise, luaL_checkoff64_t,
  agn_setbitwise, agn_getbitwise, agn_setdebug, agn_getdebug, agn_setgui.


2.1.5, March 09, 2014

- The new function `linalg.rref` computes the reduced row echelon form of any matrix.

- The new functions `linalg.backsub` and `linalg.forsub` perform backward and forward substitutions on
  augmented or square triangular matrices.

- The new function `calc.simaptive` computes the integral of a univariate function using Simpson-Simpson
  Adaptive Quadrature. It around 50 times faster than the C version of `calc.gtrap`, and thrice as fast
  as `calc.integral`. However, it is not as versatile as `calc.interp`, primarily with singularities
  around or within its borders.

- `calc.gtrap` has been rewritten in C and is 20 % faster now.

- `calc.Ei` now accepts negative values.

- Added a subchapter on pairs to the manual and improved the Quick Reference.


2.1.4, March 02, 2014

New operator

- The new '~=' operator checks for the approximate equality of objects, using Donald Knuth's numerical
  method. The operator is very useful to cope with round-off errors in floating point operations. To
  change the epsilon threshold, please use the environ.kernel/eps facility, changing the value of the
  global system variable `Eps` will not work due to performance and consistency reasons, e.g.:

  > environ.kernel('eps':1e5);

  To check the current setting of the '~=' epsilon setting, just enter:

  > environ.kernel('eps'):


Miscellaneous

- `calc.fsum` has been extended to also process multivariate functions.

- The new C API function `agn_getepsilon` returns the setting of the accuracy threshold epsilon used by the
  '~=' operator and the `approx` function. `agn_setepsilon` sets the threshold.


Improvement of the `linalg` package

- The new function `trace' determines the trace of a square matrix using Kahan-Ozawa summation to
  prevent (or at least minimize) roundoff errors.

- The new function `getdiagonal` returns the diagonal of a square matrix.

- The new function `mulrow` multiplies each element of a specific matrix row by a number.

- The new function `mulrowadd` multiplies each element of a specific matrix row by a number and adds
  it to the respective element of another matrix row.

- The new function `submatrix` returns submatrices, or individual columns as row vectors.

- `diagonal` has been rewritten in C and has become 40 % faster.

- `ludecomp` has been rewritten in C, and due to a new algorithm used its output is much more consistent to
  that of Maple V Release 4 and TI Nspire CX CAS. The pivot vector now is of type vector instead of sequence.
  It also returns a fourth value, `fail`, if the matrix is singular.

- Instead of issueing an error if a singular matrix has been found, `gsolve` now returns `infinity` if an
  infinite number of solutions has been found, and `undefined` if no solutions exists. It returns `fail`
  if it could not determine whether no or an infinite number of solutions exist.

- The '__writeindex' metamethod for vectors now issues an error if a given index is not an integer.

- For consistency, the '==' operator now checks matrix or vector components for strict equality, and the
  '~=' operator approximate equality. Please also have a look at the '__aeq' and '__eeq' metamethods in the
  lib/linalg.agn library file.

- The new functions `maeq` and `meeq` conduct matrix equality checks, the former checking approximate
  equality of the respective matrix components using Donald Knuth's algorithm, the latter conducting a strict
  equality check of the respective components with out any tolerances. Likewise, the new `linalg` functions
  `vaeq` and `veeq` do the same with vectors.

- `veq` and `meq` and their respective metamethods to check for the approximate equality of vector and matrix
  components have been deprecated. They are still available but might be removed in future releases of Agena.
  Please use the '~=' operator instead, which is also faster.

- `backsubs` has been deprecated, please use `gsolve` instead. For backward compatibility, an alias is provided.

- Some error messages of the `linalg` now indicate the name of the function where a vector check failed.


2.1.3, February 21, 2014

New Functions

- The new function `calc.polyfit` returns a sequence of coefficients of an nth-degree polynomial of a sample,
  using polynomial regression. It tries to reproduce polynomial trend lines known from spreadsheet applications.
  There is no limit on the degree, but a degree of 7 or more is not regarded appropriate.

- The new function `calc.linterp` conducts a Lagrange interpolation.

- The new function `linalg.gsolve` performs Gaussian elimination and returns a solution vector plus the
  reduced linear system as an upper triangular matrix. It is at least ten times faster than `linalg.backsubs`.

- The new C API function `agn_geteps` returns the setting to the Agena system variable Eps (epsilon).


Miscellaneous improvements

- Optimised `calc.fminbr`.

- Error management of `beta`, `frac`, `math.zeroin`, and `calc.polygen` has been improved.

- `os.difftime` now is Year 2038-ready.

- `calc.sections` determining subintervals where a change of sign of a given function has been found, is
  now documented.

- Some few C source files and library.agn have been cleansed, there have been no technical or functional
  changes.

- The `gzip` package has been recompiled using the latest zlib 1.2.8 package. At least in Windows, this also
  results into a much smaller package binary.

- The index of the manual has been extended: new main topics `Statements` and `Data Types`, and improvement
  of the overview on mathematical functions, and a hint on how to compare `linalg` objects.


Bug Fixes

- A bug in the simple equality check of tables with filled array and hash parts has been fixed, e.g.
  [4, 1, 'a'~2] = [5, 1, 'a'~2] no longer returs `true`.

- `linalg.add`, `linalg.sub`, and `linalg.scalarmul` did not correctly operate with non-integral vector
  components. This has been fixed. Also tuned `linalg.add` and `linalg.sub` by 20 %, and `linalg.scalarmul`
  by 10 %.

- See also entry to `linalg.meq` below for a fix on the equality check.

- Applied Lua 5.1.5 patch 2: "When loading a file, Lua may call the reader function again after it returned
  end of input."


Improvement of the `linalg` package

- The multiplication metamethod for matrices has been extended to also support multiplication of two
  matrices. Also, with scalar multiplication, the scalar may now also be passed as the second operand.
  Also, the underlying matrix multiplication algorithm has been rewritten in C and now is at least four
  times faster.

- `linalg.scalarmul` has been extended to accept scalar and vector in any order. The vector scalar-
  multiplication metamethod now allows to pass scalar and vector in any order, as well.

- `linalg.dotprod` has now been implemented in C and thus has become 40 % faster.

- `linalg.det` has been reimplemented in C and has become much more accurate. It also is twenty times
  faster now. Contrary to the former implementation, it returny 0 with singular matrices instead of
  issueing an error.

- `linalg.inverse` has been reprogrammed in C and has become at least ten times faster.

- `linalg.transpose` is now written in C. With square matrices, it has become 30 % faster, with other
  matrices, it is now three times faster.

- A new metamethod to compare two matrices has been added to the `linalg` package to fix a bug when
  comparing normal with sparse matrices. Also, Donald Knuth's approximation method is used to compare
  matrix elements (see the `approx` function for information on how this works). See also `linalg.meq`
  in the manual.

- A new metamethod to compare two vectors has been added to the `linalg` package. It uses Donald Knuth's
  approximation method to compare vector elements (see the `approx` function for information on how
  this works). See also `linalg.veq` in the manual.

- Optimised `linalg.swapcol`, `linalg.swaprow`, and `linalg.identity`.


2.1.2, January 20, 2014

New expression, new operators and functions for general use:

- In parameter lists, Agena can now validate up to two basic types for a given argument with the Maple-like
  arg :: { type[1], type[2] } parameter extension. Thus, for example, proc(x :: {number, complex}) checks
  for both rational and complex numbers x. User-defined types are not supported by this new feature.

- Memory management of manager both parameters and local procedure variables has been improved. Thus, for
  example, Agena consumes 7 percent less memory after start-up.

- The new `nan` operator checks whether a number or complex numbers evaluates to `undefined`.

- `finite` now can also check complex numbers.

- `conjugate` has become an operator and is three times faster than before.

- `arcsec` is now an operator and has become 33 % faster.

- The new function `cabs` returns the real and imaginary absolute value of a complex number.

- The new function `net.smallping` conducts low-level network connection attempts to a server to see
  whether it is alive and also determines round-trip times.

- Improved error handling of `cot`, `coth`, `sec`, `csc`, `arctanh`, `arcsec`, `arccsc`, `arccsch`,
  `arccot`, `csch`, and `sech`. They thus have become 5% slower.

- `stats.prange` crashed Agena when it had to sort a structure at first. This has been fixed.

Operators for faster computation of fractals (see the `fractals` package):

- The new `cosxx` operator implements FRACTNT's v16 buggy cosxx function, i.e. if cos(x + I*y) = a + I*b, then
  cosxx(x + I*y) calculates a - I*b (i.e. the imaginary part of the result has the wrong sign). The function
  usually produces beautiful fractals, and is 33 % faster than the former `fractals.cosxx` function, which has
  been removed.

- With a complex number z = x + I*y, the new `bea` operator returns the complex number bea(x * I*y) =
  sin(x)*sinh(y) + I*cos(x)*cosh(y), and `undefined` if a number is passed. The function produces beautiful
  fractals, and is 33 % faster than the former `fractals.bea` function, which has been removed.

- The new `flip` operator swaps the real and imaginary parts of a number. It always returns 0 with numbers.
  It is 60 % faster than the former `fractals.flip` function which has been deleted.


2.1.1, January 03, 2014

- `try/catch`: explicit specification of an error variable right after the `catch` token is now optional. If no
  error variable is given, then the error message is automatically stored to the local `lasterror` variable, and
  the `then` keyword must be left out:

  > try
  >    error('oops !')
  > catch
  >    print(lasterror)
  > yrt;
  oops !

- The `try/catch` statement sometimes did not work in procedures (unassigned error variable). This has been fixed.

- Tuned `skycrane.counter` by 10 %. The function now optionally applies the Kahan-Ozawa instead of the original Kahan
  summation algorithm if the new third argument is the string 'ozawa'. The corresponding C sources have been modified to
  prevent compilers optimisation, which could cancel the optimisations, as well.

- `argerror` now prints the user-defined type name of a value received in its error message. If a value does not have a
  user-defined type, then its basic type is issued.

- The new 'a' option to `debug.getinfo` returns the number of arguments expected by a procedure, thanks to Rob Hoelz'
  LuaPowerPatch.

- Improved `index out-of-range` error message for strings.

- Modified the `stats.agn`, `linalg.agn`, `library.agn`, and `ansi.agn` files with respect to their error handling.


2.1.0, December 30, 2013

- For a new kind of error handling, the new `try/catch` statement has been introduced. It has been invented and written by
  Hu Qiwei for Lua 5.1 back in 2008.

  In general, any statements where an exception might be expected can be put into a `try` clause. If an error is issued,
  generated by an explicit call to the `error` function or to any other expression, function, or statement, control imme-
  diately jumps to the corresponding `catch` clause if present or to the end of the `try/yrt` statement if no `catch`
  clause has been given, ignoring any other subsequent statements in the `try` clause.

  > try
  >    for i to 3 do
  >       print('before', i);
  >       if i = 2 then error('oops') fi;
  >       print('after', i)
  >    od
  > catch err then
  >    print('error', i, err);
  > yrt
  before  1
  after   1
  before  2
  error   1   oops

  The `protect/lasterror` error dealing facilities are still and will always be supported. The new control statement also
  works with the `break`, `skip`, `redo`, and `return` statements flawlessly.

- The new `redo` statement restarts the current iteration of a `for/to` and `for/in` loop from the beginning. Example:

  > flag := true;

  > for j in [10, 11, 12] do
  >    print('before', j, flag);
  >    if flag and j = 11 then
  >       clear flag;
  >       print('   -->', j, flag, 'jump back')
  >       redo
  >    fi;
  >    print('after', j, flag)
  > until j > 12;

  before  10      true
  after   10      true
  before  11      true
     -->  11      false      jump back
  before  11      false
  after   11      false
  before  12      false
  after   12      false

- The new `recip` operator returns the inverse of a number x. It is equivalent to the expression 1/x, but faster.

- The new `stats.ema` function computes the exponential moving average of a distribution. The new function
  `stats.gema` returns an iterator function returning the respective exponential moving average of a distribution.

- `*%`, `+%`, and `-%` returned `undefined` instead of a correct result if their right operand had been zero.
  This has been fixed.

- Fixed an error message in `net.survey`.

- Improved error messages for out-of-range indexing of pairs and strings.

- In the ANSI, Solaris, and DOS versions, the `int` operator has been tuned.

- The new C API function `agn_arraytoseq` converts a numeric array into a sequence and pushes this new sequence
  on top of the stack.

- Updated the manual.


2.0.0, December 01, 2013

- Agena 2.0 is downward-compatible to Agena 1.12, except that the tokens `import`, `alias`, `until`, and
  `onsuccess` are now keywords and can no longer be used as variables. Currently, there are Solaris,
  Debian (x86, PowerPC, Raspberry Pi), Windows, Mac, and DOS installers available for 2.0, including
  an updated Primer and Reference that explains all new features in detail.

- The new loop variants `for/as` and `for/until` check a condition at the end of the current iteration and either
  commence the next iteration or leave the loop. This works with both `for/to`, as well as `for/in` loops. In
  effect, both variants execute a loop at least once until the given condition is being checked.

  Examples:

  > for i to 5 do
  >    print(i)
  > as i < 3
  1
  2
  3

  > for i in [1, 2, 3, 4, 5] do
  >    print(i)
  > until i >= 3
  1
  2
  3

- The new `do/until` loop iterates until a certain condition is met:

  > c := 0;

  > do
  >   inc c;
  >   print(c)
  > until c >= 3
  1
  2
  3

- In numeric `for` loops, the `to` clause may not be given any longer. Instead, when leaving out the `to` clause,
  the loop iterates until the largest number representable on your platform, in C HUGE_VAL, has been reached:

  > for i do
  >    print(i)
  > od

- The new `onsuccess` clause in `if` and `case` statements executes a chunk if at least one of the conditions
  is true. Examples:

  > flag := false;
  > if 1 = 0 then
  >    print(0)
  > elif 1 = 1 then
  >    print(1)
  > onsuccess
  >    flag := true
  > else
  >    print(-1)
  > fi;
  1

  > print(flag);
  true


  > flag := false;
  > if 1 = 0 then
  >    print(0)
  > elif 1 = 0 then
  >    print(1)
  > onsuccess
  >    flag := true
  > else
  >    print(-1)
  > fi;
  -1

  > print(flag);
  false

  > flag := false;
  > a := 2;
  > case a
  >    of 1 then
  >       print(1)
  >    of 2 then
  >       print(2)
  >    onsuccess
  >       flag := true
  >    else
  >       print(-1)
  > esac;
  2

  > print(flag);
  true

- The new `import` statement allows to import one or more libraries without putting their names into quotes, e.g.
  "import calc, stats" is equivalent to "readlib('calc', 'stats')".

- The `alias` option to the `import` statement assigns one or more short names to the library functions initialised,
  e.g. "import calc alias xpdiff" is equivalent to "with('calc', 'xpdiff')", and "import calc alias" is equivalent to
  "with('calc')".

- The new `..` operator allows to index tables even if its left-hand side operand evaluates to `null`. In this case,
  `null` is returned and no `attempt to index field ... (a null value)` error is issued. It is similar to the `getentry`
  function but is three times faster. Examples:

  > create table a;
  > a.b:
    null
  > a.b.c:
    Error in stdin, at line 1:
      attempt to index field `b` (a null value)
  > a..b..c:
    null

  > create table a;
  > a[1]:
    null
  > a[1][2]:
    Error in stdin, at line 1:
      attempt to index field `?` (a null value)
  > a..[1]..[2]:
    null

- The new function `drem` evaluates the remainder of an integer division x/y, but contrary to `irem`, rounds the
  internal quotient x/y to the nearest integer instead of towards zero.

- The new function `skycrane.todate` returns the current date and time as a formatted string.

- The new function `io.truncate` truncates a file at the current file position.

- The new function `io.move` changes the file position a given number of characters to the left or right.

- The new function `io.filesize` returns the size of a file.

- `readlib` now accepts strings as its arguments, only. Numbers are not allowed any longer.

- If the last argument to `with` is the Boolean `false`, then the function does not write assigned short names
  to the console (stdout).

- `strings.fields` now also accepts a sequence of index numbers. It does not, however, accept the index `0` any longer.

- The Raspberry Pi Wheezy Debian installer now includes the `gdi` graphics package.

- The `change.log` file is now correctly displayed in Windows.


1.12.9, November 05, 2013

- The new functions `io.getclip` and `io.putclip` exchange texts between Agena and the clipboard (Windows only).

- `stats.prange` has been rewritten in C and has become up to 1.5 times faster.

- `os.cpuinfo` now returns correct and more information on ARM-based systems.

- In DOS and UNIX systems including Mac OS X and only in the complex domain, the exponentiation of the base 0 to the
  exponent 0 + r*I, with r any non-zero float, returned `undefined` instead of 0. This has been fixed.

- In DOS and UNIX systems including Mac OS X and only in the complex domain, the exponentiation of the base 0 to the
  exponent r + 0*I, with r any positive float, returned `undefined` instead of 0. This has been fixed.

- `stats.obcount` and `stats.obpart` could not include values into the rightmost subinterval. This has been fixed.

- `calc.nakspline`, `calc.naksplinecoeffs`, `calc_clampedspline`, and `calc_clampedsplinecoeffs` provoked segmentation
  faults if called with a structure that contained too few points, i.e. pairs. This has been fixed by returning `fail`
  in these cases.

- Potential memory deallocation errors have been removed from `calc.neville`, `calc.interp`, `calc.newtoncoeffs`,
  `calc.naksplinecoeffs`, `calc.clampedsplinecoeffs`, `calc.nakspline`, and `calc.clampedspline`.

- The new C API function `agn_checkinteger` checks whether an argument is a number and an integer and - contrary to
  `luaL_checkinteger` - issues an error otherwise.


1.12.8b, October 31, 2013

- Minor improvements to the sources.

- Improvement to debug information.

- Minor improvements to the information displayed after entering `agena -h` in a shell.

- The Max OS X installer did not work at least in Leopard. This has been fixed.

- Uploaded a Linux Debian PowerPC and Raspberry Pi/Wheezy installer.

- The Linux Debian Intel installer did not work at least in Xubuntu 10.x. This has been changed.

- The sources have been updated with corrected installer creation scripts for both Debian PowerPC and Debian Intel,
  and a corrected configuration file to allow successful compilation in DOS.

- Added installation Raspberry Pi/Wheezy build files to the sources.


1.12.8, September 13, 2013

- The new function `stats.mad` determines the median absolute deviation of a distribution.

- The new function `bags.minclude` inserts all elements in a sequence into a bag, thus de-coupling the number
  of elements to be included into a bag from the limited size of Agena's arguments stack.

- If bags included a non-numeric element, outputting the bag at the console failed. This has been hot-fixed.

- Updated the manual and Quick Reference.


1.12.7, August 29, 2013

- The new function `math.tosgesim` converts a decimal to its sexagesimal representation.

- The new function `proot` returns the principal root of a number or complex number.

- The new function `cbrt` determines the cubic root of a number or complex number, and is around 33 % faster
  than `root` with complex numbers.

- `math.todecimal` has now been implemented in C and is 33 % faster. It now also does not require an obligatory
  second and third argument.

- `fractals.flip` has been implemented in C and is around 15 % faster now.

- Solaris, Linux, Mac, and Windows, and maybe DOS sometimes returned `undefined` instead of 0 when trying to raise
  the complex origin to a power. This has been fixed.

- In Solaris 10 and only with complex numbers, the underlying libm function cpow used to conduct complex exponentiation
  (`^` operator) sometimes returned incorrect results. This has been hot-fixed by replacing cpow with a self-written one.

- There have been problems when trying to compile the 1.12.6 sources. This has been changed.


1.12.6, August 22, 2013

- The iterator produced by `stats.gsma` always returned 0. This has been fixed.

- `stats.obcount` and `stats.obpart` returned errors if one of the elements in a distribution matched the
  right border of the overall subinterval (second argument). This has been fixed.

- Added more examples on using Lua-style regular expressions to the manual.


1.12.5, August 18, 2013

- `stats.obcount` and `stats.obpart` have been tuned by 55 %, using an arithmetic method to determine the fitting
  subinterval instead of bifurcation; thus also values both situated at the right border of a subinterval and the
  left border of the neighbouring subinterval are now correctly collected according to the defintion in the manual.

- `io.infile` sometimes did not return correct results in case a line consisted of `environ.buffersize` or more bytes
  (currently >= 512 bytes on Windows, but depending on the respective C BUF_SIZ defintion on other operating systems).
  This has been fixed.

- The Mac OS X installer did not include patched versions of `stats.(g)sma` and `stats.(g)smm`. This has been fixed.


1.12.4 Cumulative Update 3, August 08, 2013

- For instructions on how to easily install the update, have a look at the libupdate.read.me file residing on the root
  of the agena-1.12.4-update3.zip archive. This archive can be downloaded from the Binaries/Agena 1.12.4 folder.

- For Windows, DOS, and Mac, the Agena 1.12.4 u3 installers include the 1.12.4 original release plus this cumulative update.

- `stats.obpart` has been sped up significantly at least four times by avoiding unnecessary repetative identical function
  calls.


1.12.4 Cumulative Update 2, August 07, 2013

- For instructions on how to easily install the update, have a look at the libupdate.read.me file residing on the root
  of the agena-1.12.4-update2.zip archive. This archive can be downloaded from the Binaries/Agena 1.12.4 folder.

- For Solaris, Windows, DOS, Mac, and Linux, the Agena 1.12.4 u2 installers include the 1.12.4 original release plus
  this cumulative update.

- The new `stats.obpart` function sorts occurrences into subintervals. Contrary to `stats.obcount`, it does not
  just count the occurences in each subinterval, but inserts the observations or parts of it into these intervals.

- The `skycrane.tee` function now also accepts a C-/Agena-style `printf`-like format string.

- `utils.readcsv` now allows to ignore certain lines in a CSV file with the new 'ignore' option. It now also
  returns the CSV line number in case of non-existing fields.


1.12.4 Update 1, July 30, 2013

- For instructions on how to easily install the update, have a look at the libupdate.read.me file residing on the root
  of the agena-1.12.4-update1.zip archive. This archive can be downloaded from the Binaries/Agena 1.12.4 folder.

- `clock` package: when subtracting `tm` values, debugging information had been printed at the console. This has been fixed.

- `gdi.plotfn` and `gdi.plot` did not properly print y-axis labels and the left x-axis label in some situations. This has been
  hot-fixed.

- Undocumented and unused `gdi.sync` and `gdi.autosync` aliases have been removed from the `gdi` package.

- Updated the scheme files.


1.12.4, July 25, 2013

- `os.date` returned an unusable string when given a time format string. This has been changed. Also, the descriptions of
  `os.date` and `os.time` have been corrected in the manual.

- `os.time` has become Year 2038-compatible and now also accepts a sequence of date and optionally time values.

- `clock.sgstr` now returns correct results if the seconds component is a fraction.

- The `clock` package now prevents round-off errors if the seconds component of a `tm` value also includes milliseconds.

- `stats.sma`, `stats.smm`, `stats.gsma`, `stats.gsmm` exposed a memory leak if the passed structure included `undefined`.
  This has been fixed.

- `stats.sma` and `stats.smm` have been tuned by removing an unnecessary Agena API call.

- `stats.sorted` and `calc.naksplinecoeffs`, `calc.nakspline`, `calc.clampedspline` exposed memory leaks if the structure contained
   too many values (i.e. if internal memory allocation errors occurred).  This has been changed.

- `calc.interp` created a memory leak if it issued the error `number of coefficients must be equal to number of points`.
  This has been fixed.

- `calc.interp` amd `calc.clampedspline` created a memory leak if they issued the error `expected a sequence of three sequences`.
  This has been fixed.


1.12.3, July 21, 2013

- The new functions `stats.gsmm` and `stats.gsma` are like `stats.smm` and `stats.sma`, respectively, but return iterator functions.
  The larger the size of a distribution, the faster they are with respect to `stats.smm` and `stats.sma`.

- `calc.polygen` has been rewritten in C and thus is 60 % faster now.

- `os.datetosecs` now also accepts sequences and also three up to six integers representing the date and optionally time.

- `utils.checkdate` now also accepts tables or sequences of date/time values.

- Out-of-range detection in `stats.sma` and `stats.smm` has been improved.

- If the number of table entries to `os.datetosecs` is less then three, the function now returns an error.


1.12.2, July 16, 2013

- The new function `stats.sma` returns the simple moving average, both in its scientific as well as its financial variation.

- The new function `stats.smm` returns the simple moving median, both in its scientific as well as its financial variation.

- Improved error messages of almost all `binio` functions.

- `binio.readstring` crashed when not reading a string from a file, this has been fixed.

- `skycrane.semaphore` has been renamed to `skycrane.count`, and an alias has been set up to link to the new function for
  back-compatibility.


1.12.1, June 24, 2013

- The new function `os.symlink` creates a symbolic link.

- The new function `os.readlink` returns the name of the file a symbolic link is referring.

- The new function `strings.separate` splits a string into its tokens surrounded by a given set of delimiters. Contrary to `split`,
  the delimiter at the front of a token may be different from the delimiter at its end.

- `io.isopen` has been implemented in C and is at least 66 percent faster.

- `os.fstat` is now Year 2038-compatible, additionally returns the device number, and in UNIX/Mac also a file ID, the disk space
  occupied by a file, and the optimal block size for reading or writing the file. NTFS symbolic links including NTFS junctions
  are now detected by the Windows version of this procedure.

- `os.fstat`, `os.listcore` and thus `os.list` did not detect symbolic links on UNIX-based systems. This has been changed.

- `clock.sgstr` can now also convert `tm` values.

- `skycrane.trimpath` has become 25 percent faster.


1.12.0 Update 1, June 14, 2013

- For instructions on how to easily install the update, have a look at the libupdate.read.me file residing on the root
  of the agena-1.12.0-update1.zip archive. This archive can be downloaded from the Binaries/Agena 1.12.0 folder.

- `printf` can now write a formatted string to a file if its first argument is a handle pointing to an open file.

- The new function `clock.sgstr` converts a float into its sexagesimal string representation of the format hh:mm:ss. Another
  delimiter to separate the time components can optionally be given.

- Fixed round-off errors in `clock.totm`.

- Added a hint to downloadable Library Updates and their installation notes to the manual in the new Chapter 2.9. In general,
  cumulatative updates are provided to minimize maintenance.


1.12.0, June 11, 2013

- Sequences can now be indexed with negative indices, determining elements from the right end of a sequence - provided that
  the indices are in the correct range. This also holds true when trying to index a sequence range with the `to` keyword.

- Corrected error messages with invalid sequence indices.

- The `create local` statement now also supports the `sequence` keyword - along with the `seq` keyword - to create local
  sequences.

- `os.date`, when called with no argument, did not correctly return milliseconds less than 100 msecs in the time string.
  This has been changed.

- Initalisation procedures for packages now should be of the form `<packagename>.aux.init`. The old style `<packagename>.init`
  is still supported but `with` will still assign a short name in this case to the initialisation procedure for backward
  compatibility, which you may want to avoid.

- Corrected Chapter 6.17 `Packages`.


1.11.7, June 09, 2013

- `os.date`, `os.time`, and `os.now` now also return milliseconds.

- `os.date`, when called with no argument, returned different strings on various platforms. This has been changed. It now
  returns a string of the format 'YYYY/MM/DD hh:mm:ss', plus '.' & milliseconds, if milliseconds could be determined, on
  all platforms.

- The new function `skycrane.tee` writes text to both the console and into a file.

- The `create` statement now accepts the `sequence` keyword to create new sequences. The `seq` keyword is still supported
  by `create`.

- `utils.readcsv` and thus `skycrane.readcsv` could not convert a numeric string into a number if the string had been enclosed
  by single or double quotes. This has been changed.


1.11.6, June 06, 2013

- `io.readfile` now can optionally only return the contents of a file if it includes a given substring, or if it does not
  include a given substring.

- The new function `io.infile` checks whether a file includes a given substring and returns `true` or `false`. It is 40 percent
  faster on Windows than `io.readfile` with the pattern option.

- `stats.sorted` can now optionally use an iterative Quicksort algorithm by passing the new `true` option. Using the iterative
  algorithm may be faster on older machines than using the default recursive one.

- Improved error handling of `io.readlines`, `io.nlines`, and `io.skiplines`.

- `utils.findfiles` did not work if only one file name had been given or if a procedure has been passed. This has been
  changed. The function now is 40 % faster in line-per-line mode.

- In the manual, improved Solaris and Linux installation instructions with regard to dependencies.


1.11.5, May 26, 2013

- `skycrane.enclose` has been rewritten in C, and is four times faster now.

- `skycrane.semaphore` has been rewritten in C and now is 20 % faster. The function now also applies Kahan summation if
  the start value is a non-integer.


1.11.4 Cumulative Update 3, May 23, 2013

- For instructions on how to easily install the update, have a look at the libupdate.read.me file residing on the root
  of the agena-1.11.4-update2.zip archive. This archive can be downloaded from the Binaries/Agena 1.11.4 folder.

- The `clock` package now supports the following operators: `^`, `sqrt`, `ln`, `exp`, `abs`, `sign`, `sin`, `cos`,
  `tan`, and `arctan`.

- The `24-hour` threshold for `tm` values has been removed. Thus, the hours (or degrees) part of a `tm` value might be
  any non-negative number.

- In the `clock` package, the `/` operator did not work if the first argument had been an integer and the second
  argument a sexagesimal. This has been fixed.

- The `clock` package can now also multiply two sexagesimals or divide them.

- The new function `skycrane.enclose` encloses a string or number with a given character or string.

- The new function `skycrane.stopwatch` implements a stopwatch.

- The new function `skycrane.semaphore` returns an counter function using - if needed - Kahan round-off error prevention.

- `clock.dectotm` has been renamed to `clock.totm`. `clock.tmtodec` has been renamed to `clock.todec`. Aliases to the
  former function names are provided.

- Updated the Quick Reference (agena.xls).

- Updated the scheme files.


1.11.4, May 14, 2013

- The new `*%` operator returns the percentage.

- The `/%` operator returned the percentage instead of the ratio. This has been fixed.

- Updated the Crash Course.

- Recompiled AgenaEdit for Windows.


1.11.3, May 12, 2013

- The new operators `+%` and `-%` add or subtract a percentage.

- The new function `io.writefile` writes all of the given numbers or strings to a new file. The function is around
  twice as fast than using a combination of `io.open`, `io.write`, and `io.close`.

- The `div` package now supports the following operators: `^`, `sqrt`, `ln`, `exp`, `abs`, `sign`, `sin`, `cos`,
  `tan`, and `arctan`.

- The new function `div.numer` returns the numerator in a `div` structure.

- The new function `div.denom` returns the denominator in a `div` structure.

- `notisposint` can now process more than one argument.

- The new function `notisnegint` checks whether all of its arguments are zero or positive.

- The new function `ispositive` checks whether all of its numeric arguments are positive.

- The new function `isnegative` checks whether all of its numeric arguments are negative.

- The new function `isnonneg` checks whether all of its numeric arguments are zero or positive.

- `/%` has been patched.

- `sign` returned 1 if its argument has been `undefined`. It now returns `undefined` in these cases.


1.11.2 Update 1, May 07, 2013

- The `div` and `clock` packages now support relations; thus, fractions and times can be compared with the `<`, `<=`,
  `=`, `=>`, and `>` operators.

- The new function `stats.numbcomb` returns the number of combinations.

- `strings.ljustify` and `strings.rjustify` now also accept numbers as their first argument.

- Documented `xml.decode` which receives a string containing an XML stream and which - contrary to `xml.decodexml` -
  can cope with situations where one and the same XML object is present multiple times on the same hierarchy.

- For instructions on how to easily install the update, have a look at the libupdate.read.me file residing on the
  root of the update ZIP archive.


1.11.2, May 02, 2013

- `io.readfile` now removes all newlines and all carriage returns if the second argument `true` is being passed.

- The new function `strings.lrtrim` removes all leading and trailing white spaces or the given leading or trailing
  character from a string. It does not remove spaces or the given character within the string.

- The new constant `PiO4` is equivalent to Pi/4.

- The new function `stats.ssd` returns the sample standard deviation.

- `utils.decodexml` and thus `utils.readxml` now properly treat dots and underscores in XML tags and do not slice off
  trailing characters from these tags. Leading and trailing white spaces are now removed from the XML value. Line breaks
  within the XML value are still not being removed.

- `binio.writeshortstring` and thus also `save`, which uses the formerly mentioned function, crashed Agena when trying
  to save strings of 255 characters or less; this has now been fixed.

- The Quick Reference now also lists all mathematical constants available.

- AgenaEdit for Windows has been recompiled.


1.11.1, April 22, 2013

- The new function `polar` converts a number or complex number into its polar form.

- The new constant `E` is equivalent to the existing constant `Exp` = exp(1).

- The new constant `Pi2` is equivalent to 2*Pi.

- The new constant `PiO2` is equivalent to Pi/2.

- `stats.numbperm` now also accepts sets of any type of elements.

- Error handling in `stats.cdf` has been improved.

- The pure ANSI C API functions `agn_complexreal` and `agn_compleximag` have now been documented.

- Minor other improvements to the manual.


1.11.0, April 16, 2013

- The new `/%` operator divides two numbers and returns the result in percent.

- The new `iqr` function returns the integer quotient and integer remainder of two numbers.

- The new function `stats.pdf` computes the probability density function for a normal distribution.

- The new function `stats.cdf` implements the cumulative density function.

- The new functions `stats.ndf` and `stats.nde` help in writing new statistical distribution functions.

- The new function `strings.isspec` checks whether a string consists entirely of special characters.

- The new function `strings.isalphaspec` checks whether a string consists entirely of Latin letters, diacritics, and
  special characters.


1.10.5, April 09, 2013

- `binio.writechar`, `binio.writenumber`, `binio.writelong`, `binio.writestring`, and `binio.writeshortstring` now accept
   further data to be saved to a file.

- The new `div` package provides basic arithmetic functions to process fractions.

- The `clock` package has been internally improved.

- The `__tostring` metamethod in conjunction with `print` might have crashed Agena when trying to simply return its own
  non-numerical or non-string argument. This has been fixed.


1.10.4, April 02, 2013

- The `instr` operator in conjunction with the new 'borders' option had a memory leak due to premature garbage collection
  of the returned pair. `strings.mfind` thus had also been affected. This has been fixed.

- `os.listcore` contained a memory leak, which has been removed, also to the benefit of the wrapper `os.list` procedure which
  uses `os.listcore`.

- The test suite has been extended.

- Agena has been successfully Valgrind-verified with the new test suite.


1.10.3, March 31, 2013

- The `llist` package now uses pairs instead of dictionaries to hold values, resulting in a speed increase of around 10 %.

- `llist.append` can now append more than one value to a list.

- `llist.purge` issued an error if it tried to delete the last value in a list. This has been changed.

- `utils.findfiles` did not work any longer if a single file name had been passed. This has been corrected.


1.10.2, March 25, 2013

- `io.readfile` has been rewritten in C. While the increase in speed on Windows is almost unnoticable, the gain on Mac OS X is 8 %.

- In the manual, Chapter 7 Standard Libraries has been completely restructured and reformatted. Also, Chapter 8 C API Functions
  has been reformatted.


1.10.1, March 18, 2013

- The new function `io.skiplines` skips a given number of lines in a file and may boost processing a text file when looking for
  data always residing at a specific part.

- Improved Chapter 4.7.8 on patterns and captures in the manual.

- Recompiled the `mapm` package for the Windows installer.


1.10.0, March 11, 2013

- The `instr` operator can now return the start and end positions of a pattern in a string with the new 'borders' option. The
  operator now also behaves like `strings.find` in case an invalid index has been passed (usually now resulting to `null`)
  instead of issuing an error.

- The new function `strings.mfind` returns all start and end positions of a pattern found in a string.

- The new function `strings.capitalise` capitalises a string.

- The third argument to `strings.remove` now is optional. If not given, it defaults to 1, i.e. only the character at the position
  given by the second argument is deleted from the string. Also, an index 0 (zero) is no longer accepted. An index n where
  n was the size of the string plus 1, did not issue an error, now it does.

- `strings.include` can now append strings, but string concatenation with the `&` operator should still be preferred in those
  cases due to performance reasons.

- The new character classes %v and %k for pattern matching recognise vowels including y, and consonants.

- The optional third argument to `utils.writecsv` (passing the delimiter) can now either be a string or an option of the form
  `delim = <any string>` or `'delim':<any string>`. If the third argument is none either, it now issues an error. This has been
  done to avoid confusion for `utils.readcsv` has been already been accepting the 'delim' option. Examples:

  > utils.writecsv(obj, 'd:/config/config.csv', delim='|');   # equal to:
  > utils.writecsv(obj, 'd:/config/config.csv', 'delim':'|');   # equal to:
  > utils.writecsv(obj, 'd:/config/config.csv', '|')

- `strings.remove` can no longer remove empty strings from a string. Instead an error is issued.

- Extended Chapter 4.7.8 on patterns and captures.

- The C auxiliary library function `agnL_optinteger` has now been documented. The C macro `agnL_optint` just simply referring
  to `agnL_optinteger` has been removed from the sources.

- Due to the small download rates of the Linux and Solaris editions, there may be no further installers for these operating
  systems.


1.9.5, February 28, 2013

- The new function `io.readfile` reads the entire contents of a file given by its name, a string, in binary mode, and returns
  it as a string.

- If `os.remove` or `os.move` could not delete or move an existing file, they returned `true` without deleting or moving
  the respective file.  Now they correctly issue an error. At least with GCC compiled versions of Agena, file name jokers
  such as `.`, `..`, `*`, and `?` are still not accepted.

- `utils.findfiles` consumes less memory and besides a path now also accepts a list of specific files to be scanned for a text.

- `os.listcore` has been slightly tuned.

- The `case` statement could not properly treat indexed values in the `case` clause (e.g. case environ.os of ..., or case
  a[n] of ...). This has been fixed. Indexed values in the `of` clauses however have been working correctly.


1.9.4, February 21, 2013

- The new function `strings.glob` compares a string with a pattern including the wildcards `?` and `*`, where `?` represents
  exactly one unknown character, and `*` represents zero or more unknown characters.

- `os.listcore` and thus `os.list` are now much faster and more memory efficient when given file wildcards.

- `os.list` did not always properly descent recursively into subdirectories. This has been fixed. It also now returns the absolute
  path to the main directory scanned as a second return.

- `utils.findfiles` did not correctly treat wildcards, this has been changed.

- Due to improper internal stack management, `restart` crashed Agena if the library.agn file contained an error at invocation.
  This has been fixed. Also `restart` now properly treats the -d command line switch (debugging mode) and when given, prints
  information on re-initialisation.


1.9.3, February 19, 2013

- The new function `os.cpuinfo` determines information on the processor in use, e.g. its type, number of cores and clock rate.
  It is fully available in Windows 2000 and above, Mac OS X, and in Linux.

  The only returns in common to all of the operating systems listed above are the `brand`, `frequency`, `vendor`, and `ncpu`
  fields. All other fields may be system-dependent.

  SPARCs and DOS are rudimentarily supported.

- The new function `io.isopen` checks whether a file is open and also - contrary to `io.isfdesc` checks for a valid file position.

- The new function `log2` returns the base-2 logarithm of a numeric or complex argument.

- `log10` now has been implemented in C and is around 10 % faster.

- `log` is now an operator and on average is four times faster.

- `approx` returned a wrong result if both arguments had been `undefined` and at least one of the arguments had been of type complex.
  This has been changed.

- If its second argument has multiple returns, `values` can now process all of them instead of only its first return. Thus, for
  example, the `unpack` function can now be used in calls to `values`.

- The `gzip` package now is available in the DOS binary distribution.

- Improved the index of the manual.


1.9.2, February 05, 2013

- The `llist` package has been changed:

  a) the package is now entirely implemented in Agena not using functions implemented in C any longer,

  b) linked lists including `null`s are now properly printed and converted to strings for output,

  c) `llist.listtoseq`, `llist.checklist`, `llist.getn` and `llist.seqtolist` have been removed, the first three possibly
     corrupting Agena's stack with maliciously manipulated llist structures.

  d) The new function `llist.listtotable` converts a linked list to a plain table.


1.9.1, February 04, 2013

- The new package `llist` implements linked lists which are at least six times faster than tables or sequences when
  having to conduct a large number of insertions or deletions.

- The new function `utils.checkdate` checks whether a date and optionally a time exists.

- The new function `os.cpuload` returns the 1, 5 and 15 minute load averages of the computer. It is available in Linux
  and Mac OS X only.

- The new function `os.pid` returns Agena's process ID.

- The new function `notisposint` checks whether a number is not a positive integer. It is 10 % faster than `not isposint`.

- `checkoptions` now does not issue its function name in case of errors, but the name of the function that called it.

- `os.setdate` now can set the system time in Windows.

- `os.execute` now issues an error if no command processor could be found.

- The `size` operator now also works with pairs.

- The `__size` metamethod did not work at all. This has been fixed.

- The `__in` metamethod did not work with sets. This has been fixed.

- `skycrane.removedquotes` has been implemented in C and thus is around three times faster.

- `skycrane.tocomma` and `skycrane.trimpath` have been implemented in C and thus are now both around twice as fast.

- `os.fattrib`, `os.datetosecs`, `os.settime`, `astro.sunriset`, and `astro.moonriset` did not correctly check the
  date and time values passed. This has been changed.

- `strings.dleven`, `strings.field`, `ads.getall`, and `net.receive` now correctly handle memory allocation failures.

- Removed some few unnecessary assignments reported by DJGPP/GCC 4.7.2 in the C sources.

- Extended the test suite and the scheme files.

- The new C API function `agn_malloc` conveniently allocates blocks of memory, and issues an error and optionally frees
  blocks in case of failure.

- The new C API function `agn_free` frees one or more blocks of memory.

- The C API function `agn_isutypeset` now also processes sets.

- The new C API function `agn_isutype` checks whether the given user-defined type has been set to a table, set, pair,
  sequence, or procedure.


1.9.0, January 27, 2013

- The new `alternate` function returns its first argument if its second argument is `null`. Otherwise it returns its
  second argument.

- The -b switch to the Agena executable has been removed since its output had been the same as the -v option.

- The Windows and UNIX/Mac versions of `strings.utf8size` contained a potential memory leak; this has been changed.

- All binary DLLs/SOs of the plus libraries no longer contain unused code, slimming their sizes by up to 10 percent,
  depending on the operating system. The makefile and the sources previously importing unused header files have been
  changed. For example, this at all reduces the size of the Windows binaries by 55 kBytes.

- Extended the test suite.

- Updated the scheme files.


1.8.17 Library Update 1, January 24, 2013

- This library patch corrects a problem in `utils.readcsv` and `skycrane.readcsv` which ignored certain options.


1.8.17, January 21, 2013

- C functions which are only used in the `calc` and `astro` packages are no longer part of the libagena SO/DLL, but are part
  of the SOs/DLLs of the mentioned packages, slimming down memory consumption a little bit if the packages are not used.

- Corrected typos in the Windows installer.


1.8.16, January 20, 2013

- `net.survey` now returns a fourth value, a Boolean, indicating if input is available, or if a timeout or exception occurred.
  For performance reasons, the function now also can check explicitly for reading, writing, or `exception` sockets instead
  of scanning all socket modes. Besides scanning all open sockets for their status, the function now also accepts a sequence
  of specific sockets and only scans these.

- The functions `net.address` and `net.remoteaddress` have now been documented.

- `net.lookup` now also accepts numeric IP addresses as input.

- `net.openwinsock` and `net.closewinsock` can now return `fail` plus a string containing an error message, instead of just
  throwing an error, by passing an argument of any type to them.

- `utils.decodeb64` did not exist (just under the name of `utils.decode64`, without the `b`). This has been changed.

- The new C API function `agn_pushboolean` pushes the Boolean value fail, true, or false onto the stack.

- In the manual, especially improved the chapter on the `net` package.

- The `astro` package has not been delivered with the binary releases. This has been changed.

- The `xml` and `bags` packages had been missing in the binary installer of the Mac edition. This has been fixed.

- The source file distribution now features up-to-date editions of the clock and skycrane packages.

- The install option in the makefile now works again.

- Updated the scheme files.


1.8.15, January 10, 2013

Agena now features very basic UTF-8 support, can determine some basic astronomical data, and has additional `clock` functions:

- The new function `strings.toutf8` changes an ISO-8859-15 encoded string to UTF-8. ISO-8859-15 is ISO-8859-1 plus the EUR symbol.

- The new function `strings.tolatin` changes a UTF-8 encoded string to ISO 8859/15. ISO-8859-15 is ISO-8859-1 plus the EUR symbol.

- The new function `strings.isutf8` detects whether the given string is in UTF-8 encoding or in pure ASCII.

- The new function `strings.utf8size` determines the size of a UTF-8 string.

- The new function `skycrane.dice` returns random integers in the range [1 .. 6].

- The new function `clock.dectotm` converts a time value in decimals of type number into its `tm` representation.

- The new function `clock.tmtodec` converts a `tm` value into its decimal representation of type number.

- The new function `astro.sunriseset` determines sunrise and sunset times plus its civil, nautical, and astronomical
  twilight variations.

- The new function `astro.moonriseset` returns the times of Lunar rise and set for a location in GMT.

- The new function `astro.moonphase` returns the moon phase.

- The new function `astro.sun` provides an easier-to-use interface to `astro.sunriseset`.

- The new function `astro.moon` provides an easier-to-use interface to `astro.moonriseset`.

- The new function `astro.jdate` converts a Gregorian date to the corresponding Julian date.

- The new function `astro.dmstodec` converts coordinates in the form degree, minute, second, and their orientation 'N', 'S',
  'W', or 'E' to their corresponding decimal degree (DegDec) representation.

- The new function `astro.dectodms` does the opposite.

- The former `utils.cdate` function has now been implemented in C and is around 60 % faster. Its new name is `astro.cdate`.
  An alias of `utils.cdate` to the new C version has been defined, but it may be deprecated in future Agena releases.

- The former `utils.isleapyear` function has now been implemented in C and is around 66 % faster. Its new name is
  `astro.isleapyear`. An alias of `utils.ispleapyear` to the new C version has been defined, but it may be deprecated
  in future Agena releases.


1.8.14, January 03, 2013

- `stats.median` now is 10 % faster. `stats.sorted` has become around 5 % faster.

- The new function `stats.smallest` returns the k-th smallest number in a numeric table or sequence.

- The new `utils.cdate` function converts a Julian date into its corresponding Gregorian calendar date representation.

- The new `strings.isisoalpha` function checks whether a string consists entirely of ISO 8859/1 Latin-1 alphabetic lower and
  upper-case characters.

- The new `strings.isisolower` function checks whether a string consists entirely of ISO 8859/1 Latin-1 alphabetic lower-case
  letters.

- The new `strings.isisoupper` function checks whether a string consists entirely of ISO 8859/1 Latin-1 alphabetic upper-case
  letters.

- The new `strings.isisospace` function checks whether a string consists entirely of ISO 8859/1 Latin-1 white spaces.

- The new `strings.isisoprint` function checks whether a string consists of printable ISO 8859/1 Latin-1 characters.

- The new `strings.isolower` and `strings.isoupper` functions convert a string to upper or lower case-letters using the
  ISO 8859/1 Latin-1 character set.

- `strings.transform` applies a function to the ASCII value of each character in a string and returns a new string.

- Updated the scheme files.


1.8.13, December 27, 2012

- Due to issues with the `size` operator with tables in a formerly presumed 5% case, the operator now with tables does not
  any longer use any binary search in the array part of a table. Instead it always traverses the whole array part counting
  all assigned non-`null` elements.

  This may slow down the operator by around 30 % - or less with small, or more with large tables - but settles any issues
  experienced yet without suggesting work-arounds which may be not intuitive.

  The 5% case is as follows: Set up a new table with e.g. t := [] or create table t. Skip certain integer keys and do not
  delete entries before using `size`. Binary search returned the largest index instead of the actual number of entries in the
  table, e.g.

  a := [1, 2, 3, 5, 6, 7, 8, 9, 10]  # index 4 is missing, making nine elements
  create table p
  for i in a do p[i] := i od

  Result: `size` earlier returned 10 instead of 9. This has been fixed.

- Due to the above change, `read` does not return an `attempt to index a null value` error in the described situation any longer.

- Improved the index of the manual.

- Valgrind regression test: okay.


1.8.12, December 18, 2012

- Added `skycrane.iterate` returning a function that when called returns each element in the ascending order of the
  keys of the original table. It also works on sets and sequences.

- If you pass the Boolean value `true` as the very last argument to `checkoptions`, then any unknown option of
  type pair will be part of the resulting table, with no error issued. This makes `checkoptions` more tolerant.

- Optimized code of `utils.readcsv`.

- Improved error messages of `columns`.

- Updated the manual.

- Extended the editor scheme files.


1.8.11, December 09, 2012

- `stats.sorted` now properly returns floats.

- Removed a potential memory leak from `print` in connection with the `delim` option.


1.8.10, November 26, 2012

- The new function `skycrane.move` easily moves files and directories and is an interface to `os.move`.

- The issue with former out-of-memory errors of the new C implementation of `sorted` has been finally solved by fixing a
  Virtual Machine function I wrote that deeply-copies structures. The `copy` operator, however, worked flawlessly, because
  the Lua Virtual Machine, on which Agena is based, compensated for it. Thus,

  a) `sorted` has now been switched back to its faster C implementation. It is 14 % faster than the Agena version, but not
     the 100 % asserted before.

  b) `dimension` used with an initialiser should now work better although its massive usage did not seem to create out-of-
      memory errors.

  c) Users encountering problems with massive use of `rtable.rget` to query the current contents of the remember table of a
     function for informative purposes will also benefit from the patch. The internal remember table admin functions did not
     use deep-copying, so usage of remember tables in general has not been affected by the flaw.


1.8.9 Update 1, November 21, 2012

- The new `sorted` function threw out-of-memory errors. This has been hot-fixed by re-instating the old function which worked.

- Quarrels with the extended `calc` package under Linux have finally been solved.

- To download the Library Update, please have a look into the binaries sourceforge.net folder, file
  `agena-1.8.9.1-update-os-independent.zip` and also read the `read.me` file for proper installation instructions.

  Updated installers are provided for Solaris, Windows, Mac, Linux, and DOS. All other users are kindly asked to install the
  above mentioned update.


1.8.9, November 20, 2012

- The new function `selectremove` combines the functionality of `select` with the one of `remove`: The first result contains
  all the elements of the given structure that satisfy a given condition, the second result contains the elements of the given
  structure not satisfying the condition. This may speed-up computations when you need both results, maybe for post-processing,
  by around 33 %.

- If a table is passed to `select` and `remove`, the new `newarray` option makes sure that the results are returned in an array
  with consecutive positive integral keys, not preserving the original keys of the the respective values determined. Thus,
  select(<< x -> x :: number >>, ['a', 10, 20, 30, 40, 'z'], newarray=true) returns [10, 20, 30, 40] instead of
  [2 ~ 10, 3 ~ 20, 4 ~ 30, 5 ~ 40]. This saves you from passing the result to `tables.entries` when needed.

- The new function `skycrane.sorted` sorts a table or sequence non-destructively but contrary to `sort` and `sorted` can cope
  with structures including values of different types. First, numbers are sorted, then strings, the others are not. The function,
  however, is three times slower than `sorted`.

- `stats.issorted` now accepts a function as its second argument to determine the expected sorting order.

- Contrary to previous claims in the manual, the `copy` operator could not (deep-)copy pairs. Now it can do so.

- `environ.isselfref` did not work well with self-referencing pairs. This has been changed.

- `sorted` has now been implemented in C and is around twice as fast as before.

- The new C API function `agn_paircheckbooloption` checks whether the value at the given stack index is a pair, whether its
  left operand is the given string, and whether the right operand is a boolean. Returns the boolean as a number.

- The new C API function `agn_pairgetnumbers` retrieves the numbers from the pair residing at a given stack index.

- Documented the API C macros `lua_iscomplex`, `lua_ispair`, `lua_isset`, and `lua_isseq`.

- Improved the manual.

- Extended the test suite.


1.8.8, November 08, 2012

- In the past, when passing a function, `nseq` could only create sequences of numbers. This has been changed by allowing
  `nseq` to add any type of value to the resulting sequence; try for example: "nseq(<< x -> x:x^2 >>, 1, 5)". This spares
  you from applying `map` to the result of `nseq`.

- `map` now also works on pairs (if this should be of any use).

- Improved the manual and added information on the C API.


1.8.7, November 04, 2012

- `calc.interp` and `calc.newton` have now been merged, and their functionality has been implemented in C. The name of the
  new function is `calc.interp`, and an alias `calc.newton` has been set up to link to the new function for back-compatibility.
  If `calc.interp` is called with only one argument, the function returned is at least twice as fast when evaluating interpolation
  values. The new `calc.interp` version is also numerically more stable.

- Added two new interpolating functions:

  a) `calc.clampedspline` computes the clamped cubic spline.

  b) `calc.clampedsplinecoeffs` determines the linear, quadratic, and cubic coefficients of a clamped cubic spline.

- Improved the manual a little bit.


1.8.6, October 30, 2012

- `checkoptions` has now been implemented in C and thus is at least twice as fast.

- Added five new interpolating functions:

  a) `calc.nakspline` is a `not-a-knot` cubic interpolation function.

  b) `calc.neville` interpolates according to the Aitken-Neville algorithm.

  c) `calc.newton` interpolates according to the Newton rule.

  d) `calc.naksplinecoeffs` determines the linear, quadratic, and cubic coefficients of a `not-a-knot` cubic spline.

  e) `calc.newtoncoeffs` computes the coefficients of the Newton form for the given points.


1.8.5 Update 1, October 24, 2012

- The new function `argerror` works like `error`, but is a littler bit smarter.

- The new function `checkoptions` checks options, saving many lines of code.

- The new function `skycrane.scribe` works like `io.write` and `io.writeline`, but also accepts tables and sequences.
  Else, it works like `io.write/line`.

- `io.flush` has been renamed to `io.sync`. The function `io.flush` will be depracated in Agena 1.10.


1.8.5, October 17, 2012

- `save` now locks the file before writing to it. This prevents file corruption if another application wants
  to write to the file at the same time.

- `recurse` could not correctly traverse pairs resulting in (more or less sporadic) segmentation faults. This
  has been fixed.

- `binio.readobject` and thus also `read` crashed when trying to read deeply nested structures, such as e.g.
  linked pairs. This has been fixed by properly increasing the internal stack when reading deeply-nested
  structures.

- In the manual, improved the chapters on type checking, error processing, and user-defined types. There are
  also many other minor improvements throughout the text.


1.8.4, October 14, 2012

- Added charts on programme flows and features of procedures to the manual and improved it a little bit.

- `recurse` can now also traverse pairs. It now also returns `fail` when evaluating `null` instead of issueing an
  error.

- `checktype` can now check empty structures.

- `print` could not output pairs with at least one of its components evaluating to `null`. Now it can do so.

- `binio.writeobject` and thus also `save` could not write integers. This has been fixed.

- Corrected error messages of `recurse` and the internal table assignment procedure in case undefined has been
  passed as then index.


1.8.3, October 09, 2012

- The new `subs` option to `utils.readcsv` replaces one or more occurence of a value in a line with another one.

- The new `comma` option to `utils.readcsv` allows to transform a float with a comma in the CSV file, separating
  its integral from its fractional part, to an Agena float.

- The new `dot` option in `utils.writecsv` writes floats with the decimal dot replaced by the given single character,
  to the CSV file, thus allowing floats with a decimal comma.

- `stats.sum` and `stats.countitems` now accept multivariate functions.

- Some few corrections to the manual.


1.8.2, October 07, 2012

- `whereis` has now been implemented in C. Thus it is at least twice to three times as fast as before.

- `os.now` now returns the difference between your local time zone and GMT in minutes including daylight saving time,
  and east of Greenwich, in the new `td` entry. The new `dst` entry indicates whether daylight saving time is in effect
  in your local time zone (the same as the 9th value in the `localtime` entry). The Julian Date and the English names
  of the month and day queried are returned, too.

- `stats.scale` is a version of `linalg.scale` just for plain tables and sequences, but implemented in C.

- The new function `stats.colnorm` returns the largest absolute value of the numbers in a table or sequence, and the
  value with the largest absolute value.

- The new function `stats.rownorm` returns the sum of the absolute values of the numbers in a table or sequence.

- The new function `stats.sum` computes the sums of all numbers in a table or sequence. Contrary to the `sadd` operator,
  it prevents round-off errors during summation.

- The following functions now also accept structures including the value `undefined`. In this case, all `undefined's`
  are ignored in the respective computations, so that the functions can be used with incomplete observations:

  `stats.amean`, `stats.cumsum`, `stats.median`, `stats.sum`, and inherently `stats.minmax` and `stats.issorted`.

- `stats.median` now longer requires a sorted structure. It checks automatically whether the input is sorted or unsorted.

- The new function `stats.sorted` sorts tables or sequences of numbers in ascending order twice as fast if the structure
  contains (around) more then seven elements. It also ignores `undefined's`.

- Fixed error message of `linalg.scale` in case of a wrong first argument.


1.8.1, September 30, 2012

- `utils.readcsv`:

  a) If a CSV file includes only one field, i.e. one value per line, the new option `newseq` now puts this value into a
     new sequence, resulting in a sequence of sequences returned by the function, as is already the case if the CSV file
     includes two or more fields, thus not changing the default bahaviour.

  b) The new `field` option allows to extract only the given field in a CSV file.

  c) The new `fields` option allows to return only the given fields in a CSV file, and in the order given by the user.

  d) The optional function to be mapped on all fields is now only executed on the fields to be actually returned.

  e) The new `mapfields` option applies a function to the specified fields in a CSV file.

  f) If the output = 'record' and header = false options are passed, then a table array is returned instead of a dictionary,
     so the keys of the returned table are numbers instead of strings.

  g) The new output = 'matrix' option returns a matrix instead of a table (see linalg package).

- The new `skycrane.readcsv` function works like `utils.readcsv`, but with the following default options, which can be
  overridden: convert=false, ignorespaces=false, remove='quotes', remove='doublequotes'.

- The new function `linalg.norm` returns the norm of a matrix or vector.

- The new function `linalg.scale` normalises the columns of a matrix in such a way that, in each column, an element of
  maximum absolute value equals 1.

- Improved error handling of `linalg.checkmatrix`, `linalg.vector`, and `linalg.matrix`.

- Some improvements to the manual.


1.8.0, September 25, 2012

- `os.fattrib` can now also change the file access and modification time.

- The new function `os.now` returns various information on the current date and time, both for your local time zone
  and UTC/GMT, plus an indicator for your time zone, and the number of seconds elapsed since the start of the epoch.
  Please note that in the DOS version, local time and GMT cannot be distinguished.

- The new function `os.datetosec` converts a date into the number of seconds elapsed since the start of an epoch.

- The new function `os.sectodate` takes the number of seconds elapsed since the start of an epoch and returns the
  date and time.

- The new function `strings.isblank` checks whether a string consists entirely of white spaces and/or tabulators.

- The new function `strings.isspace` checks whether a string consists entirely of white spaces.

- `os.fcopy` destroyed a file if it was copied to itself. This is now being prevented. Also, the function now sets
  the file time stamp of the file to be copied to the target file.

- `xml.decodexml` and thus `xml.readxml` could not interpret indented tags and certain XML structures. This has
  been changed.

- Applied the Year 2038 fix to `os.time` and `utils.calendar`.


1.7.10, September 13, 2012

- Patched the VM routine that creates table arrays and dictionaries with a preallocated number of slots, so
  that the `size` operator can determine the number of elements actually assigned correctly.

- The new agn_createtable C API function creates a table so that the `size` operator always returns a correct
  result if the array part contains holes.

- The `select`, `remove`, and `bags.bag` functions now use the above mentioned new API function.

- Fixed `strings.isnumeric` and `strings.iscenumeric` which wrongly returned true with empty strings.

- Improved error handling of the `columns` function.

- Improved and updated the regression test suite.


1.7.9a, September 11, 2012

- `os.system` can now directly detect Windows 8 and Server 2012.

- The `size` operator returned twice the number of items actually stored in a dictionary that has been created with
  the `create table` statement. This has been fixed.

- `bags.attribs` has thus also indirectly been fixed for it returned a wrong number of entries in its first return
  if elements had been passed in a call to `bags.bag`.

- Agena crashed at exit if the `net` package has been readlib'ed twice or more. This has been changed by a hotfix.

- The new function `stats.cumsum` returns a structure of the cumulative sums of the numbers in a table or sequence.


1.7.9, September 09, 2012

* Edition withdrawn due to the modified `size` operator that did not work on exotic or unfirm tables.


1.7.8 Update 2, September 3, 2012

- The new function `stats.obcount` divides a numeric range into its subintervals, sorts all occurrences in an
  observation into these subranges and finally counts all elements in these subranges.

- The new function `skycrane.bagtable` returns a table of bags with its keys determined by the given indices.

- `gdi.setellipse` and `gdi.setellipsefilled` ignored the `colour` option. This has been changed.

- `gdi.plot` used wrong axis dimensions if the `square` option has been passed. This has been fixed.

- `linalg.ludecomp` inadvertently created a global variable. This has been corrected.


1.7.8 Update 1, August 29, 2012

- Corrected error handling of `stats.percentile`, `stats.prange`, `stats.skewness`, and `stats.iqr`.

- Improved error handling of `stats.quartiles`.

- Improved the manual.


1.7.8, August 28, 2012

- Patched `stats.amean` which returned wrong results if called multiple times from within procedures.

- Removed `stats.iosplus`.

- The agena.xls Quick Reference file contained invalid tab names. This has been corrected.


1.7.7, August 26, 2012

- Like `stats.mean`, the new function `stats.amean` returns the arithmetic mean of a distribution but is more
  robust by avoiding arithemtic overflow and round-off errors. Thus it is, however, slower than `stats.mean`.

- The new function `stats.iosplus` determines the volatility of a distribution and contrary to `stats.ios` also
  allows to compare observations of different magnitudes.

- The new function `strings.isnumeric` checks whether a string represents an integer or a float.

- The new function `strings.iscenumeric` checks whether a string represents an integer or a float that includes
  one decimal-comma.

- The new function `skycrane.getlocales` returns all locales available on your operating system.

- The new function `skycrane.tocomma` converts a number or a numeric string to a string with an optional
  decimal-dot replaced by a comma.

- Minor improvement to the C code of `stats.ios`.

- Improvements to the Statistics Library chapter.


1.7.6 Library Update 1, August 21, 2012

- The `in` operator did not work correctly on bags (see `bags` package). This has been fixed.

- `strings.diamap` unnecessarily polluted the namespace with two rather large mapping tables. This has been changed.

- Some few corrections to the manual.

- To download the Library Update, please have a look into the binaries sourceforge.net folder, file
  `agena-1.7.6.1-update-os-independent.zip` and also read the `read.me` file for proper installation instructions.
  Windows and DOS update installers are available in the sourceforge.net/agena/binaries folder.


1.7.6, August 19, 2012

- The contents of a bag is now printed in ascending order of its keys.

- The new function `bags.attribs` returns the number of occurrence of all unique elements in a bag and also the
  accumulated number of all occurrences of these elements in a bag. For example, bag('Mars 2' ~ 1, 'Mars 3' ~ 1,
  'Viking' ~ 2) results to 3, 4.

- If `os.fcopy` fails, the name of the file that could not be copied is returned as a second result.

- The new `Skycrane` package includes auxiliary functions: an extended version of `os.fcopy`, and two little helpers.

- The `environ.printcomplexzeroed` setting has been removed. Use the `environ.kernel/zeroedcomplex` option instead.

- The new, or undocumented, `environ.kernel/promptnewline` option, if set to true, prints an empty line between the
  input and output regions. Just try it out.

- In Solaris, the `gzip` package could not be loaded. This has been fixed.

- In the manual, the chapter on Booleans has been extended and corrected. Also a subchapter on pattern matching and
  linked lists has been added. The Quick Reference has been corrected, as well.


1.7.5, August 05, 2012

- Added the XML/LuaExpat package. It includes functions which are five times faster than `utils.decodexml` or
  `utils.readxml`. The `xml` package is available for Solaris, Linux, Mac OS X, and Windows. All other OS
  users may still use the `utils.decodexml` and `utils.readxml` which are also more tollerant.

- Fixed a bug in `readlib` that caused segmentation faults at least in Solaris when a C library could not be read.

- In Solaris, the `mapm` package could not be loaded. This has been changed.


1.7.4, July 29, 2012

- The core functions of the `bags` (multisets) package have now been implemented in C: `bags.bag`, `bags.include`,
  `bags.remove`, and `bags.bagtoset`. Thus they are around twice as fast as the former Agena implementations.

- The `in` metamethod of the bags package has been tuned. It is now at least 4 times faster than before.


1.7.3, July 24, 2012

- The `create` statement threw `out of memory` errors if the user tried to assign a negative number of preallocated slots.
  This has been changed by preallocating zero slots in this case, which is a valid setting.

- `bags.bag` threw `out of memory` exceptions if called with no argument. This has been fixed (see above for the reason).

- Coroutines could not be created because of a name conflict with the `create` statement. This has been changed by
  renaming `coroutine.create` to `coroutine.setup`. To see what coroutines are, please have a look at the official
  Lua programming language website.


1.7.2, July 24, 2012

- Extended the metamethod chapter of the manual and added a subchapter on weak tables and sequences, and garbage
  collection.

- Lua's concept of weak tables has been extended to sequences. The `insert` statement now cannot be applied to weak
  tables.

- `environ.attrib` now can also process pairs - and with structures, returns the user-defined type of a structure or
  procedure if defined. It also returns information on weak tables and sequences.

- The new multiset package has been added, called `bags`. A bag is a kind of Cantor set that also stores the number
  of occurrence of each unique element.


1.7.1 Update 1, July 19, 2012

- The new function `augment` joins two or more tables or sequences horizontally.

- The new function `columns` extracts the given columns from a two-dimensional table or sequence.

- `utils.readcsv` can now remove quotes or double quotes from fields while parsing a CSV file with the new `remove` option.

- Windows and DOS users can just download the agena-1.7.1.1-win32-setup.exe or agena-1.7.1.1-dos.zip installers provided in
  the Sourceforge/Agena/binaries folder to easily circumvent the below mentioned update procedure.

- The UNIX update can be found in the Sourceforge/Agena/binaries folder, file agena-1.7.1-update1-os-independent.zip. Please
  have a look at the read.me file in this archive for hints on how to update your Agena installation.


1.7.1, July 15, 2012

- `copy` can now also copy a table if one of its keys is this table itself (see for example `_G._G`).

- `copy` crashed if it tried to copy structures with cycles, i.e. if it contained any structure that directly or
  indirectly referenced to itself. This has been fixed.

- If the global system table `_G` has been deleted (a table containing all currently assigned global names), `restart`
  crashed Agena. This has been fixed.

- Improved the manual and added subchapters on sandboxing and handling the environment, and some notes on self-referencing
  structures.


1.7.0, July 11, 2012

- Setting `environ.printZeroedCmplxVals` did not accomplish anything. Please use `environ.printzeroedcmplxvals` instead.

- The prettyprinters `environ.printtable`, `environ.printlongtable`, `environ.printset`, `environ.printsequence`,
  `environ.printpair`, and `environ.printcomplex` have been renamed to `environ.aux.printtable`, `environ.aux.printlongtable`,
  `environ.aux.printset`, `environ.aux.printsequence`, `environ.aux.printpair`, and `environ.aux.printcomplex`, respectively.

- `os.curdir` will be deprecated in the next Agena 1.8 release. Please issue `os.chdir()` instead to determine the current
  working directory.

- As announced earlier, the following left-hand side functions have now been deleted and have been substituted by
  their lower-case right-hand equivalents:

  environ.MinLong to environ.minlong
  environ.MaxLong to environ.maxlong
  environ.BufferSize to environ.buffersize
  environ.PathSep to environ.pathsep
  environ.More to environ.More
  environ.WithProtected to environ.withprotected
  environ.WithVerbose to environ.withverbose
  environ.Os to environ.os
  environ.Cpu to environ.cpu
  environ.Release to environ.release
  environ.GdiDefaultOptions to environ.gdidefaultoptions
  environ.PrintEncloseStrings to environ.printenclosestrings
  environ.PrintLongTable to environ.aux.printlongtable
  environ.PrintTable to environ.aux.printtable
  environ.PrintSet to environ.aux.printset
  environ.PrintSequence to environ.aux.printsequence
  environ.PrintPair to environ.aux.printpair
  environ.PrintProcedure to environ.aux.printprocedure
  environ.PrintComplex to environ.aux.printcomplex
  environ.PrintEmptyLine to environ.printemptyline
  environ.FractScreenUpdates to environ.fractscreenupdates
  environ.FractintColorMaps to environ.fractintcolourmaps

  Please readlib lib/compat.agn for backward compatibility.


1.6.15, July 08, 2012

- The new function `sorted` returns a sorted structure whithout modifiying the original structure.

- The new function `recurse` checks each element of a table, set, or sequence by applying a function on each of its elements.

- The previously undocumented `printf` function is finally explained in the manual. `printf` works like C's printf
  which allows to format content written to stdout.

- `has` crashed if applied on self-referencing structures (cycles), this has been fixed.

- `environ.isselfref` has been tuned by 600 %.

- Improved the manual and the Quick Reference.


1.6.14, July 04, 2012

- The `has` function has been tuned by a further 35 percent.


1.6.13, July 01, 2012

- `has` is now a C base library function and thus is three to six times faster than the former Agena implementation.


1.6.12, June 26, 2012

- Patched `os.list` (and thus implicitely also `utils.findfiles`) which did not properly acknowledge filename wildcards
  when descending into subdirectories.

- Further slimmed the C API by transforming lua_rawsetstringnumber, lua_rawsetstringstring, and lua_rawsetstringboolean
  into pre-processor macros.

- `environ.release` now also includes the patchlevel of the lib/library.agn file as its fourth entry.

- If the new global variable `environ.libpatchlevel` is defined in the lib/library.agn file, the main Agena Library
  patchlevel is also printed at start-up.

- Slimmed down the start-up message. Type `agena -m` to get the amount of free RAM at start-up.

- Readied Agena for lib/library.agn updates.


1.6.11, June 24, 2012

- `utils.findfiles` can now also process a single file.

- Hardened Agena.

- Slimmed the C API by converting the C API functions lua_rawsetinumber, lua_seqsetinumber, lua_seqrawsetilstring,
  lua_seqsetistring, lua_sinsertnumber, lua_seqrawgeti, and lua_sinsertstring to pre-processor macros.

- Deleted the internal C API function agnSeq_rawseti.


1.6.10, June 22, 2012

- `utils.decodexml` and `utils.readxml` can now ignore XML comments with the new 'nocomment' option.

- The new function `utils.findfiles` returns all names of files that satisfy a given search criterion.

- Since Agena 1.6.8, `io.readlines` could crash when trying to read thousands of characters from one single line.
  This has been fixed.

- Corrected storage of multiple entries with the same XML object name in `utils.decodexml`. All entries at the
  same level are now returned in the same hierarchy.


1.6.9, June 20, 2012

- Since Agena 1.6.8, `size` returned wrong results if elements have been deleted from tables. This has been
  fixed.


1.6.8, June 19, 2012

- Re-instated `io.readlines`.

- The following former C API functions have been deprecated but have been replaced by
  C pre-processor define's: lua_rawsetistring, lua_rawsetilstring, lua_sinsertlstring,
  lua_sinsert.

- Removed an unnecessary C function call from the lua_rawseti procedure.

- Removed old and unused code from the ADS library.


1.6.7, June 17, 2012

- Extended `utils.decodexml` and `utils.encodexml` to recognize multiple occurences of the same XML objects.

- `ads.openbase` crashed when trying to open non-ADS files. This has been fixed.

- Shortened the C code of the lexer and the C API.


1.6.6, June 12, 2012

- Upon Agena exit, the `net` package now cleans its internal open socket admin table.

- Removed an unnecessary internal function call when printing results at the console.

- Hardened Agena.


1.6.5, June 10, 2012

- `setbit` has been rewritten in C and thus is around eight times faster than before.

- `getbit` has been rewritten in C and thus is around five times faster than before. It also now works correctly
  with negative numbers.

- In Windows, the `net` package now cleans up the Winsock environment upon exit.

- In Windows, `net.lookup` closed Winsock. This has been fixed.


1.6.4, June 07, 2012

- The new function `net.shutdown` stops further sends and receives on a socket.

- The net package now supports black and white lists for outgoing and incoming connections, Chapter 7.26.2 of the manual
  includes a description of their functionality (see functions `net.connect` and `net.accept`) and Chapter 7.26.1 includes
  examples.

- `net.send` now returns 'fail' if the socket has not been connected by either `net.connect` or `net.accept`.

- `net.openfiles` now also returns the read/write modes of a socket.

- The `fractals` package: The following environment variables have been renamed: `environ.FractScreenUpdates` to
  `environ.fractscreenupdates`, `environ.FractintColorMaps` to `environ.fractintcolourmaps`. Aliases for the old
  names (in capital letters), have surely been provided but will be relinquished in Agena 1.7.

- In Windows, `net.lookup` unnecessarily initialised Winsock, but worked flawlessly. However, this has been patched.

- `io.open` and `io.close` crashed Agena if the global table `io.openfiles` has been deleted or set to another data type.
  This has been fixed.

- Malicious code crashed Agena, this has been patched:
  > environ := null
  > a:

- At least in Linux, Agena crashed if `net.send` tried to send data to a partner that has already closed the connection.
  This has been fixed also for all other `net` functions by generally intercepting and ignoring C's SIGPIPE signal in
  all supported UNIX versions of Agena.

- Hardened the 'net' and 'binio' packages, as well as 'os.fcopy'.

- The C API function `agn_getenv` has been deleted. Use the new `agnL_gettablefield` C function instead.

- Some code optimisations. At least with gcc for Linux, no warnings should be issued any longer during compilation.

- Improved the manual and its index.

- Adapted AgenaEdit.


1.6.3, June 04, 2012

- The new function `utils.encodexml` creates an XML stream from an Agena dictionary (record table).

- The new function `utils.writexml` writes an XML stream from an Agena dictionary (record table) into a file.

- The new function `getbit` checks whether a bit is set in an integer at a given position.

- In nested expressions, the `&&`, `||`, `^^`, `xor`, `::`, `:-`, and `atendof` operators could return 'null' instead
  of a correct result. This has been fixed, so that also `setbit` does now work properly and now also handles zeroes
  properly.

- `net.receive` will no longer issue an error if an exception occurs during receipt, but returns 'false' and a string
  with an error message. It also does not close the socket any longer in case of failure.

- Added some more examples to Chapter 7.26, `The net package`.


1.6.2, May 31, 2012

- You can now exchange unencrypted data over the Internet and local LANs using the IPv4 protocol (Solaris,
  Windows, Linux, and Mac versions only). Please read chapter 7.26 `net package` carefully for further
  information.

- `utils.readxml` unfortunately did not close the XML file after reading it. This has been fixed.


1.6.1, May 28, 2012

- Extended `save` and `read` to store and restore Agena procedures.

- Added the new `utils.readxml` function to convert XML files into Agena dictionaries.

- Added the new `utils.decodexml` function to convert an XML stream represented by a string into an Agena dictionary.

- Added the new functions `utils.encodeb64` and `utils.decodeb64` to Base64-encode and decode strings.

- `loadstring` in many cases could not read binary chunks created by `strings.dump`. This has been fixed.

- Further hardening of functions and features.

- Updated the keyword and function name lists of AgenaEdit and hardened some of its features.


1.6.0, May 21, 2012

New Functions and Features:

- The new function `checktype` determines whether all values in a structure are of a given type.

- The new function `isint` checks whether all of its arguments are integers.

- The new function `strings.dleven` returns the Damerau-Levenshtein distance of two strings.

- The new function `stats.ad` determines the absolute deviation of all the values in a structure.

- The new function `stats.countentries` counts the number of occurrence of all the elements in a structure.

- The new function `stats.deltalist` returns a structure of the deltas of the respective neighbouring elements.

- The new function `stats.gmean` returns the geometric mean of a structure.

- The new function `stats.hmean` returns the harmonic mean of a structure.

- The new function `stats.ios` returns a proven indicator on stability in a distribution.

- The new function `stats.iqr` returns the interquartile range.

- The new function `stats.issorted` checks whether all numbers in a structure are sorted in ascending order.

- The new function `stats.moment` computes the moment of the given data about an origin.

- The new function `stats.numbperm` returns the number of permutations.

- The new function `stats.percentile` determines percentiles.

- The new function `stats.skewness` returns the skewness, an indicator of the symmetry of a probability distribution.

- The new function `stats.sumdata` sums up all the powers of a structure about an origin.

- `stats.tovals` is now a C library function and thus is up to 40 percent faster.

- With an empty table or sequence, `stats.qmean`, `stats.mean`, `stats.gmean`, `stats.sd`, `stats.median`,
  `stats.var` now return fail.

- The maximum length for an input line in the stand-alone interpreter has been changed from 512 to 2048 characters.

- The new environment variable `environ.maxpathlength` stores the maximum number of characters for a file path
  (excluding C's \0 character).

- The new environment variables `environ.minnumber` and `environ.maxnumber` hold the minimum and maximum value an
  Agena number (currently an ANSI-C double) can store.

- The new environment variable `environ.umaxlong` includes the maximum integral value of the C type unsigned long on
  32+bit systems, and unsigned long on 16bit machines.

C API:

- 100 % compatibility of the Agena C API to Lua's C API has been re-established by introducing Lua's *dump functions.
  Thus you are now able to store functions in a binary representation, e.g. by using `strings.dump` or lua_dump on
  the C level.

- Introduced the new `agnL_optboolean` function to check for optional Boolean arguments and return them in case of success.

Bug Fixes:

- `environ.globals` always quit with an error, this has been fixed.

- `approx` returned false with both of its arguments being or evaluating to 'undefined'. It now returns true in this case.

- Agena crashed when passing an empty table and a delimiter to `join` - this has been fixed.

- The `colour` option is no longer being ignored by `gdi.plot`.

- With tables, `stats.minmax` returned a wrong value for the minimum. It now works correctly.

- With an empty table, `stats.median` returned 0, now it returns fail.

- Contrary to the documentation, `strings.isending` returned 'true' with both strings being equal. This has been fixed.

- `run` returned `could not open file` if an existing Agena script included a syntax error. This has been changed to a
  more comprehensible error message by completely rewriting the function.

- Added Lua 5.1.4 patch 9: "Wrong code generation for some particular [e.g. large] boolean expressions."

- Added Lua 5.1.4 patch 11: "Parser may collect a prototype while building it."

* Info: Adding Lua 5.1.4 patch 10, "[__write/__new]index metamethod may not work if metatable is its own metatable", to
  Agena is not necessary, for Agena already works correctly in this case.

- Removed the unused keyword `default`.

- Some hardening of functions and features.

Enhancements:

- Added an _experimental_ version of `io.anykey` to the Mac version. However, at least on Lion, the key being pressed
  sometimes is echoed on the shell.

- `utils.readcsv` now can optionally return all values in a CSV file in a flat sequence.

- The `clock` package now supports the division operator `/` by adding it to its `tm` operator's metatable.

- The behaviour of `with` has been changed for it could not assign short names for many library functions: If functions
  have been put into the <pkgname>.aux table, it does not assign short names for these function names; otherwise it
  assigns short names for _all_ other package functions. Thus:

- `package.register` to register all the library functions for `with` to assign short names, is no longer needed. It
  will be deprecated in one of the following releases.

- Improved the test suite.

Manual:

- Improved the manual and the index.

Consistency:

For all of the following renamings, the following old variable names are still supported.

- `environ.MinLong` has been renamed to `environ.minlong`.

- `environ.MaxLong` has been renamed to `environ.maxlong`.

- `environ.BufferSize` has been renamed to `environ.buffersize`.

- `environ.PathSep` has been renamed to `environ.pathsep`.

- `environ.More` has has been renamed to `environ.more`.

- `environ.WithProtected` has been renamed to `environ.withprotected`.

- `environ.Os` has been renamed to `environ.os`.

- `environ.Cpu` has been renamed to `environ.cpu`.

- `environ.Release` has been renamed to `environ.release`.

- `environ.GdiDefaultOptions` has been renamed to `environ.gdidefaultoptions`.

- In Windows, `os.login` and `os.computername` now return 'fail' in case of an error like the UNIX and
  OS/2 versions do.

- The `-DCOMPAT13` switch has been finally removed for compiling an Agena 1.3.x complient version.

Other:

- Deprecated `calc.fseq` has been deleted. Please use `nseq` instead.


1.5.1, November 15, 2011

- Patched `strings.fields` which did not work at all. Also, it has been converted to a C library function and thus is
  2.6 times faster.

- `strings.words` now accepts a third argument: if set to `true`, succeeding delimiters are ignored.

- Removed a possible security leak from `io.write` and `io.writeline` and improved its error messages.

- Patched `binio.readchar` to avoid troubles with files of size greater then 2 GBytes.

- Corrected error messages of functions `xbase.purge`, `xbase.readvalue`, `xbase.purge`, `ads.getvalues`,
  `binio.readshortstring`, `os.computername`, `os.login`, `os.fattrib`, `environ.kernel`, `package.register`.

- <x> Terabytes can now be entered with the notation <x>T, where <x> is an integer, and T is the character `T`.
  Likewise, <x>g denotes <x> billions, and <x>t trillions. See page 48 of the manual for further information.

- Updated the manual.

- Mostly all backward compatibility switches in the C source code have been removed for code cleansing reasons. This
  affects only those who try to recompile Agena 1.5 or higher with full backward compatibility to Agena 1.3 and 1.4,
  and with most of backward compatibility to Lua 5.0 (except old Lua 5.0 library handling).


1.5.0, September 11, 2011

- `map` now can also process strings given as its second argument. The respective function and its arguments are
  consecutively applied to each character from left to right, and the result is returned in a sequence.

- `run`: If you want to load and execute code from files with an 'agn' suffix, you do not have to specify the
  suffix in the argument any longer. So `run 'test'` and `run 'test.agn'` are now the same.

- The `is` keyword is now obligatory to define procedures. (With GCC, use the -DCOMPAT14 switch to compile a version
  of Agena where the `is` keyword is still optional.)

- The `try` statement has been deprecated and is no longer supported. (With GCC, use the -DCOMPAT14 switch to compile
  a version of Agena which still features this statement.)

- The following `utils` functions have been removed: `arraysize`, `getarray`, `getwholearray`, `newarray`,
  `searcharray`, `setarray`. For backward compatibility, they have been added to the lib/compat.agn
  file. (With GCC, use the -DCOMPAT14 switch to compile a version of Agena that still suppports the original utils
  functions.)

- `utils.singlesubs` has been completely rewritten. It now expects a sequence of numbers as the second argument instead
  of the former stringarray userdata structure. It is 35 % slower than the former version, but removal of the
  stringarray structure was more important.

- `strings.include` crashed if called with 0 as its second argument. This has been fixed.

- Applied Michael G. Schwern's May 10, 2011 patch to his `32-bit-Year 2038-Fix` date auxiliary functions used by
  the `os` and `xbase` packages (`Make mktime64() correct the incoming tm struct as ISO C requires.`)

- Internal code optimisation: some library initialisation and file loading C functions used the stack to build path
  and filename strings. The new C aux function `concat` written by Solar Designer is now being used instead in most
  cases.

- The Agena C API is now 100 % compatible to the Lua C API to facilitate porting C Lua packages to Agena.
  1) The following functions have thus been renamed: lua_isnumber -> agn_isnumber, lua_isstring -> agn_isstring,
     luaL_optnumber -> agnL_optnumber, luaL_checknumber -> agnL_checknumber, luaL_optnumber -> agnL_optnumber,
     luaL_checkinteger -> agnL_checkinteger, luaL_optinteger -> agnL_optinteger.
  2) The following macros have been renamed: luaL_checkint -> agnL_checkint, luaL_optint -> agnL_optint.
  3) As opposed to the former Agena implementation, lua_tonumber now returns 0 like in Lua in case a non-number has
     been passed, instead of returning HUGE_VAL.
  4) lua_setglobal2 has been removed. Use lua_pushvalue and lua_setglobal instead.


1.4.2, September 04, 2011

- If in the parameter list of a procedure user-defined types had been specified, in procedure calls no errors
  were issued and the procedure was executed instead, in the following cases:

  a) a table, set, sequence, pair, or procedure - without being of a user-defined type - had been passed,
  b) no value at all had been passed for the parameter concerned.

  This has been fixed. Also, all respective error messages have been standardised.


1.4.1a, September 01, 2011

- Windows version only: Recompiled AgenaEdit in order to work properly.


1.4.1, August 31, 2011

- Short names for `stats.quartiles` and `stats.mode` could not be assigned by the `with` function. This has been fixed.

- Erroneously, `with` could not assign a short name for `gdi.settriangle`. This has been changed.

- Error handling of `calc.polygen` has been improved.

- Improved error message of `fractals.draw` for missing FRACTINT map files.

- Removed deprecated `strings.rseek` function. For backward compatibility, `strings.rseek` has been moved to the
  lib/compat.agn file.

- Added the -d switch to print debugging information during startup of the interpreter.

- The Windows version of Agena has now been compiled with GCC 4.5.2.

- Updated language scheme files.

- The manual has been updated.


1.4.0, March 06, 2011

Semantic Changes

- Loop control variables of numeric `for/to` loops are now automatically local to their surrounding blocks instead
  of their (inner) loop bodies. If a local variable with the same name as the loop control variable has been declared
  and assigned before executing a numeric loop, it is overwritten by the last iteration value of the loop.
  As such, the `external` switch in numeric `for` loops is no longer accepted. (With GCC, use the -DCOMPAT13 switch
  to compile a version of Agena that still recognises but ignores the `external` keyword.)

- With the constant `fail`, `not` returned `true`, but with `fail` assigned to a variable, `not` returned false. This
  has been changed, i.e. 'a to fail; not(a)' now returns `true`.

- `stats.median` now returns `fail` instead of 0 if the given structure is empty.

- `utils.readcsv`: If a single white space is passed with the `delim` option and if the `ignorespaces` option
  has not been given, white spaces are not automatically removed any longer before splitting each line of the
  file into its words.

  The function also has two new options: `header` which marks the first line in a file, and `output` which
  allows to store the contents of the file into a dictionary with its field names defined by the file header.

- The `$` substring notation is no longer supported. (With GCC, use the -DCOMPAT13 switch to compile a version
  of Agena that still suppports the `$` operator.)

Extensions

- Infinite do/od loops have been added. This kind of loop iterates infinitely and can be interrupted only with
  the `break` or `return` statements. They are syntactic sugar for `while true do ... od` loops.

- With tables, `stats.minmax` formerly only worked with arrays. This has been changed, i.e. values with
  corresponding non-positive keys (e.g. strings, non-positive integers, negative and positive floats, etc.)
  are now properly recognised in the evaluation.

- `stats.mean`, `stats.qmean`, `stats.sd`, and `stats.var` now also process sequences.

- The new `stats.mode` function returns all values in a sequence or table with the largest number of occurrence,
  i.e. highest frequency.

- The new `stats.quartiles` function returns the first, second, and third quartile of a _sorted_ table or
  sequence.

- Previously undocumented features of `linalg.matrix` have been added to the manual and its error handling
  has been improved.

- Improved error handling of `linalg.hilbert`.

- `gdi.setinfo` now accepts the `square` option. If `square = false`, then the x and y axes will not
  have the same scale on plots created with `gdi.plot`.

- The `gdi.plot` function to draw graphics unfortunately has not been documented. This has been changed.

- `gdi.plot` accepts two new options: The 'x' option specifies the horizontal range over which a plot is displayed,
  and the 'y' option specifies the vertical range.

- If a PLOT structure is passed to `gdi.plot` that contains only POINTs, LINESs, RECTANGLES, TRIANGLEs, CIRCLEs,
  and ELLIPSEs (including their *FILLED variants), then `gdi.plot` automatically determines the scales (`gdi.setinfo`
  does not necessarily need to be called).

- The OOP features inherited from Lua are now documented in Appendix A9. The author does not recommend object-
  oriented programming.

Tuning

- Tuned `filled` operator by around 3 %.

- Tweaked `in`, `join`, `sadd`, `qsadd`, `replace`, `copy`, `unique`, and Cantor set operators on tables and sets
  a bit.

- With tables, the `top` and `bottom` operators are around 5 % faster now.

- The `size` operator is at least 8 % faster if a table does not include nulls.

- `linalg.mzip`, `linalg.mmul`, and `linalg.transpose` have been tuned by around 3 % each.

- Numeric for/to loops with fractional step sizes have been optimised by reducing the number of their internal
  control variables by half. This, however, did not attain any increase in speed.

Patches

- Patched `linalg.ludecomp` to detect singular matrices. Also, the function can now automatically determine
  the order of the given matrix.

- As opposed to the manual, `gdi.plot` did not automatically determine horizontal and vertical ranges. This has
  been fixed.

- `gdi.plot` no longer ignores the `square` option set by `gdi.setinfo`.

- `gdi.setinfo` added settings to INFO structures even if they have been already present. This has been changed.

- Circles were not plotted properly by `gdi.plot`. This has been changed.

- The `gdi.plot` function in most circumstances ignored the individual colouring of geometric objects. This has
  been changed.

- The gdi package did not assign short names for `gdi.settriangle`, `gdi.settrianglefilled`, `gdi.setrectangle`,
  and `gdi.setrectanglefilled`. This has been changed.

- The fractals package did not assign short names for functions of user-defined type 'esctime'. This has been
  changed. Corrected error message of `fractals.draw` if positional arguments were not numbers.

Miscellaneous

- The functionality of `calc.fseq` has been merged into `nseq`. For backward compatibility, `calc.fseq` is
  still part of the calc package, but the function actually refers to the `nseq` implementation.

- Added the `environ.FractScreenUpdates` variable to the `fractals package` to denote the number of vertical
  lines (a non-negative integer) after which a fractal will be updated in a window. The `environ.FractOptimised`
  variable has been deprecated.

- Auxiliary gdi functions have been regrouped.


1.3.3, February 12, 2011

- Patches to `instr`:
  - When in regex mode, the operator returned a wrong result if a start position has been given.
  - When in plain search mode, the operator returned an out-of-range error if no start position
    has been given.
  - Except in reverse search mode, if no match has been found, the first argument has been returned instead of `null`.

- Corrected error message of the `create` statement with respect to sequences.

- In AgenaEdit, when outputting more than one structure with only one call to `print`, structures were
  not printed in full form if the first structure featured a __tostring metamethod. This has been changed.


1.3.2, January 22, 2011

- `dimension` created interesting results if a structure has been passed as the initialiser. This
  has been changed: `dimension` now creates independent copies of the structure when initialising
  the table.

- The functionality of `strings.rseek` has been added to the `instr` operator. Thus, `strings.rseek`
  has been deprecated. For backward compatibility, `strings.rseek` has been added to the lib/compat.agn
  file.

- `strings.hits` now supports regular expressions and captures. This behaviour can be turned off by
  passing a boolean as a third argument.

- `strings.isabbrev` and `strings.isending` now automatically use a plain search if no regular
  expressions or captures have been passed as part of the second argument.

- Tweaked `strings.ismagic` and `strings.isfloat`.

- The `log` function now is 13 % faster.

- When outputting more than one structure with only one call to `print`, structures were not printed in
  full form if the first structure featured a __tostring metamethod. This has been changed.

- Added categorisations of functions to Chapter 7 to facilitate the start for new users.


1.3.1, January 09, 2011

- There have been problems with nested calls to the following binary operators: `xor`, `atendof`, `&&`,
  `||`, `^^`, `::`, and `:-`, and thus also with the pretty printer which quit with an error when
  printing nested structures. This has been fixed.

- Four fixes to `os.list`:
  - If the 'r' option has been passed, the current working directory has been mistakingly changed after
    completion of the call.
  - If 'r' has not been passed as the last argument, the function issued an error.
  - `null` has not been accepted as the first argument to denote the current working directory.
  - In Windows 7, printing the contents of the root directory did not work, i.e. os.list('c:') returned
    the contents of the current working directory.

- When a string was indexed with a non-number, e.g. "str[null]", Agena returned `null`. Now an error is
  raised.

- If library.agn has not been found the wrong path has been output twice in the warning. This has
  been changed.


1.3.0, January 02, 2011

- Procedures now can check whether their returns are of a given standard or user-defined type.

- The new `values` operator returns all values in a table or sequence (first argument) with the
  given keys (second to last argument).

- Added the `strings.fields` function which extracts given fields (columns) in a string.

- Added the `strings.ljustify` and `strings.rjustify` functions which add characters to the end
  or beginning of a string, respectively, as necessary to create a new string of a given width.

- The new `::` operator checks for a given basic or user-defined type and returns true or false.

- The new `:-` operator checks whether a value is not of a given basic or user-defined type and
  returns true or false.

- The `gzip` file compression library now is part of the distribution.

- In order to support the new `::` operator, the `try` statement now only accepts variable and indexed
  names so that no clashes occur when parsing the `::` keyword. Before, any value could be
  processed. The `try` statement will finally be deprecated.

- Fix to `io.lines` to always correctly detect DOS-like carriage returns at the end of a line.

- Anonymous functions: "<< ) -> x >>" and "<< x ) ->  >>" had been valid expressions. This has been
  changed.

- When deleting a user-defined type with `settype`, Agena could crash. This has been fixed.

- Patched AgenaEdit to properly print structures again.

- Corrected error message issued when a wrong value has been passed as a function argument that
  should have been of a user defined type.

- Standardised error messages in the `io` package.

- In Linux, the installer now copies the libagena.* files to /usr/local/lib instead of /usr/lib.
  The include files are copied to /usr/local/include/agena instead of /usr/include/agena.
  Missing include files agnnt*.h have been added to the installers.

- An installer is now also available for PowerPC Debian.


1.2.0, December 25, 2010

- The substring operator has been redesigned but the old version will still be available till Agena 2.0:
  the new one is: `str[left to right]`, the old one has been: `str$(left, right)`. An example:
  before: `str := 'string'; print(str$(2, 3))` -> 'tr'
  now:    `str := 'string'; print(str[2 to 3])` -> 'tr'

- You are now able to determine sublists of table arrays and sequences with the new syntax mentioned
  above: `s[left to right]`. An example:
  now: `a := [10, 20, 30, 40]; print(a[2 to 3])` -> [20, 30]
  now: `a := seq(10, 20, 30, 40); print(a[2 to 3])` -> seq(20, 30)

- The `ops` function now allows to specify the values to be returned by passing a sequence of their index
  positions as its first argument, e.g. ops(seq(1, -1), 10, 20, 30).

- The new function `strings.include` inserts a character sequence into a string at a given position.

- The following functions now issue an error instead of just returning `fail` in case of a failure:
  `os.remove`, `os.move`, `os.mkdir`, `os.rmdir`, `os.chdir`.

- Improvements to the following operators working on sets and sequences concerning garbage collection:
  `insert` statement, `union`, `intersection`, `minus`, `unique`, `copy`, `pop/top` and `pop/bottom`
  statements, and set assignments.

- Improved error message of `fractals.draw` if FRACTINT colour map file has not been found.


1.1.0, December 19, 2010

Note

- Some functions have been removed from Agena and some have been converted to package functions
  (see below). If you still want to use them, issue

  readlib 'compat'

  on the command line or put the above statement into your initialisation file if you prefer backward
  compatibility to Agena 1.0.


Extended Functionality

- The `pop/top` and `pop/bottom` statements and `bottom` and `top` operators can now also be applied
  to table arrays.

- When called with `null` or no arguments, `os.chdir` no longer issues an error but returns the current
  working directory. Thus, the former `os.curdir` C function has been replaced by one written in
  the Agena language.

- `os.list` now recursively traverses subfolders if the new 'r' option is given.

- The `join` operator now also accepts an optional delimiter and supports the option to specify the
  the first and the last element of the structure to be concatenated.

- `instr` can now search from the right end of a string by passing a negative position.

- If a table includes other tables, sets, sequences, or pairs, `copy` now knows how to handle these
  references properly if they occur multiple times: If an embedded structure is included n times, then
  one real copy is made and n-1 references to this newly created structure are inserted. Before, n
  independent copies have been made.

- The new `isnonposint` function checks whether the given numbers are all integers and non-positive.

- `io.close` can now close multiple files with only one call.

- The `with` function did not assign short names for the following procedures of the `math` package:
  `convertbase`, `fraction`, `zeroin`, `todecimal`, `lcm`, `gcd`, and `ndigits`. This has been
  corrected.

- The `rwritemode` function mentioned in the manual did not exist. It is now available but called
  `rmode`.

- Error messages of various functions have been improved.


Namespace Cleansing: Renamed or Moved Functions

- The `register` and `loadclib` base library functions have been moved to the `package` library.

- The former `rdelete`, `rget`, `rinit`, `roinit`, `rmode`, `rset`, `remember`, and `defaults` base library
  functions have been moved to the new `rtable` package.

- Renamed the global _Env table to `environ` which now also contains procedures to access the environment.

- The former global `homedir` and `infolevel` environment variables have been renamed to `environ.homedir`
  and `environ.infolevel`, respectively.

- The following former base library functions have been moved to the `environ` package:
  `anames`, `attrib`, `gc`, `getfenv`, `globals`, `isselfref`, `pointer`, `setfenv`, `used`, `userinfo`,
  `__RESTART`, `__DOTTYPRINT`.

- `mapm.xtoNumber` has been renamed to `mapm.xtonumber`, `mapm.xtoString` has been renamed to `mapm.xtostring`.
  For backward compatibility, the old function names can still be used by executing the lib/compat.agn file
  (first readlib the `mapm` package and then load the compat.agn file).


Deprecated Functions and Variables

- `strings.seek` has been deprecated. Its functionality has been added to the `instr` operator. To
  switch off `instr`'s pattern matching mode, pass the start of the search as the third and `true` as the
  fourth argument. `instr` is around 40 % faster in non-pattern matching mode than `strings.seek`.
  For backward compatibility, `strings.seek` has been added to the lib/compat.agn file.

- The `concat` base library function has been removed. Use `join` instead. For backward compatibility,
  the function has been added to the lib/compat.agn file.

- The `hasrtable` and `hasrotable` functions have been removed. For backward compatibility, they have
  been added to the lib/compat.agn file.

- The `pcall` function has been deprecated. Use `protect` instead. For backward compatibility,
  the function has been added to the lib/compat.agn file.

- The `maptoset` function has been deprecated. For backward compatibility, the function has been added
  to the lib/compat.agn file.

- The `os.alldirs` function has been deprecated. Use the 'dirs' and 'r' options in a call to `os.list`
  instead. For backward compatibility, the function has been added to the lib/compat.agn file.

- `os.isMac`, `os.isSolaris`, `os.isLinux`, `os.isWin`, `os.isOS2`, `os.isDOS`, `os.isHaiku` have been
  deprecated. Please use the new environment variables environ.Os and environ.Cpu instead, which also speeds
  up code. For backward compatibility, the functions have been added to the lib/compat.agn file.

- The undocumented _VERSION variable has been removed. For backward compatibility, its assignment has been
  added to the lib/compat.agn file.


Other Changes

- The C API function lua_rawsetstringnumber mentioned in the manual did not exist. This has been changed.

- Code optimisations to the parser.

- In some of the packages, accidently a few variables have been implicitly declared global. This has been fixed.

- Corrected and updated initialisation sample files.

- AgenaEdit has been updated.

- The language scheme files have been updated.

- The Linux installers now include the xBase package.


1.0.6, December 16, 2010

- Improved error messages of `join`, `copy`, and `filled` operators, of `toset`, `toseq`, and `totable`
  functions, of `insert`, `delete`, `pop` statements, and of `for` loops.

- With sequences, Agena crashed in the following sequence of events: 1) a `delete` statement had been
  executed, 2) the sequence therafter had been empty, and 3) a new element had been inserted again.
  This has been fixed. (Internally, the `delete` statement no longer internally reduces the size
  of sequences any longer.)

- With large strings, `concat` crashed. This has been fixed.

- With strings of 512 and more bytes, `join` and `replace` could crash. This has been fixed. The two operators are
  now also much faster than ever before.

- `math.isprime` returned wrong results with arguments > 2^31 (mentioned vaguely in the manual). This has been
  fixed by extending the argument range to integers with values up to +/-2^63.

- `math.nextprime` and `math.prevprime` had the same issue with larger arguments like `math.isprime`. This
  has also been changed. With argument 2, `io.nextprime` falsely returned 5 instead of 3. This has been
  fixed, as well.


1.0.5, December 10, 2010

- With sets, `copy` did not copy a user-defined type definition. This has been changed.

- `join` could crash Agena and otherwise behave unexpectedly if the resulting string exceeded 512 bytes.
  This has been changed.

- If `restart` has been called after an error has been issued in the previous statement, Agena in rare
  occasions crashed because of stack corruption. This has been fixed.

- With newly created tables containing exactly one element in the hash part, `attrib` now returns
  correct results for the number of allocated hash slots (1 instead of 0).

- Corrected error messages of `qsadd` and `sadd`.

- Improved error messages of `join`, `copy`, and `filled` operators, and of `insert` and `delete`
  statements.

- Improvements to the makefiles.

- Buffer sizes have now been standardised in the sources.


1.0.4, November 17, 2010

- Since rare crashes have been reported during initialisation (in XP and OpenSolaris, in some circum-
  stances), garbage collection is now turned off in the initialisation phase. These rare segmentation
  faults occured in OpenSolaris when running the Agena binary in its harbouring directory as root,
  and in XP when clicking on the Agena desktop icon with local admin rights.

- Introduced the -d switch to the command line options in order to print information during initialisation
  of Agena.

- Introduced proper error handling if memory could not be internally allocated to: `trim`, `upper`,
  `lower`, `os.curdir`, and `strings.rseek`.

- Removed potential memory leaks in the initialisation C functions agenaL_initialise and agenaL_setLibname,
  and in `io.write*` and `print`.


1.0.3, November 13, 2010

- The new function `protect` calls a procedure in protected mode and catches any possible error
  so that computation is not interrupted. In case of an error, it sets the error string to the
  global variable `lasterror`. It is related to `pcall`, but does not return the status code as
  the first result.

- `attrib` now returns correct results with empty structures. With empty structures, the function
  wrongly counted one assigned hash element before.

- `attrib` now return the number of bytes occupied by tables, sets, and sequences along with the
  new 'bytes' key . The number of bytes returned is based on sometimes contradictory information
  available on the net.

- `replace` crashed Agena if the resulting string exceeded 512 bytes. This has been changed.

- `assume` now returns 'Assumption failed.' instead of 'assumption failed.'

- The new C API function lua_setglobal2 sets the value at the top of the stack to a global name.
  Contrary to lua_setglobal, the value is not popped.

- Code cleaning of lobject.h (Table structure), and lapi.c (actnodesize macro). Bugfix to
  C API function agn_deletertable in case Agena is compiled with non-void lua_assert. Change to
  the return value of the savestate function (agena.c and agenaedit.cxx) that is used during
  initialisation to prevent the (slight) possibility of stack corruption.


1.0.2, November 06, 2010

- The new `os.setenv` procedure sets environment variables on the operating system level. The function
  has originally been written by Mark Edgar.

- In Windows, `os.getenv` now calls a native Windows API function in order to get the values
  of environment variables. The Windows code has been written by Mark Edgar.

- The new `os.environ` function returns all assigned environment variables in a table. The function
  has originally been written by Mark Edgar.

- `io.open` now adds the FILE pointer, the name, and the mode of a successfully opened file into the
  new table `io.openfiles`. `io.close` deletes the entry from `io.openfiles` if the file could be
  successfully closed.

- When called with no arguments, `io.read` now returns an error if called with no arguments in
  AgenaEdit (in an attempt to read the keyboard).

- If `io.anykey` and `io.getkey` are called in AgenaEdit, a proper error message is displayed.

- One of the initialisation subprocedures has been changed to avoid possible stack corruption
  (although problems never occured).

- os.isMac('ppc') now works on PowerPC machines.

- Chapters 4 and 6 of the Primer and Reference have been revised and extended. An index has been
  added and a lot of cosmetics have been done, as well.

- Stored correct version information to the Windows executable.


1.0.1b, October 19, 2010

- Included improved manual. No changes to the sources.


1.0.1a, October 17, 2010

- Small adaptions to the sources to facilitate compilation in some Linux environments.


1.0.1, September 19, 2010

- With structures, the `inc` and `dec` statements only worked correctly with one-dimensional tables
  or sequences. This has been changed.

- The `has` function returned unwanted results with tables if its second argument is a number
  and if this number is a key of the table scanned. This has been changed: Only if the key
  is not of type number, then the table indices are scanned, as well.

- Corrected error message of `arccosh`.

- The prettyprinter now outputs complex values including `undefined` in the real or imaginary
  part as just `undefined`. Note that internally the complex value is not simplified this way
  but left untouched.


1.0, August 13, 2010

- Agena has become so mature, that its version number is 1.0: at last.

- The following functions now accept multiple arguments: `isboolean`, `isnumber`, `iscomplex`,
  `isnumeric`, `isstring`, `istable`, `isset`, `isseq`, `ispair`, `isstructure`, `isposint`,
  `isnonnegint`, `isnegint`.

- All aliases for deprecated function names are no longer automatically initialised at start-up.
  Enter `readlib 'compat'` to activate them. Deprecated names of functions in the linalg package
  can only be used by uncommenting the alias assignments at the bottom of the 'lib/linalg.agn' file.

- Optimisations and corrections in the manual and in the Quick Reference.

- Updated language scheme files.

- On Sparcs, the `arcsin` and `arccos` implementations now use another algorithm for complex arguments
  (found in Stephen L. Moshier's Cephes library). This fixes issues with wrong results that only
  occured on Sparcs. (Fix added August 30, 2010 for the Sparc edition of Agena.)


0.34.1, July 13/14, 2010 & August 01, 2010

- AgenaEdit has been updated to version 0.1.1 in the Intel Mac OS X, Linux, x86 Solaris 10 and
  Windows editions:

    - Added `restart` button to the Agena output windows to reset the Agena environment.
    - Added licence information to Help/About window.
    - Added Agena icon to the Windows version.
    - Added keyboard shortcuts for `break` and `restart` button in the Agena output windows.
    - The restart facility has also been added to the editor menu.
    - Added system information window to the help menu.

- `linalg.isAntisymmetric` has been renamed to `linalg.isantisymmetric`, `linalg.isVector` to
  `linalg.isvector`, and `linalg.isMatrix` to `linalg.ismatrix`.

- The Agena 0.34.1e release for Windows includes a fixed version of the linalg package which
  was not properly compiled before.


Agena 0.34.0, July 07, 2010

- Agena is now shipped with an editor called AgenaEdit. It provides syntax-highlighting, basic
  facilities to copy, paste, delete, find and replace texts, can open and save files, and jump
  to specific lines in the code.

  It also can run the code you entered (even parts of it) by calling Agena and printing results
  in a separate window.

  AgenaEdit is in its infancy - any useful feedback to improve the editor is highly appreciated.

- As a language-consistency measure, the following function names which include upper-case
  letters have been changed such that all capital letters in the names have been replaced by
  lower-case letters.

  Aliases are provided to ensure backward compatibility, but they may be deleted in the next
  major release (0.35).

  This refers to: `isBoolean`, `isComplex`, `isNegint`, `isNonnegint`, `isNumber`, `isNumeric`,
  `isPair`, `isPosint`, `isString`, `isTable`, `isSet`, `isStructure`, `loadClib`, `toNumber`,
  `toSeq`, `toSet`, `toString`, `toTable`, `isEqual`, `bisEqual`, `strings.toChars`,
  `strings.toBytes`, `strings.isAbbrev`, `strings.isAlpha`, `strings.isAlphaSpace`,
  `strings.isAlphaNumeric`, `strings.isEnding`, `strings.isFloat`, `strings.isLowerLatin`,
  `strings.isLowerAlpha`, `strings.isUpperLatin`, `strings.isUpperAlpha`, `strings.isMagic`,
  `strings.isLatin`, `strings.isLatinNumeric`, `strings.isNumber`, `strings.isNumberSpace`,
  `package.checkClib`, `math.isPrime`, `math.nextPrime`, `math.prevPrime`, `math.toDecimal`,
  `math.toRadians`, `utils.isLeapYear.

- The function name `isSequence` has been changed to `isseq`. An alias is provided to provide
  backward compatibility but may be deleted in Agena 0.35.

- Improved check of optional arguments in `gdi.options`.


0.33.2, June 26, 2010

- Added the new `gamma` function to the base library.

- The new `math.prevPrime` and `math.nextPrime` functions return the largest prime less than and the smallest
  prime greater than the given argument, respectively.

- The new baselib functions `isBoolean`, `isComplex`, `isNumber`, `isPair`, `isString`, `isTable`, `isSet`, and
  `isSequence` check their arguments for the respective type. `isNumeric` checks for numbers or complex numbers,
  and the `isStructure` function checks whether its arguments are tables, sets, sequences, or pairs.

- The new baselib function `isNegint` checks for a negative integer. `isNonnegint` checks for either 0 or a
  positive integer. `isPosint` checks for a positive integer.

- `finite` and `even` now return `fail` if their argument is a complex value, before they issued an error.

- With this release, `int` works on complex numbers, as well.

- Tuned the `binomial` function in the Windows edition by 12 %.

- Improved treatment of complex `undefined`!(+/-)`infinity` situation.

- `mapm` package: most functions crashed Agena if a negative precision has been given. This has been fixed.

- The `root` function returned wrong results in the complex domain in all versions of Agena. This has been
  fixed by completely rewriting the function. root(n, 0) with n a number and root(0, n) with n a negative
  integer returned `infinity` instead of `undefined` - this has been changed, too.

- In DOS, Haiku, and OS/2 (i.e. the plain-ANSI editions), the `arctan2` function returned wrongs results if at
  least one of its arguments was complex. This has been fixed.

- The `log` function sometimes returned `undefined` instead of a finite number. This has been changed.

- In Haiku, the mapm package could not be initialised. This has been fixed.

- The Windows uninstaller now does not delete the agena/lib/agena.ini file any longer if it resides in
  the agena/lib folder.

- Updated the language scheme files and extended/corrected the manual.


0.33.1, June 20, 2010

- Added two new hyperbolic functions: `csch` and `sech` and two new inverse hyperbolic functions:
  `arccsch` and `arcsech`.

- The `beta` function has been added (beta(z, w) = exp(lngamma(z)+lngamma(w)-lngamma(z+w)), with
  special treatment if z and w are integers).

- Added `os.alldirs` which returns the names of all subdirectories on the file system that are
  part of a given folder.

- With `gdi.plotfn`, the new option 'square' causes `plotfn` to use the same scale for the y-axis
  as given for the x-axis.

- With `gdi.plotfn`, the new option 'maxtickmarks' allows to control the maximum number of tickmarks
  plotted on both axes.

- With too large function values, `gdi.plotfn` printed too many tickmarks and labels on the axes.
  This has been changed.

- With complex arguments x, y, the `arctan` operator did not return the imaginary unit of the result
  in the non-ANSI versions (i.e. Windows, Mac, Solaris, Linux).

  This has been fixed by using a modified version of Stephen L. Moshier's implementation of the
  complex arctan function available in the Cephes Math Library which is portable across various
  platforms contrary to the respective platform-dependant implementations.

  Also, in the plain-ANSI versions (DOS, Haiku, OS/2), if x = 0 and y < 1 and y an integer,
  the result was incorrect. This has been fixed, as well.

- In the complex domain, the `arccoth` function wrongly returned Pi as the imaginary part of the
  result if the imaginary part of its argument was 0 and the real part of its argument was greater
  than 1. This has been changed.

- In the complex domain, `arccosh` returned a wrong result if the imaginary part of its argument was 0,
  and the real part of its arguments was in ]-1, 0[. This has been changed.

- In the complex domain, `arcsinh` returned a wrong result if the real part of its argument was 0,
  and the real part of its arguments was a negative integral < -1. This has been changed.

- In Windows, `erf` and `erfc` sometimes returned wrongs results. This has been changed.

- In Haiku, `homedir` is assigned to '/boot/home' if on the operating system level the environment
  variable 'HOME' has not been set.

- Cosmetics to the warning messages that are issued if libname could not be determined at initialisation
  and to two general error messages.


0.33.0, June 13, 2010

- The new `xbase` package can read and write xBase files compatible to the dBASE III standard.

- The `binio` and `ads` packages can now handle files of up to 2^63 bytes. Before they could handle only
  files with sizes of up to 2^31 bytes.

- The new `io.lock`, `io.unlock`, `binio.lock`, `binio.unlock`, `ads.lock` and `ads.unlock` functions lock
  a file from read and write access by other Agena functions or even other applications provided the latter
  use a locking protocol.

- The baselib function `read` can no longer be overwritten by `with`.

- The new `package.checkClib` checks whether a package stored to a C dynamic library has been initialised.
  If not, it returns a warning printed on screen and creates an empty package table. Otherwise it does
  nothing.


0.32.4, June 08, 2010

- With complex arguments, the `lngamma` operator often did not return the same result that Maple V Release 4
  produces. This has been fixed by using C sources written by Stephen L. Moshier for the Cephes Math Library.

- In the plain-ANSI editions of Agena (e.g. for DOS, OS/2, and Haiku), `arcsin` and `arccos` in rare circum-
  stances returned incorrect results in the complex domain. This has been largely fixed.

- The `**` and `^` operators returned `infinity` instead of `undefined` if the base was 0 and the exponent
  non-positive. This has been changed.

- In the ANSI editions (e.g. for DOS, OS/2, and Haiku), `erf` and `erfc` have been rewritten in C and now are
  3.5 times faster than the former Agena language versions.

- _EnvPrint.ZeroedCmplxVals is now unassigned at invocation of Agena.

- The baselib `attrib` function could be overwritten by invoking "with 'ads'", provoking errors when trying to
  print structures thereafter. This has been changed by `hiding` a copy of `attrib` in the environment.


0.32.3, May 30, 2010

- The `calc.xpdiff` function has been rewritten in C and is at least 6 times faster than the former Agena
  version.

- The `calc.diff` function has been rewritten in C and is at least 3.1 times faster than the former Agena
  version.

- `calc.sections` has been ported to C and thus is around 17 % faster.

- `calc.regulafalsi` has been ported to C and thus is around 40 % faster.

- The `calc.fminbr` helper function has been ported to C and thus has become 2.6 times faster.

- Due to tuning of `calc.xpdiff`, `calc.diff`, `calc.sections`, `calc.regulafalsi`, and `calc.fminbr`,
  the `calc.zero` function has become 4.6 times faster, and `calc.minimum` and `calc.maximum` have become
  4.8 times faster.

- The new `calc.fresnelc` and `calc.fresnels` functions compute Fresnel integrals. The core C algorithms have
  been written by Stephen L. Moshier for the Cephes Math Library.

- The integer division operator did not work correctly if the right operand was negative. This has been fixed.

- `bisEqual` now accepts either two tables or two sequences, before it could compare sequences with tables.

- The `kernel` function has been extended with the new option `debug` that prints further debugging informa-
  tion if the initialisation of a C dynamic library failed.

- `fractals.draw`: The third argument now requires positive values and issues an error otherwise. Before,
  the function turned into an endless loop.


0.32.2a, May 28, 2010

Mac OS X only:

- The gdi package requires further libraries that were not shipped with the installer. The gdi package
  has now been statically built and includes the required code of these further libraries. Thus the
  user no longer has to install the dependencies manually. Many thanks to Jan from Canada.

- The `kernel` function has been extended with the new option `debug` that prints further debugging informa-
  tion if the initialisation of a C dynamic library failed.

- `fractals.draw`: The third argument now requires positive values and issues an error otherwise. Before,
  the function turned into an endless loop.


0.32.2, May 25, 2010

- The new `calc.intde` function computes an approximation of the integral of a function. It is at least 4 times
  faster, and produces more accurate results than `calc.gtrap` by using Double Exponential (DE) Transformation,
  also known as Tanh-sinh quadrature. The code used has been originally written by Takuya Ooura, Kyoto.

- The new `calc.intdei` function computes the integral of a non-oscillatory function over (a, infinity). The code
  used has originally been written by Takuya Ooura, Kyoto.

- The new `calc.intdeo` function computes the integral of an oscillatory function over (a, infinity). The code
  used has originally been written by Takuya Ooura, Kyoto.

- The new `calc.integral` function is a wrapper around `calc.intde`, `calc.intdei`, and `calc.intdeo`.

- The new `calc.Si` procedure computes the sine integral. The new `calc.Ci` computes the cosine integral. The
  new `calc.Shi` function computes the hyperbolic sine integral. The new `calc.Chi` function computes the hyperbolic
  cosine integral. The new `calc.Ssi` function computes the shifted sine integral. All these functions have been
  written in C using Stephen L. Moshier's Cephes Math Library.

- The new `calc.dawson` function computes Dawson's integral using Stephen L. Moshier's Cephes Math Library.

- The new `calc.Ei` function computes the exponential integral for positive arguments, using Stephen L. Moshier's
  Cephes Math Library.

- The new `calc.Psi` function computes the Psi (digamma) function, using Stephen L. Moshier's Cephes Math Library.

- The new `calc.dilog` function computes the dilogarithm function, using Stephen L. Moshier's Cephes Math Library.

- The new `calc.polygen` function creates a polynom p(x) = c[n]*x^(n-1) + c[n-1]*x^(n-2) + .. + c[2]*x + c[1]
  from given coefficients c[k] and returns it as a new function << x -> p(x) >>.

- The random number algorithm used in `math.random` has been changed. Before, `math.random` could only generate
  up to 32768 unique numbers in [0, 1). Now, it can generate 2*_Env.MaxLong unique random numbers in [0, 1).

- `math.randomseed` has been extended to support the new RNG algorithm used by `math.random`.

- The new `math.norm` function converts a number x in the range [a, b] to one in the range of [c, d].

- The new `os.isHaiku` function checks whether Agena is being run on Haiku.

- The `BesselJ` and `BesselY` either produced wrong results with complex arguments or even crashed Agena (observed
  with Sparcs). This has been fixed. The functions now return correct results.

- The `lngamma` operator returned imprecise results with roundoff errors with arguments 1!0 and 2!0. This has
  been fixed.

- The core algorithm to compute the complex error function and the complementary complex error function has been
  replaced with a more precise algorithm written by Takuya Ooura, Kyoto.

- Corrected the error texts of some mathematical functions.

- The Windows installer by default will now copy all Agena components to the user's hard disk.

- The source files have been slightly modified to also compile under Haiku/GCC 4.3.3.

- Some chapters in the manual have been corrected.


0.32.1, May 17, 2010

- With kernel('longtable') = true, the `print` function outputs table key~value pairs in ascending order of
  the table keys.

- The `erfc` complementary error function now also works in the complex domain.

- `approx` now applies Donald Knuth's simplified relative approximation algorithm on complex values, as well.

- The new `expx2` baselib function computes either exp(x*x) or exp(-x*x) while suppressing error amplification
  that would occur from the inexactness of the exponential argument x*x.

- The new function `strings.toBytes` converts a string into a sequence of numeric ASCII values.

- Corrected error messages of `kernel` function.

- In some very rare situations, the `enum` statement did not work well with indexed names passed after the `from'
  keyword. This has been fixed.

- On Little Endian platforms, the `save`, `read`, `binio.writenumber`, and `binio.readnumber` functions sometimes
  did not correctly write or read floats to/from binary files. This issue has been fixed. The `debug.doubleendiantest`
  functions has thus been removed. Exchangeability of the files between Big and Litte Endian platforms works fine.

- The binary files produced by the `save` function are imcompatible to older releases of Agena, including
  Agena 0.32.0.

- Added Lua 5.1.4 patches 7 and 8 to fix minor bugs in `io.read` and `strings.format`.


0.32.0, May 14, 2010

Syntax changes:

- Optional arguments of the form `option = value` are supported now in function calls. The old form
  `option ~ value` is still recognised. If you need to conduct a Boolean equality operation in a function
  call, such like f(a=b), where `a=b` shall result to a Boolean, use the new function `isEqual`: f(isEqual(a, b)).

Function improvements:

- The `save` function now produces smaller files, especially with strings. The new file format is incompatible
  with previous versions, so you cannot read in binary files produced with older Agena releases.

- The `read` function now uses a subroutine written in C resulting in an overall increase in speed of 10 to
  20 %.

- User-defined types for tables are now supported by the `read` and `save` functions.

- The new 'libnamereset' option of the `kernel` function replaces the _EnvLibnameReset environment
  variable. Whereas _EnvLibnameReset has been unassigned after a `restart`, the setting is no longer
  changed after a restart.

- The new 'longtable' option of the `kernel` function replaces the _EnvLongTable environment
  variable. If set to true, each key~value pair in a table will be printed at a separate line. If
  set to false, tables are printed like sets or sequences, i.e. in one consecutive line. The setting
  the user chose will no longer be deleted after a `restart`.

- Improved error messages of the fractals package.

New functions:

- The new `binio.readshortstring` and `binio.writeshortstring` functions read and write strings of up to 255
  characters in binary format.

- The new `isselfref` function determines whether a table, set, sequence, or pair is self-referencing,
  such as the global table _G.

- The new `setbit` baselib function sets or unsets a bit in an integer.

Other Changes:

- _EnvPrint.ZeroedCmplxVals will now be set to true at invocation of Agena.

- All _Env* settings are reset by the `restart` statement to their original defaults, whereas those settings
  the user defines with the `kernel` function will never be modified or deleted by a restart.

- Auxiliary Agena functions are now stored in the global table `agena_auxiliary` to prevent wasting the
  global namespace.

- The agena.sch, agena.lang, and agena.xml language scheme files have been updated.

- The lib/utils.agn file is no longer supplied since all utils functions written in Agena have been transfered
  to the lib/library.agn file.

- Internal preparations for future new `kernel` settings.

- All error messages of the ads package have been standardised.

Bug fixes:

- The `inc` and `dec` statements produced wrong results if the first and the second arguments were both
  indexed names. This has been corrected.

- In some very rare situations, the insert/into and delete/from statements did not work well with indexed
  names passed after the `into' or `from' keywords. Instead of entering or deleting the given objects, the
  name of the index (a string) has been added or deleted. This has been fixed.

- User-defined types for pairs are now properly output by the `print` function.

- The `read` function did not correctly read sequences with user-defined types. This has been fixed. Also it
  now automatically closes the file if it contained format errors.

- To prevent file corruption, the `save` function now deletes the file - if it exists - before it will write
  to it.

- `ads.writebase` only automatically expanded the size of a base if _EnvVerbose has been set true. This has
  been changed.

Compatibility:

- Renamed some global environment variables to avoid crowding the global namespace:
  a) _EnvEps has been renamed to Eps.
  b) _EnvMinLong has been renamed to _Env.MinLong.
  c) _EnvMaxLong has been renamed to _Env.MaxLong.
  d) _EnvBufferSize has been renamed to _Env.BufferSize.
  e) _EnvPathSep has been renamed to _Env.PathSep.
  f) _EnvMore has been renamed to _Env.More.
  g) _EnvWithVerbose has been renamed to _Env.WithVerbose.
  h) _EnvRelease has been renamed to _Env.Release.
  i) _EnvGdiDefaultOptions has been renamed to _Env.GdiDefaultOptions.
  j) _EnvFractintColorMaps has been renamed to _Env.FractintColorMaps.
  k) _EnvFractOptimised has been renamed to _Env.FractOptimised.
  l) _EnvWithProtected has been renamed to _Env.WithProtected.

- The _EnvIoForceError and _EnvVerbose environment variables have been removed.

- All aliases that provide backward compatibility to older math, tables, or utils functions have been removed.
  They are now included in the lib/compat.agn file so you may initialise them manually by running this file
  from within your agena initialisation file, e.g. run '<path to Agena folder>/lib/compat.agn'.

- The binio ans ads packages no longer check the _EnvIoForceError or _EnvVerbose environment variable and all
  functions quit with an error instead of returning fail.

- Files created by `save` are not compatible to those created with older Agena versions.

C API:

- The new `agn_getenv` C API function returns an entry in the global environment table _Env.

- The new C API functions `agn_setemptyline`, `agn_getemptyline`, `agn_setlibnamereset`, `agn_getlibnamereset`,
  `agn_setlongtable`, `agn_getlongtable` set and read kernel settings.

- Functions `agn_isverbose` and `agn_isioforceerror` have been removed.


0.31.7b - OS/2 edition only - May 06, 2010

- The OS/2 release has been compiled with GCC 3.4.6 to prevent segmentation faults with eComStation 2.0. This
  unfortunately means that the bugs in complex arithmetic corrected with GCC 4.4.x are now present again in
  Agena for OS/2.


0.31.7, April 25, 2010

- The new `io.nlines` function counts the number of lines in a file.

- The new `utils.readcsv` function imports a CSV file.

- Some utils package functions (those written in Agena) could only be used by running `readlib` or `with`
  before. This has been changed.

- `utils.writeCSV` has been renamed to `utils.writecsv`. (An alias to the old `utils.writeCSV` is provided
   to ensure backward compatibility.)

- Table keys had not been sorted in ascending order as intended by the `print` function. This has been
  changed.

- The `save` function now returns an error if an object that cannot be stored to a file has been passed
  (e.g. procedures, threads, userdata). It also returns an error if the object to be written is self-
  referencing (e.g. _G).

- `os.fstat` did not return the correct size of files > 4 GBytes in Solaris, Linux, and Windows. This has
  been fixed.

- The ads package did not work well on some 64-bit architectures and caused segmentation faults. This has
  been fixed by replacing all C longs in the ads sources with int32_t's. The error affected Mac OS X, but
  neither Solaris 10 for Sparc, x64 Solaris 10, nor Win 7 64-bit. Whether x64 Linux architectures or older
  Win 64-bit platforms had been affected by this bug, is not known.

- The `binio.readlong` and `binio.writelong` functions produced binary files that could not be exchanged
  between some 32-bit and 64-bit systems. The error affected Mac OS X, but neither Solaris 10 for Sparc,
  x64 Solaris 10, nor Win 7 64-bit. Whether x64 Linux architectures or older Win 64-bit platforms had been
  affected by this bug, is not known.

- The global environment variables _EnvMaxLong and _EnvMinLong now contain the maximum and minimum values
  for the C data type int32_t. Before, it was the maximum and minimum values of type long which on Mac
  OS X 10.6 has a different width than on other 64-bit platforms, e.g. Sun Sparc Solaris 10.

- `debug.system` now also returns the number of bytes used for C types int32_t and long long ('int32_t' and
  'longlong' keys).

- In OS/2, the number of free bytes available was no longer output at initialisation. This has been
  changed.

- The DOS edition has been compiled with GCC 4.4.1, and thus contains substantially less bugs in complex
  arithmetic than previously.

- The OS/2 portions of the C code of the os package has been adapted to compile under GCC 4.4.2 without warnings.

- The `pointer` function now also works on complex numbers in DOS and OS/2.

- Pairs are now properly dealt with in the Agena Quick Reference.


0.31.6, April 17, 2010

- The new `homedir` environment variable contains the path to the user's home directory.

- The new `io.pcall` function makes communication with other programmes much easier by combining `io.popen`,
  `io.readlines`, and `io.close` into a single call.

- `unpack` crashed with sequences if the third argument denoted an out-of-range key. This has been changed.

- Standardised error messages.

- Extended the chapter on sequences in the manual (table of available functions).

- Added the new jEdit language scheme file agena.xml to the schemes folder and updated the Proton and gedit
  scheme files.


0.31.5, April 12, 2010

- `tables.put` has been renamed to just `put` and now also supports sequences. (An alias to the old
  `tables.put` is provided, to ensure backward compatibility.)

- `tables.remove` has been renamed to `purge` and now also supports sequences. (An alias to the old
  `tables.remove` is provided, to ensure backward compatibility.)

- The functions `tables.bintersect`, `tables.bisEqual`, `tables.bminus`, and `tables.duplicates` have
  been renamed to `bintersect`, `bisEqual`, `bminus`, and `duplicates`. (Aliases to the old function
  names are provided, to ensure backward compatibility.)

- If Agena could not find the main Agena library during initialisation, it now prints the path
  where it tried to find the library but did not succeed.

- The `getentry` function did not work with sequences as described in the manual. Contrary to not
  issueing an error if a sequence index did not exist, it issued an error. This has been changed.
  In the situation described, `null` is now returned.

- The `print` function issued an error with some kinds of very large tables and sets (including holes).
  This has been changed. Large tables and sets are now output without errors.

- When given the `mouse~true` option, `gdi.plot` on some UNIX platforms did not properly detect whether
  the right mouse button had been pressed. This has been changed.

- The new C API function `lua_seqrawget2` does not issue an error if a sequence key does not exist.
  Instead, it returns `null`.

- The new C API function `lua_seqrawgeti` pushes a sequence value onto the stack. It does not invoke
  metamethods.

- `os.isMac` has been extended to optionally query whether Agena is being run on either a PowerPC or
  Intel CPU.

- The undocumented functions `tables.getn` and `tables.setn` have been removed.

- The mapm DLL for Windows has been re-compiled.

- Added a new 64x64 pixel and 128x128 Agena programme icon to the share folder (Solaris, Linux, Windows).

- The manual and the Quick Reference XLS have been improved.


0.31.4, April 07, 2010

- The -p command line switch sometimes did not work as expected. This has been changed.

- The `==` operator did not return correct results with larger tables. This has been changed.

- `os.listcore` crashed Agena if the directory name passed was '/'. This has been fixed.

- `os.fstat` returned negative sizes for very large files. This has been corrected.

- In Windows, `os.battery` falsely returned the respectively opposite value on whether the battery was
  being charged or not. This has been changed.

- In Windows, `io.anykey` did not clear the keyboard buffer so that when calling it again or when
  calling `io.getkey` after running `io.anykey`, these functions got confused. This has been changed.
  (In UNIX, io.anykey has been working fine.)

- In Sun x86 Solaris 10, the `fractals` functions `lbea`, `bea`, `cosxx`, and `esctime` have now been
  implemented in C. Please make sure that if you compile the fractals.c source file in Solaris 10 x86,
  you use GCC 4.4.x or higher, otherwise Agena might crash if calling one of the fractals C functions
  that use C99 complex arithmetic.

- When given the `mouse~true` option, `fractals.draw` and `gdi.plotfn` on some UNIX platforms did not
  properly detect whether the right mouse button had been pressed. This has been changed.

- Added information to the manual on how to correctly evaluate the button state of a mouse with
  `gdi.mouse` (application of bitmasks to the third return of `gdi.mouse`).

- `fractals.draw` now correctly handles FRACTINT map files that include tabs, e.g. chroma.map.
  It now also checks whether a correct FRACTINT map file has been passed. If not, it issues a
  proper message specifying the incorrect line and column of the file read.

- `fractals.draw` now accepts the new option `update` which determines the number of rows after an image
  is being flushed to a file or window during computation. In Sun x86 Solaris and Linux, by default the
  image is updated each 10th row, in all other operating systems, including Sun Solaris for Sparcs, the
  default is 1 like in previous releases of the package. This behaviour in Sun x86 Solaris and Linux
  can be switched off by setting the global environment variable _EnvFractOptimised to false or null.

- With the fractals package in Sun x86 Solaris and Linux,  update ~ 0 is the fastest, but when outputting to
  a window, it does not plot anything while the fractal is being computed (of course, if computation finishes,
  the fractal will be displayed). Sparcs do not show any effect when changing the update rate, at least with
  XVR-1200 VGAs.

- `os.isSolaris` has been extended to optionally query whether Agena is being run on either a Sparc
  or Intel CPU.

- Corrected error messages of the bitwise operators &&, ||, ^^, and ~~.

- The agena.ini.sample file has been renamed to .agenainit.sample in the Mac distributions.

- Updated language scheme file for Proton.


0.31.3, March 29, 2010

- Added the fractals package to easily draw fractals in Solaris, Mac, Linux, and Windows.

- On Solaris and Linux, `gdi.mouse` now returns standard values for pressed mouse buttons (the same as
  the Mac and Windows editions do).

- When given the -v option, Agena now does not execute the initialization files any longer.

- On UNIX or Mac, the file names of the initialization files must always be `.agenainit`, whether they
  be in /usr/agena/lib or the personal folder.

- The binary Mac distribution for Intel CPUs runs around 30 % faster than previous releases.

- The `io.getkey` function is now available in the Mac OS X edition.

- On Mac, `os.system` now returns complete information about the operating system and CPU type. Note that
  it returns information on the Darwin kernel, and that the first entry in the resulting table now is
  `Darwin` instead of `MacOSX`.

- `os.memstate`, `os.freemem` and `os.beep` now support Mac OS X.

- `io.anykey` is available on all platforms, but returns `fail` on DOS and Mac. Thus, `gdi.draw` will
  not throw errors any longer on Mac when using the `mouse` option.

- `os.listcore` has been extended to return file, directory, or link names only. '.' and '..' now are never
  returned.

- `os.list` did not recognise any options and returned an empty list instead. This has been fixed. Also,
  options can now be combined. '.' and '..' as the first argument are now properly recognised.

- `os.curdir` now automatically replaces backslashes in the path determined with slashes.

- `os.fstat` and `ads.attrib` crashed Agena if the date of a file exceeded Tuesday, January 19, 2038.
  This has been fixed by either returning an empty table for the date key (os.fstat), or 00/00/00 00:00:00
  (ads.attrib).

- `utils.calendar` crashed Agena if its argument was void, negative or too big. This has been changed. In
  addition, if a date is beyond Tuesday, January 19, 2038, the correct date is returned.

- The new functions `os.screensize` and `os.mousebuttons` return the current screen resolution and the number
  of buttons of the attached mouse, respectively (Windows only).

- The agena.ini.sample file has been renamed to .agenainit.sample in the UNIX/Mac distributions.

- A new makefile for Solaris is now being shipped with the mapm Agena binding to fully compile the original
  MAPM sources written by Michael C. Ring.


0.31.2, March 07, 2010

- In addition to accepting hexadecimal values, Agena now recognises binary and octal constants. Binary
  constants are represented by 0b<binary value> or 0B<binary value>, and octal constants by 0o<octal value>
  or 0O<octal value>, where the first character is a zero, not the letter `o`.

- The mapm package for arbitray math precision is now also available in the DOS edition of Agena.

- The number of digits used by the mapm package is initialised to 17 digits at start-up of Agena for
  DOS and OS/2 Warp. Before, the default was 1 digit.

- The C code for the MAPM binding has been standardised. Before, the DOS and OS/2 source files differed from
  the one for UNIX and Windows.

- Small enhancements to the Windows and Mac OS X installers.

- On Mac, the documentation is now available in Library/Documentation/Agena instead of /Users/Share/Agena.

- The `sin`, `cos`, `arcsin`, `arccos`, and `arctan` functions returned -0 instead of 0 as the imaginary unit,
  which led to wrong results if the return of these functions had been used by other functions such as `ln`
  (i.e. the sign of the imaginary unit of the result of these other functions was incorrect). This has been
  fixed by setting the imaginary unit -0 to 0 in the return of `sin`, `cos`, `arcsin`, `arccos`, and `arctan`.

- The `arcsin` and `arccos` functions returned wrong results for complex arguments z, if abs(real((z))) < 1.
  This has been fixed.

- In OS/2, most complex arithmetic functions returned `undefined`. This has been fixed.

- Note that in OS/2 and DOS, in the complex domain there are still issues with the `arccos` and `arcsin`
  operators which return `undefined` in certain situations.

- The Windows, i386 Solaris 10, and Linux versions have now been compiled with GCC 4.4.x (and without
  xmath86.h) which reduced the number of errors in complex arithmetic significantly. In fact, elaborate complex
  math test cases return zero errors. The Sparc Solaris version has been compiled with GCC 4.3.3 for Sun Sparc
  and has less bugs in complex number arithmetic than the 0.31.1 release had.

- Renamed the following include files: config.h -> agncfg.h, chelpers.h -> agnhlps.h, aauxlib.h -> agnxlib.h.

- On Mac, `gdi.mouse` now returns standard values for pressed mouse buttons.


0.31.1, February 21, 2010

- The precedence of the `assigned`, `unique`, and `type` operators has been changed from 8 to 11
  (highest).

- Removed unneccessary warnings of the `with` function when activating the math package.

- Sources have been extended to compile under Mac OS X. (A binary Mac OS X edition of Agena is also
  available.) The following functions are not available in the Mac edition or return `fail` on Mac:
  `io.anykey`, `io.getkey`, `os.beep`, `os.memstate`, `os.freemem`. `os.system` does not return the
  version number, revision, and CPU.

- The new `os.isMac` function determines whether Agena is run on Mac OS X.

- `os.system` returns ['MacOSX', ....] if run on Mac OS X.


0.31.0, February 14, 2010

- The following functions from the `math` package have been moved to the base library for language
  consistency:

  `arccosh`, `arccoth`, `arcsinh`, `arctan2`, `arctanh`, `argument`, `besselj`, `bessely`, `binomial`,
  `ceil`, `conjugate`, `cot`, `coth`, `csc`, `erf`, `erfc`, `fact`, `fma`, `frac`, `frexp`, `heaviside`,
  `hypot`, `irem`, `ldexp`, `log`, `log10`, `modf`, `roundf`, `sec`.

  Aliases are provided so that you still can use these functions with the `math.` prefix. The aliases
  will be removed in the next major release.

- `infinity` is no longer allowed as an initial or last value to a for/to loop, and neither as
  the step size, for it implied that the loop counted indefinitely which was not the case.

- The `to` limit must now always be given to for/to loops.

- Operations with unary mathematical operators produced wrong results if the result has been
  raised to a power with the `^` and `**` operators. This has been fixed.

- Updated language scheme files.


0.30.4, January 31, 2010

- The `strings.isEnding` and `strings.isAbbrev` functions have been been extended to support pattern
  matching facilities. Pattern matching can be switched off for faster execution. Contrary to previous
  announcements, `strings.isEnding` will not be deprecated.

- The new function `strings.isFloat` checks whether a string contains a float.

- The new function `strings.gmatches` is a wrapper around `strings.gmatch` and returns all occurrences of
  a pattern in a string in a new sequence.

- When pressing CTRL+C during the console output of a table, set, or sequence that included other tables,
  sets, or sequences, the interpreter sometimes did not position the prompt correctly and also did not
  print separating lines between prompts. This has been fixed.

- The new `kernel` option 'emptyline' controls whether an empty line is printed between two input regions.
  By default, an empty line is printed. By issuing the statement `kernel(emptyline~false)`, two prompts
  are not separated by an empty line. This can always be revoked in a running session.

- The `_EnvPrint.NoNewLine` setting has been removed. Use the new `kernel` option 'emptyline' instead.

- The `print` function now accepts two options: 'delim' which denotes the character sequence separating
  two strings, and 'nonewline' which prevents the `print` function from issuing a newline after output
  completed.

- Removed a possible memory leak in the `io.write` and `io.writelines` functions.


0.30.3, January 23, 2010

- Agena now supports arbitrary precision for real numbers through a binding to Mike's Arbitrary Precision
  Math Library, which has been written by Michael C. Ring.

- The new function `linalg.swaprow` swaps rows in a matrix.

- The new function `linalg.swapcol` swaps columns in a matrix.

- The `getentry` function has been implemented in C and thus is 5 times faster than before.

- `math.isPrime` is around 4 % faster than before.

- The new function `countitems` counts the number of occurrences of an item in a structure. The procedure
  accepts either the item itself to be counted or a function that evaluates to true in order for something else
  to be counted. It is at least twice as fast as a combination of `size` and `select`. The function may invoke
  metamethods.

- The gdi package includes a number of new functions that allow to plot geometric objects easily. See chapter
  7.19.7 for a tutorial.

- If you pressed CTRL+C during operation of the `instr` operator, Agena crashed. This has been fixed.

- `strings.seek` will be removed in the next major release. Use the `instr` operator instead for it is 45 % faster.

- The manual has been improved.

- Fixed a bug in `gdi.options` that occurred when a wrong type has been passed.


0.30.2, January 11, 2010

- In `gdi.plotfn`, labels were not plotted correctly in either Windows XP or in other versions of Windows running
  NVIDIA VGAs. This has been fixed. Solaris and Linux do not seem to have been affected even when runnung NVIDIA cards.

- When printing tables and sets, Agena printed an excess comma and a blank right after the last value at line breaks.
  This has been fixed.

- If a string has been assigned to the new environment variable _EnvPrint.EncloseStrings, then Agena now outputs strings
  with the prepending and appending string assigned to _EnvPrint.EncloseStrings at the console.

- The names of boolean _EnvPrint* environment variables have been changed (to syntax _EnvPrint.*). See Appendix A5.
  The old names are no longer supported.

- The setting of _EnvPrint.EmptyLine had no effect. This has been fixed.

- If using the `mouse` option with `gdi.plotn`, plotting of the x and y positions can now be also cancelled
  by hitting a key.

- gdi: `ink not defined` error messages are no longer printed on screen.

- Improved internal step size detection in for/to loops for step sizes that are larger than the maximum integer
  representable on your machine.

- The speed of the `float` operator has been increased by 13 % in the Windows version.

- The new `linalg.mzip` functions zips together two matrices by applying a function to the respective elements.

- `zip` and `linalg.vzip` now accept more than two function arguments.

- The new function `linalg.augment` joins two or more matrices or column vectors together horizontally.

- The new function `linalg.stack` joins two or more matrices or row vectors together vertically.

- The new baselib `getentry` function returns an entry from a table or sequence without issuing an error if one of
  the given indices does not exist (`attempt to index a <type> value` error). In case of an invalid index, null is
  returned.

- The macros `linalg.isantisymmetric`, `linalg.isdiagonal`, `linalg.isdiagonal`, `linalg.isidentity`, `linalg.ismatrix`,
  `linalg.issquare`, `linalg.issymmetric`, and `linalg.isvector` have been removed.

- Matrix subtraction with the `-` operator did not work. This has been fixed.

- If you want to scalar-multiply a matrix A with a number n, the new syntax is: n*A, not A*n.


0.30.1, January 04, 2010

- The new function `io.anykey` checks whether a key (any key) is being pressed (available in Solaris, Linux,
  and Windows).

- A second procedure called `calc.xpdiff` to differentiate functions has been added to the calc package. It
  produces better results with powers and trigonometric functions than `calc.diff`.

- `calc.minimum` and `calc.maximum` have been improved by checking possible extrema with both `calc.diff` and
  `calc.xpdiff`.

- The new `dimension` baselib function creates sparse vectors and sparse matrices with arbitrary index ranges.
  An optional initialiser may be given, too.

- `calc.zero` now sorts its return and also uses a fall-back method to improve results.

- The new `tables.entries` function returns all elements (not the keys) of a table in a new table array.

- When printing tables at the console, the output is now sorted in ascending order of the keys.

- When printing sets at the console, the output is now sorted.

- The Windows installer has been improved, supports multi-user setup, and also offers to copy the Agena include
  files to your disk.


0.30.0, January 01, 2010

- In all OS versions, Agena now supports multi-user configurations by searching for an (optional) initialization
  file in the user's home folder at programme start-up.

  In UNIX, the system environment variable HOME points to the user's home folder. Since in Agena for UNIX the personal
  initialization file is called `.agenainit`, the file path is $HOME/.agenainit.

  In Windows, the system environment variable UserProfile points to the user's home folder, the personal
  initialization file is called `agena.ini`, thus the file path is %UserProfile%/agena.ini.

  In OS/2 and DOS, if the system environment variable HOME or USER exist, and one of these variables point to the
  user's home directory, Agena tries to read the user's personal initialization file `agena.ini` (thus the file
  path is either %HOME%/agena.ini or %USER%/agena.ini if HOME is unassigned).

  Agena still first tries to read the agena.ini file in the main Agena folder before looking for the personal
  initialization file.

- for/to loops now automatically use an advanced precision algorithm (an adaption of Kahan summation) if the step
  size is non-integral: This in many situations prevents Agena from stopping iteration before the last iteration
  value has been reached (try "for i from -4 to -3 by 0.1" in previous versions). Also Agena in most cases does not
  return for/to-iteration values with roundoff errors any longer.

- The new `nseq` baselib function returns a sequence of numbers over an interval with a given step size. The
  return is much more precise with step sizes that are not integers by using the same new algorithm used in
  for/to loops.

- `gdi` now has a function to significantly increase the performance of the package: `gdi.autoflush` allows to set or
  unset autoflush mode. The latter gives quite a performance boost on x86 based systems.

- The new `gdi.mouse` function returns information on the current position of your mouse and its button state.

- The new function `gdi.system` sets the user's coordinate system and its scalings.

- The new 'mouse' options to `gdi.plotn` prints the current position of the mouse to the console. Click the right
  mouse button to finish.

- `binio.sync` corrupted files. This has been changed.

- The -p command-line switch to set the path to an alternate main Agena library folder did not work any
  more. This has been fixed.

- The -n command-line option suppressed loading the main Agena library file. This has been changed.

- `calc.minimum` and thus `calc.maximum` missed some possible extrema, this has been changed. The procedures
  sometimes also returned a point multiple times. This has been fixed, as well.

- `calc.fseq` now uses the Kahan summation algorithm to prevent (or at least minimize) roundoff errors. Before,
  right borders have not been processed in certain situations, and elements inserted had roundoff errors.

- `calc.fsum` now uses a modified Kahan algorithm conceived by Kazufumi Ozawa which is more precise than the
  original one.

- Patched `calc.fminbr`, such that if a minimum is exactly at one of the given borders, the border is returned.
  Thus, the results of `calc.minimum` and `calc.maximum`, which use `calc.fminbr`, have been improved, as well.

- `gdi.plotfn`: In case of errors, the function now tries to prevent to open empty windows. Plotting axes and
  labels has been improved, as well.

- When printing sequences, Agena sometimes printed a comma and a blank right after the last value at line
  breaks. This has been fixed.


0.29.3, December 25, 2009

- `readlib` and `with` now also check the folder pointed to by `mainlibname` for Agena libraries. The new
  search sequences are: current working directory, mainlibname, libname. `readlib` outputs the search sequence
  on the console if the last argument is `true`.

- Added `labels`, `xscale`, and `yscale` options inspired by the TI-84 calculator to `gdi.plotfn`. Plotting
  of the `0` label has been improved, as well.

- The new `tables.allocate` function sets the specified keys and values to a table.

- Standardized error messages in all packages.

- `map`, `select`, and `remove` did not work correctly in some cases with table arrays, and always did not
  work correctly with dictionaries. This has been fixed.

- `maptoset` crashed Agena if called with a dictionary. Also it did not work correctly with some sorts of
  table arrays. This has been fixed.

- As previously documented, `zip` did not work with dictionaries. This has been changed.

- `linalg.checkvector` might have crashed if anything but a vector has been passed. Although this error
  never occurred, a fix has been provided.


0.29.2, December 21, 2009

- The new `gdi.setoptions` function checks the given plotting options (all key~value pairs) for
  correctness and sets them as the respective defaults for subsequent calls to the `gdi.plotfn`
  function.

- Positioning of tickmarks and labels by the `gdi.plotfn` function has been improved significantly.
  Also treatment of poles and of errors is now more elaborate. The new axes styles 'boxed' and 'frame'
  are also available.

- The old bitwise operators `band`, `bnot`, `bor`, and `bxor` have been removed. Use `&&`, `~~`, `||`,
  and `^^`, respectively.

- Updated the Quick Reference XLS file.

- Small modifications to the ldebug.* and lvm.c files for Agena to compile properly with current Linux
  distributions, e.g. OpenSUSE 11.2 and Ubuntu 9.10.


0.29.1, December 13, 2009

- The new `gdi.plotfn` function plots graphs of one or more functions. You have full control on how the graphs
  will look like by specifying one or more individual options (e.g. colours, line styles, etc.).

- The `case` statement did not work properly with indexed values within nested procedure calls of level 3 or higher.
  This has been fixed.

- Included Lua 5.1.4 patch 6 to the sources. This prevents the garbage collector to get stuck during parsing and
  forces proper resizing of the string table, to speed up performance.

- `gdi.dash` now accepts only numeric values >= 1 in the dash sequence to prevent error messages.


0.29.0, November 29, 2009

- The Solaris, Linux, and Windows editions now feature graphics. You may plot points, lines, rectangles, etc. with
  the `gdi` package to a window, or to a PNG, GIF, JPEG, PostScript, or FIG file.

  The gdi package is a port to the g2 package written by Ljubomir Milanovi and Horst Wagner.

- The Windows, OS/2, and DOS editions of Agena are now shipped with the following optimized mathematical
  functions for real arithmetic that are 10 % to 110 % faster than before by linking to Assembler inline code:
  arccos, arssin, arctan, sin, cos, cosh, tan, ln, exp, entier, sqrt, and exponentiation operators,
  as well as math.arctan2 and math.irem.

- The new `calc.fprod` function computes the product Prod(f(x), x=a..b) = f(a) * ... * f(b).

- The new `math.fma` function performs floating-point multiply-add. This is the operation (x * y) + z, with the
  intermediate result not rounded, so that the precision of a calculation is improved.

- The new `calc.maximum` function returns possible maximum locations of a univariate function.

- The procedure returned by `calc.interp` now issues a proper error message if called without arguments or
  a wrong type.

- The `pop left/right` statement has been removed. Use `pop bottom/top` instead.

- The `try .. as` statement has been removed. Use `try .. ::` instead.

- The `..` operator has been removed. Use the `&` operator instead.

- The `gammaln` keyword has been removed. Use `lngamma` instead.

- The `left` and `right` operators no longer support sequences. Use the `bottom` and `top` operators, respectively.

- `readlib` supports a new option (`true` as last argument) that makes it both quit and print some diagnostics if a
  corrupt C library has been found.

- The Solaris, Linux, Windows, DOS, and OS/2 binaries are now published under the GNU GPL, version 2 or later.
  The source files are still distributed under the MIT licence. The Windows installer no longer includes the
  source files.


0.28.2, November 20, 2009

- `math.besselj` and `math.bessely` now work in the complex domain. The code has been implemented in C
  with the Solaris, Windows, Linux, and OS/2 editions, and in Agena itself with the ANSI edition
  (e.g. the DOS version).

- The new `try <variable> [, <variable>] :: <type>` syntax for checking variables for a specific type
  is equivalent to the existing try .. as statement, which will be deprecated in the next major release.

- Added the Euler-Mascheroni constant `EulerGamma` with EulerGamma = 0.57721566490153286061.

- By default, complex values close to zero are no longer printed as just `0` at the console, i.e. the
  environment variable _EnvPrintZeroedCmplxVals by default is now unassigned. You may change this
  behaviour by editing the lib/library.agn file (see bottom of this file).

- The new `os.isANSI` function checks whether Agena has been compiled with the LUA_ANSI switch. It returns
  true or false. Internally, this new function is used to provide functions that have been written in
  the Agena language itself in the ANSI (and thus DOS) edition of Agena, that otherwise have been implemented
  in C in Solaris, Windows, Linux, and OS/2.

- The new `mainlibname` system variable points to the main Agena library (e.g. `/usr/agena/lib`).

- `io.open` now always issues an error if it fails. The _EnvIoForceError setting is no longer supported by
  the function.

- The `getmeta` and `setmeta` aliases have been removed. Use `getmetatable` and `setmetatable` instead.

- If an error occurred in a calculation including complex values, error messages had been deceiving. This
  has been changed.

- `os.list` issued an error if called with no argument and if the current directory was the root directory.
  This has been changed.

- `math.erf` now works with complex numbers in the DOS and ANSI editions.

- The Solaris and Linux installers now print the main locations of the files that have been installed
  before (/usr/agena and /usr/local/bin).


0.28.1, November 10, 2009

- The Windows installer now installs Agena for all users, not only the Administrator, such that a
  programme group for Agena will appear in the Explorer menu for all users.

- The Debian installers now prints information on how to set the AGENAPATH system variable.

- `anames` now also checks for user-defined types.

- The `pop` statement now suppports the keywords `top` and `bottom`. `pop top from a` is equivalent
  to `pop right from a`. `pop bottom from a` is equivalent to `pop left from a`. `pop left` and
  `pop right` will be deprecated in the next major release.

- The new `bottom` and `top` operators return the first and the last item in a sequence and thus
  work like the current `left` and `right` operators. The `left` and `right` operators will not work
  on sequences any longer in the next major release.

- `lngamma` and `math.erf` now also work in the complex domain.

- The `gammaln` operator has been renamed to `lngamma`. The old keyword will be deprecated in the
  next major release. The '__gammaln' metamethod has been renamed '__lngamma', the old name
  can no longer be used.

- Some minor internal optimizations regarding internal memory usage to the following operators and
  statements when applied on sequences: `intersect`, `minus`, and `unique` operators, `delete` statement.

- Some minor internal optimizations regarding internal memory usage to the following operators when
  applied on sets: intersect and minus.

- The speed of the `delete` statement with sequences has been increased by 4 %.

- With very large sequences (size -> 2,147,483,647 items), it was possible that Agena would have
  crashed while inserting further elements. This has been fixed, although I could never prove this
  potential bug.

- All editor scheme files distributed with Agena have been updated.


0.28.0, November 01, 2009

- Parameter lists of procedures now accept names of user-defined types (see `settype`).

- Multiple indexes can now be separated by commas, e.g. a[1, 2] is equal to a[1][2].

- The new `instr` operator searches for substrings within a string, supports regular expressions
  in the search pattern und also optionally starts from a given position in the string. It is
  twice as fast as strings.find. The function was named after a similar function in the Sinclair QL.

- The new `subs` function substitutes values in tables, sets, and sequences.

- The new formatting function _EnvPrint.Procedure has been added to allow the user to control how
  procedures and procedures with a user-defined type are output at the console.

- The new `&` operator concatenates strings. The current `..` concatenation operator will gain a new
  meaning in one of the coming releases, so it is advised to no longer use it.

- The bitwise operators `band`, `bnot`, `bor`, and `bxor` have been renamed to `&&`, `~~`, `||`,
  `^^` to resemble the bitwise operators on the Sinclair QL and vaguely in C. The old bitwise operators
  (`band`, etc.) are still supported for backward compatibility but will be deleted in one of the
  coming major releases.

- The garbage collector inadvertently deleted user-defined types. This has been fixed.

- `map` and `select` did not copy user-defined types to the new sets. This has been fixed.

- `remove` did not copy user-defined types and metatables with tables and sets. This has been fixed.

- The C API function agn_setutypestring has been removed. Use agn_setutype instead.


0.27.2, October 14, 2009

- The new `toSet` baselib function converts a string into a set of its characters, and a table or
  sequence into a set.

- `io.readlines` has been patched to process lines with more than 2048 characters. The function
  now also issues an error if internal memory allocation fails. Internal buffer size has been
  decreased from 2048 bytes to 512 bytes. You may change this by assigning another value to
  AGN_IOREADLINES_MAXLINESIZE in the agnconf.h file.

- `io.readlines` now also accepts file handles. When using file handles, as opposed to file names,
  please note that you must close the file manually after using `io.readlines`.

- `io.readlines` no longer returns an empty table if the file does not exist. Instead, it issues
  an error.

- `toSeq` now returns an error instead of `fail` if it does not receive a string, set, or table.

- The baselib function `used` has been extended and can return memory usage in bytes, kbytes, and gbytes.
  It is a C function now.

- The undocumented `gcinfo` function has been deleted. Its functionality has been taken by `used`.

- The new C API function agn_usedbytes returns the number of bytes used by the system.

- Corrected wrong error message of `toTable`.

- Renamed C AOI function `agn_isioforcerror` to `agn_isioforceerror`.


0.27.1, October 11, 2009

- `xor` has been extended to check for non-null and null constellations so that they can also process
  non-boolean values similar to the and, or, and not operators.

- Expressions like 'text'[1] and 'test'$(1) are now supported by the parser. Before, the string first
  had first to be stored to a name in order to subscript it.

- The manual has been updated. Also, a crash course has been added to the doc directory.

- The C API functions agn_ncall and agn_ccall now issue an error if the type of return of the Agena
  function call is not a number or complex value, respectively. This affects calc.fseq and calc.fsum.

- The C API function agn_ccall is now also available for the strict-ANSI and the DOS versions of Agena.

- The strict-ANSI versions of Agena, and the DOS and OS/2 versions do not try to initialise external/
  dynamic C libraries any longer.

- Provided a separate makefile to compile the strict-ANSI versions of Agena (compiled with the LUA_ANSI
  option) so that the stats, calc, linalg, and ADS packages can now be used (they are now compiled into
  the Agena executable). Before, these packages could not be used in the strict-ANSI versions of Agena.
  See the `makefile.ansi` for instructions on how to compile under GCC.

- Improvements to the Linux installers: at uninstall, all the Agena directories are now deleted. The RPM
  installer now also prints a hint at installation to properly set the AGENAPATH environment variable.

- Improvements to the Solaris installers: the PKG installer now also prints a hint at installation to
  properly set the AGENAPATH environment variable.


0.27.0, August 30, 2009

- Added the error function math.erf, and the complementary error function math.erfc.

- Added the Bessel function of the first kind math.besselj, and the Bessel function of the second
  kind math.bessely. The order is given by the first argument, the argument as the second argument.

- If the new environment variable _EnvIoForceError is set to a non-null value (the default), the io.open,
  io.readlines, and the various binio functions quit with an error instead of just returning fail.

- binio.readbytes and binio.readchar returned an empty sequence instead of fail in case the file to be
  read did not exist. This has been changed: fail or an error is now returned, depending on the setting
  of _EnvIoForceError.

- Added the new C API function agn_isioforcerror which checks whether _EnvIoForceError has been set
  to a non-null value.

- arcsin and arccos are now operators and thus around 40 % faster.

- Added the `xor` operator which performs a Boolean exclusive-OR on values which evaluate to or are true,
  false, fail, and null.

- Added the `atendof` operator which checks whether a word ends in a given phrase and returns its position as
  a number. The operator returns null if the strings have the same length, at least one of them is the empty
  string, or the word does not end in the given pattern.

- As opposed to the manual, `abs` returned 2 for fail. Now it returns -1, as documented.

- `hasrtable` now only returns true, if it has a read-write remember table (updated by the return statement).

- The new function `hasrotable` determines whether a function has a read-only remember table (that cannot be
  updated by the return statement) and returns true or false.

- The new operators `gethigh` and `getlow` retrieve the higher and the lower bytes from a number (i.e. C double).

- The new operators `sethigh` and `setlow` set the higher and the lower bytes to a number (i.e. C double).

- The new operators `band`, `bor`, `bxor`, and `bnot` conduct bitwise and, or, exclusive-or, and complementary operations
  on numbers.

- The bits package has been removed.

- The new `kernel` function configures settings of the Agena kernel. Currently it can change the way the bitwise
  operators internally work (usage of signed or unsigned integers), and how numbers are printed.

- With real numbers x, math.argument now returns Pi instead of 0 if x < 0.

- Because of a bug in the underlying ANSI C library functions on UNIX systems, arcsin and arccos produced wrong
  results with complex numbers if their imaginary part was zero. This has been fixed.

- math.isPrime reported false with number 2. This has been corrected.

- The new C API function agn_setbitwise determines whether the operators band, bor, bnot, bxor, and
  shift internally calculate with either signed or unsigned integers.

- The new C API function agn_getbitwise returns the mode set by agn_setbitwise.

- The new C API function agn_setdigits sets the number of digits used for printing numbers.

- The new C API function agn_getdigits determines the number of digits used for printing numbers.

- Internal: Removed deprecated "REPL" entry from luaP_opnames.

- The Windows installer has been improved by now checking for a previously installed version of Agena,
  preventing that the installer is started if another instance of it is already running, and some
  other small improvements.


0.26.4, August 21, 2009

- The new `math.fraction` function splits a number into its numerator and denominator.

- The new `math.nextafter` procedure returns the next machine floating-point number of its argument
  in a specified direction.

- `calc.fseq` has been extended to accept an optional step size.

- The new `calc.minimum` function returns possible minimum locations of a univariate function.

- `math.approx` returned wrong results with GCC compiled binaries because of a buggy C library function (fmax).
  This has been fixed. `math.approx` now uses a combination of a simple distance measurement for values near 0,
  and the approximation algorithm already implemented for comparing larger values.

- Version information and an icon are now compiled into the Windows binary.

- Added --large-address-aware switch to the Makefile in a hope that correct values for free physical
  RAM are returned in the Windows versions of Agena on computers with > 2 GBytes RAM and <= 4 Gbytes.


0.26.3, August 16, 2009

- Minor improvements of the error messages issued by `io.write` and `io.writeline`.

- Revised the manual and included examples for the io, calc, and linalg packages.


0.26.2, August 13, 2009

- Agena quits in Windows if a line beginning with a hash and ending with a colon has been entered.
  This has been fixed.

- An input like:
  > for i to 10 do
  >    print(i)
  >    i:
  > od;
  confused the stack. Now a syntax error is issued if a value shall be printed using the colon notation
  and if the colon notation is not used in the first line of input.

- A complex division by 0+0*I now returns `undefined` on all platforms.


0.26.1, August 11, 2009

- `toNumber` now also converts strings with complex values into genuine complex values.

- Extended `math.approx` to compare complex values, as well.

- Patched `math.approx` to return correct results.

- Patched `math.arccosh` to return correct results if its argument x is in [-infinity, 0].

- The `ln` operator returned `-infinity` instead of `undefined` if its argument is 0+0*I. This has been
  fixed.

- `math.arccoth` returned wrong results if its `real` argument x was less than 1 or x = -1+0*I or
  x = +1+0*I. This has been fixed.

- Patched `math.ceil` to work correctly with real numbers.

- The `gammaln` and `int` simply returned their argument if it were not a number. Now these operators
  return an error if no metamethods have been defined.

- Fixed an issue when compairing a number and a complex values that are both `undefined`.  In this
  case, the equality check returned `false`. Now `true` is returned.

- `math.binomial` now returns `undefined` if at least one of its arguments is not an integer.

- Patched `math.gcd`: If at least one of its argument is not an integral number, the function now returns 1.

- Patched `math.lcm`: If its second argument is 0, 0 is returned instead of `undefined`.

- Patched `max` and `min`: If the functions received an empty sequence, Agena crashed. This has been fixed.
  The functions now in general return `null` if they receive an empty table or sequence.

- `stats.median` crashed if it got an empty sequence. This has been fixed.

- Fixed crippled error message of `math.root`.


0.26.0, August 10, 2009

- The built-in module system inherited from Lua has been largely removed. The `require`, `module`,
  `seeall`, and all the other functions of the Lua `package` module are not available any longer.
  (`require` did not work in Agena due to faulty file path assembly, anyway.) Use readlib instead.

- `readlib` and `with` now first try to find a library in the current working directory. If this
  fails, then libname is traversed. Also packages loaded are now registered in the `package.loaded`
  table.

- The ' and " characters to denote strings now do have the same meaning. If you use a single quote to
  enter multline strings, backslashes to denote the end of a line are no longer needed.

- Changed behaviour of the split operator if its left-hand operand is equal to the right-hand operand
  or if the right-hand operand is the empty string: In these cases an empty set is returned instead of
  a sequence of two empty strings, or an error message, respectively.

- The functionality of the former C library function `strings.put` has been added to the `replace`
  operator, which is twice as fast. An alias for the old function name is available so that you can
  still use it (but at the expense of the speed gain).

- The new `os.drives` function returns all logical drives available to the local computer (OS/2 and
  Windows only).

- The new `os.drivestat` function returns information on a given logical drive on the local computer
  (Windows only): file system, label, total size, free size, and drive type (fixed, removable, etc.).

- The structure of the output of `os.fstat` has been changed, and the amount of information
  it determines has been increased. Additional returns are:
  - File attributes as an integer (C type mode_t), indexed with the key 'perms'.
  - File attributes as a string similar to that in UNIX, e.g. '-rw-rw-r--:-----', indexed with
    key 'bits'.
  - In OS/2 and Windows, the file attributes 'hidden', 'readonly', 'archived', and 'system' are also
    returned in the subtable with key 'owner'.
  Changes to the table returned by `os.fstat`:
  - File mode is now indexed with key 'mode' (formerly key 1).
  - File size is now indexed with key 'length' (formerly key 2).

- The new function `os.fattrib` changes the file mode using symbols known from UNIX or DOS instead of
  asking for octal numbers. The Windows and OS/2 versions also support OS-specific hidden, archived,
  readonly, and system file attributes.

- `os.beep` has been extended for the UNIX and DOS versions of Agena and now accept the number of seconds
  the loudspeaker shall issue a sound.

- Added Lua 5.1.4 patch 5 of `debug.getfenv` to the codebase.

- If the new environment variable _EnvLibnameReset is set true, then the `restart` statement resets
  libname to its original value defined in the OS environment variable AGENAPATH.

- `readlib`, `loadClib` and `with` now add the packages loaded to the `package.readlibbed` set.


0.25.6, August 08, 2009

- `os.remove` and `os.move` returned true even if the file to be moved or deleted did not exist. This has
  been changed.

- In Windows and OS/2, `os.fcopy` now correctly sets all OS-specific file permission attributes of the
  original file to the new file.

- In Windows, `os.memstate` stated the same value for total virtual and total physical memory sizes. This
  has been fixed.

- When printing structures, ANSI C NaN values (Not a Number, known in Agena as `undefined`) were printed
  in the C fashion, e.g. `1.#QNAN`. This has been changed.

- In the OS/2 version, Agena now prints the number of free virtual RAM in kBytes at start-up.

- `os.freemem` is now supported in the OS/2 version of Agena and returns the free virtual RAM.

- At start-up, the Agena welcome message is now printed before the library.agn and agena.ini files are loaded.


0.25.5, August 05, 2009

- The split operator now supports delimiters that consists of more than one character, i.e.
  'agena::language' split '::' -> seq('agena', 'language'). Also, Agena does not crash or run out of
  memory any more if an empty string is passed for the delimiter.

- Changed Agena initialisation to allow switches to work as expected:
  First, libname is assigned. Second, the library.agn and agena.ini files are read; and third, program
  options are run.

- When printing complex values that are elements in structures (tables, sets, sequences, pairs), Agena
  issued an error. This has been fixed.


0.25.4, August 01, 2009

- If `libname` included more than one path, then the readlib function printed misleading error messages in
  case a package could not be found while traversing `libname`. (The library could be initialised properly,
  however.) This has been fixed. Also improved error handling when trying to read non-existing linked C
  libraries or when executing Agena library files that are syntactically incorrect.

- Optimised function `toTable` a little bit.

- `stats.median` crashed with tables. This has been fixed.

- `stats.minmax` now returns fail if a sequence or table with less than two elements has been passed.


0.25.3, August 01, 2009

- Pairs can now be indexed in read operations with the integers 1 and 2.

- The manual has been updated. Especially, Chapters 4.6 (Arithmetic), 4.7 (Strings), 4.10 (Sets), and
  Chapter 4.11 (Sequences) have been revised.

- A mimetype language description file `agena.lang` has been added to the /schemes folder.

- All installers unfortunately overwrote the existing agena.ini file during installation. This has
  been changed.

- Renamed the following linalg functions: isantisymmetric to isAntisymmetric, isdiagonal to isDiagonal,
  isdiagonal to isDiagonal, isidentity to isIdentity, ismatrix to isMatrix, issquare to isSquare,
  issymmetric to isSymmetric, and isvector to isVector. Aliases for the old function names are available
  so that you can still use them.


0.25.2, July 28, 2009

- The for/in loop now also accepts the null value. In this case, the loop does nothing, and Agena proceeds
  with the statement following the loop.

- The `os.fexists` function has been renamed to `os.exists` to show that the function checks for the
  existence of files _and_ directories. The old function name (os.fexists) can still be used via an alias
  automatically loaded at startup of Agena via library.agn.

- The `biniolib.c` C source file has been renamed `binio.c`.

- The manual did not mention that for/in loops can also work on iterator functions. This has been changed.
  Also Chapters 4.9 (Tables) and 4.10 (Sets) have been revised.

- The readme.os2 file has been updated with correct instructions regarding additions to config.sys.

- The attrib function sometimes did not correctly determine whether a table array contained holes. Thus
  printing table arrays containing holes sometimes produced wrong output, i.e. the keys where not printed
  at the console. This has been fixed.

- If you set _EnvLongTable to true, then Agena did not print an empty line above the next prompt. This
  has been fixed.


0.25.1, July 26, 2009

- The number of bytes to be read by `binio.readbytes` could only be given by the environment variable
  _EnvBufferSize. This has been fixed - the user can now specify the number of bytes to be read with
  the optional second argument.

- `os.chdir`, `os.rename`, `os.rmdir`, `os.remove`, and `os.mkdir` issued wrong returns but did their
  job correctly: in case of a failure, the functions returned true instead of fail. In some
  other cases - depending on the operating systems - it returned fail even if there were no
  errors. This has been fixed.

- The `os.rename` function has been renamed to `os.move` to intuitively show that the function can rename a
  file and also move it to a new location on the file system. The old function name (os.rename)
  can still be used via an alias automatically loaded at startup of Agena via library.agn.

- The `os.fstat` function now also determines file and directory permissions (read, write, execute rights).
  In case of an error, the function returns fail instead of an empty table.

- The `os.fcopy` function now also sets the file permissions of the original file to the new file.

- A WarpIN installer is now provided for the OS/2 release of Agena.


0.25.0, July 19, 2009

- Added the `binio.readbytes` and `binio.writebytes` functions which read and write a sequence of bytes,
  respectively. Both functions are much faster than `binio.readchar` and `binio.writechar` when working
  on a larger number of bytes.

- Added the `os.fcopy` function which copies files. It has been implemented in C to ensure maximum
  performance. The user has some control by changing the internal buffer size with the new environment
  variable _EnvBufferSize.

- For simplicity, the enviroment variable `_EnvAgenaPath` has been renamed `libname`.

- The enviroment variable _EnvPrintNewLineAfterInput has been renamed _EnvPrintEmpyLine, because the
  former name was somehow confusing.

- `os.md` has been renamed to `os.mkdir`, `os.rd` to `os.rmdir`, `os.rm` to `os.remove`, `os.cd` to
  `os.chdir`, `os.ls` to `os.list`, `os.pwd` to `os.curdir` and `os.lscore` to `os.listcore`. For
  backward compatibility, aliases have been added to the library.agn file so that the old names can
  still be used.

- The `isnull` operator has been deleted. Use the `unassigned` operator instead.

- The `bottom` and `top` keywords have been deleted. They have been substituted by `left` and `right`,
  respectively. Thus, now use `pop left from ...` instead of `pop bottom from ...`, and `pop right from ...`
  instead of `pop top from ...`.

- The `getbottom` and `gettop` operators have been deleted. They have been substituted by the `left`
  and `right` operators, respectively.

- Some few optimizations to the C source code.

- Added updated nedit.rc scheme for the nedit text editor to the Solaris installer.

- The agena.ini is no longer shipped with the installers to prevent overwriting your own personal
  agena.ini file when updating Agena to a new release. Instead, the agena.ini.sample file is distributed
  which you may rename to agena.ini to play with the initialisation feature.

This Release also includes the following bug fixes available in the 0.24.3 library update 1 pack:

- Tuned `tables.bisEqual`, `tables.bminus`, `tables.bintersect` and `tables.duplicates` by not deeply
  copying its arguments if they do not need to be sorted internally.

- Tuned `tables.duplicates` by 8 %.

- File and directory names returned by `os.list` are now sorted. Also, the * magic character is now
  interpreted correctly (one or more repetitions). `os.list` now recognises the ? magic character
  in file names (exactly one character of any type).


0.24.3: July 11, 2009

- `io.write` and `io.writeline` sometimes crashed Agena if called without arguments within procedures.
  This has been fixed.

- If a structure (table, set, sequence, or pair) contains another structure with a circular reference,
  then Agena issues an error when printing the contents of the structure with print because of stack
  overflows. This has been fixed.

- If _EnvLongTable is true then when printing _G, the last but one and the last entry were printed on
  the very same line. This has been fixed.


0.24.2: July 05, 2009

- Settled problems with stack overflows when printing self-referencing structures on the console.

- The `iolib` package now provides the __tostring metamethod to properly print file handles
  returned by io.open (`file(xyz)` instead of `userdata(xyz)`). The __gc metamethod has also been
  added to the iolib package.

- `tables.bisEqual`, `tables.bminus`, and `tables.bintersect` now do not modify their arguments
  in case they need to be sorted internally.

- Included Lua 5.1.4 bug fix #3: Wrong code generation for some particular boolean expressions.
  Example: "print(((1 or false) and true) or false)"   --> 1, but should be 'true'. This has been
  fixed.

- Included Lua 5.1.4 bug fix #4: luaV_settable may invalidate a reference to a table and try to
  reuse it. This has been fixed.


0.24.1: July 04, 2009

- for/in iteration over strings is now up to 10 % faster.

- for/in now returns a proper error message if the object to be iterated is not a structure or a
  procedure.

- Tweaked for/in iteration over sequences a little bit (max. 1.5 % faster).

- `os.ls` now supports jokers within paths. Thus you may select subsets of files in a directory,
  e.g. "os.ls('*.c')" to select all files with suffix '.c'.

- All dump/undump functions inherited from Lua were deleted. Thus, strings.dump is no longer
  available.

- `binio.open` no longer evaluates the _EnvVerbose setting and thus ignores it.

- Removed support for an experimental second ADS sequence type from the ads package.

- Removed the following unused C API function: agn_isutype.

- Optimized internal type check for remember table value insertion.

- Optimized internal type check in set comparisons (=, subset, xsubset).

- If the pop statement encountered an error, a wrong line number has been displayed. This has been fixed.

- The pop statement could sometimes not be used within procedures. This has been fixed.


0.24.0: June 27, 2009

!!! Important note !!!

  If you have been a user of earlier versions of Agena and should have already defined an AGENAPATH
  environment variable on the operating system level, please append the substring '/lib' to the
  AGENAPATH:

  An example in UNIX:

  Before: export AGENAPATH=/export/home/agena
  After:  export AGENAPATH=/export/home/agena/lib

  An example in OS/2, DOS, and Windows:

  Before: export AGENAPATH=d:/agena
  After:  export AGENAPATH=d:/agena/lib

- Introduced the new `unassigned` operator that will replace `isnull` in the future. It is advised
  that you exclusively use `unassigned` in your code. This is a language consistency measure. The
  `isnull` operator will be deprecated.

- Added facilities for stack programming. They exclusively operate on sequences:

  1) The `pop bottom from` statement deletes the entry with the smallest key (acually key 1), thus
     popping the first entry from the stack and shifting all other elements down.
  2) The `pop top from` statement deletes the entry with the greatest key, thus popping the top entry
     from the stack.
  3) The `getbottom` operator returns the entry with the smallest key in a sequence, thus returning the
     entry on the bottom of the stack.
  4) The `gettop` operator returns the entry with the greatest key in a sequence, thus returning the
     entry on the top of the stack.

  (With the already existing insert/into statement you can put a value on top of a stack.)

- Agena now provides a means to read user-specific initialisation, standard library and package files from
  different locations. The environment variable _EnvAgenaPath can now contain one or more paths separated by
  semicolons, e.g. 'd:/agena/lib;c:\programme\agena\lib'. Agena searches all paths in _EnvAgenaPath at
  initialisation or when invoking a new package:

  1) The way Agena reads the library.agn and agena.ini files at initialisation and in case of a restart has
     changed: Agena searches all paths in _EnvAgenaPath from the left to the right for the above mentioned
     files. If it finds one and can execute it successfully, then all paths left in _EnvAgenaPath are skipped
     for the processed file.
  2) The `readlib` and `with` functions search all paths in _EnvAgenaPath from the left to the right for the
     package files. If a package could be loaded successfully, then all paths left in _EnvAgenaPath are skipped.
     `readlib` continues with finding and loading other packages, if their names are given to the function as
     optional arguments.

- `readlib` no longer accepts full filenames as input, e.g. `/usr/agena/lib/calc.agn'. Use `run` instead.

- If a package exists of both a C DLL/SO file and an Agena text file, then `readlib` and `with` now expect them
  to be stored in the very same folder; otherwise, a package may only be partially initialised. This behaviour
  has been introduced to avoid confusion of the programmer.

- The Windows version now has a further fallback if it cannot find the system environment variable
  AGENAPATH during initialisation: It searches for the Agena main library folder by querying the Windows
  `ProgramFiles` system environment variable, and tries to set _EnvAgenaPath to it if the user has read access
  permissions. In UNIX, _EnvAgenaPath now is set to /usr/agena/lib only if the user has read permissions for this
  folder.

- If _EnvAgenaPath could not be determined at startup, Agena now enters into interactive mode instead of
  just quitting. A proper help text is displayed to help the user with reconfiguration.

- The facility to read a configuration file at startup by querying the "LUA_INIT" system environment
  variable has been removed, as in most cases you would have problems if Lua is installed on your system
  and the variable is set to be used by Lua.

- The new C API function agn_tostring converts a stack value to a value of C type const char*.

- Fixed a bug that reset _EnvAgenaPath when running `restart`.

- 'binio.open' and 'ads.openbase' now issue a proper error message if the user does not have
  the proper rights for files that already exist.

- `io.fexists` now only returns true if the file exists and the user has at least read permissions for this file.

- Updated scheme files for Proton and Nedit.


0.23.0: June 15, 2009

- `math.sinh`, `math.cosh`, and `math.tanh` have been deleted. Use the new operators `sinh`, `cosh`,
  and `tanh` operators instead, which are 40 % faster.

- The new `float` operator checks whether a number is a float, i.e. not an integer.

- The new `strings.isLatinNumeric` function checks whether a string consists entirely of numbers
  or Latin letters and returns true or false.

- The new `math.convertbase` function converts a number or a number represented as a string from
  one base to another base.

- The `userinfo` baselib function has been transformed to a C library function. It is now four
  times faster. Also, it does not print tabs between values any longer.

- Fixed a bug in the `restart` statement that creepingly increased the stack with some unwanted
  side effects in error messages or when executing restart's in a loop.

- The Windows installer now should work flawlessly with Windows 7 Beta due to a migration to NSIS 2.45.


0.22.2: June 12, 2009

- Added the `bits` package providing four functions for bitwise integer manipulation.

- Rewrote math.irem so that large numbers are treated correctly and are not affected by internal
  overflows any longer.

- The `**` operator has been tuned by at least 30 % when raising complex numbers. It now issues an
  error if the exponent is not a number. If the exponent is an integer in [2 .. 29], it is even three
  times faster than before.

- The precedence of the ! operator to construct complex numbers has been changed from highest to
  `above medium`, i.e. it is now the same as the precedence of unary operators. This means that -1!2
  no longer is -1-2*I, but -1+2*I. The ! operator is still left-associative. Note that `sin 1!2` now
  is no longer `sin(1!2)` but (sin 1)!2. It is advised that you use brackets when applying unary
  operators on complex values.

- The ! operator did not explicitly check its arguments for the number type. This has been changed.

- The `print` function issued an error if a structure contained nulls. This has been changed.

- The `print` function now explicitly flushes any output to the console (to stdout) before returning
  so that text immediately appears on screen (sometimes needed in UNIX).

- `calc.zero` contained a severe bug by not returning all zeros found and also returning results that
  were not zeros. This has been changed.

- The formerly undocumented `userinfo` function did not work as expected. This has been changed.

- `tables.writeTable` has been removed. Use the new `utils.writeCSV` procedure instead, which is more
  sophisticated.

- Added descriptions of the previously undocumented `utils.isLeapYear` and `userinfo` functions to the
  manual.

- The Solaris and Linux installers now store all important Agena header files in /usr/include/agena.


0.22.1: May 31, 2009

- Complex arithmetic is now three to six times faster than before, depending on your machine and
  operating system. Overall performance, however, has decreased by 4 % (i86) to 8 % (Sparc) because
  of this tuning measure, because complex numbers are no longer implemented as a collectable C
  structure, but as a primary data type such as numbers and booleans.

- Read-only remember tables can now also be used by C functions. All remember table baselib functions
  (rinit, rget, rset, rdelete) now also work on C functions.

- `rget` has been extended such that it can return the original rtable along with all hash values. You
  cannot destroy the internal remember table by changing the table returned by `rget`.

- The `==` operator has been generalised to compare all data types, not only tables, sets, and sequences.

- The `==` operator now compares tables and sequences inside other structures strictly, and not the
  Cantor way.

- The `==` operator did not check sequences correctly, this has been fixed.

- Added metamethod handling for the `==` operator (key `__eeq`).

- The '__eq' and '__eeq' metamethods now map the return value `fail` to false, and not true.

- User-defined data types were not properly printed at the console. This has been changed.

- Removed metamethod handling for `shift` operator.

- The new C API function agn_copy returns a true copy of a structure. The copy is put onto the top
  of the stack, but the original table is not removed.

- The new C API function agn_getfunctiontype returns whether a function is a C or Agena function.

- Misc:
  - In order to reduce the size of the OS/2 and DOS distributions and the amount of time it needs
    to build them, the /src directory structure has been changed.
  - The standard source ZIP file now includes special makefiles for building Agena in OS/2 and DOS.
    Thus the OS/2 and DOS ZIP files do not include the sources any longer.
  - Extensions to the NSIS Windows installer.


0.22.0: May 29, 2009

- Summary:

  1) The new `==` operator compares tables, sets, and sequences for strict equality.
  2) Functions can now have read-only remember tables which contain precomputed results for super-
     fast access.
  3) The way Agena prints structures at the console is now completely controlled by Agena procedures
     which you may change to your own needs.
  4) Some other new features and some deletions of functions that have become useless.

- The new `==` operator compares two tables or sequences and returns true if they contain the same
  key~value pairs or entries, respectively, i.e. it does not compare them the Cantor way. It also
  works with sets, but performs the same operations as with the `=` operator.

- Added super-fast read-only remember tables (rotables). Contrary to normal rtables, this special
  rotable cannot be updated by the `return` statement for the sake of speed if a function value could
  not be found in the remember table. Further entries can be added with the `rset` function, however.
  All remember table baselib functions (rinit, rget, rset, rdelete) work on rotables, as well.

- Added the new `defaults` baselib function to lib/library.agn. The function is an easy interface
  to create, return, update, and delete read-only remember tables.

- The `rset` function now does not _add_ an arguments~results pair if the arguments already exist in the
  remember table. Instead, the function now replaces the arguments~results pair originally stored to
  the rtable with the new one. All these changes have been done to the agn_setrtable C API function
  which `rset` interfaces and work with both rtables and rotables.

- All remember table baselib functions (rinit, rget, rset, rdelete) now issue an error if a C function
  has been passed to them.

- The new C API function agn_getrtablewritemode returns whether a function has a remember table and
  whether it is an rtable or rotable.

- The former C math library function `math.fact` has been converted to an Agena function taking
  advantage of the new rotables. The Agena version is as fast as the former C implementation.

- The new `pointer` function returns the memory address of various values as a string. This function has
  been added to support user-defined printing functions (_EnvPrint).

- Introduced the new environment variable _EnvPrintNoNewLine. If it is set true the `print`
  function does not print a newline when it quits, otherwise a newline is printed. This feature
  has been added to support more control for user-defined printing functions(_EnvPrint).

- Added a precautional check for enough stack space in the VM function that compares tables in order
  to prevent any crashes that might occur in weird situations.

- Optimised output of tables with the standard printing method: If a key is a table, then
  all its components are printed instead of the former 'table(memaddress)' format.

- The way the `print` function prints structures (tables, sets, sequences, pairs, and complex
  numbers) at the console has been changed such that it only uses the _EnvPrint functions defined
  in the lib/library.agn file. Internally, all formatting functions written in C have been deleted.
  The ouput, however, completely looks the same as in former Agena versions, as the _EnvPrint
  functions work exactly the same like the former internal C formatting functions.

- The `attrib` function now also indicates whether a table array includes at least one hole.

- The `attrib` function now checks whether a function has a remember table and whether the function is
  a C or Agena function.

- `math.isInteger` and `math.isFloat` have been deleted. Use `x = int(x)` or `x <> int(x)` respectively,
  because they are much faster.

- Improved error handling of the ADS package:
  - If a file contains a sequences, then all respective functions interrupt with an
    error instead of just returning `fail`.
  - `ads.free` returns `fail` instead of `false` if the file has not been opened.
  - `ads.rawsearch` returns `fail` instead of false when the given column does not exist.
  - `ads.createbase` now interrupts with an error instead of just returning
    fail if it received wrong arguments.
  - `ads.comment` now interrupts with an error instead of just returning `undefined` if
    something internally goes wrong when restructuring the file for storing the new
    comment.
  - `ads.clean` now interrupts with an error instead of just returning `undefined` if
    something internally goes wrong when restructuring the file.

- The Solaris, Linux, and Windows installers now contain the nedit and Proton editor language schemes.

- Deleted useless functions in the utils package (`utils.convertText` and
  `utils.convertText2`, plus a mapping table), their functionality is already available
  in the more sophisticated `strings.diamap` function.


0.21.1: May 23, 2009

- Changes to the `linalg` and `calc` packages due to the renamed `utype` operator.

- Type checking in various `stats` procedures has been updated to the new Agena double
  colon syntax in the parameter lists.

- The `ops` function could not be called because of a collision with an unused keyword of the
  same name. This has been fixed.

- `ads.invalids` did not behave properly when receiving a sequence, this has been fixed.

- Various revisions to the manual.

- _EnvWithProtected now is a set and not a table. This avoids that the structure is filled again and
  again with the same protected names when conducting restarts.

- nargs did not count nulls that have explicitly been passed to a function to the right
  of non-null arguments. This has been fixed.


0.21.0: April 26, 2009

- The semantics for the optional type specifier in the parameter lists of functions has been
  changed: If a type specifier has been given, then when calling the function you _must_ pass
  the corresponding argument, else Agena returns an error. This is to avoid executing
  time consuming `if nargs ... ` or `try ... as` statements in the procedure body. Mean
  increase in speed is around 10 %.

- Multiline-strings can now be entered by using double quotes. Contrary to single quotes, no
  backslashes are needed to indicate the end of a line.

- Changed the name of the `utype` operator to `typeof`.

- The `entier` operator and the `math.ceil` and `math.arctan2` functions now also support
  complex numbers.

- The `insert` statement now supports metamethods for tables, sets, and sequences. This also
  means that you can now use the `__writeindex` metamethod with sets, because the `insert`
  statement is the only function besides `rawset` that puts elements into sets.

- The `rawset` function has been extended such that it will insert an element into the next
  free position in a table or sequence if it is called with only two arguments. This is
  quite comfortable if you use the insert statement to add elements into a structure and
  want to use the `__writeindex` metamethod for this.

- The way Agena outputs tables, sets, sequences, pairs, and complex values can now be defined
  by the user via the _EnvPrint function table. See the manual (Appendix A5) for further details.

- Agena can now print tables differently at the console: If the global variable _EnvLongTable is
  not set to true or if it is unassigned, then tables are printed like sets and sequences,
  e.g. [1, 2, 3] (provided you have not defined your own printing routine _EnvPrint.Table, see above).
  If _EnvLongTable is true, then each key~value pair will be printed at a separate line. For
  compatibility with older releases, _EnvLongTable is set to true in the agena.ini file that is
  shipped with this 0.21.0 release.

- The new functions `strings.isUpperLatin` and `strings.isUpperAlpha` check whether a string
  consists entirely of upper-case letters.

- `math.isfloat` and `math.isinteger` have been renamed `math.isFloat` and `math.isInteger`.

- Fixed a bug in the `print` function. If an object to be printed featured an __index metamethod,
  then with a call to `print`, the __index metamethod received a "_G" key which it tried to index.
  This often caused syntax errors with the __index metamethod.

- The `ĂĄ` character was not recognised as a diacritic. This has been fixed.


0.20.2: April 18, 2009

- `binio.open` and `binio.close` could crash Agena if the user deleted the binio.openfiles
  table. The same applied to the corresponding functions in the ads package. This
  has been fixed: if the binio.openfiles or the ads.openfiles tables do not exist or are
  anything other than tables, then the *.open and *.close functions will not attempt
  to write to or read from these (missing) tables.

- `rawget` crashed the interpreter if applied to sets. This has been fixed.

- Improved error messages of `rawget` with respect to sequences and pairs.

- The (faulty) C API function `lua_sget` to check whether an element exists in a set, has been
  deleted. Use lua_srawget instead.

- Improved some error messages if something went wrong at initialisation of the interpreter.

- `setmetatable` can no longer set metatables to complex values.


0.20.1: April 15, 2009

- In some cases Agena 0.20.0 and 0.14.0 crashed if a string had been indexed by square brackets
  to retrieve a character. This has been fixed.

- There were crashes with `strings.seek` and `strings.rseek` if the start position (third,
  optional argument) had been positive or negative, respectively, and if its absolute value
  has been far greater than the actual length of the string.

- Changes to the calc and linalg packages with respect to argument checking.

- os.system now returns `NT 4.0` instead of `NT` for Windows NT 4.0.

- Tuned strings.isEnding (20 % faster).


0.20.0: April 13, 2009

- A parameter of a procedure can now be followed by an optional type specifier preceded
  by a double colon. If a type specifier is given then Agena will issue an error if arguments
  of the incorrect type are passed to the procedure. With multiple parameters, this optional type
  checking is around 14 % faster than an equivalent try statement. An optional type specifier can
  also be given for short-cut procedures.

- Error output at the console has been completely reworked. It now returns more useful information.

- With procedure definitions, the `is` keyword following the parameter list is now optional.

- The `__newindex` metamethod has been renamed to `__writeindex`, as it will always be called
  (if present) even if a key already exists in a structure.

- The new `strings.isAbbrev` function checks whether a string starts with a given substring.

- The new `strings.isEnding` function checks whether a string ends in a given substring.

- The new `strings.remove` function deletes characters from a string.

- The functions `binio.make` and `strings.isMagic2` have been deleted.


0.14.0: April 09, 2009

- The precedence of the colon operator to construct pairs has been changed from very high
  to medium. It has now the same priority as the concatenation operator (`..`), and is still
  right-associative. Thus when passing optional arguments to functions via the option~expr
  syntax, you do not have to use brackets any longer in most cases if expr consists of more
  than one operand.

- Changed semantics of the `__newindex` metamethod: If the structure is a table, then the
  metamethod is always called - regardless of whether the key to which a value shall be
  assigned is already present in the structure or not.

- The dozen operator `d` for numbers has been changed to `D` for consistency with number
  constructors returning a result which cannot be divided by 10. Thus 1D = 12, 2D = 24, ...

- The `with` package initalisation function now support initialisation procedures. If a procedure
  named `<packagename>.init` is present in your package then it is executed if the package has
  been found successfully.

- Strings can now be indexed with square brackets. This will return a single character from the
  string, i.e. str[n] will return the n-th character in string str.  It is around 8 % faster than
  using the str$(n) notation.

- The `insert` and `delete` statements now also process multiple returns correctly. In earlier
  versions, only the first element in a multiple return was inserted or deleted.

- It is now possible to define user-defined types for sets. `gettype`, `settype`, and `utype`
  have been extended to support this new feature. The new C API function agn_issetutype checks
  whether a set is of a given user-defined type.

- Renamed `add` and `qadd` operators to `sadd` and `qsadd`.

- Renamed the baselib `op` function to `ops`.

- Renamed `linalg.vadd` `linalg.vsub` to `linalg.add` and `linalg.sub`.

- Improvements to error messages of `left`, `right`, `real`, `imag`, `char`, `trim`, `upper`,
  `lower`, `unique`, `sadd`, and `qsadd` operators and to the error messages of `seq`, `set`,
  `table`, and `dict` constructors. All the above mentioned operators and constructors now
  return the type actually passed in case of type mismatch.

- The new `strings.rseek` function searches a string from its right end to its left beginning.
  This is useful for example in linguistics to search for inflectional endings.

- `strings.ltrim` and `strings.rtrim` now also trim strings with any given leading or trailing
  character. Before, only white spaces were removed.

- The new `strings.put` function will insert a new string into another string at a given position,
  substituting the character at this position with the new string which consists of zero, one or
  more characters. This function is more convenient than using a mix of substring and concatenation
  operators and is as fast as them.

- The new `strings.words` function counts the number of words in a string. A word is any sequence
  of characters surrounded by white spaces, however, the user can define any other delimiter.

- On Windows systems, the `math.arcsin` and `math.arccos` functions now return complex values
  for their arguments z = x + I*y, if |x| > 1 and y = 0. In former Windows versions, the return was
  `undefined`. On all other operating systems, this extension has already existed, maybe due
  other versions of libm(ath).

- The `wait` function in the utils package has moved to the os package and thus can now be called
  with the name `os.wait`.

- The `binio.open` function has been extended to - besides opening existing files - also create new
  ones. Thus the `binio.make` function will be deprecated.

- The formerly undocumented `binio.sync` function flushes all unwritten content to a file and is now
  described in the manual.

- Changed contents of the global _RELEASE variable. It now a string of the format
  `AGENA >> a.b.c` where a is the major release, b is the subrelease, and c the patch level.
  Also added a new system variable _EnvRelease which is a sequence of the string `AGENA`, the
  number a, the number b, and the number c where a, b, c have the same meaning as mentioned
  in the above format string.

- Changed syntax of `os.beep`: The function can now also be called without arguments. Support for
  both length and frequency information has been added to the OS/2 distribution.

- The new `os.battery` function returns the status of the battery on laptops. It works in OS/2 and
  Windows 2000 or higher, and returns fail on all other operating systems.

- `os.isDOS` now returns false in Windows systems.

- The new `os.isWin` and `os.isOS2` functions check whether Agena is running on Windows or OS/2,
  respectively.

- The `toString` base library function now also handles complex values and pairs: It returns
  its components as two strings.

- `unpack` with tables now determines the number of table array elements differently. This avoids
  for nulls being returned if dictionary elements are also present in the table.

- The new `clock` package adds, subtracts, and multiplies hours, minutes, and seconds.

- Moved the `approx` function from baselib to the math package.

- Tuned `replace` operator regarding sequences.


0.13.4: April 09, 2009

- Fixed a bug in `strings.seek` which ignored negative values for the start position.

- Fixed strings.ltrim which could crash Agena because it flooded the stack with temporary
  values. Crashes occured only if the strings had too many leading spaces.

- `binio.make` and `binio.open` do no longer accept _Agena numbers_ as a first argument (the file
  name) for this might be misleading since the user might confuse it with a numeric file handle.
  Thus the two functions only accept strings (which might include or consists of numbers entirely,
  of course).

- Extended os.isUNIX to identify HP-Unix, AIX, IRIX, and FreeBSD.

- Extended os.isLinux to identify more versions of Linux.

- Extended os.system to also identify Windows Vista, Windows 7, Windows 2003, and Windows 2008 Server.
  In Windows, the function now also returns the internal major (dwMajorVersion) and minor
  (dwMinorVersion) Windows version numbers as well as the product type (wProductType) as further
  entries in the resulting table.

- The `cls` statement is now also supported in the OS/2 version.

- `tables.put` displayed a wrong function name in error messages.

- Fixed a bug in the Windows installer that did not remove the /share subdirectory at uninstall.


0.13.3: April 04, 2009

- Patched `clear` statement: if the arguments were passed in enclosing brackets, a syntax error
  was issued, because the closing bracket was not checked correctly.

- A bug in the `delete` statement with respect to sets has been fixed. When deleting elements
  from a set of more than ten items, not all the elements to be deleted were actually removed
  from the set. The statement worked fine with tables and sequences, however.

- The `insert` and `delete` statements might unnecessarily enlarge the amount of memory needed by
  the stack. Although this behaviour did not show up in 0.13.2 and earlier, this fix was added
  preventatively.

- Substituted the following older Lua C functions in ldo.c with the ones from Lua 5.1.4:
  resetstack, callrethooks, lua_resume, lua_yield.

- Substituted the following older Lua C functions in lstate.c with the ones from Lua 5.1.4:
  preinit_state, lua_close.

- Substituted the following older Lua C structure definition in lstate.h with the one from
  Lua 5.1.4: lua_State.

- A little bit of code cleaning in loslib.c to avoid compiler warnings and errors in case the
  file is compiled in Non-Windows, Non-DOS, and Non-UNIX environments.

- Tuned `toTable` function by removing an unnecessary second type check.

- In OS/2, `os.memstate` now is fully supported and also returns the number of resident pages.

- In OS/2, `utils.wait`, `os.system`, and `io.getkey` are now fully supported.

- Renaming of four basic C header files (lua.h -> agena.h, luaconf.h -> agnconf.h, lauxlib.h ->
  agnxlib.h, and lualib.h -> agenalib.h) in the src directory to support development of additional
  packages. Also renamed lua.c to agena.c. (Agena is based on Lua 5.1 sources.)

- The Solaris and Linux package installers now also add the above mentioned four header files
  to /usr/include.

- The Solaris installer now also includes a libagena.so file.

- The Windows installer now also appends the path to the Agena binary to PATH.


0.13.2: March 24, 2009

- Substituted the following older Lua C functions in agnxlib.c with the ones from Lua 5.1.4
  (lauxlib.c file): getF, luaL_loadfile, luaI_openlib.

- If an error occurs in a procedure loaded from a file with run, readlib, or with, the phrase
  `Error, Error in ..` sometimes had been issued on the console. This has been fixed.

- Fixed the agn_size C function in lapi.c file which could have made troubles if you would
  have changed the #define lua_assert(x)   ((void)0) pragmas in agenalib.h or llimits.h to
  something else and have recompiled Agena.

- In case the `in` operator returns an error because the operands are of the wrong type, there
  was a surplus space in the error message.

- If a function calls itself four times or more, `nargs` sometimes did not return the correct
  number of actual arguments passed to a procedure.

- When loading the ADS package with run, readlib, or with, an error was issued stating that the
  text package could not be found. Thus ads.lookup and ads.search could not work.


0.13.1: March 01, 2009
- Patched C `agnV_try` function executing try statements, in src/lvm.c:

  In scarce situations the try statement prints something like `for (null) `(null)`: ...`
  on the console when detecting that a name is of a wrong type.

- Patched C `db_errorfb` function issuing error messages, in src/ldblib.c:

  Bug 1: If an error occurs in a procedure loaded from an .agn file, the name of this file
         is not printed in the error traceback. Instead, Agena prints the error message
         `... proc(null), line ...`, not indicating the place where the error happened.

  Bug 2: With procedures entered at the console, the line number where an error occured is
         printed twice.

- Patched `with` function, in lib/library.lib:
  Bug 1: If a .dll or .so file of a package <pkgname> has not been found in the lib folder,
         the function does not look into the <pkgname> directory of the main Agena folder
         to find and run it from there.

  Bug 2: If an optional argument is not a string, the error message should be more precise.

  Bug 3: If an optional argument is unassigned, i.e. is or evaluates to null, no warning is
         issued.

  Note that with this fix, the package files (text .agn file and/or binary .dll/.so file)
  must both now reside in either the lib or in the <pkgname> folder.

- Cleaned C code (mixed declarations and code, C++ style comments).

- Changed agnUS_setnum and agnUS_setstr C functions in src/lset.c so that no compilation
  warnings are issued any longer.

The OS/2 Warp 4 version of 0.13.1 features the following changes:

- Adaptations to the source files to support OS/2.

- The os package has been extended to support OS/2:
  a) os.memstate now partially returns status information on memory.
  b) os.login now returns the name of the current user.
  c) os.md, os.beep, and os.wait now work.

- Changed syntax of os.beep in the OS/2 distribution: the function does not require any
  arguments any longer.


0.13.0: January 24, 2009
- First public release
