avio: add avio_get_str()

Signed-off-by: Ronald S. Bultje <rsbultje@gmail.com>
(cherry picked from commit 41d8555f72)
This commit is contained in:
Reimar Döffinger 2011-03-03 13:51:55 +01:00 committed by Michael Niedermayer
parent a960576f20
commit 3e1a8e1ec1
2 changed files with 31 additions and 0 deletions

View File

@ -525,6 +525,20 @@ unsigned int avio_rl24(AVIOContext *s);
unsigned int avio_rl32(AVIOContext *s);
uint64_t avio_rl64(AVIOContext *s);
/**
* Read a string from pb into buf. The reading will terminate when either
* a NULL character was encountered, maxlen bytes have been read, or nothing
* more can be read from pb. The result is guaranteed to be NULL-terminated, it
* will be truncated if buf is too small.
* Note that the string is not interpreted or validated in any way, it
* might get truncated in the middle of a sequence for multi-byte encodings.
*
* @return number of bytes read (is always <= maxlen).
* If reading ends on EOF or error, the return value will be one more than
* bytes actually read.
*/
int avio_get_str(AVIOContext *pb, int maxlen, char *buf, int buflen);
/**
* Read a UTF-16 string from pb and convert it to UTF-8.
* The reading will terminate when either a null or invalid character was

View File

@ -705,6 +705,23 @@ int ff_get_line(AVIOContext *s, char *buf, int maxlen)
return i;
}
int avio_get_str(AVIOContext *s, int maxlen, char *buf, int buflen)
{
int i;
// reserve 1 byte for terminating 0
buflen = FFMIN(buflen - 1, maxlen);
for (i = 0; i < buflen; i++)
if (!(buf[i] = avio_r8(s)))
return i + 1;
if (buflen)
buf[i] = 0;
for (; i < maxlen; i++)
if (!avio_r8(s))
return i + 1;
return maxlen;
}
#define GET_STR16(type, read) \
int avio_get_str16 ##type(AVIOContext *pb, int maxlen, char *buf, int buflen)\
{\