| /* { dg-do compile } */ |
| /* { dg-options "-O3" } */ |
| |
| typedef long unsigned int size_t; |
| typedef struct |
| { |
| } |
| box; |
| typedef struct |
| { |
| } |
| textpara_t; |
| typedef struct _dtlink_s Dtlink_t; |
| typedef struct _dtdisc_s Dtdisc_t; |
| typedef struct _dtmethod_s Dtmethod_t; |
| typedef struct _dt_s Dt_t; |
| typedef void *(*Dtmemory_f) (Dt_t *, void *, size_t, Dtdisc_t *); |
| typedef void *(*Dtsearch_f) (Dt_t *, void *, int); |
| typedef void *(*Dtmake_f) (Dt_t *, void *, Dtdisc_t *); |
| typedef void (*Dtfree_f) (Dt_t *, void *, Dtdisc_t *); |
| typedef int (*Dtcompar_f) (Dt_t *, void *, void *, Dtdisc_t *); |
| typedef unsigned int (*Dthash_f) (Dt_t *, void *, Dtdisc_t *); |
| typedef int (*Dtevent_f) (Dt_t *, int, void *, Dtdisc_t *); |
| struct _dtlink_s |
| { |
| Dtlink_t *right; |
| }; |
| struct _dtdisc_s |
| { |
| int key; |
| int size; |
| int link; |
| Dtmake_f makef; |
| Dtfree_f freef; |
| Dtcompar_f comparf; |
| Dthash_f hashf; |
| Dtmemory_f memoryf; |
| Dtevent_f eventf; |
| }; |
| struct _dt_s |
| { |
| Dtsearch_f searchf; |
| }; |
| extern Dtmethod_t *Dtobag; |
| extern Dt_t *dtopen (Dtdisc_t *, Dtmethod_t *); |
| extern Dtlink_t *dtflatten (Dt_t *); |
| typedef struct Agobj_s Agobj_t; |
| typedef struct Agraph_s Agraph_t; |
| typedef struct Agnode_s Agnode_t; |
| typedef struct Agedge_s Agedge_t; |
| typedef struct Agdesc_s Agdesc_t; |
| typedef struct Agdisc_s Agdisc_t; |
| typedef struct Agrec_s Agrec_t; |
| struct Agobj_s |
| { |
| Agrec_t *data; |
| }; |
| struct Agdesc_s |
| { |
| }; |
| extern Agraph_t *agopen (char *name, Agdesc_t desc, Agdisc_t * disc); |
| extern Agnode_t *agfstnode (Agraph_t * g); |
| extern Agnode_t *agnxtnode (Agraph_t * g, Agnode_t * n); |
| extern Agedge_t *agedge (Agraph_t * g, Agnode_t * t, Agnode_t * h, char *name, |
| int createflag); |
| extern Agedge_t *agfstout (Agraph_t * g, Agnode_t * n); |
| extern Agedge_t *agnxtout (Agraph_t * g, Agedge_t * e); |
| extern Agdesc_t Agdirected, Agstrictdirected, Agundirected, |
| Agstrictundirected; |
| typedef struct Agraph_s graph_t; |
| typedef struct Agnode_s node_t; |
| typedef struct Agedge_s edge_t; |
| typedef union inside_t |
| { |
| unsigned short minlen; |
| } |
| Agedgeinfo_t; |
| extern void *gmalloc (size_t); |
| typedef enum |
| { AM_NONE, AM_VOR, AM_SCALE, AM_NSCALE, AM_SCALEXY, AM_PUSH, AM_PUSHPULL, |
| AM_ORTHO, AM_ORTHO_YX, AM_ORTHOXY, AM_ORTHOYX, AM_PORTHO, AM_PORTHO_YX, |
| AM_PORTHOXY, AM_PORTHOYX, AM_COMPRESS, AM_VPSC, AM_IPSEP, AM_PRISM } |
| adjust_mode; |
| typedef struct nitem |
| { |
| Dtlink_t link; |
| int val; |
| node_t *cnode; |
| box bb; |
| } |
| nitem; |
| typedef int (*distfn) (box *, box *); |
| typedef int (*intersectfn) (nitem *, nitem *); |
| int agnnodes (graph_t *); |
| int overlaps (nitem *, int); |
| static int |
| cmpitem (Dt_t * d, int *p1, int *p2, Dtdisc_t * disc) |
| { |
| } |
| static Dtdisc_t constr = |
| { __builtin_offsetof (nitem, val), sizeof (int), __builtin_offsetof (nitem, |
| link), |
| ((Dtmake_f) 0), ((Dtfree_f) 0), (Dtcompar_f) cmpitem, ((Dthash_f) 0), ((Dtmemory_f) 0), |
| ((Dtevent_f) 0) }; |
| static int |
| distX (box * b1, box * b2) |
| { |
| } |
| |
| static int |
| intersectY0 (nitem * p, nitem * q) |
| { |
| } |
| |
| static int |
| intersectY (nitem * p, nitem * q) |
| { |
| } |
| |
| static void |
| mapGraphs (graph_t * g, graph_t * cg, distfn dist) |
| { |
| node_t *n; |
| edge_t *e; |
| edge_t *ce; |
| node_t *t; |
| node_t *h; |
| nitem *tp; |
| nitem *hp; |
| int delta; |
| for (n = agfstnode (g); n; n = agnxtnode (g, n)) |
| { |
| for (e = agfstout (g, n); e; e = agnxtout (g, e)) |
| { |
| delta = dist (&tp->bb, &hp->bb); |
| ce = agedge (cg, t, h, ((void *) 0), 1); |
| if ((((Agedgeinfo_t *) (((Agobj_t *) (ce))->data))->minlen) < delta) |
| { |
| if ((((Agedgeinfo_t *) (((Agobj_t *) (ce))->data))->minlen) == |
| 0.0) |
| { |
| } |
| } |
| } |
| } |
| } |
| |
| static graph_t * |
| mkNConstraintG (graph_t * g, Dt_t * list, intersectfn intersect, distfn dist) |
| { |
| nitem *p; |
| nitem *nxp; |
| edge_t *e; |
| graph_t *cg = agopen ("cg", Agstrictdirected, ((Agdisc_t *) 0)); |
| for (p = (nitem *) dtflatten (list); p; |
| p = (nitem *) (((Dtlink_t *) ((Dtlink_t *) p))->right)) |
| { |
| for (nxp = (nitem *) (((Dtlink_t *) ((Dtlink_t *) p))->right); nxp; |
| nxp = (nitem *) (((Dtlink_t *) ((Dtlink_t *) nxp))->right)) |
| { |
| if (intersect (p, nxp)) |
| { |
| e = agedge (cg, p->cnode, nxp->cnode, ((void *) 0), 1); |
| } |
| }} for (p = (nitem *) dtflatten (list); p; |
| p = (nitem *) (((Dtlink_t *) ((Dtlink_t *) p))->right)) |
| { |
| } |
| } |
| |
| static graph_t * |
| mkConstraintG (graph_t * g, Dt_t * list, intersectfn intersect, distfn dist) |
| { |
| graph_t *vg; |
| graph_t *cg = agopen ("cg", Agstrictdirected, ((Agdisc_t *) 0)); |
| mapGraphs (vg, cg, dist); |
| } |
| |
| static void |
| constrainX (graph_t * g, nitem * nlist, int nnodes, intersectfn ifn, |
| int ortho) |
| { |
| Dt_t *list = dtopen (&constr, Dtobag); |
| nitem *p = nlist; |
| graph_t *cg; |
| int i; |
| for (i = 0; i < nnodes; i++) |
| { |
| (*(((Dt_t *) (list))->searchf)) ((list), (void *) (p), 0000001); |
| p++; |
| } if (ortho) |
| cg = mkConstraintG (g, list, ifn, distX); |
| else |
| cg = mkNConstraintG (g, list, ifn, distX); |
| } |
| |
| int |
| cAdjust (graph_t * g, int mode) |
| { |
| int ret, i, nnodes = agnnodes (g); |
| nitem *nlist = (nitem *) gmalloc ((nnodes) * sizeof (nitem)); |
| node_t *n; |
| for (n = agfstnode (g); n; n = agnxtnode (g, n)) |
| { |
| } |
| if (overlaps (nlist, nnodes)) |
| { |
| switch ((adjust_mode) mode) |
| { |
| case AM_ORTHOXY: |
| constrainX (g, nlist, nnodes, intersectY, 1); |
| case AM_ORTHO: |
| constrainX (g, nlist, nnodes, intersectY0, 1); |
| constrainX (g, nlist, nnodes, intersectY, 1); |
| case AM_PORTHO: |
| default: |
| constrainX (g, nlist, nnodes, intersectY0, 0); |
| } |
| } |
| } |