|
|
|
|
@ -39,7 +39,7 @@ type (
|
|
|
|
|
field string
|
|
|
|
|
|
|
|
|
|
Level int
|
|
|
|
|
levels []StateLevel
|
|
|
|
|
levels []*StateLevel
|
|
|
|
|
Current *StateLevel
|
|
|
|
|
|
|
|
|
|
Pos int
|
|
|
|
|
@ -66,16 +66,15 @@ func ReleaseState (state *State) {
|
|
|
|
|
|
|
|
|
|
func NewState(options ...StateFnc) *State {
|
|
|
|
|
return (&State{
|
|
|
|
|
Level: -1,
|
|
|
|
|
B : bfrs.NewABuffer(),
|
|
|
|
|
levels: make([]StateLevel,levelsLen),
|
|
|
|
|
}).init(options) }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func (s *State) init (options []StateFnc) *State {
|
|
|
|
|
for _,o := range options { o(s) }
|
|
|
|
|
s.levels[0].Ini(ModeValue,0)
|
|
|
|
|
s.Current = &s.levels[0]
|
|
|
|
|
s.Open(ModeValue)
|
|
|
|
|
return s
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -83,15 +82,13 @@ func (s *State) reset () *State {
|
|
|
|
|
s.B.Reset()
|
|
|
|
|
s.key = nil
|
|
|
|
|
s.field = ""
|
|
|
|
|
s.Level = 0
|
|
|
|
|
s.Level = -1
|
|
|
|
|
s.Pos = 0
|
|
|
|
|
s.Err = nil
|
|
|
|
|
s.cyclesCheck = nil
|
|
|
|
|
s.Encrypter = nil
|
|
|
|
|
for i := 0; i<len(s.levels); i++ {
|
|
|
|
|
(&s.levels[i]).Ini(ModeNone,0)
|
|
|
|
|
}
|
|
|
|
|
s.levels = s.levels[:levelsLen]
|
|
|
|
|
s.levels = s.levels[:0]
|
|
|
|
|
s.Current= nil
|
|
|
|
|
return s
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -101,12 +98,8 @@ func (s *State) reset () *State {
|
|
|
|
|
|
|
|
|
|
func (s *State) Open (mode Mode) {
|
|
|
|
|
s.Level++
|
|
|
|
|
if s.Level > levelsLen {
|
|
|
|
|
s.levels = append(s.levels, *((&(StateLevel{})).Ini(mode, s.B.Len())))
|
|
|
|
|
} else {
|
|
|
|
|
(&s.levels[s.Level]).Ini(mode, s.B.Len())
|
|
|
|
|
}
|
|
|
|
|
s.Current = &s.levels[s.Level]
|
|
|
|
|
s.levels = append(s.levels, (&StateLevel{}).Ini(mode, s.B.Len()))
|
|
|
|
|
s.Current = s.levels[s.Level]
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (s *State) Close(mode Mode) {
|
|
|
|
|
@ -115,10 +108,12 @@ func (s *State) Close(mode Mode) {
|
|
|
|
|
s.SetError(apack.G.ErrStateInvalidLevel)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
if s.levels[s.Level].Mode != mode {
|
|
|
|
|
//s.levels = s.levels[:s.Level+1]
|
|
|
|
|
if s.levels[s.Level+1].Mode != mode {
|
|
|
|
|
s.SetError(apack.G.ErrInvalidNode)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
s.Current = &s.levels[s.Level]
|
|
|
|
|
s.Current = s.levels[s.Level]
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|