Xref: utzoo comp.sources.bugs:678 comp.sys.ibm.pc:10747 Path: utzoo!utgpu!water!watmath!clyde!cbosgd!ihnp4!inuxc!iuvax!silver!creps From: creps@silver.bacs.indiana.edu (Steve Creps) Newsgroups: comp.sources.bugs,comp.sys.ibm.pc Subject: More on PC Curses bug Message-ID: <660@silver.bacs.indiana.edu> Date: 24 Jan 88 06:26:30 GMT Reply-To: creps@silver.UUCP (Steve Creps) Organization: Indiana University Computer Science Department Lines: 619 I went back and had some more trouble after changing the routine I mentioned in my last message. Then I realized that the PC Curses code itself was dependent on _maxy and _maxx being equal to the number of lines or columns in a window. That meant I had to go through all the code replacing these variables as appropriate. Thank goodness for fgrep! After recompiling the Curses library with these changes, the program I'm porting worked well. Patches follow my .signature. - - - - - - - - - Steve Creps on the VAX 8650 running Ultrix 2.0-1 at Indiana University. creps@silver.bacs.indiana.edu, ...iuvax!silver!creps, creps@iubacs.bitnet "F-14 Tomcat! There IS no substitute." *** old/boxes.c --- boxes.c ************** *** 36,42 int i; if (ymax == 0) ! ymax = win->_maxy; if (xmax == 0) xmax = win->_maxx; --- 36,42 ----- int i; if (ymax == 0) ! ymax = win->_maxy - 1; if (xmax == 0) xmax = win->_maxx - 1; ************** *** 38,44 if (ymax == 0) ymax = win->_maxy; if (xmax == 0) ! xmax = win->_maxx; if (ymin >= win->_maxy || ymax > win->_maxy || xmin >= win->_maxx || xmax > win->_maxx || --- 38,44 ----- if (ymax == 0) ymax = win->_maxy - 1; if (xmax == 0) ! xmax = win->_maxx - 1; if (ymin >= win->_maxy || ymax > win->_maxy || xmin >= win->_maxx || xmax > win->_maxx || *** old/charadd.c --- charadd.c ************** *** 51,57 int ts = win->_tabsize; ch &= 0xff; /* kill any sing-extend */ ! if (y > win->_maxy || x > win->_maxx || y < 0 || x < 0) return(ERR); switch (ch) { --- 51,57 ----- int ts = win->_tabsize; ch &= 0xff; /* kill any sing-extend */ ! if (y >= win->_maxy || x >= win->_maxx || y < 0 || x < 0) return(ERR); switch (ch) { ************** *** 95,101 win->_maxchng[y] = x; } /* if */ win->_line[y][x++] = ch; ! if (x > win->_maxx) /* wrap around test */ { x = 0; if ((y = newline(win, y)) < 0) --- 95,101 ----- win->_maxchng[y] = x; } /* if */ win->_line[y][x++] = ch; ! if (x >= win->_maxx) /* wrap around test */ { x = 0; if ((y = newline(win, y)) < 0) *** old/chardel.c --- chardel.c ************** *** 28,34 int *end; short y = win->_cury; short x = win->_curx; ! short maxx = win->_maxx; end = &win->_line[y][maxx]; temp1 = &win->_line[y][x]; --- 28,34 ----- int *end; short y = win->_cury; short x = win->_curx; ! short maxx = win->_maxx - 1; end = &win->_line[y][maxx]; temp1 = &win->_line[y][x]; *** old/charins.c --- charins.c ************** *** 28,34 int *end; int x = win->_curx; int y = win->_cury; ! int maxx = win->_maxx; if((c < ' ') && (c == '\n' || c == '\r' || c == '\t' || c == '\b')) return(waddch(win, c)); --- 28,34 ----- int *end; int x = win->_curx; int y = win->_cury; ! int maxx = win->_maxx - 1; if((c < ' ') && (c == '\n' || c == '\r' || c == '\t' || c == '\b')) return(waddch(win, c)); *** old/clrtobot.c --- clrtobot.c ************** *** 35,41 for (y = win->_cury; y <= win->_regbottom; y++) { minx = _NO_CHANGE; ! end = &win->_line[y][win->_maxx]; for (ptr = &win->_line[y][startx]; ptr <= end; ptr++) { if (*ptr != blank) --- 35,41 ----- for (y = win->_cury; y <= win->_regbottom; y++) { minx = _NO_CHANGE; ! end = &win->_line[y][win->_maxx - 1]; for (ptr = &win->_line[y][startx]; ptr <= end; ptr++) { if (*ptr != blank) *** old/clrtoeol.c --- clrtoeol.c ************** *** 34,40 x = win->_curx; blank = ' ' | (win->_attrs & ATR_MSK); ! end = &win->_line[y][win->_maxx]; minx = _NO_CHANGE; maxx = &win->_line[y][x]; for (ptr = maxx; ptr <= end; ptr++) --- 34,40 ----- x = win->_curx; blank = ' ' | (win->_attrs & ATR_MSK); ! end = &win->_line[y][win->_maxx - 1]; minx = _NO_CHANGE; maxx = &win->_line[y][x]; for (ptr = maxx; ptr <= end; ptr++) *** old/linedel.c --- linedel.c ************** *** 35,41 { win->_line[y] = win->_line[y+1]; win->_minchng[y] = 0; ! win->_maxchng[y] = win->_maxx; } win->_minchng[y] = 0; win->_maxchng[y] = win->_maxx; --- 35,41 ----- { win->_line[y] = win->_line[y+1]; win->_minchng[y] = 0; ! win->_maxchng[y] = win->_maxx - 1; } win->_minchng[y] = 0; win->_maxchng[y] = win->_maxx - 1; ************** *** 38,44 win->_maxchng[y] = win->_maxx; } win->_minchng[y] = 0; ! win->_maxchng[y] = win->_maxx; win->_line[win->_regbottom] = temp; for (end = &(temp[win->_maxx]); temp <= end;) *temp++ = blank; --- 38,44 ----- win->_maxchng[y] = win->_maxx - 1; } win->_minchng[y] = 0; ! win->_maxchng[y] = win->_maxx - 1; win->_line[win->_regbottom] = temp; for (end = &(temp[win->_maxx - 1]); temp <= end;) *temp++ = blank; ************** *** 40,46 win->_minchng[y] = 0; win->_maxchng[y] = win->_maxx; win->_line[win->_regbottom] = temp; ! for (end = &(temp[win->_maxx]); temp <= end;) *temp++ = blank; return(OK); } /* wdeleteln */ --- 40,46 ----- win->_minchng[y] = 0; win->_maxchng[y] = win->_maxx - 1; win->_line[win->_regbottom] = temp; ! for (end = &(temp[win->_maxx - 1]); temp <= end;) *temp++ = blank; return(OK); } /* wdeleteln */ *** old/lineins.c --- lineins.c ************** *** 33,39 { win->_line[y] = win->_line[y-1]; win->_minchng[y] = 0; ! win->_maxchng[y] = win->_maxx; } /* for */ win->_line[win->_cury] = temp; for (end = &temp[win->_maxx]; temp <= end; temp++) --- 33,39 ----- { win->_line[y] = win->_line[y-1]; win->_minchng[y] = 0; ! win->_maxchng[y] = win->_maxx - 1; } /* for */ win->_line[win->_cury] = temp; for (end = &temp[win->_maxx - 1]; temp <= end; temp++) ************** *** 36,42 win->_maxchng[y] = win->_maxx; } /* for */ win->_line[win->_cury] = temp; ! for (end = &temp[win->_maxx]; temp <= end; temp++) *temp = blank; win->_minchng[win->_cury] = 0; win->_maxchng[win->_cury] = win->_maxx; --- 36,42 ----- win->_maxchng[y] = win->_maxx - 1; } /* for */ win->_line[win->_cury] = temp; ! for (end = &temp[win->_maxx - 1]; temp <= end; temp++) *temp = blank; win->_minchng[win->_cury] = 0; win->_maxchng[win->_cury] = win->_maxx - 1; ************** *** 39,45 for (end = &temp[win->_maxx]; temp <= end; temp++) *temp = blank; win->_minchng[win->_cury] = 0; ! win->_maxchng[win->_cury] = win->_maxx; return(OK); } /* winsertln */ --- 39,45 ----- for (end = &temp[win->_maxx - 1]; temp <= end; temp++) *temp = blank; win->_minchng[win->_cury] = 0; ! win->_maxchng[win->_cury] = win->_maxx - 1; return(OK); } /* winsertln */ *** old/move.c --- move.c ************** *** 23,29 int y; int x; { ! if ((x < 0)||(x > win->_maxx)||(y < win->_regtop)||(y >win->_regbottom)) return(ERR); win->_curx = x; win->_cury = y; --- 23,29 ----- int y; int x; { ! if ((x < 0)||(x >= win->_maxx)||(y < win->_regtop)||(y >win->_regbottom)) return(ERR); win->_curx = x; win->_cury = y; *** old/newwin.c --- newwin.c ************** *** 59,66 win->_curx = 0; win->_cury = 0; ! win->_maxy = num_lines - 1; ! win->_maxx = num_columns - 1; win->_begy = begy; win->_begx = begx; win->_flags = 0; --- 59,66 ----- win->_curx = 0; win->_cury = 0; ! win->_maxy = num_lines; ! win->_maxx = num_columns; win->_begy = begy; win->_begx = begx; win->_flags = 0; ************** *** 157,164 if ( begy < orig->_begy || begx < orig->_begx || ! (begy + num_lines) > (orig->_begy + orig->_maxy) || ! (begx + num_columns) > (orig->_begx + orig->_maxx) ) return((WINDOW *) ERR); --- 157,164 ----- if ( begy < orig->_begy || begx < orig->_begx || ! (begy + num_lines) >= (orig->_begy + orig->_maxy) || ! (begx + num_columns) >= (orig->_begx + orig->_maxx) ) return((WINDOW *) ERR); ************** *** 163,169 return((WINDOW *) ERR); if (num_lines == 0) ! num_lines = orig->_maxy - (begy - orig->_begy); if (num_columns == 0) num_columns = orig->_maxx - (begx - orig->_begx); if ((win = makenew(num_lines, num_columns, begy, begx)) == (WINDOW *) ERR) --- 163,169 ----- return((WINDOW *) ERR); if (num_lines == 0) ! num_lines = orig->_maxy - 1 - (begy - orig->_begy); if (num_columns == 0) num_columns = orig->_maxx - 1 - (begx - orig->_begx); if ((win = makenew(num_lines, num_columns, begy, begx)) == (WINDOW *) ERR) ************** *** 165,171 if (num_lines == 0) num_lines = orig->_maxy - (begy - orig->_begy); if (num_columns == 0) ! num_columns = orig->_maxx - (begx - orig->_begx); if ((win = makenew(num_lines, num_columns, begy, begx)) == (WINDOW *) ERR) return((WINDOW *) ERR); --- 165,171 ----- if (num_lines == 0) num_lines = orig->_maxy - 1 - (begy - orig->_begy); if (num_columns == 0) ! num_columns = orig->_maxx - 1 - (begx - orig->_begx); if ((win = makenew(num_lines, num_columns, begy, begx)) == (WINDOW *) ERR) return((WINDOW *) ERR); *** old/overlay.c --- overlay.c ************** *** 33,40 int last_line; int last_col; ! last_col = min(win1->_maxx, win2->_maxx); ! last_line = min(win1->_maxy, win2->_maxy); attrs = win2->_attrs & ATR_MSK; minchng = win2->_minchng; maxchng = win2->_maxchng; --- 33,40 ----- int last_line; int last_col; ! last_col = min(win1->_maxx, win2->_maxx) - 1; ! last_line = min(win1->_maxy, win2->_maxy) - 1; attrs = win2->_attrs & ATR_MSK; minchng = win2->_minchng; maxchng = win2->_maxchng; ************** *** 95,102 int last_col; last_col = min(win1->_maxx, win2->_maxx); ! last_line = min(win1->_maxy, win2->_maxy); ! attrs = win2->_attrs & ATR_MSK; minchng = win2->_minchng; maxchng = win2->_maxchng; --- 95,102 ----- int last_line; int last_col; ! last_col = min(win1->_maxx, win2->_maxx) - 1; ! last_line = min(win1->_maxy, win2->_maxy) - 1; attrs = win2->_attrs & ATR_MSK; minchng = win2->_minchng; maxchng = win2->_maxchng; *** old/refresh.c --- refresh.c ************** *** 53,59 begy = win->_begy; begx = win->_begx; ! for (i=0, j=begy; i <= win->_maxy; i++, j++) { if (win->_minchng[i] != _NO_CHANGE) { --- 53,59 ----- begy = win->_begy; begx = win->_begx; ! for (i=0, j=begy; i < win->_maxy; i++, j++) { if (win->_minchng[i] != _NO_CHANGE) { *** old/scrreg.c --- scrreg.c ************** *** 30,36 && (win->_cury <= bottom) && ! (bottom <= win->_maxy) ) { win->_regtop = top; --- 30,36 ----- && (win->_cury <= bottom) && ! (bottom < win->_maxy) ) { win->_regtop = top; *** old/strget.c --- strget.c ************** *** 152,158 x += 2; else /* normal char */ x++; ! if (x > w->_maxx) /* go to next line? */ x = 0; } /* while */ if (!(w->_curx)) /* if step-over newline */ --- 152,158 ----- x += 2; else /* normal char */ x++; ! if (x >= w->_maxx) /* go to next line? */ x = 0; } /* while */ if (!(w->_curx)) /* if step-over newline */ ************** *** 156,162 x = 0; } /* while */ if (!(w->_curx)) /* if step-over newline */ ! nbs = w->_maxx+1 - x; else /* in-line tab */ nbs = w->_curx - x; /* positions to erase */ } /* if */ --- 156,162 ----- x = 0; } /* while */ if (!(w->_curx)) /* if step-over newline */ ! nbs = w->_maxx - x; else /* in-line tab */ nbs = w->_curx - x; /* positions to erase */ } /* if */ ************** *** 168,175 (w->_cury) /* if not on top line */ { mvwaddch(w,w->_cury-1,w->_maxx,' '); /* put space at line end */ ! wmove(w,w->_cury-1,w->_maxx); /* and go there again */ ! } /* else */ } /* while */ wrefresh(w); /* redraw screen */ --- 168,175 ----- else if (w->_cury) /* if not on top line */ { ! mvwaddch(w,w->_cury-1,w->_maxx - 1,' ');/* put space at line end */ ! wmove(w,w->_cury-1,w->_maxx - 1); /* and go there again */ } /* else */ } /* while */ *** old/windel.c --- windel.c ************** *** 27,33 { int i; ! if (! (win->_flags & _SUBWIN)) /* subwindow uses 'parent's' lines */ { for (i = 0; i <= win->_maxy && win->_line[i]; i++) free(win->_line[i]); --- 27,33 ----- if (! (win->_flags & _SUBWIN)) /* subwindow uses 'parent's' lines */ { ! for (i = 0; i < win->_maxy && win->_line[i]; i++) free(win->_line[i]); } free(win->_minchng); *** old/winerase.c --- winerase.c ************** *** 33,39 for (y = win->_regtop; y <= win->_regbottom; y++) /* clear all lines */ { start = win->_line[y]; ! end = &start[win->_maxx]; while (start <= end) /* clear all line */ *start++ = blank; win->_minchng[y] = 0; --- 33,39 ----- for (y = win->_regtop; y <= win->_regbottom; y++) /* clear all lines */ { start = win->_line[y]; ! end = &start[win->_maxx - 1]; while (start <= end) /* clear all line */ *start++ = blank; win->_minchng[y] = 0; ************** *** 37,43 while (start <= end) /* clear all line */ *start++ = blank; win->_minchng[y] = 0; ! win->_maxchng[y] = win->_maxx; } win->_cury = win->_regtop; /* cursor home */ win->_curx = 0; --- 37,43 ----- while (start <= end) /* clear all line */ *start++ = blank; win->_minchng[y] = 0; ! win->_maxchng[y] = win->_maxx - 1; } win->_cury = win->_regtop; /* cursor home */ win->_curx = 0; *** old/winmove.c --- winmove.c ************** *** 23,29 WINDOW *win; int begy, begx; { ! if ((begy + win->_maxy) > (LINES-1) || (begx + win->_maxx) > (COLS-1)) return(ERR); win->_begy = begy; win->_begx = begx; --- 23,29 ----- WINDOW *win; int begy, begx; { ! if ((begy + win->_maxy) >= (LINES-1) || (begx + win->_maxx) >= (COLS-1)) return(ERR); win->_begy = begy; win->_begx = begx; *** old/winscrol.c --- winscrol.c ************** *** 40,46 { win->_line[i] = win->_line[i+1]; /* re-arrange line pointers */ win->_minchng[i] = 0; ! win->_maxchng[i] = win->_maxx; } for (ptr = temp; ptr - temp <= win->_maxx; ptr++) *ptr = blank; /* make a blank line */ --- 40,46 ----- { win->_line[i] = win->_line[i+1]; /* re-arrange line pointers */ win->_minchng[i] = 0; ! win->_maxchng[i] = win->_maxx - 1; } for (ptr = temp; ptr - temp < win->_maxx; ptr++) *ptr = blank; /* make a blank line */ ************** *** 42,48 win->_minchng[i] = 0; win->_maxchng[i] = win->_maxx; } ! for (ptr = temp; ptr - temp <= win->_maxx; ptr++) *ptr = blank; /* make a blank line */ win->_line[win->_regbottom] = temp; if (win->_cury > win->_regtop) /* if not on top line */ --- 42,48 ----- win->_minchng[i] = 0; win->_maxchng[i] = win->_maxx - 1; } ! for (ptr = temp; ptr - temp < win->_maxx; ptr++) *ptr = blank; /* make a blank line */ win->_line[win->_regbottom] = temp; if (win->_cury > win->_regtop) /* if not on top line */ ************** *** 48,52 = temp; if (win->_cury > win->_regtop) /* if not on top line */ win->_cury--; /* cursor scrolls too */ ! win->_minchng[win->_regbottom] = 0; win->_maxchng[win->_regbottom] = win->_maxx; --- 48,52 ----- if (win->_cury > win->_regtop) /* if not on top line */ win->_cury--; /* cursor scrolls too */ win->_minchng[win->_regbottom] = 0; ! win->_maxchng[win->_regbottom] = win->_maxx - 1; } /* scroll */