CCBI changelog
--------------

2010-05-27, 2.1:
	New fingerprints, from Rc/Funge-98:
		ARRY
		BOOL
		FPRT
		ICAL
		IMTH
		LONG
		RAND
		TRGR

	Removed argument: --detect-infinity.
	Added argument: --infinite-loop: actually infinite loop instead of erroring
	out if an infinite loop is detected.

	New statistics:
		Maximum number of IPs live
		Maximum number of items in a container (stack, deque, stack stack,
		semantic stack)

	Bugfixes in Funge-Space:
		Tight bounds were calculated incorrectly if the hash table was in use.

		AABBs that were loaded on top of the hash table did not subsume cells
		from the hash table.

		Infinite loop error messages pointed to the wrong coordinates if using
		the hash table.

		Skipping spaces in stringmode would infinite-loop in some cases when the
		string crossed over from one AABB to another without any space in
		between.

		Mapping over ranges in Trefunge mode and contiguous range getting were
		subtly broken in some cases, leading to misloaded files and other
		strange bugs.

	Bugfix in STRN.G:
		If the string wrapped around, crossed some unallocated space,
		expensive infinite loop detection was enabled, and the string actually
		would have terminated, it was pushed incorrectly.

	Bugfix in TRDS:
		If an IP had stopped time and then jumped into the past, the fact that
		it was the time stopper was forgotten.

	Bugfixes in tracer:
		Non-integer args weren't correctly errored out on.

		When stdin was set to a string, the string wasn't owned, leading to it
		possibly becoming overwritten later on.

	--help and company are now output to stdout, not stderr.

	A statically allocated array is now used for Funge-Space around the (0,0)
	area: while a micro-optimization, this is a significant speedup for
	programs that spend most of their time there (as most programs do).

	IPs are now stored in a linked list, which speeds up forking noticeably.

	... and other minor fixes and micro-optimizations.

2010-04-06, 2.0:
	Unefunge-98, Trefunge-98, and Befunge-93 support.

	Both 32-bit and 64-bit cell support.

	New AABB-based Funge-Space implementation with massive (one or two orders
	of magnitude, or a lot more) speed and memory use improvements.

	New deque implementation and using C memory functions for the stack and
	deque: more significant speed and memory use improvements.

	New tracer with more convenient UI, multiple breakpoints support, etc.

	New fingerprints, from Rc/Funge-98:
		FING
		REXP

	New arguments:
		--stats:           statistics output.
		--detect-infinity: detect some kinds of infinite loops.
		--sandbox:         sandbox mode, for safe execution.

	Build system is now CMake-based. Allows versioning away pretty much all
	features for which it is sensible to do so.

	Rewrote y to make it a lot faster, especially when given a positive
	argument.

	Bugfix for i:
		Initialize vb to va instead of 0 so that it gets set properly even if
		the whole file is placed in negative Funge-Space.

	Bugfix for k:
		0k x executed the x.

	Bugfix for y:
		The tightest, not the loosest, bounds for Funge-Space are reported.

	HRTI now accepts a resolution of zero.

	TRDS now sets its earliest time lazily, to when it is first loaded, so that
	we don't have to copy the whole Funge-Space for every program at startup.

	... and plenty of other optimizations.
	... and probably plenty of other fixes I've forgot to mention.

2009-03-28, 1.0.20
	FILE's R now reflects on EOF.

	Updated for Tango 0.99.8.

2009-01-10, 1.0.19
	STRN's D now flushes on a newline.

	Updated for DMD 1.0.39 and Tango SVN revision 4240.

2008-11-15, 1.0.18
	The error message for OutOfMemoryExceptions is now printed properly, and
	the exception type is printed as well.

	HRTI now uses the StopWatch structure for timing where possible, resulting
	in increased accuracy (on Windows, at least).

2008-09-21, 1.0.17
	Fixed regression in TRDS.jump():
		IP needs to be moved off the J for internal reasons which are unknown to
		me, or problems occur.

	Fixed TRDS-related regression:
		Don't increment the tick count even once if time is stopped. (Time stop
		was not detected until the next iteration, by which time the tick count
		had already been incremented due to the 1.0.16 change of doing it after
		execution.)

