131681Sminshall /* 263266Sbostic * Copyright (c) 1987, 1993 363266Sbostic * The Regents of the University of California. All rights reserved. 434677Sbostic * 542651Sbostic * %sccs.include.redist.c% 631681Sminshall */ 731681Sminshall 831681Sminshall #ifndef lint 9*66392Sbostic static char sccsid[] = "@(#)addbytes.c 8.3 (Berkeley) 03/19/94"; 1055944Sbostic #endif /* not lint */ 1131681Sminshall 1255944Sbostic #include <curses.h> 1331681Sminshall 1456238Selan #define SYNCH_IN {y = win->cury; x = win->curx;} 1556238Selan #define SYNCH_OUT {win->cury = y; win->curx = x;} 1655944Sbostic 1731681Sminshall /* 1855944Sbostic * waddbytes -- 1955944Sbostic * Add the character to the current position in the given window. 2031681Sminshall */ 2155983Sbostic int 2256596Selan __waddbytes(win, bytes, count, so) 2355944Sbostic register WINDOW *win; 2457942Sbostic register const char *bytes; 2555944Sbostic register int count; 2656596Selan int so; 2731681Sminshall { 2855944Sbostic static char blanks[] = " "; 2955944Sbostic register int c, newx, x, y; 3056596Selan char stand; 3156647Selan __LINE *lp; 3231681Sminshall 3355944Sbostic SYNCH_IN; 3456073Selan 3555944Sbostic #ifdef DEBUG 3660058Sbostic __CTRACE("ADDBYTES('%c') at (%d, %d)\n", c, y, x); 3755944Sbostic #endif 3831681Sminshall while (count--) { 3955944Sbostic c = *bytes++; 4055944Sbostic switch (c) { 4155944Sbostic case '\t': 4255945Sbostic SYNCH_OUT; 4357472Sbostic if (waddbytes(win, blanks, 8 - (x % 8)) == ERR) 4457472Sbostic return (ERR); 4555945Sbostic SYNCH_IN; 4655944Sbostic break; 4731681Sminshall 4855944Sbostic default: 4955944Sbostic #ifdef DEBUG 5060058Sbostic __CTRACE("ADDBYTES(%0.2o, %d, %d)\n", win, y, x); 5155944Sbostic #endif 5256301Selan 5356238Selan lp = win->lines[y]; 5456301Selan if (lp->flags & __ISPASTEOL) { 5556301Selan lp->flags &= ~__ISPASTEOL; 5656301Selan newline: if (y == win->maxy - 1) { 5756301Selan if (win->flags & __SCROLLOK) { 5856301Selan SYNCH_OUT; 5956301Selan scroll(win); 6056301Selan SYNCH_IN; 6156301Selan lp = win->lines[y]; 6256596Selan x = 0; 63*66392Sbostic } else 64*66392Sbostic return (ERR); 6556301Selan } else { 6656301Selan y++; 6756301Selan lp = win->lines[y]; 6856301Selan x = 0; 6956301Selan } 7057961Storek if (c == '\n') 7157961Storek break; 7256301Selan } 7356301Selan 7456596Selan stand = '\0'; 7556596Selan if (win->flags & __WSTANDOUT || so) 7656596Selan stand |= __STANDOUT; 7756301Selan #ifdef DEBUG 7860058Sbostic __CTRACE("ADDBYTES: 1: y = %d, x = %d, firstch = %d, lastch = %d\n", 7956715Selan y, x, *win->lines[y]->firstchp, *win->lines[y]->lastchp); 8056301Selan #endif 8156647Selan if (lp->line[x].ch != c || 8256647Selan !(lp->line[x].attr & stand)) { 8356238Selan newx = x + win->ch_off; 8456238Selan if (!(lp->flags & __ISDIRTY)) { 8556238Selan lp->flags |= __ISDIRTY; 8656715Selan *lp->firstchp = *lp->lastchp = newx; 8756238Selan } 8856715Selan else if (newx < *lp->firstchp) 8956715Selan *lp->firstchp = newx; 9056715Selan else if (newx > *lp->lastchp) 9156715Selan *lp->lastchp = newx; 9255945Sbostic #ifdef DEBUG 9360058Sbostic __CTRACE("ADDBYTES: change gives f/l: %d/%d [%d/%d]\n", 9456715Selan *lp->firstchp, *lp->lastchp, 9556715Selan *lp->firstchp - win->ch_off, 9656715Selan *lp->lastchp - win->ch_off); 9755944Sbostic #endif 9855944Sbostic } 9956647Selan lp->line[x].ch = c; 10056596Selan if (stand) 10156647Selan lp->line[x].attr |= __STANDOUT; 10256596Selan else 10356647Selan lp->line[x].attr &= ~__STANDOUT; 10456301Selan if (x == win->maxx - 1) 10556301Selan lp->flags |= __ISPASTEOL; 10656301Selan else 10756301Selan x++; 10855944Sbostic #ifdef DEBUG 10960058Sbostic __CTRACE("ADDBYTES: 2: y = %d, x = %d, firstch = %d, lastch = %d\n", 11056715Selan y, x, *win->lines[y]->firstchp, *win->lines[y]->lastchp); 11155944Sbostic #endif 11255944Sbostic break; 11355944Sbostic case '\n': 11455944Sbostic SYNCH_OUT; 11555944Sbostic wclrtoeol(win); 11655944Sbostic SYNCH_IN; 11763265Sbostic if (!NONL) 11855944Sbostic x = 0; 11955944Sbostic goto newline; 12055944Sbostic case '\r': 12155944Sbostic x = 0; 12255944Sbostic break; 12355944Sbostic case '\b': 12455944Sbostic if (--x < 0) 12555944Sbostic x = 0; 12655944Sbostic break; 12755944Sbostic } 12855944Sbostic } 12955944Sbostic SYNCH_OUT; 13057472Sbostic return (OK); 13131681Sminshall } 132