]> granicus.if.org Git - graphviz/commitdiff
RectArea versions for systems with or w/o long long
authorDonald Caldwell <dfwc@research.att.com>
Sun, 8 Jan 2012 04:15:01 +0000 (23:15 -0500)
committerDonald Caldwell <dfwc@research.att.com>
Sun, 8 Jan 2012 04:15:01 +0000 (23:15 -0500)
AC_CHECK_SIZEOF macros added to configure.ac

configure.ac
lib/label/rectangle.c

index acbd2dee77e10d6a8cf33fd9106af012746ae207..a1d654b49ce998d9335c72d76fcbf72a280cfcfa 100644 (file)
@@ -3205,6 +3205,9 @@ else
 fi
 rm -f conftest*
 
+# -----------------------------------------------------------------------
+AC_CHECK_SIZEOF([long long])
+AC_CHECK_SIZEOF([int])
 # -----------------------------------------------------------------------
 
 # Generate Makefiles
index 94b06cc6a631cbaafd50aadfdc79836baf12d0b6..4364c99e6af53f8dc1f270a56a67454d634f5e13 100644 (file)
@@ -116,6 +116,9 @@ void PrintRect(Rect_t * r)
 /*-----------------------------------------------------------------------------
 | Calculate the n-dimensional area of a rectangle
 -----------------------------------------------------------------------------*/
+void agerror(char *);
+
+#if SIZEOF_LONG_LONG > SIZEOF_INT
 unsigned int RectArea(Rect_t * r)
 {
   register int i;
@@ -130,19 +133,55 @@ unsigned int RectArea(Rect_t * r)
      */
     area = 1;
     for (i = 0; i < NUMDIMS; i++) {
-#if 1  /* overflow check */
       long long a_test = area * r->boundary[i + NUMDIMS] - r->boundary[i];
       if( a_test > UINT_MAX) {
        agerror("label: area too large for rtree\n");
        return UINT_MAX;
       }
       area = a_test;
+    }
+    return area;
+}
 #else
-      area *= r->boundary[i + NUMDIMS] - r->boundary[i];
-#endif
+unsigned int RectArea(Rect_t * r)
+{
+  register int i;
+  unsigned int area=1, a=1;
+  assert(r);
+
+    if (Undefined(r)) return 0;
+
+    /*
+     * XXX add overflow checks
+     */
+    area = 1;
+    for (i = 0; i < NUMDIMS; i++) {
+      unsigned int b = r->boundary[i + NUMDIMS] - r->boundary[i];
+      a *= b;
+      if( (a / b ) != area) {
+       agerror("label: area too large for rtree\n");
+       return UINT_MAX;
+      }
+      area = a;
+    }
+    return area;
+}
+#endif /*SIZEOF_LONG_LONG > SIZEOF_INT*/
+#if 0 /*original code*/
+int RectArea(Rect_t * r)
+{
+    register int i, area=1;
+    assert(r);
+
+    if (Undefined(r))
+        return 0;
+    area = 1;
+    for (i = 0; i < NUMDIMS; i++) {
+        area *= r->boundary[i + NUMDIMS] - r->boundary[i];
     }
     return area;
 }
+#endif
 
 /*-----------------------------------------------------------------------------
 | Combine two rectangles, make one that includes both.