53 lines
1005 B
Go
53 lines
1005 B
Go
package vm
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"regexp"
|
|
|
|
"git.defalsify.org/festive/state"
|
|
)
|
|
|
|
var (
|
|
inputRegexStr = "^[a-zA-Z0-9].*$"
|
|
inputRegex = regexp.MustCompile(inputRegexStr)
|
|
ctrlInputRegexStr = "^[<>_]$"
|
|
ctrlInputRegex = regexp.MustCompile(inputRegexStr)
|
|
)
|
|
|
|
|
|
func CheckInput(input []byte) error {
|
|
if !inputRegex.Match(input) {
|
|
return fmt.Errorf("Input '%s' does not match format /%s/", input, inputRegexStr)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func applyControlInput(input []byte, st *state.State, ctx context.Context) (string, error) {
|
|
var err error
|
|
sym, idx := st.Where()
|
|
switch input[0] {
|
|
case '_':
|
|
sym, err = st.Up()
|
|
if err != nil {
|
|
return sym, err
|
|
}
|
|
}
|
|
_ = idx
|
|
return sym, nil
|
|
}
|
|
|
|
func ApplyInput(inputString string, st *state.State, ctx context.Context) (string, error) {
|
|
input := []byte(inputString)
|
|
if ctrlInputRegex.Match(input) {
|
|
return applyControlInput(input, st, ctx)
|
|
}
|
|
|
|
err := CheckInput(input)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
st.Down(inputString)
|
|
return inputString, nil
|
|
}
|