From: Nikolai Weibull <now@xxxxxxxxxxxxxxxxxx> The code that outputs relative timestamps is repetitive and can be simplified by using an array to deal with the various cutoffs. This makes it easier to modify and remove the cutoffs if we in the future desire to do so. Signed-off-by: Nikolai Weibull <now@xxxxxxxx> --- date.c | 63 +++++++++++++++++++++++++++++++-------------------------------- 1 files changed, 31 insertions(+), 32 deletions(-) diff --git a/date.c b/date.c index e387dcd..5891fa8 100644 --- a/date.c +++ b/date.c @@ -64,6 +64,29 @@ const char *show_date(unsigned long time static char timebuf[200]; if (relative) { + static struct { + char name[8]; + unsigned long cutoff; + unsigned long factor; + unsigned long term; + } cutoffs[] = { +#define CUTOFF(name, cutoff, factor, ceiling) \ + { (name), (cutoff) * (factor), (factor), (ceiling) } +#define MINUTES(minutes) ((minutes) * 60) +#define HOURS(hours) ((hours) * MINUTES(60)) +#define DAYS(days) ((days) * HOURS(24)) + CUTOFF("seconds", 90, 1, 0), + CUTOFF("minutes", 90, MINUTES(1), 30), + CUTOFF("hours", 36, HOURS(1), MINUTES(30)), + CUTOFF("days", 14, DAYS(1), HOURS(12)), + CUTOFF("weeks", 12, DAYS(7), HOURS(12)), + CUTOFF("months", 12, DAYS(30), HOURS(12)) +#undef MINUTES +#undef DAYS +#undef HOURS +#undef CUTOFF + }; + int i; unsigned long diff; time_t t = gm_time_t(time, tz); struct timeval now; @@ -71,39 +94,15 @@ const char *show_date(unsigned long time if (now.tv_sec < t) return "in the future"; diff = now.tv_sec - t; - if (diff < 90) { - snprintf(timebuf, sizeof(timebuf), "%lu seconds ago", diff); - return timebuf; - } - /* Turn it into minutes */ - diff = (diff + 30) / 60; - if (diff < 90) { - snprintf(timebuf, sizeof(timebuf), "%lu minutes ago", diff); - return timebuf; - } - /* Turn it into hours */ - diff = (diff + 30) / 60; - if (diff < 36) { - snprintf(timebuf, sizeof(timebuf), "%lu hours ago", diff); - return timebuf; - } - /* We deal with number of days from here on */ - diff = (diff + 12) / 24; - if (diff < 14) { - snprintf(timebuf, sizeof(timebuf), "%lu days ago", diff); - return timebuf; - } - /* Say weeks for the past 10 weeks or so */ - if (diff < 70) { - snprintf(timebuf, sizeof(timebuf), "%lu weeks ago", (diff + 3) / 7); - return timebuf; - } - /* Say months for the past 12 months or so */ - if (diff < 360) { - snprintf(timebuf, sizeof(timebuf), "%lu months ago", (diff + 15) / 30); - return timebuf; + for (i = 0; i < ARRAY_SIZE(cutoffs); i++) { + if (diff < cutoffs[i].cutoff) { + snprintf(timebuf, sizeof(timebuf), "%lu %s ago", + (diff + cutoffs[i].term) / cutoffs[i].factor, + cutoffs[i].name); + return timebuf; + } } - /* Else fall back on absolute format.. */ + /* If we went beyond the month cutoff, use absolute format. */ } tm = time_to_tm(time, tz); -- 1.4.2.GIT-dirty - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html