/* * librdf_stream_update_current_statement - helper function to get the next element with map applied * @stream: #librdf_stream object * * A helper function that gets the next element subject to the user * defined map function, if set by librdf_stream_add_map(), * * Return value: the next statement or NULL at end of stream */ static librdf_statement* librdf_stream_update_current_statement(librdf_stream* stream) { librdf_statement* statement=NULL; if(stream->is_updated) return stream->current; stream->is_updating=1; /* find next statement subject to map */ while(!stream->is_end_method(stream->context)) { librdf_iterator* map_iterator; /* Iterator over stream->map_list librdf_list */ statement=(librdf_statement*)stream->get_method(stream->context, LIBRDF_STREAM_GET_METHOD_GET_OBJECT); if(!statement) break; if(!stream->map_list || !librdf_list_size(stream->map_list)) break; map_iterator=librdf_list_get_iterator(stream->map_list); if(!map_iterator) { statement=NULL; break; } while(!librdf_iterator_end(map_iterator)) { librdf_stream_map *map=(librdf_stream_map*)librdf_iterator_get_object(map_iterator); if(!map) break; /* apply the map to the element */ statement=map->fn(stream, map->context, statement); if(!statement) break; librdf_iterator_next(map_iterator); } librdf_free_iterator(map_iterator); /* found something, return it */ if(statement) break; stream->next_method(stream->context); } stream->current=statement; if(!stream->current) stream->is_finished=1; stream->is_updated=1; stream->is_updating=0; return statement; }
/* * librdf_iterator_update_current_element - Update the current iterator element with filtering * @iterator: the #librdf_iterator object * * Helper function to set the iterator->current to the current * element as filtered optionally by a user defined * map function as set by librdf_iterator_add_map() * * Return value: the next element or NULL if the iterator has ended */ static void* librdf_iterator_update_current_element(librdf_iterator* iterator) { void *element=NULL; if(iterator->is_updated) return iterator->current; iterator->is_updating=1; /* find next element subject to map */ while(!iterator->is_end_method(iterator->context)) { librdf_iterator* map_iterator; /* Iterator over iterator->map_list librdf_list */ element=iterator->get_method(iterator->context, LIBRDF_ITERATOR_GET_METHOD_GET_OBJECT); if(!element) break; if(!iterator->map_list || !librdf_list_size(iterator->map_list)) break; map_iterator=librdf_list_get_iterator(iterator->map_list); if(!map_iterator) break; while(!librdf_iterator_end(map_iterator)) { librdf_iterator_map *map=(librdf_iterator_map*)librdf_iterator_get_object(map_iterator); if(!map) break; /* apply the map to the element */ element=map->fn(iterator, map->context, element); if(!element) break; librdf_iterator_next(map_iterator); } librdf_free_iterator(map_iterator); /* found something, return it */ if(element) break; iterator->next_method(iterator->context); } iterator->current=element; if(!iterator->current) iterator->is_finished=1; iterator->is_updated=1; iterator->is_updating=0; return element; }