GTree* meta0_utils_list_to_tree(GSList *list) { GSList *l; GTree *result = NULL; EXTRA_ASSERT(list != NULL); result = g_tree_new_full( hashstr_quick_cmpdata, NULL, g_free, (GDestroyNotify)garray_free); for (l=list; l ;l=l->next) { struct meta0_info_s *m0i; if (!(m0i = l->data)) continue; gchar url[STRLEN_ADDRINFO]; grid_addrinfo_to_string(&(m0i->addr), url, sizeof(url)); gsize len = m0i->prefixes_size; len = len / 2; GArray *pfx = g_array_new(FALSE, FALSE, sizeof(guint16)); g_array_append_vals(pfx, m0i->prefixes, len); g_tree_replace(result, hashstr_create(url), pfx); } return result; }
static GTree* build_version(struct cfg_s *cfg) { GTree *v = version_empty(); for (; cfg->name ;++cfg) { struct object_version_s o; o.version = cfg->v; o.when = cfg->t; g_tree_insert(v, hashstr_create(cfg->name), g_memdup(&o, sizeof(o))); } return v; }
static gboolean hook_extract(gchar *k, GByteArray *v, GTree *version) { if (!g_str_has_prefix(k, "version:")) return FALSE; gchar *p, buf[v->len+1]; memset(buf, 0, v->len + 1); memcpy(buf, v->data, v->len); if (!(p = strchr(buf, ':'))) return FALSE; *(p++) = '\0'; struct object_version_s ov; ov.version = atoi(buf); ov.when = atoi(p); g_tree_insert(version, hashstr_create(k+sizeof("version:")-1), g_memdup(&ov, sizeof(ov))); return FALSE; }