git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH v3 00/15] ref-filter: use parsing functions

From
Karthik Nayak <karthik.188@gmail.com>
Date
Jan 7, 2016, 20:20 UTC
Message-ID
<CAOLa=ZSoAdSet5LL9fxJA-xj6Z_giuVL3+x_N7qTs_yFujrhWA@mail.gmail.com>
In-Reply-To
<xmqqvb7544de.fsf@gitster.mtv.corp.google.com>
On Fri, Jan 8, 2016 at 12:13 AM, Junio C Hamano <gitster@pobox.com> wrote:
Show 78 quoted lines
> Karthik Nayak <karthik.188@gmail.com> writes:
>
>>> I don't understand the difficulty. It should be easy to manually skip
>>> the 'deref' for this one particular case:
>>>
>>>     const char *name = atom->name;
>>>     if (*name == '*')
>>>         name++;
>>>
>>> Which would allow this unnecessarily complicated code from patch 14/15:
>>>
>>>     if (match_atom_name(atom->name, "subject", &buf) && !buf) {
>>>         ...
>>>         return;
>>>     } else if (match_atom_name(atom->name, "body", &buf) && !buf) {
>>>         ...
>>>         return;
>>>     } if (!match_atom_name(atom->name, "contents", &buf))
>>>         die("BUG: parsing non-'contents'");
>>>
>>> to be simplified to the more easily understood form suggested during
>>> review[1] of v2:
>>>
>>>     if (!strcmp(name, "subject")) {
>>>         ...
>>>         return;
>>>     } else if (!strcmp(name, "body")) {
>>>         ...
>>>         return;
>>>     } else if (!match_atom_name(name,"contents", &buf))
>>>         die("BUG: expected 'contents' or 'contents:'");
>>>
>>> You could also just use (!strcmp("body") || !strcmp("*body")) rather
>>> than skipping "*" manually, but the repetition makes that a bit
>>> noisier and uglier.
>>>
>>> [1]: http://article.gmane.org/gmane.comp.version-control.git/282645
>>
>> Definitely not a difficulty per se. Just that it seems like something
>> match_atom_name()
>> seems to be fit for. As the function name suggests that we're matching
>> the atom name
>> and the check for '!buf' indicates that no options are to be included
>> for that particular atom.
>>
>> Also after Junio's suggestion[1], I think It looks better now[2]. But
>> either ways, I'm not
>> strongly against what you're saying, so my opinion on this matter is
>> quite flexible.
>>
>> [1]: http://article.gmane.org/gmane.comp.version-control.git/283404
>> [2]: http://article.gmane.org/gmane.comp.version-control.git/283449
>
> Sorry, but I suspect I was looking at a leaf function without
> thinking about the larger picture.
>
> I suspect that the interface to customized parsing function called
> by parse_ref_filter_atom() is misdesigned.  I understand that the
> overall parsing that starts at verify_ref_format() goes like this:
>
>  * Iterate over the string and find a matching "%(",")" pair.
>
>    - For each such pair found, use parse_ref_filter_atom() on
>      what is inside that matching pair.
>
>      - parse_ref_filter_atom() iterates over the table of known
>        atoms, and finds the entry in that table.
>
>        Note that at this point, it knows that "%(" is followed by
>        'contents' or 'contents:' when it picked the "contents" atom
>        from the table, for example.
>
>      - if the entry we found in that table for the atom being parsed
>        has a custom parse function, that function is called, but the
>        calling convention does not pass the fact that we already
>        know what we are seeing inside "%(",")" pair is 'contents',
>        for example, and we know what argument it is given if any.
>
Absolutely correct.
Show 7 quoted lines
> So it appears to me that match_atom_name() is a misguided helper
> function that you shouldn't have to use too often.  If the signature
> of parse() functions is changed to take not just the atom but the
> pointer to its argument (could be NULL, if we are seeing
> "%(contents)", for example) that is already available as "formatp"
> in the function, then contents_atom_parser() could become more like:
>

I see, I think this does make sense, since we have extracted any arguments following ':' already in parse_ref_filter_atom() it only makes sense to use it without doing the same type of work again.

