1*e71b7053SJung-uk Kim /* 2*e71b7053SJung-uk Kim * Copyright 2015-2016 The OpenSSL Project Authors. All Rights Reserved. 3*e71b7053SJung-uk Kim * 4*e71b7053SJung-uk Kim * Licensed under the OpenSSL license (the "License"). You may not use 5*e71b7053SJung-uk Kim * this file except in compliance with the License. You can obtain a copy 6*e71b7053SJung-uk Kim * in the file LICENSE in the source distribution or at 7*e71b7053SJung-uk Kim * https://www.openssl.org/source/license.html 8*e71b7053SJung-uk Kim */ 9*e71b7053SJung-uk Kim 10*e71b7053SJung-uk Kim #ifndef HEADER_NUMBERS_H 11*e71b7053SJung-uk Kim # define HEADER_NUMBERS_H 12*e71b7053SJung-uk Kim 13*e71b7053SJung-uk Kim # include <limits.h> 14*e71b7053SJung-uk Kim 15*e71b7053SJung-uk Kim # if (-1 & 3) == 0x03 /* Two's complement */ 16*e71b7053SJung-uk Kim 17*e71b7053SJung-uk Kim # define __MAXUINT__(T) ((T) -1) 18*e71b7053SJung-uk Kim # define __MAXINT__(T) ((T) ((((T) 1) << ((sizeof(T) * CHAR_BIT) - 1)) ^ __MAXUINT__(T))) 19*e71b7053SJung-uk Kim # define __MININT__(T) (-__MAXINT__(T) - 1) 20*e71b7053SJung-uk Kim 21*e71b7053SJung-uk Kim # elif (-1 & 3) == 0x02 /* One's complement */ 22*e71b7053SJung-uk Kim 23*e71b7053SJung-uk Kim # define __MAXUINT__(T) (((T) -1) + 1) 24*e71b7053SJung-uk Kim # define __MAXINT__(T) ((T) ((((T) 1) << ((sizeof(T) * CHAR_BIT) - 1)) ^ __MAXUINT__(T))) 25*e71b7053SJung-uk Kim # define __MININT__(T) (-__MAXINT__(T)) 26*e71b7053SJung-uk Kim 27*e71b7053SJung-uk Kim # elif (-1 & 3) == 0x01 /* Sign/magnitude */ 28*e71b7053SJung-uk Kim 29*e71b7053SJung-uk Kim # define __MAXINT__(T) ((T) (((((T) 1) << ((sizeof(T) * CHAR_BIT) - 2)) - 1) | (((T) 1) << ((sizeof(T) * CHAR_BIT) - 2)))) 30*e71b7053SJung-uk Kim # define __MAXUINT__(T) ((T) (__MAXINT__(T) | (((T) 1) << ((sizeof(T) * CHAR_BIT) - 1)))) 31*e71b7053SJung-uk Kim # define __MININT__(T) (-__MAXINT__(T)) 32*e71b7053SJung-uk Kim 33*e71b7053SJung-uk Kim # else 34*e71b7053SJung-uk Kim 35*e71b7053SJung-uk Kim # error "do not know the integer encoding on this architecture" 36*e71b7053SJung-uk Kim 37*e71b7053SJung-uk Kim # endif 38*e71b7053SJung-uk Kim 39*e71b7053SJung-uk Kim # ifndef INT8_MAX 40*e71b7053SJung-uk Kim # define INT8_MIN __MININT__(int8_t) 41*e71b7053SJung-uk Kim # define INT8_MAX __MAXINT__(int8_t) 42*e71b7053SJung-uk Kim # define UINT8_MAX __MAXUINT__(uint8_t) 43*e71b7053SJung-uk Kim # endif 44*e71b7053SJung-uk Kim 45*e71b7053SJung-uk Kim # ifndef INT16_MAX 46*e71b7053SJung-uk Kim # define INT16_MIN __MININT__(int16_t) 47*e71b7053SJung-uk Kim # define INT16_MAX __MAXINT__(int16_t) 48*e71b7053SJung-uk Kim # define UINT16_MAX __MAXUINT__(uint16_t) 49*e71b7053SJung-uk Kim # endif 50*e71b7053SJung-uk Kim 51*e71b7053SJung-uk Kim # ifndef INT32_MAX 52*e71b7053SJung-uk Kim # define INT32_MIN __MININT__(int32_t) 53*e71b7053SJung-uk Kim # define INT32_MAX __MAXINT__(int32_t) 54*e71b7053SJung-uk Kim # define UINT32_MAX __MAXUINT__(uint32_t) 55*e71b7053SJung-uk Kim # endif 56*e71b7053SJung-uk Kim 57*e71b7053SJung-uk Kim # ifndef INT64_MAX 58*e71b7053SJung-uk Kim # define INT64_MIN __MININT__(int64_t) 59*e71b7053SJung-uk Kim # define INT64_MAX __MAXINT__(int64_t) 60*e71b7053SJung-uk Kim # define UINT64_MAX __MAXUINT__(uint64_t) 61*e71b7053SJung-uk Kim # endif 62*e71b7053SJung-uk Kim 63*e71b7053SJung-uk Kim # ifndef SIZE_MAX 64*e71b7053SJung-uk Kim # define SIZE_MAX __MAXUINT__(size_t) 65*e71b7053SJung-uk Kim # endif 66*e71b7053SJung-uk Kim 67*e71b7053SJung-uk Kim #endif 68*e71b7053SJung-uk Kim 69