mshow: display relative date

pull/1/merge
Christian Neukirchen 8 years ago
parent be75b39123
commit b644998fe6

@ -9,6 +9,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include "blaze822.h"
@ -441,6 +442,98 @@ extract(char *file, int argc, char **argv, int use_stdout)
static char *newcur;
static void
print_date_header(char *v)
{
static time_t now = -1;
if (now == -1) {
setenv("TZ", "", 1);
tzset();
now = time(0);
}
printf("Date: %s", v);
time_t t = blaze822_date(v);
if (t == -1) {
printf(" (invalid)");
} else {
printf(" (");
time_t d = t < now ? now - t : t - now;
int l;
if (d > 60*60*24*7*52) l = 'y';
else if (d > 60*60*24*7) l = 'w';
else if (d > 60*60*24) l = 'd';
else if (d > 60*60) l = 'h';
else if (d > 60) l = 'm';
else l = 's';
int p = 3;
int z;
switch(l) {
case 'y':
z = d / (60*60*24*7*52);
d = d % (60*60*24*7*52);
if (z > 0) {
printf("%d year%s", z, z>1 ? "s" : "");
if (!--p) break;
printf(", ");
}
case 'w':
z = d / (60*60*24*7);
d = d % (60*60*24*7);
if (z > 0) {
printf("%d week%s", z, z>1 ? "s" : "");
if (!--p) break;
printf(", ");
}
case 'd':
z = d / (60*60*24);
d = d % (60*60*24);
if (z > 0) {
printf("%d day%s", z, z>1 ? "s" : "");
if (!--p) break;
printf(", ");
}
case 'h':
z = d / (60*60);
d = d % (60*60);
if (z > 0) {
printf("%d hour%s", z, z>1 ? "s" : "");
if (!--p) break;
printf(", ");
}
case 'm':
z = d / (60);
d = d % (60);
if (z > 0) {
printf("%d minute%s", z, z>1 ? "s" : "");
if (!--p) break;
printf(", ");
}
case 's':
z = d;
printf("%d second%s", z, z>1 ? "s" : "");
}
if (t < now)
printf(" ago)");
else
printf(" in the future)");
}
printf("\n");
}
static void
print_decode_header(char *h, char *v)
{
char d[4096];
blaze822_decode_rfc2047(d, v, sizeof d, "UTF-8");
printhdr(h);
printf(": %s\n", d);
}
void
show(char *file)
{
@ -492,10 +585,10 @@ show(char *file)
*n = 0;
v = blaze822_chdr(msg, h);
if (v) {
char d[4096];
blaze822_decode_rfc2047(d, v, sizeof d, "UTF-8");
printhdr(h);
printf(": %s\n", d);
if (strcmp("date", h) == 0)
print_date_header(v);
else
print_decode_header(h, v);
}
if (n) {
*n = ':';

Loading…
Cancel
Save