Print v4l parser position on error
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Thu, 26 Sep 2013 20:16:24 +0000 (22:16 +0200)
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Thu, 26 Sep 2013 21:49:27 +0000 (23:49 +0200)
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: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
src/mediactl.c
src/tools.h
src/v4l2subdev.c

index b22fbdf..57cf86b 100644 (file)
@@ -677,8 +677,8 @@ int media_parse_setup_link(struct media_device *media,
        return media_setup_link(media, link->source, link->sink, flags);
 }
 
        return media_setup_link(media, link->source, link->sink, flags);
 }
 
-static void media_print_streampos(struct media_device *media, const char *p,
-                                 const char *end)
+void media_print_streampos(struct media_device *media, const char *p,
+                          const char *end)
 {
        int pos;
 
 {
        int pos;
 
index de06cb3..e64b37e 100644 (file)
@@ -25,5 +25,8 @@
 #define ARRAY_SIZE(array)      (sizeof(array) / sizeof((array)[0]))
 #define FIELD_SIZEOF(t, f)     (sizeof(((t*)0)->f))
 
 #define ARRAY_SIZE(array)      (sizeof(array) / sizeof((array)[0]))
 #define FIELD_SIZEOF(t, f)     (sizeof(((t*)0)->f))
 
+void media_print_streampos(struct media_device *media, const char *p,
+                          const char *end);
+
 #endif /* __TOOLS_H__ */
 
 #endif /* __TOOLS_H__ */
 
index 60655af..2d45d7f 100644 (file)
@@ -277,12 +277,14 @@ static int v4l2_subdev_parse_rectangle(struct media_device *media,
 
        if (*p++ != '(') {
                media_dbg(media, "Expected '('\n");
 
        if (*p++ != '(') {
                media_dbg(media, "Expected '('\n");
+               *endp = (char *)p - 1;
                return -EINVAL;
        }
 
        r->left = strtoul(p, &end, 10);
        if (*end != ',') {
                media_dbg(media, "Expected ','\n");
                return -EINVAL;
        }
 
        r->left = strtoul(p, &end, 10);
        if (*end != ',') {
                media_dbg(media, "Expected ','\n");
+               *endp = end;
                return -EINVAL;
        }
 
                return -EINVAL;
        }
 
@@ -290,10 +292,12 @@ static int v4l2_subdev_parse_rectangle(struct media_device *media,
        r->top = strtoul(p, &end, 10);
        if (*end++ != ')') {
                media_dbg(media, "Expected ')'\n");
        r->top = strtoul(p, &end, 10);
        if (*end++ != ')') {
                media_dbg(media, "Expected ')'\n");
+               *endp = end - 1;
                return -EINVAL;
        }
        if (*end != '/') {
                media_dbg(media, "Expected '/'\n");
                return -EINVAL;
        }
        if (*end != '/') {
                media_dbg(media, "Expected '/'\n");
+               *endp = end;
                return -EINVAL;
        }
 
                return -EINVAL;
        }
 
@@ -301,6 +305,7 @@ static int v4l2_subdev_parse_rectangle(struct media_device *media,
        r->width = strtoul(p, &end, 10);
        if (*end != 'x') {
                media_dbg(media, "Expected 'x'\n");
        r->width = strtoul(p, &end, 10);
        if (*end != 'x') {
                media_dbg(media, "Expected 'x'\n");
+               *endp = end;
                return -EINVAL;
        }
 
                return -EINVAL;
        }
 
@@ -324,6 +329,7 @@ static int v4l2_subdev_parse_frame_interval(struct media_device *media,
        for (p = end; isspace(*p); ++p);
        if (*p++ != '/') {
                media_dbg(media, "Expected '/'\n");
        for (p = end; isspace(*p); ++p);
        if (*p++ != '/') {
                media_dbg(media, "Expected '/'\n");
+               *endp = (char *)p - 1;
                return -EINVAL;
        }
 
                return -EINVAL;
        }
 
@@ -363,12 +369,15 @@ static struct media_pad *v4l2_subdev_parse_pad_format(
        for (; isspace(*p); ++p);
 
        pad = media_parse_pad(media, p, &end);
        for (; isspace(*p); ++p);
 
        pad = media_parse_pad(media, p, &end);
-       if (pad == NULL)
+       if (pad == NULL) {
+               *endp = end;
                return NULL;
                return NULL;
+       }
 
        for (p = end; isspace(*p); ++p);
        if (*p++ != '[') {
                media_dbg(media, "Expected '['\n");
 
        for (p = end; isspace(*p); ++p);
        if (*p++ != '[') {
                media_dbg(media, "Expected '['\n");
+               *endp = (char *)p - 1;
                return NULL;
        }
 
                return NULL;
        }
 
@@ -380,9 +389,11 @@ static struct media_pad *v4l2_subdev_parse_pad_format(
                 * uppercase later, process it as a format description.
                 */
                if (strhazit("fmt:", &p) || (first && isupper(*p))) {
                 * uppercase later, process it as a format description.
                 */
                if (strhazit("fmt:", &p) || (first && isupper(*p))) {
-                       ret = v4l2_subdev_parse_format(format, p, &end);
-                       if (ret < 0)
+                       ret = v4l2_subdev_parse_format(media, format, p, &end);
+                       if (ret < 0) {
+                               *endp = end;
                                return NULL;
                                return NULL;
+                       }
 
                        p = end;
                        continue;
 
                        p = end;
                        continue;
@@ -393,27 +404,33 @@ static struct media_pad *v4l2_subdev_parse_pad_format(
                 * implicitly without the 'crop:' property name.
                 */
                if (strhazit("crop:", &p) || *p == '(') {
                 * implicitly without the 'crop:' property name.
                 */
                if (strhazit("crop:", &p) || *p == '(') {
-                       ret = v4l2_subdev_parse_rectangle(crop, p, &end);
-                       if (ret < 0)
+                       ret = v4l2_subdev_parse_rectangle(media, crop, p, &end);
+                       if (ret < 0) {
+                               *endp = end;
                                return NULL;
                                return NULL;
+                       }
 
                        p = end;
                        continue;
                }
 
                if (strhazit("compose:", &p)) {
 
                        p = end;
                        continue;
                }
 
                if (strhazit("compose:", &p)) {
-                       ret = v4l2_subdev_parse_rectangle(compose, p, &end);
-                       if (ret < 0)
+                       ret = v4l2_subdev_parse_rectangle(media, compose, p, &end);
+                       if (ret < 0) {
+                               *endp = end;
                                return NULL;
                                return NULL;
+                       }
 
                        for (p = end; isspace(*p); p++);
                        continue;
                }
 
                if (*p == '@') {
 
                        for (p = end; isspace(*p); p++);
                        continue;
                }
 
                if (*p == '@') {
-                       ret = v4l2_subdev_parse_frame_interval(interval, ++p, &end);
-                       if (ret < 0)
+                       ret = v4l2_subdev_parse_frame_interval(media, interval, ++p, &end);
+                       if (ret < 0) {
+                               *endp = end;
                                return NULL;
                                return NULL;
+                       }
 
                        p = end;
                        continue;
 
                        p = end;
                        continue;
@@ -424,6 +441,7 @@ static struct media_pad *v4l2_subdev_parse_pad_format(
 
        if (*p != ']') {
                media_dbg(media, "Expected ']'\n");
 
        if (*p != ']') {
                media_dbg(media, "Expected ']'\n");
+               *endp = (char *)p;
                return NULL;
        }
 
                return NULL;
        }
 
@@ -534,6 +552,7 @@ static int v4l2_subdev_parse_setup_format(struct media_device *media,
        pad = v4l2_subdev_parse_pad_format(media, &format, &crop, &compose,
                                           &interval, p, &end);
        if (pad == NULL) {
        pad = v4l2_subdev_parse_pad_format(media, &format, &crop, &compose,
                                           &interval, p, &end);
        if (pad == NULL) {
+               media_print_streampos(media, p, end);
                media_dbg(media, "Unable to parse format\n");
                return -EINVAL;
        }
                media_dbg(media, "Unable to parse format\n");
                return -EINVAL;
        }