AVR Libc Home Page | AVR Libc Development Pages | ||||
Main Page | User Manual | Library Reference | FAQ | Alphabetical Index | Example Projects |
00001 /* Copyright (c) 2002,2004,2005 Marek Michalkiewicz 00002 Copyright (c) 2005, Carlos Lamas 00003 Copyright (c) 2005,2007 Joerg Wunsch 00004 All rights reserved. 00005 00006 Redistribution and use in source and binary forms, with or without 00007 modification, are permitted provided that the following conditions are met: 00008 00009 * Redistributions of source code must retain the above copyright 00010 notice, this list of conditions and the following disclaimer. 00011 00012 * Redistributions in binary form must reproduce the above copyright 00013 notice, this list of conditions and the following disclaimer in 00014 the documentation and/or other materials provided with the 00015 distribution. 00016 00017 * Neither the name of the copyright holders nor the names of 00018 contributors may be used to endorse or promote products derived 00019 from this software without specific prior written permission. 00020 00021 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 00022 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00023 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 00024 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 00025 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 00026 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 00027 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 00028 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 00029 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 00030 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 00031 POSSIBILITY OF SUCH DAMAGE. */ 00032 00033 /* $Id: stdint.h 1196 2007-01-23 15:34:58Z joerg_wunsch $ */ 00034 00035 /* 00036 * ISO/IEC 9899:1999 7.18 Integer types <stdint.h> 00037 */ 00038 00039 #ifndef __STDINT_H_ 00040 #define __STDINT_H_ 00041 00042 /** \file */ 00043 /** \defgroup avr_stdint <stdint.h>: Standard Integer Types 00044 \code #include <stdint.h> \endcode 00045 00046 Use [u]intN_t if you need exactly N bits. 00047 00048 Since these typedefs are mandated by the C99 standard, they are preferred 00049 over rolling your own typedefs. */ 00050 00051 /* 00052 * __USING_MINT8 is defined to 1 if the -mint8 option is in effect. 00053 */ 00054 #if __INT_MAX__ == 127 00055 # define __USING_MINT8 1 00056 #else 00057 # define __USING_MINT8 0 00058 #endif 00059 00060 /* Integer types */ 00061 00062 #if defined(__DOXYGEN__) 00063 00064 /* doxygen gets confused by the __attribute__ stuff */ 00065 00066 /** \name Exact-width integer types 00067 Integer types having exactly the specified width */ 00068 00069 /*@{*/ 00070 00071 /** \ingroup avr_stdint 00072 8-bit signed type. */ 00073 00074 typedef signed char int8_t; 00075 00076 /** \ingroup avr_stdint 00077 8-bit unsigned type. */ 00078 00079 typedef unsigned char uint8_t; 00080 00081 /** \ingroup avr_stdint 00082 16-bit signed type. */ 00083 00084 typedef signed int int16_t; 00085 00086 /** \ingroup avr_stdint 00087 16-bit unsigned type. */ 00088 00089 typedef unsigned int uint16_t; 00090 00091 /** \ingroup avr_stdint 00092 32-bit signed type. */ 00093 00094 typedef signed long int int32_t; 00095 00096 /** \ingroup avr_stdint 00097 32-bit unsigned type. */ 00098 00099 typedef unsigned long int uint32_t; 00100 00101 /** \ingroup avr_stdint 00102 64-bit signed type. 00103 \note This type is not available when the compiler 00104 option -mint8 is in effect. */ 00105 00106 typedef signed long long int int64_t; 00107 00108 /** \ingroup avr_stdint 00109 64-bit unsigned type. 00110 \note This type is not available when the compiler 00111 option -mint8 is in effect. */ 00112 00113 typedef unsigned long long int uint64_t; 00114 00115 /*@}*/ 00116 00117 #else /* !defined(__DOXYGEN__) */ 00118 00119 /* actual implementation goes here */ 00120 00121 typedef int int8_t __attribute__((__mode__(__QI__))); 00122 typedef unsigned int uint8_t __attribute__((__mode__(__QI__))); 00123 typedef int int16_t __attribute__ ((__mode__ (__HI__))); 00124 typedef unsigned int uint16_t __attribute__ ((__mode__ (__HI__))); 00125 typedef int int32_t __attribute__ ((__mode__ (__SI__))); 00126 typedef unsigned int uint32_t __attribute__ ((__mode__ (__SI__))); 00127 #if !__USING_MINT8 00128 typedef int int64_t __attribute__((__mode__(__DI__))); 00129 typedef unsigned int uint64_t __attribute__((__mode__(__DI__))); 00130 #endif 00131 00132 #endif /* defined(__DOXYGEN__) */ 00133 00134 /** \name Integer types capable of holding object pointers 00135 These allow you to declare variables of the same size as a pointer. */ 00136 00137 /*@{*/ 00138 00139 /** \ingroup avr_stdint 00140 Signed pointer compatible type. */ 00141 00142 typedef int16_t intptr_t; 00143 00144 /** \ingroup avr_stdint 00145 Unsigned pointer compatible type. */ 00146 00147 typedef uint16_t uintptr_t; 00148 00149 /*@}*/ 00150 00151 /** \name Minimum-width integer types 00152 Integer types having at least the specified width */ 00153 00154 /*@{*/ 00155 00156 /** \ingroup avr_stdint 00157 signed int with at least 8 bits. */ 00158 00159 typedef int8_t int_least8_t; 00160 00161 /** \ingroup avr_stdint 00162 unsigned int with at least 8 bits. */ 00163 00164 typedef uint8_t uint_least8_t; 00165 00166 /** \ingroup avr_stdint 00167 signed int with at least 16 bits. */ 00168 00169 typedef int16_t int_least16_t; 00170 00171 /** \ingroup avr_stdint 00172 unsigned int with at least 16 bits. */ 00173 00174 typedef uint16_t uint_least16_t; 00175 00176 /** \ingroup avr_stdint 00177 signed int with at least 32 bits. */ 00178 00179 typedef int32_t int_least32_t; 00180 00181 /** \ingroup avr_stdint 00182 unsigned int with at least 32 bits. */ 00183 00184 typedef uint32_t uint_least32_t; 00185 00186 #if !__USING_MINT8 || defined(__DOXYGEN__) 00187 /** \ingroup avr_stdint 00188 signed int with at least 64 bits. 00189 \note This type is not available when the compiler 00190 option -mint8 is in effect. */ 00191 00192 typedef int64_t int_least64_t; 00193 00194 /** \ingroup avr_stdint 00195 unsigned int with at least 64 bits. 00196 \note This type is not available when the compiler 00197 option -mint8 is in effect. */ 00198 00199 typedef uint64_t uint_least64_t; 00200 #endif 00201 00202 /*@}*/ 00203 00204 00205 /** \name Fastest minimum-width integer types 00206 Integer types being usually fastest having at least the specified width */ 00207 00208 /*@{*/ 00209 00210 /** \ingroup avr_stdint 00211 fastest signed int with at least 8 bits. */ 00212 00213 typedef int8_t int_fast8_t; 00214 00215 /** \ingroup avr_stdint 00216 fastest unsigned int with at least 8 bits. */ 00217 00218 typedef uint8_t uint_fast8_t; 00219 00220 /** \ingroup avr_stdint 00221 fastest signed int with at least 16 bits. */ 00222 00223 typedef int16_t int_fast16_t; 00224 00225 /** \ingroup avr_stdint 00226 fastest unsigned int with at least 16 bits. */ 00227 00228 typedef uint16_t uint_fast16_t; 00229 00230 /** \ingroup avr_stdint 00231 fastest signed int with at least 32 bits. */ 00232 00233 typedef int32_t int_fast32_t; 00234 00235 /** \ingroup avr_stdint 00236 fastest unsigned int with at least 32 bits. */ 00237 00238 typedef uint32_t uint_fast32_t; 00239 00240 #if !__USING_MINT8 || defined(__DOXYGEN__) 00241 /** \ingroup avr_stdint 00242 fastest signed int with at least 64 bits. 00243 \note This type is not available when the compiler 00244 option -mint8 is in effect. */ 00245 00246 typedef int64_t int_fast64_t; 00247 00248 /** \ingroup avr_stdint 00249 fastest unsigned int with at least 64 bits. 00250 \note This type is not available when the compiler 00251 option -mint8 is in effect. */ 00252 00253 typedef uint64_t uint_fast64_t; 00254 #endif 00255 00256 /*@}*/ 00257 00258 00259 /** \name Greatest-width integer types 00260 Types designating integer data capable of representing any value of 00261 any integer type in the corresponding signed or unsigned category */ 00262 00263 /*@{*/ 00264 00265 #if __USING_MINT8 00266 typedef int32_t intmax_t; 00267 00268 typedef uint32_t uintmax_t; 00269 #else /* !__USING_MINT8 */ 00270 /** \ingroup avr_stdint 00271 largest signed int available. */ 00272 00273 typedef int64_t intmax_t; 00274 00275 /** \ingroup avr_stdint 00276 largest unsigned int available. */ 00277 00278 typedef uint64_t uintmax_t; 00279 #endif /* __USING_MINT8 */ 00280 00281 /*@}*/ 00282 00283 /* Helping macro */ 00284 #ifndef __CONCAT 00285 #define __CONCATenate(left, right) left ## right 00286 #define __CONCAT(left, right) __CONCATenate(left, right) 00287 #endif 00288 00289 #if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) 00290 00291 /** \name Limits of specified-width integer types 00292 C++ implementations should define these macros only when 00293 __STDC_LIMIT_MACROS is defined before <stdint.h> is included */ 00294 00295 /*@{*/ 00296 00297 /** \ingroup avr_stdint 00298 largest positive value an int8_t can hold. */ 00299 00300 #define INT8_MAX 0x7f 00301 00302 /** \ingroup avr_stdint 00303 smallest negative value an int8_t can hold. */ 00304 00305 #define INT8_MIN (-INT8_MAX - 1) 00306 00307 /** \ingroup avr_stdint 00308 largest value an uint8_t can hold. */ 00309 00310 #define UINT8_MAX (__CONCAT(INT8_MAX, U) * 2U + 1U) 00311 00312 #if __USING_MINT8 00313 00314 #define INT16_MAX 0x7fffL 00315 #define INT16_MIN (-INT16_MAX - 1L) 00316 #define UINT16_MAX (__CONCAT(INT16_MAX, U) * 2UL + 1UL) 00317 00318 #define INT32_MAX 0x7fffffffLL 00319 #define INT32_MIN (-INT32_MAX - 1LL) 00320 #define UINT32_MAX (__CONCAT(INT32_MAX, U) * 2ULL + 1ULL) 00321 00322 #else /* !__USING_MINT8 */ 00323 00324 /** \ingroup avr_stdint 00325 largest positive value an int16_t can hold. */ 00326 00327 #define INT16_MAX 0x7fff 00328 00329 /** \ingroup avr_stdint 00330 smallest negative value an int16_t can hold. */ 00331 00332 #define INT16_MIN (-INT16_MAX - 1) 00333 00334 /** \ingroup avr_stdint 00335 largest value an uint16_t can hold. */ 00336 00337 #define UINT16_MAX (__CONCAT(INT16_MAX, U) * 2U + 1U) 00338 00339 /** \ingroup avr_stdint 00340 largest positive value an int32_t can hold. */ 00341 00342 #define INT32_MAX 0x7fffffffL 00343 00344 /** \ingroup avr_stdint 00345 smallest negative value an int32_t can hold. */ 00346 00347 #define INT32_MIN (-INT32_MAX - 1L) 00348 00349 /** \ingroup avr_stdint 00350 largest value an uint32_t can hold. */ 00351 00352 #define UINT32_MAX (__CONCAT(INT32_MAX, U) * 2UL + 1UL) 00353 00354 #endif /* __USING_MINT8 */ 00355 00356 /** \ingroup avr_stdint 00357 largest positive value an int64_t can hold. */ 00358 00359 #define INT64_MAX 0x7fffffffffffffffLL 00360 00361 /** \ingroup avr_stdint 00362 smallest negative value an int64_t can hold. */ 00363 00364 #define INT64_MIN (-INT64_MAX - 1LL) 00365 00366 /** \ingroup avr_stdint 00367 largest value an uint64_t can hold. */ 00368 00369 #define UINT64_MAX (__CONCAT(INT64_MAX, U) * 2ULL + 1ULL) 00370 00371 /*@}*/ 00372 00373 /** \name Limits of minimum-width integer types */ 00374 /*@{*/ 00375 00376 /** \ingroup avr_stdint 00377 largest positive value an int_least8_t can hold. */ 00378 00379 #define INT_LEAST8_MAX INT8_MAX 00380 00381 /** \ingroup avr_stdint 00382 smallest negative value an int_least8_t can hold. */ 00383 00384 #define INT_LEAST8_MIN INT8_MIN 00385 00386 /** \ingroup avr_stdint 00387 largest value an uint_least8_t can hold. */ 00388 00389 #define UINT_LEAST8_MAX UINT8_MAX 00390 00391 /** \ingroup avr_stdint 00392 largest positive value an int_least16_t can hold. */ 00393 00394 #define INT_LEAST16_MAX INT16_MAX 00395 00396 /** \ingroup avr_stdint 00397 smallest negative value an int_least16_t can hold. */ 00398 00399 #define INT_LEAST16_MIN INT16_MIN 00400 00401 /** \ingroup avr_stdint 00402 largest value an uint_least16_t can hold. */ 00403 00404 #define UINT_LEAST16_MAX UINT16_MAX 00405 00406 /** \ingroup avr_stdint 00407 largest positive value an int_least32_t can hold. */ 00408 00409 #define INT_LEAST32_MAX INT32_MAX 00410 00411 /** \ingroup avr_stdint 00412 smallest negative value an int_least32_t can hold. */ 00413 00414 #define INT_LEAST32_MIN INT32_MIN 00415 00416 /** \ingroup avr_stdint 00417 largest value an uint_least32_t can hold. */ 00418 00419 #define UINT_LEAST32_MAX UINT32_MAX 00420 00421 /** \ingroup avr_stdint 00422 largest positive value an int_least64_t can hold. */ 00423 00424 #define INT_LEAST64_MAX INT64_MAX 00425 00426 /** \ingroup avr_stdint 00427 smallest negative value an int_least64_t can hold. */ 00428 00429 #define INT_LEAST64_MIN INT64_MIN 00430 00431 /** \ingroup avr_stdint 00432 largest value an uint_least64_t can hold. */ 00433 00434 #define UINT_LEAST64_MAX UINT64_MAX 00435 00436 /*@}*/ 00437 00438 /** \name Limits of fastest minimum-width integer types */ 00439 00440 /*@{*/ 00441 00442 /** \ingroup avr_stdint 00443 largest positive value an int_fast8_t can hold. */ 00444 00445 #define INT_FAST8_MAX INT8_MAX 00446 00447 /** \ingroup avr_stdint 00448 smallest negative value an int_fast8_t can hold. */ 00449 00450 #define INT_FAST8_MIN INT8_MIN 00451 00452 /** \ingroup avr_stdint 00453 largest value an uint_fast8_t can hold. */ 00454 00455 #define UINT_FAST8_MAX UINT8_MAX 00456 00457 /** \ingroup avr_stdint 00458 largest positive value an int_fast16_t can hold. */ 00459 00460 #define INT_FAST16_MAX INT16_MAX 00461 00462 /** \ingroup avr_stdint 00463 smallest negative value an int_fast16_t can hold. */ 00464 00465 #define INT_FAST16_MIN INT16_MIN 00466 00467 /** \ingroup avr_stdint 00468 largest value an uint_fast16_t can hold. */ 00469 00470 #define UINT_FAST16_MAX UINT16_MAX 00471 00472 /** \ingroup avr_stdint 00473 largest positive value an int_fast32_t can hold. */ 00474 00475 #define INT_FAST32_MAX INT32_MAX 00476 00477 /** \ingroup avr_stdint 00478 smallest negative value an int_fast32_t can hold. */ 00479 00480 #define INT_FAST32_MIN INT32_MIN 00481 00482 /** \ingroup avr_stdint 00483 largest value an uint_fast32_t can hold. */ 00484 00485 #define UINT_FAST32_MAX UINT32_MAX 00486 00487 /** \ingroup avr_stdint 00488 largest positive value an int_fast64_t can hold. */ 00489 00490 #define INT_FAST64_MAX INT64_MAX 00491 00492 /** \ingroup avr_stdint 00493 smallest negative value an int_fast64_t can hold. */ 00494 00495 #define INT_FAST64_MIN INT64_MIN 00496 00497 /** \ingroup avr_stdint 00498 largest value an uint_fast64_t can hold. */ 00499 00500 #define UINT_FAST64_MAX UINT64_MAX 00501 00502 /*@}*/ 00503 00504 /** \name Limits of integer types capable of holding object pointers */ 00505 00506 /*@{*/ 00507 00508 /** \ingroup avr_stdint 00509 largest positive value an intptr_t can hold. */ 00510 00511 #define INTPTR_MAX INT16_MAX 00512 00513 /** \ingroup avr_stdint 00514 smallest negative value an intptr_t can hold. */ 00515 00516 #define INTPTR_MIN INT16_MIN 00517 00518 /** \ingroup avr_stdint 00519 largest value an uintptr_t can hold. */ 00520 00521 #define UINTPTR_MAX UINT16_MAX 00522 00523 /*@}*/ 00524 00525 /** \name Limits of greatest-width integer types */ 00526 00527 /*@{*/ 00528 00529 /** \ingroup avr_stdint 00530 largest positive value an intmax_t can hold. */ 00531 00532 #define INTMAX_MAX INT64_MAX 00533 00534 /** \ingroup avr_stdint 00535 smallest negative value an intmax_t can hold. */ 00536 00537 #define INTMAX_MIN INT64_MIN 00538 00539 /** \ingroup avr_stdint 00540 largest value an uintmax_t can hold. */ 00541 00542 #define UINTMAX_MAX UINT64_MAX 00543 00544 /*@}*/ 00545 00546 /** \name Limits of other integer types 00547 C++ implementations should define these macros only when 00548 __STDC_LIMIT_MACROS is defined before <stdint.h> is included */ 00549 00550 /*@{*/ 00551 00552 /** \ingroup avr_stdint 00553 largest positive value a ptrdiff_t can hold. */ 00554 00555 #define PTRDIFF_MAX INT16_MAX 00556 00557 /** \ingroup avr_stdint 00558 smallest negative value a ptrdiff_t can hold. */ 00559 00560 #define PTRDIFF_MIN INT16_MIN 00561 00562 00563 /* Limits of sig_atomic_t */ 00564 /* signal.h is currently not implemented (not avr/signal.h) */ 00565 00566 /** \ingroup avr_stdint 00567 largest positive value a sig_atomic_t can hold. */ 00568 00569 #define SIG_ATOMIC_MAX INT8_MAX 00570 00571 /** \ingroup avr_stdint 00572 smallest negative value a sig_atomic_t can hold. */ 00573 00574 #define SIG_ATOMIC_MIN INT8_MIN 00575 00576 00577 /** \ingroup avr_stdint 00578 largest value a size_t can hold. */ 00579 00580 #define SIZE_MAX (__CONCAT(INT16_MAX, U)) 00581 00582 00583 /* Limits of wchar_t */ 00584 /* wchar.h is currently not implemented */ 00585 /* #define WCHAR_MAX */ 00586 /* #define WCHAR_MIN */ 00587 00588 00589 /* Limits of wint_t */ 00590 /* wchar.h is currently not implemented */ 00591 /* #define WINT_MAX */ 00592 /* #define WINT_MIN */ 00593 00594 00595 #endif /* !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) */ 00596 00597 #if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) 00598 00599 /** \name Macros for integer constants 00600 C++ implementations should define these macros only when 00601 __STDC_CONSTANT_MACROS is defined before <stdint.h> is included. 00602 00603 These definitions are valid for integer constants without suffix and 00604 for macros defined as integer constant without suffix */ 00605 00606 /** \ingroup avr_stdint 00607 define a constant of type int8_t */ 00608 00609 #define INT8_C(value) ((int8_t) value) 00610 00611 /** \ingroup avr_stdint 00612 define a constant of type uint8_t */ 00613 00614 #define UINT8_C(value) ((uint8_t) __CONCAT(value, U)) 00615 00616 #if __USING_MINT8 00617 00618 #define INT16_C(value) __CONCAT(value, L) 00619 #define UINT16_C(value) __CONCAT(value, UL) 00620 00621 #define INT32_C(value) ((int32_t) __CONCAT(value, LL)) 00622 #define UINT32_C(value) ((uint32_t) __CONCAT(value, ULL)) 00623 00624 #else /* !__USING_MINT8 */ 00625 00626 /** \ingroup avr_stdint 00627 define a constant of type int16_t */ 00628 00629 #define INT16_C(value) value 00630 00631 /** \ingroup avr_stdint 00632 define a constant of type uint16_t */ 00633 00634 #define UINT16_C(value) __CONCAT(value, U) 00635 00636 /** \ingroup avr_stdint 00637 define a constant of type int32_t */ 00638 00639 #define INT32_C(value) __CONCAT(value, L) 00640 00641 /** \ingroup avr_stdint 00642 define a constant of type uint32_t */ 00643 00644 #define UINT32_C(value) __CONCAT(value, UL) 00645 00646 #endif /* __USING_MINT8 */ 00647 00648 /** \ingroup avr_stdint 00649 define a constant of type int64_t */ 00650 00651 #define INT64_C(value) __CONCAT(value, LL) 00652 00653 /** \ingroup avr_stdint 00654 define a constant of type uint64_t */ 00655 00656 #define UINT64_C(value) __CONCAT(value, ULL) 00657 00658 /** \ingroup avr_stdint 00659 define a constant of type intmax_t */ 00660 00661 #define INTMAX_C(value) __CONCAT(value, LL) 00662 00663 /** \ingroup avr_stdint 00664 define a constant of type uintmax_t */ 00665 00666 #define UINTMAX_C(value) __CONCAT(value, ULL) 00667 00668 /*@}*/ 00669 00670 #endif /* !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) */ 00671 00672 00673 #endif /* _STDINT_H_ */