return strings.ToUpper(hex.EncodeToString(b))
}
+func printbin(s []byte) {
+ sLen := len(s)
+ var dots string
+ if sLen > int(*MaxStrLen) {
+ s = s[:int(*MaxStrLen)]
+ dots = "..."
+ }
+ fmt.Printf("%s%d%s:%s%s\n", Magenta, sLen, Reset, hexenc(s), dots)
+}
+
func printer(iter *keks.Iterator, count int, inList, inMap bool) {
for i := 0; i < count; i++ {
if !iter.Next() {
}
depth := iter.Depth
fmt.Print(Blue + strconv.Itoa(depth) + Reset)
+ var key string
+ if inMap {
+ key = iter.Str()
+ if !iter.Next() {
+ panic("unexpected")
+ }
+ }
+ fmt.Printf(" %s%03d%s ", Red, iter.Offset(), Reset)
prindent(depth)
if inList {
fmt.Printf("%s%d:%s ", Yellow, i, Reset)
} else if inMap {
- fmt.Printf("%s%s%s: ", Green, iter.Str(), Reset)
- if !iter.Next() {
- panic("unexpected")
- }
+ fmt.Printf("%s%s%s: ", Green, key, Reset)
}
switch iter.T {
case types.List:
fmt.Printf("[ %s%d%s\n", Cyan, iter.Len(), Reset)
printer(iter, iter.Len(), true, false)
prindent(depth)
- fmt.Println(" ]")
+ fmt.Println(" " + " ]")
case types.Map:
fmt.Printf("{ %s%d%s\n", Cyan, iter.Len(), Reset)
printer(iter, iter.Len(), false, true)
prindent(depth)
- fmt.Println(" }")
+ fmt.Println(" " + " }")
case types.NIL:
fmt.Println("NIL")
case types.Blob:
blob := iter.Blob()
fmt.Printf("BLOB[ %s%d l=%d%s\n", Cyan, len(blob.Chunks), blob.ChunkLen, Reset)
+ off := iter.Offset() + 1 + 8
for i, chunk := range blob.Chunks {
- fmt.Print(strings.Repeat(" ", iter.Depth+1))
- fmt.Printf("%d: %d:%s\n", i, len(chunk), hexenc([]byte(chunk)))
+ fmt.Print(Blue + strconv.Itoa(depth+1) + Reset)
+ fmt.Printf(" %s%03d%s ", Red, off, Reset)
+ prindent(depth + 1)
+ fmt.Printf("%s%d:%s ", Yellow, i, Reset)
+ printbin([]byte(chunk))
+ off += int64(len(chunk)) + 1
}
+ prindent(depth)
+ fmt.Println(" " + " ]")
case types.TAI64:
t := iter.TAI64().Time()
utc, isLeap := tai64n.Leapsecs.Sub(t)
t := iter.TAI64NA()
fmt.Printf("TAI64NA(%s)\n", hexenc(t[:]))
case types.Bin:
- s := iter.Bin()
- var dots string
- if len(s) > int(*MaxStrLen) {
- s = s[:int(*MaxStrLen)]
- dots = "..."
- }
- fmt.Printf("%s%d%s:%s%s\n", Magenta, len(s), Reset, hexenc(s), dots)
+ printbin(iter.Bin())
case types.Str:
fmt.Print(`"`)
s := iter.Str()
- if len(s) > int(*MaxStrLen) {
+ sLen := len(s)
+ if sLen > int(*MaxStrLen) {
fmt.Print(s[:int(*MaxStrLen)])
fmt.Print("...")
} else {
func main() {
flag.Parse()
- ctx := keks.NewDecoderFromReader(bufio.NewReader(os.Stdin), nil)
+ ctx := keks.NewDecoderFromReader(
+ bufio.NewReader(os.Stdin),
+ &keks.DecodeOpts{SaveOffsets: true},
+ )
_, err := ctx.Parse()
if err != nil {
log.Fatal(err)