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