예제 #1
0
파일: proto.c 프로젝트: millerZZS/pbc
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
파일: proto.c 프로젝트: justnull/pbc
struct _message * 
_pbcP_init_message(struct pbc_env * p, const char *name) {
	struct _message * m = _pbcM_sp_query(p->msgs, name);
	if (m == NULL) {
		return NULL;
	}
	if (m->id) {
		return NULL;
	}
	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;
}