xref: /aosp_15_r20/external/libgsm/tls/sweet.c (revision 8ec969cea971fe25ff2d3933a5a9f8504f8e86c9)
1*8ec969ceSTreehugger Robot  /*
2*8ec969ceSTreehugger Robot   * Copyright 1992 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: /tmp_amd/presto/export/kbs/jutta/src/gsm/RCS/sweet.c,v 1.2 1996/07/02 10:15:53 jutta Exp $*/
8*8ec969ceSTreehugger Robot 
9*8ec969ceSTreehugger Robot /* Generate code to unpack a bit array from 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 
15*8ec969ceSTreehugger Robot void write_code P2((s_spex, n_spex), struct spex * s_spex, int n_spex)
16*8ec969ceSTreehugger Robot {
17*8ec969ceSTreehugger Robot 	struct spex	* sp = s_spex;
18*8ec969ceSTreehugger Robot 	int		bits = 8;
19*8ec969ceSTreehugger Robot 	int		vars;
20*8ec969ceSTreehugger Robot 
21*8ec969ceSTreehugger Robot 	if (!n_spex) return;
22*8ec969ceSTreehugger Robot 
23*8ec969ceSTreehugger Robot 	vars = sp->varsize;
24*8ec969ceSTreehugger Robot 
25*8ec969ceSTreehugger Robot 	while (n_spex) {
26*8ec969ceSTreehugger Robot 
27*8ec969ceSTreehugger Robot 		if (vars == sp->varsize) {
28*8ec969ceSTreehugger Robot 			printf("\t%s  = ", sp->var);
29*8ec969ceSTreehugger Robot 		} else printf("\t%s |= ", sp->var);
30*8ec969ceSTreehugger Robot 
31*8ec969ceSTreehugger Robot 		if (vars == bits) {
32*8ec969ceSTreehugger Robot 
33*8ec969ceSTreehugger Robot 			if (bits == 8) printf( "*c++;\n" );
34*8ec969ceSTreehugger Robot 			else printf( "*c++ & 0x%lX;\n",
35*8ec969ceSTreehugger Robot 				~(0xfffffffe << (bits - 1)) );
36*8ec969ceSTreehugger Robot 
37*8ec969ceSTreehugger Robot 			if (!-- n_spex) break;
38*8ec969ceSTreehugger Robot 			sp++;
39*8ec969ceSTreehugger Robot 			vars = sp->varsize;
40*8ec969ceSTreehugger Robot 			bits = 8;
41*8ec969ceSTreehugger Robot 
42*8ec969ceSTreehugger Robot 		} else if (vars < bits) {
43*8ec969ceSTreehugger Robot 
44*8ec969ceSTreehugger Robot 			printf( "(*c >> %d) & 0x%lX;\n",
45*8ec969ceSTreehugger Robot 				bits - vars,
46*8ec969ceSTreehugger Robot 				~(0xfffffffe << (vars - 1)));
47*8ec969ceSTreehugger Robot 
48*8ec969ceSTreehugger Robot 			bits -= vars;
49*8ec969ceSTreehugger Robot 			if (!--n_spex) break;
50*8ec969ceSTreehugger Robot 			sp++;
51*8ec969ceSTreehugger Robot 			vars = sp->varsize;
52*8ec969ceSTreehugger Robot 
53*8ec969ceSTreehugger Robot 		} else {
54*8ec969ceSTreehugger Robot 			/*   vars > bits.  We're eating lower-all of c,
55*8ec969ceSTreehugger Robot 			 *   but we must shift it.
56*8ec969ceSTreehugger Robot 			 */
57*8ec969ceSTreehugger Robot 			printf(	"(*c++ & 0x%X) << %d;\n",
58*8ec969ceSTreehugger Robot 				~(0xfffffffe << (bits - 1)),
59*8ec969ceSTreehugger Robot 				vars - bits );
60*8ec969ceSTreehugger Robot 
61*8ec969ceSTreehugger Robot 			vars -= bits;
62*8ec969ceSTreehugger Robot 			bits = 8;
63*8ec969ceSTreehugger Robot 		}
64*8ec969ceSTreehugger Robot 	}
65*8ec969ceSTreehugger Robot }
66*8ec969ceSTreehugger Robot 
67