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/dtmethod.c | |
download | ksh-upstream.tar.gz |
Imported Upstream version 93u+upstream
Diffstat (limited to 'src/lib/libast/cdt/dtmethod.c')
-rw-r--r-- | src/lib/libast/cdt/dtmethod.c | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/src/lib/libast/cdt/dtmethod.c b/src/lib/libast/cdt/dtmethod.c new file mode 100644 index 0000000..56a1d25 --- /dev/null +++ b/src/lib/libast/cdt/dtmethod.c @@ -0,0 +1,107 @@ +/*********************************************************************** +* * +* 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" + +/* Change search method. +** +** Written by Kiem-Phong Vo (05/25/96) +*/ + +#if __STD_C +Dtmethod_t* dtmethod(Dt_t* dt, Dtmethod_t* meth) +#else +Dtmethod_t* dtmethod(dt, meth) +Dt_t* dt; +Dtmethod_t* meth; +#endif +{ + Dtlink_t *list; + Dtdisc_t *disc = dt->disc; + Dtmethod_t *oldmt = dt->meth; + Dtdata_t *newdt, *olddt = dt->data; + + if(!meth || meth == oldmt) + return oldmt; + + /* ask discipline if switching to new method is ok */ + if(disc->eventf && (*disc->eventf)(dt,DT_METH,(Void_t*)meth,disc) < 0) + return NIL(Dtmethod_t*); + + list = dtextract(dt); /* extract elements out of dictionary */ + + /* try to create internal structure for new method */ + if(dt->searchf == oldmt->searchf) /* ie, not viewpathing */ + dt->searchf = meth->searchf; + dt->meth = meth; + dt->data = NIL(Dtdata_t*); + if((*dt->meth->eventf)(dt, DT_OPEN, NIL(Void_t*)) < 0 ) + newdt = NIL(Dtdata_t*); + else newdt = dt->data; + + /* see what need to be done to data of the old method */ + if(dt->searchf == meth->searchf) + dt->searchf = oldmt->searchf; + dt->meth = oldmt; + dt->data = olddt; + if(newdt) /* switch was successful, remove old data */ + { (void)(*dt->meth->eventf)(dt, DT_CLOSE, NIL(Void_t*)); + + if(dt->searchf == oldmt->searchf) + dt->searchf = meth->searchf; + dt->meth = meth; + dt->data = newdt; + dtrestore(dt, list); + return oldmt; + } + else /* switch failed, restore dictionary to previous states */ + { dtrestore(dt, list); + return NIL(Dtmethod_t*); + } +} + +/* customize certain actions in a container data structure */ +int dtcustomize(Dt_t* dt, int type, int action) +{ + int done = 0; + + if((type&DT_SHARE) && + (!dt->meth->eventf || (*dt->meth->eventf)(dt, DT_SHARE, (Void_t*)((long)action)) >= 0) ) + { if(action <= 0 ) + dt->data->type &= ~DT_SHARE; + else dt->data->type |= DT_SHARE; + done |= DT_SHARE; + } + + if((type&DT_ANNOUNCE) && + (!dt->meth->eventf || (*dt->meth->eventf)(dt, DT_ANNOUNCE, (Void_t*)((long)action)) >= 0) ) + { if(action <= 0 ) + dt->data->type &= ~DT_ANNOUNCE; + else dt->data->type |= DT_ANNOUNCE; + done |= DT_ANNOUNCE; + } + + if((type&DT_OPTIMIZE) && + (!dt->meth->eventf || (*dt->meth->eventf)(dt, DT_OPTIMIZE, (Void_t*)((long)action)) >= 0) ) + done |= DT_OPTIMIZE; + + return done; +} |