Refactor cleanPath switch cases

This commit is contained in:
Adrian Setyadi 2019-07-03 05:48:40 +07:00
parent 01ca625b98
commit 32ba640d75
1 changed files with 31 additions and 21 deletions

52
path.go
View File

@ -48,34 +48,44 @@ func cleanPath(p string) string {
// loop has no expensive function calls (except 1x make)
for r < n {
switch {
case p[r] == '/':
switch p[r] {
case '/':
// empty path element, trailing slash is added after the end
r++
case p[r] == '.' && r+1 == n:
trailing = true
r++
case p[r] == '.' && p[r+1] == '/':
case '.':
// . element
r += 2
if r+1 == n {
trailing = true
r++
continue
case p[r] == '.' && p[r+1] == '.' && (r+2 == n || p[r+2] == '/'):
// .. element: remove to last /
r += 3
} else {
switch p[r+1] {
case '/':
r += 2
continue
if w > 1 {
// can backtrack
w--
case '.':
if r+2 == n || p[r+2] == '/' {
// .. element: remove to last /
r += 3
if buf == nil {
for w > 1 && p[w] != '/' {
w--
}
} else {
for w > 1 && buf[w] != '/' {
w--
if w > 1 {
// can backtrack
w--
if buf == nil {
for w > 1 && p[w] != '/' {
w--
}
} else {
for w > 1 && buf[w] != '/' {
w--
}
}
}
continue
}
}
}