2008-09-16, 1.0.16
	Bugfix in TRDS.jump():
		Don't do ip.move() without setting needMove = false: would skip next
		instruction if doing time jump without space jump.

	The tick count is now updated after executing an instruction, not before.

	Thus TRDS.max() now also pushes 0.

2008-09-13, 1.0.15
	Bugfix in TIME.dayOfYear():
		Was off by one: push 0, not 1, for January 1st.

2008-08-28, 1.0.14
	Various changes to SOCK:
		Bugfix: in accept(), do not overwrite the original socket. The fix in
		        1.0.11 was bogus.

		Bugfix: set a dead socket to null, many instructions depended on this
		        but after 1.0.12 it was no longer happening.

		The socket array size is fully minimized when a socket is killed.

		R no longer pushes the received data size if it errored instead.

	'o' no longer puts a newline after the last line in binary mode.

	Updated fingerprints to current spec:
		FRTH - P and L (PICK and ROLL) are now affected by MODE
		SUBR - added A and O, general storage offset usage correction

	Had accidentally left some debugging output in 3DSP, removed it.

2008-08-19, 1.0.13
	New fingerprints, from RC/Funge-98:
		3DSP
		DATE

	Updated fingerprints to current spec:
		IMAP - can now map 0-255
		INDV - V no longer uses old incorrect RC/Funge-98 vector ordering

	Fixed a bug in main():
		If an IP changed the next instruction of an IP to be executed later the
		same tick to a space or semicolon, it would take one instead of zero
		ticks to process.
	Fixed a bug in getSysInfo():
		y as a pick instruction didn't work correctly.

	Added the new D instruction to FILE.

	Removed PNTR (the alias of INDV), it wasn't meant to exist at all.

	Verified all popVector and pushVector calls so that the storage offset is
	correctly applied.

	TIME now uses Gregorian.generic instead of toDate everywhere, to avoid
	dependence on the OS's precision.

	Updated for Tango 0.99.8.

	Fix the typeof(type) issues for Posix as well.

2008-08-07, 1.0.12
	Fixed a bug in SOCK.kill():
		Do not delete the socket, as due to the change in 1.0.11 it may not be
		allocated by new. (This segfaulted on Linux.)

2008-07-26, 1.0.11
	Fixed a bug in SOCK.accept():
		Do not overwrite the original socket.

2008-07-26, 1.0.10
	k changes:
		It's not meant to skip over its operand, according to the Cats-Eye
		Befunge diagnostics as well as Chris Pressey (via Mike Riley).

		It is meant to execute the next instruction found after reaching past
		spaces and such, according to Chris Pressey (via Arvid Norlander).

2008-07-19, 1.0.9
	Fixed a bug in rand_up_to():
		Avoid dividing by zero when max is zero.
	Fixed a bug in CPLI.cplxDiv():
		Push two zeros when dividing by zero.
	Fixed a bug in FILE.fopen():
		Check for fopen failure before calling rewind, not after.
	Fixed a bug in FILE.fgets():
		Break out of reading loop on \r.
	Fixed a bug in inputDecimal():
		Overflow checking should now work properly for all inputs.

	Now double the length of the sockets array in SOCK.create() instead of just
	appending.

	Rewrote half of PERL.eval().

	Compiled against a version of Tango which fixes its Ticket 1053, making
	PERL.eval() work properly on Windows even with quotes and/or backslashes in
	the argument string.

	Added note about PERL.eval()'s new behaviour to FINGERPRINT_INFO.

	Added sanity checking for FPSP and FPDP unions.

	Changed FILE to use a dynamic array for handles as FOPEN_MAX is unreliable.

	Rewrote half of TURT, it should actually work now.

	Child IPs now copy their loaded fingerprints from their parents, since most
	other interpreters appear to do this.

	DMD 1.033 support: fix a few typeof(type) issues.

	Updated for Tango 0.99.7.

2008-04-02, 1.0.8
	Fixed a bug in REFC.dereference():
		Reflect on out-of-bounds array access, instead of crash.

