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