summaryrefslogtreecommitdiff
path: root/src/lib/libast/cdt/dtmethod.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/dtmethod.c
downloadksh-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.c107
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;
+}