summaryrefslogtreecommitdiff
path: root/do/join
diff options
context:
space:
mode:
Diffstat (limited to 'do/join')
-rw-r--r--do/join45
1 files changed, 45 insertions, 0 deletions
diff --git a/do/join b/do/join
new file mode 100644
index 0000000000..c5c5220099
--- /dev/null
+++ b/do/join
@@ -0,0 +1,45 @@
+void
+do_join(TARG,arglast)
+register STR *TARG;
+int *arglast;
+{
+ register STR **st = stack->ary_array;
+ int sp = arglast[1];
+ register int items = arglast[2] - sp;
+ register char *delim = str_get(st[sp]);
+ register STRLEN len;
+ int delimlen = st[sp]->str_cur;
+
+ st += sp + 1;
+
+ len = (items > 0 ? (delimlen * (items - 1) ) : 0);
+ if (TARG->str_len < len + items) { /* current length is way too short */
+ while (items-- > 0) {
+ if (*st)
+ len += (*st)->str_cur;
+ st++;
+ }
+ STR_GROW(TARG, len + 1); /* so try to pre-extend */
+
+ items = arglast[2] - sp;
+ st -= items;
+ }
+
+ if (items-- > 0)
+ str_sset(TARG, *st++);
+ else
+ str_set(TARG,"");
+ len = delimlen;
+ if (len) {
+ for (; items > 0; items--,st++) {
+ str_ncat(TARG,delim,len);
+ str_scat(TARG,*st);
+ }
+ }
+ else {
+ for (; items > 0; items--,st++)
+ str_scat(TARG,*st);
+ }
+ STABSET(TARG);
+}
+