Mercurial > libavformat.hg
diff utils.c @ 6389:054de75e4a49 libavformat
Make parse_key_value from httpauth a common lavf internal function
author | mstorsjo |
---|---|
date | Thu, 19 Aug 2010 14:49:53 +0000 |
parents | 4974b3d4992b |
children | 515e6aad6a82 |
line wrap: on
line diff
--- a/utils.c Wed Aug 18 20:37:32 2010 +0000 +++ b/utils.c Thu Aug 19 14:49:53 2010 +0000 @@ -3707,3 +3707,57 @@ 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; + } +} +