21%define api.prefix {aag}
71static const char Key[] =
"key";
135%type <i> optstrict graphtype
rcompound attrtype
136%type <str> optsubghdr optgraphname optmacroname atom
qatom
157optstmtlist : stmtlist | ;
159stmtlist : stmtlist stmt | stmt ;
194optmacroname : atom
'=' {
$$ =
$1;}
202optattrdefs : optattrdefs attrdefs
205attrdefs : attrassignment optseparator
222optseparator :
';' |
',' | ;
273 for (p = ilist; p; p = pn) {
301 assert(value !=
NULL);
312 assert(aptr->tag ==
T_atom);
328 if (aptr->tag ==
T_attr) {
333 agxset(obj, aptr->u.asym, aptr->str);
339 assert(aptr->tag ==
T_atom);
347 agwarningf(
"attribute macros not implemented");
366 for (aptr =
S->attrlist.first; aptr; aptr = aptr->next)
376 for (aptr =
S->attrlist.first; aptr; aptr = aptr->next) {
378 if (aptr->tag ==
T_atom)
continue;
379 if (!aptr->u.asym->fixed ||
S->g !=
G) {
381 sym =
agattr_html(
S->g, kind, aptr->u.asym->name, aptr->str);
383 sym =
agattr_text(
S->g, kind, aptr->u.asym->name, aptr->str);
423 for (ptr =
S->nodelist.first; ptr; ptr = ptr->next)
439 if (
S->nodelist.first) {
441 S->nodelist.first =
S->nodelist.last =
NULL;
443 else {
if (
S->subg) v =
cons_subg(
S->subg);
S->subg = 0;}
475 for (tptr = p->u.list; tptr; tptr = tptr->next)
494 size_t len = strlen(
s1) + strlen(s2) + 1;
496 if (
len <= BUFSIZ) sym = buf;
503 if (sym != buf)
free (sym);
529 subg = hlist->u.subg;
534 for (hptr = hlist->u.list; hptr; hptr = hptr->next)
556 e =
agedge(ctx->
S->
g, t, h, key, 1);
563 temp = tp; tp = hp; hp = temp;
577 if (ctx->
G ==
NULL) {
609 ctx->
S =
pop(ctx->
S);
621 ctx->
S =
pop(ctx->
S);
644 .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?