Пример #1
0
struct _message * 
_pbcP_init_message(struct pbc_env * p, const char *name) {
	struct _message * m = _pbcM_sp_query(p->msgs, name);
	if (m == NULL) {
		m = malloc(sizeof(*m));
		m->def = NULL;
		m->key = name;
		m->id = NULL;
		m->name = _pbcM_sp_new();
		m->env = p;
		_pbcM_sp_insert(p->msgs, name, m);

		return m;
	}
	if (m->id) {
		// extend message, delete old id map.
		_pbcM_ip_delete(m->id);
	}
	struct _iter iter = { 0, NULL };
	_pbcM_sp_foreach_ud(m->name, _count, &iter);
	iter.table = malloc(iter.count * sizeof(struct map_kv));
	iter.count = 0;
	_pbcM_sp_foreach_ud(m->name, _set_table, &iter);

	m->id = _pbcM_ip_new(iter.table , iter.count);

	free(iter.table);

	return m;
}
Пример #2
0
static void
free_enum(void *p) {
	struct _enum * e = (struct _enum *)p;
	_pbcM_ip_delete(e->id);
	_pbcM_si_delete(e->name);

	free(p);
}
Пример #3
0
static void
free_msg(void *p) {
	struct _message * m = p;
	if (m->id)
		_pbcM_ip_delete(m->id);
	free(m->def);
	_pbcM_sp_foreach(m->name, free);
	_pbcM_sp_delete(m->name);
	free(p);
}