miller/pkg/lib/tsv_codec.go
John Kerl d56eafff97
Convert if/else-if chains to typed switch statements (staticcheck QF1003) (#2112)
Replaces 100+ if/else-if chains on a single variable with tagged switch
statements across 72 files. The bulk are transformer option-parsing loops
(switch on opt string), plus a handful of value-dispatch sites in mlrval,
dsl/cst, repl, lib, auxents, and bifs. One case (surv.go) required a
labeled break to preserve the loop-exit behavior of the original else branch.

Fixes staticcheck QF1003 findings.

Co-authored-by: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
2026-06-28 18:27:42 -04:00

69 lines
1.3 KiB
Go

package lib
import (
"bytes"
)
// * https://en.wikipedia.org/wiki/Tab-separated_values
// * https://www.iana.org/assignments/media-types/text/tab-separated-values
// \n for newline,
// \r for carriage return,
// \t for tab,
// \\ for backslash.
// TSVDecodeField is for the TSV record-reader.
func TSVDecodeField(input string) string {
var buffer bytes.Buffer
n := len(input)
for i := 0; i < n; /* increment in loop */ {
c := input[i]
if c == '\\' && i < n-1 {
d := input[i+1]
switch d {
case '\\':
buffer.WriteByte('\\')
i += 2
case 'n':
buffer.WriteByte('\n')
i += 2
case 'r':
buffer.WriteByte('\r')
i += 2
case 't':
buffer.WriteByte('\t')
i += 2
default:
buffer.WriteByte(c)
i++
}
} else {
buffer.WriteByte(c)
i++
}
}
return buffer.String()
}
// TSVEncodeField is for the TSV record-writer.
func TSVEncodeField(input string) string {
var buffer bytes.Buffer
for _, r := range input {
switch r {
case '\\':
buffer.WriteByte('\\')
buffer.WriteByte('\\')
case '\n':
buffer.WriteByte('\\')
buffer.WriteByte('n')
case '\r':
buffer.WriteByte('\\')
buffer.WriteByte('r')
case '\t':
buffer.WriteByte('\\')
buffer.WriteByte('t')
default:
buffer.WriteRune(r)
}
}
return buffer.String()
}