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