Graphviz 14.1.1~dev.20251208.1034
Loading...
Searching...
No Matches
dtview.c
Go to the documentation of this file.
1#include <cdt/dthdr.h>
2#include <stddef.h>
3
4/* Set a view path from dict to view.
5**
6** Written by Kiem-Phong Vo (5/25/96)
7*/
8
9
10static void* dtvsearch(Dt_t* dt, void* obj, int type)
11{
12 Dt_t *d, *p;
13 void *o = NULL, *n, *ok, *nk;
14 int cmp, sz, ky;
16
17 /* these operations only happen at the top level */
19 return dt->meth->searchf(dt, obj, type);
20
21 if((type&(DT_MATCH|DT_SEARCH)) || /* order sets first/last done below */
22 ((type&(DT_FIRST|DT_LAST)) && !(dt->meth->type&(DT_OBAG|DT_OSET)) ) )
23 { for(d = dt; d; d = d->view)
24 if ((o = d->meth->searchf(d, obj, type)))
25 break;
26 dt->walk = d;
27 return o;
28 }
29
30 if(dt->meth->type & (DT_OBAG|DT_OSET) )
31 { if(!(type & (DT_FIRST|DT_LAST|DT_NEXT|DT_PREV)) )
32 return NULL;
33
34 n = nk = NULL; p = NULL;
35 for(d = dt; d; d = d->view)
36 { if (!(o = d->meth->searchf(d, obj, type)))
37 continue;
38 _DTDSC(d->disc, ky, sz, (int){0}, cmpf);
39 ok = _DTKEY(o,ky,sz);
40
41 if(n) /* get the right one among all dictionaries */
42 { cmp = _DTCMP(ok, nk, cmpf, sz);
43 if(((type & (DT_NEXT|DT_FIRST)) && cmp < 0) ||
44 ((type & (DT_PREV|DT_LAST)) && cmp > 0) )
45 goto a_dj;
46 }
47 else /* looks good for now */
48 { a_dj: p = d;
49 n = o;
50 nk = ok;
51 }
52 }
53
54 dt->walk = p;
55 return n;
56 }
57
58 /* non-ordered methods */
59 if(!(type & (DT_NEXT|DT_PREV)) )
60 return NULL;
61
62 if(!dt->walk || obj != _DTOBJ(dt->walk->data.here, dt->walk->disc->link) )
63 { for(d = dt; d; d = d->view)
64 if ((o = d->meth->searchf(d, obj, DT_SEARCH)))
65 break;
66 dt->walk = d;
67 if(!(obj = o) )
68 return NULL;
69 }
70
71 for (d = dt->walk, obj = d->meth->searchf(d, obj, type);; )
72 { while(obj) /* keep moving until finding an uncovered object */
73 { for(p = dt; ; p = p->view)
74 { if(p == d) /* adjacent object is uncovered */
75 return obj;
76 if (p->meth->searchf(p, obj, DT_SEARCH))
77 break;
78 }
79 obj = d->meth->searchf(d, obj, type);
80 }
81
82 if(!(d = dt->walk = d->view) ) /* move on to next dictionary */
83 return NULL;
84 else if(type&DT_NEXT)
85 obj = d->meth->searchf(d, NULL, DT_FIRST);
86 else obj = d->meth->searchf(d, NULL, DT_LAST);
87 }
88}
89
91{
92 Dt_t* d;
93
94 UNFLATTEN(dt);
95 if(view)
96 { UNFLATTEN(view);
97 if(view->meth != dt->meth) /* must use the same method */
98 return NULL;
99 }
100
101 /* make sure there won't be a cycle */
102 for(d = view; d; d = d->view)
103 if(d == dt)
104 return NULL;
105
106 /* no more viewing lower dictionary */
107 if((d = dt->view) )
108 d->nview -= 1;
109 dt->view = dt->walk = NULL;
110
111 if(!view)
112 { dt->searchf = dt->meth->searchf;
113 return d;
114 }
115
116 /* ok */
117 dt->view = view;
118 dt->searchf = dtvsearch;
119 view->nview += 1;
120
121 return view;
122}
#define DT_MATCH
Definition cdt.h:134
#define _DTKEY(o, ky, sz)
Definition cdt.h:169
#define _DTDSC(dc, ky, sz, lk, cmpf)
Definition cdt.h:164
#define DT_LAST
Definition cdt.h:133
#define DT_OBAG
Definition cdt.h:121
#define DT_PREV
Definition cdt.h:129
#define DT_NEXT
Definition cdt.h:128
int(* Dtcompar_f)(void *, void *)
Definition cdt.h:48
#define DT_SEARCH
Definition cdt.h:127
#define DT_DELETE
Definition cdt.h:126
#define DT_CLEAR
Definition cdt.h:131
#define DT_INSERT
Definition cdt.h:125
#define DT_RENEW
Definition cdt.h:130
#define DT_OSET
Definition cdt.h:120
#define _DTCMP(k1, k2, cmpf, sz)
Definition cdt.h:172
#define _DTOBJ(e, lk)
Definition cdt.h:167
#define DT_FIRST
Definition cdt.h:132
static int cmpf(void *key1, void *key2)
Definition dijkstra.c:82
#define UNFLATTEN(dt)
Definition dthdr.h:27
static void * dtvsearch(Dt_t *dt, void *obj, int type)
Definition dtview.c:10
Dt_t * dtview(Dt_t *dt, Dt_t *view)
Definition dtview.c:90
expr procedure type
Definition exparse.y:208
static int cmp(const void *key, const void *candidate)
node NULL
Definition grammar.y:181
bool ok(Agraph_t *g)
Definition gv.cpp:364
ViewInfo * view
Definition viewport.c:37
Dtlink_t * here
Definition cdt.h:73
Dtsearch_f searchf
Definition cdt.h:66
int type
Definition cdt.h:67
Definition cdt.h:98
Dtmethod_t * meth
Definition cdt.h:102
Dt_t * walk
Definition cdt.h:105
Dtsearch_f searchf
Definition cdt.h:99
Dtdata_t data
sharable data
Definition cdt.h:101
int nview
Definition cdt.h:103
Dtdisc_t * disc
Definition cdt.h:100
Dt_t * view
Definition cdt.h:104
int link
Definition cdt.h:87