コード例 #1
0
ファイル: dl.c プロジェクト: Firstyear/ds
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;
}
コード例 #2
0
ファイル: dl.c プロジェクト: Firstyear/ds
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;
}
コード例 #3
0
ファイル: vectr.c プロジェクト: MichalKnapik/spatula
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);
            }
        }
    }
コード例 #4
0
ファイル: riddle.c プロジェクト: andynicholson/libpd
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);
}
コード例 #5
0
ファイル: vectr.c プロジェクト: MichalKnapik/spatula
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);
    }
コード例 #6
0
ファイル: conf.c プロジェクト: rctay/powaur
/* 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;
	}
}
コード例 #7
0
void dFree (void *ptr, size_t size)
{
  if (!ptr) return;
  if (freefn) freefn (ptr,size); else free (ptr);
}