custom free function, in case you need to ctrl_alloc a structure which
then has additional dynamically allocated things dangling off it.
git-svn-id: http://svn.tartarus.org/sgt/putty@9922
cda61777-01e9-0310-a592-
d414129be87e
ret->ctrlsets = NULL;
ret->nfrees = ret->freesize = 0;
ret->frees = NULL;
ret->ctrlsets = NULL;
ret->nfrees = ret->freesize = 0;
ret->frees = NULL;
ctrl_free_set(b->ctrlsets[i]);
}
for (i = 0; i < b->nfrees; i++)
ctrl_free_set(b->ctrlsets[i]);
}
for (i = 0; i < b->nfrees; i++)
+ b->freefuncs[i](b->frees[i]);
sfree(b->ctrlsets);
sfree(b->frees);
sfree(b->ctrlsets);
sfree(b->frees);
}
/* Allocate some private data in a controlbox. */
}
/* Allocate some private data in a controlbox. */
-void *ctrl_alloc(struct controlbox *b, size_t size)
+void *ctrl_alloc_with_free(struct controlbox *b, size_t size,
+ ctrl_freefn_t freefunc)
if (b->nfrees >= b->freesize) {
b->freesize = b->nfrees + 32;
b->frees = sresize(b->frees, b->freesize, void *);
if (b->nfrees >= b->freesize) {
b->freesize = b->nfrees + 32;
b->frees = sresize(b->frees, b->freesize, void *);
+ b->freefuncs = sresize(b->freefuncs, b->freesize, ctrl_freefn_t);
- b->frees[b->nfrees++] = p;
+ b->frees[b->nfrees] = p;
+ b->freefuncs[b->nfrees] = freefunc;
+ b->nfrees++;
+static void ctrl_default_free(void *p)
+{
+ sfree(p);
+}
+
+void *ctrl_alloc(struct controlbox *b, size_t size)
+{
+ return ctrl_alloc_with_free(b, size, ctrl_default_free);
+}
+
static union control *ctrl_new(struct controlset *s, int type,
intorptr helpctx, handler_fn handler,
intorptr context)
static union control *ctrl_new(struct controlset *s, int type,
intorptr helpctx, handler_fn handler,
intorptr context)
union control **ctrls; /* actual array */
};
union control **ctrls; /* actual array */
};
+typedef void (*ctrl_freefn_t)(void *); /* used by ctrl_alloc_with_free */
+
/*
* This is the container structure which holds a complete set of
* controls.
/*
* This is the container structure which holds a complete set of
* controls.
int nfrees;
int freesize;
void **frees; /* array of aux data areas to free */
int nfrees;
int freesize;
void **frees; /* array of aux data areas to free */
+ ctrl_freefn_t *freefuncs; /* parallel array of free functions */
};
struct controlbox *ctrl_new_box(void);
};
struct controlbox *ctrl_new_box(void);
* and so data allocated through this function is better not used
* to hold modifiable per-instance things. It's mostly here for
* allocating structures to be passed as control handler params.
* and so data allocated through this function is better not used
* to hold modifiable per-instance things. It's mostly here for
* allocating structures to be passed as control handler params.
+ *
+ * ctrl_alloc_with_free also allows you to provide a function to free
+ * the structure, in case there are other dynamically allocated bits
+ * and pieces dangling off it.
*/
void *ctrl_alloc(struct controlbox *b, size_t size);
*/
void *ctrl_alloc(struct controlbox *b, size_t size);
+void *ctrl_alloc_with_free(struct controlbox *b, size_t size,
+ ctrl_freefn_t freefunc);
/*
* Individual routines to create `union control' structures in a controlset.
/*
* Individual routines to create `union control' structures in a controlset.