No description
Find a file
2020-10-25 18:48:14 -07:00
test1 v0.5 compliant 2019-10-08 16:58:18 -07:00
test2 updated Note.txt to reflect expected error conditions in test2/ 2020-07-14 16:57:35 -07:00
unittest Fix #7: toml_utf8_to_ucs() returns incorrect results 2018-06-08 14:41:44 -07:00
.editorconfig Add editorconfig file 2020-06-17 17:43:36 -05:00
.gitignore v0.5 compliant 2019-10-08 16:58:18 -07:00
LICENSE Add github link to license text 2017-04-16 23:19:51 -07:00
Makefile Note.txt 2020-06-13 16:18:57 -07:00
README.md Update README.md 2020-09-18 16:39:53 +00:00
toml.c remove use of setjmp/longjmp 2020-10-25 18:48:14 -07:00
toml.h Adds toml_raw_t to seperate raw and processed data 2020-07-08 21:45:48 -07:00
toml_cat.c Fix toml_cat abort on empty array 2018-07-04 14:30:45 +01:00
toml_json.c Handle more test cases 2019-08-16 04:35:14 -07:00

tomlc99

TOML in c99; v1.0 compliant.

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 = 80

The steps for getting values from our file is usually :

  1. Parse the whole TOML file.
  2. Get a single table from the file.
  3. Find a value from the table.
  4. Convert that value to the appropriate type, i.e., string, int, etc.
  5. Then, free up that memory if needed.

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

  1. Parse the whole TOML file.
FILE* fp;
toml_table_t* conf;
char errbuf[200];

/* Open the file. */
if (0 == (fp = fopen("path/to/file.toml", "r"))) {
	return handle_error();
}

/* Run the file through the parser. */
conf = toml_parse_file(fp, errbuf, sizeof(errbuf));
if (0 == conf) {
	return handle_error();
}

fclose(fp);

/* Alternatively, use `toml_parse` which takes a string rather than a file. */
conf = toml_parse("A null terminated string that is TOML\0", errbuf, sizeof(errbuf));
  1. Get a single table from the file.
toml_table_t* server;

/* Locate the [server] table. */
if (0 == (server = toml_table_in(conf, "server"))) {
	return handle_error();
}
  1. Find a value from the table.
  2. Convert that value to the appropriate type (I.E. string, int).
toml_raw_t raw;
char* host;
int64_t port;

/* Extract 'host' config value. */
if (0 == (raw = toml_raw_in(server, "host"))) {
	return handle_error();
}

/* Convert the raw value into a string. */
if (toml_rtos(raw, &host)) {
	return handle_error();
}

/* Extract 'port' config value. */
if (0 == (raw = toml_raw_in(server, "port"))) {
	return handle_error();
}

/* Convert the raw value into an int. */
if (toml_rtoi(raw, &port)) {
	return handle_error();
}
  1. Then, free up that memory if needed.
/* Use `toml_free` on the table returned from `toml_parse[_file]`. */
toml_free(conf);

/* Free any values returned from `toml_rto*`. */
free(host);

Building

A normal make suffices. Alternately, you can also simply include the toml.c and toml.h files in your project.

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