From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: Sascha Hauer <s.hauer@pengutronix.de>
Cc: linux-media@vger.kernel.org
Subject: Re: [PATCH 2/2] Print parser position on error
Date: Wed, 19 Jun 2013 02:39:48 +0200 [thread overview]
Message-ID: <15767957.U4axePOriY@avalon> (raw)
In-Reply-To: <2088324.Z7uO2ssh1O@avalon>
Hi Sascha,
On Monday 10 June 2013 15:56:01 Laurent Pinchart wrote:
> Hi Sascha,
>
> I'm sorry for the late reply.
>
> Great patch set, thank you. It's very helpful.
Should I got ahead and apply the patch with the proposed modifications below ?
> On Wednesday 08 May 2013 15:27:54 Sascha Hauer wrote:
> > Most parser functions take a **endp argument to indicate the caller
> > where parsing has stopped. This is currently only used after parsing
> > something successfully. This patch sets **endp to the erroneous
> > position in the error case and prints its position after an error
> > has occured.
> >
> > Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
> > ---
> >
> > src/mediactl.c | 48 +++++++++++++++++++++++++++++++++++++++++++++---
> > 1 file changed, 45 insertions(+), 3 deletions(-)
> >
> > diff --git a/src/mediactl.c b/src/mediactl.c
> > index c65de50..04ade15 100644
> > --- a/src/mediactl.c
> > +++ b/src/mediactl.c
> > @@ -40,6 +40,22 @@
> >
> > #include "mediactl.h"
> > #include "tools.h"
> >
> > +void media_print_streampos(struct media_device *media, const char *p,
> > const char *end)
>
> The function can be static.
>
> > +{
> > + int pos;
> > +
> > + pos = end - p + 1;
> > +
> > + if (pos < 0)
> > + pos = 0;
> > + if (pos > strlen(p))
> > + pos = strlen(p);
> > +
> > + media_dbg(media, "\n");
> > + media_dbg(media, " %s\n", p);
> > + media_dbg(media, " %*s\n", pos, "^");
> > +}
> > +
> >
> > struct media_pad *media_entity_remote_source(struct media_pad *pad)
> > {
> >
> > unsigned int i;
> >
> > @@ -538,12 +554,16 @@ struct media_pad *media_parse_pad(struct
> > media_device
> > *media, if (*p == '"') {
> >
> > for (end = (char *)p + 1; *end && *end != '"'; ++end);
> > if (*end != '"') {
> >
> > + if (endp)
> > + *endp = (char *)end;
>
> No need to cast to a char * here, end is already a char *.
>
> What would you think about adding
>
> + /* endp can be NULL. To avoid spreading NULL checks across the
> + * function, set endp to &end in that case.
> + */
> + if (endp == NULL)
> + endp = &end;
>
> at the beginning of the function and removing the endp NULL checks that are
> spread across the code below ?
>
> > media_dbg(media, "missing matching '\"'\n");
> > return NULL;
> >
> > }
> >
> > entity = media_get_entity_by_name(media, p + 1, end - p - 1);
> > if (entity == NULL) {
> >
> > + if (endp)
> > + *endp = (char *)p + 1;
> >
> > media_dbg(media, "no such entity \"%.*s\"\n", end - p - 1, p
+
>
> 1);
>
> > return NULL;
> >
> > }
> >
> > @@ -553,6 +573,8 @@ struct media_pad *media_parse_pad(struct media_device
> > *media, entity_id = strtoul(p, &end, 10);
> >
> > entity = media_get_entity_by_id(media, entity_id);
> > if (entity == NULL) {
> >
> > + if (endp)
> > + *endp = (char *)p;
> >
> > media_dbg(media, "no such entity %d\n", entity_id);
> > return NULL;
> >
> > }
> >
> > @@ -560,6 +582,8 @@ struct media_pad *media_parse_pad(struct media_device
> > *media, for (; isspace(*end); ++end);
> >
> > if (*end != ':') {
> >
> > + if (endp)
> > + *endp = end;
> >
> > media_dbg(media, "Expected ':'\n", *end);
> > return NULL;
> >
> > }
> >
> > @@ -569,6 +593,8 @@ struct media_pad *media_parse_pad(struct media_device
> > *media, pad = strtoul(p, &end, 10);
> >
> > if (pad >= entity->info.pads) {
> >
> > + if (endp)
> > + *endp = (char *)p;
> >
> > media_dbg(media, "No pad '%d' on entity \"%s\". Maximum pad
number is
> >
> > %d\n", pad, entity->info.name, entity->info.pads - 1);
> >
> > return NULL;
> >
> > @@ -591,10 +617,15 @@ struct media_link *media_parse_link(struct
> > media_device *media, char *end;
> >
> > source = media_parse_pad(media, p, &end);
> >
> > - if (source == NULL)
> > + if (source == NULL) {
> > + if (endp)
> > + *endp = end;
>
> The endp argument to media_parse_link() and media_parse_setup_link() is
> mandatory, there's no need to test it.
>
> If you're fine with those modifications there's no need to resubmit the
> code, I'll fix it while applying.
>
> > return NULL;
> >
> > + }
> >
> > if (end[0] != '-' || end[1] != '>') {
> >
> > + if (endp)
> > + *endp = end;
> >
> > media_dbg(media, "Expected '->'\n");
> > return NULL;
> >
> > }
> >
> > @@ -602,8 +633,11 @@ struct media_link *media_parse_link(struct
> > media_device *media, p = end + 2;
> >
> > sink = media_parse_pad(media, p, &end);
> >
> > - if (sink == NULL)
> > + if (sink == NULL) {
> > + if (endp)
> > + *endp = end;
> >
> > return NULL;
> >
> > + }
> >
> > *endp = end;
> >
> > @@ -629,6 +663,8 @@ int media_parse_setup_link(struct media_device *media,
> >
> > link = media_parse_link(media, p, &end);
> > if (link == NULL) {
> >
> > + if (endp)
> > + *endp = end;
> >
> > media_dbg(media,
> >
> > "%s: Unable to parse link\n", __func__);
> >
> > return -EINVAL;
> >
> > @@ -636,6 +672,8 @@ int media_parse_setup_link(struct media_device *media,
> >
> > p = end;
> > if (*p++ != '[') {
> >
> > + if (endp)
> > + *endp = (char *)p - 1;
> >
> > media_dbg(media, "Unable to parse link flags: expected '['.\n");
> > return -EINVAL;
> >
> > }
> >
> > @@ -643,6 +681,8 @@ int media_parse_setup_link(struct media_device *media,
> >
> > flags = strtoul(p, &end, 10);
> > for (p = end; isspace(*p); p++);
> > if (*p++ != ']') {
> >
> > + if (endp)
> > + *endp = (char *)p - 1;
> >
> > media_dbg(media, "Unable to parse link flags: expected ']'.\n");
> > return -EINVAL;
> >
> > }
> >
> > @@ -666,8 +706,10 @@ int media_parse_setup_links(struct media_device
> > *media, const char *p)
> >
> > do {
> >
> > ret = media_parse_setup_link(media, p, &end);
> >
> > - if (ret < 0)
> > + if (ret < 0) {
> > + media_print_streampos(media, p, end);
> >
> > return ret;
> >
> > + }
> >
> > p = end + 1;
> >
> > } while (*end == ',');
--
Regards,
Laurent Pinchart
next prev parent reply other threads:[~2013-06-19 0:39 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-05-08 13:27 [PATCH] media-ctl error messages Sascha Hauer
2013-05-08 13:27 ` [PATCH 1/2] Print more detailed parse " Sascha Hauer
2013-05-08 13:32 ` Sascha Hauer
2013-05-08 13:27 ` [PATCH 2/2] Print parser position on error Sascha Hauer
2013-06-10 13:56 ` Laurent Pinchart
2013-06-19 0:39 ` Laurent Pinchart [this message]
2013-06-19 5:30 ` Sascha Hauer
2013-06-19 10:40 ` Laurent Pinchart
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=15767957.U4axePOriY@avalon \
--to=laurent.pinchart@ideasonboard.com \
--cc=linux-media@vger.kernel.org \
--cc=s.hauer@pengutronix.de \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.