ref: 3ee9ef9b185e6f7b7af5d5c6fc3d330cb4a51cd8
parent: cc9da08bbc40e8b2b4562df28572b58f7e78dbe0
author: Ori Bernstein <ori@eigenstate.org>
date: Mon Sep 14 10:50:59 EDT 2015
use std.fmt for dates.
--- a/lib/date/fmt.myr
+++ b/lib/date/fmt.myr
@@ -4,84 +4,97 @@
use "names.use"
pkg date =
- const Datetimefmt = "%Y-%m-%d %H:%M:%S %z"
- const Timefmt = "%h:%m:{} %z"- const Datefmt = "%Y-%m-%d %z"
-
- const fmt : (f : byte[:], d : instant -> byte[:])
- const bfmt : (buf : byte[:], f : byte[:], d : instant -> byte[:])
+ const sbfmt : (sb : std.strbuf#, args : std.valist#, opt : (byte[:], byte[:])[:] -> void)
;;
+const __init__ = {+ var d : instant
-const fmt = {f, d- var buf
+ std.fmtinstall(std.typeof(d), sbfmt, [
+ ("D", false),+ ("d", false),+ ("t", false),+ ("f", true),+ ][:])
+}
- buf = std.slalloc(2048)
- -> bfmt(buf, f, d)
+const Datetimefmt = "%Y-%m-%d %H:%M:%S %z"
+const Timefmt = "%h:%m:{} %z"+const Datefmt = "%Y-%m-%d %z"
+
+const sbfmt = {sb, ap, opts+ var d : instant
+ var fmt
+
+ d = std.vanext(ap)
+ for o in opts
+ match o
+ | ("d", ""): fmt = Datefmt+ | ("t", ""): fmt = Timefmt+ | ("D", ""): fmt = Datetimefmt+ | ("f", opt): fmt = opt+ | _: std.fatal("unknown option")+ ;;
+ ;;
+ datefmt(sb, fmt, d)
}
-const bfmt = {buf, f, d- var c, s
- var o
-
- o = 0
- s = ""
- while f.len != 0
- (c, f) = std.striter(f)
+const datefmt = {sb, fmt, d+ var c
+ while fmt.len != 0
+ (c, fmt) = std.striter(fmt)
if c == '%'
- (c, f) = std.striter(f)
+ (c, fmt) = std.striter(fmt)
match c
- | 'a': s = std.bfmt(buf[o:], "{}", _names.abbrevday[d.day])- | 'A': s = std.bfmt(buf[o:], "{}", _names.fullday[d.day])- | 'b': s = std.bfmt(buf[o:], "{}", _names.abbrevmon[d.mon])- | 'B': s = std.bfmt(buf[o:], "{}", _names.fullmon[d.mon])- | 'c': s = bfmt(buf[o:], "%Y-%m-%d", d)
- | 'C': s = std.bfmt(buf[o:], "{p=0,w=2}", d.year % 100)- | 'd': s = std.bfmt(buf[o:], "{p=0,w=2}", d.day)- | 'D': s = bfmt(buf[o:], "%m/%d/%y (wtf america)", d)
- | 'e': s = std.bfmt(buf[o:], "{w=2}", d.day)- | 'F': s = bfmt(buf[o:], "%y-%m-%d", d)
+ | 'a': std.sbfmt(sb, "{}", _names.abbrevday[d.day])+ | 'A': std.sbfmt(sb, "{}", _names.fullday[d.day])+ | 'b': std.sbfmt(sb, "{}", _names.abbrevmon[d.mon])+ | 'B': std.sbfmt(sb, "{}", _names.fullmon[d.mon])+ | 'c': datefmt(sb, "%Y-%m-%d", d)
+ | 'C': std.sbfmt(sb, "{p=0,w=2}", d.year % 100)+ | 'd': std.sbfmt(sb, "{p=0,w=2}", d.day)+ | 'D': datefmt(sb, "%m/%d/%y (wtf america)", d)
+ | 'e': std.sbfmt(sb, "{w=2}", d.day)+ | 'F': datefmt(sb, "%y-%m-%d", d)
/*
- | 'G': s = std.bfmt(buf[o:], ...?
+ | 'G': s = std.sbfmt(sb, ...?
| 'g':
*/
- | 'h': s = std.bfmt(buf[o:], "{}", _names.abbrevmon[d.mon])- | 'H': s = std.bfmt(buf[o:], "{p=0,w=2}", d.h)- | 'I': s = std.bfmt(buf[o:], "{p=0,w=2}", d.h % 12)- | 'j': s = std.bfmt(buf[o:], "year day... unimplemented.")
- | 'k': s = std.bfmt(buf[o:], "{}", d.h)- | 'l': s = std.bfmt(buf[o:], "{}", d.h % 12)- | 'm': s = std.bfmt(buf[o:], "{}", d.mon)- | 'M': s = std.bfmt(buf[o:], "{}", d.m)- | 'n': s = std.bfmt(buf[o:], "\n")
- | 'O': s = std.bfmt(buf[o:], "unsupported %O")
- | 'p': s = std.bfmt(buf[o:], "{}", ["AM", "PM"][d.h/12])- | 'P': s = std.bfmt(buf[o:], "{}", ["am", "pm"][d.h/12])- | 'r': s = bfmt(buf[o:], "%H:%M:%S %P", d)
- | 'R': s = bfmt(buf[o:], "%H:%M %P", d)
- | 's': s = std.bfmt(buf[o:], "{}", d.actual)- | 'S': s = std.bfmt(buf[o:], "{}", d.s)- | 't': s = std.bfmt(buf[o:], "\t")
- | 'u': s = std.bfmt(buf[o:], "{}", d.wday)- | 'U': s = std.bfmt(buf[o:], "week number... unimplemented.")
- | 'x': s = bfmt(buf[o:], Datefmt, d)
- | 'X': s = bfmt(buf[o:], Timefmt, d)
- | 'y': s = std.bfmt(buf[o:], "{}", d.year % 100)- | 'Y': s = std.bfmt(buf[o:], "{}", d.year)- | 'z': s = timezone(buf[o:], d.tzoff)
- | 'Z': s = std.bfmt(buf[o:], "{}", d.tzname)- | '%': s = std.bfmt(buf[o:], "%")
+ | 'h': std.sbfmt(sb, "{}", _names.abbrevmon[d.mon])+ | 'H': std.sbfmt(sb, "{p=0,w=2}", d.h)+ | 'I': std.sbfmt(sb, "{p=0,w=2}", d.h % 12)+ | 'j': std.sbfmt(sb, "year day... unimplemented.")
+ | 'k': std.sbfmt(sb, "{}", d.h)+ | 'l': std.sbfmt(sb, "{}", d.h % 12)+ | 'm': std.sbfmt(sb, "{}", d.mon)+ | 'M': std.sbfmt(sb, "{}", d.m)+ | 'n': std.sbfmt(sb, "\n")
+ | 'O': std.sbfmt(sb, "unsupported %O")
+ | 'p': std.sbfmt(sb, "{}", ["AM", "PM"][d.h/12])+ | 'P': std.sbfmt(sb, "{}", ["am", "pm"][d.h/12])+ | 'r': datefmt(sb, "%H:%M:%S %P", d)
+ | 'R': datefmt(sb, "%H:%M %P", d)
+ | 's': std.sbfmt(sb, "{}", d.actual)+ | 'S': std.sbfmt(sb, "{}", d.s)+ | 't': std.sbfmt(sb, "\t")
+ | 'u': std.sbfmt(sb, "{}", d.wday)+ | 'U': std.sbfmt(sb, "week number... unimplemented.")
+ | 'x': datefmt(sb, Datefmt, d)
+ | 'X': datefmt(sb, Timefmt, d)
+ | 'y': std.sbfmt(sb, "{}", d.year % 100)+ | 'Y': std.sbfmt(sb, "{}", d.year)+ | 'z': timezone(sb, d.tzoff)
+ | 'Z': std.sbfmt(sb, "{}", d.tzname)+ | '%': std.sbfmt(sb, "%")
| _: std.fatal("unknown format character {}\n", c);;
else
- s = std.bfmt(buf[o:], "{}", c)+ std.sbfmt(sb, "{}", c);;
- o += s.len
;;
- -> buf[:o]
}
-const timezone = {buf, off+const timezone = {sb, offvar h, m
var sep
@@ -93,5 +106,5 @@
off /= 1_000_000
h = off / 3600
m = off % 3600
- -> std.bfmt(buf, "{}{p=0,w=2}{p=0,w=2}", sep, h, m)+ -> std.sbfmt(sb, "{}{p=0,w=2}{p=0,w=2}", sep, h, m)}
--- a/lib/date/test/ftime-test.myr
+++ b/lib/date/test/ftime-test.myr
@@ -8,7 +8,9 @@
/*Fri 29 Aug 2014 07:47:43 PM UTC*/
d = date.mkinstant(1_409_341_663*1_000_000, "")
- f = date.bfmt(buf[:], date.Datetimefmt, d)
+ std.put("Formatting d.year={}, d.mon={}, d.day={}, d.h={}, d.m={}, d.s={}\n", \+ d.year, d.mon, d.day, d.h, d.m, d.s)
+ f = std.bfmt(buf[:], "{D}", d) eq("2014-8-29 19:47:43 +0000", f)}
--- a/lib/date/test/parse-test.myr
+++ b/lib/date/test/parse-test.myr
@@ -7,7 +7,7 @@
/*Fri 29 Aug 2014 07:47:43 PM UTC*/
match date.parsefmt("%Y-%m-%d %z", "1932-10-23 +0500")| `std.Some d:
- eq(date.bfmt(buf[:], date.Datetimefmt, d), "1932-10-23 00:0:0 +0500")
+ eq(std.bfmt(buf[:], "{D}", d), "1932-10-23 00:0:0 +0500")| `std.None:
std.fatal("Failed to parse date");;
--
⑨