stdint.h
Jeff Johnston
jjohnstn@redhat.com
Tue Sep 20 15:32:00 GMT 2005
Corinna Vinschen wrote:
> Guys,
>
> On Sep 20 00:25, Christopher Faylor wrote:
>
>>On Tue, Sep 20, 2005 at 04:47:27AM +0200, Ralf Corsepius wrote:
>>
>>>On Mon, 2005-09-19 at 22:11 -0400, Christopher Faylor wrote:
>>>
>>>>I really don't see any need to use the RTEMS stuff especially given the
>>>>"it's not broke" principle.
>>>
>>>Well, the RTEMS stdint.h/inttypes.h aren't specific to RTEMS.
>>
>>Again, since there is nothing wrong with the present cygwin
>>implementation, there is no reason to change what we have.
>
>
> First, Jeff, would you mind to wait a few hours before changing stuff
> which affects all targets like that? The whole process of checkin plus
> discussion took place in one single night from my timezone's point of view.
>
There should be no problem with a change like this. Every system should
be supplying and potentially overriding any header file specific to its
system. If Cygwin does not choose to have a libc/sys/cygwin directory,
it still has that obligation. There was no stdint.h header file in
existence for newlib. That means there is nothing to break with regards
to backward compatibility for "all targets". Adding the header file
allows more applications to build and multiple people have requested it.
As Shaun had correctly pointed out, the header file in RTEMS has been
used for a while and could be placed in the generic include directory.
Cygwin should, and is (according to Chris), overriding newlib's headers.
Now that said, the items you point out below need to be addressed or
marked by a todo comment.
> I was going to be a bit more relaxed about this issue than Chris, so
> I created a thorough testcase to check how this affects Cygwin. The
> attached, very simple testcase builds and runs fine using Cygwin's
> stdint.h/inttypes.h. FWIW, the same testcase runs fine on Linux with
> glibc.
>
> However, it doesn't even build when using RTMES stdint.h/inttypes.h,
> so I don't think the RTEMS stdint.h was ready for prime time:
>
> - All *fast* typedefs are missing (int_fast8_t, etc.) and all
> *FAST* definitions (INT_FAST8_MIN, etc.) are missing.
>
> This is marked as "todo" in the header comment.
>
> - A couple of disturbing warnings about INT32_MIN, INT64_MIN, INT64_MAX
> and the corresponding unsigned defnitions:
>
> INT32_MIN: warning: this decimal constant is unsigned only in ISO C90
> INT64_MIN: integer constant is so large that it is unsigned
> this decimal constant is unsigned only in ISO C90
> INT64_MAX: integer constant is too large for "long" type
> UINT32_MAX: warning: this decimal constant is unsigned only in ISO C90
> UINT64_MAX: warning: integer constant is so large that it is unsigned
> warning: this decimal constant is unsigned only in ISO C90
> warning: integer constant is too large for "long" type
>
> When uncommenting every other problem in the file, there's also a bug
> in evaluating the INT32*_MIN values:
>
> INT32_MIN, INTLEAST32_MIN are printed as the positive value
> 2147483648, not -2147483648.
>
> - All *LEAST* definitions are incorrect because RTEMS' stdint.h defines
> them omitting an underscore after the type:
>
> RTEMS: INTLEAST8_MIN
> SUSv3: INT_LEAST8_MIN
>
> - All INTPTR* definitions are missing (INTPTR_MIN, INTPTR_MAX, UINTPTR_MAX).
>
> - All INTMAX* definitions are missing (INTMAX_MIN, INTMAX_MAX, UINTMAX_MAX).
>
> - The condition, when to include limits.h and when not to include it,
> seems not to be foolproof. I get these error message as well, unless
> I manually include limits.h prior to including inttypes.h:
>
> stdint-test.c:296: error: `LONG_MAX' undeclared here (not in a function)
> stdint-test.c:299: error: `INT_MAX' undeclared here (not in a function)
>
> - Definitions of PTRDIFF_MIN and PTRDIFF_MAX are missing.
>
> - Definitions for WCHAR_MIN, WCHAR_MAX, WINT_MIN, WINT_MAX are missing.
>
> The missing WINT macros are marked as "todo" in the header comment.
>
> I didn't check if all PRI* and SCN* definitions have the right value, though.
>
Thanks for pointing out what needs to be done.
-- Jeff J.
>
> Corinna
>
>
>
> ------------------------------------------------------------------------
>
> #include <stdio.h>
> #include <inttypes.h>
>
> char *arr1[] = {
> PRId8,
> PRId16,
> PRId32,
> PRId64,
>
> PRIdLEAST8,
> PRIdLEAST16,
> PRIdLEAST32,
> PRIdLEAST64,
>
> PRIdFAST8,
> PRIdFAST16,
> PRIdFAST32,
> PRIdFAST64,
>
> PRIdMAX,
> PRIdPTR,
>
> PRIi8,
> PRIi16,
> PRIi32,
> PRIi64,
>
> PRIiLEAST8,
> PRIiLEAST16,
> PRIiLEAST32,
> PRIiLEAST64,
>
> PRIiFAST8,
> PRIiFAST16,
> PRIiFAST32,
> PRIiFAST64,
>
> PRIiMAX,
> PRIiPTR,
>
> /* fprintf() macros for unsigned integers */
>
> PRIo8,
> PRIo16,
> PRIo32,
> PRIo64,
>
> PRIoLEAST8,
> PRIoLEAST16,
> PRIoLEAST32,
> PRIoLEAST64,
>
> PRIoFAST8,
> PRIoFAST16,
> PRIoFAST32,
> PRIoFAST64,
>
> PRIoMAX,
> PRIoPTR,
>
> PRIu8,
> PRIu16,
> PRIu32,
> PRIu64,
>
> PRIuLEAST8,
> PRIuLEAST16,
> PRIuLEAST32,
> PRIuLEAST64,
>
> PRIuFAST8,
> PRIuFAST16,
> PRIuFAST32,
> PRIuFAST64,
>
> PRIuMAX,
> PRIuPTR,
>
> PRIx8,
> PRIx16,
> PRIx32,
> PRIx64,
>
> PRIxLEAST8,
> PRIxLEAST16,
> PRIxLEAST32,
> PRIxLEAST64,
>
> PRIxFAST8,
> PRIxFAST16,
> PRIxFAST32,
> PRIxFAST64,
>
> PRIxMAX,
> PRIxPTR,
>
> PRIX8,
> PRIX16,
> PRIX32,
> PRIX64,
>
> PRIXLEAST8,
> PRIXLEAST16,
> PRIXLEAST32,
> PRIXLEAST64,
>
> PRIXFAST8,
> PRIXFAST16,
> PRIXFAST32,
> PRIXFAST64,
>
> PRIXMAX,
> PRIXPTR,
>
> /* fscanf() macros for signed integers */
>
> SCNd8,
> SCNd16,
> SCNd32,
> SCNd64,
>
> SCNdLEAST8,
> SCNdLEAST16,
> SCNdLEAST32,
> SCNdLEAST64,
>
> SCNdFAST8,
> SCNdFAST16,
> SCNdFAST32,
> SCNdFAST64,
>
> SCNdMAX,
> SCNdPTR,
>
> SCNi8,
> SCNi16,
> SCNi32,
> SCNi64,
>
> SCNiLEAST8,
> SCNiLEAST16,
> SCNiLEAST32,
> SCNiLEAST64,
>
> SCNiFAST8,
> SCNiFAST16,
> SCNiFAST32,
> SCNiFAST64,
>
> SCNiMAX,
> SCNiPTR,
>
> /* fscanf() macros for unsigned integers */
>
> SCNo8,
> SCNo16,
> SCNo32,
> SCNo64,
>
> SCNoLEAST8,
> SCNoLEAST16,
> SCNoLEAST32,
> SCNoLEAST64,
>
> SCNoFAST8,
> SCNoFAST16,
> SCNoFAST32,
> SCNoFAST64,
>
> SCNoMAX,
> SCNoPTR,
>
> SCNu8,
> SCNu16,
> SCNu32,
> SCNu64,
>
> SCNuLEAST8,
> SCNuLEAST16,
> SCNuLEAST32,
> SCNuLEAST64,
>
> SCNuFAST8,
> SCNuFAST16,
> SCNuFAST32,
> SCNuFAST64,
>
> SCNuMAX,
> SCNuPTR,
>
> SCNx8,
> SCNx16,
> SCNx32,
> SCNx64,
>
> SCNxLEAST8,
> SCNxLEAST16,
> SCNxLEAST32,
> SCNxLEAST64,
>
> SCNxFAST8,
> SCNxFAST16,
> SCNxFAST32,
> SCNxFAST64,
>
> SCNxMAX,
> SCNxPTR,
> NULL
> };
>
> int arr2[] = {
> sizeof (wchar_t),
> sizeof (int8_t),
> sizeof (int16_t),
> sizeof (int32_t),
> sizeof (int64_t),
>
> sizeof (uint8_t),
> sizeof (uint16_t),
> sizeof (uint32_t),
> sizeof (uint64_t),
>
> /* Minimum-width integer types */
>
> sizeof (int_least8_t),
> sizeof (int_least16_t),
> sizeof (int_least32_t),
> sizeof (int_least64_t),
>
> sizeof (uint_least8_t),
> sizeof (uint_least16_t),
> sizeof (uint_least32_t),
> sizeof (uint_least64_t),
>
> /* Fastest minimum-width integer types */
>
> sizeof (int_fast8_t),
> sizeof (int_fast16_t),
> sizeof (int_fast32_t),
> sizeof (int_fast64_t),
>
> sizeof (uint_fast8_t),
> sizeof (uint_fast16_t),
> sizeof (uint_fast32_t),
> sizeof (uint_fast64_t),
>
> /* Integer types capable of holding object pointers */
>
> sizeof (intptr_t),
> sizeof (uintptr_t),
>
> /* Greatest-width integer types */
>
> sizeof (intmax_t),
> sizeof (uintmax_t),
> 0
> };
>
> long long arr3[] = {
> INT8_MIN,
> INT16_MIN,
> INT32_MIN,
> INT64_MIN,
>
> INT8_MAX,
> INT16_MAX,
> INT32_MAX,
> INT64_MAX,
>
> INT_LEAST8_MIN,
> INT_LEAST16_MIN,
> INT_LEAST32_MIN,
> INT_LEAST64_MIN,
>
> INT_LEAST8_MAX,
> INT_LEAST16_MAX,
> INT_LEAST32_MAX,
> INT_LEAST64_MAX,
>
> INT_FAST8_MIN,
> INT_FAST16_MIN,
> INT_FAST32_MIN,
> INT_FAST64_MIN,
>
> INT_FAST8_MAX,
> INT_FAST16_MAX,
> INT_FAST32_MAX,
> INT_FAST64_MAX,
>
> INTPTR_MIN,
> INTPTR_MAX,
>
> INTMAX_MIN,
> INTMAX_MAX,
>
> PTRDIFF_MIN,
> PTRDIFF_MAX,
>
> SIG_ATOMIC_MAX,
>
> WINT_MIN,
> WINT_MAX,
>
> WCHAR_MAX,
> WCHAR_MIN, /* Last element since it may be 0. */
> 0
> };
>
> unsigned long long arr4[] = {
> UINT8_MAX,
> UINT16_MAX,
> UINT32_MAX,
> UINT64_MAX,
>
> UINT_LEAST8_MAX,
> UINT_LEAST16_MAX,
> UINT_LEAST32_MAX,
> UINT_LEAST64_MAX,
>
> UINT_FAST8_MAX,
> UINT_FAST16_MAX,
> UINT_FAST32_MAX,
> UINT_FAST64_MAX,
>
> UINTPTR_MAX,
>
> UINTMAX_MAX,
>
> SIZE_MAX,
> 0
> };
>
> int
> main ()
> {
> int i;
>
> for (i = 0; arr1[i]; ++i)
> printf ("%s\n", arr1[i]);
> for (i = 0; arr2[i]; ++i)
> printf ("%d\n", arr2[i]);
> for (i = 0; arr3[i]; ++i)
> printf ("%lld\n", arr3[i]);
> for (i = 0; arr4[i]; ++i)
> printf ("%llu\n", arr4[i]);
> return 0;
> }
More information about the Newlib
mailing list