12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- /*
- * This file is copyright 2001 Simon Tatham.
- * Rewritten from original source 2006 by Dan Merillat for use in u-boot.
- *
- * Original code can be found at:
- * http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html
- *
- * SPDX-License-Identifier: MIT
- */
- #include <common.h>
- #include "jffs2_private.h"
- int sort_list(struct b_list *list)
- {
- struct b_node *p, *q, *e, **tail;
- int k, psize, qsize;
- if (!list->listHead)
- return 0;
- for (k = 1; k < list->listCount; k *= 2) {
- tail = &list->listHead;
- for (p = q = list->listHead; p; p = q) {
- /* step 'k' places from p; */
- for (psize = 0; q && psize < k; psize++)
- q = q->next;
- qsize = k;
- /* two lists, merge them. */
- while (psize || (qsize && q)) {
- /* merge the next element */
- if (psize == 0 ||
- ((qsize && q) &&
- list->listCompare(p, q))) {
- /* p is empty, or p > q, so q next */
- e = q;
- q = q->next;
- qsize--;
- } else {
- e = p;
- p = p->next;
- psize--;
- }
- e->next = NULL; /* break accidental loops. */
- *tail = e;
- tail = &e->next;
- }
- }
- }
- return 0;
- }
|