Show 12 quoted lines
> contents_atom_parser(struct used_atom *atom, const char *arg)
> {
>         if (args)
>                 atom->u.contents.option = C_BARE;
>         else if (!strcmp(arg, "body"))
>                 atom->u.contents.option = C_BODY;
>         ...
> }
>
> and there is no reason for this caller to even look at atom->name or
> worry about that it might have the dereferencing asterisk in front.
>
This looks good.
Show 19 quoted lines
> If we really want to avoid having separate subject_atom_parser() and
> body_atom_parser(), they can be folded into the same function and it
> becomes necessary to switch on atom->name like you did in the code
> being discussed in the quoted part above.  For that, as Eric said,
> skipping '*' manually would not be a big deal, as that should not
> happen so often in the code _anyway_.  It is not a good idea to
> switch on atom->name inside contents_atom_parser() like you did.
> You are better off having separate {subject,body}_atom_parser()
> functions.
>
> For one thing, you are not reusing or sharing any code by squishing
> these three functions into one.  A conceptually larger problem is
> that you are adding two extra !strcmp() calls to figure out the
> caller _already_ knows (notice I said this is "conceptual", this is
> not about performance).  parse_ref_filter_atom() knows that it is a
> "%(subject)" or "%(subject:...)" atom, but because you throw away
> that information and call contents_atom_parser() by saying that it
> is one of the contents, subject or body, the called function has to
> redo strcmp in order to figure it out itself.

I understand what you're saying and keeping these functions separate seems like the way to go. Also this might also remove all uses of match_atom_name() from ref-filter.c. This Idea seems good to me, thanks for your suggestions, I will work on it.

-- 
Regards,
Karthik Nayak
Previous: Junio C HamanoNext: Eric Sunshine
Message 48 of 52 in “ref-filter: use parsing functions”
  1. 00/15 ref-filter: use parsing functionsKarthik Nayak, Jan 5, 2016
  2. 01/15 strbuf: introduce strbuf_split_str_omit_term()Karthik Nayak, Jan 5, 2016
  3. Junio C HamanoJan 5, 2016
  4. Karthik NayakJan 6, 2016
  5. Eric SunshineJan 21, 2016
  6. Karthik NayakJan 25, 2016
  7. 02/15 ref-filter: use strbuf_split_str_omit_term()Karthik Nayak, Jan 5, 2016
  8. 03/15 ref-filter: bump 'used_atom' and related code to the topKarthik Nayak, Jan 5, 2016
  9. 04/15 ref-filter: introduce struct used_atomKarthik Nayak, Jan 5, 2016
  10. Eric SunshineJan 21, 2016
  11. Karthik NayakJan 25, 2016
  12. 05/15 ref-filter: introduce parsing functions for each valid atomKarthik Nayak, Jan 5, 2016
  13. 06/15 ref-fitler: bump match_atom() name to the topKarthik Nayak, Jan 5, 2016
  14. 07/15 ref-filter: skip deref specifier in match_atom_name()Karthik Nayak, Jan 5, 2016
  15. 08/15 ref-filter: introduce color_atom_parser()Karthik Nayak, Jan 5, 2016
  16. Junio C HamanoJan 5, 2016
  17. Karthik NayakJan 6, 2016
  18. Junio C HamanoJan 5, 2016
  19. Karthik NayakJan 6, 2016
  20. 09/15 ref-filter: introduce align_atom_parser()Karthik Nayak, Jan 5, 2016
  21. 10/15 ref-filter: introduce parse_align_position()Karthik Nayak, Jan 5, 2016
  22. Eric SunshineJan 25, 2016
  23. Karthik NayakJan 26, 2016
  24. 11/15 ref-filter: convert variable 'width' to an unsigned intKarthik Nayak, Jan 5, 2016
  25. Junio C HamanoJan 5, 2016
  26. Karthik NayakJan 6, 2016
  27. 12/15 ref-filter: align: introduce long-form syntaxKarthik Nayak, Jan 5, 2016
  28. Eric SunshineJan 25, 2016
  29. Junio C HamanoJan 25, 2016
  30. Karthik NayakJan 26, 2016
  31. Karthik NayakJan 26, 2016
  32. Christian CouderJan 26, 2016
  33. Karthik NayakJan 26, 2016
  34. 13/15 ref-filter: introduce remote_ref_atom_parser()Karthik Nayak, Jan 5, 2016
  35. Eric SunshineJan 26, 2016
  36. Karthik NayakJan 26, 2016
  37. 14/15 ref-filter: introduce contents_atom_parser()Karthik Nayak, Jan 5, 2016
  38. Junio C HamanoJan 5, 2016
  39. Karthik NayakJan 6, 2016
  40. Junio C HamanoJan 7, 2016
  41. Karthik NayakJan 7, 2016
  42. 15/15 ref-filter: introduce objectname_atom_parser()Karthik Nayak, Jan 5, 2016
  43. Junio C HamanoJan 5, 2016
  44. Karthik NayakJan 6, 2016
  45. Eric SunshineJan 6, 2016
  46. Karthik NayakJan 7, 2016
  47. Junio C HamanoJan 7, 2016
  48. Karthik NayakJan 7, 2016
  49. Eric SunshineJan 7, 2016
  50. Karthik NayakJan 7, 2016
  51. Junio C HamanoJan 7, 2016
  52. Karthik NayakJan 9, 2016

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.