diff options
author | Jeff King <peff@peff.net> | 2015-06-25 16:55:02 (GMT) |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2015-06-29 18:39:07 (GMT) |
commit | a5481a6c9438cbd9c246cfa59ff49c31a0926fb6 (patch) | |
tree | 7992773f5ae1687c910e602b6286f3f1cbe116aa /builtin/for-each-ref.c | |
parent | b7c1e11dc43e3dbd9eb2da20476c4c55dda5e84b (diff) | |
download | git-a5481a6c9438cbd9c246cfa59ff49c31a0926fb6.zip git-a5481a6c9438cbd9c246cfa59ff49c31a0926fb6.tar.gz git-a5481a6c9438cbd9c246cfa59ff49c31a0926fb6.tar.bz2 |
convert "enum date_mode" into a struct
In preparation for adding date modes that may carry extra
information beyond the mode itself, this patch converts the
date_mode enum into a struct.
Most of the conversion is fairly straightforward; we pass
the struct as a pointer and dereference the type field where
necessary. Locations that declare a date_mode can use a "{}"
constructor. However, the tricky case is where we use the
enum labels as constants, like:
show_date(t, tz, DATE_NORMAL);
Ideally we could say:
show_date(t, tz, &{ DATE_NORMAL });
but of course C does not allow that. Likewise, we cannot
cast the constant to a struct, because we need to pass an
actual address. Our options are basically:
1. Manually add a "struct date_mode d = { DATE_NORMAL }"
definition to each caller, and pass "&d". This makes
the callers uglier, because they sometimes do not even
have their own scope (e.g., they are inside a switch
statement).
2. Provide a pre-made global "date_normal" struct that can
be passed by address. We'd also need "date_rfc2822",
"date_iso8601", and so forth. But at least the ugliness
is defined in one place.
3. Provide a wrapper that generates the correct struct on
the fly. The big downside is that we end up pointing to
a single global, which makes our wrapper non-reentrant.
But show_date is already not reentrant, so it does not
matter.
This patch implements 3, along with a minor macro to keep
the size of the callers sane.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'builtin/for-each-ref.c')
-rw-r--r-- | builtin/for-each-ref.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/builtin/for-each-ref.c b/builtin/for-each-ref.c index cb7db23..d757837 100644 --- a/builtin/for-each-ref.c +++ b/builtin/for-each-ref.c @@ -389,7 +389,7 @@ static void grab_date(const char *buf, struct atom_value *v, const char *atomnam char *zone; unsigned long timestamp; long tz; - enum date_mode date_mode = DATE_NORMAL; + struct date_mode date_mode = { DATE_NORMAL }; const char *formatp; /* @@ -401,7 +401,7 @@ static void grab_date(const char *buf, struct atom_value *v, const char *atomnam formatp = strchr(atomname, ':'); if (formatp != NULL) { formatp++; - date_mode = parse_date_format(formatp); + parse_date_format(formatp, &date_mode); } if (!eoemail) @@ -412,7 +412,7 @@ static void grab_date(const char *buf, struct atom_value *v, const char *atomnam tz = strtol(zone, NULL, 10); if ((tz == LONG_MIN || tz == LONG_MAX) && errno == ERANGE) goto bad; - v->s = xstrdup(show_date(timestamp, tz, date_mode)); + v->s = xstrdup(show_date(timestamp, tz, &date_mode)); v->ul = timestamp; return; bad: |