Mini Shell
/* 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]);
}
}
Zerion Mini Shell 1.0