New function xmax.
authorBruno Haible <bruno@clisp.org>
Mon, 17 Nov 2003 14:37:27 +0000 (14:37 +0000)
committerBruno Haible <bruno@clisp.org>
Mon, 17 Nov 2003 14:37:27 +0000 (14:37 +0000)
lib/ChangeLog
lib/xsize.h

index 29fc9b9..85e3ced 100644 (file)
@@ -1,3 +1,8 @@
+2003-11-16  Bruno Haible  <bruno@clisp.org>
+
+       * xsize.h (xmax): New function.
+       (xsum, xsum3, xsum4): Declare as "pure" functions.
+
 2003-11-12  Paul Eggert  <eggert@twinsun.com>
 
        * xalloc.h: Do not include <limits.h> or <stdint.h>.
index 42aa68a..7634c6d 100644 (file)
    To avoid this, the functions and macros in this file check for overflow.
    The convention is that SIZE_MAX represents overflow.
    malloc (SIZE_MAX) is not guaranteed to fail -- think of a malloc
-   implementation that uses mmap --, it's recommended to use SIZE_OVERFLOW_P
-   before invoking malloc().
+   implementation that uses mmap --, it's recommended to use size_overflow_p()
+   or size_in_bounds_p() before invoking malloc().
    The example thus becomes:
       size_t size = xsum (header_size, xtimes (n, element_size));
-      void *p = (!SIZE_OVERFLOW_P (size) ? malloc (size) : NULL);
+      void *p = (size_in_bounds_p (size) ? malloc (size) : NULL);
 */
 
 /* Convert an arbitrary value >= 0 to type size_t.  */
@@ -50,6 +50,9 @@
 
 /* Sum of two sizes, with overflow check.  */
 static inline size_t
+#if __GNUC__ >= 3
+__attribute__ ((__pure__))
+#endif
 xsum (size_t size1, size_t size2)
 {
   size_t sum = size1 + size2;
@@ -58,6 +61,9 @@ xsum (size_t size1, size_t size2)
 
 /* Sum of three sizes, with overflow check.  */
 static inline size_t
+#if __GNUC__ >= 3
+__attribute__ ((__pure__))
+#endif
 xsum3 (size_t size1, size_t size2, size_t size3)
 {
   return xsum (xsum (size1, size2), size3);
@@ -65,11 +71,26 @@ xsum3 (size_t size1, size_t size2, size_t size3)
 
 /* Sum of four sizes, with overflow check.  */
 static inline size_t
+#if __GNUC__ >= 3
+__attribute__ ((__pure__))
+#endif
 xsum4 (size_t size1, size_t size2, size_t size3, size_t size4)
 {
   return xsum (xsum (xsum (size1, size2), size3), size4);
 }
 
+/* Maximum of two sizes, with overflow check.  */
+static inline size_t
+#if __GNUC__ >= 3
+__attribute__ ((__pure__))
+#endif
+xmax (size_t size1, size_t size2)
+{
+  /* No explicit check is needed here, because for any n:
+     max (SIZE_MAX, n) == SIZE_MAX and max (n, SIZE_MAX) == SIZE_MAX.  */
+  return (size1 >= size2 ? size1 : size2);
+}
+
 /* Multiplication of a count with an element size, with overflow check.
    The count must be >= 0 and the element size must be > 0.
    This is a macro, not an inline function, so that it works correctly even