diff options
author | Bram Moolenaar <Bram@vim.org> | 2012-02-05 23:10:30 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2012-02-05 23:10:30 +0100 |
commit | b3a6bbc7b6b1b4ff349300e41b8021f2265cb472 (patch) | |
tree | 788e283e7cfc98b29a54d0b5ee6f3c573f520d92 /src/ex_cmds2.c | |
parent | 8d462f966657d7bdedc470a10e20b1b635d64576 (diff) | |
download | vim-git-b3a6bbc7b6b1b4ff349300e41b8021f2265cb472.tar.gz |
updated for version 7.3.433v7.3.433
Problem: Using continued lines in a Vim script can be slow.
Solution: Instead of reallocating for every line use a growarray. (Yasuhiro
Matsumoto)
Diffstat (limited to 'src/ex_cmds2.c')
-rw-r--r-- | src/ex_cmds2.c | 38 |
1 files changed, 24 insertions, 14 deletions
diff --git a/src/ex_cmds2.c b/src/ex_cmds2.c index 4b2564bbd..ddfe103b6 100644 --- a/src/ex_cmds2.c +++ b/src/ex_cmds2.c @@ -3439,22 +3439,32 @@ getsourceline(c, cookie, indent) { /* compensate for the one line read-ahead */ --sourcing_lnum; - for (;;) + + /* Get the next line and concatenate it when it starts with a + * backslash. We always need to read the next line, keep it in + * sp->nextline. */ + sp->nextline = get_one_sourceline(sp); + if (sp->nextline != NULL && *(p = skipwhite(sp->nextline)) == '\\') { - sp->nextline = get_one_sourceline(sp); - if (sp->nextline == NULL) - break; - p = skipwhite(sp->nextline); - if (*p != '\\') - break; - s = alloc((unsigned)(STRLEN(line) + STRLEN(p))); - if (s == NULL) /* out of memory */ - break; - STRCPY(s, line); - STRCAT(s, p + 1); + garray_T ga; + + ga_init2(&ga, (int)sizeof(char_u), 200); + ga_concat(&ga, line); + ga_concat(&ga, p + 1); + for (;;) + { + vim_free(sp->nextline); + sp->nextline = get_one_sourceline(sp); + if (sp->nextline == NULL) + break; + p = skipwhite(sp->nextline); + if (*p != '\\') + break; + ga_concat(&ga, p + 1); + } + ga_append(&ga, NUL); vim_free(line); - line = s; - vim_free(sp->nextline); + line = ga.ga_data; } } |