X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fxsize.h;h=341fb16ca796f796ff00f132050d331e56ff97c5;hb=35a32ee9550d22a932f1a71d89653e351405638d;hp=42aa68a2a90da1f77ad0e3a13be6d540b9d436e4;hpb=8224e3007771aa0ef666eb1ff1d2564208cc2c91;p=gnulib.git diff --git a/lib/xsize.h b/lib/xsize.h index 42aa68a2a..341fb16ca 100644 --- a/lib/xsize.h +++ b/lib/xsize.h @@ -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 @@ -37,11 +37,11 @@ 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