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 }