Nemo DJB Library (libdjb) - Changes

List of changes to the second generation of core routines.

v3.0 - UNRELEASED

This release contains API changes, new code, code optimisations, changes and fixes. Particular emphasis is on cross platform compatibility.

Version Notes
• API change Renamed ip4_address data structure to ip4address.
• API change Renamed ip4_vector data structure to ip4vector.
• API change Renamed ip4_vector_*() routines to ip4vector_*().
• API change Renamed ip6_address data structure to ip6address.
• API change Renamed ip6_vector data structure to ip6vector.
• API change Renamed ip6_vector_*() routines to ip6vector_*().
• API change Renamed sa_vector data structure to strvector.
• API change Renamed sa_vector_*() routines to strvector_*().
• API change Renamed sa_stream data structure to strstream.
• API change Renamed sa_stream_*() routines to strstream_*().
• API change Renamed uintvector data structure to uintvector.
• API change Renamed uintvector_*() routines to uintvector_*().
• API change Renamed uint16_vector data structure to uint16vector.
• API change Renamed uint16_vector_*() routines to uint16vector_*().
• API change Renamed uint32_vector data structure to uint32vector.
• API change Renamed uint32_vector_*() routines to uint32vector_*().
• API change Renamed uint64_vector data structure to uint64vector.
• API change Renamed uint64_vector_*() routines to uint64vector_*().
• API change All length parameters byte_*() are now uint64_t.
• API change byte_fill() - unsigned char parameter changed to type char.
• API change stralloc_insertb() - const char* parameter changed to type const void*.
• API change stralloc_overlayb() - const char* parameter changed to type const void*.
• API change stralloc_remove_all() - const char* parameter changed to type const void*.
• API change stralloc_trim() - const char* parameter changed to type const void*.
• API change ip4vector.h split from ip4.h.
• API change ip6vector.h split from ip6.h.
• New byte_replace() function.
• New byte_replace_control() function.
• New byte_replace_non_printable() function.
• New byte_replace(3) document byte_replace(), byte_replace_control(), byte_replace_non_printable() functions.
• New blocking_disable() function - analogous to ndelay_on().
• New blocking_enable() function - analogous to ndelay_off().
• New stralloc_case_diffb() function.
• New stralloc_case_equalb() function.
• New stralloc_overlay() function.
• New stralloc_overlayb() function.
• New stralloc_insert() function.
• New stralloc_replace_control() function.
• New prot_sid() function (prot.h) - wrapper for setsid().
• New ip4vector_purge() function.
• New ip6vector_purge() function.
• New ip4vector_unique() function.
• New ip6vector_unique() function.
• New passwd_uid() function (passwd.h) - wrapper for getpwnam().
• New passwd_uid_gid() function (passwd.h) - wrapper for getpwnam().
• New passwd_uid_gid_dir() function (passwd.h) - wrapper for getpwnam().
• New passwd_login() function (passwd.h) - wrapper for getpwuid().
• New passwd_login_dir() function (passwd.h) - wrapper for getpwuid().
• New group_gid() function (group.h) - wrapper for getgrnam().
• New byte_copyr(3) split from byte_copy(3).
• New intvector(3) manual page - dynamically allocated vector of int data items.
• New intvector_append(3) - manual page.
• New intvector_erase(3) - manual page.
• New intvector_ready(3) - manual page.
• New uintvector(3) manual page - dynamically allocated vector of unsigned int data items.
• New uintvector_append(3) - manual page.
• New uintvector_erase(3) - manual page.
• New uintvector_ready(3) - manual page.
• New uint64vector_ready(3) - manual page.
• New uint64vector(3) manual page - dynamically allocated vector of unsigned int data items.
• New iopause* imported from Nemo DJBIO Library.
• New socket* imported from Nemo DJBIO Library.
• New timeoutio* imported from Nemo DJBIO Library.
• Changed stralloc_replace(3) documented stralloc_replace_control(3).
• Changed stralloc_*() - improved allocation detection + code optimisation.
• Changed strvector_*() - improved allocation detection + code optimisation.
• Changed unix_now() - upgraded to use clock_gettime(CLOCK_REALTIME, struct timespec *).
• Changed tai_now() - upgraded to use clock_gettime(CLOCK_REALTIME, struct timespec *).
• Changed taia_now() - upgraded to use clock_gettime(CLOCK_REALTIME, struct timespec *).
• Changed wait_pid() return pid_t integer type.
• Changed wait_nohang() return pid_t integer type.
• Changed stralloc_qp_decode() - upgraded to use strstream data structure.
• Changed constmap_*() - upgraded to use strstream data structure.
• Changed wait(3) updated to reflect changes.
• Changed Various sig_*.c split into single routine source files.
• Changed error_nametoolong constant added to error.h.
• Changed setsid(), setgid(), setegid(), setuid(), seteuid() declarations added to unix.h.
• Changed socket_*() - minor code optimisations.
• Fixed ip4_mask_scan() - now returns the number of characters parsed, no longer requires a NULL terminated character string as input.
• Fixed taia_timestamp() - properly account for null void*.
• Fixed siphash.c updated to compile under gcc v8.3.0.
• Fixed alloc(3) pointer types.

