mirror of
https://codeberg.org/scip/rpnc.git
synced 2025-12-17 04:21:01 +01:00
Compare commits
17 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 433c5ede91 | |||
|
|
b77ef061e6 | ||
|
|
2a5e70279e | ||
|
|
6c56ed9508 | ||
| ff76137986 | |||
| e5dfad1e35 | |||
| 43fcf43d1f | |||
| 3a9d753720 | |||
| 5afe1275bc | |||
|
|
41b38191a5 | ||
| 8f2b6955ff | |||
| 9b244fc170 | |||
| e4b2a4d6ea | |||
| 3ee4d4181a | |||
| 1a1670076a | |||
| 7ccb05558f | |||
|
|
b38b431d29 |
2
.github/ISSUE_TEMPLATE/bug_report.md
vendored
2
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -7,7 +7,7 @@ assignees: TLINDEN
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
**Describtion**
|
**Description**
|
||||||
<!-- Please provide a clear and concise description of the issue: -->
|
<!-- Please provide a clear and concise description of the issue: -->
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
10
.github/dependabot.yml
vendored
Normal file
10
.github/dependabot.yml
vendored
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
version: 2
|
||||||
|
updates:
|
||||||
|
- package-ecosystem: "gomod"
|
||||||
|
directory: "/"
|
||||||
|
schedule:
|
||||||
|
interval: "monthly"
|
||||||
|
- package-ecosystem: "github-actions"
|
||||||
|
directory: "/"
|
||||||
|
schedule:
|
||||||
|
interval: "monthly"
|
||||||
22
.github/workflows/ci.yaml
vendored
22
.github/workflows/ci.yaml
vendored
@@ -4,22 +4,22 @@ jobs:
|
|||||||
build:
|
build:
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
version: [1.21]
|
version: [1.22.1]
|
||||||
os: [ubuntu-latest, windows-latest, macos-latest]
|
os: [ubuntu-latest, windows-latest, macos-latest]
|
||||||
name: Build
|
name: Build
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
steps:
|
steps:
|
||||||
- name: Set up Go
|
- name: Set up Go ${{ matrix.version }}
|
||||||
uses: actions/setup-go@v3
|
uses: actions/setup-go@v5
|
||||||
with:
|
with:
|
||||||
go-version: ${{ matrix.version }}
|
go-version: '${{ matrix.version }}'
|
||||||
id: go
|
id: go
|
||||||
|
|
||||||
- name: checkout
|
- name: checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: build
|
- name: build
|
||||||
run: go build
|
run: make buildlocal
|
||||||
|
|
||||||
- name: test
|
- name: test
|
||||||
run: make test
|
run: make test
|
||||||
@@ -28,9 +28,11 @@ jobs:
|
|||||||
name: lint
|
name: lint
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/setup-go@v3
|
- uses: actions/setup-go@v5
|
||||||
with:
|
with:
|
||||||
go-version: 1.21
|
go-version: 1.22
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
- name: golangci-lint
|
- name: golangci-lint
|
||||||
uses: golangci/golangci-lint-action@v3
|
uses: golangci/golangci-lint-action@v6
|
||||||
|
with:
|
||||||
|
skip-cache: true
|
||||||
|
|||||||
32
.github/workflows/release.yaml
vendored
Normal file
32
.github/workflows/release.yaml
vendored
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
name: build-and-test
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- "*"
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
release:
|
||||||
|
name: Build Release Assets
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Set up Go
|
||||||
|
uses: actions/setup-go@v5
|
||||||
|
with:
|
||||||
|
go-version: 1.22.11
|
||||||
|
|
||||||
|
- name: Build the executables
|
||||||
|
run: ./mkrel.sh rpnc ${{ github.ref_name}}
|
||||||
|
|
||||||
|
- name: List the executables
|
||||||
|
run: ls -l ./releases
|
||||||
|
|
||||||
|
- name: Upload the binaries
|
||||||
|
uses: svenstaro/upload-release-action@v2
|
||||||
|
with:
|
||||||
|
repo_token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
tag: ${{ github.ref_name }}
|
||||||
|
file: ./releases/*
|
||||||
|
file_glob: true
|
||||||
4
Makefile
4
Makefile
@@ -81,8 +81,8 @@ goupdate:
|
|||||||
buildall:
|
buildall:
|
||||||
./mkrel.sh $(tool) $(VERSION)
|
./mkrel.sh $(tool) $(VERSION)
|
||||||
|
|
||||||
release: buildall
|
release:
|
||||||
gh release create v$(VERSION) --generate-notes releases/*
|
gh release create v$(VERSION) --generate-notes
|
||||||
|
|
||||||
show-versions: buildlocal
|
show-versions: buildlocal
|
||||||
@echo "### rpn version:"
|
@echo "### rpn version:"
|
||||||
|
|||||||
15
calc.go
15
calc.go
@@ -272,9 +272,18 @@ func (c *Calc) EvalItem(item string) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// try time
|
||||||
|
var hour, min int
|
||||||
|
_, err = fmt.Sscanf(item, "%d:%d", &hour, &min)
|
||||||
|
if err == nil {
|
||||||
|
c.stack.Backup()
|
||||||
|
c.stack.Push(float64(hour) + float64(min)/60)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// try hex
|
// try hex
|
||||||
var i int
|
var i int
|
||||||
|
|
||||||
_, err = fmt.Sscanf(item, "0x%x", &i)
|
_, err = fmt.Sscanf(item, "0x%x", &i)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
c.stack.Backup()
|
c.stack.Backup()
|
||||||
@@ -361,9 +370,7 @@ func (c *Calc) EvalItem(item string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch item {
|
switch item {
|
||||||
case "?":
|
case "?", "help":
|
||||||
fallthrough
|
|
||||||
case "help":
|
|
||||||
c.PrintHelp()
|
c.PrintHelp()
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|||||||
10
calc_test.go
10
calc_test.go
@@ -78,7 +78,7 @@ func TestCommentsAndWhitespace(t *testing.T) {
|
|||||||
t.Run(testname, func(t *testing.T) {
|
t.Run(testname, func(t *testing.T) {
|
||||||
for _, line := range test.cmd {
|
for _, line := range test.cmd {
|
||||||
if err := calc.Eval(line); err != nil {
|
if err := calc.Eval(line); err != nil {
|
||||||
t.Errorf(err.Error())
|
t.Error(err.Error())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
got := calc.stack.Last()
|
got := calc.stack.Last()
|
||||||
@@ -292,7 +292,7 @@ func TestCalc(t *testing.T) {
|
|||||||
t.Run(testname, func(t *testing.T) {
|
t.Run(testname, func(t *testing.T) {
|
||||||
calc.batch = test.batch
|
calc.batch = test.batch
|
||||||
if err := calc.Eval(test.cmd); err != nil {
|
if err := calc.Eval(test.cmd); err != nil {
|
||||||
t.Errorf(err.Error())
|
t.Error(err.Error())
|
||||||
}
|
}
|
||||||
got := calc.Result()
|
got := calc.Result()
|
||||||
calc.stack.Clear()
|
calc.stack.Clear()
|
||||||
@@ -381,7 +381,7 @@ func FuzzEval(f *testing.F) {
|
|||||||
|
|
||||||
calc := NewCalc()
|
calc := NewCalc()
|
||||||
|
|
||||||
var hexnum int
|
var hexnum, hour, min int
|
||||||
|
|
||||||
f.Fuzz(func(t *testing.T, line string) {
|
f.Fuzz(func(t *testing.T, line string) {
|
||||||
t.Logf("Stack:\n%v\n", calc.stack.All())
|
t.Logf("Stack:\n%v\n", calc.stack.All())
|
||||||
@@ -391,6 +391,7 @@ func FuzzEval(f *testing.F) {
|
|||||||
if !contains(legal, line) && len(line) > 0 {
|
if !contains(legal, line) && len(line) > 0 {
|
||||||
item := strings.TrimSpace(calc.Comment.ReplaceAllString(line, ""))
|
item := strings.TrimSpace(calc.Comment.ReplaceAllString(line, ""))
|
||||||
_, hexerr := fmt.Sscanf(item, "0x%x", &hexnum)
|
_, hexerr := fmt.Sscanf(item, "0x%x", &hexnum)
|
||||||
|
_, timeerr := fmt.Sscanf(item, "%d:%d", &hour, &min)
|
||||||
// no comment?
|
// no comment?
|
||||||
if len(item) > 0 {
|
if len(item) > 0 {
|
||||||
// no known command or function?
|
// no known command or function?
|
||||||
@@ -405,7 +406,8 @@ func FuzzEval(f *testing.F) {
|
|||||||
!exists(calc.StackCommands, item) &&
|
!exists(calc.StackCommands, item) &&
|
||||||
!calc.Register.MatchString(item) &&
|
!calc.Register.MatchString(item) &&
|
||||||
item != "?" && item != "help" &&
|
item != "?" && item != "help" &&
|
||||||
hexerr != nil {
|
hexerr != nil &&
|
||||||
|
timeerr != nil {
|
||||||
t.Errorf("Fuzzy input accepted: <%s>", line)
|
t.Errorf("Fuzzy input accepted: <%s>", line)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -214,6 +214,10 @@ func (c *Calc) SetCommands() {
|
|||||||
c.SettingsCommands["b"] = c.SettingsCommands["batch"]
|
c.SettingsCommands["b"] = c.SettingsCommands["batch"]
|
||||||
c.SettingsCommands["s"] = c.SettingsCommands["showstack"]
|
c.SettingsCommands["s"] = c.SettingsCommands["showstack"]
|
||||||
|
|
||||||
|
c.SettingsCommands["togglebatch"] = c.SettingsCommands["batch"]
|
||||||
|
c.SettingsCommands["toggledebug"] = c.SettingsCommands["debug"]
|
||||||
|
c.SettingsCommands["toggleshowstack"] = c.SettingsCommands["showstack"]
|
||||||
|
|
||||||
c.ShowCommands["h"] = c.ShowCommands["history"]
|
c.ShowCommands["h"] = c.ShowCommands["history"]
|
||||||
c.ShowCommands["p"] = c.ShowCommands["dump"]
|
c.ShowCommands["p"] = c.ShowCommands["dump"]
|
||||||
c.ShowCommands["v"] = c.ShowCommands["vars"]
|
c.ShowCommands["v"] = c.ShowCommands["vars"]
|
||||||
|
|||||||
17
go.mod
17
go.mod
@@ -1,12 +1,15 @@
|
|||||||
module rpn
|
module rpn
|
||||||
|
|
||||||
go 1.20
|
go 1.22
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/chzyer/readline v1.5.1 // indirect
|
github.com/chzyer/readline v1.5.1
|
||||||
github.com/rogpeppe/go-internal v1.11.0 // indirect
|
github.com/rogpeppe/go-internal v1.13.1
|
||||||
github.com/spf13/pflag v1.0.5 // indirect
|
github.com/spf13/pflag v1.0.6
|
||||||
github.com/yuin/gopher-lua v1.1.0 // indirect
|
github.com/yuin/gopher-lua v1.1.1
|
||||||
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f // indirect
|
)
|
||||||
golang.org/x/tools v0.1.12 // indirect
|
|
||||||
|
require (
|
||||||
|
golang.org/x/sys v0.21.0 // indirect
|
||||||
|
golang.org/x/tools v0.22.0 // indirect
|
||||||
)
|
)
|
||||||
|
|||||||
23
go.sum
23
go.sum
@@ -1,16 +1,17 @@
|
|||||||
|
github.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM=
|
||||||
github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ=
|
github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ=
|
||||||
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 h1:p3BQDXSxOhOG0P9z6/hGnII4LGiEPOYBhs8asl/fC04=
|
||||||
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.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII=
|
||||||
github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA=
|
github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o=
|
||||||
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
|
github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o=
|
||||||
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
||||||
github.com/yuin/gopher-lua v1.1.0 h1:BojcDhfyDWgU2f2TOzYK/g5p2gxMrku8oupLDqlnSqE=
|
github.com/yuin/gopher-lua v1.1.1 h1:kYKnWBjvbNP4XLT3+bPEwAXJx262OhaHDWDVOPjL46M=
|
||||||
github.com/yuin/gopher-lua v1.1.0/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw=
|
github.com/yuin/gopher-lua v1.1.1/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/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.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws=
|
||||||
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU=
|
golang.org/x/tools v0.22.0 h1:gqSGLZqv+AI9lIQzniJ0nZDRG5GBPsSi+DRNHWNz6yA=
|
||||||
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c=
|
||||||
|
|||||||
@@ -116,9 +116,7 @@ func (i *Interpreter) CallLuaFunc(funcname string, items []float64) (float64, er
|
|||||||
funcname, LuaFuncs[funcname].numargs))
|
funcname, LuaFuncs[funcname].numargs))
|
||||||
|
|
||||||
switch LuaFuncs[funcname].numargs {
|
switch LuaFuncs[funcname].numargs {
|
||||||
case 0:
|
case 0, 1:
|
||||||
fallthrough
|
|
||||||
case 1:
|
|
||||||
// 1 arg variant
|
// 1 arg variant
|
||||||
if err := LuaInterpreter.CallByParam(lua.P{
|
if err := LuaInterpreter.CallByParam(lua.P{
|
||||||
Fn: LuaInterpreter.GetGlobal(funcname),
|
Fn: LuaInterpreter.GetGlobal(funcname),
|
||||||
|
|||||||
4
main.go
4
main.go
@@ -30,7 +30,7 @@ import (
|
|||||||
lua "github.com/yuin/gopher-lua"
|
lua "github.com/yuin/gopher-lua"
|
||||||
)
|
)
|
||||||
|
|
||||||
const VERSION string = "2.1.0"
|
const VERSION string = "2.1.4"
|
||||||
|
|
||||||
const Usage string = `This is rpn, a reverse polish notation calculator cli.
|
const Usage string = `This is rpn, a reverse polish notation calculator cli.
|
||||||
|
|
||||||
@@ -50,7 +50,7 @@ Options:
|
|||||||
When <operator> is given, batch mode ist automatically enabled. Use
|
When <operator> is given, batch mode ist automatically enabled. Use
|
||||||
this only when working with stdin. E.g.: echo "2 3 4 5" | rpn +
|
this only when working with stdin. E.g.: echo "2 3 4 5" | rpn +
|
||||||
|
|
||||||
Copyright (c) 2023-2024 T.v.Dein`
|
Copyright (c) 2023-2025 T.v.Dein`
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
os.Exit(Main())
|
os.Exit(Main())
|
||||||
|
|||||||
3
rpn.go
3
rpn.go
@@ -108,7 +108,8 @@ DESCRIPTION
|
|||||||
is enabled automatically, see last example.
|
is enabled automatically, see last example.
|
||||||
|
|
||||||
You can enter integers, floating point numbers (positive or negative) or
|
You can enter integers, floating point numbers (positive or negative) or
|
||||||
hex numbers (prefixed with 0x).
|
hex numbers (prefixed with 0x). Time values in hh::mm format are
|
||||||
|
possible as well.
|
||||||
|
|
||||||
STACK MANIPULATION
|
STACK MANIPULATION
|
||||||
There are lots of stack manipulation commands provided. The most
|
There are lots of stack manipulation commands provided. The most
|
||||||
|
|||||||
3
rpn.pod
3
rpn.pod
@@ -112,7 +112,8 @@ If the first parameter to rpn is a math operator or function, batch
|
|||||||
mode is enabled automatically, see last example.
|
mode is enabled automatically, see last example.
|
||||||
|
|
||||||
You can enter integers, floating point numbers (positive or negative)
|
You can enter integers, floating point numbers (positive or negative)
|
||||||
or hex numbers (prefixed with 0x).
|
or hex numbers (prefixed with 0x). Time values in hh::mm format are
|
||||||
|
possible as well.
|
||||||
|
|
||||||
=head2 STACK MANIPULATION
|
=head2 STACK MANIPULATION
|
||||||
|
|
||||||
|
|||||||
2
t/cmdlinecalc-time.txtar
Normal file
2
t/cmdlinecalc-time.txtar
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
exec testrpn 09:55 4:15 -
|
||||||
|
stdout '5.67\n'
|
||||||
Reference in New Issue
Block a user