/*********************************************************************** * * * 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 * * David Korn * * Phong Vo * * * ***********************************************************************/ #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; }