blob: 93a976002dbec5680701f9666e48e4b8483a413f [file] [log] [blame] [edit]
// Copyright 2017 The Wuffs Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// +build ignore
package main
// checksum.go prints a checksum of stdin's bytes, or of the opening digits of
// π. Checksum algorithms include "adler32" and "crc32/ieee".
//
// Usage: go run checksum.go -algorithm=crc32/ieee < foo.bar
import (
"flag"
"fmt"
"hash"
"hash/adler32"
"hash/crc32"
"io"
"os"
"strings"
)
var (
algorithm = flag.String("algorithm", "adler32", "checksum algorithm")
pi = flag.Bool("pi", false, "checksum the digits of pi instead of stdin")
)
func main() {
if err := main1(); err != nil {
os.Stderr.WriteString(err.Error() + "\n")
os.Exit(1)
}
}
func main1() error {
flag.Parse()
if *pi {
const digits = "3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170"
if len(digits) != 99 {
panic("bad len(digits)")
}
for i := 0; i < 100; i++ {
if err := do(strings.NewReader(digits[:i])); err != nil {
return err
}
fmt.Print(",")
if i&7 == 7 {
fmt.Println()
}
}
} else {
if err := do(os.Stdin); err != nil {
return err
}
fmt.Println()
}
return nil
}
func do(r io.Reader) error {
h := io.Writer(nil)
switch *algorithm {
case "adler32":
h = adler32.New()
case "crc32/ieee":
h = crc32.NewIEEE()
default:
return fmt.Errorf("unknown algorithm %q", *algorithm)
}
if _, err := io.Copy(h, r); err != nil {
return err
}
switch h := h.(type) {
case hash.Hash32:
fmt.Printf("0x%08X", h.Sum32())
case hash.Hash64:
fmt.Printf("0x%016X", h.Sum64())
default:
return fmt.Errorf("algorithm %q is not a Hash32 or Hash64", *algorithm)
}
return nil
}