diff mbox

[FFmpeg-devel] lavf/aviobuf: add ff_get_line2() variant

Message ID 1476380459-3167-1-git-send-email-stefasab@gmail.com
State Superseded
Headers show

Commit Message

Stefano Sabatini Oct. 13, 2016, 5:40 p.m. UTC
This allows to probe if the read line was partially discarded.
---
 libavformat/aviobuf.c  | 10 +++++++++-
 libavformat/internal.h | 14 ++++++++++++++
 2 files changed, 23 insertions(+), 1 deletion(-)

Comments

Michael Niedermayer Oct. 13, 2016, 7:59 p.m. UTC | #1
On Thu, Oct 13, 2016 at 07:40:59PM +0200, Stefano Sabatini wrote:
> This allows to probe if the read line was partially discarded.
> ---
>  libavformat/aviobuf.c  | 10 +++++++++-
>  libavformat/internal.h | 14 ++++++++++++++
>  2 files changed, 23 insertions(+), 1 deletion(-)
> 
> diff --git a/libavformat/aviobuf.c b/libavformat/aviobuf.c
> index 134d627..28183b4 100644
> --- a/libavformat/aviobuf.c
> +++ b/libavformat/aviobuf.c
> @@ -764,18 +764,26 @@ unsigned int avio_rb32(AVIOContext *s)
>  
>  int ff_get_line(AVIOContext *s, char *buf, int maxlen)
>  {
> -    int i = 0;
> +    return ff_get_line2(s, buf, maxlen, NULL);
> +}
> +
> +int ff_get_line2(AVIOContext *s, char *buf, int maxlen, int *readlen)
> +{
> +    int i = 0, j = 0;
>      char c;
>  
>      do {
>          c = avio_r8(s);
>          if (c && i < maxlen-1)
>              buf[i++] = c;
> +        j++;
>      } while (c != '\n' && c != '\r' && c);

"\n" and "\0" would i belive both have a j=1 but they would have
differig i
is that intended ? (seems to me that this would make truncation
detection more annoying)
or am i missing something that avoids this difference?

[...]
diff mbox

Patch

diff --git a/libavformat/aviobuf.c b/libavformat/aviobuf.c
index 134d627..28183b4 100644
--- a/libavformat/aviobuf.c
+++ b/libavformat/aviobuf.c
@@ -764,18 +764,26 @@  unsigned int avio_rb32(AVIOContext *s)
 
 int ff_get_line(AVIOContext *s, char *buf, int maxlen)
 {
-    int i = 0;
+    return ff_get_line2(s, buf, maxlen, NULL);
+}
+
+int ff_get_line2(AVIOContext *s, char *buf, int maxlen, int *readlen)
+{
+    int i = 0, j = 0;
     char c;
 
     do {
         c = avio_r8(s);
         if (c && i < maxlen-1)
             buf[i++] = c;
+        j++;
     } while (c != '\n' && c != '\r' && c);
     if (c == '\r' && avio_r8(s) != '\n' && !avio_feof(s))
         avio_skip(s, -1);
 
     buf[i] = 0;
+    if (readlen)
+        *readlen = j;
     return i;
 }
 
diff --git a/libavformat/internal.h b/libavformat/internal.h
index 49244fa..cffc787 100644
--- a/libavformat/internal.h
+++ b/libavformat/internal.h
@@ -274,6 +274,20 @@  void ff_put_v(AVIOContext *bc, uint64_t val);
  */
 int ff_get_line(AVIOContext *s, char *buf, int maxlen);
 
+/**
+ * Read a whole line of text from AVIOContext. Stop reading after reaching
+ * either a \\n, a \\0 or EOF. The returned string is always \\0-terminated,
+ * and may be truncated if the buffer is too small.
+ *
+ * @param s the read-only AVIOContext
+ * @param buf buffer to store the read line
+ * @param maxlen size of the buffer
+ * @param readlen length of the read line, including the terminating newline character
+ * @return the length of the string written in the buffer, not including the
+ *         final \\0
+ */
+int ff_get_line2(AVIOContext *s, char *buf, int maxlen, int *readlen);
+
 #define SPACE_CHARS " \t\r\n"
 
 /**