2025-05-10 21:28:42 +08:00

279 lines
13 KiB
C

/*********************************************************************************************************
* ------------------------------------------------------------------------------------------------------
* file description
* ------------------------------------------------------------------------------------------------------
* \file yaml.h
* \unit yaml
* \brief This is a C language version of yaml streamlined parser
* \author Lamdonn
* \version v0.1.0
* \license GPL-2.0
* \copyright Copyright (C) 2025 Lamdonn.
********************************************************************************************************/
#ifndef __yaml_H
#define __yaml_H
#ifdef __cplusplus
extern "C"
{
#endif
#include <stdarg.h>
#include <limits.h>
#include <stdlib.h>
/* version infomation */
#define YAML_V_MAJOR 0
#define YAML_V_MINOR 1
#define YAML_V_PATCH 0
/* yaml type definition, hiding structural members, not for external use */
/**
* \brief Opaque handle to YAML node structure
*
* This typedef provides an opaque pointer to the internal YAML node structure.
* The actual structure definition is hidden from external code to maintain encapsulation.
*/
typedef struct YAML* yaml_t;
/* yaml normal types define */
/**
* \brief Enumeration of YAML data types
*
* These constants represent the different data types supported by the YAML parser.
* They are used to identify the type of value stored in a YAML node.
*/
#define YAML_TYPE_NULL (0) /* null type */
#define YAML_TYPE_BOOL (1) /* bool type */
#define YAML_TYPE_INT (2) /* number int type */
#define YAML_TYPE_FLOAT (3) /* number float type */
#define YAML_TYPE_STRING (4) /* string type */
#define YAML_TYPE_DATE (5) /* date type */
#define YAML_TYPE_SEQUENCE (6) /* sequence type */
#define YAML_TYPE_MAPPING (7) /* mapping type */
#define YAML_TYPE_DOCUMENT (8) /* document type */
#define YAML_TYPE_REFERENCE (9) /* reference type */
#define YAML_TYPE_COMPLEX_KEY (10) /* complex key */
/* bool define */
/**
* \brief Boolean values
*
* These constants represent boolean true and false values in the YAML parser.
*/
#define YAML_FALSE (0) /* bool false */
#define YAML_TRUE (1) /* bool true */
/* error type define */
/**
* \brief Error codes returned by the YAML parser
*
* These constants represent various error conditions that can occur during YAML parsing.
* They are used to indicate the nature of parsing errors to the calling code.
*/
#define YAML_E_OK (0) /* ok, no error */
#define YAML_E_INVALID (1) /* invalid, not a valid expected value */
#define YAML_E_END (2) /* many invalid characters appear at the end */
#define YAML_E_KEY (3) /* parsing key, invalid key content found */
#define YAML_E_VALUE (4) /* parsing value, invalid value content found */
#define YAML_E_MEMORY (5) /* memory allocation failed */
#define YAML_E_SQUARE (6) /* mising ']' */
#define YAML_E_CURLY (7) /* mising '}' */
#define YAML_E_TAB (8) /* incorrect indent depth */
#define YAML_E_MIX (9) /* mix type */
#define YAML_E_FLINE (10) /* the first line of value can only be a literal */
#define YAML_E_LNUMBER (11) /* the number exceeds the storage capacity */
#define YAML_E_LBREAK (12) /* line break */
#define YAML_E_NANCHOR (13) /* null anchor */
#define YAML_E_IANCHOR (14) /* invalid anchor */
#define YAML_E_RANCHOR (15) /* repeat anchor */
#define YAML_E_UANCHOR (16) /* undefine anchor */
#define YAML_E_TANCHOR (17) /* type error anchor */
#define YAML_E_DATE (18) /* date error */
#define YAML_E_TARTGET (19) /* target error */
/* dump flags define */
/**
* \brief Flags used to control YAML dumping and loading behavior
*
* These flags can be combined using bitwise OR to modify the behavior
* of functions that dump or load YAML documents.
*/
#define YAML_F_NONE (0) /* none flag */
#define YAML_F_DFLOW (0x01) /* dumps flow format */
#define YAML_F_LDOCS (0x02) /* load muti documents */
#define YAML_F_NOKEY (0x04) /* operate without key */
#define YAML_F_COMPLEX (0x08) /* operate with complex key */
#define YAML_F_ANCHOR (0x10) /* operate with anchor */
#define YAML_F_RECURSE (0x20) /* operate recurse */
#define YAML_F_REFERENCE (0x40) /* operate with reference */
/**
* \brief Represents an invalid index value
*
* This constant is used to indicate an invalid or non-existent index
* in functions that operate on indexed YAML structures.
*/
#define YAML_INV_INDEX ((unsigned int)(-1))
// Functions for creating and deleting YAML nodes.
// These functions are used to initialize and free the memory resources of YAML nodes.
yaml_t yaml_create(void);
void yaml_delete(yaml_t yaml);
// Function for getting YAML parsing error information.
// It is used to obtain error line number and column number during YAML parsing.
int yaml_error_info(int* line, int* column);
// Functions for getting the type and size of a YAML node.
// Used to determine the data type of a YAML node and get the number of child elements of a container node.
int yaml_type(yaml_t yaml);
unsigned int yaml_size(yaml_t yaml);
// Functions for comparing and copying YAML nodes.
// Used to check if two YAML nodes are equal and to create a copy of a YAML node.
int yaml_compare(yaml_t yaml, yaml_t cmp, int flag);
yaml_t yaml_copy(yaml_t yaml, int flag);
// Functions for setting the key of a YAML node.
// Used to set a simple key or a complex key for a YAML node.
yaml_t yaml_set_key(yaml_t yaml, const char* key);
yaml_t yaml_set_key_complex(yaml_t yaml, yaml_t key);
// Functions for getting the key of a YAML node.
// Used to retrieve the simple key or complex key of a YAML node.
const char* yaml_key(yaml_t yaml);
yaml_t yaml_key_complex(yaml_t yaml);
// Functions for setting the value of a YAML node.
// Used to set a YAML node to different types of values such as null, boolean, integer, float, string, date, time, sequence, mapping, document, etc.
yaml_t yaml_set_null(yaml_t yaml);
yaml_t yaml_set_bool(yaml_t yaml, int b);
yaml_t yaml_set_int(yaml_t yaml, int num);
yaml_t yaml_set_float(yaml_t yaml, double num);
yaml_t yaml_set_string(yaml_t yaml, const char* string);
yaml_t yaml_set_date(yaml_t yaml, int year, char month, char day);
yaml_t yaml_set_time(yaml_t yaml, char hour, char minute, char second, int msec);
yaml_t yaml_set_utc(yaml_t yaml, char hour, char minute);
yaml_t yaml_set_sequence(yaml_t yaml, yaml_t sequence);
yaml_t yaml_set_mapping(yaml_t yaml, yaml_t mapping);
yaml_t yaml_set_document(yaml_t yaml, yaml_t document);
// Functions for getting the value of a YAML node.
// Used to retrieve the boolean value, integer value, float value, string value, sequence value, mapping value, document value, etc. of a YAML node.
int yaml_value_bool(yaml_t yaml);
int yaml_value_int(yaml_t yaml);
double yaml_value_float(yaml_t yaml);
const char* yaml_value_string(yaml_t yaml);
yaml_t yaml_value_sequence(yaml_t yaml);
yaml_t yaml_value_mapping(yaml_t yaml);
yaml_t yaml_value_document(yaml_t yaml);
// Functions for attaching and detaching YAML nodes.
// Used to attach a YAML node to another node or detach a child node from a node.
yaml_t yaml_attach(yaml_t yaml, unsigned int index, yaml_t attach);
yaml_t yaml_dettach(yaml_t yaml, unsigned int index);
// Functions for inserting values into a YAML node.
// Used to insert different types of values such as null, boolean, integer, float, string, sequence, mapping, document, reference, etc. into a YAML node.
yaml_t yaml_insert_null(yaml_t yaml, const char* key, unsigned int index);
yaml_t yaml_insert_bool(yaml_t yaml, const char* key, unsigned int index, int b);
yaml_t yaml_insert_int(yaml_t yaml, const char* key, unsigned int index, int num);
yaml_t yaml_insert_float(yaml_t yaml, const char* key, unsigned int index, double num);
yaml_t yaml_insert_string(yaml_t yaml, const char* key, unsigned int index, const char* string);
yaml_t yaml_insert_sequence(yaml_t yaml, const char* key, unsigned int index, yaml_t sequence);
yaml_t yaml_insert_mapping(yaml_t yaml, const char* key, unsigned int index, yaml_t mapping);
yaml_t yaml_insert_document(yaml_t yaml, unsigned int index, yaml_t document);
yaml_t yaml_insert_reference(yaml_t yaml, const char* key, unsigned int index, const char* anchor, yaml_t doc);
// Function for removing a value from a YAML node.
// Used to remove a value from a YAML node according to the key and index.
int yaml_remove(yaml_t yaml, const char* key, unsigned int index);
// Functions for getting the index of a YAML node.
// Used to obtain the index of a value in a YAML node, supporting the index acquisition of simple keys and complex keys.
unsigned int yaml_get_index(yaml_t yaml, const char* key, unsigned int index);
unsigned int yaml_get_index_complex(yaml_t yaml, yaml_t key);
// Functions for getting child nodes of a YAML node.
// Used to get the child nodes of a YAML node according to the key and index, supporting the retrieval of child nodes of simple keys and complex keys.
yaml_t yaml_get_child(yaml_t yaml, const char* key, unsigned int index);
yaml_t yaml_get_child_complex(yaml_t yaml, yaml_t key);
// Functions for setting and getting the alias of a YAML node.
// Used to set an alias for a YAML node and retrieve the alias of a YAML node.
yaml_t yaml_set_alias(yaml_t yaml, const char* alias, yaml_t doc);
const char* yaml_get_alias(yaml_t yaml);
// Functions for setting and getting the anchor of a YAML node.
// Used to set an anchor for a YAML node, retrieve the anchor, and get the size of the anchor.
yaml_t yaml_set_anchor(yaml_t yaml, const char* anchor, yaml_t doc);
yaml_t yaml_get_anchor(yaml_t yaml, unsigned int index);
unsigned int yaml_anchor_size(yaml_t yaml);
// YAML serialization functions.
// Used to serialize a YAML node into a string (yaml_dumps) or write it to a file (yaml_file_dump).
char* yaml_dumps(yaml_t yaml, int preset, int* len, int flag);
int yaml_file_dump(yaml_t yaml, char* filename);
// YAML deserialization functions.
// Used to load YAML data from a string (yaml_loads) or a file (yaml_file_dump) and construct a YAML node.
yaml_t yaml_loads(const char* text, int flag);
yaml_t yaml_file_load(char* filename, int flag);
// Macros for judging the type of a YAML node.
// Used to determine whether a YAML node is of a specific type (null, bool, int, float, string, sequence, mapping, document).
#define yaml_isnull(yaml) (yaml_type(yaml)==YAML_TYPE_NULL)
#define yaml_isbool(yaml) (yaml_type(yaml)==YAML_TYPE_BOOL)
#define yaml_isint(yaml) (yaml_type(yaml)==YAML_TYPE_INT)
#define yaml_isfloat(yaml) (yaml_type(yaml)==YAML_TYPE_FLOAT)
#define yaml_isstring(yaml) (yaml_type(yaml)==YAML_TYPE_STRING)
#define yaml_issequence(yaml) (yaml_type(yaml)==YAML_TYPE_SEQUENCE)
#define yaml_ismapping(yaml) (yaml_type(yaml)==YAML_TYPE_MAPPING)
#define yaml_isdocument(yaml) (yaml_type(yaml)==YAML_TYPE_DOCUMENT)
// Macros for adding values to a YAML node.
// Used to quickly add different types of values to a YAML sequence or mapping node.
#define yaml_seq_add_null(yaml) yaml_insert_null((yaml), 0, yaml_size((yaml)))
#define yaml_seq_add_bool(yaml, b) yaml_insert_bool((yaml), 0, yaml_size((yaml)), (b))
#define yaml_seq_add_int(yaml, num) yaml_insert_int((yaml), 0, yaml_size((yaml)), (num))
#define yaml_seq_add_float(yaml, num) yaml_insert_float((yaml), 0, yaml_size((yaml)), (num))
#define yaml_seq_add_string(yaml, string) yaml_insert_string((yaml), 0, yaml_size((yaml)), (string))
#define yaml_seq_add_sequence(yaml, sequence) yaml_insert_sequence((yaml), 0, yaml_size((yaml)), (sequence))
#define yaml_seq_add_mapping(yaml, mapping) yaml_insert_mapping((yaml), 0, yaml_size((yaml)), (mapping))
#define yaml_map_add_null(yaml, key) yaml_insert_null((yaml), (key), yaml_size((yaml)))
#define yaml_map_add_bool(yaml, key, b) yaml_insert_bool((yaml), (key), yaml_size((yaml)), (b))
#define yaml_map_add_int(yaml, key, num) yaml_insert_int((yaml), (key), yaml_size((yaml)), (num))
#define yaml_map_add_float(yaml, key, num) yaml_insert_float((yaml), (key), yaml_size((yaml)), (num))
#define yaml_map_add_string(yaml, key, string) yaml_insert_string((yaml), (key), yaml_size((yaml)), (string))
#define yaml_map_add_sequence(yaml, key, sequence) yaml_insert_sequence((yaml), (key), yaml_size((yaml)), (sequence))
#define yaml_map_add_mapping(yaml, key, mapping) yaml_insert_mapping((yaml), (key), yaml_size((yaml)), (mapping))
#ifdef __cplusplus
}
#endif
#endif