#include #include #include "trick/collect_macros.h" /** @brief Adds the addess, collectee, to the list pointed to by collector. Returns a new pointer to the new list. The old list a collector will be freed. @details -# Get the current list length -# Allocate enough space to accomodate the current list + 1. (+1 for the size of the list) -# Set the size of the new list in the first slot of the new list. -# Copy the old list to the new. -# Append the new item to the new list. -# Delete the old list -# Return the new list */ void ** add_collect( void ** collector , void * collectee ) { int collect_size = NUM_COLLECT(collector) ; void ** new_list ; long * lp ; // create a new list new_list = (void**)malloc((collect_size + 2) * sizeof(void*)); // set the list size lp = ( long *)new_list ; *lp = collect_size + 1 ; // copy old list new_list++ ; if ( collect_size > 0 ) { memcpy( new_list , collector , collect_size * sizeof(void *)) ; } new_list[collect_size] = collectee ; // remove old list if ( collector ) { free(collector - 1) ; } return new_list ; } /** @brief Deletes the addess, collectee, from the list pointed to by collector. Returns a new pointer to the new list. The old list a collector will be freed. @details -# Get the current list length -# Count the number of items in the list that do not match the collectee. -# Allocate enough space to accomodate the new list. (+1 for the size of the list) -# Set the size of the new list in the first slot of the new list. -# Copy all of the items that do not match collectee to the new list -# Delete the old list -# Return the new list */ void ** delete_collect( void ** collector , void * collectee ) { int collect_size = NUM_COLLECT(collector) ; int new_count = 0 ; void ** new_list ; long * lp ; int ii , jj ; for ( ii = 0 ; ii < collect_size ; ii++ ) { if ( collector[ii] != collectee ) { new_count++ ; } } if ( new_count > 0 ) { // create a new list new_list = (void**)malloc((new_count + 1) * sizeof(void*)); // set the list size lp = ( long *)new_list ; *lp = new_count ; // copy old list new_list++ ; jj = 0 ; for ( ii = 0 ; ii < collect_size ; ii++ ) { if ( collector[ii] != collectee ) { new_list[jj++] = collector[ii] ; } } } else { new_list = NULL ; } // remove old list if ( collector ) { free(collector - 1) ; } return new_list ; }