|
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