Add persisted state engine runner

This commit is contained in:
lash
2023-04-13 00:38:33 +01:00
parent 064418cb83
commit a2d947e106
12 changed files with 186 additions and 40 deletions

View File

@@ -33,7 +33,7 @@ type State struct {
ExecPath []string // Command symbols stack
BitSize uint32 // size of (32-bit capacity) bit flag byte array
SizeIdx uint16
flags []byte // Error state
Flags []byte // Error state
input []byte // Last input
}
@@ -64,9 +64,9 @@ func NewState(BitSize uint32) State {
}
byteSize := toByteSize(BitSize + 8)
if byteSize > 0 {
st.flags = make([]byte, byteSize)
st.Flags = make([]byte, byteSize)
} else {
st.flags = []byte{}
st.Flags = []byte{}
}
return st
}
@@ -80,14 +80,14 @@ func(st *State) SetFlag(bitIndex uint32) (bool, error) {
if bitIndex + 1 > st.BitSize {
return false, fmt.Errorf("bit index %v is out of range of bitfield size %v", bitIndex, st.BitSize)
}
r := getFlag(bitIndex, st.flags)
r := getFlag(bitIndex, st.Flags)
if r {
return false, nil
}
byteIndex := bitIndex / 8
localBitIndex := bitIndex % 8
b := st.flags[byteIndex]
st.flags[byteIndex] = b | (1 << localBitIndex)
b := st.Flags[byteIndex]
st.Flags[byteIndex] = b | (1 << localBitIndex)
return true, nil
}
@@ -101,14 +101,14 @@ func(st *State) ResetFlag(bitIndex uint32) (bool, error) {
if bitIndex + 1 > st.BitSize {
return false, fmt.Errorf("bit index %v is out of range of bitfield size %v", bitIndex, st.BitSize)
}
r := getFlag(bitIndex, st.flags)
r := getFlag(bitIndex, st.Flags)
if !r {
return false, nil
}
byteIndex := bitIndex / 8
localBitIndex := bitIndex % 8
b := st.flags[byteIndex]
st.flags[byteIndex] = b & (^(1 << localBitIndex))
b := st.Flags[byteIndex]
st.Flags[byteIndex] = b & (^(1 << localBitIndex))
return true, nil
}
@@ -119,7 +119,7 @@ func(st *State) GetFlag(bitIndex uint32) (bool, error) {
if bitIndex + 1 > st.BitSize {
return false, fmt.Errorf("bit index %v is out of range of bitfield size %v", bitIndex, st.BitSize)
}
return getFlag(bitIndex, st.flags), nil
return getFlag(bitIndex, st.Flags), nil
}
// FlagBitSize reports the amount of bits available in the bit field index.
@@ -129,7 +129,7 @@ func(st *State) FlagBitSize() uint32 {
// FlagBitSize reports the amount of bits available in the bit field index.
func(st *State) FlagByteSize() uint8 {
return uint8(len(st.flags))
return uint8(len(st.Flags))
}
// MatchFlag matches the current state of the given flag.
@@ -169,7 +169,7 @@ func(st *State) GetIndex(flags []byte) bool {
var i uint32
for i = 0; i < st.BitSize; i++ {
testVal := flags[byteIndex] & (1 << localIndex)
if (testVal & st.flags[byteIndex]) > 0 {
if (testVal & st.Flags[byteIndex]) > 0 {
return true
}
globalIndex += 1

View File

@@ -8,16 +8,16 @@ import (
// Check creation
func TestNewState(t *testing.T) {
st := NewState(5)
if len(st.flags) != 2 {
t.Fatalf("invalid state flag length: %v", len(st.flags))
if len(st.Flags) != 2 {
t.Fatalf("invalid state flag length: %v", len(st.Flags))
}
st = NewState(8)
if len(st.flags) != 2 {
t.Fatalf("invalid state flag length: %v", len(st.flags))
if len(st.Flags) != 2 {
t.Fatalf("invalid state flag length: %v", len(st.Flags))
}
st = NewState(17)
if len(st.flags) != 4 {
t.Fatalf("invalid state flag length: %v", len(st.flags))
if len(st.Flags) != 4 {
t.Fatalf("invalid state flag length: %v", len(st.Flags))
}
}
@@ -98,8 +98,8 @@ func TestStateflags(t *testing.T) {
if err == nil {
t.Fatalf("Expected out of range for bit index 17")
}
if !bytes.Equal(st.flags[:3], []byte{0x04, 0x04, 0x01}) {
t.Fatalf("Expected 0x040401, got %v", st.flags[:3])
if !bytes.Equal(st.Flags[:3], []byte{0x04, 0x04, 0x01}) {
t.Fatalf("Expected 0x040401, got %v", st.Flags[:3])
}
}