xref: /rk3399_rockchip-uboot/fs/jffs2/mergesort.c (revision 10d3ac346f54ab9526cd352239a5906ee2b92fee)
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 Tomlinson int 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