package glob
import (
)
func ( string) Pattern {
:= []Segment{}
:= func( Segment) {
= append(, )
}
:= &parser{, 0, 0}
:
for {
:= .next()
switch {
case eof:
break
case '?':
(Wild{Question, false, nil})
case '*':
:= 1
for .next() == '*' {
++
}
.backup()
if == 1 {
(Wild{Star, false, nil})
} else {
(Wild{StarStar, false, nil})
}
case '/':
for .next() == '/' {
}
.backup()
(Slash{})
default:
var bytes.Buffer
:
for {
switch {
case '?', '*', '/', eof:
break
case '\\':
= .next()
if == eof {
break
}
.WriteRune()
default:
.WriteRune()
}
= .next()
}
.backup()
(Literal{.String()})
}
}
return Pattern{, ""}
}
type parser struct {
src string
pos int
overEOF int
}
const eof rune = -1
func ( *parser) () rune {
if .pos == len(.src) {
.overEOF++
return eof
}
, := utf8.DecodeRuneInString(.src[.pos:])
.pos +=
return
}
func ( *parser) () {
if .overEOF > 0 {
.overEOF--
return
}
, := utf8.DecodeLastRuneInString(.src[:.pos])
.pos -=
}