/*****************************************************************************
Major portions of this software are copyrighted by the Medical College
of Wisconsin, 1994-2000, and are released under the Gnu General Public
License, Version 2. See the file README.Copyright for details.
******************************************************************************/
#ifndef _MCW_KILLER_H_
#define _MCW_KILLER_H_
/******
Header file to manipulate "kill lists":
A way to maintain a list of data that should be deleted when necessary.
The pointers should be from XtMalloc, not malloc.
*******/
/** to get mcw_malloc stuff **/
#include "mcw_malloc.h"
/** structure to hold kill list **/
typedef struct {
int num , nalloc ;
char ** kill ;
} KILL_list ;
#define KILL_INC 32
/** initialize a new kill list **/
#define INIT_KILL(kl) ((kl).num=0, (kl).nalloc=0, (kl).kill=NULL)
/** add a pointer to be killed **/
#define ADDTO_KILL(kl,p) \
{ if( (kl).num == (kl).nalloc ){ \
(kl).nalloc += KILL_INC ; \
(kl).kill = (char **) XtRealloc( (char *) (kl).kill , \
sizeof(char *) * (kl).nalloc ) ; \
} \
(kl).kill[(kl).num++] = (char *) p ; \
}
/** kill the data in a single pointer in the kill list,
but keep the rest of the data in the list intact **/
#define SINGLE_KILL(kl,p) \
{ char * cp = (char *) (p) ; \
int qwer ; \
for( qwer=0 ; qwer < (kl).num ; qwer++ ) \
if( cp == (kl).kill[qwer] ){ \
myXtFree(cp) ; (kl).kill[qwer] = NULL ; break ; \
} \
}
/** remove a pointer from the kill list, without deleting its data **/
#define REMOVEFROM_KILL(kl,p) \
{ char * cp = (char *) (p) ; \
int qwer ; \
for( qwer=0 ; qwer < (kl).num ; qwer++ ) \
if( cp == (kl).kill[qwer] ){ \
(kl).kill[qwer] = NULL ; break ; \
} \
}
/** replace a pointer in the kill list (perhaps it was XtRealloc-ed).
If it doesn't exist, add it to the kill list. **/
#define REPLACE_KILL(kl,pold,pnew) \
{ char * cpold = (char *) (pold) ; \
char * cpnew = (char *) (pnew) ; \
int qwer ; \
for( qwer=0 ; qwer < (kl).num ; qwer++ ) \
if( cpold == (kl).kill[qwer] ){ \
(kl).kill[qwer] = cpnew ; break ; \
} \
if( qwer == (kl).num ) ADDTO_KILL((kl),pnew) ; \
}
/** kill all the data in the kill list! **/
#define KILL_KILL(kl) { \
int qwer ; \
for( qwer=0 ; qwer < (kl).num ; qwer++ ) myXtFree((kl).kill[qwer]) ; \
myXtFree( (kl).kill) ; \
INIT_KILL(kl) ; \
}
#endif /* _MCW_KILLER_H_ */
syntax highlighted by Code2HTML, v. 0.9.1