20 #if defined(WITH_SYCK)
22 static int rpmSyckFreeNode(
char *
key, rpmsyck_node node,
char *
arg) {
25 node->value.key =
_free(node->value.key);
29 node->value.seq =
_free(node->value.seq);
33 node->value.map =
htFree(node->value.map);
39 node->tag =
_free(node->tag);
45 static void rsFini(
void * _rpmSyck)
47 rpmSyck rs = (rpmSyck) _rpmSyck;
49 st_foreach(rs->syms, (
enum st_retval (*)(
const char *,
const void *,
void *))rpmSyckFreeNode, 0);
51 st_free_table(rs->syms);
62 if (_rpmsyckPool == NULL) {
63 _rpmsyckPool =
rpmioNewPool(
"syck",
sizeof(*rs), -1, _rpmsyck_debug,
71 rpmSyck rpmSyckCreate(
void)
73 rpmSyck rs = rpmSyckGetPool(_rpmsyckPool);
77 return (rpmSyck) rpmSyckLink(rs);
81 rpmsyck_parse_handler(SyckParser *p, SyckNode *n)
83 rpmsyck_node node = (rpmsyck_node)
xcalloc(1,
sizeof(*node));
88 node->value.key = syck_strndup(n->data.str->ptr, n->data.str->len);
93 rpmsyck_node seq = (rpmsyck_node)
xcalloc(n->data.list->idx + 1,
sizeof(*node));
97 for (i = 0; i < n->data.list->idx; i++) {
98 SYMID
oid = syck_seq_read(n, i);
99 syck_lookup_sym(p, oid, (
char **)&val);
102 seq[n->data.list->idx].type = T_END;
103 node->value.seq = seq;
107 case syck_map_kind: {
112 for (i = 0; i < n->data.pairs->idx; i++) {
114 SYMID
oid = syck_map_read(n, map_key, i);
115 syck_lookup_sym(p, oid, (
char **)&val);
116 key = val[0].value.key;
118 oid = syck_map_read(n, map_value, i);
119 syck_lookup_sym(p, oid, (
char **)&val);
123 node->value.map = ht;
128 node->tag = n->type_id ? syck_strndup(n->type_id, strlen(n->type_id)) : NULL;
130 return syck_add_sym(p, (
char *) node);
133 rpmSyck rpmSyckLoad(
char *yaml) {
138 rs = rpmSyckCreate();
140 parser = syck_new_parser();
142 syck_parser_str_auto(parser, yaml, NULL);
143 syck_parser_handler(parser, rpmsyck_parse_handler);
144 syck_parser_error_handler(parser, NULL);
145 syck_parser_implicit_typing(parser, 1);
146 syck_parser_taguri_expansion(parser, 1);
148 if((v = syck_parse(parser)))
149 syck_lookup_sym( parser, v, (
char **)&rs->firstNode);
151 rs->syms = parser->syms;
153 syck_free_parser(parser);
Hash table implemenation.
void * xcalloc(size_t nmemb, size_t size)
const char const bson_bool_t v
rpmioItem rpmioGetPool(rpmioPool pool, size_t size)
Get unused item from pool, or alloc a new item.
const char const bson_oid_t * oid
hashTable htFree(hashTable ht)
Destroy hash table.
const char const char int arg
void htAddEntry(hashTable ht, const void *key, const void *data)
Add item to hash table.
const char const bson * key
rpmioPool rpmioNewPool(const char *name, size_t size, int limit, int flags, char *(*dbg)(void *item), void(*init)(void *item), void(*fini)(void *item))
Create a memory pool.
static void * _free(const void *p)
Wrapper to free(3), hides const compilation noise, permit NULL, return NULL.
hashTable htCreate(int numBuckets, size_t keySize, int freeData, hashFunctionType fn, hashEqualityType eq)
Create hash table.