summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--generic/tclClockFmt.c12
-rw-r--r--library/init.tcl4
-rw-r--r--tests/clock.test51
3 files changed, 46 insertions, 21 deletions
diff --git a/generic/tclClockFmt.c b/generic/tclClockFmt.c
index 70b3ad7..d3cb339 100644
--- a/generic/tclClockFmt.c
+++ b/generic/tclClockFmt.c
@@ -2489,13 +2489,13 @@ ClockFmtToken_StarDate_Proc(
{
int fractYear;
/* Get day of year, zero based */
- int doy = dateFmt->date.dayOfYear - 1;
+ int v = dateFmt->date.dayOfYear - 1;
/* Convert day of year to a fractional year */
if (IsGregorianLeapYear(&dateFmt->date)) {
- fractYear = 1000 * doy / 366;
+ fractYear = 1000 * v / 366;
} else {
- fractYear = 1000 * doy / 365;
+ fractYear = 1000 * v / 365;
}
/* Put together the StarDate as "Stardate %02d%03d.%1d" */
@@ -2507,8 +2507,10 @@ ClockFmtToken_StarDate_Proc(
dateFmt->output = _itoaw(dateFmt->output,
fractYear, '0', 3);
*dateFmt->output++ = '.';
- dateFmt->output = _itoaw(dateFmt->output,
- dateFmt->date.localSeconds % SECONDS_PER_DAY / ( SECONDS_PER_DAY / 10 ), '0', 1);
+ /* be sure positive after decimal point (note: clock-value can be negative) */
+ v = dateFmt->date.localSeconds % SECONDS_PER_DAY / ( SECONDS_PER_DAY / 10 );
+ if (v < 0) v = 10 + v;
+ dateFmt->output = _itoaw(dateFmt->output, v, '0', 1);
return TCL_OK;
}
diff --git a/library/init.tcl b/library/init.tcl
index 16ff485..fc88a72 100644
--- a/library/init.tcl
+++ b/library/init.tcl
@@ -193,7 +193,9 @@ if {[interp issafe]} {
uplevel 1 [info level 0]
}
# Auto-loading stubs for 'clock.tcl'
- set ::auto_index_ns(::tcl::clock) {::namespace inscope ::tcl::clock {::source [::file join [info library] clock.tcl]}}
+ set ::auto_index_ns(::tcl::clock) {::namespace inscope ::tcl::clock {
+ ::source -encoding utf-8 [::file join [info library] clock.tcl]
+ }}
}
# Conditionalize for presence of exec.
diff --git a/tests/clock.test b/tests/clock.test
index af517c8..5f9a3ec 100644
--- a/tests/clock.test
+++ b/tests/clock.test
@@ -18647,10 +18647,42 @@ test clock-6.20 {special char tokens %n, %t} {
} 1246386600
# Hi, Jeff!
+proc _testStarDates {s {days {366*2}} {step {86400}}} {
+ set step [expr {int($step * 86400)}]
+ # reconvert - arrange in order of stardate:
+ set s [set i [clock scan [clock format $s -f "%Q" -g 1] -g 1]]
+ # test:
+ set wrong {}
+ while {$i < $s + $days*86400} {
+ set d [clock format $i -f "%Q" -g 1]
+ if {![regexp {^Stardate \d+\.\d$} $d]} {
+ lappend wrong "wrong: $d -- ($i) -- [clock format $i -g 1]"
+ }
+ if {[catch {
+ set i2 [clock scan $d -f "%Q" -g 1]
+ } msg]} {
+ lappend wrong "$d -- ($i) -- [clock format $i -g 1]: $msg"
+ }
+ if {$i != $i2} {
+ lappend wrong "$d -- ($i != $i2) -- [clock format $i -g 1]"
+ }
+ incr i $step
+ }
+ join $wrong \n
+}
test clock-6.21.0 {Stardate 0 day} {
list [set d [clock format -757382400 -format "%Q" -gmt 1]] \
[clock scan $d -format "%Q" -gmt 1]
} [list "Stardate 00000.0" -757382400]
+test clock-6.21.0.1 {Stardate 0.1 - 1.9 (test negative clock value -> positive Stardate)} {
+ _testStarDates -757382400 2 0.1
+} {}
+test clock-6.21.0.2 {Stardate 10000.1 - 10002.9 (test negative clock value -> positive Stardate)} {
+ _testStarDates [clock scan "Stardate 10000.1" -f %Q -g 1] 3 0.1
+} {}
+test clock-6.21.0.2 {Stardate 80000.1 - 80002.9 (test positive clock value)} {
+ _testStarDates [clock scan "Stardate 80001.1" -f %Q -g 1] 3 0.1
+} {}
test clock-6.21.1 {Stardate} {
list [set d [clock format 1482857280 -format "%Q" -gmt 1]] \
[clock scan $d -format "%Q" -gmt 1]
@@ -18659,21 +18691,10 @@ test clock-6.21.2 {Stardate next time} {
list [set d [clock format 1482865920 -format "%Q" -gmt 1]] \
[clock scan $d -format "%Q" -gmt 1]
} [list "Stardate 70986.8" 1482865920]
-test clock-6.21.3 {Stardate correct scan over year (leap year, begin, middle and end of the year)} -body {
- set s [clock scan "01.01.2016" -f "%d.%m.%Y" -g 1]
- set s [set i [clock scan [clock format $s -f "%Q" -g 1] -g 1]]
- set wrong {}
- while {[incr i 86400] < $s + 86400*366*2} {
- set d [clock format $i -f "%Q" -g 1]
- set i2 [clock scan $d -f "%Q" -g 1]
- if {$i != $i2} {
- lappend wrong "$d -- ($i != $i2) -- [clock format $i -g 1]"
- }
- }
- join $wrong \n
-} -result {} -cleanup {
- unset -nocomplain wrong i i2 s d
-}
+test clock-6.21.3 {Stardate correct scan over year (leap year, begin, middle and end of the year)} {
+ _testStarDates [clock scan "01.01.2016" -f "%d.%m.%Y" -g 1] [expr {366*2}] 1
+} {}
+rename _testStarDates {}
test clock-6.22.1 {Greedy match} {
clock format [clock scan "111" -format "%d%m%y" -gmt 1] -locale en -gmt 1