libc, seconds: new time and date apis (try 2)

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.

The last commit missed a few removals, and made it
unnecessarily hard to do an update.
This commit is contained in:
Ori Bernstein 2020-06-14 09:33:32 -07:00
parent f380851ddb
commit 8b3efcfc4e
7 changed files with 1207 additions and 900 deletions

View file

@ -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*);