241 lines
		
	
	
	
		
			4.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			241 lines
		
	
	
	
		
			4.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* ----------------------------------------------------------------------- */
 | 
						|
#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 TEST == 7
 | 
						|
{
 | 
						|
#ifdef _WIN32
 | 
						|
    typedef long long int ll;
 | 
						|
#else
 | 
						|
    typedef long int ll;
 | 
						|
#endif
 | 
						|
    struct M P __s {
 | 
						|
        ll d : 16;
 | 
						|
        ll b : 16;
 | 
						|
        ll x : 16;
 | 
						|
        ll y : 1;
 | 
						|
        ll z : 2;
 | 
						|
        ll a : 11;
 | 
						|
        ll e : 1;
 | 
						|
        ll f : 1;
 | 
						|
    };
 | 
						|
    TEST_STRUCT(1,2,3,4,5);
 | 
						|
}
 | 
						|
 | 
						|
/* ----------------------------------------------------------------------- */
 | 
						|
#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
 | 
						|
#define TEST 7
 | 
						|
#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
 |