| 1 | /* |
| 2 | * Copyright (c) 1987 Regents of the University of California. |
| 3 | * All rights reserved. |
| 4 | * |
| 5 | * Redistribution and use in source and binary forms are permitted |
| 6 | * provided that the above copyright notice and this paragraph are |
| 7 | * duplicated in all such forms and that any documentation, |
| 8 | * advertising materials, and other materials related to such |
| 9 | * distribution and use acknowledge that the software was developed |
| 10 | * by the University of California, Berkeley. The name of the |
| 11 | * University may not be used to endorse or promote products derived |
| 12 | * from this software without specific prior written permission. |
| 13 | * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR |
| 14 | * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED |
| 15 | * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. |
| 16 | */ |
| 17 | |
| 18 | #ifndef lint |
| 19 | static char sccsid[] = "@(#)addbytes.c 5.3 (Berkeley) %G%"; |
| 20 | #endif /* not lint */ |
| 21 | |
| 22 | # include "curses.ext" |
| 23 | |
| 24 | /* |
| 25 | * This routine adds the character to the current position |
| 26 | * |
| 27 | */ |
| 28 | waddbytes(win, bytes, count) |
| 29 | reg WINDOW *win; |
| 30 | reg char *bytes; |
| 31 | reg int count; |
| 32 | { |
| 33 | #define SYNCH_OUT() {win->_cury = y; win->_curx = x;} |
| 34 | #define SYNCH_IN() {y = win->_cury; x = win->_curx;} |
| 35 | reg int x, y; |
| 36 | reg int newx; |
| 37 | |
| 38 | SYNCH_IN(); |
| 39 | # ifdef FULLDEBUG |
| 40 | fprintf(outf, "ADDBYTES('%c') at (%d, %d)\n", c, y, x); |
| 41 | # endif |
| 42 | while (count--) { |
| 43 | register int c; |
| 44 | static char blanks[] = " "; |
| 45 | |
| 46 | c = *bytes++; |
| 47 | switch (c) { |
| 48 | case '\t': |
| 49 | SYNCH_IN(); |
| 50 | if (waddbytes(win, blanks, 8-(x%8)) == ERR) { |
| 51 | return ERR; |
| 52 | } |
| 53 | SYNCH_OUT(); |
| 54 | break; |
| 55 | |
| 56 | default: |
| 57 | # ifdef FULLDEBUG |
| 58 | fprintf(outf, "ADDBYTES: 1: y = %d, x = %d, firstch = %d, lastch = %d\n", y, x, win->_firstch[y], win->_lastch[y]); |
| 59 | # endif |
| 60 | if (win->_flags & _STANDOUT) |
| 61 | c |= _STANDOUT; |
| 62 | { |
| 63 | # ifdef FULLDEBUG |
| 64 | fprintf(outf, "ADDBYTES(%0.2o, %d, %d)\n", win, y, x); |
| 65 | # endif |
| 66 | if (win->_y[y][x] != c) { |
| 67 | newx = x + win->_ch_off; |
| 68 | if (win->_firstch[y] == _NOCHANGE) { |
| 69 | win->_firstch[y] = |
| 70 | win->_lastch[y] = newx; |
| 71 | } else if (newx < win->_firstch[y]) |
| 72 | win->_firstch[y] = newx; |
| 73 | else if (newx > win->_lastch[y]) |
| 74 | win->_lastch[y] = newx; |
| 75 | # ifdef FULLDEBUG |
| 76 | fprintf(outf, "ADDBYTES: change gives f/l: %d/%d [%d/%d]\n", |
| 77 | win->_firstch[y], win->_lastch[y], |
| 78 | win->_firstch[y] - win->_ch_off, |
| 79 | win->_lastch[y] - win->_ch_off); |
| 80 | # endif |
| 81 | } |
| 82 | } |
| 83 | win->_y[y][x++] = c; |
| 84 | if (x >= win->_maxx) { |
| 85 | x = 0; |
| 86 | newline: |
| 87 | if (++y >= win->_maxy) |
| 88 | if (win->_scroll) { |
| 89 | SYNCH_OUT(); |
| 90 | scroll(win); |
| 91 | SYNCH_IN(); |
| 92 | --y; |
| 93 | } |
| 94 | else |
| 95 | return ERR; |
| 96 | } |
| 97 | # ifdef FULLDEBUG |
| 98 | fprintf(outf, "ADDBYTES: 2: y = %d, x = %d, firstch = %d, lastch = %d\n", y, x, win->_firstch[y], win->_lastch[y]); |
| 99 | # endif |
| 100 | break; |
| 101 | case '\n': |
| 102 | SYNCH_OUT(); |
| 103 | wclrtoeol(win); |
| 104 | SYNCH_IN(); |
| 105 | if (!NONL) |
| 106 | x = 0; |
| 107 | goto newline; |
| 108 | case '\r': |
| 109 | x = 0; |
| 110 | break; |
| 111 | case '\b': |
| 112 | if (--x < 0) |
| 113 | x = 0; |
| 114 | break; |
| 115 | } |
| 116 | } |
| 117 | SYNCH_OUT(); |
| 118 | return OK; |
| 119 | } |