New module 'uniconv/u32-strconv-from-locale'.
[gnulib.git] / lib / xsize.h
index 4410193..341fb16 100644 (file)
@@ -14,7 +14,7 @@
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software Foundation,
-   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
 
 #ifndef _XSIZE_H
 #define _XSIZE_H
 #include <stddef.h>
 
 /* Get SIZE_MAX.  */
+#include <limits.h>
 #if HAVE_STDINT_H
 # include <stdint.h>
 #endif
-#ifndef SIZE_MAX
-# define SIZE_MAX ((size_t) -1)
-#endif
 
 /* The size of memory objects is often computed through expressions of
    type size_t. Example:
    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.  */
@@ -52,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;
@@ -60,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);
@@ -67,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