From 4ddb41cdcdfd3e70377cdaf7d63b1722aec855b2 Mon Sep 17 00:00:00 2001
From: erg <devnull@localhost>
Date: Tue, 17 Jan 2006 22:56:22 +0000
Subject: [PATCH] Fix node adjustment functions to have a return value
 indicated whether nodes were moved or not.

---
 lib/neatogen/adjust.c     | 31 ++++++++++++++++++-------------
 lib/neatogen/adjust.h     | 10 +++++-----
 lib/neatogen/constraint.c | 14 +++++++++-----
 3 files changed, 32 insertions(+), 23 deletions(-)

diff --git a/lib/neatogen/adjust.c b/lib/neatogen/adjust.c
index d79e1b09b..874a79bf3 100644
--- a/lib/neatogen/adjust.c
+++ b/lib/neatogen/adjust.c
@@ -726,7 +726,7 @@ static adjust_data *getAdjustMode(char *s)
  * Use flag value to determine if and how to remove
  * node overlaps.
  */
-void 
+int 
 removeOverlapAs(graph_t * G, char* flag)
 {
     /* int          userWindow = 0; */
@@ -736,13 +736,13 @@ removeOverlapAs(graph_t * G, char* flag)
     adjust_data *am;
 
     if (agnnodes(G) < 2)
-	return;
+	return 0;
     if (flag == NULL)
-	return;
+	return 0;
 
     am = getAdjustMode(flag);
     if (am->mode == AM_NONE)
-	return;
+	return 0;
 
     if (Verbose)
 	fprintf(stderr, "Adjusting %s using %s\n", G->name, am->print);
@@ -751,10 +751,10 @@ removeOverlapAs(graph_t * G, char* flag)
 /* start_timer(); */
 	switch (am->mode) {
 	case AM_NSCALE:
-	    scAdjust(G, 1);
+	    ret = scAdjust(G, 1);
 	    break;
 	case AM_SCALEXY:
-	    scAdjust(G, 0);
+	    ret = scAdjust(G, 0);
 	    break;
 	case AM_PUSH:
 	    /* scanAdjust (G, 1); */
@@ -773,13 +773,13 @@ removeOverlapAs(graph_t * G, char* flag)
 	    cAdjust(G, am->mode);
 	    break;
 	case AM_COMPRESS:
-	    scAdjust(G, -1);
+	    ret = scAdjust(G, -1);
 	    break;
 	default:		/* to silence warnings */
 	    break;
 	}
 /* fprintf (stderr, "%s %.4f sec\n", am->attrib, elapsed_sec()); */
-	return;
+	return ret;
     }
 
     /* create main array */
@@ -802,22 +802,27 @@ removeOverlapAs(graph_t * G, char* flag)
     sites = 0;
 /* fprintf (stderr, "old scale %.4f sec\n", elapsed_sec()); */
 
+    return ret;
 }
 
 /* removeOverlap:
  */
-void 
+int 
 removeOverlap(graph_t * G)
 {
-    removeOverlapAs(G, agget(G, "overlap"));
+    return (removeOverlapAs(G, agget(G, "overlap")));
 }
 
-void adjustNodes(graph_t * G)
+/* adjustNodes:
+ * Remove node overlap relying on graph's overlap attribute.
+ * Return non-zero if graph has changed.
+ */
+int adjustNodes(graph_t * G)
 {
     if (agnnodes(G) < 2)
-	return;
+	return 0;
     normalize(G);
-    removeOverlap (G);
+    return removeOverlap (G);
 }
 
 /* expFactor:
diff --git a/lib/neatogen/adjust.h b/lib/neatogen/adjust.h
index dec8d4b45..f2b9c8b5c 100644
--- a/lib/neatogen/adjust.h
+++ b/lib/neatogen/adjust.h
@@ -31,12 +31,12 @@ typedef enum {
 } adjust_mode;
 
     extern double expFactor(graph_t * G);
-    extern void adjustNodes(graph_t * G);
+    extern int adjustNodes(graph_t * G);
     extern void normalize(graph_t * g);
-    extern void removeOverlap(graph_t * G);
-    extern void removeOverlapAs(graph_t*, char*);
-    extern void cAdjust(graph_t *, int);
-    extern void scAdjust(graph_t *, int);
+    extern int removeOverlap(graph_t * G);
+    extern int removeOverlapAs(graph_t*, char*);
+    extern int cAdjust(graph_t *, int);
+    extern int scAdjust(graph_t *, int);
 
 #ifdef __cplusplus
 }
diff --git a/lib/neatogen/constraint.c b/lib/neatogen/constraint.c
index 387cb03ec..bb900a5a8 100644
--- a/lib/neatogen/constraint.c
+++ b/lib/neatogen/constraint.c
@@ -621,10 +621,10 @@ static void initItem(node_t * n, nitem * p, double margin)
  * mode = AM_ORTHO   => first X, then Y
  * mode = AM_ORTHO_YX   => first Y, then X
  */
-void cAdjust(graph_t * g, int mode)
+int cAdjust(graph_t * g, int mode)
 {
     double margin;
-    int i, nnodes = agnnodes(g);
+    int ret, i, nnodes = agnnodes(g);
     nitem *nlist = N_GNEW(nnodes, nitem);
     nitem *p = nlist;
     node_t *n;
@@ -680,8 +680,11 @@ void cAdjust(graph_t * g, int mode)
 	    ND_pos(n)[1] = PS2INCH(pt.y) / SCALE;
 	    p++;
 	}
+	ret = 1;
     }
+    else ret = 0;
     free(nlist);
+    return ret;
 }
 
 typedef struct {
@@ -853,7 +856,7 @@ static double computeScale(pointf * aarr, int m)
  * "Removing Node Overlapping in Graph Layout Using Constrained Optimization",
  * Constraints,8(2):143--172, 2003.
  */
-void scAdjust(graph_t * g, int equal)
+int scAdjust(graph_t * g, int equal)
 {
     int nnodes = agnnodes(g);
     info *nlist = N_GNEW(nnodes, info);
@@ -886,7 +889,7 @@ void scAdjust(graph_t * g, int equal)
 	s.x = s.y = compress(nlist, nnodes);
 	if (s.x == 0) {		/* overlaps exist */
 	    free(nlist);
-	    return;
+	    return 0;
 	}
 	fprintf(stderr, "compress %g \n", s.x);
     } else {
@@ -895,7 +898,7 @@ void scAdjust(graph_t * g, int equal)
 	if (m == 0) {		/* no overlaps */
 	    free(aarr);
 	    free(nlist);
-	    return;
+	    return 0;
 	}
 
 	if (equal) {
@@ -914,4 +917,5 @@ void scAdjust(graph_t * g, int equal)
     }
 
     free(nlist);
+    return 1;
 }
-- 
2.40.0