diff options
author | Martin Storsjö <martin@martin.st> | 2010-08-19 14:49:53 +0000 |
---|---|---|
committer | Martin Storsjö <martin@martin.st> | 2010-08-19 14:49:53 +0000 |
commit | f9c399c4fd85ac140ea3b81d0eeb649df29ade3d (patch) | |
tree | df512bccb2887a264855827fbaa2bf4731ca8def /libavformat/utils.c | |
parent | 8d88402013acf73e2a0e70c6a36df793742fd4f5 (diff) | |
download | ffmpeg-f9c399c4fd85ac140ea3b81d0eeb649df29ade3d.tar.gz |
Make parse_key_value from httpauth a common lavf internal function
Originally committed as revision 24832 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat/utils.c')
-rw-r--r-- | libavformat/utils.c | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/libavformat/utils.c b/libavformat/utils.c index 3fe5eaf635..117179715c 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -3707,3 +3707,57 @@ int ff_write_chained(AVFormatContext *dst, int dst_stream, AVPacket *pkt, return av_write_frame(dst, &local_pkt); } +void ff_parse_key_value(const char *str, ff_parse_key_val_cb callback_get_buf, + void *context) +{ + const char *ptr = str; + + /* Parse key=value pairs. */ + for (;;) { + const char *key; + char *dest = NULL, *dest_end; + int key_len, dest_len = 0; + + /* Skip whitespace and potential commas. */ + while (*ptr && (isspace(*ptr) || *ptr == ',')) + ptr++; + if (!*ptr) + break; + + key = ptr; + + if (!(ptr = strchr(key, '='))) + break; + ptr++; + key_len = ptr - key; + + callback_get_buf(context, key, key_len, &dest, &dest_len); + dest_end = dest + dest_len - 1; + + if (*ptr == '\"') { + ptr++; + while (*ptr && *ptr != '\"') { + if (*ptr == '\\') { + if (!ptr[1]) + break; + if (dest && dest < dest_end) + *dest++ = ptr[1]; + ptr += 2; + } else { + if (dest && dest < dest_end) + *dest++ = *ptr; + ptr++; + } + } + if (*ptr == '\"') + ptr++; + } else { + for (; *ptr && !(isspace(*ptr) || *ptr == ','); ptr++) + if (dest && dest < dest_end) + *dest++ = *ptr; + } + if (dest) + *dest = 0; + } +} + |