summaryrefslogtreecommitdiff
path: root/sys/include
diff options
context:
space:
mode:
authorOri Bernstein <ori@eigenstate.org>2020-06-13 12:38:49 -0700
committerOri Bernstein <ori@eigenstate.org>2020-06-13 12:38:49 -0700
commite2ee991490227698bbc3f9ace4c9ecc014d12dbe (patch)
tree6fafb321078c83e429c4e44094b105bb950e41f0 /sys/include
parent8ffcc91b1baca653df130efeb213d3d69189bae4 (diff)
libc, seconds: new time and date apis.
Redo date handling in libc almost entirely. This allows handling dates and times from outside your timezones, fixes timezone loading in multithreaded applications, and allows parsing and formatting using custom format strings. As a test of the APIs, we replace the formatting code in seconds(1), shrinking it massively.
Diffstat (limited to 'sys/include')
-rw-r--r--sys/include/libc.h43
1 files changed, 33 insertions, 10 deletions
diff --git a/sys/include/libc.h b/sys/include/libc.h
index 7a2700539..820d684b2 100644
--- a/sys/include/libc.h
+++ b/sys/include/libc.h
@@ -314,22 +314,45 @@ extern double fmod(double, double);
/*
* Time-of-day
*/
+typedef struct Tzone Tzone;
+#pragma incomplete Tzone
+
typedef
struct Tm
{
- int sec;
- int min;
- int hour;
- int mday;
- int mon;
- int year;
- int wday;
- int yday;
- char zone[4];
- int tzoff;
+ vlong abs; /* seconds since Jan 1 1970, GMT */
+ int nsec; /* nseconds (range 0...1e9) */
+ int sec; /* seconds (range 0..60) */
+ int min; /* minutes (0..59) */
+ int hour; /* hours (0..23) */
+ int mday; /* day of the month (1..31) */
+ int mon; /* month of the year (0..11) */
+ int year; /* year A.D. */
+ int wday; /* day of week (0..6, Sunday = 0) */
+ int yday; /* day of year (0..365) */
+ char zone[16]; /* time zone name */
+ int tzoff; /* time zone delta from GMT */
+ Tzone *tz; /* time zone associated with this date */
} Tm;
+typedef
+struct Tmfmt {
+ char *fmt;
+ Tm *tm;
+} Tmfmt;
+
+#pragma varargck type "τ" Tmfmt
+
+extern Tzone* tmgetzone(char *name);
+extern Tm* tmnow(Tm*, Tzone*);
+extern Tm* tmtime(Tm*, vlong, Tzone*);
+extern Tm* tmtimens(Tm*, vlong, int, Tzone*);
+extern Tm* tmparse(Tm*, char*, char*, Tzone*);
+extern Tm* tmnorm(Tm*);
+extern Tmfmt tmfmt(Tm*, char*);
+extern void tmfmtinstall(void);
+
extern Tm* gmtime(long);
extern Tm* localtime(long);
extern char* asctime(Tm*);