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; }
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; }