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 unsigned absurd:7; /* across storage unit boundary */
10 char bleh;
11 } f;
12 f.dummy[0] = 1;
13 f.dummy[1] = 2;
14 f.dummy[2] = 3;
15
16 f.gnu = 4;
17 f.absurd = 0x7f;
18 f.bleh = 6;
19
20 printf("%d %d %d\n", f.dummy[0], f.dummy[1], f.dummy[2]);
21 printf("%d\n", f.gnu);
22 printf("%d\n", f.absurd);
23 printf("%d\n", f.bleh);
24
25 {
26 printf("locations:\n");
27 memset(&f, 0, sizeof f);
28 f.gnu = 0xf;
29 printf("%d ", find_loc(&f, sizeof f));
30 memset(&f, 0, sizeof f);
31 f.absurd = 0x7f;
32 printf("%d\n", find_loc(&f, sizeof f));
33 }
34 return 0;
35 }
36
37 int
find_loc(void * buf,int size)38 find_loc(void *buf, int size) {
39 unsigned char *cp;
40
41 for (cp = buf; cp < (unsigned char *)buf + size; ++cp) {
42 printf("%02x ", *cp);
43 }
44 putchar('\n');
45 for (cp = buf; cp < (unsigned char *)buf + size; ++cp) {
46 if (*cp != 0) {
47 int mask;
48 int i = 0;
49
50 for (mask = 1; mask <= 0x80; mask <<= 1) {
51 if (*cp & mask) {
52 break;
53 }
54 ++i;
55 }
56 return (cp - (unsigned char *)buf) * 8 + i;
57 }
58 }
59 return -1;
60 }
61
62