1 /* { dg-do compile } */
2 /* { dg-options "-O3" } */
4 typedef long unsigned int size_t;
13 typedef struct _dtlink_s Dtlink_t
;
14 typedef struct _dtdisc_s Dtdisc_t
;
15 typedef struct _dtmethod_s Dtmethod_t
;
16 typedef struct _dt_s Dt_t
;
17 typedef void *(*Dtmemory_f
) (Dt_t
*, void *, size_t, Dtdisc_t
*);
18 typedef void *(*Dtsearch_f
) (Dt_t
*, void *, int);
19 typedef void *(*Dtmake_f
) (Dt_t
*, void *, Dtdisc_t
*);
20 typedef void (*Dtfree_f
) (Dt_t
*, void *, Dtdisc_t
*);
21 typedef int (*Dtcompar_f
) (Dt_t
*, void *, void *, Dtdisc_t
*);
22 typedef unsigned int (*Dthash_f
) (Dt_t
*, void *, Dtdisc_t
*);
23 typedef int (*Dtevent_f
) (Dt_t
*, int, void *, Dtdisc_t
*);
44 extern Dtmethod_t
*Dtobag
;
45 extern Dt_t
*dtopen (Dtdisc_t
*, Dtmethod_t
*);
46 extern Dtlink_t
*dtflatten (Dt_t
*);
47 typedef struct Agobj_s Agobj_t
;
48 typedef struct Agraph_s Agraph_t
;
49 typedef struct Agnode_s Agnode_t
;
50 typedef struct Agedge_s Agedge_t
;
51 typedef struct Agdesc_s Agdesc_t
;
52 typedef struct Agdisc_s Agdisc_t
;
53 typedef struct Agrec_s Agrec_t
;
61 extern Agraph_t
*agopen (char *name
, Agdesc_t desc
, Agdisc_t
* disc
);
62 extern Agnode_t
*agfstnode (Agraph_t
* g
);
63 extern Agnode_t
*agnxtnode (Agraph_t
* g
, Agnode_t
* n
);
64 extern Agedge_t
*agedge (Agraph_t
* g
, Agnode_t
* t
, Agnode_t
* h
, char *name
,
66 extern Agedge_t
*agfstout (Agraph_t
* g
, Agnode_t
* n
);
67 extern Agedge_t
*agnxtout (Agraph_t
* g
, Agedge_t
* e
);
68 extern Agdesc_t Agdirected
, Agstrictdirected
, Agundirected
,
70 typedef struct Agraph_s graph_t
;
71 typedef struct Agnode_s node_t
;
72 typedef struct Agedge_s edge_t
;
73 typedef union inside_t
75 unsigned short minlen
;
78 extern void *gmalloc (size_t);
80 { AM_NONE
, AM_VOR
, AM_SCALE
, AM_NSCALE
, AM_SCALEXY
, AM_PUSH
, AM_PUSHPULL
,
81 AM_ORTHO
, AM_ORTHO_YX
, AM_ORTHOXY
, AM_ORTHOYX
, AM_PORTHO
, AM_PORTHO_YX
,
82 AM_PORTHOXY
, AM_PORTHOYX
, AM_COMPRESS
, AM_VPSC
, AM_IPSEP
, AM_PRISM
}
92 typedef int (*distfn
) (box
*, box
*);
93 typedef int (*intersectfn
) (nitem
*, nitem
*);
94 int agnnodes (graph_t
*);
95 int overlaps (nitem
*, int);
97 cmpitem (Dt_t
* d
, int *p1
, int *p2
, Dtdisc_t
* disc
)
100 static Dtdisc_t constr
=
101 { __builtin_offsetof (nitem
, val
), sizeof (int), __builtin_offsetof (nitem
,
103 ((Dtmake_f
) 0), ((Dtfree_f
) 0), (Dtcompar_f
) cmpitem
, ((Dthash_f
) 0), ((Dtmemory_f
) 0),
106 distX (box
* b1
, box
* b2
)
111 intersectY0 (nitem
* p
, nitem
* q
)
116 intersectY (nitem
* p
, nitem
* q
)
121 mapGraphs (graph_t
* g
, graph_t
* cg
, distfn dist
)
131 for (n
= agfstnode (g
); n
; n
= agnxtnode (g
, n
))
133 for (e
= agfstout (g
, n
); e
; e
= agnxtout (g
, e
))
135 delta
= dist (&tp
->bb
, &hp
->bb
);
136 ce
= agedge (cg
, t
, h
, ((void *) 0), 1);
137 if ((((Agedgeinfo_t
*) (((Agobj_t
*) (ce
))->data
))->minlen
) < delta
)
139 if ((((Agedgeinfo_t
*) (((Agobj_t
*) (ce
))->data
))->minlen
) ==
149 mkNConstraintG (graph_t
* g
, Dt_t
* list
, intersectfn intersect
, distfn dist
)
154 graph_t
*cg
= agopen ("cg", Agstrictdirected
, ((Agdisc_t
*) 0));
155 for (p
= (nitem
*) dtflatten (list
); p
;
156 p
= (nitem
*) (((Dtlink_t
*) ((Dtlink_t
*) p
))->right
))
158 for (nxp
= (nitem
*) (((Dtlink_t
*) ((Dtlink_t
*) p
))->right
); nxp
;
159 nxp
= (nitem
*) (((Dtlink_t
*) ((Dtlink_t
*) nxp
))->right
))
161 if (intersect (p
, nxp
))
163 e
= agedge (cg
, p
->cnode
, nxp
->cnode
, ((void *) 0), 1);
165 }} for (p
= (nitem
*) dtflatten (list
); p
;
166 p
= (nitem
*) (((Dtlink_t
*) ((Dtlink_t
*) p
))->right
))
172 mkConstraintG (graph_t
* g
, Dt_t
* list
, intersectfn intersect
, distfn dist
)
175 graph_t
*cg
= agopen ("cg", Agstrictdirected
, ((Agdisc_t
*) 0));
176 mapGraphs (vg
, cg
, dist
);
180 constrainX (graph_t
* g
, nitem
* nlist
, int nnodes
, intersectfn ifn
,
183 Dt_t
*list
= dtopen (&constr
, Dtobag
);
187 for (i
= 0; i
< nnodes
; i
++)
189 (*(((Dt_t
*) (list
))->searchf
)) ((list
), (void *) (p
), 0000001);
192 cg
= mkConstraintG (g
, list
, ifn
, distX
);
194 cg
= mkNConstraintG (g
, list
, ifn
, distX
);
198 cAdjust (graph_t
* g
, int mode
)
200 int ret
, i
, nnodes
= agnnodes (g
);
201 nitem
*nlist
= (nitem
*) gmalloc ((nnodes
) * sizeof (nitem
));
203 for (n
= agfstnode (g
); n
; n
= agnxtnode (g
, n
))
206 if (overlaps (nlist
, nnodes
))
208 switch ((adjust_mode
) mode
)
211 constrainX (g
, nlist
, nnodes
, intersectY
, 1);
213 constrainX (g
, nlist
, nnodes
, intersectY0
, 1);
214 constrainX (g
, nlist
, nnodes
, intersectY
, 1);
217 constrainX (g
, nlist
, nnodes
, intersectY0
, 0);