00001 #include <stdio.h>
00002 #include <stdlib.h>
00003
00004 #include "hlist.h"
00005 #include "hsqlist.h"
00006 #include "hlog.h"
00007 #include "hprocess.h"
00008 #include "hsignal.h"
00009
00010
00012 struct hlist {
00013 int elements_num;
00014 struct hlelement* first;
00015 struct hlelement* last;
00016 };
00017
00019 struct hlelement {
00020 struct hlelement* next;
00021 struct hlelement* prev;
00022 void* data_element;
00023 };
00024
00027 struct hlorphan {
00028 struct hlorphan* next;
00029 struct hlorphan* prev;
00030 void* data_element;
00031 };
00032
00033
00034 static int set_first_(struct hlist* list, struct hlelement* element);
00035 static int set_last_(struct hlist* list, struct hlelement* element);
00036 static int increment_size_(struct hlist* list);
00037 static int decrement_size_(struct hlist* list);
00038 static int set_size_(struct hlist* list, int number);
00039
00040 static int element_set_prev_(struct hlelement* element, struct hlelement* element_prev);
00041 static int element_set_next_(struct hlelement* element, struct hlelement* element_next);
00042
00043
00044 static int element_set_prev_(struct hlelement* element, struct hlelement* element_prev)
00045 {
00046 if (element == NULL)
00047 return -1;
00048
00049 element->prev = element_prev;
00050 return 0;
00051 }
00052
00053
00054 static int element_set_next_(struct hlelement* element, struct hlelement* element_next)
00055 {
00056 if (element == NULL)
00057 return -1;
00058
00059 element->next = element_next;
00060 return 0;
00061 }
00062
00063
00064 static int set_first_(struct hlist* list, struct hlelement* element)
00065 {
00066 if (list == NULL)
00067 return -1;
00068
00069 list->first = element;
00070 return 0;
00071 }
00072
00073
00074 static int set_last_(struct hlist* list, struct hlelement* element)
00075 {
00076 if (list == NULL)
00077 return -1;
00078
00079 list->last = element;
00080 return 0;
00081 }
00082
00083
00084 static int increment_size_(struct hlist* list)
00085 {
00086 if (list == NULL)
00087 return -1;
00088
00089 list->elements_num += 1;
00090
00091 return list->elements_num;
00092 }
00093
00094
00095 static int decrement_size_(struct hlist* list)
00096 {
00097 if (list == NULL)
00098 return -1;
00099
00100 if (list->elements_num < 1) {
00101 list->elements_num = 0;
00102 return 0;
00103 }
00104
00105 list->elements_num = list->elements_num - 1;
00106
00107 return list->elements_num;
00108 }
00109
00110
00111 static int set_size_(struct hlist* list, int number)
00112 {
00113 if (list == NULL)
00114 return -1;
00115
00116 list->elements_num = number;
00117
00118 return list->elements_num;
00119 }
00120
00121
00122 int hlist_size(struct hlist* list)
00123 {
00124 if (list == NULL)
00125 return -1;
00126
00127 return list->elements_num;
00128 }
00129
00130
00131 void* hlelement_get_data(struct hlelement* element)
00132 {
00133 if (element == NULL)
00134 return NULL;
00135
00136 return element->data_element;
00137 }
00138
00139
00140 int hlelement_set_data(struct hlelement* element, void* data)
00141 {
00142 if (element == NULL)
00143 return -1;
00144
00145 element->data_element = data;
00146
00147 return 0;
00148 }
00149
00150
00151 struct hlelement* hlelement_get_prev(struct hlelement* element)
00152 {
00153 if (element == NULL)
00154 return NULL;
00155
00156 return element->prev;
00157 }
00158
00159
00160 struct hlelement* hlelement_get_next(struct hlelement* element)
00161 {
00162 if (element == NULL)
00163 return NULL;
00164
00165 return element->next;
00166 }
00167
00168
00169 struct hlist* hlist_create()
00170 {
00171 struct hlist* list = calloc(1, sizeof(*list));
00172 set_first_(list, NULL);
00173 set_last_(list, NULL);
00174 set_size_(list, 0);
00175
00176 return list;
00177 }
00178
00179
00180 struct hlelement* hlist_enqueue(struct hlist* list, void* data_element)
00181 {
00182 if (list == NULL)
00183 return NULL;
00184
00185 struct hlelement* new_element = calloc(1, sizeof(*new_element));
00186 new_element->data_element = data_element;
00187 struct hlelement* last_element = hlist_get_last(list);
00188
00189
00190 element_set_next_(last_element, new_element );
00191 element_set_prev_(new_element, last_element );
00192 element_set_next_(new_element, NULL );
00193
00194 if (last_element == NULL) {
00195 set_first_(list, new_element);
00196 }
00197
00198 set_last_(list, new_element);
00199
00200 increment_size_(list);
00201
00202 return new_element;
00203 }
00204
00205
00206 struct hlelement* hlist_insert_after(struct hlist* list, struct hlelement* element, void* data_element)
00207 {
00208 if (list == NULL || element == NULL)
00209 return NULL;
00210
00211 struct hlelement* new_element = calloc(1, sizeof(*new_element));
00212 new_element->data_element = data_element;
00213
00214
00215 element_set_prev_(new_element, element);
00216 element_set_next_(new_element, hlelement_get_next(element));
00217 element_set_prev_(hlelement_get_next(element), new_element);
00218 element_set_next_(element, new_element);
00219
00220 if (hlist_get_last(list) == element)
00221 set_last_(list, new_element);
00222
00223 increment_size_(list);
00224
00225 return new_element;
00226 }
00227
00228
00229 struct hlelement* hlist_insert_before(struct hlist* list, struct hlelement* element, void* data_element)
00230 {
00231 if (list == NULL || element == NULL)
00232 return NULL;
00233
00234 struct hlelement* new_element = calloc(1, sizeof(*new_element));
00235 new_element->data_element = data_element;
00236
00237
00238 element_set_prev_(new_element, hlelement_get_prev(element) );
00239 element_set_next_(hlelement_get_prev(element), new_element);
00240 element_set_next_(new_element, element);
00241 element_set_prev_(element, new_element);
00242
00243 if (hlist_get_first(list) == element)
00244 set_first_(list, new_element);
00245
00246 increment_size_(list);
00247
00248 return new_element;
00249 }
00250
00251
00252 void* hlelement_remove(struct hlelement* element, struct hlist* list)
00253 {
00254 if (element == NULL)
00255 return NULL;
00256
00257 void* data_element = hlelement_get_data(element);
00258 hlelement_set_data(element, NULL);
00259
00260 if (element == hlist_get_first(list))
00261 set_first_(list, hlelement_get_next(element));
00262
00263 if (element == hlist_get_last(list))
00264 set_last_(list, hlelement_get_prev(element));
00265
00266
00267 element_set_next_(hlelement_get_prev(element), hlelement_get_next(element) );
00268 element_set_prev_(hlelement_get_next(element), hlelement_get_prev(element) );
00269 free(element);
00270
00271 decrement_size_(list);
00272
00273 return data_element;
00274 }
00275
00276
00277 struct hlorphan* hlorphan_create(void* data_element)
00278 {
00279 struct hlorphan* new_element = calloc(1, sizeof(*new_element));
00280 new_element->data_element = data_element;
00281
00282 return new_element;
00283 }
00284
00285
00286 struct hlorphan* hlorphan_get_next(struct hlorphan* orphan)
00287 {
00288 if (orphan == NULL)
00289 return NULL;
00290
00291 return orphan->next;
00292 }
00293
00294
00295 int hlorphan_set_next(struct hlorphan* orphan, struct hlorphan* next)
00296 {
00297 if (orphan == NULL)
00298 return -1;
00299
00300 orphan->next = next;
00301
00302 return 0;
00303 }
00304
00305
00306 struct hlorphan* hlorphan_get_prev(struct hlorphan* orphan)
00307 {
00308 if (orphan == NULL)
00309 return NULL;
00310
00311 return orphan->prev;
00312 }
00313
00314
00315 int hlorphan_set_prev(struct hlorphan* orphan, struct hlorphan* prev)
00316 {
00317 if (orphan == NULL)
00318 return -1;
00319
00320 orphan->prev = prev;
00321
00322 return 0;
00323 }
00324
00325
00326 void* hlorphan_get_data(struct hlorphan* orphan)
00327 {
00328 if (orphan == NULL)
00329 return NULL;
00330
00331 return orphan->data_element;
00332 }
00333
00334
00335 void* hlist_dequeue(struct hlist* list)
00336 {
00337 if (list == NULL)
00338 return NULL;
00339
00340
00341 return hlelement_remove(hlist_get_first(list), list);
00342 }
00343
00344
00345 int hlist_remove(struct hlist* list)
00346 {
00347 if (list == NULL)
00348 return -1;
00349
00350
00351 struct hlelement* element = hlist_get_first(list);
00352 struct hlelement* next_element = NULL;
00353 while (element != NULL) {
00354 next_element = hlelement_get_next(element);
00355 hlelement_remove(element, list);
00356 element = next_element;
00357 }
00358 free(list);
00359
00360 return 0;
00361 }
00362
00363
00364 struct hlelement* hlist_get_first(struct hlist* list)
00365 {
00366 if (list == NULL)
00367 return NULL;
00368
00369 return list->first;
00370 }
00371
00372
00373 struct hlelement* hlist_get_last(struct hlist* list)
00374 {
00375 if (list == NULL)
00376 return NULL;
00377
00378 return list->last;
00379 }
00380