--- /dev/null
+/* $Id$ $Revision$ */
+/* vim:set shiftwidth=4 ts=8: */
+
+/*************************************************************************
+ * Copyright (c) 2011 AT&T Intellectual Property
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors: See CVS logs. Details at http://www.graphviz.org/
+ *************************************************************************/
+
+#ifndef GV_TYPES_H
+#define GV_TYPES_H
+
+/* Define if you want CGRAPH */
+#define WITH_CGRAPH 1
+
+#include <stdio.h>
+#include <assert.h>
+#include <signal.h>
+
+typedef unsigned char boolean;
+#ifndef NOT
+#define NOT(v) (!(v))
+#endif
+#ifndef FALSE
+#define FALSE 0
+#endif
+#ifndef TRUE
+#define TRUE NOT(FALSE)
+#endif
+
+#include "geom.h"
+#include "gvcext.h"
+#include "pathgeom.h"
+#include "textspan.h"
+#include "cgraph.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ typedef int (*qsort_cmpf) (const void *, const void *);
+ typedef int (*bsearch_cmpf) (const void *, const void *);
+ typedef struct Agraph_s graph_t;
+ typedef struct Agnode_s node_t;
+ typedef struct Agedge_s edge_t;
+ typedef struct Agsym_s attrsym_t;
+#define TAIL_ID "tailport"
+#define HEAD_ID "headport"
+
+ typedef struct htmllabel_t htmllabel_t;
+
+ typedef union inside_t {
+ struct {
+ pointf* p;
+ double* r;
+ } a;
+ struct {
+ node_t* n;
+ boxf* bp;
+ } s;
+ } inside_t;
+
+ typedef struct port { /* internal edge endpoint specification */
+ pointf p; /* aiming point relative to node center */
+ double theta; /* slope in radians */
+ boxf *bp; /* if not null, points to bbox of
+ * rectangular area that is port target
+ */
+ boolean defined; /* if true, edge has port info at this end */
+ boolean constrained; /* if true, constraints such as theta are set */
+ boolean clip; /* if true, clip end to node/port shape */
+ boolean dyna; /* if true, assign compass point dynamically */
+ unsigned char order; /* for mincross */
+ unsigned char side; /* if port is on perimeter of node, this
+ * contains the bitwise OR of the sides (TOP,
+ * BOTTOM, etc.) it is on.
+ */
+ char *name; /* port name, if it was explicitly given, otherwise NULL */
+ } port;
+
+ typedef struct {
+ boolean(*swapEnds) (edge_t * e); /* Should head and tail be swapped? */
+ boolean(*splineMerge) (node_t * n); /* Is n a node in the middle of an edge? */
+ boolean ignoreSwap; /* Test for swapped edges if false */
+ boolean isOrtho; /* Orthogonal routing used */
+ } splineInfo;
+
+ typedef struct pathend_t {
+ boxf nb; /* the node box */
+ pointf np; /* node port */
+ int sidemask;
+ int boxn;
+ boxf boxes[20];
+ } pathend_t;
+
+ typedef struct path { /* internal specification for an edge spline */
+ port start, end;
+ int nbox; /* number of subdivisions */
+ boxf *boxes; /* rectangular regions of subdivision */
+ void *data;
+ } path;
+
+ typedef struct bezier {
+ pointf *list;
+ int size;
+ int sflag, eflag;
+ pointf sp, ep;
+ } bezier;
+
+ typedef struct splines {
+ bezier *list;
+ int size;
+ boxf bb;
+ } splines;
+
+ typedef struct textlabel_t {
+ char *text, *fontname, *fontcolor;
+ int charset;
+ double fontsize;
+ pointf dimen; /* the diagonal size of the label (estimated by layout) */
+ pointf space; /* the diagonal size of the space for the label */
+ /* the rendered label is aligned in this box */
+ /* space does not include pad or margin */
+ pointf pos; /* the center of the space for the label */
+ union {
+ struct {
+ textspan_t *span;
+ short nspans;
+ } txt;
+ htmllabel_t *html;
+ } u;
+ char valign; /* 't' 'c' 'b' */
+ boolean set; /* true if position is set */
+ boolean html; /* true if html label */
+ } textlabel_t;
+
+ typedef struct polygon_t { /* mutable shape information for a node */
+ int regular; /* true for symmetric shapes */
+ int peripheries; /* number of periphery lines */
+ int sides; /* number of sides */
+ double orientation; /* orientation of shape (+ve degrees) */
+ double distortion; /* distortion factor - as in trapezium */
+ double skew; /* skew factor - as in parallelogram */
+ int option; /* ROUNDED, DIAGONAL corners, etc. */
+ pointf *vertices; /* array of vertex points */
+ } polygon_t;
+
+ typedef struct stroke_t { /* information about a single stroke */
+ /* we would have called it a path if that term wasn't already used */
+ int nvertices; /* number of points in the stroke */
+ int flags; /* stroke style flags */
+ pointf *vertices; /* array of vertex points */
+ } stroke_t;
+
+/* flag definitions for stroke_t */
+#define STROKE_CLOSED (1 << 0)
+#define STROKE_FILLED (1 << 1)
+#define STROKE_PENDOWN (1 << 2)
+#define STROKE_VERTICES_ALLOCATED (1 << 3)
+
+ typedef struct shape_t { /* mutable shape information for a node */
+ int nstrokes; /* number of strokes in array */
+ stroke_t *strokes; /* array of strokes */
+ /* The last stroke must always be closed, but can be pen_up.
+ * It is used as the clipping path */
+ } shape_t;
+
+ typedef struct shape_functions { /* read-only shape functions */
+ void (*initfn) (node_t *); /* initializes shape from node u.shape_info structure */
+ void (*freefn) (node_t *); /* frees shape from node u.shape_info structure */
+ port(*portfn) (node_t *, char *, char *); /* finds aiming point and slope of port */
+ boolean(*insidefn) (inside_t * inside_context, pointf); /* clips incident gvc->e spline on shape of gvc->n */
+ int (*pboxfn)(node_t* n, port* p, int side, boxf rv[], int *kptr); /* finds box path to reach port */
+ void (*codefn) (GVJ_t * job, node_t * n); /* emits graphics code for node */
+ } shape_functions;
+
+ typedef enum { SH_UNSET, SH_POLY, SH_RECORD, SH_POINT, SH_EPSF} shape_kind;
+
+ typedef struct shape_desc { /* read-only shape descriptor */
+ char *name; /* as read from graph file */
+ shape_functions *fns;
+ polygon_t *polygon; /* base polygon info */
+ boolean usershape;
+ } shape_desc;
+
+#include "usershape.h" /* usershapes needed by gvc */
+
+ typedef struct nodequeue {
+ node_t **store, **limit, **head, **tail;
+ } nodequeue;
+
+ typedef struct adjmatrix_t {
+ int nrows, ncols;
+ char *data;
+ } adjmatrix_t;
+
+ typedef struct rank_t {
+ int n; /* number of nodes in this rank */
+ node_t **v; /* ordered list of nodes in rank */
+ int an; /* globally allocated number of nodes */
+ node_t **av; /* allocated list of nodes in rank */
+ double ht1, ht2; /* height below/above centerline */
+ double pht1, pht2; /* as above, but only primitive nodes */
+ boolean candidate; /* for transpose () */
+ boolean valid;
+ int cache_nc; /* caches number of crossings */
+ adjmatrix_t *flat;
+ } rank_t;
+
+ typedef enum { R_NONE =
+ 0, R_VALUE, R_FILL, R_COMPRESS, R_AUTO, R_EXPAND } ratio_t;
+
+ typedef struct layout_t {
+ double quantum;
+ double scale;
+ double ratio; /* set only if ratio_kind == R_VALUE */
+ double dpi;
+ pointf margin;
+ pointf page;
+ pointf size;
+ boolean filled;
+ boolean landscape;
+ boolean centered;
+ ratio_t ratio_kind;
+ void* xdots;
+ char* id;
+ } layout_t;
+
+/* for "record" shapes */
+ typedef struct field_t {
+ pointf size; /* its dimension */
+ boxf b; /* its placement in node's coordinates */
+ int n_flds;
+ textlabel_t *lp; /* n_flds == 0 */
+ struct field_t **fld; /* n_flds > 0 */
+ char *id; /* user's identifier */
+ unsigned char LR; /* if box list is horizontal (left to right) */
+ unsigned char sides; /* sides of node exposed to field */
+ } field_t;
+
+ typedef struct nlist_t {
+ node_t **list;
+ int size;
+ } nlist_t;
+
+ typedef struct elist {
+ edge_t **list;
+ int size;
+ } elist;
+
+#define GUI_STATE_ACTIVE (1<<0)
+#define GUI_STATE_SELECTED (1<<1)
+#define GUI_STATE_VISITED (1<<2)
+#define GUI_STATE_DELETED (1<<3)
+
+#define elist_fastapp(item,L) do {L.list[L.size++] = item; L.list[L.size] = NULL;} while(0)
+#define elist_append(item,L) do {L.list = ALLOC(L.size + 2,L.list,edge_t*); L.list[L.size++] = item; L.list[L.size] = NULL;} while(0)
+#define alloc_elist(n,L) do {L.size = 0; L.list = N_NEW(n + 1,edge_t*); } while (0)
+#define free_list(L) do {if (L.list) free(L.list);} while (0)
+
+typedef enum {NATIVEFONTS,PSFONTS,SVGFONTS} fontname_kind;
+
+ typedef struct Agraphinfo_t {
+ Agrec_t hdr;
+ /* to generate code */
+ layout_t *drawing;
+ textlabel_t *label; /* if the cluster has a title */
+ boxf bb; /* bounding box */
+ pointf border[4]; /* sizes of margins for graph labels */
+ unsigned char gui_state; /* Graph state for GUI ops */
+ unsigned char has_labels;
+ boolean has_images;
+ unsigned char charset; /* input character set */
+ int rankdir;
+ double ht1, ht2; /* below and above extremal ranks */
+ unsigned short flags;
+ void *alg;
+ GVC_t *gvc; /* context for "globals" over multiple graphs */
+ void (*cleanup) (graph_t * g); /* function to deallocate layout-specific data */
+
+#ifndef DOT_ONLY
+ /* to place nodes */
+ node_t **neato_nlist;
+ int move;
+ double **dist, **spring, **sum_t, ***t;
+ unsigned short ndim;
+ unsigned short odim;
+#endif
+#ifndef NEATO_ONLY
+ /* to have subgraphs */
+ int n_cluster;
+ graph_t **clust; /* clusters are in clust[1..n_cluster] !!! */
+ graph_t *dotroot;
+ node_t *nlist;
+ rank_t *rank;
+ graph_t *parent; /* containing cluster (not parent subgraph) */
+ int level; /* cluster nesting level (not node level!) */
+ node_t *minrep, *maxrep; /* set leaders for min and max rank */
+
+ /* fast graph node list */
+ nlist_t comp;
+ /* connected components */
+ node_t *minset, *maxset; /* set leaders */
+ long n_nodes;
+ /* includes virtual */
+ short minrank, maxrank;
+
+ /* various flags */
+ boolean has_flat_edges;
+ boolean has_sourcerank;
+ boolean has_sinkrank;
+ unsigned char showboxes;
+ fontname_kind fontnames; /* to override mangling in SVG */
+
+ int nodesep, ranksep;
+ node_t *ln, *rn; /* left, right nodes of bounding box */
+
+ /* for clusters */
+ node_t *leader, **rankleader;
+ boolean expanded;
+ char installed;
+ char set_type;
+ char label_pos;
+ boolean exact_ranksep;
+#endif
+
+ } Agraphinfo_t;
+
+#define GD_parent(g) (((Agraphinfo_t*)AGDATA(g))->parent)
+#define GD_level(g) (((Agraphinfo_t*)AGDATA(g))->level)
+#define GD_drawing(g) (((Agraphinfo_t*)AGDATA(g))->drawing)
+#define GD_bb(g) (((Agraphinfo_t*)AGDATA(g))->bb)
+#define GD_gvc(g) (((Agraphinfo_t*)AGDATA(g))->gvc)
+#define GD_cleanup(g) (((Agraphinfo_t*)AGDATA(g))->cleanup)
+#define GD_dist(g) (((Agraphinfo_t*)AGDATA(g))->dist)
+#define GD_alg(g) (((Agraphinfo_t*)AGDATA(g))->alg)
+#define GD_border(g) (((Agraphinfo_t*)AGDATA(g))->border)
+#define GD_cl_cnt(g) (((Agraphinfo_t*)AGDATA(g))->cl_nt)
+#define GD_clust(g) (((Agraphinfo_t*)AGDATA(g))->clust)
+#define GD_dotroot(g) (((Agraphinfo_t*)AGDATA(g))->dotroot)
+#define GD_comp(g) (((Agraphinfo_t*)AGDATA(g))->comp)
+#define GD_exact_ranksep(g) (((Agraphinfo_t*)AGDATA(g))->exact_ranksep)
+#define GD_expanded(g) (((Agraphinfo_t*)AGDATA(g))->expanded)
+#define GD_flags(g) (((Agraphinfo_t*)AGDATA(g))->flags)
+#define GD_gui_state(g) (((Agraphinfo_t*)AGDATA(g))->gui_state)
+#define GD_charset(g) (((Agraphinfo_t*)AGDATA(g))->charset)
+#define GD_has_labels(g) (((Agraphinfo_t*)AGDATA(g))->has_labels)
+#define GD_has_images(g) (((Agraphinfo_t*)AGDATA(g))->has_images)
+#define GD_has_flat_edges(g) (((Agraphinfo_t*)AGDATA(g))->has_flat_edges)
+#define GD_has_sourcerank(g) (((Agraphinfo_t*)AGDATA(g))->has_sourcerank)
+#define GD_has_sinkrank(g) (((Agraphinfo_t*)AGDATA(g))->has_sinkrank)
+#define GD_ht1(g) (((Agraphinfo_t*)AGDATA(g))->ht1)
+#define GD_ht2(g) (((Agraphinfo_t*)AGDATA(g))->ht2)
+#define GD_inleaf(g) (((Agraphinfo_t*)AGDATA(g))->inleaf)
+#define GD_installed(g) (((Agraphinfo_t*)AGDATA(g))->installed)
+#define GD_label(g) (((Agraphinfo_t*)AGDATA(g))->label)
+#define GD_leader(g) (((Agraphinfo_t*)AGDATA(g))->leader)
+#define GD_rankdir2(g) (((Agraphinfo_t*)AGDATA(g))->rankdir)
+#define GD_rankdir(g) (((Agraphinfo_t*)AGDATA(g))->rankdir & 0x3)
+#define GD_flip(g) (GD_rankdir(g) & 1)
+#define GD_realrankdir(g) ((((Agraphinfo_t*)AGDATA(g))->rankdir) >> 2)
+#define GD_realflip(g) (GD_realrankdir(g) & 1)
+#define GD_ln(g) (((Agraphinfo_t*)AGDATA(g))->ln)
+#define GD_maxrank(g) (((Agraphinfo_t*)AGDATA(g))->maxrank)
+#define GD_maxset(g) (((Agraphinfo_t*)AGDATA(g))->maxset)
+#define GD_minrank(g) (((Agraphinfo_t*)AGDATA(g))->minrank)
+#define GD_minset(g) (((Agraphinfo_t*)AGDATA(g))->minset)
+#define GD_minrep(g) (((Agraphinfo_t*)AGDATA(g))->minrep)
+#define GD_maxrep(g) (((Agraphinfo_t*)AGDATA(g))->maxrep)
+#define GD_move(g) (((Agraphinfo_t*)AGDATA(g))->move)
+#define GD_n_cluster(g) (((Agraphinfo_t*)AGDATA(g))->n_cluster)
+#define GD_n_nodes(g) (((Agraphinfo_t*)AGDATA(g))->n_nodes)
+#define GD_ndim(g) (((Agraphinfo_t*)AGDATA(g))->ndim)
+#define GD_odim(g) (((Agraphinfo_t*)AGDATA(g))->odim)
+#define GD_neato_nlist(g) (((Agraphinfo_t*)AGDATA(g))->neato_nlist)
+#define GD_nlist(g) (((Agraphinfo_t*)AGDATA(g))->nlist)
+#define GD_nodesep(g) (((Agraphinfo_t*)AGDATA(g))->nodesep)
+#define GD_outleaf(g) (((Agraphinfo_t*)AGDATA(g))->outleaf)
+#define GD_rank(g) (((Agraphinfo_t*)AGDATA(g))->rank)
+#define GD_rankleader(g) (((Agraphinfo_t*)AGDATA(g))->rankleader)
+#define GD_ranksep(g) (((Agraphinfo_t*)AGDATA(g))->ranksep)
+#define GD_rn(g) (((Agraphinfo_t*)AGDATA(g))->rn)
+#define GD_set_type(g) (((Agraphinfo_t*)AGDATA(g))->set_type)
+#define GD_label_pos(g) (((Agraphinfo_t*)AGDATA(g))->label_pos)
+#define GD_showboxes(g) (((Agraphinfo_t*)AGDATA(g))->showboxes)
+#define GD_fontnames(g) (((Agraphinfo_t*)AGDATA(g))->fontnames)
+#define GD_spring(g) (((Agraphinfo_t*)AGDATA(g))->spring)
+#define GD_sum_t(g) (((Agraphinfo_t*)AGDATA(g))->sum_t)
+#define GD_t(g) (((Agraphinfo_t*)AGDATA(g))->t)
+
+ typedef struct Agnodeinfo_t {
+ Agrec_t hdr;
+ shape_desc *shape;
+ void *shape_info;
+ pointf coord;
+ double width, height; /* inches */
+ boxf bb;
+ double ht, lw, rw;
+ textlabel_t *label;
+ textlabel_t *xlabel;
+ void *alg;
+ char state;
+ unsigned char gui_state; /* Node state for GUI ops */
+ boolean clustnode;
+
+#ifndef DOT_ONLY
+ unsigned char pinned;
+ int id, heapindex, hops;
+ double *pos, dist;
+#endif
+#ifndef NEATO_ONLY
+ unsigned char showboxes;
+ boolean has_port;
+ node_t* rep;
+ node_t *set;
+
+ /* fast graph */
+ char node_type, mark, onstack;
+ char ranktype, weight_class;
+ node_t *next, *prev;
+ elist in, out, flat_out, flat_in, other;
+ graph_t *clust;
+
+ /* for union-find and collapsing nodes */
+ int UF_size;
+ node_t *UF_parent;
+ node_t *inleaf, *outleaf;
+
+ /* for placing nodes */
+ int rank, order; /* initially, order = 1 for ordered edges */
+ double mval;
+ elist save_in, save_out;
+
+ /* for network-simplex */
+ elist tree_in, tree_out;
+ edge_t *par;
+ int low, lim;
+ int priority;
+
+ double pad[1];
+#endif
+
+ } Agnodeinfo_t;
+
+#define ND_id(n) (((Agnodeinfo_t*)AGDATA(n))->id)
+#define ND_alg(n) (((Agnodeinfo_t*)AGDATA(n))->alg)
+#define ND_UF_parent(n) (((Agnodeinfo_t*)AGDATA(n))->UF_parent)
+#define ND_set(n) (((Agnodeinfo_t*)AGDATA(n))->set)
+#define ND_UF_size(n) (((Agnodeinfo_t*)AGDATA(n))->UF_size)
+#define ND_bb(n) (((Agnodeinfo_t*)AGDATA(n))->bb)
+#define ND_clust(n) (((Agnodeinfo_t*)AGDATA(n))->clust)
+#define ND_coord(n) (((Agnodeinfo_t*)AGDATA(n))->coord)
+#define ND_dist(n) (((Agnodeinfo_t*)AGDATA(n))->dist)
+#define ND_flat_in(n) (((Agnodeinfo_t*)AGDATA(n))->flat_in)
+#define ND_flat_out(n) (((Agnodeinfo_t*)AGDATA(n))->flat_out)
+#define ND_gui_state(n) (((Agnodeinfo_t*)AGDATA(n))->gui_state)
+#define ND_has_port(n) (((Agnodeinfo_t*)AGDATA(n))->has_port)
+#define ND_rep(n) (((Agnodeinfo_t*)AGDATA(n))->rep)
+#define ND_heapindex(n) (((Agnodeinfo_t*)AGDATA(n))->heapindex)
+#define ND_height(n) (((Agnodeinfo_t*)AGDATA(n))->height)
+#define ND_hops(n) (((Agnodeinfo_t*)AGDATA(n))->hops)
+#define ND_ht(n) (((Agnodeinfo_t*)AGDATA(n))->ht)
+#define ND_in(n) (((Agnodeinfo_t*)AGDATA(n))->in)
+#define ND_inleaf(n) (((Agnodeinfo_t*)AGDATA(n))->inleaf)
+#define ND_label(n) (((Agnodeinfo_t*)AGDATA(n))->label)
+#define ND_xlabel(n) (((Agnodeinfo_t*)AGDATA(n))->xlabel)
+#define ND_lim(n) (((Agnodeinfo_t*)AGDATA(n))->lim)
+#define ND_low(n) (((Agnodeinfo_t*)AGDATA(n))->low)
+#define ND_lw(n) (((Agnodeinfo_t*)AGDATA(n))->lw)
+#define ND_mark(n) (((Agnodeinfo_t*)AGDATA(n))->mark)
+#define ND_mval(n) (((Agnodeinfo_t*)AGDATA(n))->mval)
+#define ND_n_cluster(n) (((Agnodeinfo_t*)AGDATA(n))->n_cluster)
+#define ND_next(n) (((Agnodeinfo_t*)AGDATA(n))->next)
+#define ND_node_type(n) (((Agnodeinfo_t*)AGDATA(n))->node_type)
+#define ND_onstack(n) (((Agnodeinfo_t*)AGDATA(n))->onstack)
+#define ND_order(n) (((Agnodeinfo_t*)AGDATA(n))->order)
+#define ND_other(n) (((Agnodeinfo_t*)AGDATA(n))->other)
+#define ND_out(n) (((Agnodeinfo_t*)AGDATA(n))->out)
+#define ND_outleaf(n) (((Agnodeinfo_t*)AGDATA(n))->outleaf)
+#define ND_par(n) (((Agnodeinfo_t*)AGDATA(n))->par)
+#define ND_pinned(n) (((Agnodeinfo_t*)AGDATA(n))->pinned)
+#define ND_pos(n) (((Agnodeinfo_t*)AGDATA(n))->pos)
+#define ND_prev(n) (((Agnodeinfo_t*)AGDATA(n))->prev)
+#define ND_priority(n) (((Agnodeinfo_t*)AGDATA(n))->priority)
+#define ND_rank(n) (((Agnodeinfo_t*)AGDATA(n))->rank)
+#define ND_ranktype(n) (((Agnodeinfo_t*)AGDATA(n))->ranktype)
+#define ND_rw(n) (((Agnodeinfo_t*)AGDATA(n))->rw)
+#define ND_save_in(n) (((Agnodeinfo_t*)AGDATA(n))->save_in)
+#define ND_save_out(n) (((Agnodeinfo_t*)AGDATA(n))->save_out)
+#define ND_shape(n) (((Agnodeinfo_t*)AGDATA(n))->shape)
+#define ND_shape_info(n) (((Agnodeinfo_t*)AGDATA(n))->shape_info)
+#define ND_showboxes(n) (((Agnodeinfo_t*)AGDATA(n))->showboxes)
+#define ND_state(n) (((Agnodeinfo_t*)AGDATA(n))->state)
+#define ND_clustnode(n) (((Agnodeinfo_t*)AGDATA(n))->clustnode)
+#define ND_tree_in(n) (((Agnodeinfo_t*)AGDATA(n))->tree_in)
+#define ND_tree_out(n) (((Agnodeinfo_t*)AGDATA(n))->tree_out)
+#define ND_weight_class(n) (((Agnodeinfo_t*)AGDATA(n))->weight_class)
+#define ND_width(n) (((Agnodeinfo_t*)AGDATA(n))->width)
+#define ND_xsize(n) (ND_lw(n)+ND_rw(n))
+#define ND_ysize(n) (ND_ht(n))
+
+ typedef struct Agedgeinfo_t {
+ Agrec_t hdr;
+ splines *spl;
+ port tail_port, head_port;
+ textlabel_t *label, *head_label, *tail_label, *xlabel;
+ char edge_type;
+ char adjacent; /* true for flat edge with adjacent nodes */
+ char label_ontop;
+ unsigned char gui_state; /* Edge state for GUI ops */
+ edge_t *to_orig; /* for dot's shapes.c */
+ void *alg;
+
+#ifndef DOT_ONLY
+ double factor;
+ double dist;
+ Ppolyline_t path;
+#endif
+#ifndef NEATO_ONLY
+ unsigned char showboxes;
+ boolean conc_opp_flag;
+ short xpenalty;
+ int weight;
+ int cutvalue, tree_index;
+ short count;
+ unsigned short minlen;
+ edge_t *to_virt;
+#endif
+ } Agedgeinfo_t;
+
+#define ED_alg(e) (((Agedgeinfo_t*)AGDATA(e))->alg)
+#define ED_conc_opp_flag(e) (((Agedgeinfo_t*)AGDATA(e))->conc_opp_flag)
+#define ED_count(e) (((Agedgeinfo_t*)AGDATA(e))->count)
+#define ED_cutvalue(e) (((Agedgeinfo_t*)AGDATA(e))->cutvalue)
+#define ED_edge_type(e) (((Agedgeinfo_t*)AGDATA(e))->edge_type)
+#define ED_adjacent(e) (((Agedgeinfo_t*)AGDATA(e))->adjacent)
+#define ED_factor(e) (((Agedgeinfo_t*)AGDATA(e))->factor)
+#define ED_gui_state(e) (((Agedgeinfo_t*)AGDATA(e))->gui_state)
+#define ED_head_label(e) (((Agedgeinfo_t*)AGDATA(e))->head_label)
+#define ED_head_port(e) (((Agedgeinfo_t*)AGDATA(e))->head_port)
+#define ED_label(e) (((Agedgeinfo_t*)AGDATA(e))->label)
+#define ED_xlabel(e) (((Agedgeinfo_t*)AGDATA(e))->xlabel)
+#define ED_label_ontop(e) (((Agedgeinfo_t*)AGDATA(e))->label_ontop)
+#define ED_minlen(e) (((Agedgeinfo_t*)AGDATA(e))->minlen)
+#define ED_path(e) (((Agedgeinfo_t*)AGDATA(e))->path)
+#define ED_showboxes(e) (((Agedgeinfo_t*)AGDATA(e))->showboxes)
+#define ED_spl(e) (((Agedgeinfo_t*)AGDATA(e))->spl)
+#define ED_tail_label(e) (((Agedgeinfo_t*)AGDATA(e))->tail_label)
+#define ED_tail_port(e) (((Agedgeinfo_t*)AGDATA(e))->tail_port)
+#define ED_to_orig(e) (((Agedgeinfo_t*)AGDATA(e))->to_orig)
+#define ED_to_virt(e) (((Agedgeinfo_t*)AGDATA(e))->to_virt)
+#define ED_tree_index(e) (((Agedgeinfo_t*)AGDATA(e))->tree_index)
+#define ED_xpenalty(e) (((Agedgeinfo_t*)AGDATA(e))->xpenalty)
+#define ED_dist(e) (((Agedgeinfo_t*)AGDATA(e))->dist)
+#define ED_weight(e) (((Agedgeinfo_t*)AGDATA(e))->weight)
+
+#define ag_xget(x,a) agxget(x,a)
+#define SET_RANKDIR(g,rd) (GD_rankdir2(g) = rd)
+#define agfindedge(g,t,h) (agedge(g,t,h,NULL,0))
+#define agfindnode(g,n) (agnode(g,n,0))
+#define agfindgraphattr(g,a) (agattr(g,AGRAPH,a,NULL))
+#define agfindnodeattr(g,a) (agattr(g,AGNODE,a,NULL))
+#define agfindedgeattr(g,a) (agattr(g,AGEDGE,a,NULL))
+
+ typedef struct {
+ int flags;
+ } gvlayout_features_t;
+
+#ifdef __cplusplus
+}
+#endif
+#endif