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).