diff options
Diffstat (limited to 'src/third_party/wiredtiger/src/config/config_concat.c')
-rw-r--r-- | src/third_party/wiredtiger/src/config/config_concat.c | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/src/third_party/wiredtiger/src/config/config_concat.c b/src/third_party/wiredtiger/src/config/config_concat.c new file mode 100644 index 00000000000..99475ef6f47 --- /dev/null +++ b/src/third_party/wiredtiger/src/config/config_concat.c @@ -0,0 +1,71 @@ +/*- + * Copyright (c) 2008-2014 WiredTiger, Inc. + * All rights reserved. + * + * See the file LICENSE for redistribution information. + */ + +#include "wt_internal.h" + +/* + * __wt_config_concat -- + * Given a NULL-terminated list of configuration strings, concatenate them + * into newly allocated memory. Nothing special is assumed about any of + * the config strings, they are simply combined in order. + * + * This code deals with the case where some of the config strings are + * wrapped in brackets but others aren't: the resulting string does not + * have brackets. + */ +int +__wt_config_concat( + WT_SESSION_IMPL *session, const char **cfg, const char **config_ret) +{ + WT_CONFIG cparser; + WT_CONFIG_ITEM k, v; + WT_DECL_ITEM(tmp); + WT_DECL_RET; + const char **cp; + + WT_RET(__wt_scr_alloc(session, 0, &tmp)); + + for (cp = cfg; *cp != NULL; ++cp) { + WT_ERR(__wt_config_init(session, &cparser, *cp)); + while ((ret = __wt_config_next(&cparser, &k, &v)) == 0) { + if (k.type != WT_CONFIG_ITEM_STRING && + k.type != WT_CONFIG_ITEM_ID) + WT_ERR_MSG(session, EINVAL, + "Invalid configuration key found: '%s'\n", + k.str); + /* Include the quotes around string keys/values. */ + if (k.type == WT_CONFIG_ITEM_STRING) { + --k.str; + k.len += 2; + } + if (v.type == WT_CONFIG_ITEM_STRING) { + --v.str; + v.len += 2; + } + WT_ERR(__wt_buf_catfmt(session, tmp, "%.*s%s%.*s,", + (int)k.len, k.str, + (v.len > 0) ? "=" : "", + (int)v.len, v.str)); + } + if (ret != WT_NOTFOUND) + goto err; + } + + /* + * If the caller passes us no valid configuration strings, we get here + * with no bytes to copy -- that's OK, the underlying string copy can + * handle empty strings. + * + * Strip any trailing comma. + */ + if (tmp->size != 0) + --tmp->size; + ret = __wt_strndup(session, tmp->data, tmp->size, config_ret); + +err: __wt_scr_free(&tmp); + return (ret); +} |