#pragma prototyped
#ifndef ATT_GRAPH_H
#define ATT_GRAPH_H
#include <cdt.h>
#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*)
typedef struct Agtag_s Agtag_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 Agmemdisc_s Agmemdisc_t;
typedef struct Agiddisc_s Agiddisc_t;
typedef struct Agiodisc_s Agiodisc_t;
typedef struct Agdisc_s Agdisc_t;
typedef struct Agdstate_s Agdstate_t;
typedef struct Agsym_s Agsym_t;
typedef struct Agattr_s Agattr_t;
typedef struct Agcbdisc_s Agcbdisc_t;
typedef struct Agcbstack_s Agcbstack_t;
typedef struct Agclos_s Agclos_t;
typedef struct Agrec_s Agrec_t;
typedef struct Agdatadict_s Agdatadict_t;
typedef struct Agedgepair_s Agedgepair_t;
struct Agrec_s {
char *name;
Agrec_t *next;
} ;
struct Agtag_s {
unsigned objtype : 2;
unsigned mtflock : 1;
unsigned attrwf : 1;
unsigned seq : (sizeof(unsigned)*8 - 6);
unsigned long id;
} ;
#define AGRAPH 0
#define AGNODE 1
#define AGOUTEDGE 2
#define AGINEDGE 3
#define AGEDGE AGOUTEDGE
struct Agobj_s {
Dtlink_t seq_link;
Dtlink_t id_link;
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)
struct Agnode_s {
Agobj_t base;
Agraph_t *g;
Dtlink_t *outid,*inid;
Agedge_t *out,*in;
} ;
struct Agedge_s {
Agobj_t base;
Agnode_t *node;
} ;
struct Agedgepair_s {
Agedge_t out, in;
} ;
struct Agdesc_s {
unsigned directed : 1;
unsigned strict : 1;
unsigned flatlock : 1;
unsigned maingraph: 1;
unsigned has_cmpnd : 1;
unsigned no_write : 1;
unsigned has_attrs : 1;
} ;
struct Agmemdisc_s {
void *(*open)(void);
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 {
void *(*open)(Agraph_t *g);
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, char *str);
int (*flush)(void *chan);
} ;
struct Agdisc_s {
Agmemdisc_t *mem;
Agiddisc_t *id;
Agiodisc_t *io;
} ;
extern Agmemdisc_t AgMemDisc;
extern Agiddisc_t AgIdDisc;
extern Agiodisc_t AgIoDisc;
extern Agdisc_t AgDefaultDisc;
struct Agdstate_s {
void *mem;
void *id;
};
typedef void (*agobjfn_t)(Agobj_t *obj, void *arg);
typedef void (*agobjupdfn_t)(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 {
Agcbdisc_t *f;
void *state;
Agcbstack_t *prev;
} ;
struct Agclos_s {
Agdisc_t disc;
Agdstate_t state;
Dict_t *strdict;
unsigned long seq[3];
Agcbstack_t *cb;
unsigned char callbacks_enabled;
Dict_t *lookup_by_name[3];
Dict_t *lookup_by_id[3];
} ;
struct Agraph_s {
Agobj_t base;
Agdesc_t desc;
Dict_t *n_seq;
Dict_t *n_id;
Dict_t *e_seq;
Dict_t *e_id;
Dict_t *g_dict;
Agraph_t *parent, *root;
Agclos_t *clos;
} ;
#if _PACKAGE_ast
# if defined(_BLD_agraph) && defined(__EXPORT__)
# define extern __EXPORT__
# endif
# if !defined(_BLD_agraph) && 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);
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 void agflatten(Agraph_t *g, int flag);
extern int agisflattened(Agraph_t *g);
extern int agisdirected(Agraph_t*g);
extern int agisundirected(Agraph_t*g);
extern int agisstrict(Agraph_t*g);
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(Agnode_t *n);
extern Agedge_t *agedge(Agnode_t *t, Agnode_t *h, char *name, int createflag);
extern Agedge_t *agidedge(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(Agnode_t *n);
extern Agedge_t *agnxtin(Agedge_t *e);
extern Agedge_t *agfstout(Agnode_t *n);
extern Agedge_t *agnxtout(Agedge_t *e);
extern Agedge_t *agfstedge(Agnode_t *n);
extern Agedge_t *agnxtedge(Agedge_t *e, Agnode_t *n);
extern Agraph_t *agraphof(void*);
extern char *agnameof(void*);
extern int agrelabel(void *obj, char *name);
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);
extern int agdelnode(Agnode_t *arg_n);
extern int agdeledge(Agedge_t *arg_e);
extern int agisarootobj(void*);
extern Agobj_t* agrebind(Agraph_t *g, Agobj_t *obj);
extern char *agstrdup(Agraph_t *, char *);
extern char *agstrbind(Agraph_t *g, char*);
extern int agstrfree(Agraph_t *, char *);
extern char *agcanonstr(char *, char *);
struct Agattr_s {
Agrec_t h;
Dict_t *dict;
char **str;
} ;
struct Agsym_s {
Dtlink_t link;
char *name;
char *defval;
int id;
int kind;
} ;
struct Agdatadict_s {
Agrec_t h;
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 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 Agraph_t *agsubg(Agraph_t *g, char *name, int cflag);
extern Agraph_t *agidsubg(Agraph_t *g, unsigned long id, int cflag);
extern Agraph_t *agfstsubg(Agraph_t *g), *agnxtsubg(Agraph_t *subg);
extern Agraph_t *agparent(Agraph_t *g),*agroot(Agraph_t *g);
extern int agnnodes(Agraph_t *g),agnedges(Agraph_t *g);
extern int agdegree(Agnode_t *n, int in, int out);
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);
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)))
extern void agerror(int code, char *str);
#define AGERROR_SYNTAX 1
#define AGERROR_MEMORY 2
#define AGERROR_UNIMPL 3
#define AGERROR_MTFLOCK 4
#define AGERROR_CMPND 5
#define AGERROR_BADOBJ 6
#define AGERROR_IDOVFL 7
#define AGERROR_FLAT 8
#define AGERROR_WRONGGRAPH 9
#define AGFIRSTNODE(g) ((Agnode_t*)dtfirst((g)->n_seq))
#define AGPREVNODE(n) ((Agnode_t*)((n)->base.seq_link.hl._left))
#define AGNEXTNODE(n) ((Agnode_t*)((n)->base.seq_link.right))
#define AGFSTOUT(n) ((Agedge_t*)((n)->out))
#define AGFSTIN(n) ((Agedge_t*)((n)->in))
#define AGPREV(e) ((Agedge_t*)((e)->base.seq_link.hl._left))
#define AGNXTE(e) ((Agedge_t*)((e)->base.seq_link.right))
#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)
#if _PACKAGE_ast
# if !defined(_BLD_agraph) && defined(__IMPORT__)
# define extern __IMPORT__
# endif
#endif
extern Agdesc_t Agdirected, Agstrictdirected, Agundirected, Agstrictundirected;
#undef extern
#if _PACKAGE_ast
_END_EXTERNS_
#endif
#endif