in kyuubi-util-scala/src/main/scala/org/apache/kyuubi/util/command/CommandLineUtils.scala [85:160]
def parseOptionString(s: String): List[String] = {
val opts = ListBuffer[String]()
val opt = new StringBuilder()
var inOpt = false
var inSingleQuote = false
var inDoubleQuote = false
var escapeNext = false
var hasData = false
var i = 0
while (i < s.length) {
val c = s.codePointAt(i)
if (escapeNext) {
opt.appendAll(Character.toChars(c))
escapeNext = false
} else if (inOpt) {
c match {
case '\\' =>
if (inSingleQuote) {
opt.appendAll(Character.toChars(c))
} else {
escapeNext = true
}
case '\'' =>
if (inDoubleQuote) {
opt.appendAll(Character.toChars(c))
} else {
inSingleQuote = !inSingleQuote
}
case '"' =>
if (inSingleQuote) {
opt.appendAll(Character.toChars(c))
} else {
inDoubleQuote = !inDoubleQuote
}
case _ =>
if (!Character.isWhitespace(c) || inSingleQuote || inDoubleQuote) {
opt.appendAll(Character.toChars(c))
} else {
opts += opt.toString()
opt.setLength(0)
inOpt = false
hasData = false
}
}
} else {
c match {
case '\'' =>
inSingleQuote = true
inOpt = true
hasData = true
case '"' =>
inDoubleQuote = true
inOpt = true
hasData = true
case '\\' =>
escapeNext = true
inOpt = true
hasData = true
case _ =>
if (!Character.isWhitespace(c)) {
inOpt = true
hasData = true
opt.appendAll(Character.toChars(c))
}
}
}
i += Character.charCount(c)
}
require(!inSingleQuote && !inDoubleQuote && !escapeNext, s"Invalid option string: $s")
if (hasData) {
opts += opt.toString()
}
opts.toList
}