URI:
       tbitinput.c - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       tbitinput.c (1356B)
       ---
            1 #include        <u.h>
            2 #include        <libc.h>
            3 #include        <bio.h>
            4 #include        "sky.h"
            5 
            6 static int hufvals[] = {
            7          1,  1,  1,  1,  1,  1,  1,  1,
            8          2,  2,  2,  2,  2,  2,  2,  2,
            9          4,  4,  4,  4,  4,  4,  4,  4,
           10          8,  8,  8,  8,  8,  8,  8,  8,
           11          3,  3,  3,  3,  5,  5,  5,  5,
           12         10, 10, 10, 10, 12, 12, 12, 12,
           13         15, 15, 15, 15,  6,  6,  7,  7,
           14          9,  9, 11, 11, 13, 13,  0, 14
           15 };
           16 
           17 static int huflens[] = {
           18         3, 3, 3, 3, 3, 3, 3, 3,
           19         3, 3, 3, 3, 3, 3, 3, 3,
           20         3, 3, 3, 3, 3, 3, 3, 3,
           21         3, 3, 3, 3, 3, 3, 3, 3,
           22         4, 4, 4, 4, 4, 4, 4, 4,
           23         4, 4, 4, 4, 4, 4, 4, 4,
           24         4, 4, 4, 4, 5, 5, 5, 5,
           25         5, 5, 5, 5, 5, 5, 6, 6
           26 };
           27 
           28 static        int        buffer;
           29 static        int        bits_to_go;                /* Number of bits still in buffer */
           30 
           31 void
           32 start_inputing_bits(void)
           33 {
           34         bits_to_go = 0;
           35 }
           36 
           37 int
           38 input_huffman(Biobuf *infile)
           39 {
           40         int c;
           41 
           42         if(bits_to_go < 6) {
           43                 c = Bgetc(infile);
           44                 if(c < 0) {
           45                         fprint(2, "input_huffman: unexpected EOF\n");
           46                         exits("format");
           47                 }
           48                 buffer = (buffer<<8) | c;
           49                 bits_to_go += 8;
           50         }
           51         c = (buffer >> (bits_to_go-6)) & 0x3f;
           52         bits_to_go -= huflens[c];
           53         return hufvals[c];
           54 }
           55 
           56 int
           57 input_nybble(Biobuf *infile)
           58 {
           59         int c;
           60 
           61         if(bits_to_go < 4) {
           62                 c = Bgetc(infile);
           63                 if(c < 0){
           64                         fprint(2, "input_nybble: unexpected EOF\n");
           65                         exits("format");
           66                 }
           67                 buffer = (buffer<<8) | c;
           68                 bits_to_go += 8;
           69         }
           70 
           71         /*
           72          * pick off the first 4 bits
           73          */
           74         bits_to_go -= 4;
           75         return (buffer>>bits_to_go) & 0x0f;
           76 }