diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a7e55de --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +examples/**/*.bin diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..f5e543c --- /dev/null +++ b/Makefile @@ -0,0 +1,6 @@ +examples: profile + +.PHONY: profile + +profile: + bash examples/compile.sh examples/profile diff --git a/asm/asm.go b/asm/asm.go index fa0521c..88c6d95 100644 --- a/asm/asm.go +++ b/asm/asm.go @@ -93,8 +93,13 @@ func parseTwoSym(b *bytes.Buffer, arg Arg) (int, error) { selector = strconv.FormatUint(uint64(*arg.Size), 10) sym = *arg.Selector } else if arg.Selector != nil { - sym = *arg.Sym - selector = *arg.Selector + if *arg.Sym == "*" { + sym = *arg.Selector + selector = *arg.Sym + } else { + sym = *arg.Sym + selector = *arg.Selector + } } n, err := writeSym(b, selector) @@ -255,7 +260,7 @@ var ( {"Comment", `(?:#)[^\n]*`}, {"Ident", `^[A-Z]+`}, {"Size", `[0-9]+`}, - {"Sym", `[a-zA-Z_][a-zA-Z0-9_]*`}, + {"Sym", `[a-zA-Z_\*][a-zA-Z0-9_]*`}, {"Whitespace", `[ \t]+`}, {"EOL", `[\n\r]+`}, {"Quote", `["']`}, @@ -297,6 +302,9 @@ func writeDisplay(w *bytes.Buffer, s string) (int, error) { return w.WriteString(s) } func writeSize(w *bytes.Buffer, n uint32) (int, error) { + if n == 0 { + return w.Write([]byte{0x01, 0x00}) + } bn := [4]byte{} sz := numSize(n) if sz > 4 { diff --git a/cache/cache.go b/cache/cache.go index d6fe1a2..a4cfb53 100644 --- a/cache/cache.go +++ b/cache/cache.go @@ -51,9 +51,12 @@ func(ca *Cache) Add(key string, value string, sizeLimit uint16) error { } return fmt.Errorf("key %v already defined in frame %v", key, checkFrame) } - sz := ca.checkCapacity(value) - if sz == 0 { - return fmt.Errorf("Cache capacity exceeded %v of %v", ca.CacheUseSize + sz, ca.CacheSize) + var sz uint32 + if len(value) > 0 { + sz = ca.checkCapacity(value) + if sz == 0 { + return fmt.Errorf("Cache capacity exceeded %v of %v", ca.CacheUseSize + sz, ca.CacheSize) + } } log.Printf("add key %s value size %v limit %v", key, sz, sizeLimit) ca.Cache[len(ca.Cache)-1][key] = value diff --git a/dev/interactive/main.go b/dev/interactive/main.go index 9274c0a..1b85bb8 100644 --- a/dev/interactive/main.go +++ b/dev/interactive/main.go @@ -13,9 +13,11 @@ func main() { var dir string var root string var size uint + //var sessionId string flag.StringVar(&dir, "d", ".", "resource dir to read from") flag.UintVar(&size, "s", 0, "max size of output") flag.StringVar(&root, "root", "root", "entry point symbol") + //flag.StringVar(&sessionId, "session-id", "default", "session id") flag.Parse() fmt.Fprintf(os.Stderr, "starting session at symbol '%s' using resource dir: %s\n", root, dir) diff --git a/engine/engine.go b/engine/engine.go index 61a12cf..9efd98f 100644 --- a/engine/engine.go +++ b/engine/engine.go @@ -37,13 +37,13 @@ func NewEngine(cfg Config, st *state.State, rs resource.Resource, ca cache.Memor if cfg.OutputSize > 0 { szr = render.NewSizer(cfg.OutputSize) } + ctx = context.WithValue(ctx, "sessionId", cfg.SessionId) engine := Engine{ st: st, rs: rs, ca: ca, vm: vm.NewVm(st, rs, ca, szr), } - //if cfg.Root != "" { if st.Moves == 0 { engine.Init(cfg.Root, ctx) } diff --git a/examples/compile.bash b/examples/compile.bash new file mode 100644 index 0000000..c77eeb2 --- /dev/null +++ b/examples/compile.bash @@ -0,0 +1,5 @@ +for f in $(ls $1); do + b=$(basename $f) + b=${b%.*} + go run ./dev/asm $1/$b.vis > $1/$b.bin +done diff --git a/examples/profile/entry_name b/examples/profile/entry_name new file mode 100644 index 0000000..220fc22 --- /dev/null +++ b/examples/profile/entry_name @@ -0,0 +1,2 @@ +Name is currently: {{.myname}} +Enter new name. diff --git a/examples/profile/entry_name.vis b/examples/profile/entry_name.vis new file mode 100644 index 0000000..f12a8a8 --- /dev/null +++ b/examples/profile/entry_name.vis @@ -0,0 +1,6 @@ +LOAD myname 32 +MAP myname +MOUT 0 "abort" +HALT +INCMP 0 _ +INCMP * entry_name_save diff --git a/examples/profile/entry_name_save b/examples/profile/entry_name_save new file mode 100644 index 0000000..e69de29 diff --git a/examples/profile/entry_name_save.vis b/examples/profile/entry_name_save.vis new file mode 100644 index 0000000..9a28f13 --- /dev/null +++ b/examples/profile/entry_name_save.vis @@ -0,0 +1,3 @@ +LOAD entry_name_save 0 +RELOAD myname +MOVE _ diff --git a/examples/profile/main.go b/examples/profile/main.go new file mode 100644 index 0000000..8bfce79 --- /dev/null +++ b/examples/profile/main.go @@ -0,0 +1,58 @@ +package main + +import ( + "context" + "flag" + "fmt" + "io/ioutil" + "os" + "path" + + testdataloader "github.com/peteole/testdata-loader" + + "git.defalsify.org/vise/cache" + "git.defalsify.org/vise/engine" + "git.defalsify.org/vise/resource" + "git.defalsify.org/vise/state" +) + +var ( + baseDir = testdataloader.GetBasePath() + scriptDir = path.Join(baseDir, "examples", "profile") +) + +func nameSave(sym string, input []byte, ctx context.Context) (resource.Result, error) { + fp := path.Join(scriptDir, "myname.txt") + err := ioutil.WriteFile(fp, input, 0600) + return resource.Result{}, err +} + +func main() { + var dir string + var root string + var size uint + var sessionId string + flag.UintVar(&size, "s", 0, "max size of output") + flag.StringVar(&root, "root", "root", "entry point symbol") + flag.StringVar(&sessionId, "session-id", "default", "session id") + flag.Parse() + fmt.Fprintf(os.Stderr, "starting session at symbol '%s' using resource dir: %s\n", root, dir) + + st := state.NewState(0) + rs := resource.NewFsResource(scriptDir) + rs.AddLocalFunc("entry_name_save", nameSave) + ca := cache.NewCache() + cfg := engine.Config{ + Root: "root", + SessionId: sessionId, + OutputSize: uint32(size), + } + ctx := context.Background() + en := engine.NewEngine(cfg, &st, &rs, ca, ctx) + + err := engine.Loop(&en, os.Stdin, os.Stdout, ctx) + if err != nil { + fmt.Fprintf(os.Stderr, "loop exited with error: %v", err) + os.Exit(1) + } +} diff --git a/examples/profile/myname.txt b/examples/profile/myname.txt new file mode 100644 index 0000000..c01de2b --- /dev/null +++ b/examples/profile/myname.txt @@ -0,0 +1 @@ +inky \ No newline at end of file diff --git a/examples/profile/root b/examples/profile/root new file mode 100644 index 0000000..1f4a867 --- /dev/null +++ b/examples/profile/root @@ -0,0 +1 @@ +Please input profile data diff --git a/examples/profile/root.vis b/examples/profile/root.vis new file mode 100644 index 0000000..b77977b --- /dev/null +++ b/examples/profile/root.vis @@ -0,0 +1,3 @@ +DOWN entry_name 0 "name" +DOWN entry_email 1 "email" +DOWN entry_sex 2 "sex" diff --git a/testdata/foo.fst b/testdata/foo.vis similarity index 100% rename from testdata/foo.fst rename to testdata/foo.vis diff --git a/vm/runner.go b/vm/runner.go index d7e165a..db62bda 100644 --- a/vm/runner.go +++ b/vm/runner.go @@ -264,7 +264,7 @@ func(vm *Vm) RunMove(b []byte, ctx context.Context) ([]byte, error) { if err != nil { return b, err } - log.Printf("loaded additional code: %x", code) + log.Printf("loaded code for %s: %x", sym, code) b = append(b, code...) vm.Reset() return b, nil