feat(config): added cktan/tomlc17 to the project
This commit is contained in:
parent
e3a2f43871
commit
1e4677bcda
3 changed files with 2983 additions and 0 deletions
190
include/tomlc17.h
Normal file
190
include/tomlc17.h
Normal 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
22
licenses/tomlc17-MIT
Normal 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
2771
src/tomlc17.c
Normal file
File diff suppressed because it is too large
Load diff
Loading…
Add table
Add a link
Reference in a new issue