14#ifndef LOADERS_DATA_STORAGE_H
15#define LOADERS_DATA_STORAGE_H
25struct gp_data_rational {
30typedef struct gp_storage gp_storage;
31typedef struct gp_data_dict gp_data_dict;
37 struct gp_data_rational rat;
41typedef struct gp_data_node {
42 enum gp_data_type type;
43 union gp_data_value value;
45 struct gp_data_node *next;
51gp_storage *gp_storage_create(
void);
56void gp_storage_destroy(gp_storage *self);
61gp_data_node *gp_storage_root(gp_storage *self);
66gp_data_node *gp_data_dict_first(gp_data_node *node);
71void gp_storage_clear(gp_storage *self);
76void gp_data_print(
const gp_data_node *node);
78static inline void gp_storage_print(gp_storage *self)
80 gp_data_print(gp_storage_root(self));
83const char *gp_data_type_name(
enum gp_data_type type);
90gp_data_node *gp_storage_get(gp_storage *self,
91 gp_data_node *node,
const char *
id);
101gp_data_node *gp_storage_get_by_path(gp_storage *self, gp_data_node *node,
113gp_data_node *gp_storage_add(gp_storage *self,
114 gp_data_node *node, gp_data_node *data);
121gp_data_node *gp_storage_add_int(gp_storage *self, gp_data_node *node,
122 const char *
id,
long i);
124gp_data_node *gp_storage_add_string(gp_storage *self, gp_data_node *node,
125 const char *
id,
const char *str);
127gp_data_node *gp_storage_add_double(gp_storage *self, gp_data_node *node,
128 const char *
id,
double d);
130gp_data_node *gp_storage_add_rational(gp_storage *self, gp_data_node *node,
131 const char *
id,
long num,
long den);
133gp_data_node *gp_storage_add_dict(gp_storage *self, gp_data_node *node,