A fixed point library from Trenki http://www.trenki.net/content/view/17/1/ Slightly modified so that the fixed point data structure can automatically cast itself to float or int when used in an expression, and added the functionality to cast between precisions.

Committer:
madcowswe
Date:
Sun Nov 27 05:10:45 2011 +0000
Revision:
1:ac99b6f474a0
Parent:
0:ca79fb4a8165
Made it possible to cast to double

Who changed what in which revision?

UserRevisionLine numberNew contents of line
madcowswe 0:ca79fb4a8165 1 /* ISO C9x 7.18 Integer types <stdint.h>
madcowswe 0:ca79fb4a8165 2 * Based on ISO/IEC SC22/WG14 9899 Committee draft (SC22 N2794)
madcowswe 0:ca79fb4a8165 3 *
madcowswe 0:ca79fb4a8165 4 * THIS SOFTWARE IS NOT COPYRIGHTED
madcowswe 0:ca79fb4a8165 5 *
madcowswe 0:ca79fb4a8165 6 * Contributor: Danny Smith <danny_r_smith_2001@yahoo.co.nz>
madcowswe 0:ca79fb4a8165 7 *
madcowswe 0:ca79fb4a8165 8 * This source code is offered for use in the public domain. You may
madcowswe 0:ca79fb4a8165 9 * use, modify or distribute it freely.
madcowswe 0:ca79fb4a8165 10 *
madcowswe 0:ca79fb4a8165 11 * This code is distributed in the hope that it will be useful but
madcowswe 0:ca79fb4a8165 12 * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
madcowswe 0:ca79fb4a8165 13 * DISCLAIMED. This includes but is not limited to warranties of
madcowswe 0:ca79fb4a8165 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
madcowswe 0:ca79fb4a8165 15 *
madcowswe 0:ca79fb4a8165 16 * Date: 2000-12-02
madcowswe 0:ca79fb4a8165 17 */
madcowswe 0:ca79fb4a8165 18
madcowswe 0:ca79fb4a8165 19
madcowswe 0:ca79fb4a8165 20 #ifndef _STDINT_H
madcowswe 0:ca79fb4a8165 21 #define _STDINT_H
madcowswe 0:ca79fb4a8165 22 #define __need_wint_t
madcowswe 0:ca79fb4a8165 23 #define __need_wchar_t
madcowswe 0:ca79fb4a8165 24 #include <stddef.h>
madcowswe 0:ca79fb4a8165 25
madcowswe 0:ca79fb4a8165 26 /* 7.18.1.1 Exact-width integer types */
madcowswe 0:ca79fb4a8165 27 typedef signed char int8_t;
madcowswe 0:ca79fb4a8165 28 typedef unsigned char uint8_t;
madcowswe 0:ca79fb4a8165 29 typedef short int16_t;
madcowswe 0:ca79fb4a8165 30 typedef unsigned short uint16_t;
madcowswe 0:ca79fb4a8165 31 typedef int int32_t;
madcowswe 0:ca79fb4a8165 32 typedef unsigned uint32_t;
madcowswe 0:ca79fb4a8165 33 typedef long long int64_t;
madcowswe 0:ca79fb4a8165 34 typedef unsigned long long uint64_t;
madcowswe 0:ca79fb4a8165 35
madcowswe 0:ca79fb4a8165 36 /* 7.18.1.2 Minimum-width integer types */
madcowswe 0:ca79fb4a8165 37 typedef signed char int_least8_t;
madcowswe 0:ca79fb4a8165 38 typedef unsigned char uint_least8_t;
madcowswe 0:ca79fb4a8165 39 typedef short int_least16_t;
madcowswe 0:ca79fb4a8165 40 typedef unsigned short uint_least16_t;
madcowswe 0:ca79fb4a8165 41 typedef int int_least32_t;
madcowswe 0:ca79fb4a8165 42 typedef unsigned uint_least32_t;
madcowswe 0:ca79fb4a8165 43 typedef long long int_least64_t;
madcowswe 0:ca79fb4a8165 44 typedef unsigned long long uint_least64_t;
madcowswe 0:ca79fb4a8165 45
madcowswe 0:ca79fb4a8165 46 /* 7.18.1.3 Fastest minimum-width integer types
madcowswe 0:ca79fb4a8165 47 * Not actually guaranteed to be fastest for all purposes
madcowswe 0:ca79fb4a8165 48 * Here we use the exact-width types for 8 and 16-bit ints.
madcowswe 0:ca79fb4a8165 49 */
madcowswe 0:ca79fb4a8165 50 typedef char int_fast8_t;
madcowswe 0:ca79fb4a8165 51 typedef unsigned char uint_fast8_t;
madcowswe 0:ca79fb4a8165 52 typedef short int_fast16_t;
madcowswe 0:ca79fb4a8165 53 typedef unsigned short uint_fast16_t;
madcowswe 0:ca79fb4a8165 54 typedef int int_fast32_t;
madcowswe 0:ca79fb4a8165 55 typedef unsigned int uint_fast32_t;
madcowswe 0:ca79fb4a8165 56 typedef long long int_fast64_t;
madcowswe 0:ca79fb4a8165 57 typedef unsigned long long uint_fast64_t;
madcowswe 0:ca79fb4a8165 58
madcowswe 0:ca79fb4a8165 59 /* 7.18.1.4 Integer types capable of holding object pointers */
madcowswe 0:ca79fb4a8165 60 typedef int intptr_t;
madcowswe 0:ca79fb4a8165 61 typedef unsigned uintptr_t;
madcowswe 0:ca79fb4a8165 62
madcowswe 0:ca79fb4a8165 63 /* 7.18.1.5 Greatest-width integer types */
madcowswe 0:ca79fb4a8165 64 typedef long long intmax_t;
madcowswe 0:ca79fb4a8165 65 typedef unsigned long long uintmax_t;
madcowswe 0:ca79fb4a8165 66
madcowswe 0:ca79fb4a8165 67 /* 7.18.2 Limits of specified-width integer types */
madcowswe 0:ca79fb4a8165 68 #if !defined ( __cplusplus) || defined (__STDC_LIMIT_MACROS)
madcowswe 0:ca79fb4a8165 69
madcowswe 0:ca79fb4a8165 70 /* 7.18.2.1 Limits of exact-width integer types */
madcowswe 0:ca79fb4a8165 71 #define INT8_MIN (-128)
madcowswe 0:ca79fb4a8165 72 #define INT16_MIN (-32768)
madcowswe 0:ca79fb4a8165 73 #define INT32_MIN (-2147483647 - 1)
madcowswe 0:ca79fb4a8165 74 #define INT64_MIN (-9223372036854775807LL - 1)
madcowswe 0:ca79fb4a8165 75
madcowswe 0:ca79fb4a8165 76 #define INT8_MAX 127
madcowswe 0:ca79fb4a8165 77 #define INT16_MAX 32767
madcowswe 0:ca79fb4a8165 78 #define INT32_MAX 2147483647
madcowswe 0:ca79fb4a8165 79 #define INT64_MAX 9223372036854775807LL
madcowswe 0:ca79fb4a8165 80
madcowswe 0:ca79fb4a8165 81 #define UINT8_MAX 0xff /* 255U */
madcowswe 0:ca79fb4a8165 82 #define UINT16_MAX 0xffff /* 65535U */
madcowswe 0:ca79fb4a8165 83 #define UINT32_MAX 0xffffffff /* 4294967295U */
madcowswe 0:ca79fb4a8165 84 #define UINT64_MAX 0xffffffffffffffffULL /* 18446744073709551615ULL */
madcowswe 0:ca79fb4a8165 85
madcowswe 0:ca79fb4a8165 86 /* 7.18.2.2 Limits of minimum-width integer types */
madcowswe 0:ca79fb4a8165 87 #define INT_LEAST8_MIN INT8_MIN
madcowswe 0:ca79fb4a8165 88 #define INT_LEAST16_MIN INT16_MIN
madcowswe 0:ca79fb4a8165 89 #define INT_LEAST32_MIN INT32_MIN
madcowswe 0:ca79fb4a8165 90 #define INT_LEAST64_MIN INT64_MIN
madcowswe 0:ca79fb4a8165 91
madcowswe 0:ca79fb4a8165 92 #define INT_LEAST8_MAX INT8_MAX
madcowswe 0:ca79fb4a8165 93 #define INT_LEAST16_MAX INT16_MAX
madcowswe 0:ca79fb4a8165 94 #define INT_LEAST32_MAX INT32_MAX
madcowswe 0:ca79fb4a8165 95 #define INT_LEAST64_MAX INT64_MAX
madcowswe 0:ca79fb4a8165 96
madcowswe 0:ca79fb4a8165 97 #define UINT_LEAST8_MAX UINT8_MAX
madcowswe 0:ca79fb4a8165 98 #define UINT_LEAST16_MAX UINT16_MAX
madcowswe 0:ca79fb4a8165 99 #define UINT_LEAST32_MAX UINT32_MAX
madcowswe 0:ca79fb4a8165 100 #define UINT_LEAST64_MAX UINT64_MAX
madcowswe 0:ca79fb4a8165 101
madcowswe 0:ca79fb4a8165 102 /* 7.18.2.3 Limits of fastest minimum-width integer types */
madcowswe 0:ca79fb4a8165 103 #define INT_FAST8_MIN INT8_MIN
madcowswe 0:ca79fb4a8165 104 #define INT_FAST16_MIN INT16_MIN
madcowswe 0:ca79fb4a8165 105 #define INT_FAST32_MIN INT32_MIN
madcowswe 0:ca79fb4a8165 106 #define INT_FAST64_MIN INT64_MIN
madcowswe 0:ca79fb4a8165 107
madcowswe 0:ca79fb4a8165 108 #define INT_FAST8_MAX INT8_MAX
madcowswe 0:ca79fb4a8165 109 #define INT_FAST16_MAX INT16_MAX
madcowswe 0:ca79fb4a8165 110 #define INT_FAST32_MAX INT32_MAX
madcowswe 0:ca79fb4a8165 111 #define INT_FAST64_MAX INT64_MAX
madcowswe 0:ca79fb4a8165 112
madcowswe 0:ca79fb4a8165 113 #define UINT_FAST8_MAX UINT8_MAX
madcowswe 0:ca79fb4a8165 114 #define UINT_FAST16_MAX UINT16_MAX
madcowswe 0:ca79fb4a8165 115 #define UINT_FAST32_MAX UINT32_MAX
madcowswe 0:ca79fb4a8165 116 #define UINT_FAST64_MAX UINT64_MAX
madcowswe 0:ca79fb4a8165 117
madcowswe 0:ca79fb4a8165 118 /* 7.18.2.4 Limits of integer types capable of holding
madcowswe 0:ca79fb4a8165 119 object pointers */
madcowswe 0:ca79fb4a8165 120 #define INTPTR_MIN INT32_MIN
madcowswe 0:ca79fb4a8165 121 #define INTPTR_MAX INT32_MAX
madcowswe 0:ca79fb4a8165 122 #define UINTPTR_MAX UINT32_MAX
madcowswe 0:ca79fb4a8165 123
madcowswe 0:ca79fb4a8165 124 /* 7.18.2.5 Limits of greatest-width integer types */
madcowswe 0:ca79fb4a8165 125 #define INTMAX_MIN INT64_MIN
madcowswe 0:ca79fb4a8165 126 #define INTMAX_MAX INT64_MAX
madcowswe 0:ca79fb4a8165 127 #define UINTMAX_MAX UINT64_MAX
madcowswe 0:ca79fb4a8165 128
madcowswe 0:ca79fb4a8165 129 /* 7.18.3 Limits of other integer types */
madcowswe 0:ca79fb4a8165 130 #define PTRDIFF_MIN INT32_MIN
madcowswe 0:ca79fb4a8165 131 #define PTRDIFF_MAX INT32_MAX
madcowswe 0:ca79fb4a8165 132
madcowswe 0:ca79fb4a8165 133 #define SIG_ATOMIC_MIN INT32_MIN
madcowswe 0:ca79fb4a8165 134 #define SIG_ATOMIC_MAX INT32_MAX
madcowswe 0:ca79fb4a8165 135
madcowswe 0:ca79fb4a8165 136 #define SIZE_MAX UINT32_MAX
madcowswe 0:ca79fb4a8165 137
madcowswe 0:ca79fb4a8165 138 #ifndef WCHAR_MIN /* also in wchar.h */
madcowswe 0:ca79fb4a8165 139 #define WCHAR_MIN 0
madcowswe 0:ca79fb4a8165 140 #define WCHAR_MAX 0xffff /* UINT16_MAX */
madcowswe 0:ca79fb4a8165 141 #endif
madcowswe 0:ca79fb4a8165 142
madcowswe 0:ca79fb4a8165 143 /*
madcowswe 0:ca79fb4a8165 144 * wint_t is unsigned short for compatibility with MS runtime
madcowswe 0:ca79fb4a8165 145 */
madcowswe 0:ca79fb4a8165 146 #define WINT_MIN 0
madcowswe 0:ca79fb4a8165 147 #define WINT_MAX 0xffff /* UINT16_MAX */
madcowswe 0:ca79fb4a8165 148
madcowswe 0:ca79fb4a8165 149 #endif /* !defined ( __cplusplus) || defined __STDC_LIMIT_MACROS */
madcowswe 0:ca79fb4a8165 150
madcowswe 0:ca79fb4a8165 151
madcowswe 0:ca79fb4a8165 152 /* 7.18.4 Macros for integer constants */
madcowswe 0:ca79fb4a8165 153 #if !defined ( __cplusplus) || defined (__STDC_CONSTANT_MACROS)
madcowswe 0:ca79fb4a8165 154
madcowswe 0:ca79fb4a8165 155 /* 7.18.4.1 Macros for minimum-width integer constants
madcowswe 0:ca79fb4a8165 156
madcowswe 0:ca79fb4a8165 157 Accoding to Douglas Gwyn <gwyn@arl.mil>:
madcowswe 0:ca79fb4a8165 158 "This spec was changed in ISO/IEC 9899:1999 TC1; in ISO/IEC
madcowswe 0:ca79fb4a8165 159 9899:1999 as initially published, the expansion was required
madcowswe 0:ca79fb4a8165 160 to be an integer constant of precisely matching type, which
madcowswe 0:ca79fb4a8165 161 is impossible to accomplish for the shorter types on most
madcowswe 0:ca79fb4a8165 162 platforms, because C99 provides no standard way to designate
madcowswe 0:ca79fb4a8165 163 an integer constant with width less than that of type int.
madcowswe 0:ca79fb4a8165 164 TC1 changed this to require just an integer constant
madcowswe 0:ca79fb4a8165 165 *expression* with *promoted* type."
madcowswe 0:ca79fb4a8165 166 */
madcowswe 0:ca79fb4a8165 167
madcowswe 0:ca79fb4a8165 168 #define INT8_C(val) ((int8_t) + (val))
madcowswe 0:ca79fb4a8165 169 #define UINT8_C(val) ((uint8_t) + (val##U))
madcowswe 0:ca79fb4a8165 170 #define INT16_C(val) ((int16_t) + (val))
madcowswe 0:ca79fb4a8165 171 #define UINT16_C(val) ((uint16_t) + (val##U))
madcowswe 0:ca79fb4a8165 172
madcowswe 0:ca79fb4a8165 173 #define INT32_C(val) val##L
madcowswe 0:ca79fb4a8165 174 #define UINT32_C(val) val##UL
madcowswe 0:ca79fb4a8165 175 #define INT64_C(val) val##LL
madcowswe 0:ca79fb4a8165 176 #define UINT64_C(val) val##ULL
madcowswe 0:ca79fb4a8165 177
madcowswe 0:ca79fb4a8165 178 /* 7.18.4.2 Macros for greatest-width integer constants */
madcowswe 0:ca79fb4a8165 179 #define INTMAX_C(val) INT64_C(val)
madcowswe 0:ca79fb4a8165 180 #define UINTMAX_C(val) UINT64_C(val)
madcowswe 0:ca79fb4a8165 181
madcowswe 0:ca79fb4a8165 182 #endif /* !defined ( __cplusplus) || defined __STDC_CONSTANT_MACROS */
madcowswe 0:ca79fb4a8165 183
madcowswe 0:ca79fb4a8165 184 #endif