man: --nbi, not --NBI
[wraplinux.git] / segment.c
1 /* ----------------------------------------------------------------------- *
2  *
3  *   Copyright 2008 rPath, Inc. - All Rights Reserved
4  *
5  *   This program is free software; you can redistribute it and/or modify
6  *   it under the terms of the GNU General Public License as published by
7  *   the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
8  *   Boston MA 02110-1301, USA; either version 2 of the License, or
9  *   (at your option) any later version; incorporated herein by reference.
10  *
11  * ----------------------------------------------------------------------- */
12
13 /*
14  * segment.c
15  *
16  * Sort segments according to base address
17  * Eventually add support here for merging segments
18  */
19
20 #include "wraplinux.h"
21
22 #include <stdlib.h>
23 #include <alloca.h>
24 #include "segment.h"
25
26 static int comp_seg(const void *a, const void *b)
27 {
28         const struct segment * const *ap = a;
29         const struct segment * const *bp = b;
30
31         if ((*ap)->address < (*bp)->address)
32                 return -1;
33         else if ((*ap)->address > (*bp)->address)
34                 return 1;
35         else
36                 return 0;
37 }
38
39 struct segment *sort_segments(struct segment *list)
40 {
41         struct segment **ptrs;
42         int nsegments, i;
43         struct segment *sp, **spp;
44
45         nsegments = 0;
46         for (sp = list; sp; sp = sp->next)
47                 nsegments++;
48
49         ptrs = alloca(nsegments * sizeof *ptrs);
50         spp = ptrs;
51         for (sp = list; sp; sp = sp->next)
52                 *spp++ = sp;
53
54         qsort(ptrs, nsegments, sizeof *ptrs, comp_seg);
55
56         for (i = 0; i < nsegments-1; i++)
57                 ptrs[i]->next = ptrs[i+1];
58         ptrs[i]->next = NULL;
59
60         return ptrs[0];
61 }