diff options
author | obscuren <geffobscura@gmail.com> | 2014-05-20 23:09:26 +0800 |
---|---|---|
committer | obscuren <geffobscura@gmail.com> | 2014-05-20 23:09:26 +0800 |
commit | c07c454935609bfb0f65dc38bb596a90d5493fbb (patch) | |
tree | b8d4ffc72b06bcd60d6f61de70bea8b680ed8333 /ethereum/repl_darwin.go | |
parent | 942f552c620471602326c1ded54095c1cf41ed76 (diff) | |
parent | 34014c1c516ea03b28e56db1a0478087d2416f74 (diff) | |
download | go-tangerine-c07c454935609bfb0f65dc38bb596a90d5493fbb.tar go-tangerine-c07c454935609bfb0f65dc38bb596a90d5493fbb.tar.gz go-tangerine-c07c454935609bfb0f65dc38bb596a90d5493fbb.tar.bz2 go-tangerine-c07c454935609bfb0f65dc38bb596a90d5493fbb.tar.lz go-tangerine-c07c454935609bfb0f65dc38bb596a90d5493fbb.tar.xz go-tangerine-c07c454935609bfb0f65dc38bb596a90d5493fbb.tar.zst go-tangerine-c07c454935609bfb0f65dc38bb596a90d5493fbb.zip |
Merge branch 'release/poc5-rc7'poc5-rc7
Diffstat (limited to 'ethereum/repl_darwin.go')
-rw-r--r-- | ethereum/repl_darwin.go | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/ethereum/repl_darwin.go b/ethereum/repl_darwin.go new file mode 100644 index 000000000..87da3df1d --- /dev/null +++ b/ethereum/repl_darwin.go @@ -0,0 +1,93 @@ +package main + +// #cgo LDFLAGS: -lreadline +// #include <stdio.h> +// #include <stdlib.h> +// #include <readline/readline.h> +// #include <readline/history.h> +import "C" + +import ( + "github.com/robertkrimen/otto" + "strings" + "unsafe" +) + +func readLine(prompt *string) *string { + var p *C.char + + //readline allows an empty prompt(NULL) + if prompt != nil { + p = C.CString(*prompt) + } + + ret := C.readline(p) + + if p != nil { + C.free(unsafe.Pointer(p)) + } + + if ret == nil { + return nil + } //EOF + + s := C.GoString(ret) + C.free(unsafe.Pointer(ret)) + return &s +} + +func addHistory(s string) { + p := C.CString(s) + C.add_history(p) + C.free(unsafe.Pointer(p)) +} + +var indentCount = 0 +var str = "" + +func (self *JSRepl) setIndent() { + open := strings.Count(str, "{") + open += strings.Count(str, "(") + closed := strings.Count(str, "}") + closed += strings.Count(str, ")") + indentCount = open - closed + if indentCount <= 0 { + self.prompt = "> " + } else { + self.prompt = strings.Join(make([]string, indentCount*2), "..") + self.prompt += " " + } +} + +func (self *JSRepl) read() { +L: + for { + switch result := readLine(&self.prompt); true { + case result == nil: + break L + + case *result != "": + str += *result + "\n" + + self.setIndent() + + if indentCount <= 0 { + if *result == "exit" { + self.Stop() + break L + } + + addHistory(str) //allow user to recall this line + + self.parseInput(str) + + str = "" + } + } + } +} + +func (self *JSRepl) PrintValue(value otto.Value) { + method, _ := self.re.vm.Get("prettyPrint") + method.Call(method, value) +} |