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