From 5d57799242d4b6f280a92c3a523a08faf42e26e7 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Wed, 3 May 2017 00:16:42 +0200 Subject: parse file --- chksum/chksum.go | 36 ++++++++++++++++++++++++++++++++++-- chksum/chksum_test.go | 16 ++++++++++++++++ chksum/testdata/SUM | 1 + 3 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 chksum/chksum_test.go create mode 100644 chksum/testdata/SUM diff --git a/chksum/chksum.go b/chksum/chksum.go index 7abf6a3..6580edd 100644 --- a/chksum/chksum.go +++ b/chksum/chksum.go @@ -1,11 +1,16 @@ package chksum import ( + "bufio" "crypto/md5" "crypto/sha1" "crypto/sha256" "crypto/sha512" + "encoding/hex" + "errors" "hash" + "os" + "regexp" ) /* checksum file format @@ -17,7 +22,7 @@ import ( type Checksum struct { FileName string Alg string - Sum []byte + Bytes []byte Hash hash.Hash } @@ -29,7 +34,34 @@ var hashes = map[string]func() hash.Hash{ } func ParseFile(fname string) ([]Checksum, error) { - return nil, nil + fd, err := os.Open(fname) + if err != nil { + return nil, err + } + defer fd.Close() + + var checklist []Checksum + re := regexp.MustCompile(`(\w+) \(([^\)]+)\) = (\w+)`) + scanner := bufio.NewScanner(fd) + for scanner.Scan() { + //var cs Checksum + r := re.FindStringSubmatch(scanner.Text()) + if len(r) != 4 { + return nil, errors.New("invalid content") + } + h, err := hex.DecodeString(r[3]) + if err != nil { + return nil, err + } + cs := Checksum{ + FileName: r[2], + Alg: r[1], + Bytes: h, + Hash: hashes[r[1]](), + } + checklist = append(checklist, cs) + } + return checklist, scanner.Err() } func (c Checksum) Check() bool { diff --git a/chksum/chksum_test.go b/chksum/chksum_test.go new file mode 100644 index 0000000..0364686 --- /dev/null +++ b/chksum/chksum_test.go @@ -0,0 +1,16 @@ +package chksum + +import "testing" + +func TestParseFile(t *testing.T) { + testCases := []struct { + file string + }{ + {"testdata/SUM"}, + } + for _, tc := range testCases { + t.Run(tc.file, func(t *testing.T) { + ParseFile(tc.file) + }) + } +} diff --git a/chksum/testdata/SUM b/chksum/testdata/SUM new file mode 100644 index 0000000..fb4079a --- /dev/null +++ b/chksum/testdata/SUM @@ -0,0 +1 @@ +MD5 (chksum.go) = 8027f44051361e49f45af17ea723c855 -- cgit v1.2.3