static void set_enums(struct pbc_env *p, struct file_t *file) { int n = pbc_array_size(file->enum_size); int i; int start = 0; for (i=0;i<n;i++) { pbc_var name; _pbcA_index(file->enum_name,i,name); pbc_var var; _pbcA_index(file->enum_size,i,var); set_enum_one(p, file, name->s.str, start , (int)var->integer.low); start += var->integer.low; } }
static void set_msgs(struct pbc_pattern * FIELD_T, struct pbc_env *p, struct file_t *file , pbc_array queue) { int n = pbc_array_size(file->message_size); int i; int start = 0; for (i=0;i<n;i++) { pbc_var name; _pbcA_index(file->message_name,i,name); pbc_var sz; _pbcA_index(file->message_size,i,sz); set_msg_one(FIELD_T, p, file, name->s.str, start , (int)sz->integer.low , queue); start += sz->integer.low; } }
static void set_enum_one(struct pbc_env *p, struct file_t *file, const char *name, int start, int sz) { struct map_kv *table = malloc(sz * sizeof(struct map_kv)); int i; for (i=0;i<sz;i++) { pbc_var id; pbc_var string; _pbcA_index(file->enum_id, start+i, id); _pbcA_index(file->enum_string, start+i, string); table[i].id = (int)id->integer.low; table[i].pointer = (void *)string->s.str; } _pbcP_push_enum(p,name,table,sz); free(table); }
static void set_msg_one(struct pbc_pattern * FIELD_T, struct pbc_env *p, struct file_t *file, const char *name, int start, int sz , pbc_array queue) { int i; for (i=0;i<sz;i++) { pbc_var _field; _pbcA_index(file->message_field, start+i, _field); struct field_t field; int ret = pbc_pattern_unpack(FIELD_T, _field->m.buffer, _field->m.len, &field); if (ret != 0) { continue; } struct _field f; f.id = field.id; f.name = field.name->s.str; f.type = field.type; f.label = field.label; f.type_name.n = field.type_name->s.str; set_default(&f, &field); _pbcP_push_message(p,name, &f , queue); // don't need to close pattern since no array } _pbcP_init_message(p, name); }
uint32_t pbc_array_integer(pbc_array array, int index, uint32_t *hi) { pbc_var var; _pbcA_index(array , index , var); if (hi) { *hi = var->integer.hi; } return var->integer.low; }
void _pbcB_register_fields(struct pbc_env *p, pbc_array queue) { int sz = pbc_array_size(queue); int i; for (i=0;i<sz;i++) { pbc_var atom; _pbcA_index(queue,i,atom); struct _field * f = atom->m.buffer; set_field_one(p, f); } }
double pbc_array_real(pbc_array array, int index) { pbc_var var; _pbcA_index(array , index , var); return var->real; }