21%define api.prefix {aag}
72static const char Key[] =
"key";
136%type <i> optstrict graphtype
rcompound attrtype
137%type <str> optsubghdr optgraphname optmacroname atom
qatom
158optstmtlist : stmtlist | ;
160stmtlist : stmtlist stmt | stmt ;
195optmacroname : atom
'=' {
$$ =
$1;}
203optattrdefs : optattrdefs attrdefs
206attrdefs : attrassignment optseparator
223optseparator :
';' |
',' | ;
274 for (p = ilist; p; p = pn) {
302 assert(value !=
NULL);
313 assert(aptr->tag ==
T_atom);
329 if (aptr->tag ==
T_attr) {
334 agxset(obj, aptr->u.asym, aptr->str);
340 assert(aptr->tag ==
T_atom);
348 agwarningf(
"attribute macros not implemented");
367 for (aptr =
S->attrlist.first; aptr; aptr = aptr->next)
377 for (aptr =
S->attrlist.first; aptr; aptr = aptr->next) {
379 if (aptr->tag ==
T_atom)
continue;
380 if (!aptr->u.asym->fixed ||
S->g !=
G) {
382 sym =
agattr_html(
S->g, kind, aptr->u.asym->name, aptr->str);
384 sym =
agattr_text(
S->g, kind, aptr->u.asym->name, aptr->str);
424 for (ptr =
S->nodelist.first; ptr; ptr = ptr->next)
440 if (
S->nodelist.first) {
442 S->nodelist.first =
S->nodelist.last =
NULL;
444 else {
if (
S->subg) v =
cons_subg(
S->subg);
S->subg = 0;}
476 for (tptr = p->u.list; tptr; tptr = tptr->next)
495 size_t len = strlen(
s1) + strlen(s2) + 1;
497 if (
len <= BUFSIZ) sym = buf;
504 if (sym != buf)
free (sym);
530 subg = hlist->u.subg;
535 for (hptr = hlist->u.list; hptr; hptr = hptr->next)
557 e =
agedge(ctx->
S->
g, t, h, key, 1);
564 temp = tp; tp = hp; hp = temp;
578 if (ctx->
G ==
NULL) {
610 ctx->
S =
pop(ctx->
S);
622 ctx->
S =
pop(ctx->
S);
650 .InputFile = filename,
static void agxbfree(agxbuf *xb)
free any malloced resources
static int agxbprint(agxbuf *xb, const char *fmt,...)
Printf-style output to an agxbuf.
static WUR char * agxbuse(agxbuf *xb)
Memory allocation wrappers that exit on failure.
static void * gv_alloc(size_t size)
int aagparse(aagscan_t scanner)
int aaglex_destroy(aagscan_t)
void aagset_in(FILE *, aagscan_t)
void aglexeof(aagscan_t yyscanner)
int aaglex_init_extra(aagextra_t *user_defined, aagscan_t *scanner)
void aglexbad(aagscan_t yyscanner)
aagextra_t * aagget_extra(aagscan_t yyscanner)
static double len(glCompPoint p)
void aagerror(aagscan_t, const char *)
int aaglex(AAGSTYPE *, aagscan_t)
static char * concatPort(Agraph_t *G, char *s1, char *s2)
static void attrstmt(aagscan_t scanner, int tkind, char *macroname)
static void opensubg(aagscan_t scanner, char *name)
static gstack_t * push(gstack_t *s, Agraph_t *subg)
static void bindattrs(aagextra_t *ctx, int kind)
static void applyattrs(aagextra_t *ctx, void *obj)
static void appendnode(aagscan_t scanner, char *name, char *port, char *sport)
static void deletelist(Agraph_t *G, list_t *list)
static void mkport(aagscan_t scanner, Agedge_t *e, char *name, char *val)
static item * cons_attr(char *name, char *value)
static void newedge(aagscan_t scanner, Agnode_t *t, char *tport, Agnode_t *h, char *hport, char *key)
static void appendattr(aagscan_t scanner, char *name, char *value)
static void startgraph(aagscan_t scanner, char *name, bool directed, bool strict)
static void delete_items(Agraph_t *G, item *ilist)
static item * cons_subg(Agraph_t *subg)
static item * cons_node(Agnode_t *n, char *port)
static void freestack(aagscan_t scanner)
static item * cons_list(item *list)
static void closesubg(aagscan_t scanner)
static char * concat(aagscan_t scanner, char *s1, char *s2)
static item * newitem(int tag, void *p0, char *p1)
static void endedge(aagscan_t scanner)
static void listapp(list_t *list, item *v)
static void graph_error(aagscan_t scanner)
static void getedgeitems(aagscan_t scanner)
static void nomacros(void)
static void edgerhs(aagscan_t scanner, Agnode_t *tail, char *tport, item *hlist, char *key)
static void endgraph(aagscan_t scanner)
void aginternalmapclearlocalnames(Agraph_t *g)
Agsym_t * agattr_text(Agraph_t *g, int kind, char *name, const char *value)
creates or looks up text attributes of a graph
int agxset(void *obj, Agsym_t *sym, const char *value)
int agxset_html(void *obj, Agsym_t *sym, const char *value)
Agsym_t * agattr_html(Agraph_t *g, int kind, char *name, const char *value)
agattr_text, but creates HTML-like values
Agedge_t * agedge(Agraph_t *g, Agnode_t *t, Agnode_t *h, char *name, int createflag)
void agwarningf(const char *fmt,...)
void agerrorf(const char *fmt,...)
int agclose(Agraph_t *g)
deletes a graph, freeing its associated storage
Agraph_t * agconcat(Agraph_t *g, const char *filename, void *chan, Agdisc_t *disc)
merges the file contents with a pre-existing graph
Agraph_t * agopen(char *name, Agdesc_t desc, Agdisc_t *disc)
creates a new graph with the given name and kind
Agraph_t * agread(void *fp, Agdisc_t *disc)
constructs a new graph
Agnode_t * agnode(Agraph_t *g, char *name, int createflag)
Agnode_t * agnxtnode(Agraph_t *g, Agnode_t *n)
Agnode_t * agfstnode(Agraph_t *g)
Agnode_t * agsubnode(Agraph_t *g, Agnode_t *n, int createflag)
#define AGTYPE(obj)
returns AGRAPH, AGNODE, or AGEDGE depending on the type of the object
int aghtmlstr(const char *)
int agstrfree(Agraph_t *, const char *, bool is_html)
char * agstrdup(Agraph_t *, const char *)
returns a pointer to a reference-counted copy of the argument string, creating one if necessary
Agraph_t * agsubg(Agraph_t *g, char *name, int cflag)
Agraph_t * graph(char *name)
textitem scanner parser str
NEATOPROCS_API void s1(graph_t *, node_t *)
static bool streq(const char *a, const char *b)
are a and b equal?