2 Commits

Author SHA1 Message Date
28abd79961 bump version 2023-12-07 13:46:34 +01:00
dd14e7ec35 don't show shortcuts in help (clutters it) 2023-12-07 13:43:45 +01:00
24 changed files with 28 additions and 158 deletions

View File

@@ -57,8 +57,8 @@ test:
go test -v ./... go test -v ./...
singletest: singletest:
@echo "Call like this: make singletest TEST=TestPrepareColumns ARGS=-v" @echo "Call like this: ''make singletest TEST=TestPrepareColumns"
go test -run $(TEST) $(ARGS) go test -run $(TEST)
cover-report: cover-report:
go test ./... -cover -coverprofile=coverage.out go test ./... -cover -coverprofile=coverage.out

32
calc.go
View File

@@ -261,7 +261,7 @@ func (c *Calc) Eval(line string) {
continue continue
} }
if exists(c.Funcalls, item) { if _, ok := c.Funcalls[item]; ok {
if err := c.DoFuncall(item); err != nil { if err := c.DoFuncall(item); err != nil {
fmt.Println(err) fmt.Println(err)
} else { } else {
@@ -270,18 +270,20 @@ func (c *Calc) Eval(line string) {
continue continue
} }
if exists(c.BatchFuncalls, item) { if c.batch {
if !c.batch { if _, ok := c.BatchFuncalls[item]; ok {
if err := c.DoFuncall(item); err != nil {
fmt.Println(err)
} else {
c.Result()
}
continue
}
} else {
if _, ok := c.BatchFuncalls[item]; ok {
fmt.Println("only supported in batch mode") fmt.Println("only supported in batch mode")
continue continue
} }
if err := c.DoFuncall(item); err != nil {
fmt.Println(err)
} else {
c.Result()
}
continue
} }
if contains(c.LuaFunctions, item) { if contains(c.LuaFunctions, item) {
@@ -302,22 +304,22 @@ func (c *Calc) Eval(line string) {
} }
// internal commands // internal commands
if exists(c.Commands, item) { if _, ok := c.Commands[item]; ok {
c.Commands[item].Func(c) c.Commands[item].Func(c)
continue continue
} }
if exists(c.ShowCommands, item) { if _, ok := c.ShowCommands[item]; ok {
c.ShowCommands[item].Func(c) c.ShowCommands[item].Func(c)
continue continue
} }
if exists(c.StackCommands, item) { if _, ok := c.StackCommands[item]; ok {
c.StackCommands[item].Func(c) c.StackCommands[item].Func(c)
continue continue
} }
if exists(c.SettingsCommands, item) { if _, ok := c.SettingsCommands[item]; ok {
c.SettingsCommands[item].Func(c) c.SettingsCommands[item].Func(c)
continue continue
} }
@@ -505,7 +507,7 @@ func (c *Calc) PutVar(name string) {
} }
func (c *Calc) GetVar(name string) { func (c *Calc) GetVar(name string) {
if exists(c.Vars, name) { if _, ok := c.Vars[name]; ok {
c.Debug(fmt.Sprintf("retrieve %.2f from %s", c.Vars[name], name)) c.Debug(fmt.Sprintf("retrieve %.2f from %s", c.Vars[name], name))
c.stack.Backup() c.stack.Backup()
c.stack.Push(c.Vars[name]) c.stack.Push(c.Vars[name])

4
go.mod
View File

@@ -4,9 +4,7 @@ go 1.20
require ( require (
github.com/chzyer/readline v1.5.1 // indirect github.com/chzyer/readline v1.5.1 // indirect
github.com/rogpeppe/go-internal v1.11.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect github.com/spf13/pflag v1.0.5 // indirect
github.com/yuin/gopher-lua v1.1.0 // indirect github.com/yuin/gopher-lua v1.1.0 // indirect
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f // indirect golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5 // indirect
golang.org/x/tools v0.1.12 // indirect
) )

6
go.sum
View File

@@ -2,15 +2,9 @@ github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwys
github.com/chzyer/readline v1.5.1 h1:upd/6fQk4src78LMRzh5vItIt361/o4uq553V8B5sGI= github.com/chzyer/readline v1.5.1 h1:upd/6fQk4src78LMRzh5vItIt361/o4uq553V8B5sGI=
github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk= github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk=
github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8=
github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M=
github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA=
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/yuin/gopher-lua v1.1.0 h1:BojcDhfyDWgU2f2TOzYK/g5p2gxMrku8oupLDqlnSqE= github.com/yuin/gopher-lua v1.1.0 h1:BojcDhfyDWgU2f2TOzYK/g5p2gxMrku8oupLDqlnSqE=
github.com/yuin/gopher-lua v1.1.0/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw= github.com/yuin/gopher-lua v1.1.0/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw=
golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5 h1:y/woIyUBFbpQGKS0u1aHF/40WUDnek3fPOyD08H5Vng= golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5 h1:y/woIyUBFbpQGKS0u1aHF/40WUDnek3fPOyD08H5Vng=
golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f h1:v4INt8xihDGvnrfjMDVXGxw9wrfxYyCjk0KbXjhR55s=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=

22
main.go
View File

@@ -42,7 +42,6 @@ Options:
-s, --stack show last 5 items of the stack (off by default) -s, --stack show last 5 items of the stack (off by default)
-i --intermediate print intermediate results -i --intermediate print intermediate results
-m, --manual show manual -m, --manual show manual
-c, --config <file> load <file> containing LUA code
-v, --version show version -v, --version show version
-h, --help show help -h, --help show help
@@ -52,10 +51,6 @@ this only when working with stdin. E.g.: echo "2 3 4 5" | rpn +
Copyright (c) 2023 T.v.Dein` Copyright (c) 2023 T.v.Dein`
func main() { func main() {
os.Exit(Main())
}
func Main() int {
calc := NewCalc() calc := NewCalc()
showversion := false showversion := false
@@ -79,12 +74,12 @@ func Main() int {
if showversion { if showversion {
fmt.Printf("This is rpn version %s\n", VERSION) fmt.Printf("This is rpn version %s\n", VERSION)
return 0 return
} }
if showhelp { if showhelp {
fmt.Println(Usage) fmt.Println(Usage)
return 0 return
} }
if enabledebug { if enabledebug {
@@ -93,7 +88,7 @@ func Main() int {
if showmanual { if showmanual {
man() man()
return 0 os.Exit(0)
} }
// the lua state object is global, instanciate it early // the lua state object is global, instanciate it early
@@ -106,13 +101,6 @@ func Main() int {
luarunner := NewInterpreter(configfile, enabledebug) luarunner := NewInterpreter(configfile, enabledebug)
luarunner.InitLua() luarunner.InitLua()
calc.SetInt(luarunner) calc.SetInt(luarunner)
if calc.debug {
fmt.Println("loaded config")
}
} else {
if calc.debug {
fmt.Println(err)
}
} }
if len(flag.Args()) > 1 { if len(flag.Args()) > 1 {
@@ -120,7 +108,7 @@ func Main() int {
// called like rpn 2 2 + // called like rpn 2 2 +
calc.stdin = true calc.stdin = true
calc.Eval(strings.Join(flag.Args(), " ")) calc.Eval(strings.Join(flag.Args(), " "))
return 0 return
} }
// interactive mode, need readline // interactive mode, need readline
@@ -164,8 +152,6 @@ func Main() int {
calc.batch = true calc.batch = true
calc.Eval(flag.Args()[0]) calc.Eval(flag.Args()[0])
} }
return 0
} }
func inputIsStdin() bool { func inputIsStdin() bool {

View File

@@ -1,20 +0,0 @@
package main
import (
"os"
"testing"
"github.com/rogpeppe/go-internal/testscript"
)
func TestMain(m *testing.M) {
os.Exit(testscript.RunMain(m, map[string]func() int{
"testrpn": Main,
}))
}
func TestRpn(t *testing.T) {
testscript.Run(t, testscript.Params{
Dir: "t",
})
}

View File

@@ -1,2 +0,0 @@
exec testrpn 1 2 dump
stdout 'Stack revision 2 .0x'

View File

@@ -1,2 +0,0 @@
exec testrpn 1 2 dumb
stdout 'unknown command or operator'

View File

@@ -1,2 +0,0 @@
exec testrpn 4 +
stdout 'stack doesn''t provide enough arguments'

View File

@@ -1,2 +0,0 @@
exec testrpn -d 44 55 *
stdout 'push to stack: 2420.00\n'

View File

@@ -1,2 +0,0 @@
exec testrpn 100 50 50 - /
stdout 'division by null\n'

View File

@@ -1,16 +0,0 @@
exec testrpn -d -c test.lua 3 5 lower
stdout '3\n'
-- test.lua --
function lower(a,b)
if a < b then
return a
else
return b
end
end
function init()
-- expects 2 args
register("lower", 2, "lower")
end

View File

@@ -1,2 +0,0 @@
exec testrpn 44 55 *
stdout '2420\n'

View File

@@ -1,2 +0,0 @@
exec testrpn -m
stdout 'This software is licensed under the GNU GENERAL PUBLIC LICENSE'

View File

@@ -1,2 +0,0 @@
exec testrpn -h
stdout 'This is rpn'

View File

@@ -1,2 +0,0 @@
exec testrpn -v
stdout 'This is rpn version'

View File

@@ -1,4 +0,0 @@
exec echo 1 2 3 4 5 batch median
stdin stdout
exec testrpn
[unix] stdout '3\n'

View File

@@ -1,4 +0,0 @@
exec echo 1 2 3 4 5
stdin stdout
[unix] exec testrpn median
[unix] stdout '3\n'

View File

@@ -1,4 +0,0 @@
exec echo 10 10 +
stdin stdout
exec testrpn
[unix] stdout '20\n'

View File

@@ -1,6 +0,0 @@
stdin input.txt
exec testrpn
[unix] stdout 'Available configuration commands'
-- input.txt --
?

View File

@@ -1,13 +0,0 @@
stdin input.txt
exec testrpn
[unix] stdout '28\n'
-- input.txt --
10
10
+
>SUM
clear
8
<SUM
+

View File

@@ -1,4 +0,0 @@
exec echo 1 2 3 4 5 median
stdin stdout
exec testrpn -b
[unix] stdout '3\n'

View File

@@ -1,13 +0,0 @@
-- simple function, return the lower number of the two operands
function lower(a,b)
if a < b then
return a
else
return b
end
end
function init()
-- expects 2 args
register("lower", 2, "lower")
end

16
util.go
View File

@@ -23,24 +23,16 @@ import (
"strings" "strings"
) )
// find an item in a list, generic variant // find an item in a list
func contains[E comparable](s []E, v E) bool { func contains(s []string, e string) bool {
for _, vs := range s { for _, a := range s {
if v == vs { if a == e {
return true return true
} }
} }
return false return false
} }
// look if a key in a map exists, generic variant
func exists[K comparable, V any](m map[K]V, v K) bool {
if _, ok := m[v]; ok {
return true
}
return false
}
func const2num(name string) float64 { func const2num(name string) float64 {
switch name { switch name {
case "Pi": case "Pi":