Blame view

fs/jffs2/mergesort.c 1.09 KB
10d3ac346   Mark Tomlinson   JFFS2: Use merge ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
  /*
   * 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;
  }