in helpers/shell_escape.go [45:134]
func ShellEscape(str string) string {
if str == "" {
return "''"
}
in := []byte(str)
out := bytes.NewBuffer(make([]byte, 0, len(str)*2))
i := 0
l := len(in)
escape := false
hex := func(char byte) {
escape = true
data := []byte{BACKSLASH, 'x', 0, 0}
hex.Encode(data[2:], []byte{char})
out.Write(data)
}
backslash := func(char byte) {
escape = true
out.Write([]byte{BACKSLASH, char})
}
escaped := func(str string) {
escape = true
out.WriteString(str)
}
quoted := func(char byte) {
escape = true
out.WriteByte(char)
}
literal := func(char byte) {
out.WriteByte(char)
}
for i < l {
char := in[i]
switch {
case char == TAB:
escaped(`\t`)
case char == LF:
escaped(`\n`)
case char == CR:
escaped(`\r`)
case char <= US:
hex(char)
case char <= AMPERSTAND:
quoted(char)
case char == SINGLE_QUOTE:
backslash(char)
case char <= PLUS:
quoted(char)
case char <= NINE:
literal(char)
case char <= QUESTION:
quoted(char)
case char <= LOWERCASE_Z:
literal(char)
case char == OPEN_BRACKET:
quoted(char)
case char == BACKSLASH:
backslash(char)
case char <= CLOSE_BRACKET:
quoted(char)
case char == UNDERSCORE:
literal(char)
case char <= BACKTICK:
quoted(char)
case char <= LOWERCASE_Z:
literal(char)
case char <= TILDA:
quoted(char)
case char == DEL:
hex(char)
default:
hex(char)
}
i++
}
outStr := out.String()
if escape {
outStr = "$'" + outStr + "'"
}
return outStr
}