static void index_add_conditions(grib_concept_index* index,grib_concept_condition* condition) { grib_concept_condition* c=condition; char s[512]={0,}; grib_concept_index_entry* e;; grib_concept_index_entry* entry=index_entry_new(index->context,index->keys);; while (c) { size_t size=512; int type; e=entry; type = grib_expression_native_type(0,c->expression); switch(type) { case GRIB_TYPE_LONG: grib_expression_evaluate_long(0,c->expression,&lres); sprintf(s,"%ld",lres); break; case GRIB_TYPE_DOUBLE: grib_expression_evaluate_double(0,c->expression,&dres); sprintf(s,"%g",dres); break; case GRIB_TYPE_STRING: grib_expression_evaluate_string(0,c->expression,s,&size,&err); break; default: Assert(0); break; } while (e->name && strcmp(e->name,c->name)) e=e->next; e->type=type; e->value=grib_context_strdup(index->context,s); if (!e->name) { e->name=grib_context_strdup(index->context,c->name); e->next=grib_context_malloc_clear_persistent(index->context,sizeof(grib_concept_index_entry)); if (!e->next) grib_context_log(index->context,GRIB_LOG_FATAL,"index_add_conditions unable to allocate"); } c=c->next; } index_insert_entry(index,entry,condition->name); index_entry_delete(index->context,entry); }
const demux_index_entry_t *oggseek_theora_index_entry_add ( logical_stream_t *p_stream, int64_t i_granule, int64_t i_pagepos) { /* add or update entry for keyframe */ demux_index_entry_t *idx; demux_index_entry_t *oidx; demux_index_entry_t *last_idx = NULL; int64_t i_gpos; int64_t i_frame; int64_t i_kframe; int64_t i_tframe; int64_t i_tkframe; if ( p_stream == NULL ) return NULL; oidx = idx = p_stream->idx; i_tkframe = i_granule >> p_stream->i_granule_shift; i_tframe = i_tkframe + i_granule - ( i_tkframe << p_stream->i_granule_shift ); if ( i_tkframe < 1 ) return NULL; if ( idx == NULL ) { demux_index_entry_t *ie = index_entry_new(); ie->i_value = i_granule; ie->i_pagepos = i_pagepos; p_stream->idx = ie; return ie; } while ( idx != NULL ) { i_gpos = idx->i_value; i_kframe = i_gpos >> p_stream->i_granule_shift; if ( i_kframe > i_tframe ) break; if ( i_kframe == i_tkframe ) { /* entry exists, update it if applicable, and return it */ i_frame = i_kframe + i_gpos - ( i_kframe << p_stream->i_granule_shift ); if ( i_frame < i_tframe ) { idx->i_value = i_granule; idx->i_pagepos = i_pagepos; } return idx; } last_idx = idx; idx = idx->p_next; } /* new entry; insert after last_idx */ idx = index_entry_new(); if ( last_idx != NULL ) { idx->p_next = last_idx->p_next; last_idx->p_next = idx; idx->p_prev = last_idx; } else { idx->p_next = oidx; oidx = idx; } if ( idx->p_next != NULL ) { idx->p_next->p_prev = idx; } idx->i_value = i_granule; idx->i_pagepos = i_pagepos; return idx; }