Browse Source
Plug (some) memory leaks around parse_date_format(). * ab/date-mode-release: date API: add and use a date_mode_release() date API: add basic API docs date API: provide and use a DATE_MODE_INIT date API: create a date.h, split from cache.h cache.h: remove always unused show_date_human() declarationmaint

20 changed files with 112 additions and 54 deletions
@ -0,0 +1,74 @@
@@ -0,0 +1,74 @@
|
||||
#ifndef DATE_H |
||||
#define DATE_H |
||||
|
||||
/** |
||||
* The date mode type. This has DATE_NORMAL at an explicit "= 0" to |
||||
* accommodate a memset([...], 0, [...]) initialization when "struct |
||||
* date_mode" is used as an embedded struct member, as in the case of |
||||
* e.g. "struct pretty_print_context" and "struct rev_info". |
||||
*/ |
||||
enum date_mode_type { |
||||
DATE_NORMAL = 0, |
||||
DATE_HUMAN, |
||||
DATE_RELATIVE, |
||||
DATE_SHORT, |
||||
DATE_ISO8601, |
||||
DATE_ISO8601_STRICT, |
||||
DATE_RFC2822, |
||||
DATE_STRFTIME, |
||||
DATE_RAW, |
||||
DATE_UNIX |
||||
}; |
||||
|
||||
struct date_mode { |
||||
enum date_mode_type type; |
||||
const char *strftime_fmt; |
||||
int local; |
||||
}; |
||||
|
||||
#define DATE_MODE_INIT { \ |
||||
.type = DATE_NORMAL, \ |
||||
} |
||||
|
||||
/** |
||||
* Convenience helper for passing a constant type, like: |
||||
* |
||||
* show_date(t, tz, DATE_MODE(NORMAL)); |
||||
*/ |
||||
#define DATE_MODE(t) date_mode_from_type(DATE_##t) |
||||
struct date_mode *date_mode_from_type(enum date_mode_type type); |
||||
|
||||
/** |
||||
* Format <'time', 'timezone'> into static memory according to 'mode' |
||||
* and return it. The mode is an initialized "struct date_mode" |
||||
* (usually from the DATE_MODE() macro). |
||||
*/ |
||||
const char *show_date(timestamp_t time, int timezone, const struct date_mode *mode); |
||||
|
||||
/** |
||||
* Parse a date format for later use with show_date(). |
||||
* |
||||
* When the "date_mode_type" is DATE_STRFTIME the "strftime_fmt" |
||||
* member of "struct date_mode" will be a malloc()'d format string to |
||||
* be used with strbuf_addftime(), in which case you'll need to call |
||||
* date_mode_release() later. |
||||
*/ |
||||
void parse_date_format(const char *format, struct date_mode *mode); |
||||
|
||||
/** |
||||
* Release a "struct date_mode", currently only required if |
||||
* parse_date_format() has parsed a "DATE_STRFTIME" format. |
||||
*/ |
||||
void date_mode_release(struct date_mode *mode); |
||||
|
||||
void show_date_relative(timestamp_t time, struct strbuf *timebuf); |
||||
int parse_date(const char *date, struct strbuf *out); |
||||
int parse_date_basic(const char *date, timestamp_t *timestamp, int *offset); |
||||
int parse_expiry_date(const char *date, timestamp_t *timestamp); |
||||
void datestamp(struct strbuf *out); |
||||
#define approxidate(s) approxidate_careful((s), NULL) |
||||
timestamp_t approxidate_careful(const char *, int *); |
||||
timestamp_t approxidate_relative(const char *date); |
||||
int date_overflows(timestamp_t date); |
||||
time_t tm_to_time_t(const struct tm *tm); |
||||
#endif |
Loading…
Reference in new issue