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