| /* |
| * 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 <stdio.h> |
| #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; |
| } |
| } |
| } |
| |