static InverterEntry* S_fetch_entry(InverterIVARS *ivars, CharBuf *field) { Schema *const schema = ivars->schema; int32_t field_num = Seg_Field_Num(ivars->segment, field); if (!field_num) { // This field seems not to be in the segment yet. Try to find it in // the Schema. if (Schema_Fetch_Type(schema, field)) { // The field is in the Schema. Get a field num from the Segment. field_num = Seg_Add_Field(ivars->segment, field); } else { // We've truly failed to find the field. The user must // not have spec'd it. THROW(ERR, "Unknown field name: '%o'", field); } } InverterEntry *entry = (InverterEntry*)VA_Fetch(ivars->entry_pool, field_num); if (!entry) { entry = InvEntry_new(schema, (CharBuf*)field, field_num); VA_Store(ivars->entry_pool, field_num, (Obj*)entry); } return entry; }
Inverter* Inverter_init(Inverter *self, Schema *schema, Segment *segment) { InverterIVARS *const ivars = Inverter_IVARS(self); // Init. ivars->tick = -1; ivars->doc = NULL; ivars->sorted = false; ivars->blank = InvEntry_new(NULL, NULL, 0); ivars->current = ivars->blank; // Derive. ivars->entry_pool = VA_new(Schema_Num_Fields(schema)); ivars->entries = VA_new(Schema_Num_Fields(schema)); // Assign. ivars->schema = (Schema*)INCREF(schema); ivars->segment = (Segment*)INCREF(segment); return self; }