Version 0.9.13
--------------

A bug which made the interpreter run into an internal error
when a static method from a template called another static
method. Thanks to Sander van Dijk for reporting the bug.

Sander van Dijk also provided a Markov chain example
program that can be found in the examples/ directory.


Version 0.9.12
--------------

The system() library function was changed to return the
raw exit code of the called program. Previously it returned
the value shifted right by 8 bits. This worked on Linux
systems to obtain the exit code used in the called program's
exit() C library call, but could obscure the return value
on different operating systems. Thanks to Sander van Dijk
for making me aware of the problem and reminding me when
I forgot to fix it in the previous release.


Version 0.9.11
--------------

The internal representation of function values was changed
so that the original function name remains available in
an fn value. The new library function function_name() can
extract the original name from an fn value. Thanks to
Liran Nuna for suggesting this improvement.


Version 0.9.10
--------------

The manual incorrectly documented gmtime() and localtime()
to require no arguments, while in reality both need an int
argument giving the number of seconds since the Unix epoch.
Thanks to Sander van Dijk for noticing this.

Strings with 0 bytes in them could not be easily be stored
in memory resources or read from them. The new library function
mputstring() will put a full Arena string value into a memory
resource, while mgetstring() will read a fixed-length string
from a memory resource. Thanks to Dennis Heuer for suggesting
these additions.

On machines with a 32-bit C float type, it was not possible
to correctly call external C functions that expect that type.
There is now a new library function called cfloat() that will
convert an Arena float value to a suitable representation for 
calling such external functions. Thanks to Dennis Heuer for
notifying me about the problem.


Version 0.9.9
-------------

This release fixes a possible double free problem in the
printf() implementation. The problem occurred when more
conversion specifiers than function arguments were present
and the format required a cast from the dummy void value
used by the implementation to another type. Thanks to
Dennis Heuer for reporting the problem.

Also based on a suggestion by Dennis, the interpreter no
longer allows non-terminated escape sequences in string 
literals. In other words, a string literal may no longer
end in a backslash character.

Alistair Crooks provided a couple of new example scripts
that include interfacing to native C libraries under NetBSD.
He also suggested to allow hexadecimal integer literals.
These are now allowed and need to be prefixed with "0x".
For example, "0xFF" or "0xff" is the same as writing "255".

Fabian Tschiatschek provided a patch to allow extra
arguments to be passed to map, filter, foldl, foldr, drop_while,
and take_while. These are passed down into the function provided
as the first argument. Fabian also noticed that the documentation
and implementation of foldr did not agree about the order
of arguments. The implementation was changed to match the
language manual.

There is a new library function called is_null that can
check whether a memory resource contains a C NULL pointer.


Version 0.9.8
-------------

This release fixes source file position accounting inside
multi-line string literals. Previously, newlines contained
in string literals were not accounted for, leading to
incorrect line and column numbers in error messages.

In addition to the above error, the interpreter did not
abort execution of a script when a parser error was
encountered. This meant the interpreter tried to execute
whatever parts of a script had been been parsed correctly
before the parser error occurred.

Both the above issues were reported by Dennis Heuer. Also
included in this release are a couple of corrections and
wording changes to the language manual which were also
provided by Dennis.



Version 0.9.7
-------------

This release fixes a possible segfault that could occur with
nested structure assignments such as

	s.stack[s.sp++] = x

where an index expression changes the same structure as the
outer assignment. The exact semantics for this kind of
construct were not documented before. The updated language
manual now states that the side effects of the index
expression are lost.

Thanks to Dennis Heuer reminding me, the memory management
functions in the standard library now include block operations
on memory (memcpy, memmove, memcmp, memchr, memset).

As suggested by Hans Bezemer, it is now possible to test
two fn values for equality using the == operator. The result
is true if and only if both fn values refer to the same function
body.


Version 0.9.6
-------------

Fabian Tschiatschek noticed that the interpreter was
contradicting the language manual by not allowing "resource"
as the return type of functions. This has now been fixed.

The function realloc() was added to the memory management
library functions. It allows to resize the memory associated
with a memory resource. Thanks to Dennis Heuer for the
suggestion.


Version 0.9.5
-------------

The runtime library now keeps a sentinel NULL value at the
end of arrays which can be used to simplify iterations
over an array. Suggestion and patch by Anthony C Howe.

Hans Bezemer noticed that real division by zero handling
was missing from the interpreter. This has now been fixed by
making divisions by zero a fatal error.

