103 }
while (rv && rv->
node == n);
109 }
while (rv && rv->
node == n);
123 template.base.tag = key;
206 assert((seq &
SEQ_MASK) == seq &&
"sequence ID overflow");
362 if (t !=
NULL || cflag) {
366 if (cflag && rv ==
NULL) {
396 assert(arg_e0 && arg_e1);
static void out(agerrlevel_t level, const char *fmt, va_list args)
Report messages using a user-supplied or default write function.
Memory allocation wrappers that exit on failure.
static void * gv_alloc(size_t size)
int agapply(Agraph_t *g, Agobj_t *obj, agobjfn_t fn, void *arg, int preorder)
CDT_API Dtlink_t * dtextract(Dt_t *)
CDT_API int dtrestore(Dt_t *, Dtlink_t *)
void agfreeid(Agraph_t *g, int objtype, IDTYPE id)
void agrecclose(Agobj_t *obj)
int agmapnametoid(Agraph_t *g, int objtype, char *str, IDTYPE *result, bool createflag)
int agallocid(Agraph_t *g, int objtype, IDTYPE request)
uint64_t agnextseq(Agraph_t *g, int objtype)
void agregister(Agraph_t *g, int objtype, void *obj)
Agsubnode_t * node_set_find(node_set_t *self, IDTYPE key)
static bool ok_to_make_edge(Agraph_t *g, Agnode_t *t, Agnode_t *h)
static int agedgeseqcmpf(void *arg_e0, void *arg_e1)
static Agedge_t * agfindedge_by_id(Agraph_t *g, Agnode_t *t, Agnode_t *h, IDTYPE id)
static Agedge_t * newedge(Agraph_t *g, Agnode_t *t, Agnode_t *h, IDTYPE id)
void agdeledgeimage(Agraph_t *g, Agedge_t *e, void *ignored)
Agedge_t * agmkout(Agedge_t *e)
Agedge_t * agmkin(Agedge_t *e)
static void subedge(Agraph_t *g, Agedge_t *e)
Dtdisc_t Ag_subedge_seq_disc
static Agedge_t * agfindedge_by_key(Agraph_t *g, Agnode_t *t, Agnode_t *h, Agtag_t key)
static int agedgeidcmpf(void *arg_e0, void *arg_e1)
static void ins(Dict_t *d, Dtlink_t **set, Agedge_t *e)
Dtdisc_t Ag_mainedge_seq_disc
static void del(Dict_t *d, Dtlink_t **set, Agedge_t *e)
Dtdisc_t Ag_subedge_id_disc
Dtdisc_t Ag_mainedge_id_disc
static void installedge(Agraph_t *g, Agedge_t *e)
void agedgeattr_init(Agraph_t *g, Agedge_t *e)
void agedgeattr_delete(Agedge_t *e)
void agmethod_delete(Agraph_t *g, void *obj)
void agmethod_init(Agraph_t *g, void *obj)
Agedge_t * agedge(Agraph_t *g, Agnode_t *t, Agnode_t *h, char *name, int cflag)
Agedge_t * agidedge(Agraph_t *g, Agnode_t *t, Agnode_t *h, IDTYPE id, int cflag)
#define agopp(e)
opposite edge: flip Agedgepair_s.out ⇄ Agedgepair_s.in/*#end#*/
Agedge_t * agsubedge(Agraph_t *g, Agedge_t *e, int cflag)
#define AGIN2OUT(inedge)
Agedgepair_s.in -> Agedgepair_s.out.
int agdeledge(Agraph_t *g, Agedge_t *e)
Agedge_t * agnxtin(Agraph_t *g, Agedge_t *e)
Agedge_t * agfstout(Agraph_t *g, Agnode_t *n)
#define ageqedge(e, f)
edges are equal
Agedge_t * agnxtedge(Agraph_t *g, Agedge_t *e, Agnode_t *n)
Agedge_t * agnxtout(Agraph_t *g, Agedge_t *e)
Agedge_t * agfstedge(Agraph_t *g, Agnode_t *n)
Agedge_t * agfstin(Agraph_t *g, Agnode_t *n)
#define AGOUT2IN(outedge)
Agedgepair_s.out -> Agedgepair_s.in/*#end#*/.
void(* agobjfn_t)(Agraph_t *g, Agobj_t *obj, void *arg)
int agisstrict(Agraph_t *g)
int agisundirected(Agraph_t *g)
Agnode_t * agsubnode(Agraph_t *g, Agnode_t *n, int createflag)
Agsubnode_t * agsubrep(Agraph_t *g, Agnode_t *n)
#define AGID(obj)
returns the unique integer ID associated with the object
uint64_t IDTYPE
unique per main graph ID
#define AGTYPE(obj)
returns AGRAPH, AGNODE, or AGEDGE depending on the type of the object
Agraph_t * agroot(void *obj)
void * agbindrec(void *obj, const char *name, unsigned int recsize, int move_to_front)
attaches a new record of the given size to the object
Agraph_t * agparent(Agraph_t *g)
unordered set of Agsubnode_t *
string attribute container
a generic header of Agraph_s, Agnode_s and Agedge_s
Agtag_t tag
access with AGTAG
struct graphviz_node_set * n_id
the node set indexed by ID
Dict_t * e_id
holders for edge sets
tag in Agobj_s for graphs, nodes, and edges.
unsigned objtype
access with AGTYPE