1*10d3ac34SMark Tomlinson /* 2*10d3ac34SMark Tomlinson * This file is copyright 2001 Simon Tatham. 3*10d3ac34SMark Tomlinson * Rewritten from original source 2006 by Dan Merillat for use in u-boot. 4*10d3ac34SMark Tomlinson * 5*10d3ac34SMark Tomlinson * Original code can be found at: 6*10d3ac34SMark Tomlinson * http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html 7*10d3ac34SMark Tomlinson * 8*10d3ac34SMark Tomlinson * SPDX-License-Identifier: MIT 9*10d3ac34SMark Tomlinson */ 10*10d3ac34SMark Tomlinson 11*10d3ac34SMark Tomlinson #include <common.h> 12*10d3ac34SMark Tomlinson #include "jffs2_private.h" 13*10d3ac34SMark Tomlinson sort_list(struct b_list * list)14*10d3ac34SMark Tomlinsonint sort_list(struct b_list *list) 15*10d3ac34SMark Tomlinson { 16*10d3ac34SMark Tomlinson struct b_node *p, *q, *e, **tail; 17*10d3ac34SMark Tomlinson int k, psize, qsize; 18*10d3ac34SMark Tomlinson 19*10d3ac34SMark Tomlinson if (!list->listHead) 20*10d3ac34SMark Tomlinson return 0; 21*10d3ac34SMark Tomlinson 22*10d3ac34SMark Tomlinson for (k = 1; k < list->listCount; k *= 2) { 23*10d3ac34SMark Tomlinson tail = &list->listHead; 24*10d3ac34SMark Tomlinson for (p = q = list->listHead; p; p = q) { 25*10d3ac34SMark Tomlinson /* step 'k' places from p; */ 26*10d3ac34SMark Tomlinson for (psize = 0; q && psize < k; psize++) 27*10d3ac34SMark Tomlinson q = q->next; 28*10d3ac34SMark Tomlinson qsize = k; 29*10d3ac34SMark Tomlinson 30*10d3ac34SMark Tomlinson /* two lists, merge them. */ 31*10d3ac34SMark Tomlinson while (psize || (qsize && q)) { 32*10d3ac34SMark Tomlinson /* merge the next element */ 33*10d3ac34SMark Tomlinson if (psize == 0 || 34*10d3ac34SMark Tomlinson ((qsize && q) && 35*10d3ac34SMark Tomlinson list->listCompare(p, q))) { 36*10d3ac34SMark Tomlinson /* p is empty, or p > q, so q next */ 37*10d3ac34SMark Tomlinson e = q; 38*10d3ac34SMark Tomlinson q = q->next; 39*10d3ac34SMark Tomlinson qsize--; 40*10d3ac34SMark Tomlinson } else { 41*10d3ac34SMark Tomlinson e = p; 42*10d3ac34SMark Tomlinson p = p->next; 43*10d3ac34SMark Tomlinson psize--; 44*10d3ac34SMark Tomlinson } 45*10d3ac34SMark Tomlinson e->next = NULL; /* break accidental loops. */ 46*10d3ac34SMark Tomlinson *tail = e; 47*10d3ac34SMark Tomlinson tail = &e->next; 48*10d3ac34SMark Tomlinson } 49*10d3ac34SMark Tomlinson } 50*10d3ac34SMark Tomlinson } 51*10d3ac34SMark Tomlinson return 0; 52*10d3ac34SMark Tomlinson } 53