v2.13 - April 17, 2019

This release contains new code, code optimisations, changes and fixes.

Version Notes
• New byte_fill() function.
• New open_cwd() function.
• New sa_vector_insert() function - insert an stralloc entry into a sa_vector data structure.
• New error_invalidarg - error constant (EINVAL).
• New sa_vector_copy(3) manual page.
• Changed unix_randombytes() - output data is now void*.
• Changed cpu_abi_name() - recognises more CPU ABIs.
• Changed uint16_pack(), uint16_pack_big() - code optimisation.
• Changed uint16_unpack(), uint16_unpack_big() - code optimisation.
• Changed uint32_pack(), uint32_pack_big() - code optimisation.
• Changed uint32_unpack(), uint32_unpack_big() - code optimisation.
• Changed uint64_pack(), uint64_pack_big() - code optimisation.
• Changed uint64_unpack(), uint64_unpack_big() - code optimisation.
• Fixed unix_cryptorandomnumber() return value is of type uint32_t.
• Fixed Installation of fmt_long(3) manual page.
• Fixed Comment in byte.h.

v2.12 - January 28, 2019

This release contains new code, speed optimisations, changes and fixes.

Version Notes
• New sa_vector_reverse() function - reverse the entries in a sa_vector data structure.
• New sa_vector_appendb() function - append a data block to a sa_vector data structure.
• New sa_vector_appends() function - append a null-terminated string to a sa_vector data structure.
• New uint32_vector_erase() function - remove all entries from an uint32_vector data structure.
• New uint32_vector_lower() function - change to lower an array of Unicode code points (uint32_t).
• New uint32_vector_utf8_decode() function - decode UTF-8 data into array of Unicode code points (uint32_t).
• New sa_vector_purge() function - remove all empty entries from vector.
• New uint32_vector(3) manual page - dynamically allocated vector of uint32_t data items.
• New uint32_vector_append(3) manual page - append data to uint32_vector data structure.
• New uint32_vector_erase(3) manual page.
• New uint32_vector_ready(3) - manual page.
• New char_b64_chars data structure.
• New char_b64_table data structure.
• Changed Renamed conf-home to conf-prefix.
• Changed Renamed byte_case_start() to byte_case_starts().
• Changed byte_case_diff() - speed optimisation.
• Changed byte_case_equal() - speed optimisation.
• Changed byte_case_starts() - speed optimisation.
• Changed byte_equal() - speed optimisation.
• Changed byte_lower() - speed optimisation.
• Changed byte_upper() - speed optimisation.
• Changed stralloc_case_diff() - speed optimisation.
• Changed stralloc_case_diffs() - speed optimisation.
• Changed stralloc_case_end() - speed optimisation.
• Changed stralloc_case_equal() - speed optimisation.
• Changed stralloc_case_equals() - speed optimisation.
• Changed stralloc_case_start() - speed optimisation.
• Changed stralloc_case_starts() - speed optimisation.
• Changed stralloc_cat() - speed optimisation.
• Changed stralloc_copy() - speed optimisation.
• Changed stralloc_diff() - speed optimisation.
• Changed stralloc_diffb() - speed optimisation.
• Changed stralloc_diffs() - speed optimisation.
• Changed stralloc_end() - speed optimisation.
• Changed stralloc_endb() - speed optimisation.
• Changed stralloc_ends() - speed optimisation.
• Changed stralloc_equal() - speed optimisation.
• Changed stralloc_equalb() - speed optimisation.
• Changed stralloc_equals() - speed optimisation.
• Changed stralloc_lower() - speed optimisation.
• Changed stralloc_start() - speed optimisation.
• Changed stralloc_startb() - speed optimisation.
• Changed stralloc_starts() - speed optimisation.
• Changed stralloc_upper() - speed optimisation.
• Changed unix_randombytes() - speed optimisation.
• Changed replaced all comparison instances of '== -1' to '< 0'.
• Changed sa_vector_ready(3) manual page - new ERROR HANDLING section.
• Changed Split sa_vector_cat.mdoc into sa_vector_append.mdoc and sa_vector_cat.mdoc.
• Changed All mdoc files - change text substitution literals (inspired by GNU Autoconf Makefile.in syntax).
• Changed conf-release-date renamed to DATE.
• Changed Removed executable bit from all files.
• Changed Minor changes to build system.
• Fixed sa_vector*(3) manual pages - fix declarations in SYNOPSIS section.
• Fixed ip4_mask_scan() - coding error.
• Fixed ip6_mask_scan() - coding error.
• Fixed Many mdoc files - miscellaneous fixes.

