| // 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 | 
 | } |