Go to the documentation of this file.00001 #include "stdafx.h"
00002 #include "cphidgetlist.h"
00003
00004
00005
00006
00007
00008 int CList_addToList(CListHandle *list, void *element,
00009 int (*compare_fptr)(void *element1, void *element2))
00010 {
00011 int result = 0;
00012 CListHandle trav = 0, newentry = 0;
00013
00014 TESTPTRS(list, element)
00015
00016
00017 result = CList_findInList(*list, element, compare_fptr, NULL);
00018 switch (result) {
00019 case EPHIDGET_OK:
00020 return EPHIDGET_DUPLICATE;
00021 case EPHIDGET_NOTFOUND:
00022 break;
00023 default:
00024 return result;
00025 }
00026
00027 newentry = (CListHandle)malloc(sizeof(CList));
00028 if (!newentry) return EPHIDGET_NOMEMORY;
00029 ZEROMEM(newentry, sizeof(CList));
00030
00031 newentry->next = 0;
00032 newentry->element = element;
00033
00034 if (!*list)
00035 *list = newentry;
00036 else
00037 {
00038 for (trav = *list; trav->next; trav = trav->next);
00039 trav->next = newentry;
00040 }
00041 return EPHIDGET_OK;
00042 }
00043
00044
00045
00046
00047
00048
00049
00050 int CList_removeFromList(CListHandle *list, void *element,
00051 int (*compare_fptr)(void *element1, void *element2),
00052 int freeDevice, void (*free_fptr)(void *element))
00053 {
00054 CListHandle traverse = 0, last = 0;
00055 int freeElement = PFALSE;
00056
00057 TESTPTRS(list, element)
00058
00059 for (traverse=*list; traverse; traverse = traverse->next) {
00060 if(compare_fptr(element, traverse->element)) {
00061 if(traverse == *list) {
00062 *list = traverse->next;
00063 if(freeDevice && traverse->element)
00064 {
00065
00066 if(traverse->element == element)
00067 freeElement=PTRUE;
00068 else
00069 free_fptr(traverse->element);
00070 traverse->element = 0;
00071 }
00072 free(traverse); traverse = NULL;
00073 traverse=*list;
00074 break;
00075 }
00076 else {
00077 last->next=traverse->next;
00078 if(freeDevice && traverse->element)
00079 {
00080
00081 if(traverse->element == element)
00082 freeElement=PTRUE;
00083 else
00084 free_fptr(traverse->element);
00085 traverse->element = 0;
00086 }
00087 free(traverse); traverse = NULL;
00088 traverse=last;
00089 }
00090 }
00091 last = traverse;
00092 }
00093
00094
00095 if(freeElement)
00096 free_fptr(element);
00097
00098 return EPHIDGET_OK;
00099 }
00100
00101
00102
00103 int CList_emptyList(CListHandle *list, int freeDevices, void (*free_fptr)(void *element))
00104 {
00105 CListHandle last = 0, traverse = 0;
00106
00107 TESTPTR(list)
00108
00109 last = 0;
00110 for(traverse = *list; traverse; last = traverse, traverse = traverse->next)
00111 {
00112 if(traverse->element && freeDevices)
00113 {
00114 free_fptr(traverse->element);
00115 traverse->element = 0;
00116 }
00117 if(last)
00118 {
00119 free(last); last = NULL;
00120 }
00121 }
00122 if(last)
00123 {
00124 free(last); last = NULL;
00125 }
00126
00127 *list = 0;
00128
00129 return EPHIDGET_OK;
00130 }
00131
00132
00133 int CList_findInList(CListHandle list, void *element,
00134 int (*compare_fptr)(void *element1, void *element2), void **found_element)
00135 {
00136 CListHandle trav = 0;
00137
00138 TESTPTR(element)
00139
00140 for (trav=list; trav; trav = trav->next) {
00141 if(compare_fptr(element, trav->element)) {
00142 if(found_element) *found_element = trav->element;
00143 return EPHIDGET_OK;
00144 }
00145 }
00146 return EPHIDGET_NOTFOUND;
00147 }
00148