From 7bfc9e501288b778140039d0e4cef3726147dfb4 Mon Sep 17 00:00:00 2001 From: Bolke de Bruin <bolke@xs4all.nl> Date: Tue, 14 Jul 2020 14:23:00 +0200 Subject: [PATCH] Drop crlf stuff --- rdg.go | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/rdg.go b/rdg.go index 1ef0016..6e45946 100644 --- a/rdg.go +++ b/rdg.go @@ -619,6 +619,8 @@ func DecodeUTF16(b []byte) (string, error) { return "", fmt.Errorf("must have even length byte slice") } + b, _ = dropCR(b) + u16s := make([]uint16, 1) ret := &bytes.Buffer{} b8buf := make([]byte, 4) @@ -633,3 +635,42 @@ func DecodeUTF16(b []byte) (string, error) { return ret.String(), nil } + +// UTF-16 endian byte order +const ( + unknownEndian = iota + bigEndian + littleEndian +) + +// dropCREndian drops a terminal \r from the endian data. +func dropCREndian(data []byte, t1, t2 byte) []byte { + if len(data) > 1 { + if data[len(data)-2] == t1 && data[len(data)-1] == t2 { + return data[0 : len(data)-2] + } + } + return data +} + +// dropCRBE drops a terminal \r from the big endian data. +func dropCRBE(data []byte) []byte { + return dropCREndian(data, '\x00', '\r') +} + +// dropCRLE drops a terminal \r from the little endian data. +func dropCRLE(data []byte) []byte { + return dropCREndian(data, '\r', '\x00') +} + +// dropCR drops a terminal \r from the data. +func dropCR(data []byte) ([]byte, int) { + var endian = unknownEndian + switch ld := len(data); { + case ld != len(dropCRLE(data)): + endian = littleEndian + case ld != len(dropCRBE(data)): + endian = bigEndian + } + return data, endian +} -- GitLab