v2.11 - March 9, 2018

This release contains new code, changes and fixes.

Version Notes
• New uint16_reverse() function.
• New uint32_reverse() function.
• New uint64_reverse() function.
• New char_tolower() function.
• New char_toupper() function.
• New test_ip6 - test scanning of IPv6 text representations.
• Changed error_str() - error_dquot implemented.
• Changed ip4_scan() - code optimisation.
• Changed ip4_scanbracket() - code optimisation.
• Changed ip6_scanbracket() - code optimisation.
• Changed ip6_mask_scanbracket() - code optimisation.
• Fixed ip4_mask_scan() - improved error condition detection + code optimisation.
• Fixed ip6_mask_scan() - improved error condition detection + code optimisation.
• Fixed ip6_copyin_ip4() - remove initialisation of output to ip6_v4_mapped_prefix.
• Fixed ip6_scan() - fixed false negative errors - complete rewrite.

v2.10 - December 28, 2017

This release contains new code, changes and fixes.

Version Notes
• New __NORETURN__ definition in macro_noreturn.h - definition to declare a routine that it will not return.
It is installed into the nemo include directory.
• Changed macro_unsued.h - now installed into the nemo include directory.
• Changed Added execl() definition to unix.h.
• Changed Added execlp() definition to unix.h.
• Changed Minor changes to build system.
• Fixed pathexec_run(), et al - now removes prefixed path from argv[0] argument passed to execve().

v2.9 - December 4, 2017

This release contains new code and fixes.

Version Notes
• New ip6_mask_scanbracket().
• New ip6_mask_scan().
• New uint_vector_sort().
• New uint_vector_swap().
• New unix_randombytes() - create a block of random bytes. Derived from NaCl randombytes().
• New test_stdints - test our range of standard integer sizes (compile time).
• New cpu_abi_name() - return ABI name of CPU (compile time).
• New sig_int - new constant in sig.h.
• New sig_int - new constant in sig.c.
• New char_ispunct() - test for punctuation character.
• New stralloc_upper() - convert ASCII lowercase bytes to uppercase in a stralloc structure.
• New stralloc_upper(3) manual page.
• New stralloc_remove(3) manual page.
• Changed Minor changes to build system.
• Fixed ip4_mask_scan() - improved error condition detection.
• Fixed ip4_port_scan() - improved error condition detection.
• Fixed ip6_port_scan() - improved error condition detection.
• Fixed Various manual pages not being installed.
• Fixed stralloc_lower(3) - changed reference from case_lower() to byte_lower().
• Fixed stralloc_replace(3) - changed parameter type from int to char.
• Fixed stralloc_replace_non_printable(3) - changed parameter type from int to char.

v2.8.3 - August 18, 2017

This release contains optimisations and fixes. Particular emphasis is on cross platform compatibility.

Tested on Linux raspberrypi 4.9.35-v7+ #1014 SMP, armv7l GNU/Linux - Raspbian with Desktop, 32 bit platform.

Version Notes
• Fixed tai_epoch() - change parenthesis of cast to time_t.
Reported by Philip Hempel.
• Fixed print-unixtype-h.c - now uses local stdint.h header file.
Reported by Philip Hempel.
• Fixed print-unixtype-h.c - generate "guard" defines for compatability with other development environments.
• Fixed byte_case_start() - comparison test for upper case.
• Fixed str_case_start() - comparison test for upper case.
• Fixed str_*.c - changed source formatting - resolve -Werror=misleading-indentation compile warnings in gcc 6.3.x.
Reported by Philip Hempel.
• Fixed byte_*.c - changed source formatting - resolve -Werror=misleading-indentation compile warnings in gcc 6.3.x.
• Fixed ip4_*.c - changed source formatting - resolve -Werror=misleading-indentation compile warnings in gcc 6.3.x.
• Fixed ip6_*.c - changed source formatting - resolve -Werror=misleading-indentation compile warnings in gcc 6.3.x.
• Fixed tai_*.c - changed source formatting - resolve -Werror=misleading-indentation compile warnings in gcc 6.3.x.
• Fixed taia_*.c - changed source formatting - resolve -Werror=misleading-indentation compile warnings in gcc 6.3.x.
• Changed unix.h - added recv() and send() declarations.
• Changed conf-cc - updated examples for later versions of glibc.
Reported by Philip Hempel.

