1/* Copyright (C) 1997-2001, 2004, 2007 Free Software Foundation, Inc. 2 This file is part of the GNU C Library. 3 4 The GNU C Library is free software; you can redistribute it and/or 5 modify it under the terms of the GNU Lesser General Public 6 License as published by the Free Software Foundation; either 7 version 2.1 of the License, or (at your option) any later version. 8 9 The GNU C Library is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 Lesser General Public License for more details. 13 14 You should have received a copy of the GNU Lesser General Public 15 License along with the GNU C Library; if not, write to the Free 16 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 17 02111-1307 USA. */ 18 19/* 20 * ISO C99: 7.8 Format conversion of integer types <inttypes.h> 21 */ 22 23#ifndef _INTTYPES_H 24#define _INTTYPES_H 1 25 26#include <features.h> 27/* Get the type definitions. */ 28#include <stdint.h> 29 30#ifdef __UCLIBC_HAS_WCHAR__ 31/* Get a definition for wchar_t. But we must not define wchar_t itself. */ 32#ifndef ____gwchar_t_defined 33# ifdef __cplusplus 34# define __gwchar_t wchar_t 35# elif defined __WCHAR_TYPE__ 36typedef __WCHAR_TYPE__ __gwchar_t; 37# else 38# define __need_wchar_t 39# include <stddef.h> 40typedef wchar_t __gwchar_t; 41# endif 42# define ____gwchar_t_defined 1 43#endif 44#endif 45 46 47/* The ISO C99 standard specifies that these macros must only be 48 defined if explicitly requested. */ 49#if !defined __cplusplus || defined __STDC_FORMAT_MACROS 50 51# if __WORDSIZE == 64 52# define __PRI64_PREFIX "l" 53# define __PRIPTR_PREFIX "l" 54# else 55# define __PRI64_PREFIX "ll" 56# define __PRIPTR_PREFIX 57# endif 58 59/* Macros for printing format specifiers. */ 60 61/* Decimal notation. */ 62# define PRId8 "d" 63# define PRId16 "d" 64# define PRId32 "d" 65# define PRId64 __PRI64_PREFIX "d" 66 67# define PRIdLEAST8 "d" 68# define PRIdLEAST16 "d" 69# define PRIdLEAST32 "d" 70# define PRIdLEAST64 __PRI64_PREFIX "d" 71 72# define PRIdFAST8 "d" 73# define PRIdFAST16 __PRIPTR_PREFIX "d" 74# define PRIdFAST32 __PRIPTR_PREFIX "d" 75# define PRIdFAST64 __PRI64_PREFIX "d" 76 77 78# define PRIi8 "i" 79# define PRIi16 "i" 80# define PRIi32 "i" 81# define PRIi64 __PRI64_PREFIX "i" 82 83# define PRIiLEAST8 "i" 84# define PRIiLEAST16 "i" 85# define PRIiLEAST32 "i" 86# define PRIiLEAST64 __PRI64_PREFIX "i" 87 88# define PRIiFAST8 "i" 89# define PRIiFAST16 __PRIPTR_PREFIX "i" 90# define PRIiFAST32 __PRIPTR_PREFIX "i" 91# define PRIiFAST64 __PRI64_PREFIX "i" 92 93/* Octal notation. */ 94# define PRIo8 "o" 95# define PRIo16 "o" 96# define PRIo32 "o" 97# define PRIo64 __PRI64_PREFIX "o" 98 99# define PRIoLEAST8 "o" 100# define PRIoLEAST16 "o" 101# define PRIoLEAST32 "o" 102# define PRIoLEAST64 __PRI64_PREFIX "o" 103 104# define PRIoFAST8 "o" 105# define PRIoFAST16 __PRIPTR_PREFIX "o" 106# define PRIoFAST32 __PRIPTR_PREFIX "o" 107# define PRIoFAST64 __PRI64_PREFIX "o" 108 109/* Unsigned integers. */ 110# define PRIu8 "u" 111# define PRIu16 "u" 112# define PRIu32 "u" 113# define PRIu64 __PRI64_PREFIX "u" 114 115# define PRIuLEAST8 "u" 116# define PRIuLEAST16 "u" 117# define PRIuLEAST32 "u" 118# define PRIuLEAST64 __PRI64_PREFIX "u" 119 120# define PRIuFAST8 "u" 121# define PRIuFAST16 __PRIPTR_PREFIX "u" 122# define PRIuFAST32 __PRIPTR_PREFIX "u" 123# define PRIuFAST64 __PRI64_PREFIX "u" 124 125/* lowercase hexadecimal notation. */ 126# define PRIx8 "x" 127# define PRIx16 "x" 128# define PRIx32 "x" 129# define PRIx64 __PRI64_PREFIX "x" 130 131# define PRIxLEAST8 "x" 132# define PRIxLEAST16 "x" 133# define PRIxLEAST32 "x" 134# define PRIxLEAST64 __PRI64_PREFIX "x" 135 136# define PRIxFAST8 "x" 137# define PRIxFAST16 __PRIPTR_PREFIX "x" 138# define PRIxFAST32 __PRIPTR_PREFIX "x" 139# define PRIxFAST64 __PRI64_PREFIX "x" 140 141/* UPPERCASE hexadecimal notation. */ 142# define PRIX8 "X" 143# define PRIX16 "X" 144# define PRIX32 "X" 145# define PRIX64 __PRI64_PREFIX "X" 146 147# define PRIXLEAST8 "X" 148# define PRIXLEAST16 "X" 149# define PRIXLEAST32 "X" 150# define PRIXLEAST64 __PRI64_PREFIX "X" 151 152# define PRIXFAST8 "X" 153# define PRIXFAST16 __PRIPTR_PREFIX "X" 154# define PRIXFAST32 __PRIPTR_PREFIX "X" 155# define PRIXFAST64 __PRI64_PREFIX "X" 156 157 158/* Macros for printing `intmax_t' and `uintmax_t'. */ 159# define PRIdMAX __PRI64_PREFIX "d" 160# define PRIiMAX __PRI64_PREFIX "i" 161# define PRIoMAX __PRI64_PREFIX "o" 162# define PRIuMAX __PRI64_PREFIX "u" 163# define PRIxMAX __PRI64_PREFIX "x" 164# define PRIXMAX __PRI64_PREFIX "X" 165 166 167/* Macros for printing `intptr_t' and `uintptr_t'. */ 168# define PRIdPTR __PRIPTR_PREFIX "d" 169# define PRIiPTR __PRIPTR_PREFIX "i" 170# define PRIoPTR __PRIPTR_PREFIX "o" 171# define PRIuPTR __PRIPTR_PREFIX "u" 172# define PRIxPTR __PRIPTR_PREFIX "x" 173# define PRIXPTR __PRIPTR_PREFIX "X" 174 175 176/* Macros for scanning format specifiers. */ 177 178/* Signed decimal notation. */ 179# define SCNd8 "hhd" 180# define SCNd16 "hd" 181# define SCNd32 "d" 182# define SCNd64 __PRI64_PREFIX "d" 183 184# define SCNdLEAST8 "hhd" 185# define SCNdLEAST16 "hd" 186# define SCNdLEAST32 "d" 187# define SCNdLEAST64 __PRI64_PREFIX "d" 188 189# define SCNdFAST8 "hhd" 190# define SCNdFAST16 __PRIPTR_PREFIX "d" 191# define SCNdFAST32 __PRIPTR_PREFIX "d" 192# define SCNdFAST64 __PRI64_PREFIX "d" 193 194/* Signed decimal notation. */ 195# define SCNi8 "hhi" 196# define SCNi16 "hi" 197# define SCNi32 "i" 198# define SCNi64 __PRI64_PREFIX "i" 199 200# define SCNiLEAST8 "hhi" 201# define SCNiLEAST16 "hi" 202# define SCNiLEAST32 "i" 203# define SCNiLEAST64 __PRI64_PREFIX "i" 204 205# define SCNiFAST8 "hhi" 206# define SCNiFAST16 __PRIPTR_PREFIX "i" 207# define SCNiFAST32 __PRIPTR_PREFIX "i" 208# define SCNiFAST64 __PRI64_PREFIX "i" 209 210/* Unsigned decimal notation. */ 211# define SCNu8 "hhu" 212# define SCNu16 "hu" 213# define SCNu32 "u" 214# define SCNu64 __PRI64_PREFIX "u" 215 216# define SCNuLEAST8 "hhu" 217# define SCNuLEAST16 "hu" 218# define SCNuLEAST32 "u" 219# define SCNuLEAST64 __PRI64_PREFIX "u" 220 221# define SCNuFAST8 "hhu" 222# define SCNuFAST16 __PRIPTR_PREFIX "u" 223# define SCNuFAST32 __PRIPTR_PREFIX "u" 224# define SCNuFAST64 __PRI64_PREFIX "u" 225 226/* Octal notation. */ 227# define SCNo8 "hho" 228# define SCNo16 "ho" 229# define SCNo32 "o" 230# define SCNo64 __PRI64_PREFIX "o" 231 232# define SCNoLEAST8 "hho" 233# define SCNoLEAST16 "ho" 234# define SCNoLEAST32 "o" 235# define SCNoLEAST64 __PRI64_PREFIX "o" 236 237# define SCNoFAST8 "hho" 238# define SCNoFAST16 __PRIPTR_PREFIX "o" 239# define SCNoFAST32 __PRIPTR_PREFIX "o" 240# define SCNoFAST64 __PRI64_PREFIX "o" 241 242/* Hexadecimal notation. */ 243# define SCNx8 "hhx" 244# define SCNx16 "hx" 245# define SCNx32 "x" 246# define SCNx64 __PRI64_PREFIX "x" 247 248# define SCNxLEAST8 "hhx" 249# define SCNxLEAST16 "hx" 250# define SCNxLEAST32 "x" 251# define SCNxLEAST64 __PRI64_PREFIX "x" 252 253# define SCNxFAST8 "hhx" 254# define SCNxFAST16 __PRIPTR_PREFIX "x" 255# define SCNxFAST32 __PRIPTR_PREFIX "x" 256# define SCNxFAST64 __PRI64_PREFIX "x" 257 258 259/* Macros for scanning `intmax_t' and `uintmax_t'. */ 260# define SCNdMAX __PRI64_PREFIX "d" 261# define SCNiMAX __PRI64_PREFIX "i" 262# define SCNoMAX __PRI64_PREFIX "o" 263# define SCNuMAX __PRI64_PREFIX "u" 264# define SCNxMAX __PRI64_PREFIX "x" 265 266/* Macros for scaning `intptr_t' and `uintptr_t'. */ 267# define SCNdPTR __PRIPTR_PREFIX "d" 268# define SCNiPTR __PRIPTR_PREFIX "i" 269# define SCNoPTR __PRIPTR_PREFIX "o" 270# define SCNuPTR __PRIPTR_PREFIX "u" 271# define SCNxPTR __PRIPTR_PREFIX "x" 272 273#endif /* C++ && format macros */ 274 275 276__BEGIN_DECLS 277 278#if __WORDSIZE == 64 279 280/* We have to define the `uintmax_t' type using `ldiv_t'. */ 281typedef struct 282 { 283 long int quot; /* Quotient. */ 284 long int rem; /* Remainder. */ 285 } imaxdiv_t; 286 287#else 288 289/* We have to define the `uintmax_t' type using `lldiv_t'. */ 290typedef struct 291 { 292 long long int quot; /* Quotient. */ 293 long long int rem; /* Remainder. */ 294 } imaxdiv_t; 295 296#endif 297 298 299/* Compute absolute value of N. */ 300extern intmax_t imaxabs (intmax_t __n) __THROW __attribute__ ((__const__)); 301 302/* Return the `imaxdiv_t' representation of the value of NUMER over DENOM. */ 303extern imaxdiv_t imaxdiv (intmax_t __numer, intmax_t __denom) 304 __THROW __attribute__ ((__const__)); 305 306/* Like `strtol' but convert to `intmax_t'. */ 307extern intmax_t strtoimax (__const char *__restrict __nptr, 308 char **__restrict __endptr, int __base) __THROW; 309 310/* Like `strtoul' but convert to `uintmax_t'. */ 311extern uintmax_t strtoumax (__const char *__restrict __nptr, 312 char ** __restrict __endptr, int __base) __THROW; 313 314#ifdef __UCLIBC_HAS_WCHAR__ 315/* Like `wcstol' but convert to `intmax_t'. */ 316extern intmax_t wcstoimax (__const __gwchar_t *__restrict __nptr, 317 __gwchar_t **__restrict __endptr, int __base) 318 __THROW; 319 320/* Like `wcstoul' but convert to `uintmax_t'. */ 321extern uintmax_t wcstoumax (__const __gwchar_t *__restrict __nptr, 322 __gwchar_t ** __restrict __endptr, int __base) 323 __THROW; 324#endif 325 326#if 0 /*def __USE_EXTERN_INLINES*/ 327 328# if __WORDSIZE == 64 329 330extern long int __strtol_internal (__const char *__restrict __nptr, 331 char **__restrict __endptr, 332 int __base, int __group) 333 __THROW __nonnull ((1)) __wur; 334/* Like `strtol' but convert to `intmax_t'. */ 335__extern_inline intmax_t 336__NTH (strtoimax (__const char *__restrict nptr, char **__restrict endptr, 337 int base)) 338{ 339 return __strtol_internal (nptr, endptr, base, 0); 340} 341 342extern unsigned long int __strtoul_internal (__const char * 343 __restrict __nptr, 344 char ** __restrict __endptr, 345 int __base, int __group) 346 __THROW __nonnull ((1)) __wur; 347/* Like `strtoul' but convert to `uintmax_t'. */ 348__extern_inline uintmax_t 349__NTH (strtoumax (__const char *__restrict nptr, char **__restrict endptr, 350 int base)) 351{ 352 return __strtoul_internal (nptr, endptr, base, 0); 353} 354 355extern long int __wcstol_internal (__const __gwchar_t * __restrict __nptr, 356 __gwchar_t **__restrict __endptr, 357 int __base, int __group) 358 __THROW __nonnull ((1)) __wur; 359/* Like `wcstol' but convert to `intmax_t'. */ 360__extern_inline intmax_t 361__NTH (wcstoimax (__const __gwchar_t *__restrict nptr, 362 __gwchar_t **__restrict endptr, int base)) 363{ 364 return __wcstol_internal (nptr, endptr, base, 0); 365} 366 367extern unsigned long int __wcstoul_internal (__const __gwchar_t * 368 __restrict __nptr, 369 __gwchar_t ** 370 __restrict __endptr, 371 int __base, int __group) 372 __THROW __nonnull ((1)) __wur; 373/* Like `wcstoul' but convert to `uintmax_t'. */ 374__extern_inline uintmax_t 375__NTH (wcstoumax (__const __gwchar_t *__restrict nptr, 376 __gwchar_t **__restrict endptr, int base)) 377{ 378 return __wcstoul_internal (nptr, endptr, base, 0); 379} 380 381# else /* __WORDSIZE == 32 */ 382 383__extension__ 384extern long long int __strtoll_internal (__const char *__restrict __nptr, 385 char **__restrict __endptr, 386 int __base, int __group) 387 __THROW __nonnull ((1)) __wur; 388/* Like `strtol' but convert to `intmax_t'. */ 389__extern_inline intmax_t 390__NTH (strtoimax (__const char *__restrict nptr, char **__restrict endptr, 391 int base)) 392{ 393 return __strtoll_internal (nptr, endptr, base, 0); 394} 395 396__extension__ 397extern unsigned long long int __strtoull_internal (__const char * 398 __restrict __nptr, 399 char ** 400 __restrict __endptr, 401 int __base, 402 int __group) 403 __THROW __nonnull ((1)) __wur; 404/* Like `strtoul' but convert to `uintmax_t'. */ 405__extern_inline uintmax_t 406__NTH (strtoumax (__const char *__restrict nptr, char **__restrict endptr, 407 int base)) 408{ 409 return __strtoull_internal (nptr, endptr, base, 0); 410} 411 412__extension__ 413extern long long int __wcstoll_internal (__const __gwchar_t * 414 __restrict __nptr, 415 __gwchar_t **__restrict __endptr, 416 int __base, int __group) 417 __THROW __nonnull ((1)) __wur; 418/* Like `wcstol' but convert to `intmax_t'. */ 419__extern_inline intmax_t 420__NTH (wcstoimax (__const __gwchar_t *__restrict nptr, 421 __gwchar_t **__restrict endptr, int base)) 422{ 423 return __wcstoll_internal (nptr, endptr, base, 0); 424} 425 426 427__extension__ 428extern unsigned long long int __wcstoull_internal (__const __gwchar_t * 429 __restrict __nptr, 430 __gwchar_t ** 431 __restrict __endptr, 432 int __base, 433 int __group) 434 __THROW __nonnull ((1)) __wur; 435/* Like `wcstoul' but convert to `uintmax_t'. */ 436__extern_inline uintmax_t 437__NTH (wcstoumax (__const __gwchar_t *__restrict nptr, 438 __gwchar_t **__restrict endptr, int base)) 439{ 440 return __wcstoull_internal (nptr, endptr, base, 0); 441} 442 443# endif /* __WORDSIZE == 32 */ 444#endif /* Use extern inlines. */ 445 446__END_DECLS 447 448#endif /* inttypes.h */ 449