/* mapN: * Convert cluster nodes back to ordinary nodes * If n is already ordinary, return it. * Otherwise, we know node's name is "__i:xxx" * where i is some number and xxx is the nodes's original name. * Create new node of name xxx if it doesn't exist and add n to clg * for later deletion. */ static node_t *mapN(node_t * n, graph_t * clg) { node_t *nn; char *name; graph_t *g = agraphof(n); Agsym_t *sym; if (!(IS_CLUST_NODE(n))) return n; agsubnode(clg, n, 1); name = strchr(agnameof(n), ':'); assert(name); name++; if ((nn = agfindnode(g, name))) return nn; nn = agnode(g, name, 1); agbindrec(nn, "Agnodeinfo_t", sizeof(Agnodeinfo_t), TRUE); /* Set all attributes to default */ for (sym = agnxtattr(g, AGNODE, NULL); sym; (sym = agnxtattr(g, AGNODE, sym))) { if (agxget(nn, sym) != sym->defval) agxset(nn, sym, sym->defval); } return nn; }
static void emitGraphAttrs (Agraph_t* G, FILE* outFile) { Agsym_t* s; char* v; for (s = agnxtattr (G, AGRAPH, NULL); s; s = agnxtattr (G, AGRAPH, s)) { if (*(v = agxget (G, s))) { emitAttr (s->name, v, outFile, 1); } } }
static int contem_pesos(Agraph_t *Ag) { char p_str[5]; strcpy(p_str, "peso"); for ( Agsym_t *sym = agnxtattr(Ag, AGEDGE, NULL); sym; sym = agnxtattr(Ag, AGEDGE, sym) ) { if (strcmp(sym->name, p_str) == 0) return 1; } return 0; }
void listEdgeAttrs (Tcl_Interp * interp, Agraph_t* g) { Agsym_t *a = NULL; while ((a = agnxtattr(g, AGEDGE, a))) { Tcl_AppendElement(interp, a->name); } }
/* copyAttr: * Copy attributes from src to tgt. Overrides currently * defined values. * FIX: we should probably use the default value of the source * graph when initializing the attribute, rather than "". * NOTE: We do not assume src and tgt have the same kind. */ int copyAttr(Agobj_t * src, Agobj_t * tgt) { Agraph_t *srcg; Agraph_t *tgtg; Agsym_t *sym = 0; Agsym_t *tsym = 0; int skind = AGTYPE(src); int tkind = AGTYPE(tgt); char* val; srcg = agraphof(src); tgtg = agraphof(tgt); while ((sym = agnxtattr(srcg, skind, sym))) { tsym = agattrsym(tgt, sym->name); if (!tsym) tsym = agattr(tgtg, tkind, sym->name, sym->defval); val = agxget(src, sym); if (aghtmlstr (val)) { val = agstrdup_html (tgtg, val); agxset(tgt, tsym, val); agstrfree (tgtg, val); } else agxset(tgt, tsym, val); } return 0; }
Agsym_t *firstattr(Agraph_t *g) { if (!g) return NULL; g = agroot(g); return agnxtattr(g,AGRAPH,NULL); }
void GraphEdge::updateWithEdge(edge_t* edge) { kDebug(); DotRenderOpVec ops; // decrease mem peak setRenderOperations(ops); if (agget(edge, (char*)"_draw_") != NULL) { parse_renderop(agget(edge, (char*)"_draw_"), ops); kDebug() << "element renderOperations size is now " << ops.size(); } if (agget(edge, (char*)"_ldraw_") != NULL) { parse_renderop(agget(edge, (char*)"_ldraw_"), ops); kDebug() << "element renderOperations size is now " << ops.size(); } if (agget(edge, (char*)"_hdraw_") != NULL) { parse_renderop(agget(edge, (char*)"_hdraw_"), ops); kDebug() << "element renderOperations size is now " << ops.size(); } if (agget(edge, (char*)"_tdraw_") != NULL) { parse_renderop(agget(edge, (char*)"_tdraw_"), ops); kDebug() << "element renderOperations size is now " << ops.size(); } if (agget(edge, (char*)"_hldraw_") != NULL) { parse_renderop(agget(edge, (char*)"_hldraw_"), ops); kDebug() << "element renderOperations size is now " << ops.size(); } if (agget(edge, (char*)"_tldraw_") != NULL) { parse_renderop(agget(edge, (char*)"_tldraw_"), ops); kDebug() << "element renderOperations size is now " << ops.size(); } setRenderOperations(ops); Agsym_t *attr = agnxtattr(agraphof(agtail(edge)), AGEDGE, NULL); while(attr) { kDebug() /*<< edge->name*/ << ":" << attr->name << agxget(edge,attr); m_attributes[attr->name] = agxget(edge,attr); attr = agnxtattr(agraphof(agtail(edge)), AGEDGE, attr); } }
Agsym_t *firstattr(Agedge_t *e) { Agraph_t *g; if (!e) return NULL; g = agraphof(agtail(e)); return agnxtattr(g,AGEDGE,NULL); }
Agsym_t *firstattr(Agnode_t *n) { Agraph_t *g; if (!n) return NULL; g = agraphof(n); return agnxtattr(g,AGNODE,NULL); }
Agsym_t *nextattr(Agraph_t *g, Agsym_t *a) { int i; if (!g || !a) return NULL; g = agroot(g); return agnxtattr(g,AGRAPH,a); }
Agsym_t *nextattr(Agedge_t *e, Agsym_t *a) { Agraph_t *g; int i; if (!e || !a) return NULL; g = agraphof(agtail(e)); return agnxtattr(g,AGEDGE,a); }
Agsym_t *nextattr(Agnode_t *n, Agsym_t *a) { Agraph_t *g; int i; if (!n || !a) return NULL; g = agraphof(n); return agnxtattr(g,AGNODE,a); }
main() { Agraph_t *g; Agnode_t *n; Agedge_t *e; Agsym_t *sym; char *val; while (g = agread(stdin, NIL(Agdisc_t *))) { for (n = agfstnode(g); n; n = agnxtnode(n)) { /*fprintf(stderr,"%s\n", agnameof(n)); */ for (sym = agnxtattr(g, AGNODE, 0); sym; sym = agnxtattr(g, AGNODE, sym)) { val = agxget(n, sym); /*fprintf(stderr,"\t%s=%s\n",sym->name,val); */ } } agwrite(g, stdout); } }
static void write_attrs(Agobj_t * obj, GVJ_t * job, state_t* sp) { Agraph_t* g = agroot(obj); int type = AGTYPE(obj); char* attrval; Agsym_t* sym = agnxtattr(g, type, NULL); if (!sym) return; for (; sym; sym = agnxtattr(g, type, sym)) { if (!(attrval = agxget(obj, sym))) continue; if ((*attrval == '\0') && !streq(sym->name, "label")) continue; gvputs(job, ",\n"); indent(job, sp->Level); gvprintf(job, "\"%s\": ", stoj(sym->name, sp)); if (sp->doXDot && isXDot(sym->name)) write_xdots(agxget(obj, sym), job, sp); else gvprintf(job, "\"%s\"", stoj(agxget(obj, sym), sp)); } }
main() { Agraph_t *g; Agnode_t *n; Agedge_t *e; Agsym_t *sym; char *val; while (g = agread(stdin, NIL(Agdisc_t *))) { #ifdef NOTDEF for (n = agfstnode(g); n; n = agnxtnode(g, n)) { fprintf(stderr, "%s\n", agnameof(n)); for (sym = agnxtattr(g, AGNODE, 0); sym; sym = agnxtattr(g, AGNODE, sym)) { val = agxget(n, sym); fprintf(stderr, "\t%s=%s\n", sym->name, val); } } #endif sym = agattr(g, AGRAPH, "nonsense", "junk"); fprintf(stderr,"sym = %x, %s\n", sym, sym? sym->defval : "(none)"); agwrite(g, stdout); } }
/*-------------------------------------------------------------------------*\ * Write info about a node to stdout. * Example: * n:info() \*-------------------------------------------------------------------------*/ static int gr_info(lua_State *L) { Agraph_t *g; gr_node_t *ud = tonode(L, 1, STRICT); Agedge_t *se; Agsym_t *sym; g = agraphof(ud->n); printf("INFO NODE '%s' '%s' id=%lu seq=%d\n", agnameof(ud->n), ud->name, (unsigned long) AGID(ud->n), AGSEQ(ud->n)); printf(" ptr: %p\n", ud->n); printf(" Symbols:\n"); se = agfstout(g, ud->n); sym=0; while ((sym = agnxtattr(g,AGNODE,sym))!=NULL) printf(" %s = '%s'\n",sym->name,sym->defval); #if 0 printf(" Out edges: d-out=%d u-out=%d\n", agdegree(g, ud->n, 0, 1), agcountuniqedges(g, ud->n, 0, 1)); #endif while (se) { printf(" name: '%s', head: '%s', tail: '%s' id=%lud, seq=%d %p\n", agnameof(se), agnameof(aghead(se)), agnameof(agtail(se)), (unsigned long) AGID(se), AGSEQ(se), (void*)se); se = agnxtout(g, se); } #if 0 printf(" In edges: d-in=%d u-in=%d\n", agdegree(g, ud->n, 1, 0), agcountuniqedges(g, ud->n, 1, 0)); #endif se = agfstin(g, ud->n); while (se) { printf(" name: '%s', head: '%s', tail: '%s' îd=%lu seq=%d %p\n", agnameof(se), agnameof(aghead(se)), agnameof(agtail(se)), (unsigned long) AGID(se), AGSEQ(se), (void*)se); se = agnxtin(g, se); } #if 0 printf(" Edges: d-io=%d u-io=%d\n", agdegree(g, ud->n, 1, 1), agcountuniqedges(g, ud->n, 1, 1)); #endif se = agfstedge(g, ud->n); while (se) { printf(" name: '%s', head: '%s', tail: '%s' id=%lud seq=%d %p\n", agnameof(se), agnameof(aghead(se)), agnameof(agtail(se)), (unsigned long) AGID(se), AGSEQ(se), (void*)se); se = agnxtedge(g, se, ud->n); } return 0; }
/* copyAttr; * Copy attributes from src to tgt. Overrides currently * defined values. * FIX: we should probably use the default value of the source * graph when initializing the attribute, rather than "". * NOTE: We do not assume src and tgt have the same kind. */ int copyAttr(Agobj_t * src, Agobj_t * tgt) { Agraph_t *srcg; Agraph_t *tgtg; Agsym_t *sym = 0; Agsym_t *tsym = 0; int skind = AGTYPE(src); int tkind = AGTYPE(tgt); srcg = agraphof(src); tgtg = agraphof(tgt); while ((sym = agnxtattr(srcg, skind, sym))) { tsym = agattrsym(tgt, sym->name); if (!tsym) tsym = agattr(tgtg, tkind, sym->name, ""); agxset(tgt, tsym, agxget(src, sym)); } return 0; }
/* node attributes: * label * graphics * LabelGraphics */ static void emitNodeAttrs (Agraph_t* G, Agnode_t* np, FILE* outFile, int ix) { Agsym_t* s; char* v; node_attrs attrs; int doGraphics = 0; int doLabelGraphics = 0; char* label = 0; int style; double x, y; /* First, process the attributes, saving the graphics attributes */ memset(&attrs,0, sizeof(attrs)); for (s = agnxtattr (G, AGNODE, NULL); s; s = agnxtattr (G, AGNODE, s)) { if (streq(s->name, "style")) { /* hasFill outlineStyle invis */ if (*(v = agxget (np, s))) { style = parseStyle (v); if (style & INVIS) attrs.flags |= INVIS; if (style & FILL) attrs.flags |= FILL; if (style & LINE) attrs.outlineStyle = "line"; if (style & DASH) attrs.outlineStyle = "dashed"; if (style & DOT) attrs.outlineStyle = "dotted"; doGraphics = 1; } } else if (streq(s->name, "label")) { v = agxget (np, s); if (streq("\\N", v)) { label = agnameof(np); emitAttr (s->name, label, outFile, ix); doLabelGraphics = 1; } else if (*v) { label = v; emitAttr (s->name, label, outFile, ix); doLabelGraphics = 1; } } else if (streq(s->name, "penwidth")) { if (*(v = agxget (np, s))) { attrs.width = v; doGraphics = 1; } } else if (streq(s->name, "width")) { v = agxget (np, s); if (*v) { attrs.w = 72.0*atof (v); attrs.flags |= W_SET; doGraphics = 1; } } else if (streq(s->name, "height")) { v = agxget (np, s); if (*v) { attrs.h = 72.0*atof (v); attrs.flags |= H_SET; doGraphics = 1; } } else if (streq(s->name, "pos")) { v = agxget (np, s); if (sscanf (v, "%lf,%lf", &x, &y) == 2) { doGraphics = 1; attrs.x = x; attrs.y = y; attrs.flags |= POS_SET; } } else if (streq(s->name, "shape")) { /* type */ if (*(v = agxget (np, s))) { attrs.type = v; doGraphics = 1; } } else if (streq(s->name, "color")) { if (*(v = agxget (np, s))) { attrs.fill = v; attrs.outline = v; doGraphics = 1; } } else if (streq(s->name, "fillcolor")) { if (*(v = agxget (np, s))) { attrs.fill = v; doGraphics = 1; } } else if (streq(s->name, "pencolor")) { if (*(v = agxget (np, s))) { attrs.outline = v; doGraphics = 1; } } else if (streq(s->name, "fontname")) { /* fontName */ if (*(v = agxget (np, s))) { attrs.fontName = v; doLabelGraphics = 1; } } else if (streq(s->name, "fontsize")) { /* fontSize */ if (*(v = agxget (np, s))) { attrs.fontSize = v; doLabelGraphics = 1; } } else if (streq(s->name, "fontcolor")) { /* fontColor */ if (*(v = agxget (np, s))) { attrs.fontColor = v; doLabelGraphics = 1; } } else { v = agxget (np, s); emitAttr (s->name, v, outFile, ix); } } /* Then, print them, if any */ if (doGraphics) { fprintf (outFile, " graphics [\n"); if (attrs.flags & POS_SET) { emitReal ("x", attrs.x, outFile, ix+1); emitReal ("y", attrs.y, outFile, ix+1); } if (attrs.flags & W_SET) { emitReal ("w", attrs.w, outFile, ix+1); } if (attrs.flags & H_SET) { emitReal ("H", attrs.h, outFile, ix+1); } if (attrs.flags & INVIS) { emitInt ("visible", 0, outFile, ix+1); } if (attrs.flags & FILL) { emitInt ("hasFill", 1, outFile, ix+1); } if (attrs.type) { emitAttr ("type", attrs.type, outFile, ix+1); } if (attrs.image) { emitAttr ("image", attrs.image, outFile, ix+1); } if (attrs.fill) { emitAttr ("fill", attrs.fill, outFile, ix+1); } if (attrs.outline) { emitAttr ("outline", attrs.outline, outFile, ix+1); } if (attrs.width) { emitAttr ("width", attrs.width, outFile, ix+1); } if (attrs.outlineStyle) { emitAttr ("outlineStyle", attrs.outlineStyle, outFile, ix+1); } fprintf (outFile, " ]\n"); } if (doLabelGraphics) { fprintf (outFile, " LabelGraphics [\n"); if (label) emitAttr ("text", label, outFile, ix+1); if (attrs.fontColor) { emitAttr ("fontColor", attrs.fontColor, outFile, ix+1); } if (attrs.fontSize) { emitAttr ("fontSize", attrs.fontSize, outFile, ix+1); } if (attrs.fontName) { emitAttr ("fontName", attrs.fontName, outFile, ix+1); } fprintf (outFile, " ]\n"); } }
/* edge attributes: * label * graphics * LabelGraphics */ static void emitEdgeAttrs (Agraph_t* G, Agedge_t* ep, FILE* outFile, int ix) { Agsym_t* s; char* v; edge_attrs attrs; int doGraphics = 0; int doLabelGraphics = 0; char* label = 0; int style; /* First, process the attributes, saving the graphics attributes */ memset(&attrs,0, sizeof(attrs)); for (s = agnxtattr (G, AGEDGE, NULL); s; s = agnxtattr (G, AGEDGE, s)) { if (streq(s->name, "style")) { /* hasFill outlineStyle invis */ if (*(v = agxget (ep, s))) { style = parseStyle (v); if (style & INVIS) attrs.flags |= INVIS; if (style & LINE) attrs.flags |= LINE; if (style & DASH) attrs.flags |= DASH; if (style & DOT) attrs.flags |= DOT; if (style & BOLD) attrs.width = "2"; doGraphics = 1; } } else if (streq(s->name, "label")) { if (*(v = agxget (ep, s))) { label = v; emitAttr (s->name, label, outFile, ix); doLabelGraphics = 1; } } else if (streq(s->name, "penwidth")) { if (*(v = agxget (ep, s))) { attrs.width = v; doGraphics = 1; } } else if (streq(s->name, "pos")) { if (*(v = agxget (ep, s))) { doGraphics = 1; attrs.pos = v; } } else if (streq(s->name, "dir")) { if (*(v = agxget (ep, s))) { doGraphics = 1; attrs.arrow = v; } } else if (streq(s->name, "color")) { if (*(v = agxget (ep, s))) { attrs.fill = v; doGraphics = 1; } } else if (streq(s->name, "pencolor")) { if (*(v = agxget (ep, s))) { attrs.fill = v; doGraphics = 1; } } else if (streq(s->name, "arrowhead")) { if (*(v = agxget (ep, s))) { attrs.arrowhead = v; doGraphics = 1; } } else if (streq(s->name, "arrowtail")) { if (*(v = agxget (ep, s))) { attrs.arrowtail = v; doGraphics = 1; } } else if (streq(s->name, "fontname")) { /* fontName */ if (*(v = agxget (ep, s))) { attrs.fontName = v; doLabelGraphics = 1; } } else if (streq(s->name, "fontsize")) { /* fontSize */ if (*(v = agxget (ep, s))) { attrs.fontSize = v; doLabelGraphics = 1; } } else if (streq(s->name, "fontcolor")) { /* fontColor */ if (*(v = agxget (ep, s))) { attrs.fontColor = v; doLabelGraphics = 1; } } else { v = agxget (ep, s); emitAttr (s->name, v, outFile, ix); } } /* Then, print them, if any */ if (doGraphics) { fprintf (outFile, " graphics [\n"); if (attrs.pos) { emitSpline (attrs.pos, outFile, ix+1); } if (attrs.flags & INVIS) { emitInt ("visible", 0, outFile, ix+1); } if (attrs.fill) { emitAttr ("fill", attrs.fill, outFile, ix+1); } if (attrs.width) { emitAttr ("width", attrs.width, outFile, ix+1); } if (attrs.arrowhead) { emitAttr ("targetArrow", attrs.arrowhead, outFile, ix+1); } if (attrs.arrowtail) { emitAttr ("sourceArrow", attrs.arrowtail, outFile, ix+1); } if (attrs.flags & DASH) { emitAttr ("style", "dashed", outFile, ix+1); } else if (attrs.flags & DOT) { emitAttr ("style", "dotted", outFile, ix+1); } else if (attrs.flags & LINE) { emitAttr ("style", "line", outFile, ix+1); } if (attrs.arrow) { if (streq(attrs.arrow,"forward")) emitAttr ("arrow", "first", outFile, ix+1); else if (streq(attrs.arrow,"back")) emitAttr ("arrow", "last", outFile, ix+1); else if (streq(attrs.arrow,"both")) emitAttr ("arrow", "both", outFile, ix+1); else if (streq(attrs.arrow,"none")) emitAttr ("arrow", "none", outFile, ix+1); } fprintf (outFile, " ]\n"); } if (doLabelGraphics) { fprintf (outFile, " LabelGraphics [\n"); if (label) emitAttr ("text", label, outFile, ix+1); if (attrs.fontColor) { emitAttr ("fontColor", attrs.fontColor, outFile, ix+1); } if (attrs.fontSize) { emitAttr ("fontSize", attrs.fontSize, outFile, ix+1); } if (attrs.fontName) { emitAttr ("fontName", attrs.fontName, outFile, ix+1); } fprintf (outFile, " ]\n"); } }
int ggen_read_graph(igraph_t *g,FILE *input) { Agraph_t *cg; Agnode_t *v; Agedge_t *e; igraph_vector_t edges; igraph_vector_t vertices; int err; unsigned long esize; unsigned long vsize; unsigned long from, to; igraph_integer_t eid; Agsym_t *att; /* read the graph */ cg = agread((void *)input,NULL); if(!cg) return 1; if(!agisdirected(cg)) { error("Input graph is undirected\n"); err = 1; goto error_d; } /* init edge array */ err = igraph_vector_init(&edges,2*agnedges(cg)); if(err) goto error_d; err = igraph_vector_init(&vertices,agnnodes(cg)); if(err) goto error_de; /* init igraph */ igraph_empty(g,agnnodes(cg),1); /* asign id to each vertex */ vsize = 0; for(v = agfstnode(cg); v; v = agnxtnode(cg,v)) VECTOR(vertices)[vsize++] = AGID(v); /* loop through each edge */ esize = 0; for(v = agfstnode(cg); v; v = agnxtnode(cg,v)) { from = find_id(AGID(v),vertices,vsize); for(e = agfstout(cg,v); e; e = agnxtout(cg,e)) { to = find_id(AGID(aghead(e)),vertices,vsize); VECTOR(edges)[esize++] = from; VECTOR(edges)[esize++] = to; } } /* finish the igraph */ err = igraph_add_edges(g,&edges,NULL); if(err) goto error; /* read graph properties */ att = agnxtattr(cg,AGRAPH,NULL); while(att != NULL) { /* copy this attribute to igraph */ SETGAS(g,att->name,agxget(cg,att)); att = agnxtattr(cg,AGRAPH,att); } /* we keep the graph name using a special attribute */ SETGAS(g,GGEN_GRAPH_NAME_ATTR,agnameof(cg)); /* read vertex properties */ att = agnxtattr(cg,AGNODE,NULL); while(att != NULL) { /* iterate over all vertices for this attribute */ for(v = agfstnode(cg); v; v = agnxtnode(cg,v)) { from = find_id(AGID(v),vertices,vsize); SETVAS(g,att->name,from,agxget(v,att)); } att = agnxtattr(cg,AGNODE,att); } /* we keep each vertex name in a special attribute */ for(v = agfstnode(cg); v; v = agnxtnode(cg,v)) { from = find_id(AGID(v),vertices,vsize); SETVAS(g,GGEN_VERTEX_NAME_ATTR,from,agnameof(v)); } /* read edges properties */ att = agnxtattr(cg,AGEDGE,NULL); while(att != NULL) { /* the only way to iterate over all edges is to iterate * over the vertices */ for(v = agfstnode(cg); v; v = agnxtnode(cg,v)) { from = find_id(AGID(v),vertices,vsize); for(e = agfstout(cg,v); e; e = agnxtout(cg,e)) { to = find_id(AGID(aghead(e)),vertices,vsize); igraph_get_eid(g,&eid,from,to,1,0); SETEAS(g,att->name,eid,agxget(e,att)); } } att = agnxtattr(cg,AGEDGE,att); } goto cleanup; error: igraph_destroy(g); cleanup: igraph_vector_destroy(&vertices); error_de: igraph_vector_destroy(&edges); error_d: agclose(cg); return err; }
static void gv_graph_state(GVJ_t *job, graph_t *g) { #ifndef WITH_CGRAPH int i; #endif int j; Agsym_t *a; gv_argvlist_t *list; list = &(job->selected_obj_type_name); j = 0; if (g == agroot(g)) { if (agisdirected(g)) gv_argvlist_set_item(list, j++, s_digraph); else gv_argvlist_set_item(list, j++, s_graph); } else { gv_argvlist_set_item(list, j++, s_subgraph); } gv_argvlist_set_item(list, j++, agnameof(g)); list->argc = j; list = &(job->selected_obj_attributes); #ifndef WITH_CGRAPH for (i = 0, j = 0; i < dtsize(g->univ->globattr->dict); i++) { a = g->univ->globattr->list[i]; #else a = NULL; while ((a = agnxtattr(g, AGRAPH, a))) { #endif gv_argvlist_set_item(list, j++, a->name); #ifndef WITH_CGRAPH gv_argvlist_set_item(list, j++, agxget(g, a->index)); #else gv_argvlist_set_item(list, j++, agxget(g, a)); #endif gv_argvlist_set_item(list, j++, (char*)GVATTR_STRING); } list->argc = j; a = agfindgraphattr(g, s_href); if (!a) a = agfindgraphattr(g, s_URL); if (a) #ifndef WITH_CGRAPH job->selected_href = strdup_and_subst_obj(agxget(g, a->index), (void*)g); #else job->selected_href = strdup_and_subst_obj(agxget(g, a), (void*)g); #endif } static void gv_node_state(GVJ_t *job, node_t *n) { #ifndef WITH_CGRAPH int i; #endif int j; Agsym_t *a; Agraph_t *g; gv_argvlist_t *list; list = &(job->selected_obj_type_name); j = 0; gv_argvlist_set_item(list, j++, s_node); gv_argvlist_set_item(list, j++, agnameof(n)); list->argc = j; list = &(job->selected_obj_attributes); g = agroot(agraphof(n)); #ifndef WITH_CGRAPH for (i = 0, j = 0; i < dtsize(g->univ->nodeattr->dict); i++) { a = g->univ->nodeattr->list[i]; #else a = NULL; while ((a = agnxtattr(g, AGNODE, a))) { #endif gv_argvlist_set_item(list, j++, a->name); #ifndef WITH_CGRAPH gv_argvlist_set_item(list, j++, agxget(n, a->index)); #else gv_argvlist_set_item(list, j++, agxget(n, a)); #endif } list->argc = j; a = agfindnodeattr(agraphof(n), s_href); if (!a) a = agfindnodeattr(agraphof(n), s_URL); if (a) #ifndef WITH_CGRAPH job->selected_href = strdup_and_subst_obj(agxget(n, a->index), (void*)n); #else job->selected_href = strdup_and_subst_obj(agxget(n, a), (void*)n); #endif } static void gv_edge_state(GVJ_t *job, edge_t *e) { #ifndef WITH_CGRAPH int i; #endif int j; Agsym_t *a; Agraph_t *g; gv_argvlist_t *nlist, *alist; nlist = &(job->selected_obj_type_name); /* only tail, head, and key are strictly identifying properties, * but we commonly alse use edge kind (e.g. "->") and tailport,headport * in edge names */ j = 0; gv_argvlist_set_item(nlist, j++, s_edge); gv_argvlist_set_item(nlist, j++, agnameof(agtail(e))); j++; /* skip tailport slot for now */ gv_argvlist_set_item(nlist, j++, agisdirected(agraphof(agtail(e)))?"->":"--"); gv_argvlist_set_item(nlist, j++, agnameof(aghead(e))); j++; /* skip headport slot for now */ j++; /* skip key slot for now */ nlist->argc = j; alist = &(job->selected_obj_attributes); g = agroot(agraphof(aghead(e))); #ifndef WITH_CGRAPH for (i = 0, j = 0; i < dtsize(g->univ->edgeattr->dict); i++) { a = g->univ->edgeattr->list[i]; #else a = NULL; while ((a = agnxtattr(g, AGEDGE, a))) { #endif /* tailport and headport can be shown as part of the name, but they * are not identifying properties of the edge so we * also list them as modifyable attributes. */ if (strcmp(a->name,s_tailport) == 0) #ifndef WITH_CGRAPH gv_argvlist_set_item(nlist, 2, agxget(e, a->index)); #else gv_argvlist_set_item(nlist, 2, agxget(e, a)); #endif else if (strcmp(a->name,s_headport) == 0) #ifndef WITH_CGRAPH gv_argvlist_set_item(nlist, 5, agxget(e, a->index)); #else gv_argvlist_set_item(nlist, 5, agxget(e, a)); #endif /* key is strictly an identifying property to distinguish multiple * edges between the same node pair. Its non-writable, so * no need to list it as an attribute as well. */ else if (strcmp(a->name,s_key) == 0) { #ifndef WITH_CGRAPH gv_argvlist_set_item(nlist, 6, agxget(e, a->index)); #else gv_argvlist_set_item(nlist, 6, agxget(e, a)); #endif continue; } gv_argvlist_set_item(alist, j++, a->name); #ifndef WITH_CGRAPH gv_argvlist_set_item(alist, j++, agxget(e, a->index)); #else gv_argvlist_set_item(alist, j++, agxget(e, a)); #endif }