From a5cba20c1e3b0956737327ef9214fd2cbc221add Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Sun, 26 Jan 2020 09:05:07 -0500 Subject: initial commit --- rrdformat/errors_binary.go | 75 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 rrdformat/errors_binary.go (limited to 'rrdformat/errors_binary.go') diff --git a/rrdformat/errors_binary.go b/rrdformat/errors_binary.go new file mode 100644 index 0000000..7329927 --- /dev/null +++ b/rrdformat/errors_binary.go @@ -0,0 +1,75 @@ +package rrdformat + +import ( + "fmt" + "io" +) + +type BinaryError struct { + msg string + ctxPos int + ctxDat []byte + ctxEOF bool +} + +func newBinError(msg string, ctxFile []byte, ctxStart, ctxLen int) error { + if ctxStart+ctxLen > len(ctxFile) { + ctxLen = len(ctxFile) - ctxStart + } + return BinaryError{ + msg: msg, + ctxPos: ctxStart, + ctxDat: ctxFile[ctxStart : ctxStart+ctxLen], + ctxEOF: ctxStart+ctxLen == len(ctxFile), + } +} + +func (e BinaryError) Error() string { + return "invalid RRD: " + e.msg +} + +var cAsciiEscapes = map[byte]byte{ + 0x00: '0', + 0x07: 'a', + 0x08: 'b', + 0x09: 't', + 0x0A: 'n', + 0x0B: 'v', + 0x0C: 'f', + 0x0D: 'r', +} + +func (e BinaryError) Format(s fmt.State, verb rune) { + switch verb { + case 'v': + io.WriteString(s, e.Error()) + if s.Flag('+') { + fmt.Fprintf(s, "\n\tat byte %d:", e.ctxPos) + io.WriteString(s, "\n\t\tascii:") + for _, byte := range e.ctxDat { + if ' ' <= byte && byte <= '~' { + fmt.Fprintf(s, " %c", byte) + } else if c, ok := cAsciiEscapes[byte]; ok { + fmt.Fprintf(s, " \\%c", c) + } else { + io.WriteString(s, " ??") + } + } + if e.ctxEOF { + io.WriteString(s, " ") + } + io.WriteString(s, "\n\t\thex :") + for _, byte := range e.ctxDat { + fmt.Fprintf(s, " %02x", byte) + } + if e.ctxEOF { + io.WriteString(s, " ") + } + io.WriteString(s, "\n") + } + case 's': + io.WriteString(s, e.Error()) + case 'q': + fmt.Fprintf(s, "%q", e.Error()) + } +} -- cgit v1.2.3