| 1 | /* $Id$ $Revision$ */ |
| 2 | /* vim:set shiftwidth=4 ts=8: */ |
| 3 | |
| 4 | /************************************************************************* |
| 5 | * Copyright (c) 2011 AT&T Intellectual Property |
| 6 | * All rights reserved. This program and the accompanying materials |
| 7 | * are made available under the terms of the Eclipse Public License v1.0 |
| 8 | * which accompanies this distribution, and is available at |
| 9 | * http://www.eclipse.org/legal/epl-v10.html |
| 10 | * |
| 11 | * Contributors: See CVS logs. Details at http://www.graphviz.org/ |
| 12 | *************************************************************************/ |
| 13 | |
| 14 | #ifndef ATT_GRAPHPVT_H |
| 15 | #define ATT_GRAPHPVT_H 1 |
| 16 | #define _BLD_cgraph 1 |
| 17 | |
| 18 | #ifndef EXTERN |
| 19 | #define EXTERN extern |
| 20 | #endif |
| 21 | |
| 22 | #ifdef _WIN32 |
| 23 | # ifdef EXPORT_CGHDR |
| 24 | # define CGHDR_API __declspec(dllexport) |
| 25 | # else |
| 26 | # define CGHDR_API __declspec(dllimport) |
| 27 | # endif |
| 28 | #else |
| 29 | # define CGHDR_API extern |
| 30 | #endif |
| 31 | |
| 32 | #include "config.h" |
| 33 | |
| 34 | #include <cgraph.h> |
| 35 | |
| 36 | #include <ctype.h> |
| 37 | #include <sys/types.h> |
| 38 | #include <stdarg.h> |
| 39 | #include <stdlib.h> |
| 40 | #include <string.h> |
| 41 | #ifdef HAVE_UNISTD_H |
| 42 | #include <unistd.h> |
| 43 | #endif /* HAVE_UNISTD_H */ |
| 44 | #ifdef DEBUG |
| 45 | #include <assert.h> |
| 46 | #else |
| 47 | #define assert(x) |
| 48 | #endif |
| 49 | #include <stdint.h> |
| 50 | |
| 51 | #ifndef streq |
| 52 | #define streq(s,t) ((*s == *t) && !strcmp((s),(t))) |
| 53 | #endif |
| 54 | #define NOTUSED(var) (void) var |
| 55 | |
| 56 | #define NILgraph NIL(Agraph_t*) |
| 57 | #define NILnode NIL(Agnode_t*) |
| 58 | #define NILedge NIL(Agedge_t*) |
| 59 | #define NILsym NIL(Agsym_t*) |
| 60 | #define NILstr NIL(char*) |
| 61 | |
| 62 | #define SUCCESS 0 |
| 63 | #define FAILURE -1 |
| 64 | #define LOCALNAMEPREFIX '%' |
| 65 | |
| 66 | #define AGDISC(g,d) ((g)->clos->disc.d) |
| 67 | #define AGCLOS(g,d) ((g)->clos->state.d) |
| 68 | #define AGNEW(g,t) ((t*)(agalloc(g,sizeof(t)))) |
| 69 | |
| 70 | #define ISALNUM(c) ((isalnum(c)) || ((c) == '_') || (!isascii(c))) |
| 71 | |
| 72 | /* functional definitions */ |
| 73 | typedef Agobj_t *(*agobjsearchfn_t) (Agraph_t * g, Agobj_t * obj); |
| 74 | CGHDR_API int agapply(Agraph_t * g, Agobj_t * obj, agobjfn_t fn, void *arg, |
| 75 | int preorder); |
| 76 | |
| 77 | /* global variables */ |
| 78 | EXTERN Agraph_t *Ag_G_global; |
| 79 | extern char *AgDataRecName; |
| 80 | |
| 81 | /* set ordering disciplines */ |
| 82 | extern Dtdisc_t Ag_subnode_id_disc; |
| 83 | extern Dtdisc_t Ag_subnode_seq_disc; |
| 84 | extern Dtdisc_t Ag_mainedge_id_disc; |
| 85 | extern Dtdisc_t Ag_subedge_id_disc; |
| 86 | extern Dtdisc_t Ag_mainedge_seq_disc; |
| 87 | extern Dtdisc_t Ag_subedge_seq_disc; |
| 88 | extern Dtdisc_t Ag_subgraph_id_disc; |
| 89 | extern Agcbdisc_t AgAttrdisc; |
| 90 | |
| 91 | /* internal constructor of graphs and subgraphs */ |
| 92 | Agraph_t *agopen1(Agraph_t * g); |
| 93 | int agstrclose(Agraph_t * g); |
| 94 | |
| 95 | /* ref string management */ |
| 96 | void agmarkhtmlstr(char *s); |
| 97 | |
| 98 | /* object set management */ |
| 99 | Agnode_t *agfindnode_by_id(Agraph_t * g, IDTYPE id); |
| 100 | Dtcompar_f agdictorder(Agraph_t *, Dict_t *, Dtcompar_f); |
| 101 | int agedgecmpf(Dict_t * d, void *arg_e0, void *arg_e1, Dtdisc_t * disc); |
| 102 | int agnamecmpf(Dict_t * d, void *, void *, Dtdisc_t * disc); |
| 103 | void agset_node_disc(Agraph_t * g, Dtdisc_t * disc); |
| 104 | uint64_t agnextseq(Agraph_t * g, int objtype); |
| 105 | |
| 106 | /* dict helper functions */ |
| 107 | Dict_t *agdtopen(Agraph_t * g, Dtdisc_t * disc, Dtmethod_t * method); |
| 108 | void agdtdisc(Agraph_t * g, Dict_t * dict, Dtdisc_t * disc); |
| 109 | long agdtdelete(Agraph_t * g, Dict_t * dict, void *obj); |
| 110 | int agdtclose(Agraph_t * g, Dict_t * dict); |
| 111 | void *agdictobjmem(Dict_t * dict, void * p, size_t size, |
| 112 | Dtdisc_t * disc); |
| 113 | void agdictobjfree(Dict_t * dict, void * p, Dtdisc_t * disc); |
| 114 | |
| 115 | /* name-value pair operations */ |
| 116 | CGHDR_API Agdatadict_t *agdatadict(Agraph_t * g, int cflag); |
| 117 | CGHDR_API Agattr_t *agattrrec(void *obj); |
| 118 | |
| 119 | void agraphattr_init(Agraph_t * g); |
| 120 | int agraphattr_delete(Agraph_t * g); |
| 121 | void agnodeattr_init(Agraph_t *g, Agnode_t * n); |
| 122 | void agnodeattr_delete(Agnode_t * n); |
| 123 | void agedgeattr_init(Agraph_t *g, Agedge_t * e); |
| 124 | void agedgeattr_delete(Agedge_t * e); |
| 125 | |
| 126 | /* parsing and lexing graph files */ |
| 127 | int aagparse(void); |
| 128 | void aglexinit(Agdisc_t * disc, void *ifile); |
| 129 | int aaglex(void); |
| 130 | void aglexeof(void); |
| 131 | void aglexbad(void); |
| 132 | |
| 133 | /* ID management */ |
| 134 | int agmapnametoid(Agraph_t * g, int objtype, char *str, |
| 135 | IDTYPE *result, int allocflag); |
| 136 | int agallocid(Agraph_t * g, int objtype, IDTYPE request); |
| 137 | void agfreeid(Agraph_t * g, int objtype, IDTYPE id); |
| 138 | char *agprintid(Agobj_t * obj); |
| 139 | int aginternalmaplookup(Agraph_t * g, int objtype, char *str, |
| 140 | IDTYPE *result); |
| 141 | void aginternalmapinsert(Agraph_t * g, int objtype, char *str, |
| 142 | IDTYPE result); |
| 143 | char *aginternalmapprint(Agraph_t * g, int objtype, IDTYPE id); |
| 144 | int aginternalmapdelete(Agraph_t * g, int objtype, IDTYPE id); |
| 145 | void aginternalmapclose(Agraph_t * g); |
| 146 | void agregister(Agraph_t * g, int objtype, void *obj); |
| 147 | |
| 148 | /* internal set operations */ |
| 149 | void agedgesetop(Agraph_t * g, Agedge_t * e, int insertion); |
| 150 | void agdelnodeimage(Agraph_t * g, Agnode_t * node, void *ignored); |
| 151 | void agdeledgeimage(Agraph_t * g, Agedge_t * edge, void *ignored); |
| 152 | void *agrebind0(Agraph_t * g, void *obj); /* unsafe */ |
| 153 | CGHDR_API int agrename(Agobj_t * obj, char *newname); |
| 154 | void agrecclose(Agobj_t * obj); |
| 155 | |
| 156 | void agmethod_init(Agraph_t * g, void *obj); |
| 157 | void agmethod_upd(Agraph_t * g, void *obj, Agsym_t * sym); |
| 158 | void agmethod_delete(Agraph_t * g, void *obj); |
| 159 | |
| 160 | #define CB_INITIALIZE 100 |
| 161 | #define CB_UPDATE 101 |
| 162 | #define CB_DELETION 102 |
| 163 | void agsyspushdisc(Agraph_t * g, Agcbdisc_t * cb, void *state, int stack); |
| 164 | int agsyspopdisc(Agraph_t * g, Agcbdisc_t * cb, int stack); |
| 165 | void agrecord_callback(Agraph_t * g, Agobj_t * obj, int kind, |
| 166 | Agsym_t * optsym); |
| 167 | void aginitcb(Agraph_t * g, void *obj, Agcbstack_t * disc); |
| 168 | void agupdcb(Agraph_t * g, void *obj, Agsym_t * sym, Agcbstack_t * disc); |
| 169 | void agdelcb(Agraph_t * g, void *obj, Agcbstack_t * disc); |
| 170 | |
| 171 | #endif /* ATT_GRAPHPVT_H */ |
| 172 | |