From b93b7382d6db5efe51134db2eba1bcbe967d1c82 Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Fri, 2 Mar 2012 00:24:17 -0500 Subject: [PATCH] first try at implementing getdate function --- src/time/getdate.c | 47 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 src/time/getdate.c diff --git a/src/time/getdate.c b/src/time/getdate.c new file mode 100644 index 00000000..26a48978 --- /dev/null +++ b/src/time/getdate.c @@ -0,0 +1,47 @@ +#include +#include +#include +#include +#include + +int getdate_err; + +struct tm *getdate(const char *s) +{ + static struct tm tmbuf; + struct tm *ret = 0; + char *datemsk = getenv("DATEMSK"); + FILE *f = 0; + char fmt[100], *p; + int cs; + + pthread_setcancelstate(PTHREAD_CANCEL_DEFERRED, &cs); + + if (!datemsk) { + getdate_err = 1; + goto out; + } + + f = fopen(datemsk, "r"); + if (!f) { + if (errno == ENOMEM) getdate_err = 6; + else getdate_err = 2; + goto out; + } + + while (fgets(fmt, sizeof fmt, f)) { + p = strptime(s, fmt, &tmbuf); +dprintf(2, "%s %s\n", s, fmt); +dprintf(2, "%p %d\n", p, p?*p:0); + if (p && !*p) { + ret = &tmbuf; + goto out; + } + } + + getdate_err = 7; +out: + if (f) fclose(f); + pthread_setcancelstate(cs, 0); + return ret; +} -- 2.20.1