static void write_diffattr(FILE * fp, int indent, void *obj, void *par, Agdict_t * dict) { Agsym_t *a; int i; char *p, *q; int cnt = 0; for (i = 0; i < dtsize(dict->dict); i++) { a = dict->list[i]; if (a->printed == FALSE) continue; p = agxget(obj, a->index); if (par) q = agxget(par, a->index); else q = a->value; if (strcmp(p, q)) { if (cnt++ == 0) { tabover(fp, indent); fprintf(fp, "%s [", dict->name); } else { fprintf(fp, ",\n"); tabover(fp, indent + 1); } fprintf(fp, "%s=", agcanonical(a->name)); fprintf(fp, "%s", agcanonical(p)); } } if (cnt > 0) fprintf(fp, "];\n"); }
static void write_diffattr(FILE * fp, int indent, void *obj, void *par, Agdict_t * dict) { Agsym_t *a; int i; char *p, *q; int cnt = 0; for (i = 0; i < dtsize(dict->dict); i++) { a = dict->list[i]; if (a->printed == FALSE) continue; p = agxget(obj, a->index); if (par) q = agxget(par, a->index); else q = a->value; if (strcmp(p, q)) { if (cnt++ == 0) { tabover(fp, indent); agputs(dict->name, fp); agputs(" [", fp); } else { agputs(",\n", fp); tabover(fp, indent + 1); } agputs(agcanonical(a->name), fp); agputc('=', fp); agputs(agcanonical(p), fp); } } if (cnt > 0) agputs("];\n", fp); }
void agwrnode(Agraph_t * g, FILE * fp, Agnode_t * n, int full, int indent) { char *myval, *defval; int i, didwrite = FALSE; int nprint = 0; Agdict_t *d = n->graph->univ->nodeattr; Agsym_t *a; if (full) { for (i = 0; i < dtsize(d->dict); i++) { a = d->list[i]; if (a->printed == FALSE) continue; myval = agget(n, a->name); if (g == n->graph) defval = a->value; else defval = agget(g->proto->n, a->name); if (strcmp(defval, myval)) { if (didwrite == FALSE) { tabover(fp, indent); agputs(agcanonical(n->name), fp); didwrite = TRUE; } writeattr(fp, &nprint, a->name, myval); } } if (didwrite) { agputs(nprint > 0 ? "];\n" : ";\n", fp); return; } } if ((agfstout(g, n) == NULL) && (agfstin(g, n) == NULL)) { tabover(fp, indent); agputs(agcanonical(n->name), fp); agputs(";\n", fp); } }
static void write_subg(Agraph_t * g, FILE * fp, Agraph_t * par, int indent, printdict_t * state) { Agraph_t *subg, *meta; Agnode_t *n, *pn; Agedge_t *e, *pe; Dict_t *save_e, *save_n; if (indent) { tabover(fp, indent++); if (dtsearch(state->subgleft, g->meta_node)) { if (strncmp(g->name, "_anonymous", 10)) fprintf(fp, "subgraph %s {\n", agcanonical(g->name)); else fprintf(fp, "{\n"); /* no name printed for anonymous subg */ write_diffattr(fp, indent, g, par, g->univ->globattr); /* The root node and edge environment use the dictionaries, * not the proto node or edge, so the next level down must * record differences with the dictionaries. */ if (par == g->root) { pn = NULL; pe = NULL; } else { pn = par->proto->n; pe = par->proto->e; } write_diffattr(fp, indent, g->proto->n, pn, g->univ->nodeattr); write_diffattr(fp, indent, g->proto->e, pe, g->univ->edgeattr); dtdelete(state->subgleft, g->meta_node); } else { fprintf(fp, "subgraph %s;\n", agcanonical(g->name)); return; } } else write_diffattr(fp, ++indent, g, NULL, g->univ->globattr); save_n = state->n_insubg; save_e = state->e_insubg; meta = g->meta_node->graph; state->n_insubg = dtopen(&agNamedisc, Dttree); state->e_insubg = dtopen(&agOutdisc, Dttree); for (e = agfstout(meta, g->meta_node); e; e = agnxtout(meta, e)) { subg = agusergraph(e->head); write_subg(subg, fp, g, indent, state); } for (n = agfstnode(g); n; n = agnxtnode(g, n)) { if (dtsearch(state->nodesleft, n)) { agwrnode(g, fp, n, TRUE, indent); dtdelete(state->nodesleft, n); } else { if (dtsearch(state->n_insubg, n) == NULL) { agwrnode(g, fp, n, FALSE, indent); } } dtinsert(save_n, n); } dtdisc(g->outedges, &agEdgedisc, 0); /* sort by id */ for (e = (Agedge_t *) dtfirst(g->outedges); e; e = (Agedge_t *) dtnext(g->outedges, e)) { if (dtsearch(state->edgesleft, e)) { tabover(fp, indent); agwredge(g, fp, e, TRUE); dtdelete(state->edgesleft, e); } else { if (dtsearch(state->e_insubg, e) == NULL) { tabover(fp, indent); agwredge(g, fp, e, FALSE); } } dtinsert(save_e, e); } dtdisc(g->outedges, &agOutdisc, 0); /* sort by name */ dtclose(state->n_insubg); state->n_insubg = save_n; dtclose(state->e_insubg); state->e_insubg = save_e; if (indent > 1) { tabover(fp, indent - 1); fprintf(fp, "}\n"); } }