original C prototype
[maximus:kjhf.git] / prototype / fbitstream.c
1 /*****************************************************************************
2 **
3 **  hyperfuck -- boolfuck in the hyperbolic plane
4 **  Copyright (C) 2010 Claude Heiland-Allen <claudiusmaximus@goto10.org>
5 **
6 */
7
8 #include <stdlib.h>
9 #include "fbitstream.h"
10
11 struct fileData {
12   int bit;
13   int byte;
14   FILE *file;
15 };
16
17 static struct ibitstream *fibitstreamGet(struct ibitstream *bs) {
18   if (!bs->end) {
19     struct fileData *data = bs->data;
20     if (data->bit == 0) {
21       data->byte = fgetc(data->file);
22       if (data->byte == EOF) {
23         bs->end = 1;
24         return bs;
25       } else {
26         data->bit = 8;
27       }
28     }
29     data->bit--;
30     bs->bit = (data->byte & (1 << data->bit)) >> data->bit;
31   }
32   return bs;
33 }
34
35 struct ibitstream *fibitstream(FILE *f) {
36   struct ibitstream *bs = malloc(sizeof(struct ibitstream));
37   bs->bit = 0;
38   bs->end = 0;
39   bs->get = &fibitstreamGet;
40   struct fileData *data = malloc(sizeof(struct fileData));
41   data->bit = 0;
42   data->byte = 0;
43   data->file = f;
44   bs->data = data;
45   return bs;  
46 }
47
48 static struct obitstream *fobitstreamPut(struct obitstream *bs, int b) {
49   struct fileData *data = bs->data;
50   data->bit--;
51   data->byte |= (1 & b) << data->bit;
52   if (data->bit == 0) {
53     fputc(data->byte, data->file);
54     fflush(data->file);
55     data->bit = 8;
56     data->byte = 0;
57   }
58   return bs;
59 }
60
61 struct obitstream *fobitstream(FILE *f) {
62   struct obitstream *bs = malloc(sizeof(struct obitstream));
63   bs->put = &fobitstreamPut;
64   struct fileData *data = malloc(sizeof(struct fileData));
65   data->bit = 8;
66   data->byte = 0;
67   data->file = f;
68   bs->data = data;
69   return bs;  
70 }
71