diff options
author | ZyX <kp-pav@yandex.ru> | 2015-08-02 09:35:37 +0300 |
---|---|---|
committer | ZyX <kp-pav@yandex.ru> | 2015-10-23 14:54:09 +0300 |
commit | 8e2c0fdba5cf8d7c0fe00ddda1ebe702e405d918 (patch) | |
tree | aeb9489d7aacef005e2b17e7fbc2595aaa0d00b8 | |
parent | ab2944f46cbe53d66ae7edf7b21eaf9bec4e7b22 (diff) | |
download | rneovim-8e2c0fdba5cf8d7c0fe00ddda1ebe702e405d918.tar.gz rneovim-8e2c0fdba5cf8d7c0fe00ddda1ebe702e405d918.tar.bz2 rneovim-8e2c0fdba5cf8d7c0fe00ddda1ebe702e405d918.zip |
option: Append with escaped commas
-rw-r--r-- | src/nvim/option.c | 46 |
1 files changed, 38 insertions, 8 deletions
diff --git a/src/nvim/option.c b/src/nvim/option.c index ae1c083f00..97dc88833c 100644 --- a/src/nvim/option.c +++ b/src/nvim/option.c @@ -301,6 +301,33 @@ static char *(p_cot_values[]) = {"menu", "menuone", "longest", "preview", # include "option.c.generated.h" #endif +/// Count commas in the given string +static size_t count_commas(const char *const s, size_t len) + FUNC_ATTR_NONNULL_ALL FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT +{ + size_t ret = 0; + for (size_t i = 0; i < len; i++) { + if (s[i] == ',') { + ret++; + } + } + return ret; +} + +/// Append string with escaped commas +static char *strcpy_comma_escaped(char *dest, const char *src, const size_t len) + FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT +{ + size_t shift = 0; + for (size_t i = 0; i < len; i++) { + if (src[i] == ',') { + dest[i + shift++] = '\\'; + } + dest[i + shift] = src[i]; + } + return &dest[len + shift]; +} + /// Set &runtimepath to default value static void set_runtimepath_default(void) { @@ -318,15 +345,17 @@ static void set_runtimepath_default(void) size_t vimruntime_len; if (data_home != NULL) { data_len = strlen(data_home); - rtp_size += ((data_len + NVIM_SIZE + SITE_SIZE) * 2 + AFTER_SIZE) + 2; + rtp_size += ((data_len + count_commas(data_home, data_len) + + NVIM_SIZE + SITE_SIZE) * 2 + AFTER_SIZE) + 2; } if (config_home != NULL) { config_len = strlen(config_home); - rtp_size += ((config_len + NVIM_SIZE) * 2 + AFTER_SIZE) + 2; + rtp_size += ((config_len + count_commas(config_home, config_len) + + NVIM_SIZE) * 2 + AFTER_SIZE) + 2; } if (vimruntime != NULL) { vimruntime_len = strlen(vimruntime); - rtp_size += vimruntime_len + 1; + rtp_size += vimruntime_len + count_commas(vimruntime, vimruntime_len) + 1; } #define COMPUTE_COLON_LEN(rtp_size, additional_size, val) \ do { \ @@ -337,7 +366,8 @@ static void set_runtimepath_default(void) const char *dir; \ iter = vim_colon_env_iter(val, iter, &dir, &dir_len); \ if (dir != NULL && dir_len > 0) { \ - rtp_size += ((dir_len + NVIM_SIZE + additional_size) * 2 \ + rtp_size += ((dir_len + count_commas(dir, dir_len) \ + + NVIM_SIZE + additional_size) * 2 \ + AFTER_SIZE) + 2; \ } \ } while (iter != NULL); \ @@ -354,9 +384,9 @@ static void set_runtimepath_default(void) char *const rtp = xmallocz(rtp_size); char *rtp_cur = rtp; #define ADD_STRING(tgt, src, len) \ - do { memmove(tgt, src, len); tgt += len; } while (0) -#define ADD_STATIC_STRING(tgt, str) \ - ADD_STRING(tgt, str, sizeof(str) - 1) + tgt = strcpy_comma_escaped(tgt, src, len) +#define ADD_STATIC_STRING(tgt, src) \ + do { memmove(tgt, src, sizeof(src) - 1); tgt += sizeof(src) - 1; } while (0) #define ADD_COLON_DIRS(tgt, val, suffix, revsuffix) \ do { \ if (val != NULL) { \ @@ -397,7 +427,7 @@ static void set_runtimepath_default(void) ADD_STATIC_STRING(rtp_cur, "/nvim/after"); } else { // Strip trailing comma. - rtp[rtp_size - 1] = NUL; + rtp[rtp_size] = NUL; } #undef ADD_COLON_DIRS #undef ADD_STATIC_STRING |