Daniel@0: /* $Id: graph.h,v 1.20 2009/06/03 01:10:53 ellson Exp $ $Revision: 1.20 $ */ Daniel@0: /* vim:set shiftwidth=4 ts=8: */ Daniel@0: Daniel@0: /********************************************************** Daniel@0: * This software is part of the graphviz package * Daniel@0: * http://www.graphviz.org/ * Daniel@0: * * Daniel@0: * Copyright (c) 1994-2004 AT&T Corp. * Daniel@0: * and is licensed under the * Daniel@0: * Common Public License, Version 1.0 * Daniel@0: * by AT&T Corp. * Daniel@0: * * Daniel@0: * Information and Software Systems Research * Daniel@0: * AT&T Research, Florham Park NJ * Daniel@0: **********************************************************/ Daniel@0: Daniel@0: Daniel@0: Daniel@0: #ifndef _GRAPH_H Daniel@0: #define _GRAPH_H 1 Daniel@0: Daniel@0: #if _PACKAGE_ast Daniel@0: #include Daniel@0: #else Daniel@0: #include Daniel@0: #include Daniel@0: #endif Daniel@0: #include Daniel@0: #include "cdt.h" Daniel@0: Daniel@0: #ifdef __cplusplus Daniel@0: extern "C" { Daniel@0: #endif Daniel@0: Daniel@0: #define TAIL_ID "tailport" Daniel@0: #define HEAD_ID "headport" Daniel@0: Daniel@0: typedef struct Agraph_t Agraph_t; Daniel@0: typedef struct Agnode_t Agnode_t; Daniel@0: typedef struct Agedge_t Agedge_t; Daniel@0: typedef struct Agdict_t Agdict_t; Daniel@0: typedef struct Agsym_t Agsym_t; Daniel@0: typedef struct Agdata_t Agdata_t; Daniel@0: typedef struct Agproto_t Agproto_t; Daniel@0: Daniel@0: typedef char *(*gets_f) (char *ubuf, int n, FILE * fp); Daniel@0: Daniel@0: #define AGFLAG_DIRECTED (1<<0) Daniel@0: #define AGFLAG_STRICT (1<<1) Daniel@0: #define AGFLAG_METAGRAPH (1<<2) Daniel@0: Daniel@0: #define AGRAPH 0 Daniel@0: #define AGRAPHSTRICT (AGRAPH | AGFLAG_STRICT) Daniel@0: #define AGDIGRAPH AGFLAG_DIRECTED Daniel@0: #define AGDIGRAPHSTRICT (AGDIGRAPH | AGFLAG_STRICT) Daniel@0: #define AGMETAGRAPH (AGFLAG_DIRECTED | AGFLAG_STRICT | AGFLAG_METAGRAPH) Daniel@0: Daniel@0: #define AG_IS_DIRECTED(g) ((g)->kind & AGFLAG_DIRECTED) Daniel@0: #define AG_IS_STRICT(g) ((g)->kind & AGFLAG_STRICT) Daniel@0: #define AG_IS_METAGRAPH(g) ((g)->kind & AGFLAG_METAGRAPH) Daniel@0: #define aginit() aginitlib(sizeof(Agraph_t),sizeof(Agnode_t),sizeof(Agedge_t)) Daniel@0: Daniel@0: struct Agraph_t { Daniel@0: int tag:4; Daniel@0: int kind:4; Daniel@0: int handle:24; Daniel@0: char **attr; Daniel@0: char *didset; Daniel@0: char *name; Daniel@0: Agdata_t *univ; Daniel@0: Dict_t *nodes, *inedges, *outedges; Daniel@0: Agraph_t *root; Daniel@0: Agnode_t *meta_node; Daniel@0: Agproto_t *proto; Daniel@0: Agraphinfo_t u; Daniel@0: }; Daniel@0: Daniel@0: struct Agnode_t { Daniel@0: int tag:4; Daniel@0: int pad:4; Daniel@0: int handle:24; Daniel@0: char **attr; Daniel@0: char *didset; Daniel@0: char *name; Daniel@0: int id; Daniel@0: Agraph_t *graph; Daniel@0: Agnodeinfo_t u; Daniel@0: }; Daniel@0: Daniel@0: struct Agedge_t { Daniel@0: int tag:4; Daniel@0: int printkey:4; Daniel@0: int handle:24; Daniel@0: char **attr; Daniel@0: char *didset; Daniel@0: Agnode_t *head, *tail; Daniel@0: int id; Daniel@0: Agedgeinfo_t u; Daniel@0: }; Daniel@0: Daniel@0: struct Agdata_t { /* for main graph */ Daniel@0: Dict_t *node_dict; Daniel@0: Agdict_t *nodeattr; Daniel@0: Agdict_t *edgeattr; Daniel@0: Agdict_t *globattr; Daniel@0: int max_node_id, max_edge_id; Daniel@0: }; Daniel@0: Daniel@0: struct Agsym_t { Daniel@0: char *name, *value; Daniel@0: int index; Daniel@0: unsigned char printed; Daniel@0: unsigned char fixed; Daniel@0: }; Daniel@0: Daniel@0: struct Agdict_t { Daniel@0: char *name; Daniel@0: Dict_t *dict; Daniel@0: Agsym_t **list; Daniel@0: }; Daniel@0: Daniel@0: struct Agproto_t { Daniel@0: Agnode_t *n; Daniel@0: Agedge_t *e; Daniel@0: Agproto_t *prev; Daniel@0: }; Daniel@0: Daniel@0: #if _PACKAGE_ast Daniel@0: _BEGIN_EXTERNS_ /* public data */ Daniel@0: #if _BLD_graph && defined(__EXPORT__) Daniel@0: #define extern __EXPORT__ Daniel@0: #endif Daniel@0: #if !_BLD_graph && defined(__IMPORT__) && 0 Daniel@0: #define extern __IMPORT__ Daniel@0: #endif Daniel@0: #endif Daniel@0: Daniel@0: /*visual studio*/ Daniel@0: #ifdef WIN32_DLL Daniel@0: #ifndef GRAPH_EXPORTS Daniel@0: #define extern __declspec(dllimport) Daniel@0: #endif Daniel@0: #endif Daniel@0: /*end visual studio*/ Daniel@0: extern char *agstrcanon(char *, char *); Daniel@0: extern char *agcanonical(char *); Daniel@0: extern char *agcanon(char *); Daniel@0: extern int aghtmlstr(char *s); Daniel@0: extern char *agget(void *, char *); Daniel@0: extern char *agxget(void *, int); Daniel@0: extern int agset(void *, char *, char *); Daniel@0: extern int agsafeset(void *, char *, char *, char*); Daniel@0: extern int agxset(void *, int, char *); Daniel@0: extern int agindex(void *, char *); Daniel@0: Daniel@0: extern void aginitlib(int, int, int); Daniel@0: extern Agraph_t *agopen(char *, int); Daniel@0: extern Agraph_t *agsubg(Agraph_t *, char *); Daniel@0: extern Agraph_t *agfindsubg(Agraph_t *, char *); Daniel@0: extern void agclose(Agraph_t *); Daniel@0: extern Agraph_t *agread(FILE *); Daniel@0: extern Agraph_t *agread_usergets(FILE *, gets_f); Daniel@0: extern void agreadline(int); Daniel@0: extern void agsetfile(char *); Daniel@0: extern Agraph_t *agmemread(char *); Daniel@0: extern void agsetiodisc( Daniel@0: char * (*myfgets) (char *s, int size, FILE *stream), Daniel@0: size_t (*myfwrite) (const void *ptr, size_t size, size_t nmemb, FILE *stream), Daniel@0: int (*myferror) (FILE *stream) ); Daniel@0: extern int agputs(const char *s, FILE *fp); Daniel@0: extern int agputc(int c, FILE *fp); Daniel@0: extern int agwrite(Agraph_t *, FILE *); Daniel@0: extern int agerrors(void); Daniel@0: extern Agraph_t *agprotograph(void); Daniel@0: extern Agnode_t *agprotonode(Agraph_t *); Daniel@0: extern Agedge_t *agprotoedge(Agraph_t *); Daniel@0: extern Agraph_t *agusergraph(Agnode_t *); Daniel@0: extern int agnnodes(Agraph_t *); Daniel@0: extern int agnedges(Agraph_t *); Daniel@0: Daniel@0: extern void aginsert(Agraph_t *, void *); Daniel@0: extern void agdelete(Agraph_t *, void *); Daniel@0: extern int agcontains(Agraph_t *, void *); Daniel@0: Daniel@0: extern Agnode_t *agnode(Agraph_t *, char *); Daniel@0: extern Agnode_t *agfindnode(Agraph_t *, char *); Daniel@0: extern Agnode_t *agfstnode(Agraph_t *); Daniel@0: extern Agnode_t *agnxtnode(Agraph_t *, Agnode_t *); Daniel@0: extern Agnode_t *aglstnode(Agraph_t *); Daniel@0: extern Agnode_t *agprvnode(Agraph_t *, Agnode_t *); Daniel@0: Daniel@0: extern Agedge_t *agedge(Agraph_t *, Agnode_t *, Agnode_t *); Daniel@0: extern Agedge_t *agfindedge(Agraph_t *, Agnode_t *, Agnode_t *); Daniel@0: extern Agedge_t *agfstedge(Agraph_t *, Agnode_t *); Daniel@0: extern Agedge_t *agnxtedge(Agraph_t *, Agedge_t *, Agnode_t *); Daniel@0: extern Agedge_t *agfstin(Agraph_t *, Agnode_t *); Daniel@0: extern Agedge_t *agnxtin(Agraph_t *, Agedge_t *); Daniel@0: extern Agedge_t *agfstout(Agraph_t *, Agnode_t *); Daniel@0: extern Agedge_t *agnxtout(Agraph_t *, Agedge_t *); Daniel@0: Daniel@0: extern Agsym_t *agattr(void *, char *, char *); Daniel@0: extern Agsym_t *agraphattr(Agraph_t *, char *, char *); Daniel@0: extern Agsym_t *agnodeattr(Agraph_t *, char *, char *); Daniel@0: extern Agsym_t *agedgeattr(Agraph_t *, char *, char *); Daniel@0: extern Agsym_t *agfindattr(void *, char *); Daniel@0: extern Agsym_t *agfstattr(void *); Daniel@0: extern Agsym_t *agnxtattr(void *, Agsym_t *); Daniel@0: extern Agsym_t *aglstattr(void *); Daniel@0: extern Agsym_t *agprvattr(void *, Agsym_t *); Daniel@0: extern int agcopyattr(void *, void *); Daniel@0: Daniel@0: typedef enum { AGWARN, AGERR, AGMAX, AGPREV } agerrlevel_t; Daniel@0: extern agerrlevel_t agerrno; Daniel@0: extern void agseterr(agerrlevel_t); Daniel@0: extern char *aglasterr(void); Daniel@0: extern int agerr(agerrlevel_t level, char *fmt, ...); Daniel@0: extern void agerrorf(const char *fmt, ...); Daniel@0: extern void agwarningf(char *fmt, ...); Daniel@0: Daniel@0: extern char *agstrdup(char *); Daniel@0: extern char *agstrdup_html(char *s); Daniel@0: extern void agstrfree(char *); Daniel@0: Daniel@0: typedef enum { AGNODE = 1, AGEDGE, AGGRAPH } agobjkind_t; Daniel@0: #define agobjkind(p) ((agobjkind_t)(((Agraph_t*)(p))->tag)) Daniel@0: Daniel@0: #define agmetanode(g) ((g)->meta_node) Daniel@0: Daniel@0: #undef extern Daniel@0: #if _PACKAGE_ast Daniel@0: _END_EXTERNS_ Daniel@0: #endif Daniel@0: #ifdef __cplusplus Daniel@0: } Daniel@0: #endif Daniel@0: #endif /* _GRAPH_H */