Brace expansion: Difference between revisions

Content added Content deleted
(→‎{{header|Kotlin}}: Updated example see https://github.com/dkandalov/rosettacode-kotlin for details)
(→‎{{header|Kotlin}}: Updated example see https://github.com/dkandalov/rosettacode-kotlin for details)
Line 1,674: Line 1,674:
var sb = StringBuilder("")
var sb = StringBuilder("")
var i1 = noEscape.indexOf('{')
var i1 = noEscape.indexOf('{')
var i2 = 0
var i2 = 0


outer@ while (i1 != -1) {
outer@ while (i1 != -1) {
Line 1,682: Line 1,682:
while (i2 < s.length && depth > 0) {
while (i2 < s.length && depth > 0) {
val c = noEscape[i2]
val c = noEscape[i2]

if (c == '{')
depth++
if (c == '{') depth++
else if (c == '}')
else if (c == '}') depth--

depth--
if (c == ',' && depth == 1)
if (c == ',' && depth == 1) sb[i2] = '\u0000'
sb[i2] = '\u0000'
else if (c == '}' && depth == 0 && sb.indexOf("\u0000") != -1) break@outer
else if (c == '}' && depth == 0 && sb.indexOf("\u0000") != -1)
break@outer
i2++
i2++
}
}
Line 1,695: Line 1,693:
}
}
if (i1 == -1) {
if (i1 == -1) {
if (suf.length > 0)
if (suf.isNotEmpty()) expandR(pre + s, suf, "")
expandR(pre + s, suf, "")
else println("$pre$s$suf")
else
} else {
println("$pre$s$suf")
for (m in sb.substring(i1 + 1, i2).split('\u0000')) {
}
else {
for (m in sb.substring(i1 + 1, i2).split('\u0000'))
expandR(pre + s.substring(0, i1), m, s.substring(i2 + 1) + suf)
expandR(pre + s.substring(0, i1), m, s.substring(i2 + 1) + suf)
}
}
}
}
}