File: cksum.go

package info (click to toggle)
golang-github-vbatts-go-mtree 0.5.4%2Bds-1~exp1
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 796 kB
  • sloc: sh: 198; makefile: 80
file content (49 lines) | stat: -rw-r--r-- 727 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package mtree

import (
	"bufio"
	"io"
)

const posixPolynomial uint32 = 0x04C11DB7

// cksum is an implementation of the POSIX CRC algorithm
func cksum(r io.Reader) (uint32, int, error) {
	in := bufio.NewReader(r)
	count := 0
	var sum uint32
	f := func(b byte) {
		for i := 7; i >= 0; i-- {
			msb := sum & (1 << 31)
			sum = sum << 1
			if msb != 0 {
				sum = sum ^ posixPolynomial
			}
		}
		sum ^= uint32(b)
	}

	for done := false; !done; {
		switch b, err := in.ReadByte(); err {
		case io.EOF:
			done = true
		case nil:
			f(b)
			count++
		default:
			return ^sum, count, err
		}
	}
	for m := count; ; {
		f(byte(m) & 0xff)
		m = m >> 8
		if m == 0 {
			break
		}
	}
	f(0)
	f(0)
	f(0)
	f(0)
	return ^sum, count, nil
}