diff options
author | Igor Pashev <pashev.igor@gmail.com> | 2012-06-24 22:28:35 +0000 |
---|---|---|
committer | Igor Pashev <pashev.igor@gmail.com> | 2012-06-24 22:28:35 +0000 |
commit | 3950ffe2a485479f6561c27364d3d7df5a21d124 (patch) | |
tree | 468c6e14449d1b1e279222ec32f676b0311917d2 /src/lib/libast/cdt/dtclose.c | |
download | ksh-upstream.tar.gz |
Imported Upstream version 93u+upstream
Diffstat (limited to 'src/lib/libast/cdt/dtclose.c')
-rw-r--r-- | src/lib/libast/cdt/dtclose.c | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/src/lib/libast/cdt/dtclose.c b/src/lib/libast/cdt/dtclose.c new file mode 100644 index 0000000..45bca76 --- /dev/null +++ b/src/lib/libast/cdt/dtclose.c @@ -0,0 +1,66 @@ +/*********************************************************************** +* * +* This software is part of the ast package * +* Copyright (c) 1985-2011 AT&T Intellectual Property * +* and is licensed under the * +* Eclipse Public License, Version 1.0 * +* by AT&T Intellectual Property * +* * +* A copy of the License is available at * +* http://www.eclipse.org/org/documents/epl-v10.html * +* (with md5 checksum b35adb5213ca9657e911e9befb180842) * +* * +* 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 (11/15/2010) +*/ +#if __STD_C +int dtclose(Dt_t* dt) +#else +int dtclose(dt) +Dt_t* dt; +#endif +{ + int ev, type; + Dt_t pdt; + Dtdisc_t *disc = dt->disc; + + if(!dt || dt->nview > 0 ) /* can't close if being viewed */ + return -1; + + if(disc && disc->eventf) /* announce closing event */ + ev = (*disc->eventf)(dt, DT_CLOSE, (Void_t*)1, disc); + else ev = 0; + if(ev < 0) /* cannot close */ + return -1; + + if(dt->view) /* turn off viewing at this point */ + dtview(dt,NIL(Dt_t*)); + + type = dt->data->type; /* save before memory is freed */ + memcpy(&pdt, dt, sizeof(Dt_t)); + + if(ev == 0 ) /* release all allocated data */ + { (void)(*(dt->meth->searchf))(dt,NIL(Void_t*),DT_CLEAR); + (void)(*dt->meth->eventf)(dt, DT_CLOSE, (Void_t*)0); + /**/DEBUG_ASSERT(!dt->data); + } + if(!(type&DT_INDATA) ) + (void)free(dt); + + if(disc && disc->eventf) /* announce end of closing activities */ + (void)(*disc->eventf)(&pdt, DT_ENDCLOSE, (Void_t*)0, disc); + + return 0; +} |