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