From 9188922f43493d46c665cf00b18a4e9883b232f1 Mon Sep 17 00:00:00 2001 From: sloum Date: Wed, 17 Mar 2021 13:02:47 -0700 Subject: [PATCH] Modified calculate to allow for string concatenation --- cell.go | 58 ++++++++++++++++++++++++++++------------------------- main.go | 2 +- workbook.go | 2 +- 3 files changed, 33 insertions(+), 29 deletions(-) diff --git a/cell.go b/cell.go index 5b00d0b..c01d789 100644 --- a/cell.go +++ b/cell.go @@ -93,6 +93,7 @@ func (c *cell) Update(val string) bool { c.num = num c.mask = strconv.FormatFloat(num, 'f', -1, 64) } else if strings.HasPrefix(val, "\"") && strings.HasSuffix(val, "\"") { + c.rawVal = strings.Replace(c.rawVal, " ", "\\_", -1) c.kind = Text c.mask = strings.Replace(val[1:len(val)-1], "\\_", " ", -1) } else { @@ -106,10 +107,6 @@ func (c *cell) Calculate() { if c.kind != Expr { return } - if len(c.expr) < 2 { - c.mask = "#Err" - return - } insideString := false s := makeStack() @@ -117,7 +114,7 @@ func (c *cell) Calculate() { if IsAddr(v) { c, err := GetCell(Addr2Point(v)) if err != nil { - c.mask = "#Err" + c.mask = "#Err: Invalid Cell" return } if c.kind == Text { @@ -129,27 +126,14 @@ func (c *cell) Calculate() { // TODO Apply range } - if s.ptr >= 0 && s.text { - c.mask = "#Err" - return - } - switch true { case strings.HasPrefix(v, "\""): - if s.ptr >= 0 { - c.mask = "#Err" - return - } if !strings.HasSuffix(v, "\"") { insideString = true } s.str.WriteString(strings.Replace(v, "\"", "", -1)) s.text = true case insideString: - if s.ptr >= 0 { - c.mask = "#Err" - return - } if strings.HasSuffix(v, "\"") { insideString = false v = strings.Replace(v, "\"", "", -1) @@ -157,22 +141,32 @@ func (c *cell) Calculate() { s.str.WriteRune(' ') s.str.WriteString(v) case IsFunc(v): - if s.text { - c.mask = "#Err" - return - } else if v == "+" { + v = strings.ToUpper(v) + if v == "SPC" { + s.str.WriteRune(' ') + s.text = true + } + if v == "+" { s.Add() - } else if v == "-" { + } + if v == "-" { s.Subtract() - } else if v == "/" { + } + if v == "/" { s.Divide() - } else if v == "*" { + } + if v == "*" { s.Multiply() } + if v == "." { + num := s.Pop() + s.str.WriteString(strconv.FormatFloat(num, 'f', -1, 64)) + s.text = true + } default: v, err := strconv.ParseFloat(v, 64) if err != nil { - c.mask = "#Err" + c.mask = "#Err: Cannot parse float" return } s.Push(v) @@ -180,11 +174,17 @@ func (c *cell) Calculate() { } if s.text { + if s.ptr != -1 { + for s.Len() > 0 { + num := s.Pop() + s.str.WriteString(strconv.FormatFloat(num, 'f', -1, 64)) + } + } c.mask = strings.Replace(s.str.String(), "\\_", " ", -1) } else if s.ptr == 0 { c.mask = strconv.FormatFloat(s.data[0], 'f', -1, 64) } else { - c.mask = "Err" + c.mask = "#Err: Invalid Formula" } } @@ -215,6 +215,10 @@ func (s *stack) Pop() float64 { return s.data[s.ptr+1] } +func (s stack) Len() int { + return s.ptr + 1 +} + func (s *stack) Add() { if s.text { val := strconv.FormatFloat(s.Pop(), 'f', -1, 64) diff --git a/main.go b/main.go index 324e66c..f9aa2eb 100644 --- a/main.go +++ b/main.go @@ -151,7 +151,7 @@ func IsRange(addr string) bool { func IsFunc(val string) bool { switch strings.ToUpper(val) { case "+", "-", "/", "*", "^", "MIN", "MAX", "SQRT", - "ROUND", "SUBSTR", "UPPER", "LOWER", "SUM": + "ROUND", "SUBSTR", "UPPER", "LOWER", "SUM", "SPC", ".": return true default: return false diff --git a/workbook.go b/workbook.go index d548042..a439a5e 100644 --- a/workbook.go +++ b/workbook.go @@ -65,7 +65,7 @@ func (w *workbook) Run() { w.sheets[w.sheet].moveSelection(input, w.termRows) case Quit: if modified { - fmt.Print("There are unsaved changes. Quit? [y/n]") + fmt.Print("There are unsaved changes. Quit anyway? [y/n]") answer := Getch() if answer == 'n' || answer == 'N' { continue