void* slist_find(slist* list, int* index, void* comp_dat, char(*comp_fn)(void*,void*)) { int i=1; slist_elem* sle=0; if(!list||list->_size<1||!comp_dat||!comp_fn) return 0; sle=list->_head; for(;sle;sle=sle->_next,++i) if(comp_fn(sle->_data,comp_dat)==1) { if(index)*index=i; return sle->_data; } return 0; }
/* this implements a generic bubble sort */ void Vector_sort(Vector* vector, int (*comp_fn)(void*, void*)) { int i = 0; int j = 0; void* temp = malloc(vector->elem_size); if (vector) { for (i = 0; i < vector->size; i++) { for (j = 1; j < vector->size; j++) { /* a = j-1, b = j */ if (comp_fn((char*)vector->base + vector->elem_size * (j-1), (char*)vector->base + vector->elem_size * j) == 1) { /* if a > b */ /* temp = a */ memcpy(temp, (char*)vector->base + vector->elem_size * (j-1), vector->elem_size); /* a = b */ memcpy((char*)vector->base + vector->elem_size * (j-1), (char*)vector->base + vector->elem_size * j, vector->elem_size); /* b = temp */ memcpy((char*)vector->base + vector->elem_size * j, temp, vector->elem_size); } } } free(temp); } }