cgul (1.8.0) * Added cgul_microxml for parsing MicroXML documents. See the following URLs for more on MicroXML: https://www.w3.org/community/microxml/ https://dvcs.w3.org/hg/microxml/raw-file/tip/spec/microxml.html * Added the following classes to make it easier to write parsers: cgul_stream_reader cgul_block_reader cgul_block_reader_file cgul_block_reader_memory * Added methods to cgul_vector, cgul_string, cgul_hstring, and cgul_wstring to get and set the minimum capacity to allow the user to control the space vs. time trade-off. * Added support to cgul_string__append_sprintf() for printing size_t values using the %zu, %zo, %zx, and %zX format specifiers. * Added the following methods to cgul_string: cgul_string__append_hchar() cgul_string__append_wchar() * Added numeric conversion routines to cgul_wstring and cgul_hstring. * Added the following methods to cgul_bcd: cgul_bcd__new_from_bcd() cgul_bcd__new_from_size_type() cgul_bcd__assign_from_size_type() * Added the following methods to cgul_big_integer: cgul_big_integer__new_from_big_integer() cgul_big_integer__new_from_size_type() cgul_big_integer__assign_from_size_type() * Renamed cgul_defensive__add_size_t() to cgul_defensive__add_size_type(). * Added the following method to cgul_char: cgul_char__strcmp() * Fixed "type-punned pointer" in optimized builds of cgul_trie and cgul_rbtree. * Fix cgul_libc__basename() so that "////" returns "/" instead of an empty string. * Fixed the following test programs to work under Windows: tests/main_base64_decode.c tests/main_base64_encode.c cgul (1.7.0) * Replaced cgul_rbtree__find_prev() cgul_rbtree__find_next() with cgul_rbtree__find_floor() cgul_rbtree__find_ceiling() * Replaced cgul_multimap__find_prev() cgul_multimap__find_next() with cgul_multimap__find_floor() cgul_multimap__find_ceiling() * Added the following methods to cgul_trie which allow the user to index into the trie similar to indexing into an array: cgul_trie__find_at() cgul_trie__find_rank() cgul_trie__remove_at() * Changed cgul_trie to use cgul_cache when deleting keys or values from the user. * Added cgul_cache__get_freer() which returns a cgul_cache adapter for free() which allows cgul to free the user's keys and values that have been allocated using malloc(). * Added the following swap() methods: cgul_bitwise_trie__swap() cgul_heap__swap() cgul_list__swap() cgul_multimap__swap() * Added C++ wrappers for cgul_trie and cgul_trie_node. * Added C++ wrappers for the following 32-bit PRNGs: cgul_random_cmwc32_cxx cgul_random_lcg32_cxx cgul_random_lfg32_cxx cgul_random_mt32_cxx cgul_random_well32_cxx cgul_random_xorshift32_cxx cgul_random_xorwow32_cxx * Added "const" to getters in all C++ wrappers where it was missing. cgul (1.6.5) * Added the following methods to cgul_trie: - cgul_trie__find_ceiling() - cgul_trie__find_floor() * Added the following functions to cgul_binary_search: - cgul_binary_search_ceiling() - cgul_binary_search_ceiling_pointers() - cgul_binary_search_floor() - cgul_binary_search_floor_pointers() * Fixed a bug in cgul_string__set_value() when setting the value to an internal substring. This indirectly fixes the "%p" format specification for cgul_string__append_sprintf(). cgul (1.6.4) * Added cgul_crlf_file__get_lines() to slurp a text file. * Changed cgul_*__remove*() methods to initialize the user's output parameters. * Added tests/main_trie_auto_complete.c to demonstrate how to use the cgul_trie class to perform auto-completion. cgul (1.6.3) * Fixed cgul_trie__insert_from_arrays() to return the correct value on success. cgul (1.6.2) * Fixed minor bug in cgul_trie__find_closed_range_by_prefix(). cgul (1.6.1) * Added cgul_trie. * Fixed bug in cgul_merge_sort(). * Added cgul_binary_search__compare_t. cgul (1.6.0) * Renamed cgul_trie to cgul_bitwise_trie. (This frees "cgul_trie" to be a prefix trie in the future.) cgul (1.5.1) * Added the following: cgul_heap cgul_heap_sort cgul_heap_primitives * Added the following implementations of the Sieve or Eratosthenes which have no preconceived upper bound on the primes they can detect: tests/main_heap_primes.c tests/main_heap_primes_cxx.cc cgul (1.5.0) * In previous versions, collections could grow automatically but shrinking a collection required manual intervention, but starting with this version, collections also shrink automatically. This affects the public API of following classes where direct access to the collection's capacity is no longer necessary: cgul_big_integer cgul_hash cgul_hstring cgul_string cgul_wstring cgul_vector * Fixed a bug in cgul_string__set_value() when setting the value of a string to one of its own substrings. cgul (1.4.18) * Added option to build as a dynamic library under Cygwin and MinGW. cgul (1.4.17) * Added the following methods and their C++ wrappers: cgul_string__to_schar() cgul_string__to_uchar() cgul_string__to_short() cgul_string__to_ushort() cgul (1.4.16) * Fixed the Makefile so MinGW builds cgul as a static library. cgul (1.4.15) * Added CGUL_EXPORT macro to help create DLLs under Windows. * Changed default build under Windows to create a dynamic library. cgul (1.4.14) * Added cgul_shuffle and cgul_vector__shuffle(). cgul (1.4.13) * Added cgul_radix_sort. cgul (1.4.12) * Added cgul_trie_node__get_value() and cgul_trie_node__set_value(). cgul (1.4.11) * Added basic implementation for cgul_trie. cgul (1.4.10) * Fixed warnings related to unused variables. cgul (1.4.9) * Fixed warning indicated by Sun Studio12. cgul (1.4.8) * Fixed harmless warnings indicated by Sun Studio12. cgul (1.4.7) * Fixed calls to functions defined in ctype.h to pass in "unsigned char" instead of "char". cgul (1.4.6) * Fixed comment in cgul_crc16.h that incorrectly described how to configure cgul_crc16 to generate CRCs compatible with CRC16-CCITT. cgul (1.4.5) * For cgul_multiply64_cxx, inline the functions to avoid linker issues under MSVC++. cgul (1.4.4) * Removed "friend" from cgul_bdf_glyph_cxx. cgul (1.4.3) * Added the following methods: cgul_csv__new_from_memory() cgul_csv__open_memory() cgul_stanza__new_from_memory() cgul_stanza__open_memory() cgul (1.4.2) * Restored the *__new_from_{fname,file}() functions for cgul_csv and cgul_stanza because it was a nuisance having to create an extra cgul_crlf_file object for the common case of working with a regular file. cgul (1.4.1) * Added cgul_crlf_file__get_file() which returns the FILE* or the char* that is being used as the data source. * Renamed cgul_crlf_file__get_file_name() and cgul_stanza__get_file_name() to cgul_crlf_file__get_fname() and cgul_stanza__get_fname() respectively. cgul (1.4.0) * Reworked cgul_crlf_file to handle block-buffered files, line-buffered or character-buffered files, or memory-based files. This required changes that are not backwards compatible. * Changed cgul_csv and cgul_stanza so that they no longer attempt to manage all the different file types. Instead, these classes delegate the job to cgul_crlf_file. This required changes that are not backwards compatible. * Removed cgul_crlf_memory class because this functionality is now in the cgul_crlf_file class. cgul (1.3.37) * Added cgul_crlf_memory class to allowing parsing text "files" that are resident in memory. * Added support to cgul_csv for parsing CSV "files" that are resident in memory. * Added support to cgul_stanza for parsing stanza "files" that are resident in memory. cgul (1.3.36) * Fixed bug in cgul_hash__get_sorted_keys() where an exception was not propagated. cgul (1.3.35) * Changed the callback data for cgul_binary_search_irange() to not be const. cgul (1.3.34) * Add cgul_binary_search_irange(). cgul (1.3.33) * Changed cgul_random_xorshift32 to combine the low and high lagged values using xor instead of addition. cgul (1.3.32) * Added the following PRNGs: cgul_random_mt32 (Mersenne Twister MT19937) cgul_random_well32 (WELL44497b) cgul_random_xorwow32 cgul (1.3.31) * Added the following PRNGs: cgul_random_cmwc32 cgul_random_lcg32 cgul_random_lfg32 cgul_random_xorshift32 * Added the following to cgul_libc: cgul_libc__load_file() cgul_libc__load_fname() cgul_libc__save_file() cgul_libc__save_fname() * Added cgul_multiply64(). cgul (1.3.30) * Updated documentation to reference the new cgul mailing lists. cgul (1.3.29) * Added C++ wrappers for the following classes: cgul_mime cgul_substring cgul_rolling_hash cgul (1.3.28) * Added cgul_mime for parsing multipart MIME messages which should be sufficient for handling HTTP uploads. * Added cgul_substring which is an implementation of the Rabin-Karp substring search algorithm. * Added cgul_rolling_hash which is the rolling hash used by cgul_substring. * Added cgul_log2 for calculating the floor and ceiling of the base-2 logarithm of unsigned types. * Improved performance of cgul_merge_sort(). * Added cgul_vector__swap() and cgul_vector__take_array(). cgul (1.3.27) * Added the following functions along with C++ wrappers for them: cgul_libc__fflush() cgul_char__isspace() cgul_hchar__isspace() cgul_wchar__isspace() cgul_string__trim() cgul_string__trim_left() cgul_string__trim_right() cgul_hstring__trim() cgul_hstring__trim_left() cgul_hstring__trim_right() cgul_wstring__trim() cgul_wstring__trim_left() cgul_wstring__trim_right() cgul (1.3.26) * Changed cgul_big_integer__append_as_decimal() to do the multiply and "add with carry" in a single loop. cgul (1.3.25) * Increment the year for the copyright. cgul (1.3.24) * Changed cgul_big_iteger__append_as_decimal() to use an algorithm that scales better. cgul (1.3.23) * Changed cgul_endian__swap() to accept values as void pointers to avoid forcing the user to cast to a char pointers. cgul (1.3.22) * Changed the following functions so that they do not accept a cgul_exception object because it is an unnecessary nuisance given that these functions are really just an extension of one of the destructors (which also do not accept a cgul_exception object): cgul_hash__free_keys() cgul_hash__free_values() cgul_list__free_values() cgul_multimap__free_keys() cgul_multimap__free_values() cgul_rbtree__free_keys() cgul_rbtree__free_values() cgul_vector__free_values() cgul (1.3.21) * Added the following functions: cgul_crc32_incr__update_file() cgul_crc32_incr__update_fname() cgul_crc16_incr__update_file() cgul_crc16_incr__update_fname() cgul (1.3.20) * Added cgul_crc32_incr and cgul_crc16_incr class that can incrementally generate CRCs. This is useful, for example, if you need to re-calculate a CRC each time new characters are appended to a string. * Added the following functions to make it easier to generate CRCs directly from files: cgul_crc32__crc_file() cgul_crc32__crc_fname() cgul_crc32__update_file() cgul_crc32__update_fname() cgul_crc16__crc_file() cgul_crc16__crc_fname() cgul_crc16__update_file() cgul_crc16__update_fname() cgul (1.3.19) * Changed cgul_varsub_cxx wrapper functions from "extern" to "inline." * Updated the Visual Studio project files. cgul (1.3.18) * Added support for arbitrary field separator character in the cgul_csv class allowing cgul_csv to support both CSV and TSV formats. cgul (1.3.17) * Changed cgul_hchar__hcscmp() and cgul_wchar__wcscmp() to take "const" input strings. cgul (1.3.16) * Added C++ wrapper for cgul_endian. cgul (1.3.15) * Added UTF-16 conversion routines. * Added cgul_hchar and cgul_hstring classes. * Added cgul_wstring__compare() and cgul_hstring__compare(). * Added tests/main_unicode_range.c which can be used to generate the entire range of Unicode characters for testing. * Improved performance of UTF-8, UTF-16, and UTF-32 conversions for the general case. cgul (1.3.14) * Added C++ wrapper for cgul_libc. * Changed cgul_libc__fgetpos() and cgul_libc__fsetpos() to not return a value directly. cgul (1.3.13) * Added better support for mingw. * Fixed initialization of integral types in cgul_vector_cxx.h. They are now initialized to 0 instead of to NULL. cgul (1.3.12) * Removed "bool" from C++ header because it is not portable. * Changed Doxyfile to match doxygen-1.5.8. cgul (1.3.11) * Changed build so that archiving occurs in one step instead of incrementally. This makes it build in parallel without corrupting the final library. cgul (1.3.10) * Added better build support for QNX 4.25. cgul (1.3.9) * Added the following methods: * cgul_string__trim_capacity() * cgul_wstring__trim_capacity() * Added tests/main_merge_files.c which can be used if the posix "sort -m" is not available. cgul (1.3.8) * Fixed warnings relative to gcc-4.3.3. cgul (1.3.7) * Added cgul_list__reverse(). cgul (1.3.6) * Changed the traverse() and fold() methods to propagate exceptions and to allow the user to short-circuit iteration. * Added free_keys() and free_values() methods for all containers. These methods call free() on the keys and values in a particular container and are designed to help with clean up in the common case where the keys or the values are allocated with malloc(). cgul (1.3.5) * Changed the typedefs for the foldl() and foldr() functions that are passed keys so that the keys are const. cgul (1.3.4) * Changed cgul_libc__rewind() to throw an exception if the underlying file is not seekable. * Removed cgul_trie class. * Added foldl() and foldr() methods for all the containers. These provide similar behavior to the left fold and right fold functions available in all functional programming languages. These methods are also easy to use as a foreach() or a light-weight map(). cgul (1.3.3) * Added cgul_int to provided exact integer types similar to C99's stdint.h, but it works with older compilers. * Added cgul_endian to detect whether a host is big endian or little endian. It also provides cgul_endian__swap() for converting between big-endian and little-endian formats. cgul (1.3.2) * Added C++ wrappers for cgul_crc16 and cgul_crc32. * Added the following methods to the cgul_list class: * cgul_list__merge() * cgul_list__sort() * cgul_list__insert_sorted() * cgul_list__move_before_node() * cgul_list__move_after_node() * Added cgul_vector__sort(). * Changed the allocation strategy for cgul_string, cgul_wstring, and cgul_vector to double capacity when resizing instead of increasing by a fixed amount. * Added the cgul_defensive__add_*() functions to replace the CGUL_DEFENSIVE_ADD() macro. The important thing is that everything in cgul now throws exceptions. This has always been true except for CGUL_DEFENSIVE_ADD() which called abort(). * Moved all of the standard headers out of the .c source and into the cgul_common.h header. * Started the cgul_trie class, but it is not yet functional. cgul (1.3.1) * Fixed corner cases in cgul_libc__basename() and cgul_libc__dirname(). * Added cgul_libc__extension() and cgul_libc__rootname(). cgul (1.3.0) * Changed the API so that new() methods creates default objects if possible. Most notably this affects cgul_string__new() that now creates an empty string. This also affects classes like cgul_csv and cgul_crlf_file because the new() method now creates a default object that is not attached to a file. * Changed the Makefile. A recursive Makefile is no longer used. Also, the complicated rules that removed the .o files and hid the .d files have been removed. Now, the .o and .d files are directly created in the new "obj" directory. This keeps them out of sight without introducing as much complexity in the Makefile. * Changed cgul_string__append_string_with_convspec() which was not handling NULL strings correctly. cgul (1.2.19) * Changed cgul_random_bbs and cgul_random_lcg to calculate the reciprocal of the modulus which is now used repeatedly with multiplication to calculate the same results that before were done with division. cgul (1.2.18) * Added cgul_big_integer__invert() which generates 1/x scaled to a user-specified power of 2 using Newton's Method. * Added cgul_big_integer__divide_newton() which divides by multiplying by the reciprocal generated by Newton's Method in cgul_big_integer__invert(). * Added cgul_bcd__multiply_karatsuba(). * Changed the following methods to set the sign of lhs1 based on the sign of rhs1: cgul_big_integer__and() cgul_big_integer__or() cgul_big_integer__xor() cgul (1.2.17) * Added Miller-Rabin Primality Test. * Added Karatsuba multiplication algorithm. This greatly improves performance when dealing with numbers larger than 512 bits. There is more performance to be had with more advanced algorithms, but this goes a long way toward closing the performance gap. * Added the following new methods to cgul_big_integer: cgul_big_integer__gcd() cgul_big_integer__lcm() cgul_big_integer__is_even() cgul_big_integer__is_odd() cgul_big_integer__power() cgul_big_integer__power_modulo() cgul_big_integer__is_probably_prime() * Added the following new methods to cgul_bcd: cgul_bcd__gcd() cgul_bcd__lcm() cgul_bcd__is_even() cgul_bcd__is_odd() cgul_bcd__power() cgul_bcd__power_modulo() cgul_bcd__is_probably_prime() * Fixed bug in cgul_big_integer__shift_right() that caused it to skip the optimized branch. * Changed cgul_random_bbs__next_in_range() and cgul_random_lcg__next_in_range() so they can assemble larger values than what cgul_random_bbs__next() and cgul_random_lcg__next() can generate in a single iteration. * Added cgul_big_integer__get_array() and cgul_big_integer__get_size(). cgul (1.2.16) * Added cgul_random_bbs class which is a Blum-Blum-Shub PRNG capable of producing 256 bits per iteration. This class has not been audited for security or cryptography purposes. It should only be used for general statistics. * Renamed cgul_random to cgul_random_lcg to reflect that it is a linear congruential generator (LCG). * Changed cgul_random_lcg to produce random numbers that have 256 bits instead of 128. It takes twice as long to run, but it passes all the "dieharder" battery of tests in the current configuration when cgul_random_bbs__next_in_range() is used to map to 32 bits. * Improved the guess_divisor in cgul_big_integer by making it as large as possible by effectively shifting the divisor to the left until the most-significant bit of the most-significant byte of the divisor is set. To not change the quotient, the dividend is also shifted to the left by the same amount. The remainder is changed by this operation but is easly restored to its correct value simply by shifting back to the right after the quotient is calculated. This greatly improves the speed in certain situations. * Added the ability for cgul_big_integer to use "unsigned long long" if the C compiler supports it. cgul (1.2.15) * Changed cgul_hash to only move nodes that are not already in the correct bucket when resizing. cgul (1.2.14) * Cleaned the "tests" directory so everything builds. cgul (1.2.13) * Removed the s-box hash function from the code. cgul (1.2.12) * Changed cgul_hash__hash_t callback to allow client data to be passed. * Added cgul_hash__get_total_collisions(). cgul (1.2.11) * Changed the s-box version of cgul_hash__hash_block() to match the in-line version. cgul (1.2.10) * Changed cgul_hash to use the Jenkins "One-at-a-Time" hash function by default. cgul (1.2.9) * Changed cgul_hash to always resize to a power of 2 so that index values for buckets can be calculated using a simple mask rather than a modulo operation. * Changed cgul_hash to save hash values so they do not have to be recalculated. cgul (1.2.8) * Changed cgul_hash to try to quadruple the capacity first. Only if that fails, will it try to double the capacity. * Change cgul_hash to use the FNV-1 hash function. cgul (1.2.7) * Changed the default hash function for cgul_hash to multiply by 31 instead of 33 and to use an offset basis to guard against leading zeros. cgul (1.2.6) * Cache the bucket index for cgul_hash_node objects in order to limit the number of times their keys have to be rehashed. * Tweaked the hash function and the default hash capacity to better match. * Added size_limit as a member variable of the cgul_hash class to avoid having to do floating point calculations on each insert. cgul (1.2.5) * Rewrote cgul_hash to embed the linked lists used for the buckets directly in the cgul_hash_node objects instead of using cgul_list objects. This means that error recovery during a hash resize operation is now possible such that the hash is still valid after the failure. It also means good performance gains because the resize operation is much more efficient now. Lastly, automatic resize of cgul_hash objects is now controlled by the "load factor" instead of by the "average search distance." cgul (1.2.4) * Improved cgul_hash__resize(). When the hash is resized, all the keys have to be rehashed so that all the buckets can be used. The old code rehashed by inserting copies of the nodes into a new hash and then swapping hashes. The new code rehashes in-place. This is much faster and does not invalidate iterators. * Added ability for cgul_hash to use arbitrary keys instead of just C-style strings. * Change the default maximum search distance for cgul_hash from 2.05 to 2.55 which is a little safer. cgul (1.2.3) * Changed the way cgul_hash works. It now uses a hash function with default maximum average search distance of 2.05. This greatly improves performance while still being reasonably compact. * Added cgul_hash__get_max_avg_search_distance() and cgul_hash__set_max_avg_search_distance() allowing the user to trade off speed for size or vice versa. * Changed cgul_hash so that "front" is now a synonym for "oldest" and "back" is now a synonym for "youngest". This solves some bad worst case behavior because the cgul_hash class already keeps a pointer to the oldest and youngest node up to date but had to do a linear search when looking for the front or back node. * Added cgul_hash__remove_oldest() and cgul_hash__remove_youngest(). * Changed cgul_libc__basename() and cgul_libc__dirname() to return values that should match the basename() and dirname() posix calls. cgul (1.2.2) * Added the ability for cgul_bdf to expire the least-recently used glyphs. * Added font list support to cgul_bdf. * Added the cgul_strtok class. * Rewrote cgul_split in terms of cgul_strtok. cgul (1.2.1) * Added the following methods to manipulate the embedded linked lists introduced in cgul-1.2.0. This should make it trivial to keep track of the least-recently used (LRU) nodes in these data structures: cgul_hash__set_oldest() cgul_hash__set_youngest() cgul_rbtree__set_oldest() cgul_rbtree__set_youngest() cgul_multimap__set_oldest() cgul_multimap__set_youngest() cgul (1.2.0) * Embedded linked lists in the following data structures to permit iterating over them in the order in which their nodes were inserted. This is in addition to still being able to iterate over them in natural or sort order: cgul_hash cgul_rbtree cgul_multimap The new methods are as follows: cgul_hash__get_oldest() cgul_hash__get_youngest() cgul_hash_node__get_older() cgul_hash_node__get_younger() cgul_rbtree__get_oldest() cgul_rbtree__get_youngest() cgul_rbtree_node__get_older() cgul_rbtree_node__get_younger() cgul_multimap__get_oldest() cgul_multimap__get_youngest() cgul_multimap_node__get_older() cgul_multimap_node__get_younger() * Added C++ wrappers for cgul_hash. * Changed the cgul_line_wrapper functions to break CJK text after any ideograph. * Added project files for Eclipse C/C++. cgul (1.1.25) * Renamed cgul_string_convspec to cgul_convspec. cgul (1.1.24) * Changed the lookup callback associated with cgul_varsub(). Now, the lookup callback is responsible for substituting the value for the variable name. This eliminates the requirement that the string for the value stay in scope after the lookup callback returns. * Added cgul_varsub_formatted() in order to do formatted variable substitution using printf()-style conversion specifications: "${key:%32s} : $value\n" * Added C++ wrapper for cgul_string_convspec. cgul (1.1.23) * Added cgul_stanza__get_keys() and cgul_stanza__copy_keys() which are used to return the keys in the exact order they appear in the file. * Fixed bug in cgul_stanza__print() caused by not allowing empty parts when splitting the string to print into individual lines. This caused sequential new-line characters to telescope. * Added tests/main_stanza_to_csv which converts from cgul_stanza format to CSV. The idea is to first use tests/main_csv_to_stanza to convert a CSV file into a format that is much easier for a human or script to edit. After editing, use tests/main_stanza_to_csv to convert back to CSV format. cgul (1.1.22) * Added missing header in cgul_stanza.h. cgul (1.1.21) * Added cgul_varsub() which performs variable substitution on a string with embedded variable names using Bourne shell syntax for the variable names. It is easy to use cgul_stanza to provide the mapping between variable name and value. See tests/main_varsub.c. cgul (1.1.20) * Added the C++ wrapper for cgul_vector. * Added cgul_stanza__print() to make sure multi-line values are printed correctly when creating a cgul_stanza file. * Added the ability to instantiate cgul_exception_cxx objects directly using printf()-style format strings. * Added tests/main_csv_to_stanza which converts from CSV format to cgul_stanza format making it much easier to diff. cgul (1.1.19) * Fixed bug in cgul_string__append_sprintf() when using the "%ld" format specification when trying to append LONG_MIN because I had a "-value" in the code which misbehaves when "value" is LONG_MIN. cgul (1.1.18) * Added cgul_csv_cxx::quote() which is the C++ wrapper for cgul_csv__quote(). cgul (1.1.17) * Added cgul_csv__quote() which is a static method which can be used to quote each field before writing to a CSV file. * Added tests/main_csv_sort.c which reorders a CSV file by sorting the columns based on their headers. cgul (1.1.16) * Added cgul_csv_cxx::open() and cgul_csv_cxx::close(). cgul (1.1.15) * Added cgul_csv__lookup_by_header(). cgul (1.1.14) * Added examples of how to use cgul_stanza. cgul (1.1.13) * Corrected comments for cgul_stanza. cgul (1.1.12) * For cgul_string__append() insert "(nil)" if "value" is NULL. cgul (1.1.11) * Wrote a custom version of cgul_string__append_pointer() instead of relying on the system sprintf() in order to give consistent padding across compilers and to work around gcc which for some reason prints "(nil)" instead of "0x0" for NULL pointers. cgul (1.1.10) * Send the rendezvous string to the cgul_event_router callback functions. cgul (1.1.9) * Simplified the implementation of cgul_event_router which has the pleasant affect of getting rid of the asynchronous error reporting. * Changed listeners for cgul_event_router so that they can cancel an event. * Added sample code that demonstrates how to use cgul_event_router to invoke virtual member methods for Managed C++ .NET objects. cgul (1.1.8) * Added missing "struct cgul_event_router_cookie" to keep MSVC++ happy. cgul (1.1.7) * Added that ability to add the same listener multiple times for the same rendezvous string in cgul_event_router. This is needed for routing events to C++ objects. This change had the positive side-effect that cgul_event_router__add_listener() and cgul_event_router__remove_listener() are now O(1) because we have to pass back a magic cookie to the user to uniquely identify each (possibly duplicate) listener, and this magic cookie holds pointers directly to the nodes in question. cgul (1.1.6) * Added indexing to the implementation of cgul_event_router so that insertions and removals are now O(log(n)) instead of O(n). cgul (1.1.5) * Added cgul_stanza__open(), cgul_stanza__close(), and a default constructor. * Added cgul_stanza.h to the main cgul.h header. cgul (1.1.4) * Changed cgul_event_router so that events are guaranteed to be delivered to listeners in the order in which the listeners were added. * Added C++ wrapper for cgul_event_router. cgul (1.1.3) * Fixed two bugs in cgul_big_integer__subtract_magnitudes(). * Added the following methods to cgul_bcd: - cgul_bcd__as_long() - cgul_bcd__as_unsigned_long() - cgul_bcd__shift_left() - cgul_bcd__shift_right() * Added cgul_big_integer__divide() using the long-division algorithm. This is still slower than more advanced algorithms, but it is a good deal faster than the previous bit-shifting algorithm. * Added tests/main_big_integer_pi.c and tests/main_bcd_pi.c that calculate pi using cgul_big_integer and cgul_bcd respectively. cgul (1.1.2) * Fixed bug in cgul_big_integer__is_one() and cgul_bcd__is_one() that caused them to return true for -1. * Added cgul_big_integer__as_bcd() and cgul_bcd__as_big_integer() to allow the user to convert between cgul_big_integer and cgul_bcd. * Added ability to convert cgul_bcd objects to hexadecimal, octal, and binary strings. cgul (1.1.1) * Improved cgul_string__append_sprintf(). It should now be compliant with C89. * Improved the cgul_bdf class so that glyphs can be loaded on demand. To use this feature, you need to create an index of the BDF files you are using with cgul_bdf__fnwrite_index(). * Added cgul_crlf__reset() so that cgul_crlf objects can be reused. * Added cgul_crlf__get_line_count() and cgul_crlf__get_line_offset(). * Pushed the ability to strip UTF-8 byte-order marks (BOMs) from cgul_crlf_file farther down the stack to cgul_crlf. cgul (1.1.0) * Added the cgul_multimap class. * Updated cgul_list to be more like cgul_rbtree and cgul_multimap in that it can put values back on cgul_cache objects when removing nodes. cgul (1.0.9) * Made the option of whether cgul_rbtree can be indexed as if it were an array a run-time option rather than a compile-time option. If disabled (which is the default) the user will still save 2 "unsigned int" values per node and will still see a performance boost of 15% to 25% for inserts and removes. cgul (1.0.8) * Improved performance of cgul_rbtree by turning off the indexing feature of cgul_rbtree in the default build. Also, inlined code in the critical path when removing nodes. cgul (1.0.7) * Added the before text to the cgul_progress_bar. cgul (1.0.6) * Added the CGUL_PROGRESS_BAR__COMMON style of progress bar. cgul (1.0.5) * Fixed a compiler error when building cgul_progress_bar with g++. * Forgot to add cgul_progress_bar to the MSVC++ project. cgul (1.0.4) * Improved the look of cgul_progress_bar at the expense of using more space. cgul (1.0.3) * Added cgul_progress_bar.