aboutsummaryrefslogtreecommitdiff
path: root/chksum
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2017-05-03 00:16:42 +0200
committerDimitri Sokolyuk <demon@dim13.org>2017-05-03 00:16:42 +0200
commit5d57799242d4b6f280a92c3a523a08faf42e26e7 (patch)
tree2c3a7f8ac7c6bb9c3b75b6c971c38446f2bc9eac /chksum
parent9ca2fcf241e54114faf48737ee27d182d301d897 (diff)
parse file
Diffstat (limited to 'chksum')
-rw-r--r--chksum/chksum.go36
-rw-r--r--chksum/chksum_test.go16
-rw-r--r--chksum/testdata/SUM1
3 files changed, 51 insertions, 2 deletions
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