1 /* 2 * Copyright (c) 2004, 2005 by 3 * Ralf Corsepius, Ulm/Germany. All rights reserved. 4 * 5 * Permission to use, copy, modify, and distribute this software 6 * is freely granted, provided that this notice is preserved. 7 */ 8 9 /** 10 * @file inttypes.h 11 */ 12 13 #ifndef _INTTYPES_H 14 #define _INTTYPES_H 15 16 #include <newlib.h> 17 #include <sys/config.h> 18 #include <sys/_intsup.h> 19 #include "_ansi.h" 20 #include <stdint.h> 21 #define __need_wchar_t 22 #include <stddef.h> 23 24 #if __BSD_VISIBLE 25 #include <sys/_locale.h> 26 #endif 27 28 #define __STRINGIFY(a) #a 29 30 /* 8-bit types */ 31 #define __PRI8(x) __INT8 __STRINGIFY(x) 32 #define __PRI8LEAST(x) __LEAST8 __STRINGIFY(x) 33 #define __PRI8FAST(x) __FAST8 __STRINGIFY(x) 34 35 /* NOTICE: scanning 8-bit types requires use of the hh specifier 36 * which is only supported on newlib platforms that 37 * are built with C99 I/O format support enabled. If the flag in 38 * newlib.h hasn't been set during configuration to indicate this, the 8-bit 39 * scanning format macros are disabled here as they result in undefined 40 * behaviour which can include memory overwrite. Overriding the flag after the 41 * library has been built is not recommended as it will expose the underlying 42 * undefined behaviour. 43 */ 44 45 #if defined(_WANT_IO_C99_FORMATS) 46 #define __SCN8(x) __INT8 __STRINGIFY(x) 47 #define __SCN8LEAST(x) __LEAST8 __STRINGIFY(x) 48 #define __SCN8FAST(x) __FAST8 __STRINGIFY(x) 49 #endif /* _WANT_IO_C99_FORMATS */ 50 51 52 #define PRId8 __PRI8(d) 53 #define PRIi8 __PRI8(i) 54 #define PRIo8 __PRI8(o) 55 #define PRIu8 __PRI8(u) 56 #define PRIx8 __PRI8(x) 57 #define PRIX8 __PRI8(X) 58 59 /* Macros below are only enabled for a newlib built with C99 I/O format support. */ 60 #if defined(_WANT_IO_C99_FORMATS) 61 62 #define SCNd8 __SCN8(d) 63 #define SCNi8 __SCN8(i) 64 #define SCNo8 __SCN8(o) 65 #define SCNu8 __SCN8(u) 66 #define SCNx8 __SCN8(x) 67 68 #endif /* _WANT_IO_C99_FORMATS */ 69 70 71 #define PRIdLEAST8 __PRI8LEAST(d) 72 #define PRIiLEAST8 __PRI8LEAST(i) 73 #define PRIoLEAST8 __PRI8LEAST(o) 74 #define PRIuLEAST8 __PRI8LEAST(u) 75 #define PRIxLEAST8 __PRI8LEAST(x) 76 #define PRIXLEAST8 __PRI8LEAST(X) 77 78 /* Macros below are only enabled for a newlib built with C99 I/O format support. */ 79 #if defined(_WANT_IO_C99_FORMATS) 80 81 #define SCNdLEAST8 __SCN8LEAST(d) 82 #define SCNiLEAST8 __SCN8LEAST(i) 83 #define SCNoLEAST8 __SCN8LEAST(o) 84 #define SCNuLEAST8 __SCN8LEAST(u) 85 #define SCNxLEAST8 __SCN8LEAST(x) 86 87 #endif /* _WANT_IO_C99_FORMATS */ 88 89 #define PRIdFAST8 __PRI8FAST(d) 90 #define PRIiFAST8 __PRI8FAST(i) 91 #define PRIoFAST8 __PRI8FAST(o) 92 #define PRIuFAST8 __PRI8FAST(u) 93 #define PRIxFAST8 __PRI8FAST(x) 94 #define PRIXFAST8 __PRI8FAST(X) 95 96 /* Macros below are only enabled for a newlib built with C99 I/O format support. */ 97 #if defined(_WANT_IO_C99_FORMATS) 98 99 #define SCNdFAST8 __SCN8FAST(d) 100 #define SCNiFAST8 __SCN8FAST(i) 101 #define SCNoFAST8 __SCN8FAST(o) 102 #define SCNuFAST8 __SCN8FAST(u) 103 #define SCNxFAST8 __SCN8FAST(x) 104 105 #endif /* _WANT_IO_C99_FORMATS */ 106 107 /* 16-bit types */ 108 #define __PRI16(x) __INT16 __STRINGIFY(x) 109 #define __PRI16LEAST(x) __LEAST16 __STRINGIFY(x) 110 #define __PRI16FAST(x) __FAST16 __STRINGIFY(x) 111 #define __SCN16(x) __INT16 __STRINGIFY(x) 112 #define __SCN16LEAST(x) __LEAST16 __STRINGIFY(x) 113 #define __SCN16FAST(x) __FAST16 __STRINGIFY(x) 114 115 116 #define PRId16 __PRI16(d) 117 #define PRIi16 __PRI16(i) 118 #define PRIo16 __PRI16(o) 119 #define PRIu16 __PRI16(u) 120 #define PRIx16 __PRI16(x) 121 #define PRIX16 __PRI16(X) 122 123 #define SCNd16 __SCN16(d) 124 #define SCNi16 __SCN16(i) 125 #define SCNo16 __SCN16(o) 126 #define SCNu16 __SCN16(u) 127 #define SCNx16 __SCN16(x) 128 129 130 #define PRIdLEAST16 __PRI16LEAST(d) 131 #define PRIiLEAST16 __PRI16LEAST(i) 132 #define PRIoLEAST16 __PRI16LEAST(o) 133 #define PRIuLEAST16 __PRI16LEAST(u) 134 #define PRIxLEAST16 __PRI16LEAST(x) 135 #define PRIXLEAST16 __PRI16LEAST(X) 136 137 #define SCNdLEAST16 __SCN16LEAST(d) 138 #define SCNiLEAST16 __SCN16LEAST(i) 139 #define SCNoLEAST16 __SCN16LEAST(o) 140 #define SCNuLEAST16 __SCN16LEAST(u) 141 #define SCNxLEAST16 __SCN16LEAST(x) 142 143 144 #define PRIdFAST16 __PRI16FAST(d) 145 #define PRIiFAST16 __PRI16FAST(i) 146 #define PRIoFAST16 __PRI16FAST(o) 147 #define PRIuFAST16 __PRI16FAST(u) 148 #define PRIxFAST16 __PRI16FAST(x) 149 #define PRIXFAST16 __PRI16FAST(X) 150 151 #define SCNdFAST16 __SCN16FAST(d) 152 #define SCNiFAST16 __SCN16FAST(i) 153 #define SCNoFAST16 __SCN16FAST(o) 154 #define SCNuFAST16 __SCN16FAST(u) 155 #define SCNxFAST16 __SCN16FAST(x) 156 157 /* 32-bit types */ 158 #define __PRI32(x) __INT32 __STRINGIFY(x) 159 #define __SCN32(x) __INT32 __STRINGIFY(x) 160 #define __PRI32LEAST(x) __LEAST32 __STRINGIFY(x) 161 #define __SCN32LEAST(x) __LEAST32 __STRINGIFY(x) 162 #define __PRI32FAST(x) __FAST32 __STRINGIFY(x) 163 #define __SCN32FAST(x) __FAST32 __STRINGIFY(x) 164 165 #define PRId32 __PRI32(d) 166 #define PRIi32 __PRI32(i) 167 #define PRIo32 __PRI32(o) 168 #define PRIu32 __PRI32(u) 169 #define PRIx32 __PRI32(x) 170 #define PRIX32 __PRI32(X) 171 172 #define SCNd32 __SCN32(d) 173 #define SCNi32 __SCN32(i) 174 #define SCNo32 __SCN32(o) 175 #define SCNu32 __SCN32(u) 176 #define SCNx32 __SCN32(x) 177 178 179 #define PRIdLEAST32 __PRI32LEAST(d) 180 #define PRIiLEAST32 __PRI32LEAST(i) 181 #define PRIoLEAST32 __PRI32LEAST(o) 182 #define PRIuLEAST32 __PRI32LEAST(u) 183 #define PRIxLEAST32 __PRI32LEAST(x) 184 #define PRIXLEAST32 __PRI32LEAST(X) 185 186 #define SCNdLEAST32 __SCN32LEAST(d) 187 #define SCNiLEAST32 __SCN32LEAST(i) 188 #define SCNoLEAST32 __SCN32LEAST(o) 189 #define SCNuLEAST32 __SCN32LEAST(u) 190 #define SCNxLEAST32 __SCN32LEAST(x) 191 192 193 #define PRIdFAST32 __PRI32FAST(d) 194 #define PRIiFAST32 __PRI32FAST(i) 195 #define PRIoFAST32 __PRI32FAST(o) 196 #define PRIuFAST32 __PRI32FAST(u) 197 #define PRIxFAST32 __PRI32FAST(x) 198 #define PRIXFAST32 __PRI32FAST(X) 199 200 #define SCNdFAST32 __SCN32FAST(d) 201 #define SCNiFAST32 __SCN32FAST(i) 202 #define SCNoFAST32 __SCN32FAST(o) 203 #define SCNuFAST32 __SCN32FAST(u) 204 #define SCNxFAST32 __SCN32FAST(x) 205 206 207 /* 64-bit types */ 208 #define __PRI64(x) __INT64 __STRINGIFY(x) 209 #define __SCN64(x) __INT64 __STRINGIFY(x) 210 211 #define __PRI64LEAST(x) __LEAST64 __STRINGIFY(x) 212 #define __SCN64LEAST(x) __LEAST64 __STRINGIFY(x) 213 #define __PRI64FAST(x) __FAST64 __STRINGIFY(x) 214 #define __SCN64FAST(x) __FAST64 __STRINGIFY(x) 215 216 #if __int64_t_defined 217 #define PRId64 __PRI64(d) 218 #define PRIi64 __PRI64(i) 219 #define PRIo64 __PRI64(o) 220 #define PRIu64 __PRI64(u) 221 #define PRIx64 __PRI64(x) 222 #define PRIX64 __PRI64(X) 223 224 #define SCNd64 __SCN64(d) 225 #define SCNi64 __SCN64(i) 226 #define SCNo64 __SCN64(o) 227 #define SCNu64 __SCN64(u) 228 #define SCNx64 __SCN64(x) 229 #endif 230 231 #if __int_least64_t_defined 232 #define PRIdLEAST64 __PRI64LEAST(d) 233 #define PRIiLEAST64 __PRI64LEAST(i) 234 #define PRIoLEAST64 __PRI64LEAST(o) 235 #define PRIuLEAST64 __PRI64LEAST(u) 236 #define PRIxLEAST64 __PRI64LEAST(x) 237 #define PRIXLEAST64 __PRI64LEAST(X) 238 239 #define SCNdLEAST64 __SCN64LEAST(d) 240 #define SCNiLEAST64 __SCN64LEAST(i) 241 #define SCNoLEAST64 __SCN64LEAST(o) 242 #define SCNuLEAST64 __SCN64LEAST(u) 243 #define SCNxLEAST64 __SCN64LEAST(x) 244 #endif 245 246 #if __int_fast64_t_defined 247 #define PRIdFAST64 __PRI64FAST(d) 248 #define PRIiFAST64 __PRI64FAST(i) 249 #define PRIoFAST64 __PRI64FAST(o) 250 #define PRIuFAST64 __PRI64FAST(u) 251 #define PRIxFAST64 __PRI64FAST(x) 252 #define PRIXFAST64 __PRI64FAST(X) 253 254 #define SCNdFAST64 __SCN64FAST(d) 255 #define SCNiFAST64 __SCN64FAST(i) 256 #define SCNoFAST64 __SCN64FAST(o) 257 #define SCNuFAST64 __SCN64FAST(u) 258 #define SCNxFAST64 __SCN64FAST(x) 259 #endif 260 261 /* max-bit types */ 262 #if __have_long64 263 #define __PRIMAX(x) __STRINGIFY(l##x) 264 #define __SCNMAX(x) __STRINGIFY(l##x) 265 #elif __have_longlong64 266 #define __PRIMAX(x) __STRINGIFY(ll##x) 267 #define __SCNMAX(x) __STRINGIFY(ll##x) 268 #else 269 #define __PRIMAX(x) __STRINGIFY(x) 270 #define __SCNMAX(x) __STRINGIFY(x) 271 #endif 272 273 #define PRIdMAX __PRIMAX(d) 274 #define PRIiMAX __PRIMAX(i) 275 #define PRIoMAX __PRIMAX(o) 276 #define PRIuMAX __PRIMAX(u) 277 #define PRIxMAX __PRIMAX(x) 278 #define PRIXMAX __PRIMAX(X) 279 280 #define SCNdMAX __SCNMAX(d) 281 #define SCNiMAX __SCNMAX(i) 282 #define SCNoMAX __SCNMAX(o) 283 #define SCNuMAX __SCNMAX(u) 284 #define SCNxMAX __SCNMAX(x) 285 286 /* ptr types */ 287 #if defined (_INTPTR_EQ_LONGLONG) 288 # define __PRIPTR(x) __STRINGIFY(ll##x) 289 # define __SCNPTR(x) __STRINGIFY(ll##x) 290 #elif defined (_INTPTR_EQ_LONG) 291 # define __PRIPTR(x) __STRINGIFY(l##x) 292 # define __SCNPTR(x) __STRINGIFY(l##x) 293 #else 294 # define __PRIPTR(x) __STRINGIFY(x) 295 # define __SCNPTR(x) __STRINGIFY(x) 296 #endif 297 298 #define PRIdPTR __PRIPTR(d) 299 #define PRIiPTR __PRIPTR(i) 300 #define PRIoPTR __PRIPTR(o) 301 #define PRIuPTR __PRIPTR(u) 302 #define PRIxPTR __PRIPTR(x) 303 #define PRIXPTR __PRIPTR(X) 304 305 #define SCNdPTR __SCNPTR(d) 306 #define SCNiPTR __SCNPTR(i) 307 #define SCNoPTR __SCNPTR(o) 308 #define SCNuPTR __SCNPTR(u) 309 #define SCNxPTR __SCNPTR(x) 310 311 312 typedef struct { 313 intmax_t quot; 314 intmax_t rem; 315 } imaxdiv_t; 316 317 #ifdef __cplusplus 318 extern "C" { 319 #endif 320 321 extern intmax_t imaxabs(intmax_t); 322 extern imaxdiv_t imaxdiv(intmax_t __numer, intmax_t __denomer); 323 extern intmax_t strtoimax(const char *__restrict, char **__restrict, int); 324 extern uintmax_t strtoumax(const char *__restrict, char **__restrict, int); 325 extern intmax_t wcstoimax(const wchar_t *__restrict, wchar_t **__restrict, int); 326 extern uintmax_t wcstoumax(const wchar_t *__restrict, wchar_t **__restrict, int); 327 328 #if __BSD_VISIBLE 329 extern intmax_t strtoimax_l(const char *__restrict, char **_restrict, int, locale_t); 330 extern uintmax_t strtoumax_l(const char *__restrict, char **_restrict, int, locale_t); 331 extern intmax_t wcstoimax_l(const wchar_t *__restrict, wchar_t **_restrict, int, locale_t); 332 extern uintmax_t wcstoumax_l(const wchar_t *__restrict, wchar_t **_restrict, int, locale_t); 333 #endif 334 335 #ifdef __cplusplus 336 } 337 #endif 338 339 #endif 340