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);
}
Exemple #2
0
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;
}