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