|
|
1.1 ! root 1: /* @(#)_shove.c 1.1 (1.22) */ ! 2: #include "curses.ext" ! 3: ! 4: /* ! 5: * Shove right in body as much as necessary. ! 6: * Note that we give the space the same attributes as the upcoming ! 7: * character, to force the cookie to be placed on the space. ! 8: */ ! 9: /* ARGSUSED */ ! 10: _shove(body, len, lno) ! 11: register chtype *body; ! 12: register int len, lno; ! 13: { ! 14: register int j, k, prev = 0; ! 15: register int curscol = SP->virt_x, cursincr = 0, shoved = 0; ! 16: static chtype buf[256]; ! 17: ! 18: #ifdef DEBUG ! 19: if(outf) fprintf(outf, "_shove('"); ! 20: _prstr(body, len); ! 21: if(outf) fprintf(outf, "', %d, %d), SP->virt_x %d\n", len, lno, SP->virt_x); ! 22: #endif ! 23: for (j=0, k=0; j<len; ) { ! 24: if ((body[j]&A_ATTRIBUTES) != prev) { ! 25: shoved++; ! 26: if ((body[j]&A_CHARTEXT) == ' ') { ! 27: /* Using an existing space */ ! 28: buf[j] = ' ' | body[j+1]&A_ATTRIBUTES; ! 29: } else if ((body[j-1]&A_CHARTEXT) == ' ') { ! 30: /* Using previous existing space */ ! 31: buf[j-1] = ' ' | body[j]&A_ATTRIBUTES; ! 32: } else { ! 33: /* A space is inserted here. */ ! 34: buf[k++] = ' ' | body[j]&A_ATTRIBUTES; ! 35: if (j < curscol) ! 36: cursincr++; ! 37: } ! 38: } ! 39: #ifdef DEBUG ! 40: if(outf) fprintf(outf, "j %d, k %d, prev %o, new %o\n", ! 41: j, k, prev, body[j] & A_ATTRIBUTES); ! 42: #endif ! 43: prev = body[j] & A_ATTRIBUTES; ! 44: buf[k++] = body[j++]; ! 45: } ! 46: if (shoved) { ! 47: /* k is 1 more than the last column of the line */ ! 48: if (k > columns) ! 49: k = columns; ! 50: if (buf[k-1]&A_ATTRIBUTES) { ! 51: if (k < columns) ! 52: k++; ! 53: buf[k-1] = ' '; /* All attributes off */ ! 54: } ! 55: for (j=0; j<k; j++) ! 56: body[j] = buf[j]; ! 57: len = k; ! 58: } ! 59: if (cursincr && lno == SP->virt_y+1) ! 60: SP->virt_x += cursincr; ! 61: #ifdef DEBUG ! 62: if(outf) fprintf(outf, "returns '"); ! 63: _prstr(body, len); ! 64: if(outf) fprintf(outf, "', len %d, SP->virt_x %d\n", len, SP->virt_x); ! 65: #endif ! 66: return len; ! 67: } ! 68: ! 69: #ifdef DEBUG ! 70: static ! 71: _prstr(result, len) ! 72: chtype *result; ! 73: int len; ! 74: { ! 75: register chtype *cp; ! 76: ! 77: for (cp=result; *cp && cp < result+len; cp++) ! 78: if (*cp >= ' ' && *cp <= '~') { ! 79: if(outf) fprintf(outf, "%c", *cp); ! 80: } else { ! 81: if(outf) fprintf(outf, "<%o,%c>", ! 82: *cp&A_ATTRIBUTES, *cp&A_CHARTEXT); ! 83: } ! 84: } ! 85: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.