mirror of https://github.com/dirtbags/fluffy.git
Hex dump
This commit is contained in:
parent
45b200eb18
commit
4ce4a8f188
|
@ -1,3 +0,0 @@
|
|||
all:
|
||||
%:
|
||||
$(MAKE) -C .. $@
|
|
@ -0,0 +1,140 @@
|
|||
package netarch
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
)
|
||||
|
||||
const charset = "" +
|
||||
"·☺☻♥♦♣♠•◘○◙♂♀♪♫☼" +
|
||||
"►◄↕‼¶§▬↨↑↓→←∟↔▲▼" +
|
||||
" !\"#$%&'()*+,-./" +
|
||||
"0123456789:;<=>?" +
|
||||
"@ABCDEFGHIJKLMNO" +
|
||||
"PQRSTUVWXYZ[\\]^_" +
|
||||
"`abcdefghijklmno" +
|
||||
"pqrstuvwxyz{|}~⌂" +
|
||||
|
||||
"ÇüéâäàåçêëèïîìÄÅ" +
|
||||
"ÉæÆôöòûùÿÖÜ¢£¥€ƒ" +
|
||||
"áíóúñѪº½⅓¼⅕⅙⅛«»" +
|
||||
"░▒▓│┤╡╢╖╕╣║╗╝╜╛┐" +
|
||||
"└┴┬├─┼╞╟╚╔╩╦╠═╬╧" +
|
||||
"╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀" +
|
||||
"αßΓπΣσµτΦΘΩδ∞φε∩" +
|
||||
"⁰¹²³⁴⁵⁶⁷⁸⁹ⁱⁿ⁽⁼⁾¤"
|
||||
const dropChar = '⛔'
|
||||
|
||||
var chars []rune
|
||||
|
||||
|
||||
|
||||
type Dumper struct {
|
||||
w io.Writer
|
||||
offset int
|
||||
rhs []rune
|
||||
}
|
||||
|
||||
func NewDumper(w io.Writer) *Dumper {
|
||||
return &Dumper{w, 0, make([]rune, 0, 16)}
|
||||
}
|
||||
|
||||
func (d *Dumper) writeRhs() {
|
||||
fmt.Fprint(d.w, " ┆")
|
||||
fmt.Fprint(d.w, string(d.rhs))
|
||||
fmt.Fprintln(d.w, "┆")
|
||||
}
|
||||
|
||||
func (d *Dumper) Close() {
|
||||
nout := (16 - (d.offset % 16)) % 16
|
||||
for i := 0; i < nout; i += 1 {
|
||||
fmt.Print(" ")
|
||||
}
|
||||
if nout > 7 {
|
||||
fmt.Print(" ")
|
||||
}
|
||||
if len(d.rhs) > 0 {
|
||||
d.writeRhs()
|
||||
}
|
||||
fmt.Fprintf(d.w, "%08x\n", d.offset)
|
||||
}
|
||||
|
||||
func (d *Dumper) writeOut(s string, r rune, legit bool) {
|
||||
if d.offset % 16 == 0 {
|
||||
fmt.Fprintf(d.w, "%08x ", d.offset)
|
||||
}
|
||||
|
||||
fmt.Fprint(d.w, s)
|
||||
fmt.Fprint(d.w, " ")
|
||||
if legit {
|
||||
d.rhs = append(d.rhs, r)
|
||||
d.offset += 1
|
||||
}
|
||||
|
||||
switch len(d.rhs) {
|
||||
case 8:
|
||||
fmt.Fprint(d.w, " ")
|
||||
case 16:
|
||||
d.writeRhs()
|
||||
d.rhs = d.rhs[:0]
|
||||
}
|
||||
}
|
||||
|
||||
func (d *Dumper) DumpByte(b byte) {
|
||||
d.writeOut(fmt.Sprintf("%02x", b), chars[b], true)
|
||||
}
|
||||
|
||||
func (d *Dumper) DumpDrop() {
|
||||
d.writeOut("--", dropChar, true)
|
||||
}
|
||||
|
||||
func (d *Dumper) DumpString(s string) {
|
||||
for i := 0; i < len(s); i += 1 {
|
||||
d.DumpByte(s[i])
|
||||
}
|
||||
}
|
||||
|
||||
func (d *Dumper) DumpGap(gaplen int) {
|
||||
for i := 0; i < gaplen; i += 1 {
|
||||
d.DumpDrop()
|
||||
}
|
||||
}
|
||||
|
||||
func (d *Dumper) DumpGapstr(g *Gapstr) {
|
||||
lastpos := 0
|
||||
proc := func(pos int, s string) string {
|
||||
gap := pos - lastpos
|
||||
d.DumpGap(gap)
|
||||
d.DumpString(s)
|
||||
lastpos = gap + len(s)
|
||||
return s
|
||||
}
|
||||
_ = g.Map(proc)
|
||||
}
|
||||
|
||||
|
||||
func FdumpString(w io.Writer, s string) {
|
||||
d := NewDumper(w)
|
||||
d.DumpString(s)
|
||||
d.Close()
|
||||
}
|
||||
|
||||
func FdumpGapstr(w io.Writer, g *Gapstr) {
|
||||
d := NewDumper(w)
|
||||
d.DumpGapstr(g)
|
||||
d.Close()
|
||||
}
|
||||
|
||||
func DumpString(s string) {
|
||||
FdumpString(os.Stdout, s)
|
||||
}
|
||||
|
||||
func DumpGapstr(g *Gapstr) {
|
||||
FdumpGapstr(os.Stdout, g)
|
||||
}
|
||||
|
||||
func init() {
|
||||
chars = []rune(charset)
|
||||
}
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
package netarch
|
||||
|
||||
import (
|
||||
)
|
||||
|
||||
func ExampleStringDump() {
|
||||
DumpString("hello world, I can write!")
|
||||
// Output:
|
||||
// 00000000 68 65 6c 6c 6f 20 77 6f 72 6c 64 2c 20 49 20 63 ┆hello world, I c┆
|
||||
// 00000010 61 6e 20 77 72 69 74 65 21 ┆an write!┆
|
||||
// 00000019
|
||||
}
|
||||
|
||||
func ExampleGapstrDump() {
|
||||
g := new(Gapstr)
|
||||
g = g.AppendString("Hell")
|
||||
g = g.AppendGap(3)
|
||||
g = g.AppendString("orld!")
|
||||
DumpGapstr(g)
|
||||
// Output:
|
||||
// 00000000 48 65 6c 6c -- -- -- 6f 72 6c 64 21 ┆Hell⛔⛔⛔orld!┆
|
||||
// 0000000c
|
||||
}
|
Loading…
Reference in New Issue