File tree Expand file tree Collapse file tree 2 files changed +78
-18
lines changed Expand file tree Collapse file tree 2 files changed +78
-18
lines changed Original file line number Diff line number Diff line change @@ -8,15 +8,7 @@ import (
8
8
"unicode/utf8"
9
9
)
10
10
11
- const (
12
- byteOffsetInit = 8
13
- charOffsetInt = 39
14
- line_length = 50
15
- )
16
-
17
11
func main () {
18
- line_offset := 0
19
-
20
12
if len (os .Args ) != 2 {
21
13
fmt .Fprintf (os .Stderr , "Usage: %s [file]\n " , os .Args [0 ])
22
14
os .Exit (1 )
@@ -27,8 +19,21 @@ func main() {
27
19
panic (err )
28
20
}
29
21
defer f .Close ()
22
+ if err := XXD (f , os .Stdout ); err != nil {
23
+ panic (err )
24
+ }
25
+ }
26
+
27
+ const (
28
+ byteOffsetInit = 8
29
+ charOffsetInt = 39
30
+ line_length = 50
31
+ )
32
+
33
+ func XXD (r io.Reader , w io.Writer ) error {
34
+ line_offset := 0
30
35
31
- r : = bufio .NewReader (f )
36
+ r = bufio .NewReader (r )
32
37
buf := make ([]byte , 16 )
33
38
for {
34
39
n , err := r .Read (buf )
@@ -37,41 +42,42 @@ func main() {
37
42
}
38
43
39
44
// Line offset
40
- fmt .Printf ( "%06x0: " , line_offset )
45
+ fmt .Fprintf ( w , "%06x0: " , line_offset )
41
46
line_offset ++
42
47
43
48
// Hex values
44
49
for i := 0 ; i < n ; i ++ {
45
- fmt .Printf ( "%02x" , buf [i ])
50
+ fmt .Fprintf ( w , "%02x" , buf [i ])
46
51
47
52
if i % 2 == 1 {
48
- fmt .Print ( " " )
53
+ fmt .Fprint ( w , " " )
49
54
}
50
55
}
51
56
if n < len (buf ) {
52
57
for i := n ; i < len (buf ); i ++ {
53
- fmt .Printf ( " " )
58
+ fmt .Fprintf ( w , " " )
54
59
if i % 2 == 1 {
55
- fmt .Print ( " " )
60
+ fmt .Fprint ( w , " " )
56
61
}
57
62
}
58
63
}
59
64
60
- fmt .Printf ( " " )
65
+ fmt .Fprintf ( w , " " )
61
66
62
67
// Character values
63
68
b := buf [:n ]
64
69
for len (b ) > 0 {
65
70
r , size := utf8 .DecodeRune (b )
66
71
67
72
if int (r ) > 0x1f && int (r ) < 0x7f {
68
- fmt .Printf ( "%v" , string (r ))
73
+ fmt .Fprintf ( w , "%v" , string (r ))
69
74
} else {
70
- fmt .Printf ( "." )
75
+ fmt .Fprintf ( w , "." )
71
76
}
72
77
b = b [size :]
73
78
}
74
79
75
- fmt .Printf ( "\n " )
80
+ fmt .Fprintf ( w , "\n " )
76
81
}
82
+ return nil
77
83
}
Original file line number Diff line number Diff line change
1
+ package main
2
+
3
+ import (
4
+ "bytes"
5
+ "flag"
6
+ "io"
7
+ "io/ioutil"
8
+ "os/exec"
9
+ "strings"
10
+ "testing"
11
+ "testing/quick"
12
+ )
13
+
14
+ var xxdFile = flag .String ("xxdFile" , "" , "File to test against." )
15
+
16
+ func TestXXD (t * testing.T ) {
17
+ if * xxdFile == "" {
18
+ t .Skip ("-xxdFile argument not given" )
19
+ }
20
+ data , err := ioutil .ReadFile (* xxdFile )
21
+ if err != nil {
22
+ t .Fatal (err )
23
+ }
24
+ test := func (fn func (r io.Reader , w io.Writer ) error ) func (n uint64 ) []string {
25
+ return func (n uint64 ) []string {
26
+ size := n % uint64 (len (data ))
27
+ var out bytes.Buffer
28
+ if err := fn (bytes .NewBuffer (data [0 :size ]), & out ); err != nil {
29
+ return []string {err .Error ()}
30
+ }
31
+ return strings .Split (out .String (), "\n " )
32
+ }
33
+ }
34
+ if err := quick .CheckEqual (test (XXD ), test (xxdNative ), nil ); err != nil {
35
+ cErr := err .(* quick.CheckEqualError )
36
+ size := cErr .In [0 ].(uint64 ) % uint64 (len (data ))
37
+ for i := range cErr .Out1 [0 ].([]string ) {
38
+ got := cErr .Out1 [0 ].([]string )[i ]
39
+ want := cErr .Out2 [0 ].([]string )[i ]
40
+ if got != want {
41
+ t .Errorf ("size: %d\n \n got : %s\n want: %s\n " , size , got , want )
42
+ break
43
+ }
44
+ }
45
+ }
46
+ }
47
+
48
+ func xxdNative (r io.Reader , w io.Writer ) error {
49
+ xxd := exec .Command ("xxd" , "-" )
50
+ xxd .Stdin = r
51
+ xxd .Stdout = w
52
+ xxd .Stderr = w
53
+ return xxd .Run ()
54
+ }
You can’t perform that action at this time.
0 commit comments