Mercurial > hg > camir-aes2014
diff toolboxes/graph_visualisation/include/graphviz/cgraph.h @ 0:e9a9cd732c1e tip
first hg version after svn
author | wolffd |
---|---|
date | Tue, 10 Feb 2015 15:05:51 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/toolboxes/graph_visualisation/include/graphviz/cgraph.h Tue Feb 10 15:05:51 2015 +0000 @@ -0,0 +1,467 @@ +/* $Id: cgraph.h,v 1.16 2009/07/10 21:10:32 erg Exp $ $Revision: 1.16 $ */ +/* vim:set shiftwidth=4 ts=8: */ + +/********************************************************** +* This software is part of the graphviz package * +* http://www.graphviz.org/ * +* * +* Copyright (c) 1994-2004 AT&T Corp. * +* and is licensed under the * +* Common Public License, Version 1.0 * +* by AT&T Corp. * +* * +* Information and Software Systems Research * +* AT&T Research, Florham Park NJ * +**********************************************************/ + +#ifndef ATT_GRAPH_H +#define ATT_GRAPH_H + +#include "cdt.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef FALSE +#define FALSE (0) +#endif +#ifndef TRUE +#define TRUE (!FALSE) +#endif +#ifndef NOT +#define NOT(x) (!(x)) +#endif +#ifndef NIL +#define NIL(type) ((type)0) +#endif +#define NILgraph NIL(Agraph_t*) +#define NILnode NIL(Agnode_t*) +#define NILedge NIL(Agedge_t*) +#define NILsym NIL(Agsym_t*) + +/* forward struct type declarations */ +typedef struct Agtag_s Agtag_t; +typedef struct Agobj_s Agobj_t; /* generic object header */ +typedef struct Agraph_s Agraph_t; /* graph, subgraph (or hyperedge) */ +typedef struct Agnode_s Agnode_t; /* node (atom) */ +typedef struct Agedge_s Agedge_t; /* node pair */ +typedef struct Agdesc_s Agdesc_t; /* graph descriptor */ +typedef struct Agmemdisc_s Agmemdisc_t; /* memory allocator */ +typedef struct Agiddisc_s Agiddisc_t; /* object ID allocator */ +typedef struct Agiodisc_s Agiodisc_t; /* IO services */ +typedef struct Agdisc_s Agdisc_t; /* union of client discipline methods */ +typedef struct Agdstate_s Agdstate_t; /* client state (closures) */ +typedef struct Agsym_s Agsym_t; /* string attribute descriptors */ +typedef struct Agattr_s Agattr_t; /* string attribute container */ +typedef struct Agcbdisc_s Agcbdisc_t; /* client event callbacks */ +typedef struct Agcbstack_s Agcbstack_t; /* enclosing state for cbdisc */ +typedef struct Agclos_s Agclos_t; /* common fields for graph/subgs */ +typedef struct Agrec_s Agrec_t; /* generic runtime record */ +typedef struct Agdatadict_s Agdatadict_t; /* set of dictionaries per graph */ +typedef struct Agedgepair_s Agedgepair_t; /* the edge object */ +typedef struct Agsubnode_s Agsubnode_t; + +/* Header of a user record. These records are attached by client programs +dynamically at runtime. A unique string ID must be given to each record +attached to the same object. Cgraph has functions to create, search for, +and delete these records. The records are maintained in a circular list, +with obj->data pointing somewhere in the list. The search function has +an option to lock this pointer on a given record. The application must +be written so only one such lock is outstanding at a time. */ + +struct Agrec_s { + char *name; + Agrec_t *next; + /* following this would be any programmer-defined data */ +}; + +/* Object tag for graphs, nodes, and edges. While there may be several structs +for a given node or edges, there is only one unique ID (per main graph). */ +struct Agtag_s { + unsigned objtype:2; /* see literal tags below */ + unsigned mtflock:1; /* move-to-front lock, see above */ + unsigned attrwf:1; /* attrs written (parity, write.c) */ + unsigned seq:(sizeof(unsigned) * 8 - 4); /* sequence no. */ + unsigned long id; /* client ID */ +}; + + /* object tags */ +#define AGRAPH 0 /* can't exceed 2 bits. see Agtag_t. */ +#define AGNODE 1 +#define AGOUTEDGE 2 +#define AGINEDGE 3 /* (1 << 1) indicates an edge tag. */ +#define AGEDGE AGOUTEDGE /* synonym in object kind args */ + + /* a generic graph/node/edge header */ +struct Agobj_s { + Agtag_t tag; + Agrec_t *data; +}; + +#define AGTAG(obj) (((Agobj_t*)(obj))->tag) +#define AGTYPE(obj) (AGTAG(obj).objtype) +#define AGID(obj) (AGTAG(obj).id) +#define AGSEQ(obj) (AGTAG(obj).seq) +#define AGATTRWF(obj) (AGTAG(obj).attrwf) +#define AGDATA(obj) (((Agobj_t*)(obj))->data) + +/* This is the node struct allocated per graph (or subgraph). It resides +in the n_dict of the graph. The node set is maintained by libdict, but +transparently to libgraph callers. Every node may be given an optional +string name at its time of creation, or it is permissible to pass NIL(char*) +for the name. */ + +struct Agsubnode_s { /* the node-per-graph-or-subgraph record */ + Dtlink_t seq_link; /* must be first */ + Dtlink_t id_link; + Agnode_t *node; /* the object */ + Dtlink_t *in_id, *out_id; /* by node/ID for random access */ + Dtlink_t *in_seq, *out_seq; /* by node/sequence for serial access */ +}; + +struct Agnode_s { + Agobj_t base; + Agraph_t *root; + Agsubnode_t mainsub; /* embedded for main graph */ +}; + +struct Agedge_s { + Agobj_t base; + Dtlink_t id_link; /* main graph only */ + Dtlink_t seq_link; + Agnode_t *node; /* the endpoint node */ +}; + +struct Agedgepair_s { + Agedge_t out, in; +}; + +struct Agdesc_s { /* graph descriptor */ + unsigned directed:1; /* if edges are asymmetric */ + unsigned strict:1; /* if multi-edges forbidden */ + unsigned no_loop:1; /* if no loops */ + unsigned maingraph:1; /* if this is the top level graph */ + unsigned flatlock:1; /* if sets are flattened into lists in cdt */ + unsigned no_write:1; /* if a temporary subgraph */ + unsigned has_attrs:1; /* if string attr tables should be initialized */ + unsigned has_cmpnd:1; /* if may contain collapsed nodes */ +}; + +/* disciplines for external resources needed by libgraph */ + +struct Agmemdisc_s { /* memory allocator */ + void *(*open) (void); /* independent of other resources */ + void *(*alloc) (void *state, size_t req); + void *(*resize) (void *state, void *ptr, size_t old, size_t req); + void (*free) (void *state, void *ptr); + void (*close) (void *state); +}; + +struct Agiddisc_s { /* object ID allocator */ + void *(*open) (Agraph_t * g); /* associated with a graph */ + long (*map) (void *state, int objtype, char *str, unsigned long *id, + int createflag); + long (*alloc) (void *state, int objtype, unsigned long id); + void (*free) (void *state, int objtype, unsigned long id); + char *(*print) (void *state, int objtype, unsigned long id); + void (*close) (void *state); +}; + +struct Agiodisc_s { + int (*afread) (void *chan, char *buf, int bufsize); + int (*putstr) (void *chan, const char *str); + int (*flush) (void *chan); /* sync */ + /* error messages? */ +}; + +struct Agdisc_s { /* user's discipline */ + Agmemdisc_t *mem; + Agiddisc_t *id; + Agiodisc_t *io; +}; + + /* default resource disciplines */ +#if !defined(_BLD_cgraph) && defined(GVDLL) +#define extern __declspec(dllimport) +#endif + +/*visual studio*/ +#ifdef WIN32_DLL +#ifndef CGRAPH_EXPORTS +#define extern __declspec(dllimport) +#endif +#endif +/*end visual studio*/ + +extern Agmemdisc_t AgMemDisc; +extern Agiddisc_t AgIdDisc; +extern Agiodisc_t AgIoDisc; + +extern Agdisc_t AgDefaultDisc; +#undef extern + +struct Agdstate_s { + void *mem; + void *id; + /* IO must be initialized and finalized outside Cgraph, + * and channels (FILES) are passed as void* arguments. */ +}; + +typedef void (*agobjfn_t) (Agraph_t * g, Agobj_t * obj, void *arg); +typedef void (*agobjupdfn_t) (Agraph_t * g, Agobj_t * obj, void *arg, + Agsym_t * sym); + +struct Agcbdisc_s { + struct { + agobjfn_t ins; + agobjupdfn_t mod; + agobjfn_t del; + } graph, node, edge; +}; + +struct Agcbstack_s { /* object event callbacks */ + Agcbdisc_t *f; /* methods */ + void *state; /* closure */ + Agcbstack_t *prev; /* kept in a stack, unlike other disciplines */ +}; + +struct Agclos_s { + Agdisc_t disc; /* resource discipline functions */ + Agdstate_t state; /* resource closures */ + Dict_t *strdict; /* shared string dict */ + unsigned long seq[3]; /* local object sequence number counter */ + Agcbstack_t *cb; /* user and system callback function stacks */ + unsigned char callbacks_enabled; /* issue user callbacks or hold them? */ + Dict_t *lookup_by_name[3]; + Dict_t *lookup_by_id[3]; +}; + +struct Agraph_s { + Agobj_t base; + Agdesc_t desc; + Dtlink_t link; + Dict_t *n_seq; /* the node set in sequence */ + Dict_t *n_id; /* the node set indexed by ID */ + Dict_t *e_seq, *e_id; /* holders for edge sets */ + Dict_t *g_dict; /* subgraphs - descendants */ + Agraph_t *parent, *root; /* subgraphs - ancestors */ + Agclos_t *clos; /* shared resources */ +}; + + +#if _PACKAGE_ast +/* fine control of object callbacks */ +# if defined(_BLD_cgraph) && defined(__EXPORT__) +# define extern __EXPORT__ +# endif +# if !defined(_BLD_cgraph) && defined(__IMPORT__) +# define extern __IMPORT__ +# endif +#endif + +extern void agpushdisc(Agraph_t * g, Agcbdisc_t * disc, void *state); +extern int agpopdisc(Agraph_t * g, Agcbdisc_t * disc); +extern int agcallbacks(Agraph_t * g, int flag); /* return prev value */ + +/* graphs */ +extern Agraph_t *agopen(char *name, Agdesc_t desc, Agdisc_t * disc); +extern int agclose(Agraph_t * g); +extern Agraph_t *agread(void *chan, Agdisc_t * disc); +extern void agreadline(int); +extern void agsetfile(char *); +extern Agraph_t *agconcat(Agraph_t * g, void *chan, Agdisc_t * disc); +extern int agwrite(Agraph_t * g, void *chan); +extern int agisdirected(Agraph_t * g); +extern int agisundirected(Agraph_t * g); +extern int agisstrict(Agraph_t * g); +extern int agissimple(Agraph_t * g); + +/* nodes */ +extern Agnode_t *agnode(Agraph_t * g, char *name, int createflag); +extern Agnode_t *agidnode(Agraph_t * g, unsigned long id, int createflag); +extern Agnode_t *agsubnode(Agraph_t * g, Agnode_t * n, int createflag); +extern Agnode_t *agfstnode(Agraph_t * g); +extern Agnode_t *agnxtnode(Agraph_t * g, Agnode_t * n); +extern Agnode_t *aglstnode(Agraph_t * g); +extern Agnode_t *agprvnode(Agraph_t * g, Agnode_t * n); + +extern Agsubnode_t *agsubrep(Agraph_t * g, Agnode_t * n); + +/* edges */ +extern Agedge_t *agedge(Agraph_t * g, Agnode_t * t, Agnode_t * h, + char *name, int createflag); +extern Agedge_t *agidedge(Agraph_t * g, Agnode_t * t, Agnode_t * h, + unsigned long id, int createflag); +extern Agedge_t *agsubedge(Agraph_t * g, Agedge_t * e, int createflag); +extern Agedge_t *agfstin(Agraph_t * g, Agnode_t * n); +extern Agedge_t *agnxtin(Agraph_t * g, Agedge_t * e); +extern Agedge_t *agfstout(Agraph_t * g, Agnode_t * n); +extern Agedge_t *agnxtout(Agraph_t * g, Agedge_t * e); +extern Agedge_t *agfstedge(Agraph_t * g, Agnode_t * n); +extern Agedge_t *agnxtedge(Agraph_t * g, Agedge_t * e, Agnode_t * n); + +/* generic */ +extern Agraph_t *agraphof(void* obj); +extern Agraph_t *agroot(void* obj); +extern int agcontains(Agraph_t *, void *); +extern char *agnameof(void *); +extern int agrelabel(void *obj, char *name); /* scary */ +extern int agrelabel_node(Agnode_t * n, char *newname); +extern int agdelete(Agraph_t * g, void *obj); +extern long agdelsubg(Agraph_t * g, Agraph_t * sub); /* could be agclose */ +extern int agdelnode(Agraph_t * g, Agnode_t * arg_n); +extern int agdeledge(Agraph_t * g, Agedge_t * arg_e); +extern int agobjkind(void *); + +/* strings */ +extern char *agstrdup(Agraph_t *, char *); +extern char *agstrdup_html(Agraph_t *, char *); +extern int aghtmlstr(char *); +extern char *agstrbind(Agraph_t * g, char *); +extern int agstrfree(Agraph_t *, char *); +extern char *agstrcanon(char *, char *); +char *agcanonStr(char *str); /* manages its own buf */ + +/* definitions for dynamic string attributes */ +struct Agattr_s { /* dynamic string attributes */ + Agrec_t h; /* common data header */ + Dict_t *dict; /* shared dict to interpret attr field */ + char **str; /* the attribute string values */ +}; + +struct Agsym_s { /* symbol in one of the above dictionaries */ + Dtlink_t link; + char *name; /* attribute's name */ + char *defval; /* its default value for initialization */ + int id; /* its index in attr[] */ + unsigned char kind; /* referent object type */ + unsigned char fixed; /* immutable value */ +}; + +struct Agdatadict_s { /* set of dictionaries per graph */ + Agrec_t h; /* installed in list of graph recs */ + struct { + Dict_t *n, *e, *g; + } dict; +}; + +extern Agsym_t *agattr(Agraph_t * g, int kind, char *name, char *value); +extern Agsym_t *agattrsym(void *obj, char *name); +extern Agsym_t *agnxtattr(Agraph_t * g, int kind, Agsym_t * attr); +extern int agcopyattr(void *oldobj, void *newobj); + +extern void *agbindrec(void *obj, char *name, unsigned int size, + int move_to_front); +extern Agrec_t *aggetrec(void *obj, char *name, int move_to_front); +extern int agdelrec(void *obj, char *name); +extern void aginit(Agraph_t * g, int kind, char *rec_name, int rec_size, + int move_to_front); +extern void agclean(Agraph_t * g, int kind, char *rec_name); + +extern char *agget(void *obj, char *name); +extern char *agxget(void *obj, Agsym_t * sym); +extern int agset(void *obj, char *name, char *value); +extern int agxset(void *obj, Agsym_t * sym, char *value); +extern int agsafeset(void* obj, char* name, char* value, char* def); + +/* defintions for subgraphs */ +extern Agraph_t *agsubg(Agraph_t * g, char *name, int cflag); /* constructor */ +extern Agraph_t *agidsubg(Agraph_t * g, unsigned long id, int cflag); /* constructor */ +extern Agraph_t *agfstsubg(Agraph_t * g), *agnxtsubg(Agraph_t * subg); +extern Agraph_t *agparent(Agraph_t * g); + +/* set cardinality */ +extern int agnnodes(Agraph_t * g), agnedges(Agraph_t * g); +extern int agdegree(Agraph_t * g, Agnode_t * n, int in, int out); +extern int agcountuniqedges(Agraph_t * g, Agnode_t * n, int in, int out); + +/* memory */ +extern void *agalloc(Agraph_t * g, size_t size); +extern void *agrealloc(Agraph_t * g, void *ptr, size_t oldsize, + size_t size); +extern void agfree(Agraph_t * g, void *ptr); +extern struct _vmalloc_s *agheap(Agraph_t * g); + +/* an engineering compromise is a joy forever */ +extern void aginternalmapclearlocalnames(Agraph_t * g); + +#define agnew(g,t) ((t*)agalloc(g,sizeof(t))) +#define agnnew(g,n,t) ((t*)agalloc(g,(n)*sizeof(t))) + +/* error handling */ +typedef enum { AGWARN, AGERR, AGMAX, AGPREV } agerrlevel_t; +extern agerrlevel_t agerrno; +extern void agseterr(agerrlevel_t); +extern char *aglasterr(void); +extern int agerr(agerrlevel_t level, char *fmt, ...); +extern void agerrorf(char *fmt, ...); +extern void agwarningf(char *fmt, ...); +extern int agerrors(void); + +/* data access macros */ +/* this assumes that e[0] is out and e[1] is inedge, see edgepair in edge.c */ +#define AGIN2OUT(e) ((e)-1) +#define AGOUT2IN(e) ((e)+1) +#define AGOPP(e) ((AGTYPE(e)==AGINEDGE)?AGIN2OUT(e):AGOUT2IN(e)) +#define AGMKOUT(e) (AGTYPE(e) == AGOUTEDGE? (e): AGIN2OUT(e)) +#define AGMKIN(e) (AGTYPE(e) == AGINEDGE? (e): AGOUT2IN(e)) +#define AGTAIL(e) (AGMKIN(e)->node) +#define AGHEAD(e) (AGMKOUT(e)->node) +#define agtail(e) AGTAIL(e) +#define aghead(e) AGHEAD(e) +#define agopp(e) AGOPP(e) + +#define TAILPORT_ID "tailport" +#define HEADPORT_ID "headport" + +#if _PACKAGE_ast +# if !defined(_BLD_cgraph) && defined(__IMPORT__) +# define extern __IMPORT__ +# endif +#endif +#if !defined(_BLD_cgraph) && defined(GVDLL) +#define extern __declspec(dllimport) +#endif + +extern Agdesc_t Agdirected, Agstrictdirected, Agundirected, + Agstrictundirected; + +#undef extern + +/* fast graphs */ +void agflatten(Agraph_t * g, int flag); +typedef Agsubnode_t Agnoderef_t; +typedef Dtlink_t Agedgeref_t; + +#define AGHEADPOINTER(g) ((Agnoderef_t*)(g->n_seq->data->hh._head)) +#define AGRIGHTPOINTER(rep) ((Agnoderef_t*)((rep)->seq_link.right?((void*)((rep)->seq_link.right) - offsetof(Agsubnode_t,seq_link)):0)) +#define AGLEFTPOINTER(rep) ((Agnoderef_t*)((rep)->seq_link.hl._left?((void*)((rep)->seq_link.hl._left) - offsetof(Agsubnode_t,seq_link)):0)) + +#define FIRSTNREF(g) (agflatten(g,1), AGHEADPOINTER(g)) + +#define NEXTNREF(g,rep) (AGRIGHTPOINTER(rep) == AGHEADPOINTER(g)?0:AGRIGHTPOINTER(rep)) + +#define PREVNREF(g,rep) (((rep)==AGHEADPOINTER(g))?0:(AGLEFTPOINTER(rep))) + +#define LASTNREF(g) (agflatten(g,1), AGHEADPOINTER(g)?AGLEFTPOINTER(AGHEADPOINTER(g)):0) +#define NODEOF(rep) ((rep)->node) + +#define FIRSTOUTREF(g,sn) (agflatten(g,1), (sn)->out_seq) +#define LASTOUTREF(g,sn) (agflatten(g,1), (Agedgeref_t*)dtlast(sn->out_seq)) +#define FIRSTINREF(g,sn) (agflatten(g,1), (sn)->in_seq) +#define NEXTEREF(g,rep) ((rep)->right) +#define PREVEREF(g,rep) ((rep)->hl._left) +/* this is expedient but a bit slimey because it "knows" that dict entries of both nodes +and edges are embedded in main graph objects but allocated separately in subgraphs */ +#define AGSNMAIN(sn) ((sn)==(&((sn)->node->mainsub))) +#define EDGEOF(sn,rep) (AGSNMAIN(sn)?((Agedge_t*)((unsigned char*)(rep) - offsetof(Agedge_t,seq_link))) : ((Dthold_t*)(rep))->obj) + +#undef extern +#if _PACKAGE_ast +_END_EXTERNS_ +#endif +#ifdef __cplusplus +} +#endif +#endif