perl 5.0 alpha 3
[p5sagit/p5-mst-13.2.git] / sv_append_till
1 char *
2 sv_append_till(sv,from,fromend,delim,keeplist)
3 register SV *sv;
4 register char *from;
5 register char *fromend;
6 register I32 delim;
7 char *keeplist;
8 {
9     register char *to;
10     register STRLEN len;
11
12     if (SvREADONLY(sv))
13         fatal(no_modify);
14     if (!from)
15         return Nullch;
16     len = fromend - from;
17     if (!SvUPGRADE(sv, SVt_PV))
18         return 0;
19     SvGROW(sv, SvCUR(sv) + len + 1);
20     SvPOK_only(sv);             /* validate pointer */
21     to = SvPV(sv)+SvCUR(sv);
22     for (; from < fromend; from++,to++) {
23         if (*from == '\\' && from+1 < fromend && delim != '\\') {
24             if (!keeplist)
25                 *to++ = *from++;
26             else if (from[1] && index(keeplist,from[1]))
27                 *to++ = *from++;
28             else
29                 from++;
30         }
31         else if (*from == delim)
32             break;
33         *to = *from;
34     }
35     *to = '\0';
36     SvCUR_set(sv, to - SvPV(sv));
37     return from;
38 }
39