276 |
return cur ? cur->data : NULL; |
return cur ? cur->data : NULL; |
277 |
} |
} |
278 |
|
|
279 |
|
int |
280 |
|
list_insert_sorted(struct list *list, void *data, list_comp_t cmp) |
281 |
|
{ |
282 |
|
struct list_entry *cur, *prev; |
283 |
|
|
284 |
|
if (!list) |
285 |
|
return -1; |
286 |
|
if (!cmp) |
287 |
|
return -1; |
288 |
|
|
289 |
|
for (cur = list->head, prev = NULL; cur; prev = cur, cur = cur->next) |
290 |
|
if (cmp(cur->data, data) > 0) |
291 |
|
break; |
292 |
|
|
293 |
|
if (!prev) { |
294 |
|
list_prepend(list, data); |
295 |
|
} else if (!cur) { |
296 |
|
list_append(list, data); |
297 |
|
} else { |
298 |
|
struct list_entry *ep = emalloc(sizeof(*ep)); |
299 |
|
ep->data = data; |
300 |
|
ep->next = cur; |
301 |
|
prev->next = ep; |
302 |
|
} |
303 |
|
return 0; |
304 |
|
} |
305 |
|
|