From 16421106d47efb65331ed9f0499f12038158cbf1 Mon Sep 17 00:00:00 2001 From: obscuren Date: Mon, 19 May 2014 13:04:31 +0200 Subject: [PATCH] Added multi-line support --- ethereum/javascript_console.go | 5 +++-- ethereum/repl_darwin.go | 37 ++++++++++++++++++++++++++++------ ethereum/repl_windows.go | 2 +- 3 files changed, 35 insertions(+), 9 deletions(-) diff --git a/ethereum/javascript_console.go b/ethereum/javascript_console.go index 884b9a629..1e1ae0e48 100644 --- a/ethereum/javascript_console.go +++ b/ethereum/javascript_console.go @@ -101,14 +101,15 @@ func (self *JSRE) Run(code string) (otto.Value, error) { type JSRepl struct { re *JSRE + + prompt string } func NewJSRepl(ethereum *eth.Ethereum) *JSRepl { - return &JSRepl{re: NewJSRE(ethereum)} + return &JSRepl{re: NewJSRE(ethereum), prompt: "> "} } func (self *JSRepl) Start() { - fmt.Println("Eth JavaScript console") self.read() } diff --git a/ethereum/repl_darwin.go b/ethereum/repl_darwin.go index b6de190e4..483d4cedf 100644 --- a/ethereum/repl_darwin.go +++ b/ethereum/repl_darwin.go @@ -6,7 +6,11 @@ package main // #include // #include import "C" -import "unsafe" + +import ( + "strings" + "unsafe" +) func readLine(prompt *string) *string { var p *C.char @@ -37,19 +41,40 @@ func addHistory(s string) { C.free(unsafe.Pointer(p)) } -func (self *JSRepl) read() { - prompt := "eth >>> " +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(&prompt); true { + switch result := readLine(&self.prompt); true { case result == nil: break L //exit loop case *result != "": //ignore blank lines - addHistory(*result) //allow user to recall this line + str += *result + "\n" - self.parseInput(*result) + self.setIndent() + + if indentCount <= 0 { + addHistory(str) //allow user to recall this line + + self.parseInput(str) + } } } } diff --git a/ethereum/repl_windows.go b/ethereum/repl_windows.go index c65bb1cb4..c42fd6e6a 100644 --- a/ethereum/repl_windows.go +++ b/ethereum/repl_windows.go @@ -9,7 +9,7 @@ import ( func (self *JSRepl) read() { reader := bufio.NewReader(os.Stdin) for { - fmt.Printf("eth >>> ") + fmt.Printf(self.prompt) str, _, err := reader.ReadLine() if err != nil { fmt.Println("Error reading input", err)