toml/README.md

119 lines
2.3 KiB
Markdown
Raw Normal View History

2017-03-18 21:20:51 +00:00
# tomlc99
2020-08-18 21:46:20 +00:00
TOML in c99; v1.0 compliant.
2017-03-18 21:20:51 +00:00
2020-11-01 08:18:30 +00:00
If you are looking for a C++ library, you might try this wrapper: [https://github.com/cktan/tomlcpp](https://github.com/cktan/tomlcpp).
2020-11-01 08:17:17 +00:00
## Usage
2017-03-18 21:20:51 +00:00
Please see the `toml.h` file for details. What follows is a simple example that
parses this config file:
```toml
2017-03-18 21:20:51 +00:00
[server]
host = "www.example.com"
port = 80
2017-03-18 21:20:51 +00:00
```
The steps for getting values from our file is usually :
2017-03-18 21:20:51 +00:00
1. Parse the whole TOML file.
2. Get a single table from the file.
3. Find a value from the table.
2020-11-02 01:52:57 +00:00
4. 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.
2017-03-18 21:20:51 +00:00
```c
FILE* fp;
toml_table_t* conf;
char errbuf[200];
2017-03-18 21:20:51 +00:00
/* Open the file. */
if (0 == (fp = fopen("path/to/file.toml", "r"))) {
2019-10-09 23:44:07 +00:00
return handle_error();
}
/* Run the file through the parser. */
conf = toml_parse_file(fp, errbuf, sizeof(errbuf));
if (0 == conf) {
2019-10-09 23:44:07 +00:00
return handle_error();
}
fclose(fp);
/* Alternatively, use `toml_parse` which takes a string rather than a file. */
2020-09-18 16:39:53 +00:00
conf = toml_parse("A null terminated string that is TOML\0", errbuf, sizeof(errbuf));
```
2. Get a single table from the file.
2017-03-18 21:20:51 +00:00
```c
toml_table_t* server;
/* Locate the [server] table. */
if (0 == (server = toml_table_in(conf, "server"))) {
2019-10-09 23:44:07 +00:00
return handle_error();
}
```
3. Find a value from the table.
2017-03-18 21:20:51 +00:00
```c
/* Extract 'host' config value. */
2020-11-02 01:52:57 +00:00
toml_access_t host = toml_string_in(server, "host");
if (!host.ok) {
toml_free(conf);
2019-10-09 23:44:07 +00:00
return handle_error();
}
2020-11-02 01:52:57 +00:00
toml_access_t port = toml_int_in(server, "port");
if (!port.ok) {
toml_free(conf);
free(host.u.s);
2019-10-09 23:44:07 +00:00
return handle_error();
}
2017-03-18 21:20:51 +00:00
2020-11-02 01:52:57 +00:00
printf("host %s\n", host.u.s);
printf("port %d\n", port.u.i);
```
2017-03-18 21:20:51 +00:00
2020-11-02 01:52:57 +00:00
4. Then, free up that memory if needed.
2017-03-18 21:20:51 +00:00
```c
/* Use `toml_free` on the table returned from `toml_parse[_file]`. */
toml_free(conf);
2017-03-18 21:20:51 +00:00
2020-11-02 01:52:57 +00:00
/* Free any string values returned from access functions. */
free(host.u.s);
2017-03-18 21:20:51 +00:00
```
## Building
2017-03-18 21:20:51 +00:00
A normal *make* suffices. Alternately, you can also simply include the
`toml.c` and `toml.h` files in your project.
## Testing
2017-03-18 21:20:51 +00:00
To test against the standard test set provided by BurntSushi/toml-test:
```sh
% make
% cd test1
% bash build.sh # do this once
% bash run.sh # this will run the test suite
2019-10-08 23:58:18 +00:00
```
2017-03-18 21:20:51 +00:00
2019-10-08 23:58:18 +00:00
To test against the standard test set provided by iarna/toml:
2017-03-18 21:20:51 +00:00
```sh
% make
% cd test2
% bash build.sh # do this once
% bash run.sh # this will run the test suite
2019-10-08 23:58:18 +00:00
```