1 #include <stdio.h>
2 #include <string.h>
3 
4 int
main()5 main() {
6 	struct foo {
7 		char		dummy[3];
8 		int		gnu:4;
9 		int		absurd:9;  /* across storage unit boundary, but requiring padding */
10 		char		bleh;
11 	} f;
12 	struct foo2 {
13 		char		dummy[3];
14 		int		gnu:4;
15 		unsigned	absurd:9;  /* try the same but without sign-ext */
16 		char		bleh;
17 	} f2;
18 	f.dummy[0] = 1;
19 	f.dummy[1] = 2;
20 	f.dummy[2] = 3;
21 	f.gnu = 4;
22 	f.absurd = 0x7f;
23 	f.bleh = 6;
24 
25 	printf("%d %d %d\n", f.dummy[0], f.dummy[1], f.dummy[2]);
26 	printf("%d\n", f.gnu);
27 	printf("%d\n", f.absurd);
28 	printf("%d\n", f.bleh);
29 
30 	f2.absurd = 0x1ff;
31 	printf("%d\n", f2.absurd);
32 
33 	{
34 		printf("locations:\n");
35 		memset(&f, 0, sizeof f);
36 		f.gnu = 0xf;
37 		printf("%d ", find_loc(&f, sizeof f));
38 		memset(&f, 0, sizeof f);
39 		f.absurd = 0x1ff;
40 		printf("%d\n", find_loc(&f, sizeof f));
41 
42 		memset(&f2, 0, sizeof f2);
43 		f2.gnu = 0xf;
44 		printf("%d ", find_loc(&f2, sizeof f2));
45 		memset(&f2, 0, sizeof f2);
46 		f2.absurd = 0x1ff;
47 		printf("%d\n", find_loc(&f2, sizeof f2));
48 	}
49 	return 0;
50 }
51 
52 int
find_loc(void * buf,int size)53 find_loc(void *buf, int size) {
54         unsigned char   *cp;
55 
56         for (cp = buf; cp < (unsigned char *)buf + size; ++cp) {
57                 printf("%02x ", *cp);
58         }
59         putchar('\n');
60         for (cp = buf; cp < (unsigned char *)buf + size; ++cp) {
61                 if (*cp != 0) {
62                         int     mask;
63                         int     i = 0;
64 
65                         for (mask = 1; mask <= 0x80; mask <<= 1) {
66                                 if (*cp & mask) {
67                                         break;
68                                 }
69                                 ++i;
70                         }
71                         return (cp - (unsigned char *)buf) * 8 + i;
72                 }
73         }
74         return -1;
75 }
76 
77