1 package repl
2
3 import (
4 `fmt`
5 `strings`
6 `unicode`
7 )
8
9 func vector(v []byte, indent int) string {
10 n := len(v)
11 m := make([]string, 0, len(v))
12
13
14 for i := 0; i < n; i++ {
15 if i == 0 || (i & 15) != 0 {
16 m = append(m, fmt.Sprintf("0x%02x", v[n - i - 1]))
17 } else {
18 m = append(m, fmt.Sprintf("\n%s0x%02x", strings.Repeat(" ", indent + 1), v[n - i - 1]))
19 }
20 }
21
22
23 return fmt.Sprintf(
24 "{%s}",
25 strings.Join(m, ", "),
26 )
27 }
28
29 func display(v byte) string {
30 if !unicode.IsPrint(rune(v)) {
31 return "."
32 } else {
33 return string(v)
34 }
35 }
36
37 func vecdiff(v0 []byte, v1 []byte, indent int) string {
38 return vector(v0, indent) + strings.Repeat(" ", indent - 2) + "->" + vector(v1, indent)
39 }
40
41 func asmdump(m []byte, pos uintptr, src string) string {
42 row := -1
43 ret := []string(nil)
44
45
46 if len(m) == 0 {
47 panic("empty instruction bytes")
48 }
49
50
51 for i, v := range m {
52 if i % 7 != 0 {
53 ret[row] = ret[row] + fmt.Sprintf(" %02x", v)
54 } else {
55 ret, row = append(ret, fmt.Sprintf("(%#06x) %02x", pos + uintptr(i), v)), row + 1
56 }
57 }
58
59
60 if n := len(m); n < 7 {
61 ret[0] += strings.Repeat(" ", (7 - n) * 3)
62 }
63
64
65 ret[0] += " " + src
66 return strings.Join(ret, "\n")
67 }
68
69 func hexdump(buf []byte, start uintptr) string {
70 off := 0
71 nbs := len(buf)
72 ret := []string(nil)
73
74
75 for nbs >= 16 {
76 _ = buf[off + 15]
77 ret = append(ret, fmt.Sprintf("%x:", start + uintptr(off)))
78 ret = append(ret, fmt.Sprintf(" %02x %02x %02x %02x", buf[off + 0], buf[off + 1], buf[off + 2], buf[off + 3]))
79 ret = append(ret, fmt.Sprintf(" %02x %02x %02x %02x", buf[off + 4], buf[off + 5], buf[off + 6], buf[off + 7]), " ")
80 ret = append(ret, fmt.Sprintf(" %02x %02x %02x %02x", buf[off + 8], buf[off + 9], buf[off + 10], buf[off + 11]))
81 ret = append(ret, fmt.Sprintf(" %02x %02x %02x %02x", buf[off + 12], buf[off + 13], buf[off + 14], buf[off + 15]), " ")
82
83
84 for i := 0; i < 16; i++ {
85 ret = append(ret, display(buf[off + i]))
86 }
87
88
89 off = off + 16
90 nbs = nbs - 16
91 ret = append(ret, "\n")
92 }
93
94
95 if nbs > 0 {
96 ret = append(ret, fmt.Sprintf("%x:", start + uintptr(off)))
97 }
98
99
100 for i := 0; i < nbs; i++ {
101 if i != 7 {
102 ret = append(ret, fmt.Sprintf(" %02x", buf[off + i]))
103 } else {
104 ret = append(ret, fmt.Sprintf(" %02x ", buf[off + i]))
105 }
106 }
107
108
109 if nbs > 0 {
110 if nbs < 8 {
111 ret = append(ret, strings.Repeat(" ", (17 - int(nbs)) * 3))
112 } else {
113 ret = append(ret, strings.Repeat(" ", (17 - int(nbs)) * 3 - 1))
114 }
115 }
116
117
118 for i := 0; i < nbs; i++ {
119 ret = append(ret, display(buf[off + i]))
120 }
121
122
123 if nbs <= 0 {
124 return strings.Join(ret, "")
125 } else {
126 return strings.Join(append(ret, "\n"), "")
127 }
128 }
129
View as plain text