diff options
Diffstat (limited to 'format/packfile/ingest/distance.go')
| -rw-r--r-- | format/packfile/ingest/distance.go | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/format/packfile/ingest/distance.go b/format/packfile/ingest/distance.go new file mode 100644 index 00000000..9bc4d886 --- /dev/null +++ b/format/packfile/ingest/distance.go @@ -0,0 +1,30 @@ +package ingest + +import ( + "fmt" + "io" +) + +// readOfsDistanceFromStream reads one ofs-delta encoded distance. +func readOfsDistanceFromStream(reader io.ByteReader) (uint64, int, error) { + first, err := reader.ReadByte() + if err != nil { + return 0, 0, fmt.Errorf("read ofs distance first byte: %w", err) + } + + dist := uint64(first & 0x7f) + consumed := 1 + + b := first + for b&0x80 != 0 { + b, err = reader.ReadByte() + if err != nil { + return 0, 0, fmt.Errorf("read ofs distance continuation: %w", err) + } + + consumed++ + dist = ((dist + 1) << 7) + uint64(b&0x7f) + } + + return dist, consumed, nil +} |
