diff options
Diffstat (limited to 'usr/src/lib/libast/common/cdt/dtclose.c')
-rw-r--r-- | usr/src/lib/libast/common/cdt/dtclose.c | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/usr/src/lib/libast/common/cdt/dtclose.c b/usr/src/lib/libast/common/cdt/dtclose.c new file mode 100644 index 0000000000..b3b17bbbeb --- /dev/null +++ b/usr/src/lib/libast/common/cdt/dtclose.c @@ -0,0 +1,69 @@ +/*********************************************************************** +* * +* This software is part of the ast package * +* Copyright (c) 1985-2007 AT&T Knowledge Ventures * +* and is licensed under the * +* Common Public License, Version 1.0 * +* by AT&T Knowledge Ventures * +* * +* A copy of the License is available at * +* http://www.opensource.org/licenses/cpl1.0.txt * +* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * +* * +* Information and Software Systems Research * +* AT&T Research * +* Florham Park NJ * +* * +* Glenn Fowler <gsf@research.att.com> * +* David Korn <dgk@research.att.com> * +* Phong Vo <kpv@research.att.com> * +* * +***********************************************************************/ +#include "dthdr.h" + +/* Close a dictionary +** +** Written by Kiem-Phong Vo (05/25/96) +*/ +#if __STD_C +int dtclose(reg Dt_t* dt) +#else +int dtclose(dt) +reg Dt_t* dt; +#endif +{ + Dtdisc_t *disc; + int ev = 0; + + if(!dt || dt->nview > 0 ) /* can't close if being viewed */ + return -1; + + /* announce the close event to see if we should continue */ + disc = dt->disc; + if(disc->eventf && + (ev = (*disc->eventf)(dt,DT_CLOSE,NIL(Void_t*),disc)) < 0) + return -1; + + if(dt->view) /* turn off viewing */ + dtview(dt,NIL(Dt_t*)); + + if(ev == 0) /* release all allocated data */ + { (void)(*(dt->meth->searchf))(dt,NIL(Void_t*),DT_CLEAR); + if(dtsize(dt) > 0) + return -1; + + if(dt->data->ntab > 0) + (*dt->memoryf)(dt,(Void_t*)dt->data->htab,0,disc); + (*dt->memoryf)(dt,(Void_t*)dt->data,0,disc); + } + + if(dt->type == DT_MALLOC) + free((Void_t*)dt); + else if(ev == 0 && dt->type == DT_MEMORYF) + (*dt->memoryf)(dt, (Void_t*)dt, 0, disc); + + if(disc->eventf) + (void)(*disc->eventf)(dt, DT_ENDCLOSE, NIL(Void_t*), disc); + + return 0; +} |