v2.8.2 - August 3, 2017

This release contains build fixes.

Version Notes
• Fixed Minor change to build system - renamed the local command define to clr-define - possible name conflict.
Reported by Philip Hempel.

v2.8.1 - June 26, 2017

This release contains new code, fixes and optimisations.

Version Notes
• New char_isgraph().
• New char_isspace().
• Changed char_isalpha() - internal structure.
• Changed char_isdigit() - internal structure.
• Changed ip6_copyin_ip4() - initialised with ip6_v4_mapped_prefix data structure.
• Fixed ip6_fmt() - last separator before IPv4 address is now ':' character.
• Fixed ip6_is_v4_mapped() - prefix comparison test.

v2.8 - May 18, 2017

This release contains a change in API, new code, optimisations.

Version Notes
• New stralloc_case_starts().
• New char_isalpha().
• New char_isdigit().
• New sa_vector_sort().
• New sa_vector_swap().
• New sa_vector_unique().
• New ip4_pack_uint32().
• New byte_count().
• New stralloc_count().
• API change char_isprint() - now static inline declaration.
• API change sa_stream_getc() - now returns unsigned int.
• API change sa_vector_case_find() - requires input data to be sorted.
• API change sa_vector_find() - requires input data to be sorted.
• Changed ip4_vector_find() - code optimisation.
• Changed ip6_vector_find() - code optimisation.
• Changed sa_vector_remove() - code optimisation.
• Fixed stralloc_qp_decode() - allow tabs ('\t') in the input.
• Fixed char_isprint() - handling of sign extension of character array index.
• Fixed stralloc_qp_decode() - handling of sign extension of character array index.
• Fixed scan_8long() - handling of sign extension of character array index.
• Fixed scan_ulong() - handling of sign extension of character array index.
• Fixed scan_xlong() - handling of sign extension of character array index.

v2.7 - February 12, 2017

This release contains a change in API, new code, optimisations and fixes.

Version Notes
• New uint_vector_erase()
• New uint64_pack()
• New uint64_pack_big()
• New uint64_unpack()
• New uint64_unpack_big()
• New str_find() - find position of substring in another string.
• New str_findb() - find position of block data in string.
• New byte_upper() - convert ASCII lowercase bytes to uppercase.
• New base64url_decode() - decode a Base64URL (RFC2045) encoded character.
• New base64url_encode() - encode plain text character into a Base64URL (RFC2045) encoded character.
• New stralloc_base64url_decode() - decode stralloc containing a series of Base64URL (RFC2045) encoded characters.
• New stralloc_base64url_encode() - encode stralloc into a series of Base64URL (RFC2045) encoded characters.
• New stralloc_qp_decode() - decode stralloc containing a series of Quoted-Printable (RFC2045) encoded characters.
• New stralloc_qp_encode() - encode stralloc into Quoted-Printable (RFC2045) encoded characters.
• New surf() - Simple Unpredictable Random Function.
• New surfpcs() - SURF protected counter sums.
• New constmap.h - CONSTMAP define for initialisation.
• New choose.sh - shell script for make.
• New define.sh - shell script for make.
• API change siphash24() - now accepts const void* instead of const byte_t* for input data.
• API change tai_epoch() - return value of type time_t.
• API change taia_epoch() - return value of type time_t.
• API change stralloc_base32_decode() - return value of type unsigned int.
• API change stralloc_base32hex_decode() - return value of type unsigned int.
• API change stralloc_base64_decode() - return value of type unsigned int.
• Changed siphash24() - now uses uint64_unpack() instead of reference macro.
• Changed prot.c - split into prot_uid.c prot_gid.c.
• Changed stralloc_base32_decode(), stralloc_base32_encode() - no longer modify output if error occurs.
• Changed stralloc_base32hex_decode(), stralloc_base32hex_encode() - no longer modify output if error occurs.
• Changed stralloc_base64_decode(), stralloc_base64_encode() no longer modify output if error occurs.
• Changed unix.h - inclusion of fchmod().
• Changed unix.h - inclusion of fchown().
• Changed unix.h - inclusion of kill().
• Changed c-auto-str.c - change 0 to '\0' for char array initialisation.
• Changed taia_timestamp() - now returns formatted text length and can handle a null parameter value.
• Changed subgetopt(3) - changed formatting.
• Changed env_get() - optimised code, inspired by similar routine in ezmlm package.
• Changed open_append(), open_read(), open_trunc(), open_trunc() - changed O_NDELAY to O_NONBLOCK.
• Changed lock_*.c - code format changes.
• Changed Makefile - removed shar target.
• Fixed stralloc_start(3) - manual page correlates to API.
• Fixed stralloc_end(3) - manual page correlates to API.
• Fixed sa_vector(3) - formatting.
• Fixed tai_unix() - handling of signedness of internal calculation.
• Fixed Minor changes to build system.
• Removed warn-auto.h
• Removed FILES - unused and high maintenance.

