src/types/IntegerDataTypeWriter.h
branchv_0
changeset 45 27d5335cd924
parent 44 3f7b5f3f3f84
child 54 d9c68ac8929e
--- a/src/types/IntegerDataTypeWriter.h	Tue Dec 10 19:37:43 2019 +0100
+++ b/src/types/IntegerDataTypeWriter.h	Fri Dec 13 22:19:39 2019 +0100
@@ -36,8 +36,8 @@
 using namespace relpipe::writer;
 
 /**
- * Unsigned variable-length integer.
- * ULEB128
+ * Signed variable-length integer.
+ * LEB128
  */
 class IntegerDataTypeWriter : public DataTypeWriter<integer_t> {
 public:
@@ -47,17 +47,19 @@
 
 	void writeValue(std::ostream &output, const integer_t &value) override {
 		integer_t v = value;
+		bool more;
 		do {
 			octet_t octet = v & 0x7F;
 			v >>= 7;
-			if (v) octet |= 0x80; // more bytes follow
+			more = !(((v == 0) && ((octet & 0x40) == 0)) || ((v == -1) && ((octet & 0x40) != 0)));
+			if (more) octet |= 0x80; // more bytes follow
 			output << char(octet);
-		} while (v);
+		} while (more);
 	}
 
 	integer_t toValue(const string_t &stringValue) override {
 		// throws „terminate called after throwing an instance of 'std::invalid_argument'“ SIGABRT, core dumped on invalid number
-		return stoul(stringValue);
+		return stol(stringValue);
 	}
 
 };