00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef __jack_jslist_h__
00026 #define __jack_jslist_h__
00027
00028 #include <stdlib.h>
00029 #include <jack/systemdeps.h>
00030
00031 #ifdef sun
00032 #define __inline__
00033 #endif
00034
00035 typedef struct _JSList JSList;
00036
00037 typedef int (*JCompareFunc) (void* a, void* b);
00038 struct _JSList
00039 {
00040 void *data;
00041 JSList *next;
00042 };
00043
00044 static __inline__
00045 JSList*
00046 jack_slist_alloc (void)
00047 {
00048 JSList *new_list;
00049
00050 new_list = (JSList*)malloc(sizeof(JSList));
00051 new_list->data = NULL;
00052 new_list->next = NULL;
00053
00054 return new_list;
00055 }
00056
00057 static __inline__
00058 JSList*
00059 jack_slist_prepend (JSList* list, void* data)
00060 {
00061 JSList *new_list;
00062
00063 new_list = (JSList*)malloc(sizeof(JSList));
00064 new_list->data = data;
00065 new_list->next = list;
00066
00067 return new_list;
00068 }
00069
00070 #define jack_slist_next(slist) ((slist) ? (((JSList *)(slist))->next) : NULL)
00071 static __inline__
00072 JSList*
00073 jack_slist_last (JSList *list)
00074 {
00075 if (list) {
00076 while (list->next)
00077 list = list->next;
00078 }
00079
00080 return list;
00081 }
00082
00083 static __inline__
00084 JSList*
00085 jack_slist_remove_link (JSList *list,
00086 JSList *link)
00087 {
00088 JSList *tmp;
00089 JSList *prev;
00090
00091 prev = NULL;
00092 tmp = list;
00093
00094 while (tmp) {
00095 if (tmp == link) {
00096 if (prev)
00097 prev->next = tmp->next;
00098 if (list == tmp)
00099 list = list->next;
00100
00101 tmp->next = NULL;
00102 break;
00103 }
00104
00105 prev = tmp;
00106 tmp = tmp->next;
00107 }
00108
00109 return list;
00110 }
00111
00112 static __inline__
00113 void
00114 jack_slist_free (JSList *list)
00115 {
00116 while (list) {
00117 JSList *next = list->next;
00118 free(list);
00119 list = next;
00120 }
00121 }
00122
00123 static __inline__
00124 void
00125 jack_slist_free_1 (JSList *list)
00126 {
00127 if (list) {
00128 free(list);
00129 }
00130 }
00131
00132 static __inline__
00133 JSList*
00134 jack_slist_remove (JSList *list,
00135 void *data)
00136 {
00137 JSList *tmp;
00138 JSList *prev;
00139
00140 prev = NULL;
00141 tmp = list;
00142
00143 while (tmp) {
00144 if (tmp->data == data) {
00145 if (prev)
00146 prev->next = tmp->next;
00147 if (list == tmp)
00148 list = list->next;
00149
00150 tmp->next = NULL;
00151 jack_slist_free (tmp);
00152
00153 break;
00154 }
00155
00156 prev = tmp;
00157 tmp = tmp->next;
00158 }
00159
00160 return list;
00161 }
00162
00163 static __inline__
00164 unsigned int
00165 jack_slist_length (JSList *list)
00166 {
00167 unsigned int length;
00168
00169 length = 0;
00170 while (list) {
00171 length++;
00172 list = list->next;
00173 }
00174
00175 return length;
00176 }
00177
00178 static __inline__
00179 JSList*
00180 jack_slist_find (JSList *list,
00181 void *data)
00182 {
00183 while (list) {
00184 if (list->data == data)
00185 break;
00186 list = list->next;
00187 }
00188
00189 return list;
00190 }
00191
00192 static __inline__
00193 JSList*
00194 jack_slist_copy (JSList *list)
00195 {
00196 JSList *new_list = NULL;
00197
00198 if (list) {
00199 JSList *last;
00200
00201 new_list = jack_slist_alloc ();
00202 new_list->data = list->data;
00203 last = new_list;
00204 list = list->next;
00205 while (list) {
00206 last->next = jack_slist_alloc ();
00207 last = last->next;
00208 last->data = list->data;
00209 list = list->next;
00210 }
00211 }
00212
00213 return new_list;
00214 }
00215
00216 static __inline__
00217 JSList*
00218 jack_slist_append (JSList *list,
00219 void *data)
00220 {
00221 JSList *new_list;
00222 JSList *last;
00223
00224 new_list = jack_slist_alloc ();
00225 new_list->data = data;
00226
00227 if (list) {
00228 last = jack_slist_last (list);
00229 last->next = new_list;
00230
00231 return list;
00232 } else
00233 return new_list;
00234 }
00235
00236 static __inline__
00237 JSList*
00238 jack_slist_sort_merge (JSList *l1,
00239 JSList *l2,
00240 JCompareFunc compare_func)
00241 {
00242 JSList list, *l;
00243
00244 l = &list;
00245
00246 while (l1 && l2) {
00247 if (compare_func(l1->data, l2->data) < 0) {
00248 l = l->next = l1;
00249 l1 = l1->next;
00250 } else {
00251 l = l->next = l2;
00252 l2 = l2->next;
00253 }
00254 }
00255 l->next = l1 ? l1 : l2;
00256
00257 return list.next;
00258 }
00259
00260 static __inline__
00261 JSList*
00262 jack_slist_sort (JSList *list,
00263 JCompareFunc compare_func)
00264 {
00265 JSList *l1, *l2;
00266
00267 if (!list)
00268 return NULL;
00269 if (!list->next)
00270 return list;
00271
00272 l1 = list;
00273 l2 = list->next;
00274
00275 while ((l2 = l2->next) != NULL) {
00276 if ((l2 = l2->next) == NULL)
00277 break;
00278 l1 = l1->next;
00279 }
00280 l2 = l1->next;
00281 l1->next = NULL;
00282
00283 return jack_slist_sort_merge (jack_slist_sort (list, compare_func),
00284 jack_slist_sort (l2, compare_func),
00285 compare_func);
00286 }
00287
00288 #endif
00289