code wiki / _hdl_build / nx_viz_time.nx
nx_viz_time.nx source
↩ module page · 59 lines · 2354 B
1// nx_viz_time.nx -- the TIME layer of the sovereign Nishi viz library (the d3-time-format / d3-scale time core,
2// bits-up). Civil date from epoch (Hinnant's integer algorithm) + "YYYY-MM-DD" formatting + day-floor (the nice
3// tick for time scales; pair with nx_viz_scale vs_linear on epoch seconds). Closes time-format + scale-time.
4// license_tier: ORIGINAL
5import "nx_syscalls.nx"
6const K_MAGIC_719468: i64 = 719468
7const K_MAGIC_146097: i64 = 146097
8const K_MAGIC_146096: i64 = 146096
9const K_MAGIC_1460: i64 = 1460
10const K_MAGIC_36524: i64 = 36524
11const K_MAGIC_86400: i64 = 86400
12
13// civil date from days-since-1970-01-01. out3[0]=year out3[1]=month out3[2]=day.
14func vt_civil(days: i64, out3: *i64) -> i64 {
15 var z: i64 = days + K_MAGIC_719468
16 var era: i64 = z / K_MAGIC_146097
17 if z < 0 { era = (z - K_MAGIC_146096) / K_MAGIC_146097 }
18 let doe: i64 = z - era * K_MAGIC_146097
19 let yoe: i64 = (doe - doe / K_MAGIC_1460 + doe / K_MAGIC_36524 - doe / K_MAGIC_146096) / 365
20 let y: i64 = yoe + era * 400
21 let doy: i64 = doe - (365 * yoe + yoe / 4 - yoe / 100)
22 let mp: i64 = (5 * doy + 2) / 153
23 let d: i64 = doy - (153 * mp + 2) / 5 + 1
24 var m: i64 = mp + 3
25 if mp >= 10 { m = mp - 9 }
26 var yy: i64 = y
27 if m <= 2 { yy = y + 1 }
28 out3[0] = yy; out3[1] = m; out3[2] = d
29 return 0
30}
31// epoch seconds -> "YYYY-MM-DD" (null-terminated) at out. returns length 10.
32func vt_format(epoch: i64, out: *u8) -> i64 {
33 var days: i64 = epoch / K_MAGIC_86400
34 if epoch < 0 { if epoch % K_MAGIC_86400 != 0 { days = days - 1 } }
35 let ymd: *i64 = sys_mmap(32) as *i64
36 vt_civil(days, ymd)
37 let y: i64 = ymd[0]
38 out[0] = (48 + (y / 1000) % 10) as u8
39 out[1] = (48 + (y / 100) % 10) as u8
40 out[2] = (48 + (y / 10) % 10) as u8
41 out[3] = (48 + y % 10) as u8
42 out[4] = 45 as u8
43 let mo: i64 = ymd[1]
44 out[5] = (48 + (mo / 10) % 10) as u8
45 out[6] = (48 + mo % 10) as u8
46 out[7] = 45 as u8
47 let da: i64 = ymd[2]
48 out[8] = (48 + (da / 10) % 10) as u8
49 out[9] = (48 + da % 10) as u8
50 out[10] = 0 as u8
51 return 10
52}
53// floor epoch to midnight (the day-aligned "nice" tick for a time axis).
54func vt_day_floor(epoch: i64) -> i64 {
55 var rem: i64 = epoch % K_MAGIC_86400
56 if rem < 0 { rem = rem + K_MAGIC_86400 }
57 return epoch - rem
58}
59func main() -> i64 { return 0 }