Annotation of coherent/f/usr/include/common/_limits.h, revision 1.1.1.1

1.1       root        1: #ifndef        __COMMON__LIMITS_H__
                      2: #define        __COMMON__LIMITS_H__
                      3: 
                      4: /*
                      5:  * This header file is the internal equivalent of the ISO C Standard header
                      6:  * file <limits.h>. It defines many similar constants that are useful in
                      7:  * system headers for parameterising definitions based on such things as
                      8:  * the representation ranges of various types, but the names of the constants
                      9:  * are prefixed with underscores to stay in the implementation namespace.
                     10:  *
                     11:  * Rather than just stating the constants, we calculate then from a small
                     12:  * set of fundamental parameters. Doing it this way will give the right
                     13:  * results as long as your preprocessor and compiler understand that ISO C
                     14:  * type rules. If they don't, well, this will tell you that.
                     15:  *
                     16:  * Note that the "fundamental" constants can be determined at run-time in
                     17:  * a portable fashion, but since we need them for the preprocessor we must
                     18:  * depend on someone running such a program and supplying them.
                     19:  *
                     20:  * The fundamental parameters:
                     21:  *     __CHAR_BIT      The number of bits in a character. While most systems
                     22:  *                     built in the 1990s have 8, others are possible.
                     23:  *     __SHORT_DIV     The factor by which to divide the number of bits in
                     24:  *                     an integer by to give the number of bits in a short.
                     25:  *     __TWOSCOMP      This contains 1 if the representation is twos-
                     26:  *                     complement for negative integers, 0 if we have a
                     27:  *                     sign-magnitude or ones-complement machine.
                     28:  *     __CHAR_SIGNED   1 if characters are signed, undefined if they are
                     29:  *                     unsigned.
                     30:  *
                     31:  * Parameters that can be inferred from the type system:
                     32:  *     __INT_BIT       The number of bits in an integer.
                     33:  *     __LONG_BIT      The number of bits in a long.
                     34:  */
                     35: 
                     36: #include <common/feature.h>
                     37: 
                     38: #if    __COHERENT__ || __BORLANDC__ || defined (GNUDOS)
                     39: 
                     40: # define       __CHAR_BIT      8
                     41: # define       __TWOSCOMP      1
                     42: 
                     43: #if    '\x80' < 0
                     44: # define       __CHAR_SIGNED   1
                     45: #endif
                     46: 
                     47: # if   __BORLANDC__
                     48: #  define      __SHORT_DIV     1
                     49: # else
                     50: #  define      __SHORT_DIV     2
                     51: # endif
                     52: 
                     53: #else
                     54: 
                     55: # error        The fundamental parameters of this system are not known.
                     56: 
                     57: #endif
                     58: 
                     59: #define        __TOP_BIT_INT(bytes)    (1U << (__CHAR_BIT * (bytes) - 1))
                     60: #define        __TOP_BIT_LONG(bytes)   (1UL << (__CHAR_BIT * (bytes) - 1))
                     61: 
                     62: #if    (~ 0U ^ (~ 0U / 2)) == __TOP_BIT_INT(1)
                     63: # define       __INT_BIT       (1 * __CHAR_BIT)
                     64: #elif  (~ 0U ^ (~ 0U / 2)) == __TOP_BIT_INT(2)
                     65: # define       __INT_BIT       (2 * __CHAR_BIT)
                     66: #elif  (~ 0U ^ (~ 0U / 2)) == __TOP_BIT_INT(4)
                     67: # define       __INT_BIT       (4 * __CHAR_BIT)
                     68: #elif  (~ 0U ^ (~ 0U / 2)) == __TOP_BIT_INT(8)
                     69: # define       __INT_BIT       (8 * __CHAR_BIT)
                     70: #else
                     71: # error        Cannot determine number of bits per int.
                     72: #endif
                     73: 
                     74: #if    (~ 0UL ^ (~ 0UL / 2)) == __TOP_BIT_LONG(1)
                     75: # define       __LONG_BIT      (1 * __CHAR_BIT)
                     76: #elif  (~ 0UL ^ (~ 0UL / 2)) == __TOP_BIT_LONG(2)
                     77: # define       __LONG_BIT      (2 * __CHAR_BIT)
                     78: #elif  (~ 0UL ^ (~ 0UL / 2)) == __TOP_BIT_LONG(4)
                     79: # define       __LONG_BIT      (4 * __CHAR_BIT)
                     80: #elif  (~ 0UL ^ (~ 0UL / 2)) == __TOP_BIT_LONG(8)
                     81: # define       __LONG_BIT      (8 * __CHAR_BIT)
                     82: #else
                     83: # error        Cannot determine number of bits per long.
                     84: #endif
                     85: 
                     86: #define        __SHRT_BIT      (__INT_BIT / __SHORT_DIV)
                     87: 
                     88: #define        __UCHAR_MAX     ((1U << (__CHAR_BIT - 1)) + \
                     89:                                 ((1U << (__CHAR_BIT - 1)) - 1))
                     90: #define        __SCHAR_MAX     ((1 << (__CHAR_BIT - 2)) + \
                     91:                                 ((1 << (__CHAR_BIT - 2)) - 1))
                     92: #define        __SCHAR_MIN     (- __SCHAR_MAX - __TWOSCOMP)
                     93: 
                     94: #if    __CHAR_SIGNED
                     95: # define       __CHAR_MAX      __SCHAR_MAX
                     96: # define       __CHAR_MIN      __SCHAR_MIN
                     97: #else
                     98: # define       __CHAR_MAX      __UCHAR_MAX
                     99: # define       __CHAR_MIN      0
                    100: #endif
                    101: 
                    102: #define        __USHRT_MAX     ((1U << (__SHRT_BIT - 1)) + \
                    103:                                 ((1U << (__SHRT_BIT - 1)) - 1))
                    104: #define        __SHRT_MAX      ((1 << (__SHRT_BIT - 2)) + \
                    105:                                 ((1 << (__SHRT_BIT - 2)) - 1))
                    106: #define        __SHRT_MIN      (- __SHRT_MAX - __TWOSCOMP)
                    107: 
                    108: #define        __UINT_MAX      ((1U << (__INT_BIT - 1)) + \
                    109:                                 ((1U << (__INT_BIT - 1)) - 1))
                    110: #define        __INT_MAX       ((1 << (__INT_BIT - 2)) + \
                    111:                                 ((1 << (__INT_BIT - 2)) - 1))
                    112: #define        __INT_MIN       (- __INT_MAX - __TWOSCOMP)
                    113: 
                    114: #define        __ULONG_MAX     ((1U << (__LONG_BIT - 1)) + \
                    115:                                 ((1U << (__LONG_BIT - 1)) - 1))
                    116: #define        __LONG_MAX      ((1 << (__LONG_BIT - 2)) + \
                    117:                                 ((1 << (__LONG_BIT - 2)) - 1))
                    118: #define        __LONG_MIN      (- __LONG_MAX - __TWOSCOMP)
                    119: 
                    120: 
                    121: /*
                    122:  * A fequent use of all the above shenanigans is to figure out a mapping from
                    123:  * the C data types to machine 8/16/32-bit specific idioms, where the actual
                    124:  * assignment of data types to machine widths is highly variable (perhaps even
                    125:  * controlled by a compiler switch).
                    126:  *
                    127:  * Here we create standard aliases for the 8-bit-multiple cases, which careful
                    128:  * programs can use token-pasting with to further parameterize things. If
                    129:  * other macros use the __CONCAT... () facility from <sys/ccompat.h> to create
                    130:  * type-encoded macro names, the extra level of indirection in the
                    131:  * preprocessor that comes from using a concatenation macro will cause the
                    132:  * following substitutions to be made before the final token is created, thus
                    133:  * automagically mapping from types into word sizes.
                    134:  *
                    135:  * Because the following information is mainly used in token-pasting, please
                    136:  * leave the decimal constants alone!
                    137:  */
                    138: 
                    139: #if    __CHAR_BIT == 8
                    140: # define       __CHAR          8
                    141: #endif
                    142: 
                    143: #if    __SHRT_BIT == 16
                    144: # define       __SHORT         16
                    145: #elif  __SHRT_BIT == 32
                    146: # define       __SHORT         32
                    147: #endif
                    148: 
                    149: #if    __INT_BIT == 16
                    150: # define       __INT           16
                    151: #elif  __INT_BIT == 32
                    152: # define       __INT           32
                    153: #elif  __INT_BIT == 64
                    154: # define       __INT           64
                    155: #endif
                    156: 
                    157: #if    __LONG_BIT == 32
                    158: # define       __LONG          32
                    159: #elif  __LONG_BIT == 64
                    160: # define       __LONG          64
                    161: #endif
                    162: 
                    163: #endif /* ! defined (__COMMON__LIMITS_H__) */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.