diff options
author | wm4 <wm4@nowhere> | 2013-12-30 20:28:32 +0100 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2013-12-30 22:49:50 +0100 |
commit | 066ecfcbfb0b7120183338c5382e98c609a9d89a (patch) | |
tree | c03269c234b3b7edcc3bf19374134e341628dc42 /options/m_option.c | |
parent | 097fe8ea6fb25df68077c25c08f29fb57a9d2bd6 (diff) | |
download | mpv-066ecfcbfb0b7120183338c5382e98c609a9d89a.tar.bz2 mpv-066ecfcbfb0b7120183338c5382e98c609a9d89a.tar.xz |
common: simplify and optimize string escape parsing
This code is shared between input.conf parser and option parser. Until
now, the performance didn't really matter. But I want to use this code
for JSON parsing too, and since JSON will have to be parsed a lot, it
should probably try to avoid realloc'ing too much.
This commit moves parsing of C-style escaped strings into a common
function, and allows using it in a way realloc can be completely
avoided, if the already allocated buffer is large enough.
Diffstat (limited to 'options/m_option.c')
-rw-r--r-- | options/m_option.c | 19 |
1 files changed, 8 insertions, 11 deletions
diff --git a/options/m_option.c b/options/m_option.c index 9f98008c64..b6cfbdf0d0 100644 --- a/options/m_option.c +++ b/options/m_option.c @@ -746,20 +746,17 @@ const m_option_type_t m_option_type_float = { static char *unescape_string(void *talloc_ctx, bstr str) { - char *res = talloc_strdup(talloc_ctx, ""); + bstr dst = {0}; while (str.len) { - bstr rest; - bool esc = bstr_split_tok(str, "\\", &str, &rest); - res = talloc_strndup_append_buffer(res, str.start, str.len); - if (esc) { - if (!mp_parse_escape(&rest, &res)) { - talloc_free(res); - return NULL; - } + if (!mp_append_escaped_string(talloc_ctx, &dst, &str)) { + talloc_free(dst.start); + return NULL; } - str = rest; + if (!bstr_eatstart0(&str, "\"")) + break; + bstr_xappend(talloc_ctx, &dst, bstr0("\"")); } - return res; + return dst.start; } static char *escape_string(char *str0) |