[3365] | 1 | #include <stdlib.h>
|
---|
| 2 | #include <stdio.h>
|
---|
| 3 |
|
---|
| 4 | #include "bitio_m_abstract.h"
|
---|
| 5 | #include "bitio_m_mem.h"
|
---|
| 6 |
|
---|
| 7 | mem_bitio_buffer::mem_bitio_buffer() {
|
---|
| 8 | }
|
---|
| 9 |
|
---|
| 10 | mem_bitio_buffer::mem_bitio_buffer(unsigned char *readbuffer, int size) {
|
---|
| 11 | pos = readbuffer;
|
---|
| 12 | base = readbuffer;
|
---|
| 13 | remaining = size;
|
---|
| 14 | buffer = 0;
|
---|
| 15 | btg = 0;
|
---|
| 16 | }
|
---|
| 17 |
|
---|
| 18 |
|
---|
| 19 | void mem_bitio_buffer::error() {
|
---|
| 20 | fprintf (stderr, "Unexpected EOF in \"%s\" on line %d\n", __FILE__, __LINE__);
|
---|
| 21 | exit(1);
|
---|
| 22 | }
|
---|
| 23 |
|
---|
| 24 | void mem_bitio_buffer::encodeStart() {
|
---|
| 25 | btg = sizeof(buffer) * 8;
|
---|
| 26 | }
|
---|
| 27 |
|
---|
| 28 |
|
---|
| 29 | void mem_bitio_buffer::seek(unsigned long toPos) {
|
---|
| 30 | register long _newPos;
|
---|
| 31 | do {
|
---|
| 32 | _newPos = toPos;
|
---|
| 33 |
|
---|
| 34 | pos = base + (_newPos >> 3);
|
---|
| 35 | buffer = *pos++;
|
---|
| 36 | btg = 8 - (_newPos & 0x07);
|
---|
| 37 | } while (0);
|
---|
| 38 | }
|
---|
| 39 |
|
---|
| 40 | long mem_bitio_buffer::addff(long b) {
|
---|
| 41 | do {
|
---|
| 42 | if (btg == 0) {
|
---|
| 43 | if (remaining != 0) {
|
---|
| 44 | buffer = *pos++;
|
---|
[9612] | 45 | --remaining;
|
---|
[3365] | 46 | } else {
|
---|
| 47 | buffer = 0xff;
|
---|
| 48 | }
|
---|
| 49 | btg = sizeof(buffer) * 8;
|
---|
| 50 | }
|
---|
| 51 | b = b + b + ((buffer >> --btg) & 1);
|
---|
| 52 | } while(0);
|
---|
| 53 |
|
---|
| 54 | return b;
|
---|
| 55 | }
|
---|
| 56 |
|
---|
| 57 | long mem_bitio_buffer::add00(long b) {
|
---|
| 58 | do {
|
---|
| 59 | if (btg == 0) {
|
---|
| 60 | if (remaining != 0) {
|
---|
| 61 | buffer = *pos++;
|
---|
[9612] | 62 | --remaining;
|
---|
[3365] | 63 | } else {
|
---|
| 64 | buffer = 0x00;
|
---|
| 65 | }
|
---|
| 66 | btg = sizeof(buffer) * 8;
|
---|
| 67 | }
|
---|
| 68 | b = b + b + ((buffer >> --btg) & 1);
|
---|
| 69 | } while(0);
|
---|
| 70 |
|
---|
| 71 | return b;
|
---|
| 72 | }
|
---|
| 73 |
|
---|
| 74 | int mem_bitio_buffer::bit() {
|
---|
| 75 | if (btg == 0) {
|
---|
| 76 |
|
---|
| 77 | if (remaining == 0) {
|
---|
| 78 | this->error();
|
---|
| 79 | return 0;
|
---|
| 80 |
|
---|
| 81 | } else {
|
---|
| 82 | buffer = *pos++;
|
---|
[9612] | 83 | --remaining;
|
---|
[3365] | 84 | btg = sizeof(buffer) * 8;
|
---|
| 85 | }
|
---|
| 86 |
|
---|
| 87 | }
|
---|
| 88 | return ((buffer >> --btg) & 0x01);
|
---|
| 89 | }
|
---|
| 90 |
|
---|
| 91 | void mem_bitio_buffer::encodeBit(int b) {
|
---|
[9612] | 92 | --btg;
|
---|
[3365] | 93 | if (b) buffer |= (1 << btg);
|
---|
| 94 |
|
---|
| 95 | if (btg == 0) {
|
---|
| 96 | if (remaining) {
|
---|
| 97 | *pos++ = buffer;
|
---|
[9612] | 98 | --remaining;
|
---|
[3365] | 99 | }
|
---|
| 100 | buffer = 0;
|
---|
| 101 | btg = sizeof(buffer)*8;
|
---|
| 102 | }
|
---|
| 103 | }
|
---|
| 104 |
|
---|
| 105 | void mem_bitio_buffer::flush() {
|
---|
| 106 | if (btg != sizeof(buffer)*8) {
|
---|
| 107 | if (remaining) {
|
---|
| 108 | *pos++ = buffer;
|
---|
[9612] | 109 | --remaining;
|
---|
[3365] | 110 | }
|
---|
| 111 | }
|
---|
| 112 | btg = sizeof(buffer)*8;
|
---|
| 113 | }
|
---|
| 114 |
|
---|
| 115 | void mem_bitio_buffer::done() {
|
---|
| 116 | // do nothing
|
---|
| 117 | }
|
---|
| 118 |
|
---|
| 119 | int mem_bitio_buffer::encodeLength() {
|
---|
| 120 | return pos - base;
|
---|
| 121 | }
|
---|
| 122 |
|
---|
| 123 | int mem_bitio_buffer::encodeVerify() {
|
---|
| 124 | return (remaining != 0);
|
---|
| 125 | }
|
---|
| 126 |
|
---|
| 127 |
|
---|
| 128 |
|
---|