2 input bit stream reader
3 (c) 2012/11/17- yoya@awm.jp
5 goog.provide('FlappIBit');
7 goog.scope(function() {
12 FlappIBit = function() {
15 this.dataAllocLen = 0;
20 FlappIBit.prototype = {
21 input: function(data) {
22 if (typeof data === 'string') {
25 this.inputArray(data);
28 inputStr: function(data) {
29 var dataLen = data.length;
30 if (this.dataAllocLen < dataLen) {
31 var oldData = this.data;
32 this.data = new Uint8Array(dataLen);
33 for (var i = 0 , l = this.dataLen; i < l ; i++) {
34 this.data[i] = data.charCodeAt(i);
36 this.dataAllocLen = dataLen;
38 for (var i = this.dataLen ; i < dataLen ; i++) {
39 this.data[i] = data.charCodeAt(i);
41 this.dataLen = dataLen;
43 inputArray: function(data) {
45 this.dataAllocLen = this.dataLen = data.length;
47 len: function() { // data lengh
50 hasNext: function(len) {
51 var nextOffset = this.byteOffset + (this.bitOffset?1:0) + len;
52 return (nextOffset < this.dataLen);
54 getBytePos: function() { // get byte position
55 return this.byteOffset;
57 setPos: function(byteOffset, bitOffset) { // set byte position
58 this.byteOffset = byteOffset;
59 this.bitOffset = bitOffset;
61 seek: function(byteDelta, bitDelta) { // relative seek
62 this.byteOffset += byteDelta;
63 this.bitOffset += bitDelta;
64 if (this.bitOffset < 0) {
68 } while (this.bitOffset < 0);
69 } else if (this.bitOffset > 7) {
73 } while (this.bitOffset > 7);
76 a: function() { // skip bit
82 b: function() { // bit
83 var value = (this.data[this.byteOffset] >>> (7 - this.bitOffset++)) & 1;
84 if (this.bitOffset === 8) {
90 ub: function(len) { // unsigned bits
93 value = (value << 1) | this.b();
97 sb: function(len) { // signed bits
99 if (len === 0) return 0; // XXX
105 value = (value << 1) | this.b();
108 return value - (1 << (orig_len - 1));
112 si8: function() { // snsigned 8-bit integer
113 var value = this.ui8();
114 return (value & 0x80)?(value - 0x100):value;
116 si16: function() { // snsigned 16-bit integer
117 var value = this.ui16();
118 return (value & 0x8000)?(value - 0x10000):value;
121 si32: function() { // snsigned 32-bit integer
122 var value = this.ui32();
123 return (value & 0x80000000)?(value - 0x100000000):value;
125 ui8: function() { // unsigned 8-bit integer
127 return this.data[this.byteOffset++];
129 ui16: function() { // unsigned 16-bit integer
131 return this.data[this.byteOffset++] |
132 (this.data[this.byteOffset++] << 8);
134 ui32: function() { // unsigned 32-bit integer
136 return this.data[this.byteOffset++] |
137 (this.data[this.byteOffset++] << 8) |
138 (this.data[this.byteOffset++] << 16) |
139 (this.data[this.byteOffset++] << 24);
141 ui16be: function() { // unsigned 16-bit integer
143 return (this.data[this.byteOffset++] << 8) |
144 this.data[this.byteOffset++];
148 var data = this.data.subarray(this.byteOffset, this.byteOffset + len);
149 this.byteOffset += len;
152 strN: function(len) {
154 var data = this.data;
156 for (var i = this.byteOffset, l = this.byteOffset + len ; i < len ; i++) {
157 str.push(String.fromCharCode(data[i]))
159 this.byteOffset += len;
160 // return new FlappUTF8().fromSJISArray(data);
165 var byteOffset = this.byteOffset;
166 var dataLen = this.dataLen;
168 for (var i = byteOffset ; i < dataLen ; i++) {
169 if (this.data[i] === 0) {
170 data = this.strN(i - byteOffset);
171 this.byteOffset++; // skip "\0"
175 return this.strN(i - byteOffset);