1.10.0 (2023-11-21) * Added FIXED_16_16_FORMAT to printfFormats.h * Added getFileExtension(), getLastPathComponent(), getDirectory(), getSiblingFilePath(), getPathRelativeTo(), getAbsolutePath(), strncat_safe(), strdup_length(), writeFileAtomic(), and enumerateFilesInDirectory() to IOUtilities * Added a custom implementation of strndup to IOUtilities to replace the missing one on Windows * Simplified FixedIntervalRunLoop API. Now includes only create()/init(), dispose(), and advance() functions. Note that AutoFreePool_empty() is no longer called from FixedIntervalRunLoop_advance(), so applications relying on this behavior should instead call it manually where FixedIntervalRunLoop_run() was invoked. * Added FileBundle * Added UndoStack, UndoTree, UndoStateDelta, UndoUtilities, and StringDiff * Added StrideArray and ChunkArray * Added HashTable (distinct from what used to be called HashTable in dynamictypes) * Added Queue * Added AsyncTaskQueue * Added IndexSelection, IndexPairSelection, IndexSubindexSelection, and ReverseIndexLookup (adopted from modeler) * Added ReferenceCount * Added next/previousUTF32CodepointInUTF8/16String() to UTFUtilities.h * Added EventDispatcher functions unregisterAllForEventID(), unregisterAllForCallback(), and unregisterAllForContext() * readFileSimple() now allocates one extra zero byte at the end of the returned buffer (without affecting returned length) in order to ensure that any downstream string functions applied to file contents won't overrun 1.9.0 (2014-12-04) * HashTable moved from utilities to structureddata (edit: structureddata is now known as dynamictypes) * Added Base64 encoder/decoder * Added snprintf_safe, vsnprintf_safe, strncpy_safe, and printHexString to IOUtilities. * Added FixedIntervalRunLoop_setTolerance. * FixedIntervalRunLoop_run now returns the number of times it invoked stepCallback. * FixedIntervalRunLoop_run now allows the run loop to be disposed from its stepCallback, and will return after the iteration that disposed it. * Removed EventDispatcher's mostly-useless owner field and parameter, and removed sender parameter from event callbacks. * Removed function pointers to EventDispatcher, FixedIntervalRunLoop, and Ranrot methods from their structs in preparation for stemobject 4.0.0. Call the EventDispatcher_*()/FixedIntervalRunLoop_*()/Ranrot_*() methods directly instead. 1.8.1 (2014-06-29) * Added support for modern Xcode/iOS SDK versions 1.8.0 (2014-03-22) * utilities no longer depends on shell. ShellMutex usage in Atom and AutoFreePool has been replaced by callbacks which are signature-compatible with ShellMutex if ShellThreads.h is included before Atom.h and AutoFreePool.h. * Added Atom_registerStaticAddress() * HashTable can now set and retrieve raw structs * Improved HashTable efficiency, based on st.c 1.7.2 (2013-12-27) * Moved printfFormats.h from unittest * Added LONG_LONG_FORMAT, ULONG_LONG_FORMAT, and XLONG_LONG_FORMAT to printfFormats.h, since long long is semantically different from int64_t on 64-bit Linux 1.7.1 (2013-12-25) * Added endian swap functions to IOUtilities * Updated for stemobject 3.1.0 1.7.0 (2013-07-15) * Added HashTable (not yet optimized; functional, but likely to be slow and/or memory-inefficient) * Added ATOM convenience macro (expands to Atom_fromString) * Added 64-bit Windows and Linux support * Updated API for shell 1.0.0 1.6.1 (2012-04-10) * Atom_fromString now uses a hash table internally and performs significantly faster, with much less penalty for adding more atoms 1.6.0 (2012-01-04) * Random.h renamed to Ranrot.h * Ranrot can now be instantiated * Added stirrand() * Updated for stemobject 3.0.0 1.5.0 (2011-09-28) * EventDispatcher_unregisterForEvent() now takes a context pointer, which must match the one passed to registerForEvent() to remove the callback. This enables multiple handlers to be registered with the same function pointer and event ID but different context pointers. 1.4.3 (2011-09-26) * Fixed a critical bug introduced in 1.4.2 that could cause the wrong event handler to fire after having unregistered for an event from within a callback * Backward compatibility for non-Atom event IDs removed. 1.4.2 (2011-09-04) * EventDispatcher's eventID strings are now Atoms, and are no longer copied internally. This fixes a potential strcmp of a freed string if an event handler is removed from an event callback, but may cause events to no longer fire if callers are using something other than Atoms or string constants for eventID. Backward compatibility is maintained for non-Atom string constants, but this usage is deprecated and will be removed in the next revision. 1.4.1 (2011-08-24) * Atom_fromString will no longer crash when passed NULL, instead returning NULL * resourcePath() is no longer necessary and has been removed. Shells now chdir to Shell_resourcePath at startup. * memwrite now allows an initial allocatedSize of 0, for callers who wish to use memwriteInit(NULL, 0, 0, true) * readFileSimple now writes 0 to outFileLength on read failure * utilities no longer depends on shell or stubshell 1.4.0 (2010-12-02) * Updated stemobject dependency from 1.1.0 to 2.0.0 * Synchronized with template_stemlib Stable_2010-11-14 * Added readStdinSimple * Atom and AutoFreePool are now (theoretically) thread safe 1.3.0 (2010-06-04) * Updated stemobject dependency from 1.0.0 to 1.1.0 * Updated stubshell dependency from 1.0.0 to 1.1.0 * Refreshed Makefile from template_stemlib Stable_2010-06-02 1.2.0 (2010-05-23) * Added temporaryFilePath to IOUtilities * Arg 2 of writeFileSimple is now const * Refreshed Makefile from template_stemlib Stable_2010-05-22 1.1.0 (2010-05-06) * Updated EventDispatcher and FixedIntervalRunLoop to inherit from StemObject * Refreshed Makefile from template_stemlib Stable_2010-05-06 1.0.0 (2010-04-06) * Added Random * Refreshed Makefile and other project files from template_stemlib Stable_2010-03-29 0.0.0 (2009-12-26) * Initial version