2008-03-29, 1.0.7a
	Fixed a bug in getSysInfo():
		y acting as a pick instruction would clear the rest of the stack due to
		unsigned integer overflow.

2008-03-29, 1.0.7
	General cleanup here and there.
	Fixed a bug in tumbler() in TOYS fingerprint:
		^ and v were the wrong way around.
	Optimizations:
		Some general heap activity avoidance.

		.rehash on Funge-Space only slowed things down.

		Accessing Buffer.read directly and thus making fewer calls appears
		to be faster than using TypedInput in loadIntoFungeSpace.

2008-03-14, 1.0.6b
	Optimization:
		MurmurHash 2.0 is now used for Funge-Space, which speeds things up
		noticeably.

2008-03-14, 1.0.6a
	Optimization:
		I/O should now be somewhat faster: using a TypedOutput!(ubyte) or
		TypedInput!(ubyte) where possible.

2008-03-13, 1.0.6
	Output is now properly flushed when the program ends.

	Removed the annoying pragma(msg) regarding environment variables.

	environment() now returns a char[][], not a char[][char[]].

2008-03-13, 1.0.5
	'y' now pushes the command line arguments in such a way that the first is
	topmost, not lowest.

	'k':
		Now works for fingerprint instructions.

		The multi-execute optimization is no longer performed for unimplemented
		instructions.

	Optimization:
		A switch statement is used for executing ordinary (non-fingerprint)
		instructions, instead of function pointers. This results in an
		unfortunate import cycle, but resolving it would require shoving most of
		Mini-Funge into the already large enough instructions.d, or something
		equally silly.

2008-03-12, 1.0.4a
	Optimization:
		Fingerprints are now held in dynamic arrays, not associative arrays.

2008-03-12, 1.0.4
	The TERM fingerprint is now disabled on Posix, as it never worked properly
	and I can't make it work.

	Added the --disable-fprints argument.

	Optimizations:
		Everything possible when fingerprints are disabled, of course.

		Input and output are now properly buffered.

		Funge-Space is rehashed after being created.

		memcpy() is now used in Befunge98Space.copy and IP.copy.

2008-03-11, 1.0.3e
	Optimizations:
		Instructions are now held in an ordinary static array, not an
		associative array.

		scope(success) instead of scope(exit) in the code for the 'k'
		instruction.

2008-03-10, 1.0.3d
	Updated for compatibility with Tango 0.99.5 and x86-64, no functionality
	change.

2008-01-22, 1.0.3c
	Removed single dependency on tango.core.Array, no functionality change.

2007-12-29, 1.0.3b
	Updated for compatibility with Tango 0.99.4. No version number change, as
	functionality is the same.

2007-12-02, 1.0.3
	Tracing now prints which IPs triggered the global or cell breakpoint, if
	there is more than one IP alive.

	Changes in Tango's formatting led to bugs in the TURT fingerprint output,
	which have been fixed.

	Fixed a bug in main:
		First command line argument passed to Befunge program was the name of
		the interpreter, not the name of the Befunge program.

2007-11-26, 1.0.2
	Updated for compatibility with Tango revision 2935.
	HRTI now works with microseconds as it should, I think S and G may have
	used milliseconds before this.

	Now compiling with -I.. so you don't have to mess with the directory
	structure or with the -I yourself.

	Now compiling with -version=Win32SansUnicode so that the DIRF fingerprint
	doesn't require UTF-8 input, but uses the locale, just like everything else
	and the spec specifies.

	Fixed a bug in getSysInfo:
		Null command line argument handling was borked.

2007-09-22, 1.0.1
	Helptext now points to correct web site.
	Added a note to IMPLEMENTATION about Mini-Funge library format.
	Stdout is now flushed prior to emitting a warning to Stderr.

2007-09-20
	Public release.