v2.6 - July 18, 2016

Version Notes
• API change ip6_address - new data member sid (scope id).
• API change IP6_FMT - expanded to handle scope id.
• Changed ip4_port_scan() - improve error checking.
• Changed ip4_scan() - improve error checking.
• Changed ip6_equal_mask() - rewrite to existing routines.
• Changed ip6_fmt() - append scope id, if not zero.
• Changed ip6_scan() - scan for scope id and improve error checking.
• Changed Changes to build system.
• Changed print-docman.sh and print-mancat.sh - removed second parameter, output now to stdout.
• Changed print-docman.sh - renamed to print-sedit.sh.
• Removed ip6_fmt_flat().
• Removed ip6_scan_flat() - use bracket convention instead.

v2.5.2 - June 20, 2016

Version Notes
• New sa_stream(3) - simple streaming routines using stralloc as the underlying buffer.
• Changed hier.c - removed unnecessary cast.
• Changed install.c, install_support.c - changed some #include declarations.
• Changed Changes to build system.
• Changed conf-cc - add comment about building on gcc+glibc platform.
• Fixed prot.c - compile error (gcc+glibc) - changed some #include declarations.
• Fixed unixtypes.h - now built during make - according to machine architecture and/or BSD versus glibc definitions.
• Fixed install_support.c - compile error (gcc+glibc) - changed some #include declarations.
• Fixed unix_cryptorandomnumber.c - compile error (gcc+glibc) - change cast from unsigned long to unsigned int.
• Fixed test_stralloc_base32.c, test_stralloc_base32hex.c, test_stralloc_base64.c - compile error (gcc+glibc) - now test for return value of write() function.

v2.5.1 - March 30, 2016

Version Notes
• New conf-manuser - owner (user) of the installed manual pages and directories.
• New unsigned int install_manuid - libdjbinstall, libinstcheck - owner (user) of the installed manual pages and directories (cf conf-manuser).
• Changed hier.c - updated to use unsigned int install_manuid (libdjbinstall, libinstcheck).
• Fixed Minor changes to build system.

v2.5 - December 2, 2015

Version Notes
• New int_vector_len() - return length of int_vector, safely - declared as static inline.
• New ip4_vector_len() - return length of ip4_vector, safely - declared as static inline.
• New ip6_vector_len() - return length of ip6_vector, safely - declared as static inline.
• New uint_vector_len() - return length of int_vector, safely - declared as static inline.
• New uint32_vector_len() - return length of int_vector, safely - declared as static inline.
• API change constmap() - now returns const char *; first parameter now const struct constmap *.
• API change int_vector_init(), int_vector_ready(), int_vector_readyplus() - now declared as static inline.
• API change ip4_vector_init(), ip4_vector_ready(), ip4_vector_readyplus() - now declared as static inline.
• API change ip6_vector_init(), ip6_vector_ready(), ip6_vector_readyplus() - now declared as static inline.
• API change stralloc_init(), stralloc_ready(), stralloc_readyplus(), stralloc_len() - now declared as static inline.
• API change uint_vector_init(), uint_vector_ready(), uint_vector_readyplus() - now declared as static inline.
• API change uint32_vector_init(), uint32_vector_ready(), uint32_vector_readyplus() - now declared as static inline.
• Fixed unix.h - gethostname() - second parameter now declared as size_t - formerly unsigned int.

v2.4.1 - October 14, 2015

Version Notes
• New ip6_mask_0() - set to zero all bits outside of a specified mask for an IPv6 address.
• New ip6_shift_left() - shift left all bits in IPv6 address.
• New ip6_shift_right() - shift right all bits in IPv6 address.
• Changed ip6_reverse() - reversal based on nibble (4bit) alignment.
• Fixed ip4_equal_mask(), ip6_equal_mask() - byte aligned mask fix.
• Fixed Base32 routines and data structure conform to RFC4648.

