|
|
BSD 4.3
#include "../h/rt.h"
/*
* right(s1,n,s2) - pad s1 on left with s2 to length n.
*/
Xright(nargs, arg3, arg2, arg1, arg0)
int nargs;
struct descrip arg3, arg2, arg1, arg0;
{
register char *s, *st;
int cnt, slen;
char *sbuf, *s3, sbuf1[MAXSTRING], sbuf2[MAXSTRING];
extern char *alcstr();
/*
* s1 must be a string. n must be a non-negative integer and defaults
* to 1. s2 must be a string and defaults to a blank.
*/
if (cvstr(&arg1, sbuf1) == NULL)
runerr(103, &arg1);
defshort(&arg2, 1);
if ((cnt = INTVAL(arg2)) < 0)
runerr(205, &arg2);
defstr(&arg3, sbuf2, &blank);
sneed(cnt);
if (STRLEN(arg3) == 0) {
/*
* The padding string is null, make it a blank.
*/
slen = 1;
s3 = " ";
}
else {
slen = STRLEN(arg3);
s3 = STRLOC(arg3);
}
/*
* Get n bytes of string space. Start at the left end of the new
* string and copy s2 into the new string as many times as it fits.
*/
sbuf = alcstr(NULL, cnt);
s = sbuf;
while (s < sbuf + cnt) {
st = s3;
while (st < s3 + slen && s < sbuf + cnt)
*s++ = *st++;
}
/*
* Copy s1 into the new string, starting at the right end and copying
* s2 from right to left. If *s1 > n, only copy n bytes.
*/
s = sbuf + cnt;
slen = STRLEN(arg1);
st = STRLOC(arg1) + slen;
if (slen > cnt)
slen = cnt;
while (slen-- > 0)
*--s = *--st;
/*
* Return the new string.
*/
STRLEN(arg0) = cnt;
STRLOC(arg0) = sbuf;
}
Procblock(right,3)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.