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