SIP: Add DTMF support (receive INFO only)
[lcr.git] / libgsmfr / tls / ginger.c
1 /*
2  * Copyright 1996 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*/
8
9 /* Generate code to pack a bit array from a name:#bits description */
10
11 #include        <stdio.h>
12 #include        "taste.h"
13 #include        "proto.h"
14 #include        <limits.h>
15
16 /* This module is the opposite of sour.   Sweet was already taken,
17  * that's why it's called ginger.  (Add one point if that reminds
18  * you of Gary Larson.)
19  */
20
21 #define WORD_BITS       16      /* sizeof(uword) * CHAR_BIT on the 
22                                  * target architecture---if this isn't 16,
23                                  * you're in trouble with this library anyway.
24                                  */
25
26 #define BYTE_BITS        8      /* CHAR_BIT on the target architecture---
27                                  * if this isn't 8, you're in *deep* trouble.
28                                  */
29
30 void write_code P2((s_spex, n_spex), struct spex * s_spex, int n_spex)
31 {
32         struct spex     * sp = s_spex;
33         int               n_in = 0;
34
35         printf("uword sr = 0;\n");
36
37         for (; n_spex > 0; n_spex--, sp++) {
38
39                 while (n_in < sp->varsize) {
40                         if (n_in) printf("sr |= (uword)*c++ << %d;\n", n_in);
41                         else printf("sr = *c++;\n");
42                         n_in += BYTE_BITS;
43                 }
44
45                 printf("%s = sr & %#x;  sr >>= %d;\n",
46                         sp->var, ~(~0U << sp->varsize), sp->varsize);
47
48                 n_in -= sp->varsize;
49         }
50
51         if (n_in > 0) {
52                 fprintf(stderr, "%d bits left over\n", n_in);
53         }
54 }