/*
* allocate space for and set up defaults for a new window
*
- * %G% (Berkeley) @(#)newwin.c 1.6
+ * @(#)newwin.c 1.7 (Berkeley) %G%
*/
# include "curses.ext"
-short *calloc();
-WINDOW *malloc();
+char *malloc();
+
+# define SMALLOC (short *) malloc
static WINDOW *makenew();
reg WINDOW *win;
reg char *sp;
reg int i, by, bx, nl, nc;
+ reg int j;
by = begy;
bx = begx;
nc = COLS - bx;
if ((win = makenew(nl, nc, by, bx)) == NULL)
return ERR;
+ if ((win->_firstch = SMALLOC(nl * sizeof win->_firstch[0])) == NULL) {
+ free(win->_y);
+ free(win);
+ return NULL;
+ }
+ if ((win->_lastch = SMALLOC(nl * sizeof win->_lastch[0])) == NULL) {
+ free(win->_y);
+ free(win->_firstch);
+ free(win);
+ return NULL;
+ }
+ win->_nextp = win;
+ for (i = 0; i < nl; i++) {
+ win->_firstch[i] = _NOCHANGE;
+ win->_lastch[i] = _NOCHANGE;
+ }
for (i = 0; i < nl; i++)
- if ((win->_y[i] = (char *) calloc(nc, sizeof (char))) == NULL) {
- reg int j;
-
+ if ((win->_y[i] = malloc(nc * sizeof win->_y[0])) == NULL) {
for (j = 0; j < i; j++)
- cfree(win->_y[j]);
- cfree(win->_firstch);
- cfree(win->_lastch);
- cfree(win->_y);
- cfree(win);
+ free(win->_y[j]);
+ free(win->_firstch);
+ free(win->_lastch);
+ free(win->_y);
+ free(win);
return ERR;
}
else
for (sp = win->_y[i]; sp < win->_y[i] + nc; )
*sp++ = ' ';
- win->_nextp = win;
+ win->_ch_off = 0;
+# ifdef DEBUG
+ fprintf(outf, "NEWWIN: win->_ch_off = %d\n", win->_ch_off);
+# endif
return win;
}
WINDOW *
subwin(orig, num_lines, num_cols, begy, begx)
reg WINDOW *orig;
-int num_lines, num_cols, begy, begx; {
-
+int num_lines, num_cols, begy, begx;
+{
reg int i;
reg WINDOW *win;
reg int by, bx, nl, nc;
- reg int j, k;
by = begy;
bx = begx;
# endif
if (by < orig->_begy || bx < orig->_begx
|| by + nl > orig->_maxy + orig->_begy
- || bx + nc > orig->_maxx + orig->_begx) {
-# ifdef DEBUG
- fprintf(stderr, "returning ERR (1)\n");
- fprintf(stderr, "SUBWIN(begx = %d, begy = %d,maxx = %d, maxy = %d, nl = %d, nc = %d, by = %d, bx = %d)\n", orig->_begx,orig->_begy,orig->_maxx,orig->_maxy, nl, nc, by, bx);
-# endif
+ || bx + nc > orig->_maxx + orig->_begx)
return ERR;
- }
if (nl == 0)
nl = orig->_maxy + orig->_begy - by;
if (nc == 0)
nc = orig->_maxx + orig->_begx - bx;
- if ((win = makenew(nl, nc, by, bx)) == NULL) {
- fprintf(stderr, "returning ERR (2)\n");
+ if ((win = makenew(nl, nc, by, bx)) == NULL)
return ERR;
- }
- j = by - orig->_begy;
- k = bx - orig->_begx;
- for (i = 0; i < nl; i++)
- win->_y[i] = &orig->_y[j++][k];
win->_nextp = orig->_nextp;
orig->_nextp = win;
win->_orig = orig;
+ _set_subwin_(orig, win);
return win;
}
+/*
+ * this code is shared with mvwin()
+ */
+_set_subwin_(orig, win)
+register WINDOW *orig, *win;
+{
+ register int i, j, k;
+
+ j = win->_begy - orig->_begy;
+ k = win->_begx - orig->_begx;
+ win->_ch_off = k;
+# ifdef DEBUG
+ fprintf(outf, "_SET_SUBWIN_: win->_ch_off = %d\n", win->_ch_off);
+# endif
+ win->_firstch = &orig->_firstch[j];
+ win->_lastch = &orig->_lastch[j];
+ for (i = 0; i < win->_maxy; i++, j++)
+ win->_y[i] = &orig->_y[j][k];
+
+}
+
/*
* This routine sets up a window buffer and returns a pointer to it.
*/
# ifdef DEBUG
fprintf(outf, "MAKENEW(%d, %d, %d, %d)\n", nl, nc, by, bx);
# endif
- if ((win = (WINDOW *) calloc(1, sizeof (WINDOW))) == NULL)
+ if ((win = (WINDOW *) malloc(sizeof *win)) == NULL)
return NULL;
# ifdef DEBUG
fprintf(outf, "MAKENEW: nl = %d\n", nl);
# endif
- if ((win->_y = (char **) calloc(nl, sizeof (char *))) == NULL) {
- cfree(win);
- return NULL;
- }
- if ((win->_firstch = calloc(nl, sizeof (short))) == NULL) {
- cfree(win);
- cfree(win->_y);
- return NULL;
- }
- if ((win->_lastch = calloc(nl, sizeof (short))) == NULL) {
- cfree(win);
- cfree(win->_y);
- cfree(win->_firstch);
+ if ((win->_y = (char **) malloc(nl * sizeof win->_y[0])) == NULL) {
+ free(win);
return NULL;
}
# ifdef DEBUG
fprintf(outf, "MAKENEW: nc = %d\n", nc);
# endif
win->_cury = win->_curx = 0;
- win->_clear = (nl == LINES && nc == COLS);
+ win->_clear = FALSE;
win->_maxy = nl;
win->_maxx = nc;
win->_begy = by;
win->_begx = bx;
win->_flags = 0;
win->_scroll = win->_leave = FALSE;
- for (i = 0; i < nl; i++)
- win->_firstch[i] = win->_lastch[i] = _NOCHANGE;
- if (bx + nc == COLS) {
- win->_flags |= _ENDLINE;
- if (bx == 0 && nl == LINES && by == 0)
- win->_flags |= _FULLWIN;
- if (by + nl == LINES)
- win->_flags |= _SCROLLWIN;
- }
+ _swflags_(win);
# ifdef DEBUG
fprintf(outf, "MAKENEW: win->_clear = %d\n", win->_clear);
fprintf(outf, "MAKENEW: win->_leave = %d\n", win->_leave);
# endif
return win;
}
+
+_swflags_(win)
+register WINDOW *win;
+{
+ win->_flags &= ~(_ENDLINE|_FULLLINE|_FULLWIN|_SCROLLWIN);
+ if (win->_begx + win->_maxx == COLS) {
+ win->_flags |= _ENDLINE;
+ if (win->_begx == 0) {
+ if (AL && DL)
+ win->_flags |= _FULLLINE;
+ if (win->_maxy == LINES && win->_begy == 0)
+ win->_flags |= _FULLWIN;
+ }
+ if (win->_begy + win->_maxy == LINES)
+ win->_flags |= _SCROLLWIN;
+ }
+}
/*
* This routine writes win1 on win2 non-destructively.
*
- * %G% (Berkeley) @(#)overlay.c 1.5
+ * @(#)overlay.c 1.6 (Berkeley) %G%
*/
overlay(win1, win2)
reg WINDOW *win1, *win2; {
# ifdef DEBUG
fprintf(outf, "OVERLAY(%0.2o, %0.2o);\n", win1, win2);
# endif
- starty = max(win1->_begy, win2->_begy) - win1->_begy;
- startx = max(win1->_begx, win2->_begx) - win1->_begx;
- endy = min(win1->_maxy, win2->_maxy) - win1->_begy - 1;
- endx = min(win1->_maxx, win2->_maxx) - win1->_begx - 1;
- for (y = starty; y <= endy; y++) {
- end = &win1->_y[y][endx];
- x = startx + win1->_begx;
- for (sp = &win1->_y[y][startx]; sp <= end; sp++) {
- if (!isspace(*sp))
- mvwaddch(win2, y + win1->_begy, x, *sp);
+ starty = max(win1->_begy, win2->_begy);
+ startx = max(win1->_begx, win2->_begx);
+ endy = min(win1->_maxy + win1->_begy, win2->_maxy + win2->_begx);
+ endx = min(win1->_maxx + win1->_begx, win2->_maxx + win2->_begx);
+# ifdef DEBUG
+ fprintf(outf, "OVERLAY:from (%d,%d) to (%d,%d)\n", starty, startx, endy, endx);
+# endif
+ if (starty >= endy || startx >= endx)
+ return;
+ x = endx - startx;
+ for (y = starty; y < endy; y++) {
+ bcopy(&win1->_y[y - win1->_begy][startx - win1->_begx],
+ &win2->_y[y - win2->_begy][startx - win2->_begx], x);
+ touchline(win2, y, startx - win2->_begx, endx - win2->_begx);
+ }
+ for (y = starty; y < endy; y++) {
+ end = &win1->_y[y - win1->_begy][endx - win1->_begx];
+ x = startx - win2->_begx;
+ for (sp = &win1->_y[y][startx - win1->_begx]; sp < end; sp++) {
+ if (!isspace(*sp)) {
+ waddch(win2, y - win2->_begy, x);
+ waddch(win2, *sp);
+ }
x++;
}
}
# include "curses.ext"
+# include <ctype.h>
# define min(a,b) (a < b ? a : b)
+# define max(a,b) (a > b ? a : b)
/*
* This routine writes win1 on win2 destructively.
*
- * %G% (Berkeley) @(#)overwrite.c 1.3
+ * @(#)overwrite.c 1.4 (Berkeley) %G%
*/
overwrite(win1, win2)
reg WINDOW *win1, *win2; {
- reg int x, y, minx, miny, startx, starty;
+ reg char *sp, *end;
+ reg int x, y, endy, endx, starty, startx;
# ifdef DEBUG
- fprintf(outf, "OVERWRITE(0%o, 0%o);\n", win1, win2);
+ fprintf(outf, "OVERWRITE(%0.2o, %0.2o);\n", win1, win2);
# endif
- miny = min(win1->_maxy, win2->_maxy);
- minx = min(win1->_maxx, win2->_maxx);
+ starty = max(win1->_begy, win2->_begy);
+ startx = max(win1->_begx, win2->_begx);
+ endy = min(win1->_maxy + win1->_begy, win2->_maxy + win2->_begx);
+ endx = min(win1->_maxx + win1->_begx, win2->_maxx + win2->_begx);
+ if (starty >= endy || startx >= endx)
+ return;
# ifdef DEBUG
- fprintf(outf, "OVERWRITE:\tminx = %d, miny = %d\n", minx, miny);
+ fprintf(outf, "OVERWRITE:from (%d,%d) to (%d,%d)\n", starty, startx, endy, endx);
# endif
- starty = win1->_begy - win2->_begy;
- startx = win1->_begx - win2->_begx;
- if (startx < 0)
- startx = 0;
- for (y = 0; y < miny; y++)
- if (wmove(win2, y + starty, startx) != ERR)
- for (x = 0; x < minx; x++)
- waddch(win2, win1->_y[y][x]);
+ x = endx - startx;
+ for (y = starty; y < endy; y++) {
+ bcopy(&win1->_y[y - win1->_begy][startx - win1->_begx],
+ &win2->_y[y - win2->_begy][startx - win2->_begx], x);
+ touchline(win2, y, startx - win2->_begx, endx - win2->_begx);
+ }
}