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