diff options
author | zeertzjq <zeertzjq@outlook.com> | 2023-04-15 14:57:14 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-04-15 14:57:14 +0800 |
commit | 0a61cb60a633f05e3f05f8d5dae241910a92ee1f (patch) | |
tree | d5613c66fc42903a20d568e27f4f74a1fc20cba0 /src/nvim/eval.c | |
parent | 1ca77c222b00215657bae416eba5d280a1d9dc29 (diff) | |
parent | 9636ae6a13afaddc8e73e305e2bdf3fc5e42a492 (diff) | |
download | rneovim-0a61cb60a633f05e3f05f8d5dae241910a92ee1f.tar.gz rneovim-0a61cb60a633f05e3f05f8d5dae241910a92ee1f.tar.bz2 rneovim-0a61cb60a633f05e3f05f8d5dae241910a92ee1f.zip |
Merge pull request #23099 from zeertzjq/vim-8.2.1014
vim-patch:8.2.{1014,3329}
Diffstat (limited to 'src/nvim/eval.c')
-rw-r--r-- | src/nvim/eval.c | 43 |
1 files changed, 22 insertions, 21 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c index f555d973e4..bbe4fe055d 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -3896,26 +3896,26 @@ static int eval_string(char **arg, typval_T *rettv, int evaluate) // Copy the string into allocated memory, handling backslashed // characters. - const int len = (int)(p - *arg + extra); - char *name = xmalloc((size_t)len); rettv->v_type = VAR_STRING; - rettv->vval.v_string = name; + const int len = (int)(p - *arg + extra); + rettv->vval.v_string = xmalloc((size_t)len); + char *end = rettv->vval.v_string; for (p = *arg + 1; *p != NUL && *p != '"';) { if (*p == '\\') { switch (*++p) { case 'b': - *name++ = BS; ++p; break; + *end++ = BS; ++p; break; case 'e': - *name++ = ESC; ++p; break; + *end++ = ESC; ++p; break; case 'f': - *name++ = FF; ++p; break; + *end++ = FF; ++p; break; case 'n': - *name++ = NL; ++p; break; + *end++ = NL; ++p; break; case 'r': - *name++ = CAR; ++p; break; + *end++ = CAR; ++p; break; case 't': - *name++ = TAB; ++p; break; + *end++ = TAB; ++p; break; case 'X': // hex: "\x1", "\x12" case 'x': @@ -3941,9 +3941,9 @@ static int eval_string(char **arg, typval_T *rettv, int evaluate) // For "\u" store the number according to // 'encoding'. if (c != 'X') { - name += utf_char2bytes(nr, name); + end += utf_char2bytes(nr, end); } else { - *name++ = (char)nr; + *end++ = (char)nr; } } break; @@ -3957,14 +3957,14 @@ static int eval_string(char **arg, typval_T *rettv, int evaluate) case '5': case '6': case '7': - *name = (char)(*p++ - '0'); + *end = (char)(*p++ - '0'); if (*p >= '0' && *p <= '7') { - *name = (char)((*name << 3) + *p++ - '0'); + *end = (char)((*end << 3) + *p++ - '0'); if (*p >= '0' && *p <= '7') { - *name = (char)((*name << 3) + *p++ - '0'); + *end = (char)((*end << 3) + *p++ - '0'); } } - name++; + end++; break; // Special key, e.g.: "\<C-W>" @@ -3974,10 +3974,10 @@ static int eval_string(char **arg, typval_T *rettv, int evaluate) if (p[1] != '*') { flags |= FSK_SIMPLIFY; } - extra = trans_special((const char **)&p, strlen(p), name, flags, false, NULL); + extra = trans_special((const char **)&p, strlen(p), end, flags, false, NULL); if (extra != 0) { - name += extra; - if (name >= rettv->vval.v_string + len) { + end += extra; + if (end >= rettv->vval.v_string + len) { iemsg("eval_string() used more space than allocated"); } break; @@ -3986,14 +3986,14 @@ static int eval_string(char **arg, typval_T *rettv, int evaluate) FALLTHROUGH; default: - mb_copy_char((const char **)&p, &name); + mb_copy_char((const char **)&p, &end); break; } } else { - mb_copy_char((const char **)&p, &name); + mb_copy_char((const char **)&p, &end); } } - *name = NUL; + *end = NUL; if (*p != NUL) { // just in case p++; } @@ -4918,6 +4918,7 @@ static int eval_env_var(char **arg, typval_T *rettv, int evaluate) name[len] = (char)cc; rettv->v_type = VAR_STRING; rettv->vval.v_string = string; + rettv->v_lock = VAR_UNLOCKED; } return OK; |