From e25a6413d381fc1f35def9ddfa2fbdcf199c09ff Mon Sep 17 00:00:00 2001 From: Elliott Hughes Date: Mon, 7 Apr 2014 15:11:57 -0700 Subject: Move date off the non-portable bionic32 'strtotimeval'. Change-Id: Ib706d3a536c409810cfbc47270448c6375314506 --- toolbox/date.c | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/toolbox/date.c b/toolbox/date.c index d6c9052..aa3b72e 100644 --- a/toolbox/date.c +++ b/toolbox/date.c @@ -1,10 +1,13 @@ +#include +#include +#include +#include #include #include -#include -#include #include -#include #include +#include + #include #include #include @@ -108,6 +111,33 @@ static void settime(char *s) { settime_rtc_tm(&tm); } +static char *parse_time(const char *str, struct timeval *ts) { + char *s; + long fs = 0; /* fractional seconds */ + + ts->tv_sec = strtoumax(str, &s, 10); + + if (*s == '.') { + s++; + int count = 0; + + /* read up to 6 digits (microseconds) */ + while (*s && isdigit(*s)) { + if (++count < 7) { + fs = fs*10 + (*s - '0'); + } + s++; + } + + for (; count < 6; count++) { + fs *= 10; + } + } + + ts->tv_usec = fs; + return s; +} + int date_main(int argc, char *argv[]) { int c; @@ -181,7 +211,7 @@ int date_main(int argc, char *argv[]) //strptime(argv[optind], NULL, &tm); //tv.tv_sec = mktime(&tm); //tv.tv_usec = 0; - strtotimeval(argv[optind], &tv); + parse_time(argv[optind], &tv); printf("time %s -> %lu.%lu\n", argv[optind], tv.tv_sec, tv.tv_usec); res = settime_alarm_timeval(&tv); if (res < 0) -- cgit v1.1