|
|
BSD 4.3
#include "../h/rt.h"
/*
* repl(s,n) - concatenate n copies of string s.
*/
Xrepl(nargs, arg2, arg1, arg0)
int nargs;
struct descrip arg2, arg1, arg0;
{
register int cnt;
register char *sloc;
long l1;
char sbuf[MAXSTRING];
extern char *alcstr();
/*
* Make sure that s is a string.
*/
if (cvstr(&arg1, sbuf) == NULL)
runerr(103, &arg1);
/*
* Make sure that n is a (non-long) integer.
*/
switch (cvint(&arg2, &l1)) {
case T_INTEGER:
if ((cnt = (int)l1) >= 0)
break;
#ifdef LONGS
case T_LONGINT:
#endif LONGS
runerr(205, &arg2);
default:
runerr(101, &arg2);
}
/*
* Be sure that resulting string won't be too long. (This is bogus
* on the VAX as MAXSHORT is 32k.)
*/
if ((l1 * STRLEN(arg1)) > MAXSHORT)
runerr(302, NULL);
/*
* Return a empty string if n == 0.
*/
if (cnt == 0) {
arg0.type = D_NULL;
INTVAL(arg0) = 1;
}
else {
/*
* Ensure enough space for the replicated string and allocate a copy
* of s. Then allocate and copy s n-1 times.
*/
sneed(cnt * STRLEN(arg1));
sloc = alcstr(STRLOC(arg1), STRLEN(arg1));
cnt--;
while (cnt--)
alcstr(STRLOC(arg1), STRLEN(arg1));
/*
* Make arg0 a descriptor for the replicated string.
*/
STRLEN(arg0) = (int)l1 * STRLEN(arg1);
STRLOC(arg0) = sloc;
}
}
Procblock(repl,2)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.