From 8e14b47fd788ce5ae0d1a003a8fba17753eb7db5 Mon Sep 17 00:00:00 2001 From: Jacques Germishuys Date: Thu, 10 Apr 2014 12:42:29 +0200 Subject: [PATCH] Introduce git__date_rfc2822_fmt. Allows for RFC2822 date headers --- src/date.c | 28 ++++++++++++++++++++++++++++ src/util.h | 12 ++++++++++++ 2 files changed, 40 insertions(+) diff --git a/src/date.c b/src/date.c index 7849c2f02..0e1b31aee 100644 --- a/src/date.c +++ b/src/date.c @@ -874,3 +874,31 @@ int git__date_parse(git_time_t *out, const char *date) *out = approxidate_str(date, time_sec, &error_ret); return error_ret; } + +int git__date_rfc2822_fmt(char *out, size_t len, const git_time *date) +{ + int written; + struct tm gmt; + time_t t; + + assert(out && date); + + t = (time_t) (date->time + date->offset * 60); + + if (p_gmtime_r (&t, &gmt) == NULL) + return -1; + + written = p_snprintf(out, len, "%.3s, %u %.3s %.4u %02u:%02u:%02u %+03d%02d", + weekday_names[gmt.tm_wday], + gmt.tm_mday, + month_names[gmt.tm_mon], + gmt.tm_year + 1900, + gmt.tm_hour, gmt.tm_min, gmt.tm_sec, + date->offset / 60, date->offset % 60); + + if (written < 0 || (written > (int) len - 1)) + return -1; + + return 0; +} + diff --git a/src/util.h b/src/util.h index e378786d9..5c2c563d6 100644 --- a/src/util.h +++ b/src/util.h @@ -20,6 +20,8 @@ # define max(a,b) ((a) > (b) ? (a) : (b)) #endif +#define GIT_DATE_RFC2822_SZ 32 + /* * Custom memory allocation wrappers * that set error code and error message @@ -328,6 +330,16 @@ extern int git__parse_bool(int *out, const char *value); */ extern int git__date_parse(git_time_t *out, const char *date); +/* + * Format a git_time as a RFC2822 string + * + * @param out buffer to store formatted date; a '\\0' terminator will automatically be added. + * @param len size of the buffer; should be atleast `GIT_DATE_RFC2822_SZ` in size; + * @param date the date to be formatted + * @return 0 if successful; -1 on error + */ +extern int git__date_rfc2822_fmt(char *out, size_t len, const git_time *date); + /* * Unescapes a string in-place. *