|
|
1.1 ! root 1: #include "../h/rt.h" ! 2: ! 3: /* ! 4: * left(s1,n,s2) - pad s1 on right with s2 to length n. ! 5: */ ! 6: ! 7: Xleft(nargs, arg3, arg2, arg1, arg0) ! 8: int nargs; ! 9: struct descrip arg3, arg2, arg1, arg0; ! 10: { ! 11: register char *s, *st; ! 12: int cnt, slen; ! 13: char *sbuf, *s3, sbuf1[MAXSTRING], sbuf2[MAXSTRING]; ! 14: extern char *alcstr(); ! 15: ! 16: /* ! 17: * s1 must be a string. n must be a non-negative integer and defaults ! 18: * to 1. s2 must be a string and defaults to a blank. ! 19: */ ! 20: if (cvstr(&arg1, sbuf1) == NULL) ! 21: runerr(103, &arg1); ! 22: defshort(&arg2, 1); ! 23: if ((cnt = INTVAL(arg2)) < 0) ! 24: runerr(205, &arg2); ! 25: defstr(&arg3, sbuf2, &blank); ! 26: ! 27: sneed(cnt); ! 28: if (STRLEN(arg3) == 0) { ! 29: /* ! 30: * The padding string is null, make it a blank. ! 31: */ ! 32: slen = 1; ! 33: s3 = " "; ! 34: } ! 35: else { ! 36: slen = STRLEN(arg3); ! 37: s3 = STRLOC(arg3); ! 38: } ! 39: ! 40: /* ! 41: * Get n bytes of string space. Start at the right end of the new ! 42: * string and copy s2 into the new string as many times as it fits. ! 43: * Note that s2 is copied from right to left. ! 44: */ ! 45: sbuf = alcstr(NULL, cnt); ! 46: s = sbuf + cnt; ! 47: while (s > sbuf) { ! 48: st = s3 + slen; ! 49: while (st > s3 && s > sbuf) ! 50: *--s = *--st; ! 51: } ! 52: ! 53: /* ! 54: * Copy s1 into the new string, starting at the left end. If *s1 > n, ! 55: * only copy n bytes. ! 56: */ ! 57: s = sbuf; ! 58: slen = STRLEN(arg1); ! 59: st = STRLOC(arg1); ! 60: if (slen > cnt) ! 61: slen = cnt; ! 62: while (slen-- > 0) ! 63: *s++ = *st++; ! 64: ! 65: /* ! 66: * Return the new string. ! 67: */ ! 68: STRLEN(arg0) = cnt; ! 69: STRLOC(arg0) = sbuf; ! 70: } ! 71: ! 72: Procblock(left,3)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.