summaryrefslogtreecommitdiff
path: root/src/varint.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/varint.zig')
-rw-r--r--src/varint.zig14
1 files changed, 14 insertions, 0 deletions
diff --git a/src/varint.zig b/src/varint.zig
new file mode 100644
index 0000000..45207cf
--- /dev/null
+++ b/src/varint.zig
@@ -0,0 +1,14 @@
+const std = @import("std");
+
+pub fn parse(data: []const u8) struct { value: u64, len: usize } {
+ var result: u64 = 0;
+ var i: usize = 0;
+
+ while (i < data.len and i < 9) : (i += 1) {
+ const byte = data[i];
+ result |= @as(u64, byte & 0x7f) << @as(u6, @intCast(i * 7));
+ if ((byte & 0x80) == 0) return .{ .value = result, .len = i + 1 };
+ }
+
+ return .{ .value = result, .len = i };
+}