1 /* opkg_active_list.c - the opkg package management system
3 Tick Chen <tick@openmoko.com>
5 Copyright (C) 2008 Openmoko
7 This program is free software; you can redistribute it and/or
8 modify it under the terms of the GNU General Public License as
9 published by the Free Software Foundation; either version 2, or (at
10 your option) any later version.
12 This program is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 General Public License for more details.
20 #include <libopkg/active_list.h>
21 #include <active_list.h>
26 struct active_list list
;
29 struct active_test
*active_test_new(char *str
) {
30 struct active_test
*ans
= (struct active_test
*)calloc(1, sizeof(struct active_test
));
32 active_list_init(&ans
->list
);
35 void active_test_add(struct active_list
*head
, struct active_test
*node
) {
36 active_list_add(head
, &node
->list
);
39 void active_test_add_depend(struct active_test
*A
, struct active_test
*B
) {
40 active_list_add_depend(&A
->list
, &B
->list
);
44 .--A---B----C----D-----E----F
50 Then the sequence will be
51 +: G M H I O J A B K N L C D E F
52 -: F E D C L N K B A J O I H M G
54 void make_list(struct active_list
*head
) {
55 struct active_test
*A
= active_test_new("A");
56 struct active_test
*B
= active_test_new("B");
57 struct active_test
*C
= active_test_new("C");
58 struct active_test
*D
= active_test_new("D");
59 struct active_test
*E
= active_test_new("E");
60 struct active_test
*F
= active_test_new("F");
61 struct active_test
*G
= active_test_new("G");
62 struct active_test
*H
= active_test_new("H");
63 struct active_test
*I
= active_test_new("I");
64 struct active_test
*J
= active_test_new("J");
65 struct active_test
*K
= active_test_new("K");
66 struct active_test
*L
= active_test_new("L");
67 struct active_test
*M
= active_test_new("M");
68 struct active_test
*N
= active_test_new("N");
69 struct active_test
*O
= active_test_new("O");
71 active_test_add(head
, A
);
72 active_test_add(head
, B
);
73 active_test_add(head
, C
);
74 active_test_add(head
, D
);
75 active_test_add(head
, E
);
76 active_test_add(head
, F
);
77 active_test_add(head
, G
);
78 active_test_add(head
, H
);
79 active_test_add(head
, I
);
80 active_test_add(head
, J
);
81 active_test_add(head
, K
);
82 active_test_add(head
, L
);
83 active_test_add(head
, M
);
84 active_test_add(head
, N
);
85 active_test_add(head
, O
);
86 active_test_add_depend(H
, M
);
87 active_test_add_depend(A
, G
);
88 active_test_add_depend(A
, H
);
89 active_test_add_depend(A
, I
);
90 active_test_add_depend(A
, J
);
91 active_test_add_depend(J
, O
);
92 active_test_add_depend(C
, K
);
93 active_test_add_depend(C
, L
);
94 active_test_add_depend(L
, N
);
97 int active_test_compare(const void *a
, const void *b
) {
98 struct active_list
*first
= (struct active_list
*)a
;
99 struct active_list
*second
= (struct active_list
*)b
;
100 return strcmp(list_entry(first
, struct active_test
, list
),
101 list_entry(second
, struct active_test
, list
));
104 void show_list(struct active_list
*head
) {
105 struct active_list
*ptr
;
106 struct active_test
*test
;
107 for(ptr
= active_list_next(head
, NULL
); ptr
;ptr
= active_list_next(head
, ptr
)) {
108 test
= list_entry(ptr
, struct active_test
, list
);
109 printf ("%s ",test
->str
);
115 struct active_list head
;
116 struct active_list
*ptr
;
117 struct active_test
*test
;
118 active_list_init(&head
);
121 printf("pos order: ");
123 /* for(ptr = active_list_next(&head, &head); ptr ;ptr = active_list_next(&head, ptr)) {
124 test = list_entry(ptr, struct active_test, list);
125 printf ("%s ",test->str);
127 printf("neg order: ");
128 for(ptr
= active_list_prev(&head
, &head
); ptr
;ptr
= active_list_prev(&head
, ptr
)) {
129 test
= list_entry(ptr
, struct active_test
, list
);
130 printf ("%s ",test
->str
);
132 printf("\npos order after sort: ");
133 active_list_sort(&head
, &active_test_compare
);
136 printf("after clear: ");
137 active_list_clear(&head
);
138 for(ptr
= active_list_next(&head
, NULL
); ptr
;ptr
= active_list_next(&head
, ptr
)) {
139 test
= list_entry(ptr
, struct active_test
, list
);
140 printf ("%s ",test
->str
);