• Jeff King's avatar
    convert "enum date_mode" into a struct · a5481a6c
    Jeff King authored
    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: default avatarJeff King <peff@peff.net>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    a5481a6c
test-date.c 1.48 KB