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