summaryrefslogtreecommitdiffstats
path: root/src/ex_cmds2.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ex_cmds2.c')
-rw-r--r--src/ex_cmds2.c38
1 files changed, 24 insertions, 14 deletions
diff --git a/src/ex_cmds2.c b/src/ex_cmds2.c
index 4b2564bbd4..ddfe103b65 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;
}
}