/* * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische * Universitaet Berlin. See the accompanying file "COPYRIGHT" for * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. */ /*$Header: /tmp_amd/presto/export/kbs/jutta/src/gsm/RCS/sweet.c,v 1.2 1996/07/02 10:15:53 jutta Exp $*/ /* Generate code to unpack a bit array from name:#bits description */ #include #include "taste.h" #include "proto.h" void write_code P2((s_spex, n_spex), struct spex * s_spex, int n_spex) { struct spex * sp = s_spex; int bits = 8; int vars; if (!n_spex) return; vars = sp->varsize; while (n_spex) { if (vars == sp->varsize) { printf("\t%s = ", sp->var); } else printf("\t%s |= ", sp->var); if (vars == bits) { if (bits == 8) printf( "*c++;\n" ); else printf( "*c++ & 0x%lX;\n", ~(0xfffffffe << (bits - 1)) ); if (!-- n_spex) break; sp++; vars = sp->varsize; bits = 8; } else if (vars < bits) { printf( "(*c >> %d) & 0x%lX;\n", bits - vars, ~(0xfffffffe << (vars - 1))); bits -= vars; if (!--n_spex) break; sp++; vars = sp->varsize; } else { /* vars > bits. We're eating lower-all of c, * but we must shift it. */ printf( "(*c++ & 0x%X) << %d;\n", ~(0xfffffffe << (bits - 1)), vars - bits ); vars -= bits; bits = 8; } } }