From: Karthik Nayak <karthik.188@gmail.com>
To: Junio C Hamano <gitster@pobox.com>
Cc: Eric Sunshine <sunshine@sunshineco.com>, Git List <git@vger.kernel.org>
Subject: Re: [PATCH v3 00/15] ref-filter: use parsing functions
Date: Fri, 8 Jan 2016 01:50:00 +0530 [thread overview]
Message-ID: <CAOLa=ZSoAdSet5LL9fxJA-xj6Z_giuVL3+x_N7qTs_yFujrhWA@mail.gmail.com> (raw)
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:
> 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.
> 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.
> 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.
> 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
next prev parent reply other threads:[~2016-01-07 20:20 UTC|newest]
Thread overview: 52+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-01-05 8:02 [PATCH v3 00/15] ref-filter: use parsing functions Karthik Nayak
2016-01-05 8:03 ` [PATCH v3 01/15] strbuf: introduce strbuf_split_str_omit_term() Karthik Nayak
2016-01-05 19:24 ` Junio C Hamano
2016-01-06 7:27 ` Karthik Nayak
2016-01-21 19:47 ` Eric Sunshine
2016-01-25 6:12 ` Karthik Nayak
2016-01-05 8:03 ` [PATCH v3 02/15] ref-filter: use strbuf_split_str_omit_term() Karthik Nayak
2016-01-05 8:03 ` [PATCH v3 03/15] ref-filter: bump 'used_atom' and related code to the top Karthik Nayak
2016-01-05 8:03 ` [PATCH v3 04/15] ref-filter: introduce struct used_atom Karthik Nayak
2016-01-21 19:04 ` Eric Sunshine
2016-01-25 6:13 ` Karthik Nayak
2016-01-05 8:03 ` [PATCH v3 05/15] ref-filter: introduce parsing functions for each valid atom Karthik Nayak
2016-01-05 8:03 ` [PATCH v3 06/15] ref-fitler: bump match_atom() name to the top Karthik Nayak
2016-01-05 8:03 ` [PATCH v3 07/15] ref-filter: skip deref specifier in match_atom_name() Karthik Nayak
2016-01-05 8:03 ` [PATCH v3 08/15] ref-filter: introduce color_atom_parser() Karthik Nayak
2016-01-05 20:49 ` Junio C Hamano
2016-01-06 7:52 ` Karthik Nayak
2016-01-05 21:06 ` Junio C Hamano
2016-01-06 10:16 ` Karthik Nayak
2016-01-05 8:03 ` [PATCH v3 09/15] ref-filter: introduce align_atom_parser() Karthik Nayak
2016-01-05 8:03 ` [PATCH v3 10/15] ref-filter: introduce parse_align_position() Karthik Nayak
2016-01-25 21:49 ` Eric Sunshine
2016-01-26 11:34 ` Karthik Nayak
2016-01-05 8:03 ` [PATCH v3 11/15] ref-filter: convert variable 'width' to an unsigned int Karthik Nayak
2016-01-05 21:12 ` Junio C Hamano
2016-01-06 10:17 ` Karthik Nayak
2016-01-05 8:03 ` [PATCH v3 12/15] ref-filter: align: introduce long-form syntax Karthik Nayak
2016-01-25 22:58 ` Eric Sunshine
2016-01-25 23:45 ` Junio C Hamano
2016-01-26 9:40 ` Karthik Nayak
2016-01-26 9:30 ` Karthik Nayak
2016-01-26 5:16 ` Christian Couder
2016-01-26 9:39 ` Karthik Nayak
2016-01-05 8:03 ` [PATCH v3 13/15] ref-filter: introduce remote_ref_atom_parser() Karthik Nayak
2016-01-26 0:28 ` Eric Sunshine
2016-01-26 10:02 ` Karthik Nayak
2016-01-05 8:03 ` [PATCH v3 14/15] ref-filter: introduce contents_atom_parser() Karthik Nayak
2016-01-05 21:22 ` Junio C Hamano
2016-01-06 18:22 ` Karthik Nayak
2016-01-07 18:04 ` Junio C Hamano
2016-01-07 20:03 ` Karthik Nayak
2016-01-05 8:03 ` [PATCH v3 15/15] ref-filter: introduce objectname_atom_parser() Karthik Nayak
2016-01-05 21:31 ` Junio C Hamano
2016-01-06 18:27 ` Karthik Nayak
2016-01-06 21:14 ` [PATCH v3 00/15] ref-filter: use parsing functions Eric Sunshine
2016-01-07 14:25 ` Karthik Nayak
2016-01-07 18:43 ` Junio C Hamano
2016-01-07 20:20 ` Karthik Nayak [this message]
2016-01-07 20:36 ` Eric Sunshine
2016-01-07 20:44 ` Karthik Nayak
2016-01-07 21:28 ` Junio C Hamano
2016-01-09 9:00 ` Karthik Nayak
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='CAOLa=ZSoAdSet5LL9fxJA-xj6Z_giuVL3+x_N7qTs_yFujrhWA@mail.gmail.com' \
--to=karthik.188@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=sunshine@sunshineco.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).