Re: exact integral types

Marc Aurele La France <[email protected]>
Newsgroups gmane.comp.xfree86.expert
Message-ID <[email protected]>
On Sat, 19 Oct 2002, Warren Turkal wrote:

> Here is a patch that should make Xmd.h use C99 when available.

> --- /usr/include/X11/Xmd.h	2002-10-16 15:14:38.000000000 -0500
> +++ Xmd.h	2002-10-19 14:23:33.000000000 -0500
> @@ -47,6 +47,7 @@
>  ******************************************************************/
>  #ifndef XMD_H
>  #define XMD_H 1
> +
>  /* $Xorg: Xmd.h,v 1.4 2001/02/09 02:03:22 xorgcvs Exp $ */
>  /*
>   *  Xmd.h: MACHINE DEPENDENT DECLARATIONS.
> @@ -101,6 +102,36 @@
>  #define SIZEOF(x) sz_/**/x
>  #endif /* if ANSI C compiler else not */
>
> +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ == 199901L)
                                                      ^^
This should be                                        >=

> +
> +#include <stdint.h>
> +
> +typedef uint8_t  CARD8;
> +typedef uint16_t CARD16;
> +typedef uint32_t CARD32;
> +typedef uint64_t CARD64;
> +
> +typedef int8_t  INT8;
> +typedef int16_t INT16;
> +typedef int32_t INT32;
> +typedef int64_t INT64;
> +
> +typedef CARD8 BYTE;
> +typedef CARD8 BOOL;
> +
> +typedef CARD32 BITS32;
> +typedef CARD16 BITS16;
> +
> +/*is there any reason why B32 and B16 cannot always be defined?*/
> +# if defined(WORD64)
> +#define B32 :32
> +#define B16 :16
> +# else
> +#define B32
> +#define B16
> +# endif
> +
> +#else //__STDC_VERSION__
>  /*
>   * Bitfield suffixes for the protocol structure elements, if you
>   * need them.  Note that bitfields are not guarranteed to be signed
> @@ -165,6 +196,8 @@
>  #define BOOL		CARD8
>  #endif /* __EMX__ */
>
> +#endif // __STDC_VERSION__
> +
>  /*
>   * definitions for sign-extending bitfields on 64-bit architectures
>   */

I have spent the time to review this change and found that it does not
work (at least not as intended).

First, a minor problem is that even GCC 3.2 #define's __STDC_VERSION__
only if compiling with -std=c99 (or -std=gnu99), but not with -ansi (the
default we use).  I am given to understand that this will change in some
future GCC.

A larger issue is that, on some 32-bit systems, this ends up typedef'ing
CARD32 as 'unsigned int', and on others, as 'unsigned long'.   For reasons
I won't get into here, the X sources currently need CARD32 to be
typedef'ed as 'unsigned long' for all 32-bit environments.  The same
issue, without 'unsigned' occurs with INT32.

Bottom line:  The X sources are not yet ready for C99, and a lot more work
than this relatively simple change is needed to make them so.

Marc.

+----------------------------------+-----------------------------------+
|  Marc Aurele La France           |  work:   1-780-492-9310           |
|  Computing and Network Services  |  fax:    1-780-492-1729           |
|  352 General Services Building   |  email:  [email protected]          |
|  University of Alberta           +-----------------------------------+
|  Edmonton, Alberta               |                                   |
|  T6G 2H1                         |     Standard disclaimers apply    |
|  CANADA                          |                                   |
+----------------------------------+-----------------------------------+
XFree86 Core Team member.  ATI driver and X server internals.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.