* Start the ISO format flags at bit 0 instead of bit 1.
* Remove unnecessary _8601 from ISO format flag names to
avoid line wrapping and to ease readability.
* ISO timestamps have date-time-timzone in common, so move
the TIMEZONE flag to bit 2 causing all timestamp masks
to have the first three bits set and the last four bits
as timestamp 'options'.
* Change the 'SPACE' flag to a 'T' flag, because it makes
the code and comments more concise.
* Add common ISO timestamp masks.
* Implement the ISO timestamp masks in all applicable code
using the strxxx_iso() functions.
Signed-off-by: J William Piggott <elseifthen@gmx.com>
int parse_timestamp(const char *t, usec_t *usec);
int get_gmtoff(const struct tm *tp);
-/* flags for strxxx_iso() functions */
+/* flags and masks for strxxx_iso() functions */
enum {
- ISO_8601_DATE = (1 << 1),
- ISO_8601_TIME = (1 << 2),
- ISO_8601_DOTUSEC = (1 << 3),
- ISO_8601_COMMAUSEC = (1 << 4),
- ISO_8601_TIMEZONE = (1 << 5),
- ISO_8601_SPACE = (1 << 6),
- ISO_8601_GMTIME = (1 << 7)
+ ISO_DATE = (1 << 0),
+ ISO_TIME = (1 << 1),
+ ISO_TIMEZONE = (1 << 2),
+ ISO_DOTUSEC = (1 << 3),
+ ISO_COMMAUSEC = (1 << 4),
+ ISO_T = (1 << 5),
+ ISO_GMTIME = (1 << 6),
+ ISO_TIMESTAMP = ISO_DATE | ISO_TIME | ISO_TIMEZONE,
+ ISO_TIMESTAMP_T = ISO_TIMESTAMP | ISO_T,
+ ISO_TIMESTAMP_DOT = ISO_TIMESTAMP | ISO_DOTUSEC,
+ ISO_TIMESTAMP_DOT_T = ISO_TIMESTAMP_DOT | ISO_T,
+ ISO_TIMESTAMP_COMMA = ISO_TIMESTAMP | ISO_COMMAUSEC,
+ ISO_TIMESTAMP_COMMA_T = ISO_TIMESTAMP_COMMA | ISO_T,
+ ISO_TIMESTAMP_COMMA_G = ISO_TIMESTAMP_COMMA | ISO_GMTIME,
+ ISO_TIMESTAMP_COMMA_GT = ISO_TIMESTAMP_COMMA_G | ISO_T
};
-#define ISO_8601_BUFSIZ 42
+#define ISO_BUFSIZ 42
int strtimeval_iso(struct timeval *tv, int flags, char *buf, size_t bufsz);
int strtm_iso(struct tm *tm, int flags, char *buf, size_t bufsz);
char *p = buf;
int len;
- if (flags & ISO_8601_DATE) {
+ if (flags & ISO_DATE) {
len = snprintf(p, bufsz, "%4d-%.2d-%.2d", tm->tm_year + 1900,
tm->tm_mon + 1, tm->tm_mday);
if (len < 0 || (size_t) len > bufsz)
p += len;
}
- if ((flags & ISO_8601_DATE) && (flags & ISO_8601_TIME)) {
+ if ((flags & ISO_DATE) && (flags & ISO_TIME)) {
if (bufsz < 1)
return -1;
- *p++ = (flags & ISO_8601_SPACE) ? ' ' : 'T';
+ *p++ = (flags & ISO_T) ? 'T' : ' ';
bufsz--;
}
- if (flags & ISO_8601_TIME) {
+ if (flags & ISO_TIME) {
len = snprintf(p, bufsz, "%02d:%02d:%02d", tm->tm_hour,
tm->tm_min, tm->tm_sec);
if (len < 0 || (size_t) len > bufsz)
p += len;
}
- if (flags & ISO_8601_DOTUSEC) {
+ if (flags & ISO_DOTUSEC) {
len = snprintf(p, bufsz, ".%06ld", (long) usec);
if (len < 0 || (size_t) len > bufsz)
return -1;
bufsz -= len;
p += len;
- } else if (flags & ISO_8601_COMMAUSEC) {
+ } else if (flags & ISO_COMMAUSEC) {
len = snprintf(p, bufsz, ",%06ld", (long) usec);
if (len < 0 || (size_t) len > bufsz)
return -1;
p += len;
}
- if (flags & ISO_8601_TIMEZONE) {
+ if (flags & ISO_TIMEZONE) {
int tmin = get_gmtoff(tm) / 60;
int zhour = tmin / 60;
int zmin = abs(tmin % 60);
{
struct tm tm;
- if (flags & ISO_8601_GMTIME)
+ if (flags & ISO_GMTIME)
tm = *gmtime(&tv->tv_sec);
else
tm = *localtime(&tv->tv_sec);
{
struct tm tm;
- if (flags & ISO_8601_GMTIME)
+ if (flags & ISO_GMTIME)
tm = *gmtime(t);
else
tm = *localtime(t);
int main(int argc, char *argv[])
{
struct timeval tv = { 0 };
- char buf[ISO_8601_BUFSIZ];
+ char buf[ISO_BUFSIZ];
if (argc < 2) {
fprintf(stderr, "usage: %s <time> [<usec>]\n", argv[0]);
if (argc == 3)
tv.tv_usec = strtos64_or_err(argv[2], "failed to parse <usec>");
- strtimeval_iso(&tv, ISO_8601_DATE, buf, sizeof(buf));
+ strtimeval_iso(&tv, ISO_DATE, buf, sizeof(buf));
printf("Date: '%s'\n", buf);
- strtimeval_iso(&tv, ISO_8601_TIME, buf, sizeof(buf));
+ strtimeval_iso(&tv, ISO_TIME, buf, sizeof(buf));
printf("Time: '%s'\n", buf);
- strtimeval_iso(&tv, ISO_8601_DATE | ISO_8601_TIME | ISO_8601_COMMAUSEC,
- buf, sizeof(buf));
+ strtimeval_iso(&tv, ISO_DATE | ISO_TIME | ISO_COMMAUSEC | ISO_T,
+ buf, sizeof(buf));
printf("Full: '%s'\n", buf);
- strtimeval_iso(&tv, ISO_8601_DATE | ISO_8601_TIME | ISO_8601_DOTUSEC |
- ISO_8601_TIMEZONE | ISO_8601_SPACE,
- buf, sizeof(buf));
+ strtimeval_iso(&tv, ISO_TIMESTAMP_DOT, buf, sizeof(buf));
printf("Zone: '%s'\n", buf);
return EXIT_SUCCESS;
ret = rtrim_whitespace((unsigned char *) dst);
break;
case LAST_TIMEFTM_ISO8601:
- ret = strtime_iso(when, ISO_8601_DATE|ISO_8601_TIME|ISO_8601_TIMEZONE, dst, dlen);
+ ret = strtime_iso(when, ISO_TIMESTAMP_T, dst, dlen);
break;
default:
abort();
buf, sizeof(buf));
break;
case TIME_ISO:
- rc = strtime_iso(&time, ISO_8601_DATE|ISO_8601_TIME|ISO_8601_TIMEZONE,
- buf, sizeof(buf));
+ rc = strtime_iso(&time, ISO_TIMESTAMP_T, buf, sizeof(buf));
break;
case TIME_ISO_SHORT:
- rc = strtime_iso(&time, ISO_8601_DATE, buf, sizeof(buf));
+ rc = strtime_iso(&time, ISO_DATE, buf, sizeof(buf));
break;
default:
errx(EXIT_FAILURE, _("unsupported time type"));
tv.tv_sec = ut->ut_tv.tv_sec;
tv.tv_usec = ut->ut_tv.tv_usec;
- if (strtimeval_iso(&tv,
- ISO_8601_DATE | ISO_8601_TIME | ISO_8601_COMMAUSEC |
- ISO_8601_TIMEZONE | ISO_8601_GMTIME, time_string,
+ if (strtimeval_iso(&tv, ISO_TIMESTAMP_COMMA_GT, time_string,
sizeof(time_string)) != 0)
return;
cleanse(ut->ut_id);
}
if (variant == UUID_VARIANT_DCE && type == 1) {
struct timeval tv;
- char date_buf[ISO_8601_BUFSIZ + 4];
+ char date_buf[ISO_BUFSIZ];
uuid_time(buf, &tv);
- strtimeval_iso(&tv,
- ISO_8601_DATE |
- ISO_8601_TIME |
- ISO_8601_COMMAUSEC |
- ISO_8601_TIMEZONE |
- ISO_8601_SPACE,
- date_buf,
- sizeof(date_buf));
+ strtimeval_iso(&tv, ISO_TIMESTAMP_COMMA,
+ date_buf, sizeof(date_buf));
str = xstrdup(date_buf);
}
break;
.tv_usec = rec->tv.tv_usec
};
- if (strtimeval_iso(&tv, ISO_8601_DATE|ISO_8601_TIME|ISO_8601_COMMAUSEC|
- ISO_8601_TIMEZONE,
- buf, bufsz) != 0)
+ if (strtimeval_iso(&tv, ISO_TIMESTAMP_COMMA_T, buf, bufsz) != 0)
return NULL;
return buf;
static int
display_time(struct timeval hwctime)
{
- char buf[ISO_8601_BUFSIZ];
+ char buf[ISO_BUFSIZ];
- if (strtimeval_iso(&hwctime, ISO_8601_DATE|ISO_8601_TIME|ISO_8601_DOTUSEC|
- ISO_8601_TIMEZONE|ISO_8601_SPACE,
- buf, sizeof(buf))) {
+ if (strtimeval_iso(&hwctime, ISO_TIMESTAMP_DOT, buf, sizeof(buf))) {
warnx(_("iso-8601 format overflow"));
return EXIT_FAILURE;
}
strtime_short(&time, &now, 0, buf, sizeof(buf));
break;
case TIME_ISO:
- strtime_iso(&time, ISO_8601_DATE|ISO_8601_TIME|ISO_8601_TIMEZONE, buf, sizeof(buf));
+ strtime_iso(&time, ISO_TIMESTAMP_T, buf, sizeof(buf));
break;
default:
errx(EXIT_FAILURE, _("unsupported time type"));
{
struct rfkill_event event;
struct timeval tv;
- char date_buf[ISO_8601_BUFSIZ];
+ char date_buf[ISO_BUFSIZ];
struct pollfd p;
int fd, n;
continue;
gettimeofday(&tv, NULL);
- strtimeval_iso(&tv,
- ISO_8601_DATE |
- ISO_8601_TIME |
- ISO_8601_COMMAUSEC |
- ISO_8601_TIMEZONE |
- ISO_8601_SPACE, date_buf, sizeof(date_buf));
+ strtimeval_iso(&tv, ISO_TIMESTAMP_COMMA, date_buf,
+ sizeof(date_buf));
printf("%s: idx %u type %u op %u soft %u hard %u\n",
date_buf,
event.idx, event.type, event.op, event.soft, event.hard);
if (ctl->typescriptfp) {
- strtime_iso(&tvec, ISO_8601_DATE | ISO_8601_TIME |
- ISO_8601_TIMEZONE | ISO_8601_SPACE,
- buf, sizeof(buf));
+ strtime_iso(&tvec, ISO_TIMESTAMP, buf, sizeof(buf));
fprintf(ctl->typescriptfp, _("Script started on %s\n"), buf);
}
gettime_monotonic(&ctl->oldtime);
if (ctl->typescriptfp) {
tvec = script_time((time_t *)NULL);
- strtime_iso(&tvec, ISO_8601_DATE | ISO_8601_TIME |
- ISO_8601_TIMEZONE | ISO_8601_SPACE,
- buf, sizeof(buf));
+ strtime_iso(&tvec, ISO_TIMESTAMP, buf, sizeof(buf));
fprintf(ctl->typescriptfp, _("\nScript done on %s\n"), buf);
}
done(ctl);