2007-07-22, 1.0.0
	Renamed the project to CCBI (Conforming Concurrent Befunge-98 Interpreter).

	Implemented '(' and ')' and the following fingerprints:
		Official (Cat's-Eye Technologies):
			HRTI
	 		MODE
			MODU
			NULL
			ORTH
			REFC
			ROMA
			TOYS
			TURT (no display, only saving to file)

		RC/Funge-98 extensions:
			BASE
			CPLI
			DIRF
			EVAR
			FILE
			FPDP
			FPSP
			FRTH
			FIXP
			IIPC
			IMAP
			INDV aka PNTR
			SOCK
			STRN
			SUBR
			TERM
			TIME
			TRDS

		Jesse van Herk's extensions to RC/Funge-98:
			JSTR
			NCRS

		GLFunge98 extensions:
			SCKE

	Also added notes to FINGERPRINT_INFO about why FNGR, SGNL, and WIND aren't,
	and will very unlikely ever be, implemented.

	Implemented dynamic fingerprints (*.fl).

	Added the --script argument.

	Switched to the Tango library.

	Random numbers are now evenly distributed, not just "rand() % range" which may cause
	some numbers in range to be more common than others.

	'&' and '~' now flush stdout prior to reading stdin: added note to IMPLEMENTATION.
	The way '&' eats line breaks added to IMPLEMENTATION.
	Note about '#' edge jumping added to IMPLEMENTATION.
	Note about 'i' not copying spaces removed from IMPLEMENTATION: it's clearly in the spec.

	I/O is no longer in UTF-8/16/32, after I read the spec more carefully: if the system stores characters
	in one byte, like all the systems CCBI supports, each individual byte should be its own Funge-Space
	cell. I read the spec as speaking of multibyte encodings when it meant multibyte systems.
	Thus, input and output are both now character set independent. Removed UTF warnings from IMPLEMENTATION.
	Internally, ubyte is used instead of [wd]char, since char is meant for UTF-8 code units.
	This unfortunately results in a lot of type casting since all library string functions expect chars.

	Changed the way wrapping around works to a more expensive, but spec-conforming method.
	Ditto for 'k'.

	Spaces and semicolons now execute in zero ticks instead of one.

	Changed calls like instructions['>']() to goEast() to remove needless array lookup.

	The array property of the stack is now private, and thus only used internally.
	Added opApply() methods to take care of the few places where it was actually needed.

	Massive re-moduling of the code, and removal of circular dependencies.

	Rewrote the simple number pushing instructions: they used to check the value of the cell the IP was on
	to figure out which number to push on the stack, which obviously failed when called from iterate().

	Changed cell and cellidx from ptrdiff_t to int_fast32_t.

	Changes in doTrace:
		Tracing is done only once per tick, instead of once per IP per tick.
		Since tracing can't be done more than once per tick, spaces and semicolons are no longer traced.
		"a[rea]" doesn't append needless spaces to each line.
		Added command "(c)break" to break on a given cell value.

	Fixed a bug in duplicate():
		ip.stack.push(ip.stack.top) doesn't work properly when the stack is empty.
	Fixed a bug in main():
		fungeArgs didn't contain the name of the program being run.
	Fixed a bug in loadIntoFungeSpace():
		When not in binary mode, only \n was considered a line break, not \r or \r\n.
	Fixed bugs in doTrace():
		Concurrent tracing wasn't working: tip could be null, the global breakpoint didn't work, and such.
	Fixed a bug in beginBlock(), endBlock(), and stackUnderStack():
		The stack's mode field wasn't properly transferred onto the new TOSS in all cases.

2007-01-04, 1.0.0 RC4
	Changed for loops to use foreach_reverse where applicable.
	Other minor code changes here and there.

2006-11-04, 1.0.0 RC3
	Changed most imports to the new import types of DMD 0.163. Removed explicit private.
	Fixed bugs in outputFile():
		"Sub-rows" (see comment in dcbefunge.d) were not considered.
	Addition to outputFile():
		Line breaks are converted to the system's line separator.
	Added notes about 'o' behaviour to the IMPLEMENTATION string.

2006-11-03, 1.0.0 RC2
	Some changes to make it compile in DMD 0.172 under Linux.
	Fixed a bug in myOpen():
		New files couldn't be created, since it was checking for their existence even when writing.
	Fixed bugs in outputFile():
		Line breaks were "\r", "\n", or "\n\r". The last should have been "\r\n".

2006-06-12, 1.0.0 RC1
	First changelog-worthy version.
	Everything should work.
