Need help with tomlc99?
Click the “chat” button below for chat support from the developer who created it, or find similar developers for support.

About the developer

cktan
271 Stars 60 Forks Other 137 Commits 3 Opened issues

Description

TOML C library

Services available

!
?

Need anything else?

Contributors list

# 242,758
C
Shell
toml
103 commits
# 565,022
C
Shell
toml
3 commits
# 230,232
C
Shell
single-...
c-plus-...
2 commits
# 659,100
C
Shell
toml
1 commit
# 189,624
C
Rust
cargo-s...
Neovim
1 commit
# 545,865
C
Shell
toml
Go
1 commit
# 323,420
Objecti...
plugin-...
Neovim
vim8
1 commit
# 645,943
C
Shell
JavaScr...
toml
1 commit
# 286,009
Shell
Erlang
PHP
toml
1 commit

tomlc99

TOML in c99; v1.0 compliant.

If you are looking for a C++ library, you might try this wrapper: https://github.com/cktan/tomlcpp.

Usage

Please see the

toml.h
file for details. What follows is a simple example that parses this config file:
[server]
    host = "www.example.com"
    port = [ 8080, 8181, 8282 ]

The steps for getting values from our file is usually :

  1. Parse the TOML file.
  2. Traverse and locate a table in TOML.
  3. Extract values from the table.
  4. Free up allocated memory.

Below is an example of parsing the values from the example table.

#include 
#include 
#include 
#include 
#include "toml.h"

static void error(const char* msg, const char* msg1) { fprintf(stderr, "ERROR: %s%s\n", msg, msg1?msg1:""); exit(1); }

int main() { FILE* fp; char errbuf[200];

// 1. Read and parse toml file
fp = fopen("sample.toml", "r");
if (!fp) {
    error("cannot open sample.toml - ", strerror(errno));
}

toml_table_t* conf = toml_parse_file(fp, errbuf, sizeof(errbuf));
fclose(fp);

if (!conf) {
    error("cannot parse - ", errbuf);
}

// 2. Traverse to a table.
toml_table_t* server = toml_table_in(conf, "server");
if (!server) {
    error("missing [server]", "");
}

// 3. Extract values
toml_datum_t host = toml_string_in(server, "host");
if (!host.ok) {
    error("cannot read server.host", "");
}

toml_array_t* portarray = toml_array_in(server, "port");
if (!portarray) {
    error("cannot read server.port", "");
}

printf("host: %s\n", host.u.s);
printf("port: ");
for (int i = 0; ; i++) {
    toml_datum_t port = toml_int_at(portarray, i);
    if (!port.ok) break;
    printf("%d ", (int)port.u.i);
}
printf("\n");

// 4. Free memory
free(host.u.s);
toml_free(conf);
return 0;

} </stdlib.h></errno.h></string.h></stdio.h>

Accessing Table Content

TOML tables are dictionaries where lookups are done using string keys. In general, all access functions on tables are named

toml_*_in(...)
.

In the normal case, you know the key and its content type, and retrievals can be done using one of these functions:

c
toml_string_in(tab, key);
toml_bool_in(tab, key);
toml_int_in(tab, key);
toml_double_in(tab, key);
toml_timestamp_in(tab, key);
toml_table_in(tab, key);
toml_array_in(tab, key);

You can also interrogate the keys in a table using an integer index:

c
toml_table_t* tab = toml_parse_file(...);
for (int i = 0; ; i++) {
    const char* key = toml_key_in(tab, i);
    if (!key) break;
    printf("key %d: %s\n", i, key);
}

Accessing Array Content

TOML arrays can be deref-ed using integer indices. In general, all access methods on arrays are named

toml_*_at()
.

To obtain the size of an array:

c
int size = toml_array_nelem(arr);

To obtain the content of an array, use a valid index and call one of these functions:

c
toml_string_at(arr, idx);
toml_bool_at(arr, idx);
toml_int_at(arr, idx);
toml_double_at(arr, idx);
toml_timestamp_at(arr, idx);
toml_table_at(arr, idx);
toml_array_at(arr, idx);

tomldatumt

Some

toml_*_at
and
toml_*_in
functions return a tomldatumt structure. The
ok
flag in the structure indicates if the function call was successful. If so, you may proceed to read the value corresponding to the type of the content.

For example:

toml_datum_t host = toml_string_in(tab, "host");
if (host.ok) {
    printf("host: %s\n", host.u.s);
    free(host.u.s);   /* FREE applies to string and timestamp types only */
}

** IMPORTANT: if the accessed value is a string or a timestamp, you must call

free(datum.u.s)
or
free(datum.u.ts)
respectively after usage. **

Building and installing

A normal make suffices. You can also simply include the

toml.c
and
toml.h
files in your project.

Invoking

make install
will install the header and library files into /usr/local/{include,lib}.

Alternatively, specify

make install prefix=/a/file/path
to install into /a/file/path/{include,lib}.

Testing

To test against the standard test set provided by BurntSushi/toml-test:

% make
% cd test1
% bash build.sh   # do this once
% bash run.sh     # this will run the test suite

To test against the standard test set provided by iarna/toml:

% make
% cd test2
% bash build.sh   # do this once
% bash run.sh     # this will run the test suite

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.