static void module_save(const char *module, MODULE_THEME_REC *rec, THEME_SAVE_REC *data) { CONFIG_NODE *fnode, *node; FORMAT_REC *formats; int n; formats = g_hash_table_lookup(default_formats, rec->name); if (formats == NULL) return; fnode = config_node_traverse(data->config, "formats", TRUE); node = config_node_section(fnode, rec->name, NODE_TYPE_BLOCK); for (n = 1; formats[n].def != NULL; n++) { if (rec->formats[n] != NULL) { config_node_set_str(data->config, node, formats[n].tag, rec->formats[n]); } else if (data->save_all && formats[n].tag != NULL) { config_node_set_str(data->config, node, formats[n].tag, formats[n].def); } } if (node->value == NULL) { /* not modified, don't keep the empty section */ config_node_remove(data->config, fnode, node); if (fnode->value == NULL) { config_node_remove(data->config, data->config->mainnode, fnode); } } }
void config_node_set_str(CONFIG_REC *rec, CONFIG_NODE *parent, const char *key, const char *value) { CONFIG_NODE *node; int no_key; g_return_if_fail(rec != NULL); g_return_if_fail(parent != NULL); no_key = key == NULL; node = no_key ? NULL : config_node_find(parent, key); if (value == NULL) { /* remove the key */ if (node != NULL) config_node_remove(rec, parent, node); return; } if (node != NULL) { if (strcmp(node->value, value) == 0) return; g_free(node->value); } else { node = g_new0(CONFIG_NODE, 1); parent->value = g_slist_append(parent->value, node); node->type = no_key ? NODE_TYPE_VALUE : NODE_TYPE_KEY; node->key = no_key ? NULL : g_strdup(key); } node->value = g_strdup(value); rec->modifycounter++; }
void config_nodes_remove_all(CONFIG_REC *rec) { g_return_if_fail(rec != NULL); while (rec->mainnode->value != NULL) config_node_remove(rec, rec->mainnode, ((GSList *) rec->mainnode->value)->data); }
void config_node_remove(CONFIG_REC *rec, CONFIG_NODE *parent, CONFIG_NODE *node) { g_return_if_fail(node != NULL); if (parent == NULL) parent = rec->mainnode; rec->modifycounter++; cache_remove(rec, node); parent->value = g_slist_remove(parent->value, node); switch (node->type) { case NODE_TYPE_KEY: case NODE_TYPE_VALUE: case NODE_TYPE_COMMENT: g_free_not_null(node->value); break; case NODE_TYPE_BLOCK: case NODE_TYPE_LIST: while (node->value != NULL) config_node_remove(rec, node, ((GSList *) node->value)->data); break; } g_free_not_null(node->key); g_free(node); }
/* Clear all data inside node, but leave the node */ void config_node_clear(CONFIG_REC *rec, CONFIG_NODE *node) { g_return_if_fail(node != NULL); g_return_if_fail(is_node_list(node)); while (node->value != NULL) config_node_remove(rec, node, ((GSList *) node->value)->data); }
/* Remove n'th node from a list */ void config_node_list_remove(CONFIG_REC *rec, CONFIG_NODE *node, int index) { CONFIG_NODE *child; g_return_if_fail(node != NULL); g_return_if_fail(is_node_list(node)); child = config_node_nth(node, index); if (child != NULL) config_node_remove(rec, node, child); }