func ShellEscape()

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
}