summaryrefslogtreecommitdiff
path: root/src/lib/libast/cdt/dtclose.c
diff options
context:
space:
mode:
authorIgor Pashev <pashev.igor@gmail.com>2012-06-24 22:28:35 +0000
committerIgor Pashev <pashev.igor@gmail.com>2012-06-24 22:28:35 +0000
commit3950ffe2a485479f6561c27364d3d7df5a21d124 (patch)
tree468c6e14449d1b1e279222ec32f676b0311917d2 /src/lib/libast/cdt/dtclose.c
downloadksh-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.c66
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;
+}