|
312 | 312 | ByteBuffer.isByteBuffer = function(bb) {
|
313 | 313 | return (bb && bb["__isByteBuffer__"]) === true;
|
314 | 314 | };
|
| 315 | + // TODO |
| 316 | + |
| 317 | + /** |
| 318 | + * Registers an additional string encoding. |
| 319 | + * @param {string} name Short name of the encoding (i.e. "utf8") |
| 320 | + * @param {function(!ByteBuffer, string, number)} fromString A function capable of decoding a string using this encoding |
| 321 | + * to a ByteBuffer |
| 322 | + * @param {function(!ByteBuffer, number, number)} toString A function capable of encoding a string using this encoding |
| 323 | + * from a ByteBuffer |
| 324 | + */ |
| 325 | + ByteBuffer.registerEncoding = function(name, fromString, toString) { |
| 326 | + ByteBuffer.ENCODINGS[name] = { |
| 327 | + fromString: fromString, |
| 328 | + toString: toString |
| 329 | + }; |
| 330 | + }; |
315 | 331 | /**
|
316 | 332 | * Gets the backing buffer type.
|
317 | 333 | * @returns {Function} `Buffer` under node.js, `ArrayBuffer` in the browser (classes)
|
|
1526 | 1542 | if (offset > capacity10)
|
1527 | 1543 | this.resize((capacity10 *= 2) > offset ? capacity10 : offset);
|
1528 | 1544 | offset -= size;
|
1529 |
| - // ref: http://code.google.com/searchframe#WTeibokF6gE/trunk/src/google/protobuf/io/coded_stream.cc |
1530 |
| - this.view[offset] = b = value | 0x80; |
1531 | 1545 | value >>>= 0;
|
1532 |
| - if (value >= 1 << 7) { |
1533 |
| - b = (value >> 7) | 0x80; |
1534 |
| - this.view[offset+1] = b; |
1535 |
| - if (value >= 1 << 14) { |
1536 |
| - b = (value >> 14) | 0x80; |
1537 |
| - this.view[offset+2] = b; |
1538 |
| - if (value >= 1 << 21) { |
1539 |
| - b = (value >> 21) | 0x80; |
1540 |
| - this.view[offset+3] = b; |
1541 |
| - if (value >= 1 << 28) { |
1542 |
| - this.view[offset+4] = (value >> 28) & 0x0F; |
1543 |
| - size = 5; |
1544 |
| - } else { |
1545 |
| - this.view[offset+3] = b & 0x7F; |
1546 |
| - size = 4; |
1547 |
| - } |
1548 |
| - } else { |
1549 |
| - this.view[offset+2] = b & 0x7F; |
1550 |
| - size = 3; |
1551 |
| - } |
1552 |
| - } else { |
1553 |
| - this.view[offset+1] = b & 0x7F; |
1554 |
| - size = 2; |
1555 |
| - } |
1556 |
| - } else { |
1557 |
| - this.view[offset] = b & 0x7F; |
1558 |
| - size = 1; |
| 1546 | + while (value >= 0x80) { |
| 1547 | + b = (value & 0x7f) | 0x80; |
| 1548 | + this.view[offset++] = b; |
| 1549 | + value >>>= 7; |
1559 | 1550 | }
|
| 1551 | + this.view[offset++] = value; |
1560 | 1552 | if (relative) {
|
1561 |
| - this.offset += size; |
| 1553 | + this.offset = offset; |
1562 | 1554 | return this;
|
1563 | 1555 | }
|
1564 | 1556 | return size;
|
1565 | 1557 | };
|
1566 | 1558 |
|
1567 | 1559 | /**
|
1568 |
| - * Writes a zig-zag encoded 32bit base 128 variable-length integer. |
| 1560 | + * Writes a zig-zag encoded (signed) 32bit base 128 variable-length integer. |
1569 | 1561 | * @param {number} value Value to write
|
1570 | 1562 | * @param {number=} offset Offset to write to. Will use and increase {@link ByteBuffer#offset} by the number of bytes
|
1571 | 1563 | * written if omitted.
|
|
1596 | 1588 | if (offset < 0 || offset + 1 > this.buffer.byteLength)
|
1597 | 1589 | throw RangeError("Illegal offset: 0 <= "+offset+" (+"+1+") <= "+this.buffer.byteLength);
|
1598 | 1590 | }
|
1599 |
| - // ref: src/google/protobuf/io/coded_stream.cc |
1600 |
| - var size = 0, |
| 1591 | + var c = 0, |
1601 | 1592 | value = 0 >>> 0,
|
1602 |
| - temp, |
1603 |
| - ioffset; |
| 1593 | + b; |
1604 | 1594 | do {
|
1605 |
| - ioffset = offset+size; |
1606 |
| - if (!this.noAssert && ioffset > this.limit) { |
| 1595 | + if (!this.noAssert && offset > this.limit) { |
1607 | 1596 | var err = Error("Truncated");
|
1608 | 1597 | err['truncated'] = true;
|
1609 | 1598 | throw err;
|
1610 | 1599 | }
|
1611 |
| - temp = this.view[ioffset]; |
1612 |
| - if (size < 5) |
1613 |
| - value |= ((temp&0x7F)<<(7*size)) >>> 0; |
1614 |
| - ++size; |
1615 |
| - } while ((temp & 0x80) === 0x80); |
1616 |
| - value = value | 0; // Make sure to discard the higher order bits |
| 1600 | + b = this.view[offset++]; |
| 1601 | + if (c < 5) |
| 1602 | + value |= (b & 0x7f)<<(7*c); |
| 1603 | + ++c; |
| 1604 | + } while ((b & 0x80) !== 0); |
| 1605 | + value |= 0; |
1617 | 1606 | if (relative) {
|
1618 |
| - this.offset += size; |
| 1607 | + this.offset = offset; |
1619 | 1608 | return value;
|
1620 | 1609 | }
|
1621 | 1610 | return {
|
1622 | 1611 | "value": value,
|
1623 |
| - "length": size |
| 1612 | + "length": c |
1624 | 1613 | };
|
1625 | 1614 | };
|
1626 | 1615 |
|
1627 | 1616 | /**
|
1628 |
| - * Reads a zig-zag encoded 32bit base 128 variable-length integer. |
| 1617 | + * Reads a zig-zag encoded (signed) 32bit base 128 variable-length integer. |
1629 | 1618 | * @param {number=} offset Offset to read from. Will use and increase {@link ByteBuffer#offset} by the number of bytes
|
1630 | 1619 | * written if omitted.
|
1631 | 1620 | * @returns {number|!{value: number, length: number}} The value read if offset is omitted, else the value read
|
|
1717 | 1706 | return value.shiftRightUnsigned(1).xor(value.and(Long.ONE).toSigned().negate()).toSigned();
|
1718 | 1707 | };
|
1719 | 1708 |
|
| 1709 | + var Long0x80 = Long.fromNumber(0x80), |
| 1710 | + Long0x7f = Long.fromNumber(0x7f); |
| 1711 | + |
1720 | 1712 | /**
|
1721 | 1713 | * Writes a 64bit base 128 variable-length integer.
|
1722 | 1714 | * @param {number|Long} value Value to write
|
|
0 commit comments