c5c522009973f89395ef68b1ee44956da5711914
[perl.git] / do / join
1 void
2 do_join(TARG,arglast)
3 register STR *TARG;
4 int *arglast;
5 {
6     register STR **st = stack->ary_array;
7     int sp = arglast[1];
8     register int items = arglast[2] - sp;
9     register char *delim = str_get(st[sp]);
10     register STRLEN len;
11     int delimlen = st[sp]->str_cur;
12
13     st += sp + 1;
14
15     len = (items > 0 ? (delimlen * (items - 1) ) : 0);
16     if (TARG->str_len < len + items) {  /* current length is way too short */
17         while (items-- > 0) {
18             if (*st)
19                 len += (*st)->str_cur;
20             st++;
21         }
22         STR_GROW(TARG, len + 1);                /* so try to pre-extend */
23
24         items = arglast[2] - sp;
25         st -= items;
26     }
27
28     if (items-- > 0)
29         str_sset(TARG, *st++);
30     else
31         str_set(TARG,"");
32     len = delimlen;
33     if (len) {
34         for (; items > 0; items--,st++) {
35             str_ncat(TARG,delim,len);
36             str_scat(TARG,*st);
37         }
38     }
39     else {
40         for (; items > 0; items--,st++)
41             str_scat(TARG,*st);
42     }
43     STABSET(TARG);
44 }
45