Re: [PATCH v3 3/3] kconfig: Print reverse dependencies in groups

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Sun, Feb 18, 2018 at 2:19 PM, Ulf Magnusson <ulfalizer@xxxxxxxxx> wrote:
> On Sun, Feb 18, 2018 at 2:02 PM, Ulf Magnusson <ulfalizer@xxxxxxxxx> wrote:
>> On Sun, Feb 18, 2018 at 12:07:02PM +0100, Eugeniu Rosca wrote:
>>> If expr_print_newline is renamed to expr_print_{select,revdep}, then
>>> I still face the need of expr_print_newline. So, I kept the *newline()
>>> function in place and came up with below solution to aggregate
>>> duplicated code. Please, let me know if it looks OK to you (btw, it
>>> creates a slightly higher --stat compared to current solution).
>>>
>>> diff --git a/scripts/kconfig/expr.c b/scripts/kconfig/expr.c
>>> index 48b99371d276..a6316e5681d9 100644
>>> --- a/scripts/kconfig/expr.c
>>> +++ b/scripts/kconfig/expr.c
>>> @@ -1189,6 +1189,34 @@ expr_print_newline(struct expr *e,
>>>       expr_print(e, fn, data, prevtoken);
>>>  }
>>>
>>> +static void
>>> +expr_print_revdep(struct expr *e,
>>> +               void (*fn)(void *, struct symbol *, const char *),
>>> +               void *data,
>>> +               int prevtoken,
>>> +               enum print_type type)
>>> +{
>>> +     switch (type) {
>>> +     case PRINT_REVDEP_ALL:
>>> +             expr_print_newline(e, fn, data, prevtoken);
>>> +             break;
>>> +     case PRINT_REVDEP_YES:
>>> +             if (expr_calc_value(e) == yes)
>>> +                     expr_print_newline(e, fn, data, prevtoken);
>>> +             break;
>>> +     case PRINT_REVDEP_MOD:
>>> +             if (expr_calc_value(e) == mod)
>>> +                     expr_print_newline(e, fn, data, prevtoken);
>>> +             break;
>>> +     case PRINT_REVDEP_NO:
>>> +             if (expr_calc_value(e) == no)
>>> +                     expr_print_newline(e, fn, data, prevtoken);
>>> +             break;
>>> +     default:
>>> +             break;
>>> +     }
>>> +}
>>> +
>>
>> I think it's fine to have a separate expr_print_newline() function
>> still. Getting rid of the repetition still makes it more readable to me.
>>
>> Maybe you could do something like this if you want to eliminate
>> expr_print_newline() though. AFAICS, it isn't used outside
>> expr_print_revdep().
>>
>>         static void
>>         expr_print_revdep(struct expr *e,
>>                           void (*fn)(void *, struct symbol *, const char *),
>>                           void *data,
>>                           int prevtoken,
>>                           enum print_type type)
>>         {
>>                 if (type == PRINT_REVDEP_ALL                              ||
>>                     type == PRINT_REVDEP_YES && expr_calc_value(e) == yes ||
>>                     type == PRINT_REVDEP_MOD && expr_calc_value(e) == mod ||
>>                     type == PRINT_REVDEP_NO  && expr_calc_value(e) == no) {
>>
>>                         fn(data, NULL, "\n - ");
>>                         expr_print(e, fn, data, prevtoken);
>>                 }
>>         }
>>
>>
>> Could turn that into a switch over 'type' and set a 'print_revdep' flag
>> which is checked at the end too, if you'd prefer that:
>>
>>         switch (type) {
>>         ...
>>         case PRINT_REVDEP_YES:
>>                 print_revdep = (expr_calc_value(e) == yes);
>>                 break;
>>         ...
>>         }
>>
>>         if (print_revdep) {
>>                 fn(data, NULL, "\n - ");
>>                 expr_print(e, fn, data, prevtoken);
>>         }
>>
>>
>> Or return early:
>>
>>         case PRINT_REVDEP_YES:
>>                 if (expr_calc_value(e) != yes)
>>                         return;
>>                 break;
>>         ...
>>         }
>>
>>         fn(data, NULL, "\n - ");
>>         expr_print(e, fn, data, prevtoken);
>>
>>
>> The original version is already fine by me though. The 'if' version
>> seems pretty direct too.
>>
>> Cheers,
>> Ulf
>
> Hmm... was thinking that you could get rid of 'print_type' and just
> pass a tristate value for a moment too. There's PRINT_NORMAL and
> PRINT_REVDEP_ALL to deal with as well though, so it'd get messy.
>
> Cheers,
> Ulf

One last bikeshedding: Could factor out just the check into a function
and do something like this in __expr_print():

        if (select_has_type(e, type))
                expr_print_newline(e, fn, data, prevtoken);

Having a function that's just one big 'if' feels slightly silly,
though it's not horrible here either IMO.

Cheers,
Ulf
--
To unsubscribe from this list: send the line "unsubscribe linux-kbuild" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux&nblp;USB Development]     [Linux Media]     [Video for Linux]     [Linux Audio Users]     [Yosemite Secrets]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux