102 lines
2.0 KiB
Markdown
102 lines
2.0 KiB
Markdown
|
# tomlc99
|
||
|
TOML in c99; v0.4.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
|
||
|
```
|
||
|
|
||
|
For each config param, the code first extracts a raw value and then
|
||
|
convert it to a string or integer depending on context.
|
||
|
|
||
|
```
|
||
|
|
||
|
FILE* fp;
|
||
|
toml_table_t* conf;
|
||
|
toml_table_t* server;
|
||
|
const char* raw;
|
||
|
char* host;
|
||
|
int64_t port;
|
||
|
char errbuf[200];
|
||
|
|
||
|
/* open file and parse */
|
||
|
if (0 == (fp = fopen(FNAME, "r"))) {
|
||
|
perror("fopen");
|
||
|
exit(1);
|
||
|
}
|
||
|
conf = toml_parse_file(fp, errbuf, sizeof(errbuf));
|
||
|
fclose(fp);
|
||
|
if (0 == conf) {
|
||
|
fprintf(stderr, "ERROR: %s\n", errbuf);
|
||
|
exit(1);
|
||
|
}
|
||
|
|
||
|
/* locate the [server] table */
|
||
|
if (0 == (server = toml_table_in(conf, "server"))) {
|
||
|
fprintf(stderr, "ERROR: missing [server]\n");
|
||
|
toml_free(conf);
|
||
|
exit(1);
|
||
|
}
|
||
|
|
||
|
/* extract host config value */
|
||
|
if (0 == (raw = toml_raw_in(server, "host"))) {
|
||
|
fprintf(stderr, "ERROR: missing 'host' in [server]\n");
|
||
|
toml_free(conf);
|
||
|
exit(1);
|
||
|
}
|
||
|
if (toml_rtos(raw, &host)) {
|
||
|
fprintf(stderr, "ERROR: bad value in 'host'\n");
|
||
|
toml_free(conf);
|
||
|
exit(1);
|
||
|
}
|
||
|
|
||
|
/* extract port config value */
|
||
|
if (0 == (raw = toml_raw_in(server, "port"))) {
|
||
|
fprintf(stderr, "ERROR: missing 'port' in [server]\n");
|
||
|
free(host);
|
||
|
toml_free(conf);
|
||
|
exit(1);
|
||
|
}
|
||
|
if (toml_rtoi(raw, &port)) {
|
||
|
fprintf(stderr, "ERROR: bad value in 'port'\n");
|
||
|
free(host);
|
||
|
toml_free(conf);
|
||
|
exit(1);
|
||
|
}
|
||
|
|
||
|
/* done with conf */
|
||
|
toml_free(conf);
|
||
|
|
||
|
/* use host and port */
|
||
|
do_work(host, port);
|
||
|
|
||
|
/* clean up */
|
||
|
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 test
|
||
|
% bash build.sh # do this once
|
||
|
% bash run.sh # this will run the test suite
|
||
|
```
|
||
|
|
||
|
|