Change Log {#changelog}
=======================


## 1.8.0 -- 2018-10-28

Changes:

* Created `typedef`s of callback functions (types `IniStatsHandler` and
  `IniDispHandler`, both required by `load_ini_file()` and `load_ini_path()`,
  type `IniStrHandler`, required by `ini_array_split()`, and type
  `IniSubstrHandler`, required by `ini_array_foreach()`)
* Internal macro † `_LIBCONFINI_INIFORMAT_AS_()` has been renamed to
  `INIFORMAT_TABLE_AS()` and marked as public -- please note that the arguments
  that are passed to the user-given callback are now different
* Introduced **libtool** versioning system for the compiled binary (versioning
  begins with current version 1.8.0, represented as `0:0:0`); note that
  **libtool** versioning system does not affect the versioning of the project
  currently in use, but constitutes only a means for the linker to keep track of
  incompatibilities between different releases of the library
* Improved support for building **libconfini** under Microsoft Windows (created
  Windows resource file `src/winres.rc`; conditionally added option
  `-avoid-version` to `LDFLAGS` in order to skip foreign **libtool** versioning
  system under Microsoft Windows; created batch script `mgwmake.bat` for
  compiling **libconfini** under Microsoft Windows without **Autotools**)
* Code review (`ini_fton()` and `ini_ntof()`)
* Updated **Autotools** macros
* Documentation
* Created new examples (see `examples/topics/ini_array_foreach.c`,
  `examples/topics/ini_array_split.c` and `examples/miscellanea/stats_only.c`)


## 1.7.3 -- 2018-10-19

Changes:

* Code review (`load_ini_file()`, private function `get_type_as_active()`)
* Made sure that the `CLOSE_SECTION` character (`]`) is never followed by
  anything else than empty spaces
* Documentation


## 1.7.2 -- 2018-10-12

Changes:

* Code review (`load_ini_path()` -- see issue
  [#6](https://github.com/madmurphy/libconfini/issues/6) concerning file
  access under Microsoft Windows)
* Documentation -- see issues
  [#5](https://github.com/madmurphy/libconfini/issues/5) and
  [#6](https://github.com/madmurphy/libconfini/issues/6)


## 1.7.1 -- 2018-10-08

Changes:

* Added `--disable-doc` and `--disable-examples` options to the `configure`
  script
* Added `--noconfigure` and `--help` options to the `autogen.sh` script


## 1.7.0 -- 2018-10-06

Changes:

* Default format `INI_UNIXLIKE_FORMAT` has been created
* † `IniFormat::no_disabled_after_space` has been renamed to
  `IniFormat::disabled_after_space` (the field has opposite meaning now, please
  invert your booleans accordingly)
* Moved `#include <stdio.h>` from `confini.c` to `confini.h`
* Documentation
* Examples


## 1.6.3 -- 2018-09-29

Changes:

* Constant † `CONFINI_EFEOOR` has been renamed to `CONFINI_EOOR`
* Code review
* Documentation


## 1.6.2 -- 2018-05-21

Changes:

* Code review (private functions `ltrim_hh()`, `unescape_cr_lf()`,
  `sanitize_section_path()`, `collapse_everything()`, `collapse_spaces()` and
  `uncomment()`)
* Documentation
* Examples


## 1.6.1 -- 2018-05-17

Changes:

* Function `ini_array_match()` has been created
* Documentation
* Examples


## 1.6.0 -- 2018-05-15

Changes:

* Functions `ini_array_shift()`, `ini_array_break()`, `ini_array_release()` have
  been created
* Made sure that escapable characters cannot be used as delimiters in formats
  that support escape sequences
* Boolean pair `OFF`/`ON` has been added to the list of supported INI booleans
* Boolean pair `0`/`1` has been removed from the list of supported INI booleans
* Public macro `INIFORMAT_HAS_NO_ESC` has been created
* Redundant function † `ini_get_lazy_bool()` has been removed
* The buffer pointed by `IniDispatch::append_to` is now passed as `const`
* Code review (`ini_string_match_ss()`, `ini_string_match_si()`,
  `ini_string_match_ii()`, `ini_string_parse()`, `ini_array_get_length()`,
  `ini_array_foreach()`, `ini_array_split()`, private functions `uncomment()`
  and `further_cuts()`)
* Private functions `get_metachar_pos()` and `collapse_empty_quotes()` have been
  created
* Private functions † `sanitize_key_name()` and † `get_delimiter_pos()` have
  been renamed to `collapse_everything()` and `getn_metachar_pos()` (the latter
  now requires one more argument)
* Documentation
* Examples


## 1.5.2 -- 2018-05-06

Changes:

* Added `IniFormat::section_paths` option to the `IniFormat` bitfield
* Created `enum` `IniSectionPaths`
* Made sure that implicit keys containing only empty quotes are ignored in
  formats that support quotes
* Private function † `ultrim_h()` has been renamed to `qultrim_h()` and
  rewritten
* Code review (`ini_array_foreach()`, `ini_array_split()`, `ini_string_parse()`,
  private functions † `get_delimiter_pos()` and `get_type_as_active()`)


## 1.5.1 -- 2018-04-30

Changes:

* Changed field order and size in the `IniFormat` bitfield
* Changed internal values of `INI_KEY`, `INI_SECTION`, `INI_DISABLED_KEY` and
  `INI_DISABLED_SECTION` (see `enum` `IniNodeType`)
* Moved example INI files to `examples/ini_files`
* Documentation


## 1.5.0 -- 2018-04-22

Changes:

* Added `IniFormat::preserve_empty_quotes` option to the `IniFormat` bitfield
* † `IniFormat::hash`, † `IniFormat::semicolon` and
  † `IniFormat::multiline_entries` have been renamed to
  `IniFormat::hash_marker`, `IniFormat::semicolon_marker` and
  `IniFormat::multiline_nodes`
* Function `ini_string_parse()` has been created
* Function † `ini_collapse_array()` has been renamed to `ini_array_collapse()`
* Function † `ini_split_array()` has been renamed to `ini_array_split()`
* Function † `ini_set_implicit_value()` has been renamed to
  `ini_global_set_implicit_value()`
* Function † `confini_global_set_lowercase_mode()` has been renamed to
  `ini_global_set_lowercase_mode()`
* Global variable † `INI_INSENSITIVE_LOWERCASE` has been renamed to
  `INI_GLOBAL_LOWERCASE_MODE`
* Default value of `INI_GLOBAL_LOWERCASE_MODE` has been set to `FALSE`
* Data type † `IniFormatId` has been renamed to `IniFormatNum`
* † `ini_format_get_id()` has been renamed to `ini_fton()`
* † `ini_format_set_to_id()` has been renamed to `ini_ntof()` -- now accepts
  only one argument and has a return value
* Constants † `INI_PARSE_COMMENT`, † `INI_SHOW_COMMENT`, † `INI_FORGET_COMMENT`
  and † `INI_NORMAL_CHARACTER` have been renamed to `INI_DISABLED_OR_COMMENT`,
  `INI_ONLY_COMMENT`, `INI_IGNORE` and `INI_IS_NOT_A_MARKER`
* Constants † `INI_EVERYTHING_MULTILINE`, † `INI_ACTIVE_AND_DISABLED_MULTILINE`
  and † `INI_ACTIVE_MULTILINE` have been renamed to `INI_MULTILINE_EVERYWHERE`,
  `INI_BUT_COMMENTS`, and `INI_BUT_DISABLED_AND_COMMENTS`
* Constants † `CONFINI_EIINTR` and † `CONFINI_EFEINTR` have been renamed to
  `CONFINI_IINTR` and `CONFINI_FEINTR`
* `enum` tags † `ConfiniErrorNo` and † `IniComments` have been renamed to
  `ConfiniInterruptNo` and `IniCommentMarker`
* Private function † `sanitize_section_name()` has been renamed to
  `sanitize_section_path()`
* Created private function † `sanitize_key_name()`
* Code review (`ini_array_get_length()`, `ini_string_match_si()`,
  `ini_string_match_ii()`, private functions `sanitize_section_path()` and
  `collapse_spaces()`)
* Made sure that sections appended to root as pseudo-subsections will be
  dispatched always without the leading dot
* Made sure that key and section names will always be cleaned of empty quotes in
  formats that support quotes (relevant for space collapsing)
* Removed unused internationalization support from **Autotools**
* Documentation
* Examples

Due to the many renamings this release is largely incompatible with previous
versions. However it is possible to reach full backward compatibility with
version 1.4.2 by using the following aliases:

    #define hash hash_marker
    #define semicolon semicolon_marker
    #define multiline_entries multiline_nodes
    #define ini_collapse_array ini_array_collapse
    #define ini_split_array ini_array_split
    #define ini_set_implicit_value ini_global_set_implicit_value
    #define INI_INSENSITIVE_LOWERCASE INI_GLOBAL_LOWERCASE_MODE
    #define IniFormatId IniFormatNum
    #define ini_format_get_id ini_fton
    #define ini_format_set_to_id(DEST, SRC) (*(DEST) = ini_ntof(SRC))
    #define INI_PARSE_COMMENT INI_DISABLED_OR_COMMENT
    #define INI_SHOW_COMMENT INI_ONLY_COMMENT
    #define INI_FORGET_COMMENT INI_IGNORE
    #define INI_NORMAL_CHARACTER INI_IS_NOT_A_MARKER
    #define INI_EVERYTHING_MULTILINE INI_MULTILINE_EVERYWHERE
    #define INI_ACTIVE_AND_DISABLED_MULTILINE INI_BUT_COMMENTS
    #define INI_ACTIVE_MULTILINE INI_BUT_COMMENTS
    #define CONFINI_EIINTR CONFINI_IINTR
    #define CONFINI_EFEINTR CONFINI_FEINTR


## 1.4.2 -- 2017-10-05

Changes:

* Code review and bug fix in private function † `sanitize_section_name()`


## 1.4.1 -- 2017-10-02

Changes:

* Created global preprocessor constant `CONFINI_ERROR`
* Created global variable † `INI_INSENSITIVE_LOWERCASE`
* Created functions † `confini_global_set_lowercase_mode()`,
  `ini_string_match_ss()`, `ini_string_match_si()` and `ini_string_match_ii()`
* Code review (data types, `enum` † `ConfiniErrorNo`, `load_ini_file()`,
  `ini_unquote()`)
* Moved `#include <stdint.h>` from `confini.c` to `confini.h`
* Moved back `#include <stdio.h>` from `confini.h` to `confini.c`
* Fixed UTF-8 BOM bug
* Documentation
* Examples


## 1.4.0 -- 2017-09-07

Changes:

* Function `load_ini_file()` now uses a `FILE` structure instead of a path -- in
  order to use a path (a string), the shortcut `load_ini_path()` has
  been created
* Added `#include <stdint.h>` to `confini.c`
* Moved `#include <stdio.h>` from `confini.c` to `confini.h`
* `nul` characters found in INI files will be skipped
* `unsigned long int` replaced with `size_t` in return values of
  `ini_unquote()`, `ini_array_get_length()` and † `ini_collapse_array()`
* `unsigned int` replaced with `int` in return values of `load_ini_file()`,
  `ini_array_foreach()` and † `ini_split_array()`
* UTF-8 BOM recognized and skipped
* Version numbering standardized (`${major}.${minor}.${revision}` instead of
  `${major}.${minor}-${release}`)
* Documentation

## 1.3-5 -- 2017-05-04

Changes:

* Fix for macOS compilation -- see:
  https://github.com/madmurphy/libconfini/commit/4c3e6ec0b73ab5a0449cf08d3504f73fdf5c0edd


## 1.3-4 -- 2016-11-10

Changes:

* Fixed some bugs concerning comments and disabled entries
* Removed recursion in private function `further_cuts()`


## 1.3-3 -- 2016-11-02

Changes:

* Files ending without EOL: bug fixed
* Added new documentation


## 1.3-2 -- 2016-10-28

Changes:

* Non collapsing spaces in implicit keys: bug fixed
* Code optimization
* Added new documentation


## 1.3-1 -- 2016-10-24

Changes:

* † `ini_collapse_array()` has been created
* `index` and `format` parameters have been added to callback function in
  `ini_array_foreach()` and † `ini_split_array()`
* † `INI_ERASE_COMMENT` has been renamed to † `INI_FORGET_COMMENT`
* Added new documentation and examples


## 1.2-2 -- 2016-10-21

Changes:

* Fixed bug in formatting inline comments
* Code optimization


## 1.2-1 -- 2016-10-20

Changes:

* Order of the `IniFormat` bitfield has been changed
* † `IniFormat::implicit_is_special` has been renamed to
  `IniFormat::implicit_is_not_empty`
* † `IniFormat::no_collapsed_values` has been renamed to
  `IniFormat::do_not_collapse_values`
* † `IniDispatch::d_length` has been renamed to `IniDispatch::d_len`
* † `IniDispatch::v_length` has been renamed to `IniDispatch::v_len`
* `IniDispatch::at_len` (length of `IniDispatch::append_to`) has been created


## 1.1-2 -- 2016-10-15

Changes:

* † `IniFormatMask` has been renamed to `IniFormatId`
* † `ini_format_set_from_mask()` has been renamed to † `ini_format_set_to_id()`
* † `ini_format_calculate_mask()` has been renamed to † `ini_format_get_id()`
* `IniFormat::no_spaces_in_names`: small bug fixed
* General code review


## 1.1-1 -- 2016-10-14

Changes:

* Fixed quotes nesting bug
* enum `IniDelimiters` has been created
* Added support for `INI_ANY_SPACE` (`0`) as delimiter in
  `ini_array_get_length()`, `ini_array_foreach()` and † `ini_split_array()`
* `IniFormat::no_spaces_in_names` has been created
* † `IniFormat::no_disabled_after_spaces` has been renamed to
  † `IniFormat::no_disabled_after_space`
* † `IniFormat::preserve_spaces_in_values` has been renamed to
  † `IniFormat::no_collapsed_values`


## 1.0-1 -- 2016-10-10

Changes:

* † `ini_array_getlength()` has been renamed to `ini_array_get_length()`
* † `ini_getbool()` has been renamed to `ini_get_bool()`
* † `ini_getlazybool()` has been renamed to `ini_get_lazy_bool()`
* † `ini_getfloat()` has been renamed to `ini_get_float()`
* † `ini_getllint()` has been renamed to `ini_get_llint()`
* † `get_ini_format_mask()` has been renamed to † `ini_format_calculate_mask()`
* † `read_ini_format_mask()` has been renamed to † `ini_format_set_from_mask()`


## 0.9-4 -- 2016-10-07

Changes:

* Small bug regarding multiline inline comments has been fixed


## 0.9-3 -- 2016-10-06

Changes:

* Small bug regarding inline comments has been fixed


## 0.9-2 -- 2016-10-06

Changes:

* Documentation has been moved to docs/


## 0.9-1 -- 2016-10-05

libconfini 0.9-1 is ready to be published!

