mirror of
https://github.com/vbatts/go-mtree.git
synced 2024-11-15 13:18:45 +00:00
Vincent Batts
455edf6d21
For the most part, all the keywords for a standard mtree spec now have a function to produce the contents for a creator. These are used in the "walk" function, and will be used next in the "check" logic. This is still a WIP, as the DirectoryHierarchy produced from the current Walk() is not all-together a valid document. Signed-off-by: Vincent Batts <vbatts@hashbangbash.com>
48 lines
674 B
Go
48 lines
674 B
Go
package mtree
|
|
|
|
import (
|
|
"bufio"
|
|
"io"
|
|
)
|
|
|
|
const posixPolynomial uint32 = 0x04C11DB7
|
|
|
|
func cksum(r io.Reader) (uint32, int, error) {
|
|
in := bufio.NewReader(r)
|
|
count := 0
|
|
var sum uint32 = 0
|
|
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
|
|
}
|