v2.4 - September 18, 2015

Version Notes
• API change siphash24() - now returns the hash as uint64_t instead of low endian data via function call parameter.

v2.3.1 - October 14, 2015

Version Notes
• Changed constmap() and constmap_init() now use siphash24() for hash generation.
• Changed constmap_hash now declared as uint64_t.

v2.3 - September 7, 2015

Version Notes
• New siphash24() - new pseudo-random function designed by Jean-Philippe Aumasson and Daniel J Bernstein, optimised for short inputs.
• New siphash(3) - manual page.
• API change str_*() - replaced char * function parameters with void *.
• API change ip4_vector_find() - now returns unsigned int - returns length for not found condition.
• API change ip6_vector_find() - now returns unsigned int - returns length for not found condition.
• Changed Minor changes to build system.
• Fixed trydrent.c - fixed compile errors for gcc v5.1.

v2.2.5 - August 7, 2015

Version Notes
• New ip6_fmt_uncompressed() - IPv6 format without removing consecutive zeroes.
• Changed ip6_fmt() - code optimisation.
• Changed c-auto-define - extended to accommodate "guard" definition command line option.
• Fixed ip6_address.mdoc - document dependance on <ip4.h> header.

v2.2.4 - July 31, 2015

Version Notes
• New unixtypes.h - data types previously declared in <stdint.h>.
• Changed stdint.h - unix types removed, now in <unixtypes.h> header.
• Changed stdint.h - improve platform portability.
• Changed tai_now() - uses unix_now() for time source.
• Changed unix_cryptorandomnumber.c - improve platform portability.
• Changed seek_*.c - added <unixtypes.h> header & improve platform portability.
• Changed tai_*.c - added <unixtypes.h> header.
• Changed taia_*.c - added <unixtypes.h> header.
• Changed Minor changes to build system.
• Changed Manual pages - incorporate first line of file 'VERSION' into footer.
• Changed tai*.mdoc - document new dependance on <unixtypes.h> header.
• Changed taia*.mdoc - document new dependance on <unixtypes.h> header.

v2.2.3 - July 15, 2015

Version Notes
• New taia_epoch() - return seconds since unix epoch - taia(3).
• New taia_seconds() - return seconds - taia(3).
• New taia_unix() - set time, using unix time - taia(3).
• Changed tai(3) - added documentation of tai_unix(), tai_epoch() and tai_seconds().
• Changed taia(3) - added documentation of taia_unix(), taia_epoch() and taia_seconds().
• Changed Minor changes to build system.
• Fixed taia(3) - function name in synopsis.

v2.2.2 - July 9, 2015

Version Notes
• Changed sa_vector_parse_config() - defensive initialisation of local variable.
• Changed unix.h - inclusion of many more common unix routines.
• Changed unix.h - change prototype of chown().
• Changed seek_*() - simplify as a result of <unix.h> header file changes.
• Changed alloc.c1, alloc.c2 - simplify as a result of <unix.h> header file changes.
• Changed Minor changes to build system.
• Fixed byte_case_diff(), byte_lower(), str_case_diff(), str_lower() - fix upper case range check.

v2.2.1 - July 6, 2015

Version Notes
• Changed Minor cosmetic manual page changes.
• Changed Minor changes to build system.
• Fixed byte_rchr() - revert to original source code.

v2.2 - July 1, 2015

Version Notes
• API change scan_*() all functions now refer to const void * instead of const char *.
• Changed Minor cosmetic manual page changes.
• Changed Minor changes to build system.
• Changed byte_case_diff(), byte_lower(), str_case_diff(), str_lower() - algorithm change - less computation.

v2.1 - June 29, 2015

