feat(config): added cktan/tomlc17 to the project

This commit is contained in:
lisk77 2025-08-28 23:48:39 +02:00
parent e3a2f43871
commit 1e4677bcda
3 changed files with 2983 additions and 0 deletions

190
include/tomlc17.h Normal file
View file

@ -0,0 +1,190 @@
/* Copyright (c) 2024-2025, CK Tan.
* https://github.com/cktan/tomlc17/blob/main/LICENSE
*/
#ifndef TOMLC17_H
#define TOMLC17_H
/*
* USAGE:
*
* 1. Call toml_parse(), toml_parse_file(), or toml_parse_file_ex()
* 2. Check result.ok
* 3. Use toml_get() or toml_seek() to query and traverse the
* result.toptab
* 4. Call toml_free() to release resources.
*
*/
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#ifdef __cplusplus
#define TOML_EXTERN extern "C"
#else
#define TOML_EXTERN extern
#endif
enum toml_type_t {
TOML_UNKNOWN = 0,
TOML_STRING,
TOML_INT64,
TOML_FP64,
TOML_BOOLEAN,
TOML_DATE,
TOML_TIME,
TOML_DATETIME,
TOML_DATETIMETZ,
TOML_ARRAY,
TOML_TABLE,
};
typedef enum toml_type_t toml_type_t;
/* This is a Node in a Tree that represents a toml document rooted
* at toml_result_t::toptab.
*/
typedef struct toml_datum_t toml_datum_t;
struct toml_datum_t {
toml_type_t type;
uint32_t flag; // internal
union {
const char *s; // same as str.ptr; use if there are no NUL in string.
struct {
const char *ptr; // NUL terminated string
int len; // length excluding the terminating NUL.
} str;
int64_t int64; // integer
double fp64; // float
bool boolean;
struct { // date, time
int16_t year, month, day;
int16_t hour, minute, second;
int32_t usec;
int16_t tz; // in minutes
} ts;
struct { // array
int32_t size; // count elem
toml_datum_t *elem; // elem[]
} arr;
struct { // table
int32_t size; // count key
const char **key; // key[]
int *len; // len[]
toml_datum_t *value; // value[]
} tab;
} u;
};
/* Result returned by toml_parse() */
typedef struct toml_result_t toml_result_t;
struct toml_result_t {
bool ok; // success flag
toml_datum_t toptab; // valid if ok
char errmsg[200]; // valid if not ok
void *__internal; // do not use
};
/**
* Parse a toml document. Returns a toml_result which must be freed
* using toml_free() eventually.
*
* IMPORTANT: src[] must be a NUL terminated string! The len parameter
* does not include the NUL terminator.
*/
TOML_EXTERN toml_result_t toml_parse(const char *src, int len);
/**
* Parse a toml file. Returns a toml_result which must be freed
* using toml_free() eventually.
*
* IMPORTANT: you are still responsible to fclose(fp).
*/
TOML_EXTERN toml_result_t toml_parse_file(FILE *fp);
/**
* Parse a toml file. Returns a toml_result which must be freed
* using toml_free() eventually.
*/
TOML_EXTERN toml_result_t toml_parse_file_ex(const char *fname);
/**
* Release the result.
*/
TOML_EXTERN void toml_free(toml_result_t result);
/**
* Find a key in a toml_table. Return the value of the key if found,
* or a TOML_UNKNOWN otherwise.
*/
TOML_EXTERN toml_datum_t toml_get(toml_datum_t table, const char *key);
/**
* Locate a value starting from a toml_table. Return the value of the key if
* found, or a TOML_UNKNOWN otherwise.
*
* Note: the multipart-key is separated by DOT, and must not have any escape
* chars. The maximum length of the multipart_key must not exceed 127 bytes.
*/
TOML_EXTERN toml_datum_t toml_seek(toml_datum_t table,
const char *multipart_key);
/**
* OBSOLETE: use toml_get() instead.
* Find a key in a toml_table. Return the value of the key if found,
* or a TOML_UNKNOWN otherwise. (
*/
static inline toml_datum_t toml_table_find(toml_datum_t table,
const char *key) {
return toml_get(table, key);
}
/**
* Override values in r1 using r2. Return a new result. All results
* (i.e., r1, r2 and the returned result) must be freed using toml_free()
* after use.
*
* LOGIC:
* ret = copy of r1
* for each item x in r2:
* if x is not in ret:
* override
* elif x in ret is NOT of the same type:
* override
* elif x is an array of tables:
* append r2.x to ret.x
* elif x is a table:
* merge r2.x to ret.x
* else:
* override
*/
TOML_EXTERN toml_result_t toml_merge(const toml_result_t *r1,
const toml_result_t *r2);
/**
* Check if two results are the same. Dictinary and array orders are
* sensitive.
*/
TOML_EXTERN bool toml_equiv(const toml_result_t *r1, const toml_result_t *r2);
/* Options that override tomlc17 defaults globally */
typedef struct toml_option_t toml_option_t;
struct toml_option_t {
bool check_utf8; // Check all chars are valid utf8; default: false.
void *(*mem_realloc)(void *ptr, size_t size); // default: realloc()
void (*mem_free)(void *ptr); // default: free()
};
/**
* Get the default options. IF NECESSARY, use this to initialize
* toml_option_t and override values before calling
* toml_set_option().
*/
TOML_EXTERN toml_option_t toml_default_option(void);
/**
* Set toml options globally. Do this ONLY IF you are not satisfied with the
* defaults.
*/
TOML_EXTERN void toml_set_option(toml_option_t opt);
#endif // TOMLC17_H

22
licenses/tomlc17-MIT Normal file
View file

@ -0,0 +1,22 @@
MIT License
Copyright (c) 2024-2025, CK Tan
https://github.com/cktan/tomlc17
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

2771
src/tomlc17.c Normal file

File diff suppressed because it is too large Load diff