From 43fcf43d1fd3e34b6bad9cecd5d18ac1826032c5 Mon Sep 17 00:00:00 2001 From: Thomas von Dein Date: Mon, 18 Nov 2024 13:18:51 +0100 Subject: [PATCH] add time support --- calc.go | 11 ++++++++++- calc_test.go | 6 ++++-- main.go | 2 +- rpn.go | 3 ++- rpn.pod | 3 ++- t/cmdlinecalc-time.txtar | 2 ++ 6 files changed, 21 insertions(+), 6 deletions(-) create mode 100644 t/cmdlinecalc-time.txtar diff --git a/calc.go b/calc.go index 4d52c7a..c108af9 100644 --- a/calc.go +++ b/calc.go @@ -272,9 +272,18 @@ func (c *Calc) EvalItem(item string) error { 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 var i int - _, err = fmt.Sscanf(item, "0x%x", &i) if err == nil { c.stack.Backup() diff --git a/calc_test.go b/calc_test.go index c4c6a7c..550f975 100644 --- a/calc_test.go +++ b/calc_test.go @@ -381,7 +381,7 @@ func FuzzEval(f *testing.F) { calc := NewCalc() - var hexnum int + var hexnum, hour, min int f.Fuzz(func(t *testing.T, line string) { 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 { item := strings.TrimSpace(calc.Comment.ReplaceAllString(line, "")) _, hexerr := fmt.Sscanf(item, "0x%x", &hexnum) + _, timeerr := fmt.Sscanf(item, "%d:%d", &hour, &min) // no comment? if len(item) > 0 { // no known command or function? @@ -405,7 +406,8 @@ func FuzzEval(f *testing.F) { !exists(calc.StackCommands, item) && !calc.Register.MatchString(item) && item != "?" && item != "help" && - hexerr != nil { + hexerr != nil && + timeerr != nil { t.Errorf("Fuzzy input accepted: <%s>", line) } } diff --git a/main.go b/main.go index 510313d..7efae04 100644 --- a/main.go +++ b/main.go @@ -30,7 +30,7 @@ import ( lua "github.com/yuin/gopher-lua" ) -const VERSION string = "2.1.2" +const VERSION string = "2.1.3" const Usage string = `This is rpn, a reverse polish notation calculator cli. diff --git a/rpn.go b/rpn.go index 59763ce..68d5e7b 100644 --- a/rpn.go +++ b/rpn.go @@ -108,7 +108,8 @@ DESCRIPTION is enabled automatically, see last example. 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 There are lots of stack manipulation commands provided. The most diff --git a/rpn.pod b/rpn.pod index 6e16dcd..bffecbc 100644 --- a/rpn.pod +++ b/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. 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 diff --git a/t/cmdlinecalc-time.txtar b/t/cmdlinecalc-time.txtar new file mode 100644 index 0000000..3658eeb --- /dev/null +++ b/t/cmdlinecalc-time.txtar @@ -0,0 +1,2 @@ +exec testrpn 09:55 4:15 - +stdout '5.67\n'