aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/eval.c
diff options
context:
space:
mode:
authorckelsel <ckelsel@hotmail.com>2017-10-09 21:17:15 +0800
committerckelsel <ckelsel@hotmail.com>2017-10-09 21:17:15 +0800
commit2abd939daeb550e745ba3e6572fae24aff105ef9 (patch)
tree9850ffe239203a5b980ef16a41e2dd9669b0f2a1 /src/nvim/eval.c
parent5d369ad3843bbc0a3541827284f55430ec4f46e4 (diff)
parentceb40c0411843b35005f019bf2c61f22572afcdf (diff)
downloadrneovim-2abd939daeb550e745ba3e6572fae24aff105ef9.tar.gz
rneovim-2abd939daeb550e745ba3e6572fae24aff105ef9.tar.bz2
rneovim-2abd939daeb550e745ba3e6572fae24aff105ef9.zip
Merge branch 'master' of github.com:ckelsel/neovim into vim-8.0.0101
Diffstat (limited to 'src/nvim/eval.c')
-rw-r--r--src/nvim/eval.c43
1 files changed, 38 insertions, 5 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c
index 5ee91d417a..b2a0d9a767 100644
--- a/src/nvim/eval.c
+++ b/src/nvim/eval.c
@@ -6733,6 +6733,39 @@ static void prepare_assert_error(garray_T *gap)
}
}
+// Append "str" to "gap", escaping unprintable characters.
+// Changes NL to \n, CR to \r, etc.
+static void ga_concat_esc(garray_T *gap, char_u *str)
+{
+ char_u *p;
+ char_u buf[NUMBUFLEN];
+
+ if (str == NULL) {
+ ga_concat(gap, (char_u *)"NULL");
+ return;
+ }
+
+ for (p = str; *p != NUL; p++) {
+ switch (*p) {
+ case BS: ga_concat(gap, (char_u *)"\\b"); break;
+ case ESC: ga_concat(gap, (char_u *)"\\e"); break;
+ case FF: ga_concat(gap, (char_u *)"\\f"); break;
+ case NL: ga_concat(gap, (char_u *)"\\n"); break;
+ case TAB: ga_concat(gap, (char_u *)"\\t"); break;
+ case CAR: ga_concat(gap, (char_u *)"\\r"); break;
+ case '\\': ga_concat(gap, (char_u *)"\\\\"); break;
+ default:
+ if (*p < ' ') {
+ vim_snprintf((char *)buf, NUMBUFLEN, "\\x%02x", *p);
+ ga_concat(gap, buf);
+ } else {
+ ga_append(gap, *p);
+ }
+ break;
+ }
+ }
+}
+
// Fill "gap" with information about an assert error.
static void fill_assert_error(garray_T *gap, typval_T *opt_msg_tv,
char_u *exp_str, typval_T *exp_tv,
@@ -6753,11 +6786,11 @@ static void fill_assert_error(garray_T *gap, typval_T *opt_msg_tv,
ga_concat(gap, (char_u *)"Expected ");
}
if (exp_str == NULL) {
- tofree = (char_u *) encode_tv2string(exp_tv, NULL);
- ga_concat(gap, tofree);
+ tofree = (char_u *)encode_tv2string(exp_tv, NULL);
+ ga_concat_esc(gap, tofree);
xfree(tofree);
} else {
- ga_concat(gap, exp_str);
+ ga_concat_esc(gap, exp_str);
}
if (atype != ASSERT_NOTEQUAL) {
if (atype == ASSERT_MATCH) {
@@ -6768,7 +6801,7 @@ static void fill_assert_error(garray_T *gap, typval_T *opt_msg_tv,
ga_concat(gap, (char_u *)" but got ");
}
tofree = (char_u *)encode_tv2string(got_tv, NULL);
- ga_concat(gap, tofree);
+ ga_concat_esc(gap, tofree);
xfree(tofree);
}
}
@@ -17495,7 +17528,7 @@ static void f_winsaveview(typval_T *argvars, typval_T *rettv, FunPtr fptr)
tv_dict_add_nr(dict, S_LEN("skipcol"), (varnumber_T)curwin->w_skipcol);
}
-/// Writes list of strings to file
+/// Write "list" of strings to file "fd".
///
/// @param fp File to write to.
/// @param[in] list List to write.