|
|
1.1 ! root 1: #include "../h/rt.h" ! 2: ! 3: /* ! 4: * center(s1,n,s2) - pad s1 on left and right with s2 to length n. ! 5: */ ! 6: ! 7: Xcenter(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, hcnt; ! 13: char *sbuf, *s3; ! 14: char sbuf1[MAXSTRING], sbuf2[MAXSTRING]; ! 15: extern char *alcstr(); ! 16: ! 17: /* ! 18: * s1 must be a string. n must be a non-negative integer and defaults ! 19: * to 1. s2 must be a string and defaults to a blank. ! 20: */ ! 21: if (cvstr(&arg1, sbuf1) == NULL) ! 22: runerr(103, &arg1); ! 23: defshort(&arg2, 1); ! 24: if ((cnt = INTVAL(arg2)) < 0) ! 25: runerr(205, &arg2); ! 26: defstr(&arg3, sbuf2, &blank); ! 27: ! 28: sneed(cnt); ! 29: ! 30: if (STRLEN(arg3) == 0) { ! 31: /* ! 32: * The padding string is null, make it a blank. ! 33: */ ! 34: slen = 1; ! 35: s3 = " "; ! 36: } ! 37: else { ! 38: slen = STRLEN(arg3); ! 39: s3 = STRLOC(arg3); ! 40: } ! 41: ! 42: /* ! 43: * Get n bytes of string space for the new string. Start at the right ! 44: * of the new string and copy s2 into it from right to left as ! 45: * many times as will fit in the right half of the new string. ! 46: */ ! 47: sbuf = alcstr(NULL, cnt); ! 48: hcnt = cnt / 2; ! 49: s = sbuf + cnt; ! 50: while (s > sbuf + hcnt) { ! 51: st = s3 + slen; ! 52: while (st > s3 && s > sbuf + hcnt) ! 53: *--s = *--st; ! 54: } ! 55: ! 56: /* ! 57: * Start at the left end of the new string and copy s1 into it from ! 58: * left to right as many time as will fit in the left half of the ! 59: * new string. ! 60: */ ! 61: s = sbuf; ! 62: while (s < sbuf + hcnt) { ! 63: st = s3; ! 64: while (st < s3 + slen && s < sbuf + hcnt) ! 65: *s++ = *st++; ! 66: } ! 67: ! 68: slen = STRLEN(arg1); ! 69: if (cnt < slen) { ! 70: /* ! 71: * s1 is larger than the field to center it in. The source for the ! 72: * copy starts at the appropriate point in s1 and the destination ! 73: * starts at the left end of of the new string. ! 74: */ ! 75: s = sbuf; ! 76: st = STRLOC(arg1) + slen/2 - hcnt + (~cnt&slen&1); ! 77: } ! 78: else { ! 79: /* ! 80: * s1 is smaller than the field to center it in. The source for the ! 81: * copy starts at the left end of s1 and the destination starts at ! 82: * the appropriate point in the new string. ! 83: */ ! 84: s = sbuf + hcnt - slen/2 - (~cnt&slen&1); ! 85: st = STRLOC(arg1); ! 86: } ! 87: /* ! 88: * Perform the copy, moving min(*s1,n) bytes from st to s. ! 89: */ ! 90: if (slen > cnt) ! 91: slen = cnt; ! 92: while (slen-- > 0) ! 93: *s++ = *st++; ! 94: ! 95: /* ! 96: * Return the new string. ! 97: */ ! 98: STRLEN(arg0) = cnt; ! 99: STRLOC(arg0) = sbuf; ! 100: } ! 101: ! 102: Procblock(center,3)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.