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