Version Notes
• New tai_seconds() - routine.
• New ip4_vector_find() - formerly ip4_vector_search().
• New ip4_equal_mask() - routine.
• New ip6_equal_mask() - routine.
• New byte_case_diff(3) - manual page.
• New byte_case_start(3) - manual page.
• New byte_lower(3) - manual page.
• New str_case_diff(3) - manual page.
• New str_case_start(3) - manual page.
• New str_lower(3) - manual page.
• New byte_case_start.c - routine - from DJB's publicfile package; formerly case_startb().
• New byte_lower() - formerly case_lowerb().
• New byte_case_diff() - formerly case_diffb().
• New byte_case_equal() - formerly case_equalb().
• New str_case_start() - formerly case_starts().
• New str_lower() - formerly case_lowers().
• New str_case_diff() - formerly case_diffs().
• New str_case_equal() - formerly case_equals().
• New ip6_vector_find() - formerly ip6_vector_search().
• API change stralloc_append() - API change - now refers to const void * instead of const char *.
• API change tai_pack() - API change - now refers to void * instead of char *.
• API change tai_unpack() - API change - now refers to const void * instead of const char *.
• API change taia_fmtfrac() - API change - now refers to void * instead of char *.
• API change taia_pack() - API change - now refers to void * instead of char *.
• API change taia_unpack() - API change - now refers to const void * instead of const char *.
• API change taia_fmtfrac() - API change - now refers to void * instead of char *.
• API change taia_timestamp() - API change - now refers to void * instead of char *.
• API change byte_*() - API change - all functions now refer to void * instead of char *.
• API change fmt_*() - API change - all functions now refer to void * instead of char *.
• API change uint16_*() - API change - uint16_t is now the first parameter.
• API change uint32_*() - API change - uint32_t is now the first parameter.
• API change ip4_vector_search() - ip4_vector * parameter is now passed as const ip4_vector *.
• API change ip4_fmt() - API change - now refers to void * instead of char *.
• API change ip4_fmtiaa() - API change - now refers to void * instead of char *.
• API change ip6_fmt() - API change - now refers to void * instead of char *.
• API change ip6_vector_search() - the ip6_vector is now passed as a const.
• API change error_str() - now returns const char *; formerly char *
• API change str_start() - returns unsigned int; formerly int
• Changed Stricter compiler error reporting.
• Changed Code optimisation or many source files.
• Changed Minor cosmetic manual page changes.
• Changed install_log.c - remove static open_*() routines; use local library version of open_*() routines.
• Changed more has*.h header files install into public includes location.
• Changed Added symlink() declaration into <unix.h> header file.
• Fixed ip4_vector_sort() - bug fix.
• Fixed ip6_vector_sort() - bug fix.
• Fixed ip6_fmt() - fix IPv4 mask format if in middle of zero reduction.
• Removed trycpp.c.
• Removed case.h - functionality now handled by byte_*() and str_*() routines.

v2.0.3 - February 12, 2015

Version Notes
• New ip4_reverse() - routine - reverse the order of the octets.
• New ip6_reverse() - routine - reverse the order of the octets.
• New stralloc_endb() - routine - compare the end of a stralloc buffer with a data block.
• New stralloc_ends() - routine - compare the end of a stralloc buffer with a string.
• New sa_vector_lower() - routine.
• API change sa_vector_find() - the sa_vector * is now passed as const sa_vector *.
• API change sa_vector_case_find() - the sa_vector * is now passed as const sa_vector *.
• Changed stralloc_start.c - code optimisation.
• Changed stralloc_starts.c - code optimisation.
• Changed stralloc_end.c - code optimisation.
• Changed stralloc_copys.c - code optimisation.
• Changed stralloc_base64_encode.c - code optimisation.
• Changed stralloc_base64_decode.c - code optimisation.
• Changed ip6_scan() - disable processing of standalone IPv4 address.
• Changed Minor cosmetic manual page changes.

v2.0.2 - January 23, 2015

Version Notes
• New Implemented configuration option: conf-devtcp - flag for TCP devices.
• New Imported open_*() routines from nemo-libdjbio.
• Fixed Makefile - implemented c-auto-define to create __UNUSED__ macro.
• Fixed Makefile - implemented c-auto-define to create other build time macros.
• Fixed Minor changes to build process.
• Removed "systype" processing.

v2.0.1 - January 19, 2015

Version Notes
• New Program: c-auto-define. (Undocumented)
• New c-auto-octal - formerly c-auto-int8.
• New fmt_8long() - formerly fmt_octal(), to complement scan_8long()
• New fmt_8long.mdoc - formerly fmt_octal.mdoc, to complement scan_8long
• Changed c-auto-gid, c-auto-octal, c-auto-str, c-auto-uid, c-auto-uint - minor optimisation.
• Fixed c-auto-bool - bug fix & minor optimisation.

v2.0 - January 17, 2015 - Major Changes from Original Distribution

General:

