gvprdir = $(pkgdatadir)/gvpr
-gvpr_DATA = addranks addrings anon attr bb bbox bipart binduce chkclusters \
- cliptree col collapse color cycle dechain deghist \
+gvpr_DATA = addedges addranks addrings anon attr bb bbox bipart binduce chkclusters \
+ chkedges cliptree col collapse color cycle dechain deghist \
deledges delmulti delnodes depath dijkstra \
flatten get-layers-list histogram group indent knbhd \
maxdeg path rotate scale scalexy span topon \
--- /dev/null
+/* Add edges from input graph to argument graph
+ * Does not add nodes.
+ */
+BEGIN{
+ graph_t g = readG(ARGV[0]);
+ node_t h, t;
+ edge_t e;
+}
+E {
+ if ((h = isNode(g,head.name)) && (t = isNode(g,tail.name))) {
+ if (!isEdge(t,h,"")) {
+ e = copy(g,$);
+ }
+ }
+}
+END {
+ write(g);
+}
+
+
--- /dev/null
+/* Looks for multiedges and loops, and output
+ * those found along with counts. If the -d flag
+ * is given, edge direction is taken into account.
+ */
+BEGIN{
+ char* ename;
+ char* n;
+ int doDir, cnt[];
+ int loopcnt[];
+ int nloops, nmulti;
+ if ((ARGC > 0) && (ARGV[0] == "-d"))
+ doDir = 1;
+ else
+ doDir = 0;
+}
+BEG_G{unset(cnt); unset(loopcnt); nloops = nmulti = 0;}
+E{
+ if (doDir || (tail.name <= head.name)) ename=tail.name+"_"+head.name;
+ else ename = head.name+"_"+tail.name;
+ if (tail == head) {
+ loopcnt[ename] += 1;
+ if (loopcnt[ename] == 1) nloops += 1;
+ }
+ else {
+ cnt[ename] += 1;
+ if (cnt[ename] == 2) nmulti += 1;
+ }
+}
+END_G{
+ printf ("graph %s: %d loops %d multiedges\n", $.name, nloops, nmulti);
+ for (cnt[n]) {
+ if (cnt[n] > 1)
+ printf ("%s : %d\n", n, cnt[n]);
+ }
+ for (loopcnt[n]) {
+ if (loopcnt[n] > 0)
+ printf ("%s : %d\n", n, loopcnt[n]);
+ }
+}
+