Skip to content
C M4 Makefile Shell Batchfile
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.
autostuff Commit #140 Nov 29, 2019
docs Commit #140 Nov 29, 2019
src Commit #140 Nov 29, 2019
tests Commit #136 Oct 3, 2019
.editorconfig Commit #126 Nov 11, 2018
AUTHORS Commit #95 Apr 19, 2018
COPYING First commit Oct 5, 2016
ChangeLog Commit #140 Nov 29, 2019 Apr 19, 2018
INSTALL Commit #140 Nov 29, 2019 Commit #140 Nov 29, 2019 Commit #140 Nov 29, 2019
NEWS Commit #140 Nov 29, 2019
README Commit #140 Nov 29, 2019 First commit Oct 5, 2016
bootstrap Commit #140 Nov 29, 2019 Commit #140 Nov 29, 2019
mgwmake.bat Commit #138 Oct 19, 2019

libconfini {#readme}

libconfini is the ultimate and most consistent INI file parser library written in C. It focuses on standardization and parsing exactness and is at ease with almost every type of file containing key/value pairs.

The library is fast and suitable for embedded systems. Its algorithms are written from scratch and do not depend on any external library, except for the C standard headers stdio.h, stdlib.h and stdint.h.

Rather than storing the parsed data, libconfini gives the developer the freedom to choose what to do with them through a custom callback invoked for each INI node read. The API has been designed to be powerful, flexible and simple to use.

With libconfini you will find in INI files the same serialization power you would normally find in other heavily structured formats (such as JSON, YAML, TOML), but with the advantage of using the most human-readable configuration format ever invented (thanks to their informal status, INI files are indeed more fluid and human-readable than formats explicitly designed with this purpose, such as YAML and TOML).


  • Typed data support (each value can be parsed as a boolean, a number, a string, an array)
  • Single/double quotes support in Bash single quotes style
  • Multi-line support
  • Comment support
  • Disabled entry support
  • INI sectioning support (single-level sectioning, as in [foo]; absolute nesting, as in []; relative nesting, as in [.bar])
  • Automatic sanitization of values, key names and section paths
  • Comparison functions designed just for INI source code (capable, for example, to recognize the equality between "Hello world" and "He"l'lo' world, or between foo bar and foo    bar)
  • Callback pattern
  • Thread-safety (each parsing process is fully reentrant)
  • Highly optimized code (single memory allocation for each parsing, heuristic programming, optimization flags)
  • Function modularity (each public function is independent from all other public functions)
  • K.I.S.S. (no public functions are automatically invoked during the parsing -- for example, not even single/double quotes are automatically removed from values unless the developer explicitly decides to use the formatting functions provided by the API)
  • Robust and cross-platform file access (UTF-8 support; protection against null byte injection; support of all code representations of new lines -- i.e. ubiquitous support of Classic Mac OS' CR, Unix' LF, Windows' CR+LF, RISC OS Open's LF+CR)

Sample usage


have_visited = ronnie, lilly82, robrob

date = 12.03.2017


#include <confini.h>

static int callback (IniDispatch * disp, void * v_other) {

  #define IS_KEY(SECTION, KEY) \
    (ini_array_match(SECTION, disp->append_to, '.', disp->format) && \
    ini_string_match_ii(KEY, disp->data, disp->format))

  if (disp->type == INI_KEY) {

    if (IS_KEY("users", "have_visited")) {

      /* No need to parse this field as an array right now */
      printf("People who have visited: %s\n", disp->value);

    } else if (IS_KEY("last_update", "date")) {

      printf("Last update: %s\n", disp->value);



  #undef IS_KEY

  return 0;


int main () {

  if (load_ini_path("log.ini", INI_DEFAULT_FORMAT, NULL, callback, NULL)) {

    fprintf(stderr, "Sorry, something went wrong :-(\n");
    return 1;


  return 0;



People who have visited: ronnie, lilly82, robrob
Last update: 12.03.2017

For more details, please read the Library Functions Manual (man libconfini -- a standalone HTML version is available here) and the manual of the header file (man confini.h). The code is available on GitHub under madmurphy/libconfini).


Despite the small footprint, libconfini has been conceived as a shared library (but it can be used as a static library as well). An automatic list of the distributions that ship the library already compiled is available here.

If a pre-compiled package for your platform is not available, on most Unix-like systems it is possible to install libconfini using the following common steps:

make install-strip

If the strip utility is not available on your machine, use make install instead (it will produce larger binaries)

For a minimum installation without development files (i.e. static libraries, headers, documentation, examples, etc.) use ./configure --disable-devel.

If the configure script is missing from your package you need to generate it by running the bootstrap script. By default, bootstrap will also run the configure script immediately after having generated it, so you may type the make command directly after bootstrap. To list different options use ./bootstrap --help.

If you are using Microsoft Windows, a batch script for compiling libconfini with MinGW without Bash is available (mgwmake.bat). If you are interested in using Autotools for compiling libconfini under Microsoft Windows, you can integrate MinGW with MSYS, or you can directly use MSYS2. Alternatively, an unofficial port of libconfini for Cygwin is available.

For further information, see INSTALL.

Free software

This library is free software. You can redistribute it and/or modify it under the terms of the GPL license version 3 or any later version. See COPYING for details.

You can’t perform that action at this time.