The foreign function interface for calling external C functions
has been extended to support more operating systems and
architectures. It should work correctly under Linux, Mac OS X,
and Solaris on the following architectures: x86, x86_64,
PowerPC (32-bit executable), and SPARC (32-bit executable).
Untested architectures that may also work are M68K, ARM,
s390, Alpha, and IA64. Test reports about these architectures
would be much appreciated!

Maurice Kinal reported some compiler warnings happening on
a 64-bit build with gcc-4.1.1. These were fixed as far as
they didn't concern code generated by flex or bison.

New function mputfloat, mputdouble, mgetfloat, and mgetdouble
were added that allow to store C floating point values into
memory resources and read them back. Also added were functions
to check for the type (i.e. file or memory) of a resource
value. The latter were suggested by Dennis Heuer.


Version 0.9.4
-------------

This release adds a new group of library functions for regular
expression matching that use the PCRE library. PCRE stands
for "Perl Compatible Regular Expressions", and the library
provides versatile and powerful regular expressions with
syntax and semantics matching those of Perl 5. On systems
that don't have libpcre installed, the new functions are 
compiled as dummy implementations that always return void.

You need to pass --enable-pcre to the configure script to
build the interpreter with PCRE support.

Anthony C Howe reminded me that copy_array needs to care
about the real preallocated size of an array, not the
current number of elements.

A bug in the foreign function interface was fixed that
prevented memory resources from being passed into C
functions.

The interpreter internals were changed so that resource types
are identified by their internal free pointer. Thanks to
Anthony C Howe for the suggestion.

Handling of fatal errors in a script now does not abort
from within the middle of the interpreter, but passes an
error status to the caller of arena_execute_script. This
allows more controlled embedding of the interpreter in the
future.


Version 0.9.3
-------------

This release adds a new resource datatype that is used to
represent operating system resources such as open file handles.
This is an incompatible change but allows for automatic closing
of file handles when they go out of scope. The previous integer
handles could also end up being changed by arithmetic
expressions.

Memory management for arrays was improved by allocating space
for 100 entries at a time instead of once for each added
element. Thanks to Anthony C Howe for the suggestion and a patch.

Also based on a suggestion by Anthony C Howe, most of the
interpreter has been reorganised to be reentrant and thus
thread-safe. This also includes a preliminary version of an
API that can be used to embed the interpreter inside another
application. See the files api.h and arena.c and expect
documentation later. Neither this nor the thread-safety have
seen testing as of yet. Expect more changes in this area.

Dennis Heuer suggested to make it possible to dynamically
load C libraries and call C functions. To support this, two
new sets of library functions were added. One set allows
manual memory management and the other allows to load C
libraries and call C functions. Functions arguments are
automatically converted from Arena to C types and vice
versa. Passing arrays and structures can only be done manually
by using the memory functions to create in-memory C versions
on the fly.

The implementation of C function calls is experimental and
only works on 32-bit x86 systems with GCC as the C compiler.
Also, the underlying operating system needs to support
the dlopen() family of library functions. It has seen light
testing on both a Linux and a Solaris 10 system.


Version 0.9.2
-------------

This release fixes an off-by-one bug in the implementation
of the strftime library function that caused the unit
tests to fail on OpenBSD systems. Thanks to Jasper Lievisse
Adriaanse for reporting.

The "make install" target now takes care that the destination
directory for the interpreter binary (/usr/local/bin by default)
exists. Thanks to Dennis Heuer for reporting the issue.

There is a group of new library functions that provide
list-like handling for arrays. Most of these are variants
of the list library functions of Haskell, a functional
programming language.


Version 0.9.1
-------------

There was an annoying bug in the handling of the continue
statement. Namely, the interpreter's continue flag was reset
at the end of the statement block containing the continue
statement. This meant that a continue statement only worked
when it was in the top-most block inside a loop. If it
occurred further down in a nested block, it had no effect.

Additionally, there was a double free problem when the
possibility to leave out an expression in a for loop statement
was used multiple times in a script.

Both problems now have test cases in the regression test
suite.


Version 0.9.0
-------------

This was the initial release of the Arena scripting language
manual and interpreter.

The relatively high initial version number was chosen because
the language and basic library are supposed to be complete as
defined in the manual. Also, the interpreter survives all unit
tests and valgrind runs have shown it to be free of invalid
memory accesses and leaks (there are still some leaks when a
script causes a runtime error; but that aborts the whole
interpreter process anyway).
