1 /*
2  * Copyright 1996 by Jutta Degener and Carsten Bormann, Technische
3  * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
4  * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
5  */
6 
7 /*$Header*/
8 
9 /* Generate code to pack a bit array from a name:#bits description */
10 
11 #include	<stdio.h>
12 #include	"taste.h"
13 #include	"proto.h"
14 #include	<limits.h>
15 
16 /* This module is the opposite of sour.   Sweet was already taken,
17  * that's why it's called ginger.  (Add one point if that reminds
18  * you of Gary Larson.)
19  */
20 
21 #define WORD_BITS	16	/* sizeof(uword) * CHAR_BIT on the
22 				 * target architecture---if this isn't 16,
23 				 * you're in trouble with this library anyway.
24 				 */
25 
26 #define BYTE_BITS	 8	/* CHAR_BIT on the target architecture---
27 				 * if this isn't 8, you're in *deep* trouble.
28 				 */
29 
30 void write_code P2((s_spex, n_spex), struct spex * s_spex, int n_spex)
31 {
32 	struct spex	* sp = s_spex;
33 	int		  n_in = 0;
34 
35 	printf("uword sr = 0;\n");
36 
37 	for (; n_spex > 0; n_spex--, sp++) {
38 
39 		while (n_in < sp->varsize) {
40 			if (n_in) printf("sr |= (uword)*c++ << %d;\n", n_in);
41 			else printf("sr = *c++;\n");
42 			n_in += BYTE_BITS;
43 		}
44 
45 		printf("%s = sr & %#x;  sr >>= %d;\n",
46 			sp->var, ~(~0U << sp->varsize), sp->varsize);
47 
48 		n_in -= sp->varsize;
49 	}
50 
51 	if (n_in > 0) {
52 		fprintf(stderr, "%d bits left over\n", n_in);
53 	}
54 }
55