cphidgetlist.c
Go to the documentation of this file.
00001 #include "stdafx.h"
00002 #include "cphidgetlist.h"
00003 
00004 /* Adds an element to a list - Duplicates are not allowed.
00005  * Return:      EPHIDGET_OK on success
00006  *                      EPHIDGET_DUPLICATE if the element already exists in the list
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         /* The very first thing we do is make sure none of these already exist in the list */
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 /* this returns success even if the element is not found in the list
00045  * this also removes duplicates.
00046  *
00047  * but! if we find in the list the exact element, rather then just a match, we need to free it after! 
00048  * interating, or the compare function will croak!
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                                         // don't free element in the middle of iterating!
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                                         // don't free element in the middle of iterating!
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         /* element itself was found in the list, and we want it freed - free it here */
00095         if(freeElement)
00096                 free_fptr(element);
00097 
00098         return EPHIDGET_OK;
00099 }
00100 
00101 /* this takes any list, and frees all of the list element, 
00102         and can also free the elements that they point to */
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 /* returns EPHIDGET_OK if the device is in the list */
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 


pedal_monitor
Author(s): Pedro Mendes
autogenerated on Fri Jun 6 2014 18:37:20