(file) Return to intsafe.h CVS log (file) (dir) Up to [OMI] / omi / pal

 1 krisbash 1.1 #ifndef _intsafe_h
 2              #define _intsafe_h
 3              
 4              #include "palcommon.h"
 5              
 6              PAL_BEGIN_EXTERNC
 7              
 8              #define INTSAFE_E_ARITHMETIC_OVERFLOW   ((HRESULT)0x80070216L)  // 0x216 = 534 = ERROR_ARITHMETIC_OVERFLOW
 9              #define _SIZE_T_ERROR   0xffffffff
10              
11              #ifndef SIZE_MAX
12              # ifdef PAL_64BIT
13              #  define SIZE_MAX (18446744073709551615UL)
14              # else
15              #  define SIZE_MAX (4294967295U)
16              # endif
17              #endif
18              
19              PAL_INLINE HRESULT
20              SizeTAdd(
21                  _In_ size_t Augend,
22 krisbash 1.1     _In_ size_t Addend,
23                  _Out_ _Deref_out_range_(==, Augend + Addend) size_t* pResult)
24              {
25                  HRESULT hr;
26              
27                  if ((Augend + Addend) >= Augend)
28                  {
29                      *pResult = (Augend + Addend);
30                      hr = S_OK;
31                  }
32                  else
33                  {
34                      *pResult = _SIZE_T_ERROR;
35                      hr = INTSAFE_E_ARITHMETIC_OVERFLOW;
36                  }
37                  return hr;
38              }
39              
40              PAL_INLINE HRESULT
41              SizeTMult(
42                  _In_ size_t Multiplicand,
43 krisbash 1.1     _In_ size_t Multiplier,
44                  _Out_ _Deref_out_range_(==, Multiplicand * Multiplier) size_t* pResult)
45              {
46                  HRESULT hr;
47                  if (Multiplier == 0 || Multiplicand == 0 || Multiplicand <= SIZE_MAX / Multiplier)
48                  {
49                      *pResult = Multiplicand * Multiplier;
50                      hr = S_OK;
51                  }
52                  else
53                  {
54                      *pResult = _SIZE_T_ERROR;
55                      hr = INTSAFE_E_ARITHMETIC_OVERFLOW;
56                  }
57                  return  hr;
58              }
59              
60              PAL_END_EXTERNC
61              
62              #endif /* _intsafe_h */

ViewCVS 0.9.2