34 |
34 |
35 using namespace relpipe::protocol; |
35 using namespace relpipe::protocol; |
36 using namespace relpipe::writer; |
36 using namespace relpipe::writer; |
37 |
37 |
38 /** |
38 /** |
39 * Unsigned variable-length integer. |
39 * Signed variable-length integer. |
40 * ULEB128 |
40 * LEB128 |
41 */ |
41 */ |
42 class IntegerDataTypeWriter : public DataTypeWriter<integer_t> { |
42 class IntegerDataTypeWriter : public DataTypeWriter<integer_t> { |
43 public: |
43 public: |
44 |
44 |
45 IntegerDataTypeWriter() : DataTypeWriter<integer_t>(TypeId::INTEGER, DATA_TYPE_CODE_INTEGER) { |
45 IntegerDataTypeWriter() : DataTypeWriter<integer_t>(TypeId::INTEGER, DATA_TYPE_CODE_INTEGER) { |
46 } |
46 } |
47 |
47 |
48 void writeValue(std::ostream &output, const integer_t &value) override { |
48 void writeValue(std::ostream &output, const integer_t &value) override { |
49 integer_t v = value; |
49 integer_t v = value; |
|
50 bool more; |
50 do { |
51 do { |
51 octet_t octet = v & 0x7F; |
52 octet_t octet = v & 0x7F; |
52 v >>= 7; |
53 v >>= 7; |
53 if (v) octet |= 0x80; // more bytes follow |
54 more = !(((v == 0) && ((octet & 0x40) == 0)) || ((v == -1) && ((octet & 0x40) != 0))); |
|
55 if (more) octet |= 0x80; // more bytes follow |
54 output << char(octet); |
56 output << char(octet); |
55 } while (v); |
57 } while (more); |
56 } |
58 } |
57 |
59 |
58 integer_t toValue(const string_t &stringValue) override { |
60 integer_t toValue(const string_t &stringValue) override { |
59 // throws „terminate called after throwing an instance of 'std::invalid_argument'“ SIGABRT, core dumped on invalid number |
61 // throws „terminate called after throwing an instance of 'std::invalid_argument'“ SIGABRT, core dumped on invalid number |
60 return stoul(stringValue); |
62 return stol(stringValue); |
61 } |
63 } |
62 |
64 |
63 }; |
65 }; |
64 |
66 |
65 } |
67 } |