void *dl_delete (DataList *dl, const void *element, CMPFN cmpfn, FREEFN freefn) { int i; void *save; PR_ASSERT (dl); PR_ASSERT (element); PR_ASSERT (cmpfn); for (i = 0; i < dl->element_count; i++) { if (cmpfn (dl->elements[i], element) == 0) { /* if we have destructor - free the data; otherwise, return it to the client */ if (freefn) { freefn (&dl->elements[i]); save = NULL; } else save = dl->elements[i]; if (i != dl->element_count - 1) { memmove (&dl->elements[i], &dl->elements[i+1], (dl->element_count - i - 1) * sizeof (void*)); } dl->element_count --; return save; } } return NULL; }
void *dl_replace(const DataList *dl, const void *elementOld, void *elementNew, CMPFN cmpfn, FREEFN freefn) { int i; void *save; PR_ASSERT (dl); PR_ASSERT (elementOld); PR_ASSERT (elementNew); PR_ASSERT (cmpfn); for (i = 0; i < dl->element_count; i++) { if (cmpfn (dl->elements[i], elementOld) == 0) { /* if we have destructor - free the data; otherwise, return it to the client */ if (freefn) { freefn (&dl->elements[i]); save = NULL; } else save = dl->elements[i]; dl->elements[i] = elementNew; return save; } } return NULL; }
void mapInsert(mmap* m, char* key, void* value, int (*cmpfn)(void* v1, void* v2), void (*freefn)(void*)) { /* NULL values allow for set emulation */ int fnd = findIndex(m, key); if(fnd == -1) { /* key not found */ append(m->keys, key); if(value != NULL) { vectr* v = newVectr(); append(v, value); append(m->vals, v); } } else { /* key found */ free(key); /* dodgy design - assumes that key is strdup-ed */ if(value != NULL) { vectr* valvctr = get(m->vals, fnd); if(cmpfn != NULL) { int vctr = valvctr->elements; while(--vctr >= 0) { if(cmpfn(value, get(valvctr, vctr)) == 0) { freefn(value); return; } } } append(valvctr, value); } } }
static void riddle_free(t_riddle *rd) { t_gotfn freefn = zgetfn((t_pd *)rd, gensym("_free")); if (freefn) freefn(rd); if (rd->rd_private) freebytes(rd->rd_private, sizeof(*rd->rd_private)); if (rd->rd_inslots) { int nslots = rd->rd_nsiginlets + rd->rd_nremoteslots; freebytes(rd->rd_inslots, nslots * sizeof(*rd->rd_inslots)); } if (rd->rd_outslots) { t_rdsink *si; int i; for (i = 0, si = rd->rd_outslots; i < rd->rd_nsigoutlets; i++, si++) if (si->si_feedchain) rdfeedchain_free(si->si_feedchain); freebytes(rd->rd_outslots, rd->rd_nsigoutlets * sizeof(*rd->rd_outslots)); } rdremote_freeports(rd->rd_remoteports); if (rd->rd_idlepicker) rdpicker_detach(rd->rd_idlepicker, rd); }
void freeVectr(vectr* v, void (*freefn)(void*)) { int i = 0; if(freefn != NULL) for(i = 0; i < v->elements; ++i) { freefn(v->data[i]); } free(v->data); free(v); }
/* Disgusting 8 variable function */ static void parse_pmoption_repeat(int *flag, int *flag_com, char *line, const char *key, void (*repeatfn) (char *), void (*freefn) (void **), void **global_conf, int comment) { if ((comment && (*flag || *flag_com)) || (!comment && *flag)) { return; } if (!(line = strchr(line, '='))) { return; } if (*global_conf) { freefn(global_conf); *global_conf = NULL; } ++line; line = strtrim(line); if (!strlen(line)) { return; } char *ptr; while (ptr = strchr(line, ' ')) { *ptr = 0; ++ptr; repeatfn(line); line = ptr; line = strtrim(line); } repeatfn(line); if (comment) { *flag_com = 1; } else { *flag = 1; } }
void dFree (void *ptr, size_t size) { if (!ptr) return; if (freefn) freefn (ptr,size); else free (ptr); }