source: trunk/mgpp/lib/bitio_m_stdio.cpp@ 3365

Last change on this file since 3365 was 3365, checked in by kjdon, 22 years ago

Initial revision

  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 2.0 KB
Line 
1#include <stdlib.h>
2#include <stdio.h>
3
4#include "bitio_m_stdio.h"
5
6stdio_bitio_buffer::stdio_bitio_buffer(FILE *f) {
7 attachFile (f);
8}
9
10void stdio_bitio_buffer::attachFile (FILE *f) {
11 file = f;
12 buffer = 0;
13 btg = 0;
14 bytesWritten = 0;
15}
16
17void stdio_bitio_buffer::encodeStart() {
18 btg = sizeof(buffer) * 8;
19}
20
21void stdio_bitio_buffer::error() {
22 fprintf(stderr, "Unexpected EOF in \"%s\" on line %d", __FILE__, __LINE__);
23 exit(1);
24}
25
26void stdio_bitio_buffer::seek (unsigned long byte, unsigned char bit) {
27 if (fseek (file, byte, SEEK_SET) != 0) return;
28 buffer = getc(file);
29 btg = bit;
30 bytesWritten = 0;
31}
32
33void stdio_bitio_buffer::seek(unsigned long topos) {
34 if (fseek(file, topos >> 3, SEEK_SET) != 0) return;
35 buffer = getc(file);
36 btg = 8 - (topos & 0x07);
37 bytesWritten = 0;
38}
39
40long stdio_bitio_buffer::addff(long b)
41{
42 if (!btg)
43 {
44 register int val;
45 val = getc(file);
46 if (val == EOF)
47 {
48 buffer = 0x0ff;
49 }
50 else
51 {
52 buffer = val;
53 }
54 btg = sizeof(buffer) * 8;
55 }
56 b = b + b + ((buffer >> --btg) & 0x01);
57
58 return b;
59}
60
61long stdio_bitio_buffer::add00(long b)
62{
63 if (!btg)
64 {
65 register int val;
66 val = getc(file);
67 if (val == EOF)
68 {
69 buffer = 0xff;
70 }
71 else
72 {
73 buffer = val;
74 }
75 btg = sizeof(buffer) * 8;
76 }
77 b = b + b + ((buffer >> --btg) & 0x01);
78
79 return b;
80}
81
82void stdio_bitio_buffer::encodeBit(int b)
83{
84 btg--;
85 if (b != 0)
86 buffer |= (1 << btg);
87
88 if (btg == 0)
89 {
90 putc(buffer, file);
91 bytesWritten += sizeof (buffer);
92 buffer = 0;
93 btg = sizeof(buffer)*8;
94 }
95}
96
97int stdio_bitio_buffer::bit()
98{
99 if (btg == 0)
100 {
101 buffer = getc(file);
102 if (feof(file))
103 {
104 error();
105 return 0;
106 }
107 else
108 {
109 btg = sizeof(buffer) * 8;
110 }
111 }
112 return ((buffer >> --btg) & 0x01);
113}
114
115void stdio_bitio_buffer::done() {
116 // no tidying required
117}
118
119void stdio_bitio_buffer::encodeDone() {
120 if (btg != sizeof(buffer) * 8) {
121 putc(buffer, file);
122 bytesWritten += sizeof (buffer);
123 }
124}
125
Note: See TracBrowser for help on using the repository browser.