equal
deleted
inserted
replaced
36 |
36 |
37 using namespace relpipe::protocol; |
37 using namespace relpipe::protocol; |
38 using namespace relpipe::reader; |
38 using namespace relpipe::reader; |
39 |
39 |
40 /** |
40 /** |
41 * Unsigned variable-length integer. |
41 * Signed variable-length integer. |
42 * ULEB128 |
42 * LEB128 |
43 */ |
43 */ |
44 class IntegerDataTypeReader : public DataTypeReader<integer_t> { |
44 class IntegerDataTypeReader : public DataTypeReader<integer_t> { |
45 private: |
45 private: |
46 |
46 |
47 uint8_t readNextOctet(std::istream &input) { |
47 octet_t readNextOctet(std::istream &input) { |
48 uint8_t value = input.get(); |
48 octet_t value = input.get(); |
49 if (input.good()) return value; |
49 if (input.good()) return value; |
50 else throw RelpipeReaderException(L"Unable to read next octet of the integer."); |
50 else throw RelpipeReaderException(L"Unable to read next octet of the integer."); |
51 } |
51 } |
52 |
52 |
53 public: |
53 public: |
62 do { |
62 do { |
63 octet = readNextOctet(input); |
63 octet = readNextOctet(input); |
64 value += integer_t(octet & 0x7F) << shift; |
64 value += integer_t(octet & 0x7F) << shift; |
65 shift += 7; |
65 shift += 7; |
66 } while (octet >= 128); |
66 } while (octet >= 128); |
|
67 |
|
68 if ((shift < (sizeof (integer_t) * 8)) && (octet & 0x40)) |
|
69 value |= (~0 << shift); |
67 return value; |
70 return value; |
68 } |
71 } |
69 |
72 |
70 string_t toString(const integer_t &value) override { |
73 string_t toString(const integer_t &value) override { |
71 return std::to_wstring(value); |
74 return std::to_wstring(value); |