Version Notes
• New Manual pages created for existing routines.
• New Makefile target: "clean".
• New To avoid name clashes with header files, header files are installed in a subdirectory "nemo" (in the includes directory).
• New Implemented configuration option, conf-stdint - take advantage the system <stdint.h> header file.
• New Implemented configuration option, conf-home - installation hierarchy prefix.
• New Implemented configuration option, conf-malloc-aligned - to use the system malloc(3) if it returns pointers to aligned memory.
• New Programs: c-auto-bool, c-auto-gid, c-auto-int8, c-auto-str, c-auto-uid, c-auto-uint. (Undocumented)
• New Implemented some of the standard integer types in the POSIX standard.
• API change Changed many signed integers into unsigned integers.
• API change Changed many signed return values into unsigned return values.
• Changed Function prototypes for all subroutines.
• Changed Converted K&R prototypes to ANSI.
• Changed All manual pages have been converted to mdoc(7) format.
• Changed Additional annotations/comments - some source code files.
• Changed All public header files are compatible with C++ development environments.
• Changed Source code formatting is now "Compact Control Readability Style" - variant of K&R, similar to the Stroustrup variant.
One exception: single line conditional returns are on same line as the conditional.
Long lines are rarely wrapped.
Indent size is two spaces.
• Fixed In scripts and the Makefile, all references to "head -1" have been changed to "head -n 1".
• Fixed Patched source code to use #include <errno.h>
• Fixed Resolved all compile errors and warnings from the GNU C compiler (-W -Wall -Werror).

Routines and data structures:

Version Notes
• New base32c(3) - routines - encode/decode base 32 characters.
• New base64c(3) - routines - encode/decode base 64 characters.
• New byte_chr(3) - manual page - locate character in sequence of bytes.
• New byte_copy(3) - manual page - copy sequence of bytes.
• New byte_diff(3) - manual page - compare two sequences of bytes.
• New byte_zero(3) - routine - zero the contents of a region of memory.
• New error(3) - additional error constants.
• New error_str(3) - additional error strings.
• New fmt(3) - manual page - overview of formatting routines.
• New fmt_hexb(3) - manual page - format binary data into hexadecimal text.
• New fmt_long(3) - manual page - format long integer into text.
• New fmt_minus(3) - manual page - emit a '-' character if argument is negative.
• New fmt_octal(3) - manual page - format unsigned integer into octal text.
• New fmt_plusminus(3) - routine - emit a '+' or '-' character dependant on the numerical sign of the argument.
• New fmt_str(3) - manual page - format null terminated string into text.
• New fmt_uint(3) - manual page - format unsigned integer into text.
• New fmt_ulong(3) - manual page - format unsigned long integer into text.
• New fmt_xlong(3) - manual page - format unsigned long integer into hexadecimal text.
• New int_vector(3) - data structure - dynamically allocated int vector interface. (Undocumented)
• New ip4_address(3) - data structure + routines - IP version 4 address data.
• New ip4_vector(3) - IPv4 data structure vector and support routines. (Undocumented)
• New ip6_address(3) - data structure + routines - IP version 6 address data.
• New ip6_vector(3) - IPv6 data structure vector and support routines. (Undocumented)
• New sa_vector(3) - data structure + routines - sa_vector() is a dynamic vector of stralloc(3) data structures.
• New stralloc_base64_decode(3) - routine - decode a series of Base64 encoded characters from one stralloc structure into another.
• New stralloc_base64_encode(3) - routine - Base64 encode a series of characters in one stralloc structure into another.
• New stralloc_chr(3) - routines - locate character in a stralloc(3) data structure.
• New stralloc_lower(3) - routine - convert ASCII uppercase bytes to lowercase in a stralloc structure.
• New stralloc_replace(3) - routines - replace characters in a stralloc data structure with a specific character.
• New stralloc_trim(3) - routine - removes trailing chars from a stralloc buffer.
• New stralloc_zero(3) - routine - zero the contents of the stralloc buffer.
• New tai(3) - imported routines - from the original DJB libtai library.
• New tai(3) - imported manual pages - from DJB website.
• New taia(3) - imported routines - from the original libtai library.
• New taia(3) - imported manual pages - from DJB website.
• New uint_vector(3) - data structure - dynamically allocated unsigned int vector interface. (Undocumented)
• New uint32_vector(3) - data structure - dynamically allocated unsigned 32bit int vector interface. (Undocumented)
• New uint64_vector(3) - data structure - dynamically allocated unsigned 64bit int vector interface. (Undocumented)
• New unix_cryptorandomnumber(3) - routine - attempt to create a portable random number generator.
• New unix_now(3) - routine - get current time, in seconds.
• Changed stralloc(3) - now uses a discrete subroutine to handle buffer allocation adjustments, previously it was implemented as a macro.

Libraries:

Version Notes
• New libdjb.a - the main library.
• New libdjbinstall.a - assist in installing files to specific locations. It logs all transactions. (Undocumented)
• New libdjbinstcheck.a - companion library to the libdjbinstall.a library. (Undocumented)