Message ID | 1476380459-3167-1-git-send-email-stefasab@gmail.com |
---|---|
State | Superseded |
Headers | show |
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 --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" /**