123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219 |
- /* ----------------------------------------------------------------------- */
- #if TEST == 1
- {
- struct M P A __s
- {
- unsigned x : 12;
- unsigned char y : 7;
- unsigned z : 28;
- unsigned a: 4;
- unsigned b: 5;
- };
- TEST_STRUCT(0x333,0x44,0x555555,6,7);
- }
- /* ----------------------------------------------------------------------- */
- #elif TEST == 2
- {
- struct M P __s
- {
- int x: 12;
- char y: 6;
- long long z:63;
- A char a:4;
- long long b:2;
- };
- TEST_STRUCT(3,30,0x123456789abcdef0LL,5,2);
- }
- /* ----------------------------------------------------------------------- */
- #elif TEST == 3
- {
- struct M P __s
- {
- unsigned x:5, y:5, :0, z:5; char a:5; A short b:5;
- };
- TEST_STRUCT(21,23,25,6,14);
- }
- /* ----------------------------------------------------------------------- */
- #elif TEST == 4
- {
- struct M P __s {
- int x : 3;
- int : 2;
- int y : 1;
- int : 0;
- int z : 5;
- int a : 7;
- unsigned int b : 7;
- };
- TEST_STRUCT(3,1,15,120,120);
- }
- /* ----------------------------------------------------------------------- */
- #elif TEST == 5
- {
- struct M P __s {
- long long x : 45;
- long long : 2;
- long long y : 30;
- unsigned long long z : 38;
- char a; short b;
- };
- TEST_STRUCT(0x123456789ULL, 120<<25, 120, 0x44, 0x77);
- }
- /* ----------------------------------------------------------------------- */
- #elif TEST == 6
- {
- struct M P __s {
- int a;
- signed char b;
- int x : 12, y : 4, : 0, : 4, z : 3;
- char d;
- };
- TEST_STRUCT(1,2,3,4,-3);
- }
- /* ----------------------------------------------------------------------- */
- #elif defined PACK
- #if PACK
- # pragma pack(push,1)
- # define P //_P
- #else
- # define P
- #endif
- printf("\n\n" + 2*top);
- #define TEST 1
- #include SELF
- top = 0;
- #define TEST 2
- #include SELF
- #define TEST 3
- #include SELF
- #define TEST 4
- #include SELF
- #define TEST 5
- #include SELF
- #define TEST 6
- #include SELF
- #if PACK
- # pragma pack(pop)
- #endif
- #undef P
- #undef PACK
- /* ----------------------------------------------------------------------- */
- #elif defined ALIGN
- #if ALIGN
- # define A _A(16)
- #else
- # define A
- #endif
- #define PACK 0
- #include SELF
- #define PACK 1
- #include SELF
- #undef A
- #undef ALIGN
- /* ----------------------------------------------------------------------- */
- #elif defined MS_BF
- #if MS_BF
- # ifdef __TINYC__
- # pragma comment(option, "-mms-bitfields")
- # elif defined __GNUC__
- # define M __attribute__((ms_struct))
- # endif
- #else
- # ifdef __TINYC__
- # pragma comment(option, "-mno-ms-bitfields")
- # elif defined __GNUC__
- # define M __attribute__((gcc_struct))
- # endif
- #endif
- #ifndef M
- # define M
- #endif
- #define ALIGN 0
- #include SELF
- #define ALIGN 1
- #include SELF
- #undef M
- #undef MS_BF
- /* ----------------------------------------------------------------------- */
- #else
- #include <stdio.h>
- #include <string.h>
- /* some gcc headers #define __attribute__ to empty if it's not gcc */
- #undef __attribute__
- void dump(void *p, int s)
- {
- int i;
- for (i = s; --i >= 0;)
- printf("%02X", ((unsigned char*)p)[i]);
- printf("\n");
- }
- #define pv(m) \
- printf(sizeof (s->m + 0) == 8 ? " %016llx" : " %02x", s->m)
- #define TEST_STRUCT(v1,v2,v3,v4,v5) { \
- struct __s _s, *s = & _s; \
- printf("\n---- TEST %d%s%s%s ----\n" + top, \
- TEST, MS_BF?" - MS-BITFIELDS":"", \
- PACK?" - PACKED":"", \
- ALIGN?" - WITH ALIGN":""); \
- memset(s, 0, sizeof *s); \
- s->x = -1, s->y = -1, s->z = -1, s->a = -1, s->b = -1; \
- printf("bits in use : "), dump(s, sizeof *s); \
- s->x = v1, s->y = v2, s->z = v3, s->a += v4, ++s->a, s->b = v5; \
- printf("bits as set : "), dump(s, sizeof *s); \
- printf("values :"), pv(x), pv(y), pv(z), pv(a), pv(b), printf("\n"); \
- printf("align/size : %d %d\n", alignof(struct __s),sizeof(struct __s)); \
- }
- #ifdef _MSC_VER
- # define _A(n) __declspec(align(n))
- # define _P
- # define alignof(x) __alignof(x)
- #else
- # define _A(n) __attribute__((aligned(n)))
- # define _P __attribute__((packed))
- # define alignof(x) __alignof__(x)
- #endif
- #ifndef MS_BITFIELDS
- # define MS_BITFIELDS 0
- #endif
- #define SELF "95_bitfields.c"
- int top = 1;
- int main()
- {
- #define MS_BF MS_BITFIELDS
- #include SELF
- return 0;
- }
- /* ----------------------------------------------------------------------- */
- #endif
- #undef TEST
|